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

CI3加密数据在CI4解密报认证失败的跨版本兼容问题

问题根因

跨版本解密失败核心是两个框架加密层的默认实现逻辑不匹配,和cipher、mode、key长度无关,改digest参数也解决不了:

  • 密钥派生逻辑差异:CI4的加密器默认会通过HKDF算法从配置的主密钥,分别派生独立的加密密钥、HMAC认证密钥;但CI3的加密库没有密钥派生步骤,直接使用传入的原始密钥同时完成加密和HMAC计算。
  • 密文结构差异:CI3生成的密文base64解码后结构为 64字节sha512 HMAC值 + 16字节IV初始向量 + 实际密文主体;但CI4解密时默认按 16字节IV初始向量 + 实际密文主体 + 64字节sha512 HMAC值 的顺序拆分数据,结构完全不匹配,必然报认证失败。
解决方案

要兼容CI3已生成的密文不需要修改CI3端代码,在CI4端单独实现兼容CI3规则的解密逻辑即可,不要直接调用CI4自带的decrypt()方法,参考代码如下:

// 待解密的CI3生成的完整base64密文
$ci3CipherText = '你的CI3加密返回的密文';
$rawKey = '12345678901234567890123456789012';

// 1. 对密文做base64解码得到原始二进制数据
$raw = base64_decode($ci3CipherText);

// 2. 按CI3的结构拆分数据:前64字节是HMAC,接下来16字节是IV,剩余部分是加密内容
$hmac = substr($raw, 0, 64);
$iv = substr($raw, 64, 16);
$encryptData = substr($raw, 80);

// 3. 校验HMAC合法性,逻辑和CI3完全一致:用原始密钥对「IV+密文」计算sha512 HMAC,比对防止篡改
$calcHmac = hash_hmac('sha512', $iv . $encryptData, $rawKey, true);
if (!hash_equals($hmac, $calcHmac)) {
    throw new \RuntimeException('密文校验失败,密钥不匹配或数据被篡改');
}

// 4. 调用openssl原生方法解密,对应CI3使用的aes-256-ctr模式
$plainText = openssl_decrypt(
    $encryptData,
    'aes-256-ctr',
    $rawKey,
    OPENSSL_RAW_DATA,
    $iv
);

echo $plainText; // 输出原始明文
注意事项
  • 不要修改CI4框架内核的Encryption类代码,后续框架升级会覆盖改动,建议把上述兼容逻辑封装成独立的服务类放在app/Services目录下调用。
  • 如果需要双向兼容(CI4加密的数据也能被CI3解密),参照上述逻辑反向实现加密方法即可:加密后按CI3的顺序拼接HMAC、IV、密文,再做base64编码返回,不要用CI4默认的加密输出方法。
  • 官方文档提到的兼容,仅指算法、模式、密钥长度参数可对齐,不代表默认封装逻辑完全一致,直接调用原生解密方法必然失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:15:41