DES加密算法

密钥获取

首先DES加密算法为一个典型的对称加密算法,加密与解密使用相同的密钥,密钥长为64比特,其中包含八位校验位(8、16、24、32、40、48、56、64)

每四位二进制数构成一个十六进制的数,即密钥为十六位的十六进制数

K = 133457799BBCDFF1
K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001  
//转换为二进制

首先将二进制密钥形式的K按照图标进行变换

变换的方式:按照下表的顺序依次替换,例如第一位为57,即把K密钥中的第57位放入新密钥的第一位中,依次替换,得到一个56位的新密钥

 

K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111

将新的密钥拆分为两个部分,每个部分都含有28位

C0 = 1111000 0110011 0010101 0101111 
D0 = 0101010 1011001 1001111 0001111

对于得到的C0、D0进行依次的左移,左移的轮数如下表所示

轮数 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

创建16个块的Cn和Dn

C1 = 1110000110011001010101011111    D1 = 1010101011001100111100011110
C2 = 1100001100110010101010111111    D2 = 0101010110011001111000111101
C3 = 0000110011001010101011111111    D3 = 0101011001100111100011110101
C4 = 0011001100101010101111111100    D4 = 0101100110011110001111010101
C5 = 1100110010101010111111110000    D5 = 0110011001111000111101010101
C6 = 0011001010101011111111000011    D6 = 1001100111100011110101010101
C7 = 1100101010101111111100001100    D7 = 0110011110001111010101010110
C8 = 0010101010111111110000110011    D8 = 1001111000111101010101011001  
C9 = 0101010101111111100001100110    D9 = 0011110001111010101010110011
C10 = 0101010111111110000110011001   D10 = 1111000111101010101011001100
C11 = 0101011111111000011001100101   D11 = 1100011110101010101100110011
C12 = 0101111111100001100110010101   D12 = 0001111010101010110011001111
C13 = 0111111110000110011001010101   D13 = 0111101010101011001100111100
C14 = 1111111000011001100101010101   D14 = 1110101010101100110011110001
C15 = 1111100001100110010101010111   D15 = 1010101010110011001111000111
C16 = 1111000011001100101010101111   D16 = 0101010101100110011110001111  

将得到的新的32个28位的新密钥组,两两组合对应得到16个新的58位的密钥

将新的密钥按照如下的表单进行变换

这样我就得到了最终的16个子密钥

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

明文初始置换

接下来处理DES算法中的明文部分

M = 123456789abcdef

将得到的64位明文,分成左右两个部分L、R

M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
L = 0000 0001 0010 0011 0100 0101 0110 0111
R = 1000 1001 1010 1011 1100 1101 1110 1111

同样按照下表进行位置替换,得到新的左右明文

L0 = 1100 1100 0000 0000 1100 1100 1111 1111 
R0 = 1111 0000 1010 1010 1111 0000 1010 1010

加密迭代过程

定义f函数

接着进入加密过程,定义1<=n<=16,‘+’定义为异或

f(a,b)定义为一个进行异或运算的函数,将两数进行异或运算,a、b分别为32位的明文右侧与48位的密钥,输出为32位的区块

Ln=Rn-1   //将前一个密钥的右边部分作为当前密钥的左边部分
Rn=Ln-1+f(Rn-1,Kn)   //定义当前密钥的右边部分

K1 = 000110 110000 001011 101111 111111 000111 000001 110010 
L1 = R0 = 1111 0000 1010 1010 1111 0000 1010 1010 
R1 = L0 + f(R0,K1)

定义E函数

解决f()函数的工作,首先要解决定义一个E函数,将32位的Rn-1进行扩展得到48位,与K进行异或

按照下表顺序,将32位数排列为6*8的表格,得到48位新的Rn-1

R0 = 1111 0000 1010 1010 1111 0000 1010 1010 
E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101

接着执行f()异或函数,将输出的E(R0)与K1进行异或运算 f(R0,K1)为异或运算

K1 = 000110 110000 001011 101111 111111 000111 000001 110010 
E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101 
f(R0,K1) = 011000 010001 011110 111010 100001 100110 010100 100111

这样我们得到了一组48位的结果,即8组6比特的数据,想要得到一组32位的最终数据,就要执行下面的操作

S盒替代

每组的6比特数据都有一个位于不同S盒中的地址,在此地址中存放着一个4比特的数据,这样8组6比特的数据就变成了8组4比特的数据,将上一步得到的48位的数据转换为如下的数据

f(R0,K1)=B1B2B3B4B5B6B7B8

每一个Bi就是一个6比特的分组,现在与S盒进行运算

S1(B1)S2(B2)S3(B3)S4(B4)S5(B5)S6(B6)S7(B7)S8(B8)

Si(Bi)表示输入6位数,得到一个S盒中对应的地址

举一个例子,B1=011000,第一位与最后一位觉得行号为00,换算为十进制为0,中间位数决定列号1100,换算为十进制为12,确定好行号与列号(0,12),就可以根据Si的表格确定具体的数字,再换算为四位的二进制数

对应表格就是5,转换为二进制就是0101

根据上述的表格,依次计算8个S盒得到

0101 1100 1000 0010 1011 0101 1001 0111

最后一步就是将我们得到的32位数据再次进行变换

0010 0011 0100 1010 1010 1001 1011 1011

到此f函数的作用已经完成,接着继续计算

R1=L0+f(R0,K1)

= 1100 1100 0000 0000 1100 1100 1111 1111  //L0
+ 0010 0011 0100 1010 1010 1001 1011 1011  
= 1110 1111 0100 1010 0110 0101 0100 0100  //R1

就这样依次进行迭代计算得到左右的32位的两个区块L16R16,接着逆转左右两个区块,得到R16L16,对其进行最后一次的变换

假设得到了最终转换后的L16以及R16

L16 = 0100 0011 0100 0010 0011 0010 0011 0100 
R16 = 0000 1010 0100 1100 1101 1001 1001 0101

合并为R16L16

R16L16 = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100

对照上表进行逆初始置换IP-1得到

10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101

进行转换为16进制

45e813540f0ab405

加密过程总结为:

1.将64位的密钥进行第一次变换,去掉八位校验位,得到56位的密钥,分为两部分,各部分为28的密钥,称为Ci盒Di