DES:数据加密标准
DES算法思想:
DES算法将输入的明文分为64位的数据分组(最后一个分组不足64位则补0),使用一个56+8 (第8i位为奇偶校验位,i=1,2,…)=64位的**进行变换,每个64位明文分组数据经过初始置换、16次迭代和逆初始置换3个主要阶段,最后输出得到64位密文。
(1)初始置换
对明文64位明文段M按下表初始置换IP(8×8)
初始置换表IP:
设有明文M(64位) = 0123456789ABCDEF,即
M(64位) :
00000001 00100011
01000101 01100111
10001001 10101011
11001101 11101111
对M运用IP运算,即把明文M的第58位放在IP(M)的第一位,把明文M的第50位放在IP(M)的第二位,以此类推,故有:
IP(M) :
1100 1100 0000 0000
1100 1100 1111 1111
1111 0000 1010 1010
1111 0000 1010 1010
(由初始置换表IP很容易找到规律,从图中易得:把M的第2,4,6,8,1,3,5,7依次放在IP(M)的最后一列,依次往前,即可轻松得到IP(M))
IP(64位) = L0(32位) + R0(32位)
故
L0 (32位) = 1100 1100 0000 0000
1100 1100 1111 1111
R0 (32位) = 1111 0000 1010 1010
1111 0000 1010 1010
对64位**K按下表做初始置换Ik(K),得到56位有效位输入**。其中需去掉K中的奇偶校验位第8i位(i=1,2,…,8),剩下的56位作为有效输入**
设有**K(64位) = 133457799BBCDFF1,即
K(64位) :
00010011 00110100
01010111 01111001
10011011 10111100
11011111 11110001
其中第8i位为奇偶校验位,即实际**为56位
**初始置换表Ik:
**初始置换表Ik与初始置换表IP的关系:**初始置换表Ik是初始置换表IP除去奇偶校验位,即8i位,也就是初始置换表IP的第四行,剩下七行,按照每一行最后一位数字作为序号,(1,2,3,4)(7,6,5,4),如图很容易看出两个表的规律
初始置换得到:
Ik(K) :
1111000 0110011 0010101 0101111
0101010 1011001 1001111 0001111
所以得到:
U0(28位) = 1111000 0110011 0010101 0101111
V0(28位) = 0101010 1011001 1001111 0001111
U0和V0分别是**置换后的高(左)28位和低(右)28位
(2)移位
将置换后的56位有效**的左28位U0和右28位V0分别进行16轮循环移位,移位得到Ui和Vi(i=1,2……,16),每轮移位得到的新56位**作为下一轮移位的有效**,每轮移位的次数按下表:
说明:U0、V0各左移1位分别得到U1、V1,U1、V1各左移1位分别得到U2、V2,U2、V2各左移2位分别得到U3、V3,……, U15、V15各左移1位分别得到U16、V16
从而得到U1V1 ,U2V2,…, U16V16:
U1 = 1110000110011001010101011111
V1 = 1010101011001100111100011110
U2 = 1100001100110010101010111111
V2 = 0101010110011001111000111101
U3 = 0000110011001010101011111111
V3 = 0101011001100111100011110101
U4 = 0011001100101010101111111100
V4 = 0101100110011110001111010101
…
U15 = 1111100001100110010101010111
V15 = 1010101010110011001111000111
U16 = 1111000011001100101010101111
V16 = 0101010101100110011110001111
(3)把16个56位子**置换压缩为48位
按下表将以上得到的16个56位子**置换压缩为48位,压缩后每个子钥的第9、18、22、25、35、38、43、54共8位数据会丢失,Ki(48位) = PC-2( UiVi(56位) )
子钥置换表PC-2(8×6): (不知道这个表有什么规律,如果没有的话我觉得把16个56位子**置换压缩为48位的过程将会十分繁琐且费时费力)
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
结果得到所有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
…
K15 = 101111 111001 000110 001101 001111 010011 111100 001010
K16 =110010 110011 110110 001011 000011 100001 011111 110101
(4)扩展置换:将明文初始置换后得到的右边32位R0按下表扩展置换为48位R01
(上边过程(1)得到的,IP(64位) = L0(32位) + R0(32位)
故:
L0 (32位) = 1100 1100 0000 0000
1100 1100 1111 1111
R0 (32位) = 1111 0000 1010 1010
1111 0000 1010 1010)
扩展置换表:
置换规则:把旧组的最后一位放到下一组的第一位,把旧组的第一位放到上一组的最后一位
(5)S盒压缩:
用以上扩展得到的48位R01与48位子**K1做“异或”运算,得到48位的加密数据R02
将以上得到48位加密数据R02进行S盒压缩替换运算,替换压缩成一个新的32位数据R03
S盒压缩过程:将48位的加密数据R02分成8个6位的数,取6位数的最高位和和最低位组合成一个2位数,将该数转换为十进制,用其值来表示加密数所在的行号;取6位数的中间4位组成的一组新的二进制数,将其转换为十进制,表示加密数所在的列号;按行列在S盒中找到对应的数即为压缩后的4位数。例如:101010,取高位1和低位0组合成10,表示第2行,中间4位0101表示第5行,若用S1盒压缩,则在S1盒中相对应的数为6,即0110。即101010用S1盒压缩后变为0110。
每个6位数用1个S盒压缩成4位,最终形成8个4位的数据,即32位数R03。
(6)P置换表
将以上用S盒压缩得到的32位数R03按下表置换得到32位数R04,R04其实就是F函数的操作结果。
P置换表:
将以上置换得到的32位数R04与明文初始置换得到的L0做“异或”运算,其结果作为R1;并使L1=R0。得到L1R1 ,至此第1轮加密变换完成
将得到的L1R1用对L0R0加密的方法再加密得到L2R2,如此循环操作共16次,最后得到L16R16
(7)逆初始置换
将L16R16合并成64位按以下逆初始置换表进行重排列,置换后的数据即为最终密文
逆初始置换表:
R16L16 :
00001010 01001100
11011001 10010101
01000011 01000010
00110010 00110100
再对R16L16运用IP-1:
IP-1(R16L16) :
10000101 11101000
00010011 01010100
00001111 00001010
10110100 00000101
转换为十六进制即 85E813540F0AB405(密文)
从明文M:
M = 0123456789ABCDEF,
在**K的作用下:
K = 133457799BBCDFF1
经过以上步骤,最终得到密文:
C = 85E813540F0AB405