Dart/Flutter中ECB模式3DES TransformFinalBlock加密与C#结果不匹配问题
问题原因
- 填充模式配置错误:C#侧使用的是
PaddingMode.Zeros(明文长度不足8字节倍数时末尾补0),你当前Flutter代码用的DESPaddingType.OneAndZeroes会先填充0x80再补0,两者逻辑完全不同,直接导致加密结果不一致。 - 输入数据处理冗余:C#侧直接传入
"2"的完整UTF8编码字节,你代码中单独取bytes.last的逻辑没有必要,虽然本例中不会出错,但如果加密的是多位数或多字符字符串时会直接丢失数据。
修正后代码(以常用的flutter_des库为例)
import 'dart:convert'; import 'package:flutter_des/flutter_des.dart'; void encryptTest() async { final key = base64.decode("B4WOmhsRsOSD2ZRfhmULCcI0lR4kNiy6"); final seq = 2; final plainBytes = utf8.encode(seq.toString()); final des3 = DES3( key: key, mode: DESMode.ECB, paddingType: DESPaddingType.Zeros, // 替换为和C#对齐的零填充 ); final encrypted = des3.encrypt(plainBytes); // 直接传入完整明文字节 final encryptedBase64 = base64.encode(encrypted); // 输出验证 print(encrypted); // 输出应为 [213, 5, 215, 181, 143, 185, 167, 134] print(encryptedBase64); // 输出应为 "1QXXtY+5p4Y=" }
特殊适配说明
如果你使用的3DES加密库没有内置Zeros填充,可以手动实现补零逻辑,加密时关闭自动填充即可:
// 手动补零逻辑 int blockSize = 8; int padLength = blockSize - (plainBytes.length % blockSize); if (padLength != blockSize) { plainBytes.addAll(List.filled(padLength, 0)); } // 加密时设置paddingType为无填充
内容的提问来源于stack exchange,提问作者Lucas Rodrigues
相关产品推荐
相关产品推荐

