首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP AES-ECB 解密乱码终极排查:PKCS#7 填充处理实战

     編輯:PHP 綜合知識

对接 Java/.NET 端 AES-ECB 加密数据,PHP mcrypt_decrypt 解密后出现乱码或多余字符,核心原因在于填充模式不一致。本文给出生产级解密函数,自动处理 PKCS#7 填充移除,兼容跨语言对接。

问题复现

正确解密实现

 $block) {
        return false; // 填充异常
    }
    for ($i = 1; $i <= $pad; $i++) {
        if (ord($str[$len - $i]) !== $pad) {
            return false; // 填充字节不一致
        }
    }
    return substr($str, 0, $len - $pad);
}

// 测试
$key = '1234567890123456';
$content = 'T7UT2NQ1AFvR9unjA0wKWA=='; // 对应明文 "abcd"
echo decryptString($content, $key); // 输出: abcd
?>

关键点总结

  • ECB 模式不安全:相同明文块产生相同密文块,生产环境强制要求 CBC/GCM 模式 + 随机 IV。
  • mcrypt 扩展已废弃(PHP 7.1+),新项目请用 openssl_decrypt():
    openssl_decrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING) 并自行处理 PKCS#7。
  • 密钥长度:AES-128 要求 16 字节密钥,不足补零、超长截断。
  • 字符编码:明文加密前统一转 UTF-8,解密后按 UTF-8 解码。

跨语言对接清单

项Java (BouncyCastle/JCE).NET (AesManaged)PHP (openssl)
模式AES/ECB/PKCS5PaddingAes.Mode = ECB; Padding = PKCS7AES-128-ECB + 手动 PKCS7
密钥SecretKeySpec(keyBytes, "AES")aes.Key = keyBytes$key (16 字节)
Base64Base64.getEncoder()Convert.ToBase64String()base64_encode/decode

规范填充处理、统一编码、弃用 ECB,是跨语言加密互操作的三大铁律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved