Flutter热重启后无法解密文本:Invalid or corrupted pad block错误
解决方案:热重启后解密报「Invalid or corrupted pad block」问题
问题根源
你遇到的解密错误,核心原因是加密与解密使用的IV(初始化向量)不一致。你的代码中全局初始化了一个IV,热重启后该IV会重新生成(若为随机生成逻辑),导致解密时用的IV和加密原数据的IV不匹配,触发AES填充校验失败。
修复方案
AES-CBC模式(encrypt包默认模式)要求每次加密使用唯一随机IV,且解密时必须使用与加密完全相同的IV。因此需要修改代码,将加密时的IV与密文一起存储到Firestore,解密时取出对应IV再操作。
修改后的代码示例
import 'package:encrypt/encrypt.dart'; // 注意:密钥请勿硬编码在代码中,建议用安全存储方案(如flutter_secure_storage)保存 final Key key = Key.fromUtf8('my 32 length key................'); final Encrypter encrypter = Encrypter(AES(key)); // 加密:生成随机IV,返回密文和IV的base64字符串 Map<String, String> encryptMessage(String plainTextMessage) { final IV iv = IV.random(16); // 每次加密生成新的随机IV final Encrypted encrypted = encrypter.encrypt(plainTextMessage, iv: iv); return { 'ciphertext': encrypted.base64, 'iv': iv.base64, }; } // 解密:传入密文和对应的IV base64字符串 String decryptMessage(String encryptedMessage, String ivBase64) { final IV iv = IV.fromBase64(ivBase64); final Encrypted encrypted = Encrypted.fromBase64(encryptedMessage); return encrypter.decrypt(encrypted, iv: iv); }
业务流程调整
- 加密上传:调用
encryptMessage得到密文和IV,将这两个字段(ciphertext、iv)一起写入Firestore文档。 - 解密读取:从Firestore读取文档中的
ciphertext和iv字段,传入decryptMessage完成解密。
额外注意事项
- 密钥必须安全存储,绝对不能硬编码在客户端代码中,防止逆向破解泄露。
- 确保Firestore存储的密文和IV没有被意外修改(如编码错误、字段截断等),否则也会引发解密失败。
内容的提问来源于stack exchange,提问作者deandrehaijiel
相关产品推荐
相关产品推荐

