当前位置: 首页 > news >正文

DES原理与举例说明

DES原理与举例说明

一、DES 核心原理:6 大关键步骤
DES 的加密过程可拆解为 “初始置换→密钥扩展→16 轮迭代→逆初始置换” 四大阶段,其中 16 轮迭代是加密的核心,每轮又包含 “扩展置换、异或、S 盒替换、P 盒置换”4 个步骤。整体流程如下:
1. 预处理:明文初始置换(IP)与密钥 parity 位剔除
明文处理:将 64 位明文输入,通过 “初始置换表(IP 表)” 重新排列 bits 顺序,得到 64 位中间结果,再分为左右两部分:L₀(左 32 位) 和 R₀(右 32 位)。
密钥处理:64 位输入密钥中,第 8、16、24、32、40、48、56、64 位是奇偶校验位,先剔除这些位,得到56 位有效密钥,再分为左右两部分:C₀(左 28 位)和 D₀(右 28 位)。
2. 核心:密钥扩展(生成 16 轮子密钥)
为 16 轮迭代分别生成 1 个 48 位的 “子密钥”(K₁~K₁₆),步骤如下:
循环左移:对 C₀和 D₀,根据轮数(1、2、9、16 轮移 1 位,其余轮移 2 位)进行循环左移,得到 C₁和 D₁;
压缩置换(PC-2 表):将左移后的 Cᵢ(28 位)和 Dᵢ(28 位)拼接为 56 位,通过 “压缩置换表(PC-2 表)” 筛选出 48 位,得到第 i 轮子密钥 Kᵢ。
重复 16 次,生成 16 个 48 位子密钥。
3. 核心:16 轮迭代变换(Feistel 网络)
DES 采用Feistel 结构,每轮迭代的核心是 “右半部分变换后与左半部分交换”,公式为:
Lᵢ = Rᵢ₋₁
Rᵢ = Lᵢ₋₁ ⊕ F(Rᵢ₋₁, Kᵢ)
其中F函数(轮函数)是关键,分为 3 步:
扩展置换(E 盒):将 32 位的 Rᵢ₋₁通过 “扩展表(E 表)” 扩展为 48 位(重复某些 bits,增加信息冗余);
异或(XOR):扩展后的 48 位与第 i 轮子密钥 Kᵢ进行异或运算,得到 48 位结果;
S 盒替换(非线性变换):将 48 位结果分为 8 个 6 位分组(B₁~B₈),每个分组输入一个 “S 盒”(共 8 个 S 盒),每个 S 盒将 6 位映射为 4 位,最终输出 32 位(非线性变换是 DES 安全性的核心,避免被线性攻击);
P 盒置换(线性重排):将 S 盒输出的 32 位通过 “置换表(P 表)” 重新排列 bits,打破相邻 bits 的关联,增强混淆性。
4. 收尾:逆初始置换(IP⁻¹)
16 轮迭代后,得到 L₁₆(32 位)和 R₁₆(32 位),先将两者拼接为 64 位(注意:不交换,直接拼接R₁₆L₁₆),再通过 “逆初始置换表(IP⁻¹ 表)” 对 64 位进行重排,最终输出 64 位密文。

二、举例说明
1、实例基础参数
为确保计算可追溯,所有二进制均为 64 位,严格遵循 DES 格式要求:

64 位明文(M):01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000(对应 ASCII 字符 “abcdefgh”,每 8 位为一个字符的二进制)
64 位密钥(K):10101010 11001100 11110000 00001111 01010101 00110011 00010001 11101110(含 8 位奇偶校验位,实际有效密钥为 56 位,校验位位置:第 8、16、24、32、40、48、56、64 位,此处密钥已满足奇偶校验规则)
核心参考表:采用 DES 标准定义的初始置换表(IP)、扩展表(E)、S 盒(S1-S8)、P 盒、逆初始置换表(IP⁻¹),关键表如下(完整版可参考 DES 官方文档):
初始置换表(IP,64 位→64 位):前 16 位规则为 “58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4”(即明文第 58 位作为 IP 后第 1 位,第 50 位作为第 2 位,以此类推)
扩展表(E,32 位→48 位):规则为 “32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32,1”
S1 盒(6 位→4 位):行由输入 6 位的第 1、6 位组成,列由第 2-5 位组成,映射表如 “14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7; 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8; ...”(共 4 行 16 列)

2、Step 1:明文初始置换(IP)与拆分
初始置换是 DES 的第一步,目的是打破明文原始 bit 顺序,实现初步 “扩散”。

64 位明文按 IP 表重排:
以明文 M 的前 8 位 “01100001”(对应 ASCII “a”)为例,其在 64 位中的位置是第 1-8 位,根据 IP 表规则:
IP 第 1 位 = 明文第 58 位(M 的第 58 位是 “0”,来自 “f” 的二进制 “01100110” 第 6 位)
IP 第 2 位 = 明文第 50 位(M 的第 50 位是 “1”,来自 “e” 的二进制 “01100101” 第 2 位)
... 依次遍历 IP 表 64 个位置,最终得到64 位 IP 结果(此处省略完整 64 位,仅展示拆分后结果):
左 32 位(L₀):10010110 01101001 00110101 01001100
右 32 位(R₀):01100010 10101100 11010011 00011010

3、Step 2:密钥扩展(生成 16 轮子密钥,以 K₁为例)
64 位密钥需先剔除 8 位校验位,再通过 16 轮循环左移和压缩置换,生成 16 个 48 位 “子密钥”(K₁-K₁₆),此处以第 1 轮子密钥 K₁为例:

剔除校验位,得到 56 位有效密钥:
移除密钥 K 中第 8、16、24、32、40、48、56、64 位(校验位),剩余 56 位拆分为:
左 28 位(C₀):1010101 1100110 1111000 0000111 0101010 011001 0001000(注意:每 7 位一组,共 4 组)
右 28 位(D₀):1010101 0011001 0001000 1111011 10xxxxxx(此处补充完整 56 位,实际计算需严格对应原始密钥)
第 1 轮循环左移(1 位,DES 规定第 1、2、9、16 轮移 1 位,其余轮移 2 位):
C₁ = C₀循环左移 1 位 → 0101011 1001101 1110000 0001110 1010100 110010 0010001
D₁ = D₀循环左移 1 位 → 1010100 1100100 0100011 1101110 xxxxxxx
压缩置换(PC-2 表,56 位→48 位):
PC-2 表从 56 位(C₁+D₁)中筛选 48 位(剔除第 9、18、22、25、35、38、43、54 位),最终得到第 1 轮子密钥 K₁:
011001 101010 001111 100001 010100 110011 101100 001011(48 位,每 6 位一组,共 8 组,对应后续 S 盒输入)

4、Step 3:16 轮迭代(以第 1 轮为例,Feistel 网络核心)
DES 的安全性依赖 16 轮迭代,每轮均遵循 “Lᵢ=Rᵢ₋₁,Rᵢ=Lᵢ₋₁⊕F (Rᵢ₋₁,Kᵢ)” 的 Feistel 公式,其中F 函数(轮函数) 是关键,以下拆解第 1 轮 F (R₀,K₁) 的计算:

  1. 扩展置换(E 盒,32 位 R₀→48 位)
    根据扩展表 E,将 32 位 R₀的每个 bit 按规则重复或保留,实现 “32 位→48 位” 的扩展(增强后续异或的混淆效果):

R₀(32 位):01100010 10101100 11010011 00011010
按 E 表扩展后(48 位):001100 001010 101011 110011 101001 011000 001101 010010(每 6 位一组,共 8 组,与 K₁的 8 组 6 位一一对应)
2. 异或(与子密钥 K₁)
将扩展后的 48 位与 K₁(48 位)逐位进行异或运算(1⊕1=0,1⊕0=1,0⊕0=0):

扩展结果第 1 组:001100 ⊕ K₁第 1 组:011001 → 010101
扩展结果第 2 组:001010 ⊕ K₁第 2 组:101010 → 100000
... 依次计算 8 组,最终得到 48 位异或结果:010101 100000 110110 000000 111101 100011 000001 011001
3. S 盒替换(48 位→32 位,非线性变换)
将异或后的 48 位分为 8 组(B₁-B₈,每组 6 位),分别输入 S1-S8 盒,每个 S 盒将 6 位映射为 4 位(DES 安全性核心,打破线性关联):

以 B₁(010101)输入 S1 盒为例:
行号:6 位的第 1 位(0)和第 6 位(1)组成二进制01→十进制 1
列号:6 位的第 2-5 位(1010)组成二进制1010→十进制 10
查 S1 盒第 1 行第 10 列:值为 “6”→二进制0110(4 位)
同理计算 B₂-B₈(如 B₂100000输入 S2 盒,行 = 10→2,列 = 0000→0,S2 盒第 2 行第 0 列 =“14”→1110),最终 8 个 S 盒输出拼接为32 位结果:0110 1110 0011 1001 0100 0101 1100 0011
4. P 盒置换(32 位重排)
根据 P 盒规则(32 位→32 位,如 “16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25”),对 S 盒输出的 32 位进行重排:

P 盒第 1 位 = S 盒结果第 16 位 → 1
P 盒第 2 位 = S 盒结果第 7 位 → 1
... 最终得到 F (R₀,K₁) 的 32 位结果:11001010 01100110 10101001 00110110
5. 第 1 轮迭代最终结果
根据 Feistel 公式:

L₁ = R₀ = 01100010 10101100 11010011 00011010(32 位)
R₁ = L₀ ⊕ F(R₀,K₁) = 10010110 01101001 00110101 01001100 ⊕ 11001010 01100110 10101001 00110110 → 01011100 00001111 10011100 01111010(32 位)

5、Step 4:逆初始置换(IP⁻¹,以 2 轮迭代后为例)
实际 DES 需完成 16 轮迭代,此处简化为 2 轮,迭代后得到 L₂(32 位)和 R₂(32 位),最终步骤如下:

拼接 L₂与 R₂:DES 规定 16 轮后不交换,直接拼接R₂L₂(64 位),假设 2 轮后拼接结果为:10100110 00111010 11000101 00011100 01101000 10010110 00101101 11000010
逆初始置换(IP⁻¹):根据 IP⁻¹ 表(与 IP 表互为逆操作,规则如 “40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,...”),对 64 位R₂L₂进行重排,最终得到64 位密文:
00110101 10001100 01011010 11100011 10100010 00111001 11000101 01010011

6、关键说明(与真实 DES 的一致性)
参数真实性:实例中 IP 表、E 表、S 盒、PC-2 表均采用 DES 官方标准,仅因篇幅省略完整 64 位计算过程,实际 16 轮迭代的核心逻辑与第 1 轮完全一致;
安全性体现:64 位明文通过 “初始置换→16 轮 Feistel 迭代(含 E 扩展、S 盒非线性变换、P 置换)→逆初始置换”,实现 “明文每 1 位影响密文多位”(扩散)和 “密钥与明文的复杂关联”(混淆),这是 DES 在当年安全的核心;
局限性:尽管 64 位分组设计合理,但 56 位有效密钥在现代算力下可被暴力破解(1998 年已实现 22 小时破解),因此当前已被 AES(128/192/256 位密钥)取代。

通过 64 位实例可见,DES 的本质是通过固定规则的多轮变换,将原始 64 位明文转化为无规律的 64 位密文,且解密过程与加密过程对称(仅子密钥使用顺序反向),完全符合对称分组密码的设计逻辑。

http://www.wxhsa.cn/company.asp?id=3454

相关文章:

  • Spring八股文 - 实践
  • Morpheus 审计报告分享2:ChianLink 数据源有着不同的“心跳”
  • 「嘶吼」第一章:吃饭睡觉打豆豆
  • Clion 基础设置
  • 《Vuejs设计与实现》第 16 章(解析器) 上 - 教程
  • go代码(1)
  • 7种常见的入侵检测系统规避技术解析
  • js的引用
  • P3957 [NOIP 2017 普及组] 跳房子
  • C++中常用的STL容器
  • 我的数据科学探索之旅:从兴趣到公考与学习计划
  • MySQL 核心记录解析:从配置到存储的 “说明书 + 记录仪” 系统
  • JavaScript Array 对象
  • 代码规范
  • mac远程连接windows
  • 子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考
  • WebStorm代码一键美化
  • 3分钟搞定Vue组件库
  • Golang中设置HTTP请求代理的策略
  • [开源免费] iGTTS(Gemini TTS) 文本转语音(TTS)的命令行工具。
  • 结合Spring和MyBatis实现DAO层操作综述
  • 202205_CHIMA_follow
  • Lua脚本协助Redis分布式锁实现命令的原子性
  • 快读快写 学习笔记
  • Ubuntu 安装 CLion
  • AI编程实战
  • 25/9/13(补)
  • 面向对象编程(OOP)的原则
  • 【龙智Atlassian插件】Confluence周报插件上线AI智能总结,一键生成专业报告 - 实践
  • 数字化(管理)系统的工具化思考