AES 加解密(ECB模式)存在的巨大的坑
发表于:2023-10-14 19:28:41浏览:981次
直接上代码
/**
* AES加密
* @return string
*/
function aes_encrypt(string $aes_key, string $text)
{
return openssl_encrypt($text, 'AES-128-ECB', $aes_key, 0);
}
/**
* AES解密
* @return string
*/
function aes_decrypt(string $aes_key, string $encrypt_text)
{
$encrypt_text = str_replace(' ', '+', $encrypt_text);
return openssl_decrypt($encrypt_text, 'AES-128-ECB', $aes_key, 0);
}
二、URL传参
异常一:
openssl_decrypt 时报 failed to base64 decode the input
说明:加密后台的字符串如果需要通过URL来传参,有时会出现上述错误
解决办法:用 rawurlencode 对字符串编码(不能使用 urlencode)
异常二:openssl_decrypt 返回 false
说明:aes_encrypt 加密出来的字符串可能会带有 + 号,例如:lSPyKQTWakJkK3eHibq70GDF4zqY+nmLFKpOHfjdB9o=
这本身没啥问题,用 openssl_decrypt 也能解。但是,如果你把这个字符串传到 url 去,再用 $_GET 获取,‘+’ 号会自动变成 ‘ ’,直接解的话,就会返回 false
解决办法:因为aes加密出来的字符串肯定是不会有空格的,这里我们直接替换空格回+就行了,$encrypt_text = str_replace(‘ ‘, ‘+’, $encrypt_text);
$encrypt_text = str_replace(' ', '+', rawurldecode($encrypt_text));
openssl_decrypt($encrypt_text, 'AES-128-ECB', $aes_key, 0);