Perl 为什么Digest::SHA提出的哈希与RFC4868中显示的哈希不同?
我正在尝试编写一些Perl来与其他语言(即Java)中的哈希函数进行交互操作。我们已经找到了可能是正确的源代码,其中包括一些测试键和字符串及其哈希值。我正在使用下面的代码片段,但无法让Perl得到相同的结果。我只能假设我用错了,有人能给我指出正确的方向吗Perl 为什么Digest::SHA提出的哈希与RFC4868中显示的哈希不同?,perl,encryption,hash,digest,Perl,Encryption,Hash,Digest,我正在尝试编写一些Perl来与其他语言(即Java)中的哈希函数进行交互操作。我们已经找到了可能是正确的源代码,其中包括一些测试键和字符串及其哈希值。我正在使用下面的代码片段,但无法让Perl得到相同的结果。我只能假设我用错了,有人能给我指出正确的方向吗 use Digest::SHA qw(hmac_sha512_hex); my $key = '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'; my $value = '4869205468657265';
use Digest::SHA qw(hmac_sha512_hex);
my $key = '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b';
my $value = '4869205468657265';
print hmac_sha512_hex($value, $key);
输出为'4ef7。。。5d40',尽管RFC4868(和我的同胞的Java实现)返回'87aa。。。6854'
use Digest::SHA qw(hmac_sha512_hex);
my $key = pack('H*','0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b');
my $value = "Hi There";
print hmac_sha512_hex($value, $key);
给予
报价RFC:
Key = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
0b0b0b0b (20 bytes)
Data = 4869205468657265 ("Hi There")
PRF-HMAC-SHA-512 = 87aa7cdea5ef619d4ff0b4241a1d6cb0
2379f4e2ce4ec2787ad0b30545e17cde
daa833b7d6b8a702038b274eaea3f4e4
be9d914eeb61f1702e696c203a126854
另外,将
'0x'
添加到字符串中不会使其成为二进制,而是使其以'0'
和'x'
;-)开头 测试密钥需要是20个字节,其中每个字节都有十六进制值0x0B
,而不是40个字符的字符串。测试值是字符串“Hi There”
,而不是字符串“486920546657625”
。试试这个:
use Digest::SHA qw(hmac_sha512_hex);
my $key = "\x0b" x 20;
my $value = 'Hi There';
print hmac_sha512_hex($value, $key) . "\n";
您的密钥被正确地解释为十六进制吗?好主意,但仍然没有骰子:perl-e'use Digest::SHA“hmac_sha512_hex”;打印hmac_sha512_十六进制(“48692054687265”,“0x0B0B0B0B0B0B0B0B”);'224D86AE23EF390BE64726E20590BCA701E8C5AB1AE865D9E04B0CBC18FD73FBBA1CA10A24E162F6399F07D1A2FA866993CE84DD7A9A826A06144FB9062BE8不要引用您的十六进制字符串。试着打印0xa和“0xa”。很好,但我太懒了,无法打印出所有这些
\x0b
s。我会这样做:my$key=“\x0b”x20代码>谢谢!我从未使用过,也不理解pack()和十六进制编码。
use Digest::SHA qw(hmac_sha512_hex);
my $key = "\x0b" x 20;
my $value = 'Hi There';
print hmac_sha512_hex($value, $key) . "\n";