我正在运行 Windows Server 2k8(也许这是问题的一半?)无论如何,我从各种语言的不同 Blowfish 模块中获得了不同的值。有没有可以作为标准的依据?
对于以下示例,假设密钥是password
和明文12345678
。
一种。将算法设置为模式并选中的在线加密工具给出. 我一直在使用这个作为我的参考点,无论是否明智。Blowfish
ECB
Base64 Encode the output
2mADZkZR0VM=
湾。以下 Perl 代码使用Crypt::ECB
和MIME::Base64
use MIME::Base64;
use Crypt::ECB;
$crypt = Crypt::ECB->new;
$crypt->padding(PADDING_NONE);
$crypt->cipher('Blowfish') || die $crypt->errstring;
$crypt->key('password');
$enc = $crypt->encrypt("12345678");
print encode_base64($enc);
这2mADZkZR0VM=
与 PADDING_NONE 输出(与上面的 'a.' 相比很好)。但是,当填充设置为PADDING_AUTO
它输出2mADZkZR0VOZ5o+S6D3OZw==
时,至少在我看来,这是一个错误,因为纯文本有 8 个字符长并且不需要填充。
C。如果我使用Crypt::Blowfish
如下
#! c:\perl\bin
use Crypt::Blowfish;
use MIME::Base64;
my $key;
my $plaintext;
$key = "password";
$plaintext = "12345678";
my $cipher = new Crypt::Blowfish $key;
my $ciphertext = $cipher->encrypt($plaintext);
my $encoded = encode_base64( $ciphertext );
print $encoded;
然后我得到2mADZkZR0VM=
哪个匹配'a'。多于。这个模块的问题在于,必须将事物分割成 8 字节的块进行编码;它没有自己的分块器。
d。如果我使用http://linux.die.net/man/3/bf_ecb_encrypt的源代码(我为最近的一个 PHP ext 项目所做的),那么我得到的答案与“a.”相同。我倾向于最信任此代码,因为它在 SSLeay 和 OpenSSL 中使用。
e. BlowfishEx.EXE
DI Management's Blowfish: a Visual Basic version with PKCS#5
padding中的2mADZkZR0VOZ5o+S6D3OZw==
Crypt::ECB 结果与PADDING_AUTO
. 将 Padding 设置为None
我得到2mADZkZR0VM=
与“a”匹配的内容。
我已经部分回答了我自己写这个的问题:看起来我只需要为 VB6 项目修改 DI Management 的代码。也许对 Crypt::ECB 的作者也有同样的建议。
但问题仍然存在:是否有值得信赖的河豚参考平台?