2009-10-27 12 views
0

je la fonction suivante dans Ruby qui décrypte un peu de données:Conversion Ruby AES256 fonction Décrypter vers PHP

def decrypt(key, iv, cipher_hex) 
    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') 

    cipher.decrypt 
    cipher.key = key.gsub(/(..)/){|h| h.hex.chr} 
    cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr} 

    decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr}) 
    decrypted_data << cipher.final 

    return decrypted_data 
end 

Je suis en train de faire exactement la même chose en PHP, mais je ne suis pas sûr ce que je fais mal. Voici ce que j'ai:

function decrypt_data($key, $iv, $cipher_hex) { 
    return mcrypt_decrypt(
     MCRYPT_RIJNDAEL_128, 
     hex_to_str($key), 
     hex_to_str($cipher_hex), 
     MCRYPT_MODE_CBC, 
     hex_to_str($iv) 
    ); 
} 

function hex_to_str($hex_str) { 
    preg_match_all('/(..)/', $hex_str, $matches); 

    $to_return = ''; 
    foreach ($matches[1] as $val) 
     $to_return .= chr(hexdec($val)); 
    return $to_return; 
} 

La sortie finit juste par être garbage, pas la chaîne que je cherche. Des idées?

Et avant même que nous commencions, le passage à MCRYPT_RIJNDAEL_256 ne semble pas aider et le fait juste se plaindre de l'iv ne pas être aussi long que la taille du bloc. Je crois 128 est correct dans ce cas puisque this site dit que le 128/256 est une indication de la taille du bloc, pas la taille de la clé.

+0

Puis-je vous demander pourquoi vous faites cela? Juste pour le fun? Parce que vous * ne * devriez * pas écrire vos propres bibliothèques de chiffrement pour une utilisation en production. Ils sont ridiculement faciles à bousiller et extraordinairement difficile à obtenir. – Eli

+0

Uuh ... Je ne suis pas, j'utilise les built-ins. Voir les références OpenSSL et mcrypt ci-dessus. –

+0

Je ne vois rien en regardant. Essayez peut-être de prendre le décodage de chacun des hexs, clés et textes, et comparez cela directement pour voir si quelque chose ne va pas. Rijndael_256 devrait être le bon chiffre - la IV pourrait-elle être erronée, et ruby ​​ne se plaint pas? – Justin

Répondre

0

Il s'avère que cela fonctionnait bien, c'est juste que mes données de test étaient mauvaises. Les deux changements que j'ai faits utilisaient pack() (à la suggestion de caf) et laissant tomber les caractères de remplissage de la fin.

function decrypt_data($key, $iv, $cipher_hex) { 
    return rtrim(
     mcrypt_decrypt(
      MCRYPT_RIJNDAEL_128, 
      pack('H*', $key), 
      pack('H*', $cipher_hex), 
      MCRYPT_MODE_CBC, 
      pack('H*', $iv) 
     ), 
     "\x00..\x1F" 
    ); 
} 
+0

Méfiez-vous - J'ai eu des problèmes avec pack ('H *') et grignote avec les caractères de remplissage, mais c'est peut-être juste moi. – Justin

+0

Merci pour le heads up Justin. Il semble que * fonctionne bien :) –

1

Personnellement, je suis un peu méfiant de la fonction hex_to_str homebrewed - pourquoi ne pas simplement utiliser pack('H*', $key)?

+0

Parce que je ne savais pas que c'était là! Merci. Cependant, l'utiliser me donne les mêmes résultats que ma fonction 'hex_to_str()'. –