Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么Digest::SHA提出的哈希与RFC4868中显示的哈希不同?_Perl_Encryption_Hash_Digest - Fatal编程技术网

Perl 为什么Digest::SHA提出的哈希与RFC4868中显示的哈希不同?

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';

我正在尝试编写一些Perl来与其他语言(即Java)中的哈希函数进行交互操作。我们已经找到了可能是正确的源代码,其中包括一些测试键和字符串及其哈希值。我正在使用下面的代码片段,但无法让Perl得到相同的结果。我只能假设我用错了,有人能给我指出正确的方向吗

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";