iOS 上 `react-native-aes-crypto` 的 AES-256-CTR 解密问题

问题描述 投票:0回答:1

解释。

我在使用

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);

   // Log converted values
   console.log('Cipher (Base64):', content);
   console.log('Key (Hex):', hexKey);
   console.log('IV (Hex):', hexIV);

   // Decrypt using 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

重现步骤

  1. 在 Android 和 iOS 上使用
    decryptAES_256_CTR
    功能。
  2. 传递相同的密文、密钥和 IV。
  3. 观察 iOS 上的失败情况。

故障排除完成

  1. 验证密钥长度(AES-256 为 32 字节)和 IV 长度(16 字节)。
  2. 检查密文是否为Base64格式。
  3. 确保使用
    pod install
    正确链接库。
  4. 使用不同的密钥和密文进行测试。

问题

  1. 在 iOS 上使用
    react-native-aes-crypto
    进行 AES-256-CTR 解密是否存在任何已知问题?
  2. 这可能是由于库在平台之间处理解密的方式存在差异吗?
  3. iOS 上的 AES-256-CTR 是否需要特定配置?

任何帮助或建议将不胜感激!

ios react-native encryption
1个回答
0
投票

您使用的 IV 大小为 8 字节,但 AES 需要 16 字节 IV。

如果您将 0x00 值的 IV 扩展到 16 个字节,即如果您应用

0x6333AFCC5354A0140000000000000000
,则发布的数据解密成功,请参阅 CyberChef
Android 以上述方式隐式扩展了太短的 IV,这就是解密起作用的原因。据推测,iOS 对此的处理方式有所不同,这会导致 IV 不正确,从而导致解密不正确。

作为修复,您应该尝试使用full 16 字节 IV(将来您应该从一开始就应用 16 字节 IV)。


需要指出的是 react-native-aes-crypto 库的一个特点:它使用 padding 来实现 CTR 模式 s。 这里。这是不必要的,因为流密码模式(例如 CTR)实际上不需要填充。只要你使用 react-native-aes-crypto 进行加密和解密,这并不重要。但是,一旦您使用 react-native-aes-crypto 加密并使用另一个库解密(反之亦然),就必须考虑到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.