You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP openssl_encrypt加密ID同页正常 跨页解密失败求助

AES-128-CTR加密ID解密乱码问题解决

问题根源:IV格式不匹配

你在加密页把二进制IV通过bin2hex()转成了十六进制字符串,和密文拼接后编码传输,但表单页提取IV时直接把十六进制字符串传给了openssl_decrypt()——而这个函数需要的是原始二进制格式的IV,不是十六进制文本,这就是解密出乱码的直接原因。

修复代码(表单页)

把提取的十六进制IV转回二进制即可,修改后的代码:

// 获取URL参数(PHP会自动对$_GET参数做urldecode,不用手动处理)
$encryptedData = $_GET['sId'];
// 提取前16位的十六进制IV字符串
$ivHex = substr($encryptedData, 0, 16);
// 将十六进制转回二进制IV
$iv = hex2bin($ivHex);
// 提取密文部分
$ciphertext = substr($encryptedData, 16);
// 执行解密
$decryptedId = openssl_decrypt($ciphertext, "AES-128-CTR", "test", 0, $iv);

额外优化建议

  • IV长度规范:AES-128-CTR模式的标准IV长度是16字节(CTR需要16字节的初始计数器值),你当前用的8字节IV会被openssl自动补全,建议显式生成符合规范的IV:
    $iv = random_bytes(openssl_cipher_iv_length("AES-128-CTR"));
    
  • 密钥安全性:明文密钥"test"完全不具备安全性,生产环境必须使用随机生成的16字节密钥(AES-128对应16字节密钥),生成方式:
    $secretKey = random_bytes(16);
    
    密钥要妥善存储,不能硬编码在代码里。
  • 传输方式:GET参数有长度限制,如果加密后的内容过长,建议改用POST方式传递参数。

内容的提问来源于stack exchange,提问作者purple11111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:35:15