数据加密标准DES详细过程总结、代码(自运行可实现)

本文详细介绍了DES加密标准的实现过程,包括Feistel结构、密钥编排、迭代、IP置换和S盒设计等关键步骤。讨论了DES的弱点如弱密钥和半弱密钥,以及多重DES提高安全性的方法。文章还涵盖了S盒设计的重要性,强调其在提供非线性安全性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、公开征集密码算法标准的主要要求

  • 算法必须是安全的:具有加密保护信息安全的能力
  • 算法必须是公开的:有完整的算法说明、容易理解、能为所有用户使用
  • 能够经济、有效的硬件实现:性能好
  • 能够得到批准:合法
  • 可出口:大众化

2、DES概述

  • 分组加密算法:明文和密文为64位分组长度
  • 对称算法:加密和解密除密钥编排不同之外,使用的是同一算法
  • 密钥长度:56位,但存在弱密钥,容易避开
  • 混乱(S盒)和扩散(P盒)组合,每个组合先代换后置换,共16轮
  • 只使用标准的算数和逻辑运算,易于实现
  • 商业密码、现代密码学的标志。

3、DES的实现

(1)、DES算法的整体结构----Feistel结构

在这里插入图片描述
*细节流程图
在这里插入图片描述

  • Feistel提出利用乘积密码可获得简单的代换密码
  • Feistel还提出了实现代换和置换的方法
  • 很多分组密码的结构从本质上说都是基于一个称
    为Feistel网络的结构
(2)、第一步:密钥的编排 (为加密做准备)
  1. 密钥生成:
  • 从用户处取得一个64位(本文均指二进制位))长的密码口令key ,key=k1k2k3…k63k64。
  • 去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥。
  1. 等分密钥:

  2. 输入密钥位序/ A位序对照表
    在这里插入图片描述
    输入密钥位序/ B位序对照表
    在这里插入图片描述
    这样 key=k1k2k3…k55k56 形成了A、B两部分:
    A = k57k49k41…k44k36
    B=k65k55k47…k12k4

  3. 密钥移位
    DES算法的密钥是经过16次迭代(循环左移)得到一组密钥的
    在这里插入图片描述
    Ps:生成的A、B视为迭代的起始密钥,上表显示每一次迭代时密钥循环左移的位数。 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位…第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位。

  4. 迭代并乘积合并得到密钥C

  • 第一次迭代:
    A(1) =(1) A

  • 第i次迭代:
    A(i) =(i) A(i-1)
    B(i) =(i) B(i-1)

  • 第i次迭代生成的两个28位长的密钥并乘积得到56位密钥C(i)=A(i)B(i)=A(i)1…A(i)28B(i)1…B(i)28

  1. 对密钥C进行加密,故产生加密密钥K
  • 56位密钥C的位序与加密密钥K的位序对照表
    在这里插入图片描述
    Ps:k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,依此类推,k的最后一位第48位是56位密钥的第32位。 这样,就生成了一个48位使用密钥:K=k(i)1k(i)2…k(i)48
  1. DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行上述第4步和第5步,最终形成16套加密密钥:key[0],key[1],key[2],…。key[14],key[15]。即以下第二步
(3)、第二步:16轮迭代

按下述规则进行16次迭代:在这里插入图片描述
Ps1:这里的 “+” 是对应比特的模加2,f 是一个函数(轮函数)。
Ps2:16个长度为48比特的子密钥ki(1≤i≤16)是由密钥k经密钥编排函数计算出来的。

在这里插入图片描述Ps3:第16轮迭代左右数值不做交换

(4)、第三步:IP置换(加密)

给定明文,通过一个固定的初始置换IP来重排输入明文块P中的比特,得到比特串P0=IP(P)=L0R0,这 里L0和R0分别是P0的前32比特和后32比特
Ps:利用乘积密码可获得简单的代换密码
在这里插入图片描述

(5)、第四步:IP逆置(解密)

对比特串R16L16使用逆置换IP-1得到密文C,即
C=IP-1 (R16L16)。

在这里插入图片描述

***以上为含图简介,为了更好理解这个过程,避免看很多头疼的流程图,我们用文字叙述的方式来简述加密解密的详细过程,即以上(4)、(5)为数据加密解密的简介,以下为具体过程:

1.总体过程
DES对64位明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。
然后进行16轮完全相同的运算,这些运算被称为函数 f,在运算过程中数据与密钥结合。经过16轮
后,左、右半部分合在一起经过一个末置换(初始置换的逆置换),算法就完成了。
在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分
扩展成48位,并通过一个异或操作与48位密钥结合,通过 8个S盒将这48位替代成新的32位数据,再
将其置换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,
其结果即成 为新的左半部分。将该操作重复16次,便实现了DES的16轮运算。
假设Bi是第i次迭代的结果,Li和Ri是Bi的左半部分和右半部分,Ki是第i轮的48位密钥,且f是实现
代替、置换及密钥异或等运算的函数,那么每一轮就是:
 Li=Ri-1
 Ri=Li-1⊕f(Ri-1,Ki)

2、初始置换
初始置换在第一轮运算之前进行,对输入分组实施如下表所示的变换。初始置换把明文的第58位换到第1位的位置,把第50位换到第2位的位置,把第42位换到第3位的位置,以此类推。
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7

初始置换和对应的末置换并不影响DES的安全性,它们的主要目的是为了更容易地将明文和密文数据以字节大小放入DES芯片中。

3、密钥置换
由于不考虑每个字节的第8位,DES的密钥由64位减至56位,每个字节第8位作为奇偶校验以确保密钥不发生错误。如下表所示:
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4

在DES的每一轮中,从56位密钥产生出不同的48位子密钥(subkey),这些子密钥是这样确定的:
首先,56位密钥被分成两部分,每部分28位。
然后,根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
轮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1

移动后,就从56位中选出48位。这个运算既置换了每位的顺序,也选择了子密钥,被称为压缩置换(compression permutation)。下表即定义了压缩置换:
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32

可以看出,第33位的那一位在输出时移到了第35位,而处于第18位的那一位被忽略了。

4、扩展置换 (轮函数f的一部分)
这个运算将数据的右半部分从32位扩展到48位。这个操作两方面的目的:它产生了与密钥同长度的数据以进行异或运算;它提供了更长的结果,使得在替代运算中能进行压缩。
对每个4位输入分组,第1位和第4位分别表示输出分组中的两位,而第2位和第3位分别表示输出分组中的一位,下表给出了哪一输出位对应哪一输入位:
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
处于输入分组中第3位的位置移到了输出分组中的第4位,而输入分组的第21位则移到了输出分组的第30位和第32位。尽管输出分组大于输入分组,但每一个输入分组产生唯一的输出分组。

5、S盒代替 (轮函数f的一部分)
压 缩后的密钥与扩展分组异或以后,将48位的结果送入,进行代替运算。替代由8个S盒完成,每一个S盒都由6位输入,4位输出,且这8个S盒是不同的。48 位的输入被分为8个6位的分组,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值