DES(数据加密标准)的密钥扩展算法详解
好的,我们这次讲解DES的密钥扩展算法。DES的完整算法你已经了解过其Feistel网络,但其安全性在很大程度上依赖于一个精妙的“密钥扩展”过程,它能将用户输入的56位有效密钥(连同8位奇偶校验位,共64位)生成为16个48位的轮密钥,供每一轮加密使用。
第一步:认识输入——初始密钥
DES的有效密钥长度为56位,但通常以一个64位的块(8字节)形式输入。每个字节的最高位(第8位)被用作奇偶校验位,用于检测传输错误。在扩展算法开始时,这8个校验位会被直接丢弃,我们得到56位的“核心密钥”。
假设我们有一个64位初始密钥K,其位表示为:
K = k1 k2 k3 ... k64
其中,k8, k16, ..., k64 是奇偶校验位,它们会在第一步被移除。
第二步:置换选择1(PC-1)
这56位的核心密钥并非直接使用,而是首先要经过一个固定的“置换选择1”(PC-1)进行重新排列。
- PC-1是一个56×56的置换表(输入56位,输出还是56位)。它有两个作用:
- 打乱原始密钥的比特顺序,增加混淆。
- 将56位密钥分成两个28位的半密钥,我们称之为
C0(左半部分)和D0(右半部分)。
具体操作:
- 忽略初始64位密钥中的8个奇偶校验位。
- 将剩下的56个有效比特,按照PC-1表(一个固定的、公开的置换表)的规定位置,重新排列成新的56位序列。
- 将这新的56位序列,从中间分成两个28位的部分:前28位是
C0,后28位是D0。
至此,我们有了初始的轮密钥状态:C0 和 D0。
第三步:循环左移生成 Ci 和 Di
DES共有16轮加密,每一轮需要一个48位的子密钥(轮密钥)。C0和D0需要经过16次迭代变换,生成C1/D1, C2/D2, ..., C16/D16。
每一轮迭代的核心操作是循环左移。对于每一轮 i (i从1到16):
C_i = LS_i(C_{i-1})D_i = LS_i(D_{i-1})
这里 LS_i 表示对28位的比特串进行循环左移操作。移位数是固定的,并且对于不同轮次有所不同:
- 对于第1、2、9、16轮:循环左移1位。
- 对于其他轮次(第3、4、5、6、7、8、10、11、12、13、14、15轮):循环左移2位。
举例说明:
假设 C_{i-1} = 1111000011110000111100001111 (一个示例的28位串)
- 如果本轮是第1轮,需要左移1位,则
C_i变为:1110000111100001111000011111(原序列最左边的1移到最右边)。 - 如果本轮是第3轮,需要左移2位,则
C_i变为:1100001111000011110000111111(原序列最左边的11移到最右边)。
这个设计使得密钥比特在不同轮次中被均匀地使用。
第四步:置换选择2(PC-2)生成轮密钥 Ki
在每一轮中,我们得到了C_i和D_i(各28位)。将它们连接起来形成一个56位的串 C_i D_i。但最终轮密钥只需要48位。
为了生成第 i 轮的48位轮密钥 K_i,我们需要对 C_i D_i 这个56位串执行 置换选择2(PC-2)。
- PC-2是一个48×56的置换表。它从56位的
C_i D_i中,根据固定的位置选择出48位,并打乱它们的顺序,形成K_i。 - 注意:PC-2的输入是56位,输出是48位,这意味着有8位(具体是哪些位由PC-2表决定)在每一轮生成轮密钥时被丢弃了。这增加了密钥的复杂性,因为原始密钥的每一位并不会在每一个轮密钥中都出现。
第五步:过程总结与可视化
让我们把整个过程串起来:
- 输入:64位密钥(含8位奇偶校验)。
- PC-1:去校验,置换,得到
C0(28位)和D0(28位)。 - 循环迭代:对于 i = 1 到 16:
C_i = LS_i(C_{i-1})(根据轮次左移1或2位)D_i = LS_i(D_{i-1})- 将
C_i和D_i连接成56位。 - 对
C_i D_i应用PC-2,输出48位的轮密钥K_i。
解密过程:DES解密使用的是完全相同的结构,但轮密钥的使用顺序是相反的。即解密第一轮使用K_16,第二轮使用K_15,...,最后一轮使用K_1。密钥扩展算法本身在解密时正向运行一遍,生成K1到K16,然后逆向提供给解密函数使用。
为什么这样设计?(安全性考量)
- 密钥雪崩效应:通过循环左移和PC-2的选择,初始密钥的微小改变(1比特)会通过迭代扩散到几乎所有的轮密钥中,使得加密结果产生巨大差异。这符合密码学的“雪崩准则”。
- 非线性和复杂性:PC-1和PC-2是固定的置换,但它们与循环左移结合,使得生成的轮密钥与原始密钥之间的关系变得复杂且非线性,难以通过部分轮密钥倒推出主密钥。
- 抵抗相关密钥攻击:不同轮次的移位规则(1位和2位交替)确保了每对
(C_i, D_i)在16轮后都经历了总共28次左移(1+1+2+...+2+1)。这意味着C_{16} D_{16}相对于C_0 D_0循环移位了28位,实际上回到了C_0 D_0的起始状态(28位循环左移28位等于不变)。这个性质保证了算法的一致性,但更重要的是,它和交替的移位规则一起,使得攻击者难以找到不同密钥之间轮密钥的简单代数关系。
总结来说,DES的密钥扩展算法是一个经典而精巧的设计。它将一个相对较短的56位密钥,通过置换、分割、循环移位和压缩选择,扩展为一组16个相互关联但又各有差异的48位轮密钥,为Feistel网络中的每一轮提供了必要的“新鲜”密钥材料,是DES整体安全架构的基石之一。