2009-09-23 2 views
2

J'essaye d'écrire des Perl pour interagir avec des fonctions de hachage dans d'autres langages, à savoir Java à ce stade. Nous avons trouvé ce qui est probablement une source correcte, RFC 4868 qui inclut certaines clés de test & avec leurs valeurs hachées. J'utilise l'extrait suivant et je n'arrive pas à obtenir le même résultat pour Perl. Je ne peux que supposer que je l'utilise incorrectement - quelqu'un peut-il me diriger dans la bonne direction?Pourquoi Digest :: SHA propose-t-il différents hashes que ceux montrés dans la RFC 4868?

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

La sortie est '4ef7 ... 5d40', bien que la RFC 4868 (et la mise en œuvre Java de mon compatriote) de la 87aa ... 6854 'retours

+3

Votre clé est-elle interprétée correctement? – Greg

+0

Bonne idée, mais toujours pas de dés: perl -e 'utilise Digest :: SHA "hmac_sha512_hex"; imprimer hmac_sha512_hex ("4869205468657265", "0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"); ' 224d86ae23ef390be64726e20590bca701e8c5ab1ae865d9e04b0cbc18fd73fbba1ca10a24e162f6399f07d1a2fa86766993ce84dd7a9a826a06144fb9062be8 –

+0

Ne citez pas votre chaîne hexagonale. Essayez d'imprimer 0xa et d'imprimer "0xa". – innaM

Répondre

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

Donne

87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854 

Citation de RFC:

Key =   0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b 
       0b0b0b0b       (20 bytes) 

Data =   4869205468657265     ("Hi There") 

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

PS Ajout '0x' à la chaîne ne fait pas binaire, il fait commencer par '0' et 'x' ;-)

+0

Merci! Je n'avais jamais utilisé, ni compris, les encodages pack() et hexadécimaux. –

12

La clé de test doit être 20 octets où chaque octet a la valeur hexadécimale 0x0B, pas une chaîne de 40 caractères . La valeur de test est la chaîne "Hi There", pas la chaîne "4869205468657625". Essayez ceci:

use Digest::SHA qw(hmac_sha512_hex); 
my $key = "\x0b" x 20; 
my $value = 'Hi There'; 
print hmac_sha512_hex($value, $key) . "\n"; 
+2

Très bien, mais je suis trop paresseux pour taper tous ces '\ x0b's. Je ferais: 'my $ key =" \ x0b "x 20;' – daotoad

Questions connexes