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

Flutter使用encrypt:^5.0.3解密时偶现RangeError: -16(iOS设备)

Flutter encrypt: ^5.0.3在iOS Release模式下偶现RangeError: -16的成因分析

问题描述

  • 使用encrypt: ^5.0.3依赖进行字符串加解密时,Release模式下部分iPhone设备偶现如下错误:
RangeError: Value not in range: -16
  • 错误固定在调用getStringByEncryptData()方法时触发,错误值始终为-16,目前无法稳定复现。

代码实现

import 'package:encrypt/encrypt.dart' as encrypt;

class EncryptedStorage {
  
  static final key = encrypt.Key.fromUtf8(randomString32);

  static final iv = encrypt.IV.fromUtf8(randomString16);

  static final encrypt.Encrypter encryptor = encrypt.Encrypter(
    encrypt.AES(
      key,
      mode: encrypt.AESMode.cbc, 
      padding: "PKCS7", 
    ),
  );

  static String getEncryptedString(String originalString) {
    final encrypt.Encrypted encrypted = encryptor.encrypt(originalString, iv: iv);
    return encrypted.base64; 
  }

  static String getStringByEncryptData(String encryptedData) {
    final String decrypted = encryptor.decrypt64(encryptedData, iv: iv);
    return decrypted;
  }
}

Flutter环境信息

[✓] Flutter (Channel stable, 3.22.1, on macOS 14.5 23F79 darwin-x64, locale en-GB)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.3)
[✓] Android Studio (version 2021.2)
[✓] Android Studio (version 2021.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.2.4)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.2.1)
[✓] VS Code (version 1.89.1)

错误成因分析

  • 加密数据损坏或截断:存储或传输加密后的base64字符串时,可能出现字节丢失、截断,导致解密时输入的base64无法解码为AES-CBC要求的16字节整数倍长度密文。底层处理计算偏移量时会得到负数,抛出-16的RangeError。偶现可能源于iOS设备存储IO异常、网络丢包或字符串编码转义错误。
  • base64解码异常:若加密后的base64字符串混入非法字符(如空格、换行)或被意外修改,decrypt64解码后得到的字节数组长度不符合要求,CBC模式的填充校验或块处理逻辑会触发越界错误,表现为-16的RangeError。
  • Release模式代码优化问题:Flutter Release模式下的Tree Shaking、代码混淆等优化,可能导致encrypt库底层字节处理逻辑异常。部分iPhone设备架构(如arm64e)或iOS版本的兼容性问题,会触发优化后的逻辑错误,导致密文长度计算异常。
  • IV/Key一致性问题:尽管代码中IV和Key为静态常量,但如果randomString16或randomString32的生成逻辑在Release模式下存在设备差异(如随机数生成器行为不一致),会导致解密时使用的IV/Key与加密时不匹配,解密后的填充数据异常触发长度校验错误,抛出-16的RangeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:36:04