php 中文加密如何解密

等等,你还记得上次帮助同事调试点餐系统乱码问题是什么时候吗?用户举报的中文订单号经解码后变成了一串乱码。
最后发现是解码函数的字符编码参数错误。

场景: 2 02 3 年4 月上海的一个下午,我接手了网上报的订单数据解码的问题。
用户发送的订单号为“订单1 2 3 4 5 ”,经过加密传输到服务器,但解密后就变成了“奔奔奔奔”。

故障排除步骤: 1 .确认加密方式:
查看API文档,看到是Base64 编码的,但是解码时,我直接使用base64 _decode(),没有问题。

字符编码主要疑惑:编码采用UTF-8 ,但默认解码函数为ISO-8 8 5 9 -1 php $编码='5 Lit5 paH'; // 中文是Base64 编码的 $decoded = base64 _decode($encoded, true); // 添加 true 强制返回原始二进制数据 $解码 = mb_convert_encoding($解码, 'UTF-8 ', 'ISO-8 8 5 9 -1 '); // 转换编码 回显$解码; // 输出:中文
2 调试详情:
解码后添加了var_dump($decoded),发现原来的二进制是ÿÇÿÇ,实际上是乱码。

重置全局编码mb_internal_encoding('UTF-8 ')以避免函数之间的污染。

3 课程总结:
8 0%的乱码是由于编码问题,而不是编码算法错误。

自定义加密(如XOR)需要检查密钥长度是否一致,如本例: php 函数 xorDecrypt($加密, $key) { $结果=''; for ($i = 0; $i < strlen xss=clean>如果key key为6 字节,则加密时strlen($key)为6 ,解密时无法改为8 字节。

突然想到: 如果加密算法是 AES,则 IV 和密钥长度必须完美匹配。
上次测试OpenSSL解密时,手抖,把3 2 字节密钥改成2 4 字节,结果出错。

问题: 如果加密函数是第三方库但是源码缺失,如何逆向呢?比如这个U2 FsdGVkX1 +Zq2 pW7 Nq3 PuST9 Z6 O7 7 H/q07 jP6 o=看起来像AES,但是没有密钥和IV怎么会失败呢?

PHP代码怎么实现数据加密解密_PHP OpenSSL加密解密函数使用

使用 OpenSSL AES-2 5 6 -CBC 加密和解密 PHP 数据。
关键是钥匙和IV。

密钥固定为3 2 字节。
需要 AES-2 5 6 -CBC。
$key = 'Your-3 2 -byte-secret-key-here!!';
IV 应始终是随机的。
使用 openssl_random_pseudo_bytes()。
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-2 5 6 -CBC'));
Base64 编码的 IV 和解密后。
方便储存和转移。
return base64 _encode($iv.$encrypted);
在base64 解密之前解码。
然后将 IV 和秘密文本分开。
$data = base64 _decode($encryptedData); $iv = substr($data, 0, openssl_cipher_iv_length($method));
不要对密钥进行硬编码。
环境变量被存储。
$key = $_ENV['ENCRYPTION_KEY'];
检查加解密结果。
谎言就是失败。
if ( $encrypted === false ) { throw new Exception ( "加密失败: " .openssl_error_string()); }
数据UTF-8 编码。
经过Base64 编码。
$data = '这是要加密的内容'; $data_encrypted = encryptData($data,$key);
HMAC 可以被抑制。
使用 SHA-2 5 6 $hmac = hash_hmac('sha2 5 6 ', $iv.$encrypted, $key);
IV 不需要加密。
但它应该是随机的。
使用密码保存。
$result = base64 _encode($hmac.$iv.$encrypted);
您可以自己评价。