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

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

业务流程调整

  1. 加密上传:调用encryptMessage得到密文和IV,将这两个字段(ciphertext、iv)一起写入Firestore文档。
  2. 解密读取:从Firestore读取文档中的ciphertext和iv字段,传入decryptMessage完成解密。

额外注意事项

  • 密钥必须安全存储,绝对不能硬编码在客户端代码中,防止逆向破解泄露。
  • 确保Firestore存储的密文和IV没有被意外修改(如编码错误、字段截断等),否则也会引发解密失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:52:43