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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:36:03