2009-09-23 51 views
2

我正在嘗試編寫一些Perl以便與其他語言的散列函數進行操作,即在此處使用Java。我們發現大概是一個正確的來源,RFC 4868其中包括一些測試鍵&字符串及其散列值。我正在使用下面的代碼片段,並且無法讓Perl獲得相同的結果。我只能假設我錯誤地使用它 - 任何人都可以指向正確的方向嗎?爲什麼Digest :: SHA與RFC 4868中顯示的哈希值不同?

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'

+3

你的鑰匙被正確解釋爲十六進制嗎? – Greg 2009-09-23 17:48:09

+0

好主意,但仍然沒有骰子: perl -e'使用Digest :: SHA「hmac_sha512_hex」;打印hmac_sha512_hex(「4869205468657265」,「0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b」);' 224d86ae23ef390be64726e20590bca701e8c5ab1ae865d9e04b0cbc18fd73fbba1ca10a24e162f6399f07d1a2fa86766993ce84dd7a9a826a06144fb9062be8 – 2009-09-23 17:54:20

+0

不要引用您的十六進制字符串。嘗試打印0xa並打印「0xa」。 – innaM 2009-09-23 18:31:46

回答

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

+0

謝謝!我從未使用過,也沒有理解pack()和十六進制編碼。 – 2009-09-23 19:53:40

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

非常好,但我懶得輸出所有'\ x0b's。我會這樣做:'我的$ key =「\ x0b」x 20;' – daotoad 2009-09-23 19:16:49

相關問題