您的当前位置:首页>全部文章>文章详情

AES 加解密(ECB模式)存在的巨大的坑

发表于:2023-10-14 19:28:41浏览:307次TAG: #ThinkPHP #AES解密 #AES解密失败

直接上代码

/**
 * 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);