I have the following function in Ruby that decrypts a bit of data:
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
I'm trying to do the exact same thing in PHP, but I'm not sure what I'm doing wrong. Here's what I've got:
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;
}
The output just ends up being garbage, not the string I'm looking for. Ideas?
And before we even start, switching it to MCRYPT_RIJNDAEL_256
doesn't seem help and just causes it to complain about the iv not being as long as the block size. I believe 128 is correct in this case since this site says that the 128/256 is an indication of the block size, not the key size.
It turns out that it was working fine, it's just that my test data was bad. The two changes I made were using
pack()
(at caf's suggestion) and dropping the padding characters from the end.Personally I'm a little suspicious of the homebrewed
hex_to_str
function - why not just usepack('H*', $key)
?