Conversion de la fonction de déchiffrement Ruby AES256 en PHP
Question
J'ai la fonction suivante dans Ruby qui déchiffre un peu de données:
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
J'essaie de faire exactement la même chose en PHP, mais je ne suis pas sûr de 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 par être un déchet, pas la chaîne que je cherche. Des idées?
Et avant même de commencer, le basculer sur MCRYPT_RIJNDAEL_256
ne semble pas aider et le fait simplement se plaindre du fait que iv ne soit pas aussi long que la taille du bloc. Je pense que 128 est correct dans ce cas puisque ce site indique que le 128/256 est une indication de la taille du bloc, pas de la taille de la clé.
La solution 2
Il s’avère que cela fonctionnait bien, c’est que mes données de test étaient mauvaises. Les deux modifications que j'ai apportées utilisaient pack ()
(sur suggestion de caf) et supprimaient 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"
);
}
Autres conseils
Personnellement, je me méfie un peu de la fonction hex_to_str
de l'homebrewed - pourquoi ne pas utiliser simplement pack ('H *', $ key)
?