Conversione della funzione di decrittografia Ruby AES256 in PHP
Domanda
Ho la seguente funzione in Ruby che decodifica un po 'di dati:
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
Sto cercando di fare esattamente la stessa cosa in PHP, ma non sono sicuro di cosa sto facendo di sbagliato. Ecco cosa ho:
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;
}
L'output finisce per essere spazzatura, non la stringa che sto cercando. Idee?
E prima ancora di iniziare, cambiarlo in MCRYPT_RIJNDAEL_256
non sembra essere d'aiuto e causa solo una lamentela sul fatto che la iv non sia lunga quanto la dimensione del blocco. Credo che 128 sia corretto in questo caso poiché questo sito afferma che 128/256 è un'indicazione della dimensione del blocco, non della dimensione della chiave.
Soluzione 2
Si è scoperto che funzionava bene, è solo che i miei dati di test erano cattivi. Le due modifiche che ho apportato sono state usando pack ()
(su suggerimento di caf) e lasciando cadere i caratteri di riempimento dalla fine.
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"
);
}
Altri suggerimenti
Personalmente sono un po 'sospettoso della funzione hex_to_str
fatta in casa - perché non usare semplicemente il pacchetto (' H * ', $ chiave)
?