我使用以下PHP代码来解密我的AES 128字符串。
function aes128_cbc_encrypt($key, $data, $iv) {
if(16 !== strlen($key)) $key = hash('MD5', $key, true);
if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
}
$password = "mypasswordonthefirstrunoftheprogram";
$salt = "mysalthereitisfinallyitturnedoutok";
$encrypted = "BxGi119ltnYVNikXSP8jMJtSNIDKoMsPfd/nUEwlgSviVRM50/UgMF36j6Cqe+I/";
echo aes128_cbc_decrypt($key, $encrypted, $iv);
正确的结果 = 这是我的测试句
返回的结果 = º±h©MM®StOf这是我的测试句子ok
此外,我使用正确的键和 IV 成功解码了 C# 中的字符串,因此没有错误。
我想知道这是怎么来的?我做了正确的填充,还尝试了 php 中的其他一些方法,但都在正确答案前面返回垃圾。
$encrypted
长度对于加密"this is my test sentence"
不正确。
纯文本为 26 个字符
填充为 6 个字节
加密的字符串将为 32 字节
加密数据为 32 字节
Base64 加密数据为 44 字节
提供的 Base64 加密数据为 64 字节
提供的加密数据为 48 字节
加密数据中还有额外的 16 个字节
检查加密数据时,在 Base64 编码之前,加密的 bata 前面附加了 16 个字节。
此外,填充不会从解密数据中删除。