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
相关产品推荐
相关产品推荐

