iOS端react-native-aes-crypto的AES-256-CTR解密失败问题
问题说明
使用react-native-aes-crypto库进行AES-256-CTR解密时,Android端解密正常,但iOS端抛出错误[Error: Decrypt failed]。
解密代码
import Aes from 'react-native-aes-crypto'; export async function decryptAES_256_CTR(content, key, iv) { const hexIV = base64ToHex(iv); const hexKey = base64ToHex(key); // 日志输出转换后的值 console.log('Cipher (Base64):', content); console.log('Key (Hex):', hexKey); console.log('IV (Hex):', hexIV); // 使用AES解密 return await Aes.decrypt(content, hexKey, hexIV, 'aes-256-ctr'); } function base64ToHex(base64) { const raw = Buffer.from(base64, 'base64').toString('binary'); let result = ''; for (let i = 0; i < raw.length; i++) { const hex = raw.charCodeAt(i).toString(16); result += hex.length === 2 ? hex : '0' + hex; } return result.toUpperCase(); }
问题描述
- Android端解密正常,iOS端解密失败。
- iOS端抛出异常:
(NOBRIDGE) ERROR Error during decryption: [Error: Decrypt failed]
日志信息
报错时的输入日志:
Cipher (Base64): /j2YKMCrAsi00nN9lnshKwmIuHSHFteafgS0uWskhr0aw0152WPZPKKmNQthurxOO0rtHl8F84hlVg8YsqTAZ5enGKNk+XLKUi58c8H7rQO/Dedw8W3Pv6iHrZN/hLTBo1T4V8XP5sC+FP7NxHvTXrL8lfQ/dhWPYqZZ8hae12/Pwa1dNgL4B0hQaV0AdQySix9zRwCqrVUJXdoJizBcf3gvKl6+goMg5+KYLP+xJUSPCMiz01ocL2x2tipLxVo9FUjgnR2nj+OlTrZ99sWPTD8JkzRL77ge6G/wbCyzIU//JbR1Q+FfFCE+GcphMReH5dNiTR5g2XSeZo/GiVz+n+62xXMVySAs/0DJt4P62mnvE6LUkkAY/02wzvVb4jzuMP/R5KL2oZjuqPIfVvRrw/vp1Wj5/KwWKg6sBb0/z28StBn1qB5is/J61orO8yam2DowYFIZE+vZY3TCIlmoaFEviVW52yVWWGnWwa9AVxUYXUH4ZlbhBdGbO9+xrRhtx9RiU5cahMDOen/k2upiej7kBpXyPisPhPPQ1+K9no1D7/HBnawf+cs5UbOi28PmiS0h07nQd86dhKECFKOWzSaY1VNC0iAXRrG3BEzTzxgEjJmt/LCyl6YI+XpYX5BEXPq94hNYPgrhfVdK+uesnGsLT1XegIryzQzUWSoITpX9R8TwoO13HS0wv8Nu26Iuw3CJvbsGSEbG0glY4HRHwvwuSGIwvLo4Cc6QVCIqGhiSUITwMfd4KbCmLcO87qMc1fvyeeEE91A/3kNGY1AqubnJBqVu6eA2oxp3xdJ8HDKm8w1m0qF3sc/QZD/SnWPoaFBcAPV0mW0KG6XvyZpe9+CJUN4vPeoYs2iSYEkiy+n3L/yFo6tZIgvECQ856sjVjozTecEcyZhKPbpAfiKfWaub+VqcnoeAHLSpblnOGnaK7vtBGmzyfVw++Y0NrNhgSIO+IML+13puoxafVtb/aQ3t4+5Ey1n8Qw6ni9a/GJf0Ix7DK404mo7Bkb+YFJKeuOhb49QhMLzUGbeq5ieBAToiHH4Uz2j6Xrbmolp89Wa36EiVjAfkC15S9bEZWUm+H82cchfFwoHee/hmlzVfdzwDS6WQWyARxaBE048uESnFBAbA5PROobEXob73Q7rePWK4sCLY5P3Q/zTHQ0iF0xht7Bvlq7XnpjUqKjBL6cXqbW15gBDgvmIdZKUFCxfuWqaP4eRWVMwo++cq/P+ScIYELI0aHNJ7RfT9vWbElndQm1IgYQak56FiZ7ATp/MBii3xudE5UJ+wyNAvh58ye3DUoNT2SPfp+nA6JzTO7nAM6I3Kr79f3bIDfx2LP11xnYU4nyTE5LM0o7EpluG6sdIPcf4XpljKXxinJ5Dzb3P+kcyZm/ENmHnqyaH3pQT9 Key (Hex): 6B76F4CE1907991A845AB7523F8C1834E658CBF63A0214A589A2F4752BD19977 IV (Hex): 6333AFCC5354A014
复现步骤
- 在Android和iOS端分别调用
decryptAES_256_CTR函数。 - 传入相同的密文、密钥和IV。
- 观察到iOS端解密失败。
已排查操作
- 验证了密钥长度(AES-256为32字节)和IV长度(16字节)。
- 确认密文为Base64格式。
- 确保已通过
pod install正确关联库。 - 测试了不同的密钥和密文。
疑问
- 使用
react-native-aes-crypto在iOS端进行AES-256-CTR解密是否存在已知问题? - 该问题是否源于库在跨平台间的解密处理差异?
- iOS端的AES-256-CTR解密是否需要特定配置?
解决方案
1. 修复IV长度问题
从日志看,转换后的IV是6333AFCC5354A014,仅16个十六进制字符(对应8字节),但AES-CTR要求IV必须是16字节(32个十六进制字符)。Android端可能自动补全了IV,而iOS端严格校验长度导致失败。
- 确认加密端生成的IV是16字节,解密端同步保持一致;若原始IV不足,需在加密端统一填充规则(比如补0),解密端同步处理。
2. 调整参数传递格式
react-native-aes-crypto的decrypt方法在iOS和Android上对参数格式的兼容性有差异:
- 尝试直接传入Base64格式的密钥和IV,跳过手动转十六进制的步骤,避免编码错误:
export async function decryptAES_256_CTR(content, key, iv) { return await Aes.decrypt(content, key, iv, 'aes-256-ctr'); }
- 若必须用十六进制,去掉
base64ToHex函数里的toUpperCase(),iOS部分加密库对十六进制大小写敏感。
3. 统一CTR计数器配置
iOS的CommonCrypto库和Android加密库对CTR模式的计数器字节序、起始值可能有默认差异,需确认加密端的配置(比如是否为小端序),解密端保持完全一致。
4. 更换或升级库
react-native-aes-crypto存在跨平台兼容性问题,尤其是CTR模式。可以升级到最新版本,或替换为react-native-quick-crypto,该库跨平台一致性更高、性能更优。
5. 验证密文完整性
对比两端密文的Base64字符串长度和内容,确保iOS端接收到的密文没有被截断或编码错误。
内容的提问来源于stack exchange,提问作者Backend Engine Developer
相关产品推荐
相关产品推荐

