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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:49:51