将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)
?
不隶属于 StackOverflow