3DES(Triple DES,又称 DES-EDE3)是对 DES 的加强:用 24 字节密钥拆成 K1 / K2 / K3 三把 8 字节子密钥,对数据依次做「用 K1 加密 → 用 K2 解密 → 用 K3 加密」(EDE,Encrypt-Decrypt-Encrypt)。当 K1 = K2 = K3 时它退化回普通 DES,因此可以兼容旧的 DES 数据。
它的有效强度约为 112 位(中间相遇攻击的结果,而不是简单的 3 × 56 = 168 位)。NIST 已在 2023 年正式弃用 3DES,新系统请改用 AES 或 SM4。
| 参数 | 可选值 | 说明 |
|---|---|---|
| 密钥长度 | 24 字节(固定) | K1 + K2 + K3,各 8 字节 |
| 分组长度 | 8 字节(固定) | 与 DES 相同,64 位 |
| 模式 | ECB / CBC / CFB / OFB / CTR | 与 AES 的模式语义相同 |
| 填充 | PKCS#7 / ZeroPadding / ANSI X9.23 / NoPadding | 流式模式不使用填充 |
| 向量 IV | 8 字节 | ECB 不使用,其余模式必填 |
有些系统使用 16 字节密钥,把 K1 复用为 K3(即 K1 / K2 / K1)。这种变体有效强度约 80 位,本工具为了保持「密钥长度即算法参数」的清晰对应,只接受标准 24 字节形式。如果你手上的密钥只有 16 字节,请自行把它拼成 K1 + K2 + K1 的 24 字节形式再输入。
PKCS5Padding(在 8 字节分组下与 PKCS#7 等价),PHP 与 OpenSSL 默认 PKCS#7,两者可以互通;但如果对方用的是 ZeroPadding,就必须显式选择。openssl enc -des-ede3-cbc -K 0123456789abcdeffedcba98765432100123456789abcdef -iv 0102030405060708 -in plain.txt -out cipher.binopenssl enc -d -des-ede3-cbc -K <同样的 48 位十六进制密钥> -iv 0102030405060708 -in cipher.bin -out plain.txt-K 必须写成 48 位十六进制(24 字节),-iv 是 16 位十六进制(8 字节)。OpenSSL 默认使用 PKCS#7 填充,与本工具的默认值一致。
3DES 的软件实现通常比 AES 慢 3 到 6 倍:它要做三次 DES 运算,而 AES 在现代 CPU 上有专门的硬件指令(AES-NI),可以做到每字节不到 1 个时钟周期。再加上 64 位分组带来的碰撞风险,以及已被 NIST 正式弃用的现状,除非是为了兼容存量数据,否则没有理由继续选择 3DES。
密文支持哪些编码?
NoPadding 模式有什么限制?
ZeroPadding 与 PKCS#7 有什么区别?
3DES 还有必要使用吗?
为什么加密同样的明文每次结果不同?
Java 的 DESede 能和这个工具互通吗?
支持哪些加密模式?
密钥和明文会被上传到服务器吗?
3DES 的向量是 8 字节还是 16 字节?
为什么本工具不支持 16 字节的 3DES 密钥?
3DES 的有效强度是多少?
3DES 的密钥为什么是 24 字节?