试了

一、以为格式错误,改格式为UTF-8

先在前端转,比较麻烦。就在后端转。

但下图代码里的mb_detect_encoding还存在字符串较短时判断不准的情况,最后也不折腾了。因为将原文参数用json.encode转字符串后返回的就是UFT-8格式的数据,加密也不至于改格式。而且前端Nginx服务器配置里也加了charset UTF-8;

function str_to_utf8 ($str = '') {
    $current_encode = mb_detect_encoding($str, array("ASCII","GB2312","GBK",'BIG5','UTF-8')); 
    $encoded_str = mb_convert_encoding($str, 'UTF-8', $current_encode);
    return $encoded_str;
}

(12条消息) php将任意编码的内容转换成utf-8_php字符转码_Rudon滨海渔村的博客-CSDN博客

二、去掉密文的换行符

(19条消息) 项目部署到linx下时,前端AES解密报Malformed UTF-8 data_qq_39196385的博客-CSDN博客

三、加密和解密的key 不一样

(19条消息) encrypt 解密报错 Malformed UTF-8 data_uncaught error: malformed utf-8 data_Memory_bellwether的博客-CSDN博客

四、用Base64加解密

我后端本来就在AES加密后,又用Base64加密了。后端去掉Base64加密后就报跟前端一样的Malformed UTF-8 data错误。

前端倒是本来没有Base64解密,但加上后仍然报同样的错。

五、更改密钥为32位

AES 有三种算法,主要是对数据块的大小存在区别:

AES-128:需要提供 16 位的密钥
AES-192:需要提供 24 位的密钥
AES-256:需要提供 32 位的密钥

我发现我用的256,但密钥很短,百度了一个AES密钥在线生成器,新密钥换上后问题解决。

并且虽然后端用了Base64加密,但我前端用的AES解密插件自带Base64解密,所以搞定。

PHP使用OpenSSL实现AES加密的笔记 - 景北斗 - 博客园 (cnblogs.com)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐