1

再会!我这里有一个代码,它使用blowfish_PP来自Crypt::Blowfish_PP的算法来加密密码。

我已经为开始提供了一个示例“key”变量(尽管稍后我将创建一个函数,每次使用它时都会增加 key),但现在这就是我所拥有的:

use Crypt::Blowfish_PP;

$key = "12345678";
$$plaintextBlock = "mystringhere";

$blowfish=new Crypt::Blowfish_PP($key);

$ciphertextBlock=$blowfish->encrypt($plaintextBlock);

$plaintextBlock=$blowfish->decrypt($ciphertextBlock);

print "\n";
print $ciphertextBlock."\n";
print $plaintextBlock."\n";

$ciphertextBlock仅输出 5 个字符。当我encryptedpassword使用 MD5 检查其他数据库时,它包含几个字符。这是为什么?内部 encrypt()decrypt()功能是什么?“密钥”值对加密密码的长度有影响吗?

答案将不胜感激。=)

4

3 回答 3

3

根据Blowfish_PP 文档encrypt一次decrypt只能处理单个 8 字节块。因此,如果您要加密较长的字符串,则需要encrypt重复调​​用。

为什么它只输出5个“字符”可能是因为密文包含不可打印的字符。如果要打印数据,请先将其转换为例如 hex ascii:

print sprintf("%02x"x8, unpack("C8", $ciphertextBlock)), "\n";
于 2009-07-01T10:20:03.080 回答
2

正如 laalto 所说,Blowfish_PP(因为它是 Blowfish,而不是因为它是 _PP)正在处理块。

处理它通常很复杂,这就是为什么你有Crypt::CBC模块,它是(实际上)任何提供分组密码的 Crypt::* 模块的包装器,并允许你以更简单的方式使用它。

例如,您的 Crypt::CBC 代码将是:

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;

my $key = "12345678";
my $plaintextBlock = "mystringhere";

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish_PP'
);

my $ciphertext = $cipher->encrypt($plaintextBlock);
# my $textual = $ciphertext;
# $textual =~ s/([^a-zA-Z0-9])/sprintf "\\x%02x", ord $1/ge;
# print "ciphertext: [$textual]\n";
print "ciphertext: [$ciphertext]\n";

my $plaintext  = $cipher->decrypt($ciphertext);
print "plaintext: [$plaintext]\n";

请记住,密文是字节流,因此它不是真正可打印的。您可能希望取消散列代码中的 3 行(从我的 $textual = $ciphertext 开始)以更易读的方式显示密文。

使用 Crypt::CBC 的另一个好处是,如果您想切换到另一种算法 - 这只是 Crypt::CBC->new() 调用中的一个变化。

顺便说一句 - 为什么 Crypt::Blowfish_PP ?我的意思是,为什么不 Crypt::Blowfish?_PP 版本通常只是速度较慢。

附加说明,直接来自Crypt::Blowfish,我们可以假设它在功能上等同于 Crypt::Blowfish_PP:

该模块能够与 Crypt::CBC 一起使用。如果您打算将此模块用于密码块链接模式,我们鼓励您阅读 Crypt::CBC 的 perldoc。事实上,如果你打算用这个或任何其他分组密码加密超过 8 个字节的数据,你将需要某种类型的块链接帮助。Crypt::CBC 在这方面往往非常擅长。如果您不打算加密超过 8 个字节,那么您的数据必须正好是 8 个字节长。如果需要,做你自己的填充。"\0" 作为一个空字节是完全有效的。

于 2009-07-01T10:45:43.543 回答
2

将 $$plaintextBlock 更改为 $plaintextBlock,它将适用于第一个 8 个字节。

于 2012-12-05T15:18:47.943 回答