DES(数据加密标准)的密钥扩展算法详解
字数 2424 2025-12-16 06:14:32

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位)。它有两个作用:
    1. 打乱原始密钥的比特顺序,增加混淆。
    2. 将56位密钥分成两个28位的半密钥,我们称之为C0(左半部分)和D0(右半部分)。

具体操作:

  1. 忽略初始64位密钥中的8个奇偶校验位。
  2. 将剩下的56个有效比特,按照PC-1表(一个固定的、公开的置换表)的规定位置,重新排列成新的56位序列。
  3. 将这新的56位序列,从中间分成两个28位的部分:前28位是C0,后28位是D0

至此,我们有了初始的轮密钥状态:C0D0

第三步:循环左移生成 Ci 和 Di

DES共有16轮加密,每一轮需要一个48位的子密钥(轮密钥)。C0D0需要经过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_iD_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表决定)在每一轮生成轮密钥时被丢弃了。这增加了密钥的复杂性,因为原始密钥的每一位并不会在每一个轮密钥中都出现。

第五步:过程总结与可视化

让我们把整个过程串起来:

  1. 输入:64位密钥(含8位奇偶校验)。
  2. PC-1:去校验,置换,得到C0(28位)和D0(28位)。
  3. 循环迭代:对于 i = 1 到 16:
    • C_i = LS_i(C_{i-1}) (根据轮次左移1或2位)
    • D_i = LS_i(D_{i-1})
    • C_iD_i连接成56位。
    • C_i D_i应用PC-2,输出48位的轮密钥 K_i

解密过程:DES解密使用的是完全相同的结构,但轮密钥的使用顺序是相反的。即解密第一轮使用K_16,第二轮使用K_15,...,最后一轮使用K_1。密钥扩展算法本身在解密时正向运行一遍,生成K1K16,然后逆向提供给解密函数使用。

为什么这样设计?(安全性考量)

  1. 密钥雪崩效应:通过循环左移和PC-2的选择,初始密钥的微小改变(1比特)会通过迭代扩散到几乎所有的轮密钥中,使得加密结果产生巨大差异。这符合密码学的“雪崩准则”。
  2. 非线性和复杂性:PC-1和PC-2是固定的置换,但它们与循环左移结合,使得生成的轮密钥与原始密钥之间的关系变得复杂且非线性,难以通过部分轮密钥倒推出主密钥。
  3. 抵抗相关密钥攻击:不同轮次的移位规则(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整体安全架构的基石之一。

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整体安全架构的基石之一。