Ionic AES-256-CBC加密数据无法在PHP解密的问题求助
Ionic AES-256加密内容无法在PHP中解密的问题
问题概述
使用@ionic-native/aes-256/ngx在Ionic中加密文本后,PHP端无法解密,且同密钥、IV下PHP加密结果与Ionic加密结果不一致,需实现PHP对Ionic加密内容的解密功能。
关键数据
- 密钥:
12345678901234567890123456789012(32位) - IV:
1234567890123456 - 明文:
ABCD - Ionic加密结果:
W2/PbR8z0sKBblfd4ezO1DKI/7UrB/egwDEGyw7w9tY=(输出含双引号和末尾空格) - PHP同参数加密结果:
5JvCGZhhM12hA9Tz/ldBvw==
Ionic加密代码
import { AES256 } from '@ionic-native/aes-256/ngx'; constructor(public aes: AES256) {} encrypt(key, iv, data){ return this.aes.encrypt(key, iv, data); }
输出:"W2/PbR8z0sKBblfd4ezO1DKI/7UrB/egwDEGyw7w9tY= "
PHP原解密代码
$iv = "1234567890123456"; $key = "12345678901234567890123456789012"; $encrypted = "W2/PbR8z0sKBblfd4ezO1DKI/7UrB/egwDEGyw7w9tY= "; $decrypted = openssl_decrypt($encrypted, "AES-256-CBC", $key, 0, $iv); echo $decrypted;
问题原因与解决方案
问题1:加密字符串含无效字符
Ionic输出的加密结果包含双引号和末尾空格,这些字符会导致PHP的Base64解码失败,需先清理。
问题2:插件加密逻辑差异
你使用的旧版本cordova-plugin-aes256(@ionic-native/aes-256/ngx的底层依赖)会自动生成IV,而非使用传入的IV,最终返回的是IV + 密文拼接后的Base64字符串,因此PHP解密时需从加密结果中提取IV,而非使用原传入的IV。
修正后的PHP解密代码
$original_key = "12345678901234567890123456789012"; $encrypted_str = "W2/PbR8z0sKBblfd4ezO1DKI/7UrB/egwDEGyw7w9tY= "; // 清理加密字符串:移除双引号和多余空格 $clean_encrypted = trim(str_replace('"', '', $encrypted_str)); // Base64解码为二进制数据 $encrypted_data = base64_decode($clean_encrypted); // 拆分自动生成的IV(前16字节)和实际密文(剩余部分) $iv = substr($encrypted_data, 0, 16); $ciphertext = substr($encrypted_data, 16); // 解密:使用OPENSSL_RAW_DATA获取原始字节,自动处理PKCS7/PKCS5填充 $decrypted = openssl_decrypt($ciphertext, "AES-256-CBC", $original_key, OPENSSL_RAW_DATA, $iv); echo $decrypted; // 输出:ABCD
额外建议
如果需要让Ionic和PHP的加密逻辑完全一致,建议升级cordova-plugin-aes256到最新版本,新版本支持传入自定义IV,加密结果仅为密文的Base64,与PHP的openssl_encrypt输出一致。
内容的提问来源于stack exchange,提问作者eden hazard
相关产品推荐
相关产品推荐

