为什么Digest :: SHA会提供与RFC 4868中显示的不同的哈希值?

Dre*_*ens 2 encryption perl hash digest

我正在尝试编写一些Perl来与其他语言中的哈希函数进行交互操作,即Java.我们已经找到了可能是正确的源代码,RFC 4868包括一些测试键和字符串以及它们的散列值.我正在使用以下代码段,并且无法让Perl得出相同的结果.我只能假设我错误地使用它 - 有人能指出我正确的方向吗?

use Digest::SHA qw(hmac_sha512_hex);
my $key = '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b';
my $value = '4869205468657265';
print hmac_sha512_hex($value, $key);
Run Code Online (Sandbox Code Playgroud)

输出是'4ef7 ... 5d40',虽然RFC 4868(和我的同胞的Java实现)返回'87aa ... 6854'

Mic*_*ker 16

use Digest::SHA qw(hmac_sha512_hex);
my $key = pack('H*','0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b');
my $value = "Hi There";
print hmac_sha512_hex($value, $key);
Run Code Online (Sandbox Code Playgroud)

87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854
Run Code Online (Sandbox Code Playgroud)

引用RFC:

Key =          0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
               0b0b0b0b                          (20 bytes)

Data =         4869205468657265                  ("Hi There")

PRF-HMAC-SHA-512 = 87aa7cdea5ef619d4ff0b4241a1d6cb0
                   2379f4e2ce4ec2787ad0b30545e17cde
                   daa833b7d6b8a702038b274eaea3f4e4
                   be9d914eeb61f1702e696c203a126854
Run Code Online (Sandbox Code Playgroud)

PS添加'0x'到字符串不会使它成为二进制,它使它开始'0''x';-)


Joh*_*ica 12

测试密钥需要是20个字节,其中每个字节都有十六进制值0x0B,而不是一个40个字符的字符串.测试值是字符串"Hi There",而不是字符串"4869205468657625".试试这个:

use Digest::SHA qw(hmac_sha512_hex);
my $key = "\x0b" x 20;
my $value = 'Hi There';
print hmac_sha512_hex($value, $key) . "\n";
Run Code Online (Sandbox Code Playgroud)

  • 非常好,但我懒得输入所有那些`\ x0b`s.我会这样做:`我的$ key ="\ x0b"x 20;` (2认同)