Преобразование функции расшифровки Ruby AES256 в PHP
Вопрос
У меня есть следующая функция в Ruby, которая расшифровывает немного данных:
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
Я пытаюсь сделать то же самое в PHP, но я не уверен, что делаю неправильно. Вот что у меня есть:
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;
}
Вывод просто оказывается мусором, а не строкой, которую я ищу. Идеи?
И даже до того, как мы начнем, переключение на MCRYPT_RIJNDAEL_256
не кажется полезным, а просто заставляет его жаловаться на то, что iv не такой длинный, как размер блока. Я считаю, что 128 в этом случае правильно, поскольку этот сайт говорит, что 128/256 указание размера блока, а не размера ключа.
Решение 2
Оказывается, все работало нормально, просто мои тестовые данные были плохими. Два изменения, которые я сделал, заключались в использовании pack ()
(по предложению caf) и отбрасывании символов заполнения с конца.
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"
);
}
Другие советы
Лично я немного подозрительно отношусь к самодельной функции hex_to_str
- почему бы не использовать pack ('H *', $ key)
?