DES加解密算法

本文详细介绍了DES(Data Encryption Standard)算法的工作原理,包括子密钥的生成过程、加密流程及解密流程。通过实例展示了如何从用户输入的密码生成子密钥,并对64位数据块进行加密。

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

DES加解密算法(单密钥对称加解密算法)

入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。

DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。

DES (Data Encryption Standard),是IBM在上个世纪70年代开发的单密钥对称加解密算法。该算法利用一个56+8奇偶校验位(第8, 16, 24, 32, 40, 48, 56, 64位)=64位的密钥对以64位为单位的块数据进行加解密。

1、子密钥的生成过程:

用户输入密码时其长度不受限制,当用户输入的密码长度为0时,使用缺省64位密码当输入的密码长度大于8字节时,前8个字节为有效密码

我们在加密时设定的密钥先被转化成64比特的二进制;

b 然后再按照密钥置换函数PC-1(8x7)进行压缩置换,变成56位;

c 将其置换的输出再分为前28位C0和后28位D0两部分,然后再将此两部分进行16轮的循环左移及压缩置换PC-2(8X6),最后生成16个48位的子密钥。

1.1 压缩置换到56位

假设有密钥K(64位) = 133457799BBCDFF1,即

K(64位) = 00010011 00110100 01010111 01111001 

10011011 10111100 11011111 11110001 

其中加粗标注第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,不参与运算,即实际密钥为56位。

K(64位)使用PC-1(8×7)进行置换,去掉了8个校验位。

从而,由

K(64位) = 00010011 00110100 01010111 01111001

10011011 10111100 11011111 11110001

得到

K' (56位) = 1111000 0110011 0010101 0101111

 0101010 1011001 1001111 0001111

1.2 C0和D0的分类

经过PC-1置换后,将其置换的输出再分为前28位C0和后28位D0两部分,如图1所示


       C0(28位) = 1111000  0110011  0010101  0101111

       D0(28位) = 0101010  1011001  1001111  0001111

1.3 循环左移16轮

再将两部分按照表2进行16轮的循环左移。

C1和D1分别为C0和D0左移1位……C3和D3分别为C2和D2左移2位……C16和D16分别为C15和D15左移1位。 

从而得到C1D1 ~ C16D16:

C1 = 1110000 1100110 0101010 1011111

D1 = 1010101 0110011 0011110 0011110

C2 = 1100001 1001100 1010101 0111111

D2 = 0101010 1100110 0111100 0111101

C3 = 0000110 0110010 1010101 1111111

D3 = 0101011 0011001 1110001 1110101

C4 = 0011001 1001010 1010111 1111100

D4 = 0101100 1100111 1000111 1010101

……

1.4 压缩置换到48位

每进行一轮循环左移,就按照表3进行压缩置换,得到一个子密钥。即置换后的输出数据的位数要比置换前输入的位数要少,原来的8行7列共56位数据被压缩成8行6列48位数据。在压缩置换过程中,第9、18、22、25、35、38、43、54共8位数据被丢掉。

  置换过程如图2所示



Kn(48位) = PC-2( CnDn(56位) )

最终得到所有16个子钥,每个48位:

K1  = 000110 110000 001011 101111 111111 000111 000001 110010

K2  = 011110 011010 111011 011001 110110 111100 100111 100101

K3  = 010101 011111 110010 001010 010000 101100 111110 011001

K4  = 011100 101010 110111 010110 110110 110011 010100 011101

K5  = 011111 001110 110000 000111 111010 110101 001110 101000

K6  = 011000 111010 010100 111110 010100 000111 101100 101111

K7  = 111011 001000 010010 110111 111101 100001 100010 111100

K8  = 111101 111000 101000 111010 110000 010011 101111 111011

K9  = 111000 001101 101111 101011 111011 011110 011110 000001

K10 = 101100 011111 001101 000111 101110 100100 011001 001111

K11 = 001000 010101 111111 010011 110111 101101 001110 000110

K12 = 011101 010111 000111 110101 100101 000110 011111 101001

K13 = 100101 111100 010111 010001 111110 101011 101001 000001

K14 = 010111 110100 001110 110111 111100 101110 011100 111010

K15 = 101111 111001 000110 001101 001111 010011 111100 001010

K16 = 110010 110011 110110 001011 000011 100001 011111 110101

2加密

DES算法是对固定大小(64位)的数据块进行加密解密操作的,对于那些不够64位的数据块需要采用填充机制补位到64位长。设该明文串为M=m1m2…m64 (mi=0或1)。明文串经过长度都为48比特的16个子密钥K来加密,最后生成长度为64比特的密文E。

2.1 IP初始置换

假设有明文M(64位) = 0123456789ABCDEF,即

M(64位) =  0000 0001 0010 0011 0100 0101 0110 0111

   1000 1001 1010 1011 1100 1101 1110 1111

则按下表进行位置的置换

 

M运用IP置换后得

IP(64位) = 1100 1100 0000 0000 1100 1100 1111 1111

1111 0000 1010 1010 1111 0000 1010 1010

该比特串被分为32位的左半部分L0和32位的右半部分R0两部分,用于f函数的16轮迭代运算的首次迭代的初始输入。

L0 (32位) = 1100 1100 0000 0000 1100 1100 1111 1111

R0 (32位) = 1111 0000 1010 1010 1111 0000 1010 1010

2.2 加密数据

 2.2.1将数据的右半部分R0通过扩展置换E从32位扩展为48位

通过将原32位数据中的某些位重复出现达到扩展的目的。扩展置换也称位选择函数,俗称E盒。扩展置换(E)通过将第32、1、4、5、8、9、12、13、16、17、20、21、24、25、28、29共16位分别放置在两个位置,从而将32位的数据扩展为48位。

  2.2.2扩展后的48位与K1进行异或

  2.2.3异或后的结果通过S盒子转换为32位

将异或运算得到的48位结果数据分成8个6位的块,将每一块通过对应的一个S盒产生一个4位的输出。S盒接收6位的输入,经过置换输出4位的数据,其具体置换过程为:将6位输入中的第1位和第6位取出来形成一个2位的二进制数x,将其转化为十进制作为行数,然后将中间4位构成另一个二进制数y,将其转化为十进制作为列数,然后查出S的x行y列所对应的整数,将该整数置换为一个4位的二进制数,即为S盒的输出。例如,假设输入数据中的第一个6位数字块为010111,则需要通过查S1盒,先取出010111的第1位和第6位,则x=01,其对应的十进制数为1。然后取出中间的4位1011,则y=1011,其对应的十进制数为11,在S1盒中,第1行第11列的整数为11,将其转换为二进制为1011,则输出1011,即用4位的1011代替6位的010111。将8个6位数据的置换结果连在一起,形成一个32位的输出。

  2.2.4经过S盒子得到的32位再进行P盒置换

输出结果再通过一个P盒置换产生一个32位的输出,

  2.2.5 P盒置换后的结果通过异或和交换形成L1和R1

最后,P盒置换的结果与左半部分进行异或运算,然后将左右两部分交换,之后进入下一轮迭代。

  2.2.6完成16轮迭代

在完成完全相同的16轮运算后,将得到的两部分数据合在一起,将L16与R16的位置交换,再经过一个末置换函数IP-1(见表8)即可得到64位的密文。


其中除了Kn为48位,其他变量及函数均为32位,其中○号表示异或XOR运算。

2.2.1 E盒置换

由于K1为48位,而R0为32位,所以需要将R0按照表5置换成48位再进行运算。

2.2.2 E盒置换结果与K1异或运算

将扩展置换后的48位输出与K1作异或运算。

2.2.3 S盒置换

将异或运算得到的48位结果数据分成8个6位的块,将每一块通过对应的一个S盒产生一个4位的输出,S盒接收6位的输入,经过置换输出4位的数据。

其具体置换过程为:

6位输入中的第1位和第6位取出来形成一个2位的二进制数x,将其转化为十进制作为行数,然后将中间4位构成另一个二进制数y,将其转化为十进制作为列数,然后查出相应S盒的x行y列所对应的整数,将该整数置换为一个4位的二进制数,即为S盒的输出。例如,假设输入数据中的第一个6位数字块为010111,则需要通过查S1盒,先取出010111的第1位和第6位,得x=01,其对应的十进制数为1;然后取出中间的4位1011,得y=1011,其对应的十进制数为11,在S1盒中,第1行第11列的整数为11,将其转换为二进制为1011,则输出1011,即用4位的1011代替6位的010111。将8个6位数据的置换结果连在一起,形成一个32位的输出。

6 S盒


2.2.4 P盒置换

S盒的输出结果再通过一个P盒置换产生一个32位的输出。

 

2.2.5 P盒置换结果与L0异或运算 

然后再将P盒置换的结果与左半部分进行异或运算。

2.2.6 左右交换位置

然后将上一步的结果赋给R1,R0则原封不动的赋给L1,之后进入下一轮迭代。最后生成L16和R16,其中R16为L15与P盒置换结果做异或运算的结果,L16是R15的直接赋值。

2.2.7 密文的生成

经过16次的迭代,我们得到了16对32位的数据块,即

L1R1, L2R2, L3R3, …, L16R16

最后一对L16R16就是我们需要的。然后将L16与R16的位置交换,继续对R16L16(64位)运用一次IP-1(见表)排列,排列的结果即为密文。


 即在

L16(32位) = 0100 0011 0100 0010 0011 0010 0011 0100

R16(32位) = 0000 1010 0100 1100 1101 1001 1001 0101

R16L16(64位) = 00001010 01001100 11011001 10010101 01000011  01000010  00110010  00110100

时,对R16L16运用IP-1,得

IP-1(64位) = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101 = 85E813540F0AB405

3、解密

 DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。

 

附带一份网上的C实现代码:

https://github.com/yangxt225/DES


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值