为什么Blowfish :: PP的加密只打印五个字符?

时间:2009-07-01 10:08:43

标签: perl encryption blowfish

美好的一天! 我这里有一个代码,它使用Crypt::Blowfish_PP中的blowfish_PP算法来加密密码。

我为一个开始提供了一个示例“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个字符。 当我使用MD5检查其他数据库的encryptedpassword时,它包含 几个字符。这是为什么?什么在里面 encrypt()decrypt()功能? “关键”价值是否重要? 加密密码将持续多长时间?

将非常感谢答案。 =)

3 个答案:

答案 0 :(得分:3)

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

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

print sprintf("%02x"x8, unpack("C8", $ciphertextBlock)), "\n";

答案 1 :(得分: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   打算将此模块用于Cipher   块链接模式。事实上,如果你   有任何意图加密更多   超过八个字节的数据,或者   任何其他分组密码,你要去   需要某种类型的块链接   救命。地穴:: CBC往往非常   擅长这个。如果你不去   加密超过八个字节,你的   数据必须正好是八个字节长。   如果需要,请自己填充。 “\ 0”   作为空字节完全有效   用于此。

答案 2 :(得分:2)

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