2010-06-30 30 views
1

J'essaie de faire un chiffrement triple DES dans Ruby. J'essaye de reproduire les résultats de cette page: http://da.nmilne.com/des.htmlComment effectuer des calculs Triple DES en Ruby en hexadécimal?

J'essaye de reproduire le résultat dans Ruby. Je soupçonne que le problème est que la clé est censée être une chaîne, mais je dois passer une clé hexadécimale. Soit cela ou la chaîne en cours de cryptage est dans le mauvais format. Ou peut-être les deux. :-)

require 'openssl' 
des = OpenSSL::Cipher::Cipher.new("des-ede-cbc") 
des.encrypt 
des.key="23232323232323234545454545454545" 
des.update("0000000000000000") 
res=des.final 
res.unpack('H*') 
=> ["5045c5d37ca4d13b"] 

Mais il devrait être:

=> ["3a42d7a1d1c60c40"] 

Tous les pointeurs sur où je vais mal?

+0

Cette page a eu d'autres informations utiles: http://snippets.dzone.com/posts/show/576 – dkam

+0

vous attendez-vous "2323 ..." être en fait 0x2323 .. soit un nombre hexadécimal, ou quelque chose de similaire? – conny

+0

Oui - mais la touche = attend une chaîne - pas un nombre. J'ai aussi essayé: des.key = "23232323232323234545454545454545" .unpack ('a2' * 32) .map {| x | x.hex} .pack ('c' * 32) (Ce qui était du lien dans le premier commentaire) mais ça ne marche pas non plus. – dkam

Répondre

4

La clé est dans l'hexagone - si vous regardez la page Java que vous avez collé, vous pouvez voir que facilement en décodant le binaire Valeurs pour la clé dans la sortie détaillée.

>> des_cbc=OpenSSL::Cipher::Cipher.new("des-ede-cbc") 
=> #<OpenSSL::Cipher::Cipher:0x10116ce28> 
>> des_cbc.encrypt 
=> #<OpenSSL::Cipher::Cipher:0x10116ce28> 
>> des_cbc.key="\x23"*8 << "\x45"*8 
=> "########EEEEEEEE" 
>> des_cbc.update("\x00"*8).unpack('H*') 
=> ["3a42d7a1d1c60c40"] 
+0

Merci! Je ne comprends pas pourquoi la clé est "\ x23" * 8 et pas "\ x2 \ x3" * 8? Est-ce parce que \ x fonctionne sur un octet? – dkam

+0

Aussi - pourquoi est-ce \ x et non 0x? Et - pourquoi avez-vous besoin d'utiliser '("\ x00" * 8) .unpack (' H * ')'? Est-ce pour obtenir le binaire 0, plutôt que les valeurs string/ascii de "0"? Mec, je suis un tel n00b avec ce truc binaire/hex/décimal. – dkam

+1

"\ x00" est hexadécimal. Deux grignotements par octet, ce qui explique pourquoi c'est "\ x23" et non pas \ x2 \ x3 (35 base 10). \ x .. est une version de chaîne de 0x .. qui serait un fixnum. Essayez tout ça en irb. :) – bnagy