2

私は他の言語、つまりこの時点でJavaのハッシュ関数と相互運用するためにいくつかのPerlを書き込もうとしています。おそらく正しいソースであるRFC4868が見つかりました。これには、ハッシュ値とともにいくつかのテストキーと文字列が含まれています。私は次のスニペットを使用していますが、Perlに同じ結果を出すことができません。私はそれを間違って使用しているとしか推測できません—誰かが私を正しい方向に向けることができますか?

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

出力は「4ef7...5d40」ですが、RFC 4868(および私の同胞のJava実装)は「87aa...6854」を返します。

4

2 に答える 2

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

与える

87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854

RFCの引用:

Key =          0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
               0b0b0b0b                          (20 bytes)

Data =         4869205468657265                  ("Hi There")

PRF-HMAC-SHA-512 = 87aa7cdea5ef619d4ff0b4241a1d6cb0
                   2379f4e2ce4ec2787ad0b30545e17cde
                   daa833b7d6b8a702038b274eaea3f4e4
                   be9d914eeb61f1702e696c203a126854

PS'0x'文字列に追加しても、バイナリにはなりません。文字列は'0'andで始まります'x';-)

于 2009-09-23T17:57:27.867 に答える
12

0x0Bテストキーは20バイトである必要があり、各バイトは40文字の文字列ではなく、16進値を持ちます。テスト値は文字列"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";
于 2009-09-23T18:00:55.700 に答える