PHP AES 128 解密返回结果,前面有垃圾


PHP AES 128 Decryption returning result with garbage in front

我使用以下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 个字节。

此外,填充不会从解密数据中删除。