DES及TripleDES加密解密 — 支持ECB/CBC模式、多编码格式
DES(数据加密标准)是 IBM 于 1970 年代开发的对称分组加密算法,1977 年被美国国家标准局(NIST 前身)采纳为联邦标准(FIPS PUB 46)。DES 使用 64位分组、56位有效密钥(密钥实际上是64位,其中每8位有一位奇偶校验位),经过 16轮 Feistel 网络 处理。其算法结构包含初始置换(IP)、16轮迭代(扩展置换、S-盒替换、P-置换)和逆初始置换(FP)。
DES 的核心安全来自 S-盒(Substitution Boxes),共 8 个 S-盒,每个将 6 位输入映射为 4 位输出。S-盒的设计准则至今仍部分属于机密。DES 的解密使用与加密完全相同的算法,仅将子密钥顺序反转。
3DES(又称 TDEA)是对原始 DES 的增强,通过对数据执行三次 DES 操作来提高安全性。标准模式为 EDE(Encrypt-Decrypt-Encrypt):用 K1 加密,K2 解密(逆向一轮),K3 加密。解密时顺序相反。根据密钥长度分为:
| 模式 | 名称 | 特点 | 安全性 |
|---|---|---|---|
| ECB | 电子密码本 | 每个分组独立加密,可并行,相同明文得相同密文 | 泄露明文模式,不推荐 |
| CBC | 密码分组链接 | 每分组与前一组密文异或后加密,需初始向量(IV) | 隐藏明文模式,推荐 |
ECB 模式对每个 64 位分组独立加密,相同的明文块产生相同的密文块,易受字典攻击和模式分析。著名的"企鹅图"展示了 ECB 的缺陷(加密后图像轮廓依然可见)。CBC 模式通过 IV 和前一分组引入随机性,消除明文模式,但加密过程串行、速度较慢。
| 填充 | 方法 | 说明 |
|---|---|---|
| PKCS7 | 缺少 N 字节则填充 N 个值为 N 的字节 | 最广泛使用的填充,始终填充(至少1字节) |
| Zero | 缺少 N 字节则填充 N 个 0x00 | 简单但有歧义(无法区分填充与数据中的 0x00) |
| 无 | 不做填充,要求输入必须是 8 字节整数倍 | 适用于已经对齐的二进制数据 |
DES:56位密钥在现代已不安全。1999 年 EFF 的 Deep Crack 专用机在 22 小时内破解 DES。2017 年,NIST 正式撤销 DES 作为标准(SP 800-131A Rev.1)。在 2020 年代,使用 FPGA 或云 GPU 可以在数小时内暴力破解 DES。
3DES:112位有效密钥仍具一定安全性,但远低于现代标准(AES-128 的 128位)。NIST 在 2023 年后逐步弃用 3DES,预计 2024 年后不再批准。主要风险是 Meet-in-the-Middle 攻击:对 3DES-2T 的 MITM 攻击将有效安全强度从 112 位降至约 57 位(取决于攻击场景)。此外,3DES 的 64 位分组大小也使其易受 Sweet32 碰撞攻击(约 32GB 数据即可产生碰撞)。
DES/3DES 在现代系统中已被 AES(Advanced Encryption Standard)取代。仍在使用 DES/3DES 的场景包括:
建议:新系统直接使用 AES-256(本站 AES 工具)。必须使用 3DES 时优先使用 3DES-3T 和 CBC 模式,并避免超过 32GB 数据的加密。
| 参数 | DES | 3DES-2T | 3DES-3T |
|---|---|---|---|
| 分组大小 | 64 bit (8字节) | 64 bit (8字节) | 64 bit (8字节) |
| 密钥长度 | 64 bit (56有效) | 128 bit (112有效) | 192 bit (168有效) |
| 轮数 | 16 | 48 (16×3) | 48 (16×3) |
| 安全强度 | ~56 bit | ~80 bit (MITM) | ~112 bit (MITM) |
| 分组排列 | Feistel 网络 | EDE 模式 | EDE 模式 |