AES-ECB 模式解密時常見亂碼,主因是 PKCS#7 填充移除邏輯錯誤。本文還原問題現場,給出正確解密實現。
明文: abcd KEY: 1234567890123456 加密後 Base64: T7UT2NQ1AFvR9unjA0wKWA==
錯誤實現(補位邏輯有誤):
<?php
function apiDataDecrypt($data, $key='') {
$data = base64_decode($data);
$pad = 16 - (strlen($data) % 16);
$padData = $data . str_repeat(chr($pad), $pad); // 錯誤:解密不需補位
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $padData, MCRYPT_MODE_ECB);
}
?>
<?php
function decryptString($str, $key) {
$str = base64_decode($str);
// 直接解密,mcrypt 自動處理填充
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
// 正確移除 PKCS#7 填充
$block = mcrypt_get_block_size('rijndael_128', 'ecb');
$pad = ord($str[strlen($str) - 1]);
return substr($str, 0, strlen($str) - $pad);
}
$key = '1234567890123456';
$content = 'T7UT2NQ1AFvR9unjA0wKWA==';
echo decryptString($content, $key); // 輸出: abcd
?>
<?php
function aesDecrypt($data, $key) {
$data = base64_decode($data);
// OPENSSL_RAW_DATA 返回原始二進制,OPENSSL_ZERO_PADDING 手動處理填充
$decrypted = openssl_decrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
// 移除 PKCS#7
$pad = ord($decrypted[strlen($decrypted) - 1]);
return substr($decrypted, 0, -$pad);
}
?>