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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:43:22