Dart中AES-CBC解密时提取前置IV及解决解密失败问题
AES-CBC加密解密问题修复(Dart)
问题根源
你的解密代码存在多处致命错误,直接导致「无效填充字符」错误及功能失效:
- IV初始化语法错误:误用
IV.decodedIV,正确方式是用解码后的字节创建IV实例 - 核心方法调用错误:解密时调用了
e.encrypt加密方法,而非e.decrypt解密方法 - 参数类型不匹配:解密时未将密文字节包装为
Encrypted对象 - 返回值处理错误:试图直接返回
Encrypted对象,而非解密后的字符串
修正后的解密代码
import 'package:encrypt/encrypt.dart' as encrypt; import 'dart:convert'; String decryptString(String? inputString, String privateKey) { // 校验输入合法性 if (inputString == null || inputString.length < 24) { throw ArgumentError("无效的加密字符串"); } // 拆分IV与密文的Base64片段 final ivBase64 = inputString.substring(0, 24); final cipherBase64 = inputString.substring(24); // Base64解码为字节数组 final ivBytes = base64.decode(ivBase64); final cipherBytes = base64.decode(cipherBase64); // 初始化密钥与IV final key = encrypt.Key.fromUtf8(privateKey); final iv = encrypt.IV(ivBytes); // 创建AES加密器(与加密端配置保持一致) final e = encrypt.Encrypter( encrypt.AES(key, mode: encrypt.AESMode.cbc, padding: 'PKCS7')); // 执行解密操作 final decryptedText = e.decrypt(encrypt.Encrypted(cipherBytes), iv: iv); return decryptedText; }
关键注意事项
- 确保密钥
privateKey长度严格为32字符(对应AES-256),若使用16字符则对应AES-128,加密和解密端必须保持一致 - 加密代码中
iv.base64的长度确实为24字符(16字节IV的Base64编码结果),拆分逻辑无需调整 - 建议在加密端也添加输入非空校验,避免空文本加密引发异常
内容的提问来源于stack exchange,提问作者Max Silverman
相关产品推荐
相关产品推荐

