1、具体样例分析:(仅以一组64位数据为例分析加密过程)明文M是:8787878787878787密钥K是:0E329232EA6D0D73上面的信息都是16进制的,转换为2进制明文M是:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111密钥K是:00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
2、根据密钥生成16个子密钥1.根据密钥初始置换表将64位的密钥转化为58位的密钥57 49 41 33 25 17 91 58 50 42 34 26 1810 2 59 51 43 35 2719 11 3 60 52 44 3663 55 47 39 31 23 157 62 54 46 38 30 2214 6 61 53 45 37 2921 13 5 28 20 12 4由于上表中第一个元素为57,这将使原秘钥的第57位变换为新秘钥K+的第1位。同理,原秘钥的第49位变换为新秘钥的第2位……原秘钥的第4位变换为新秘钥的最后一位。注意原秘钥中只有56位会进入新秘钥,上表也只有56个元素。原密钥K:00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001新密钥K:1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
3、将新密钥拆分成C0和D0,每组都有28位比如新密钥C0:1111000 0110011 0010101 0101111D0:0101010 1011001 1001111 0001111
4、根据密钥轮次左移表,左移特定的位数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 161 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1比如第一轮是左移1位,第二轮也是左移1位,第三轮是左移两位所以C1:1110000110011001010101011111D1:1010101011001100111100011110下面给出C1,D1到C16,D16的数据:C1 = 1110000110011001010101011111D1 = 1010101011001100111100011110C2 = 1100001100110010101010111111D2 = 0101010110011001111000111101C3 = 0000110011001010101011111111D3 = 0101011001100111100011110101C4 = 0011001100101010101111111100D4 = 0101100110011110001111010101C5 = 1100110010101010111111110000D5 = 0110011001111000111101010101C6 = 0011001010101011111111000011D6 = 1001100111100011110101010101C7 = 1100101010101111111100001100D7 = 0110011110001111010101010110C8 = 0010101010111111110000110011D8 = 1001111000111101010101011001C9 = 0101010101111111100001100110D9 = 0011110001111010101010110011C10 = 0101010111111110000110011001D10 = 1111000111101010101011001100C11 = 0101011111111000011001100101D11 = 1100011110101010101100110011C12 = 0101111111100001100110010101D12 = 0001111010101010110011001111C13 = 0111111110000110011001010101D13 = 0111101010101011001100111100C14 = 1111111000011001100101010101D14 = 1110101010101100110011110001C15 = 1111100001100110010101010111D15 = 1010101010110011001111000111C16 = 1111000011001100101010101111D16 = 0101010101100110011110001111需要记住的是:每一对Cn和Dn都是由前一对Cn-1和Dn-1移位而来!
5、得到Cn,Dn后合并CnDn,然后根据密钥压缩置换表将56位密钥压缩成48位的子密钥密钥压缩置换表:14 17 11 24 1 53 28 15 6 21 1023 19 12 4 26 816 7 27 20 13 241 52 31 37 47 5530 40 51 45 33 4844 49 39 56 34 5346 42 50 36 29 32每对子秘钥有56位,但PC-2仅仅使用其中的48位。于是,第n轮的新秘钥Kn的第1位来自组合子秘钥CnDn的第14位,第2位来自第17位,依次类推,知道新秘钥的第48位来自组合秘钥的第32位
6、下面给出子密钥K1到K1瀵鸦铙邮6的数据:K1 = 000110 110000 001011 101111 111111 000111 000001 110010K2 = 011110 011010 111011 011001 110110 111100 100111 100101K3 = 010101 011111 110010 001010 010000 101100 111110 011001K4 = 011100 101010 110111 010110 110110 110011 010100 011101K5 = 011111 001110 110000 000111 111010 110101 001110 101000K6 = 011000 111010 010100 111110 010100 000111 101100 101111K7 = 111011 001000 010010 110111 111101 100001 100010 111100K8 = 111101 111000 101000 111010 110000 010011 101111 111011K9 = 111000 001101 101111 101011 111011 011110 011110 000001K10 = 101100 011111 001101 000111 101110 100100 011001 001111K11 = 001000 010101 111111 010011 110111 101101 001110 000110K12 = 011101 010111 000111 110101 100101 000110 011111 101001K13 = 100101 111100 010111 010001 111110 101011 101001 000001K14 = 010111 110100 001110 110111 111100 101110 011100 111010K15 = 101111 111001 000110 001101 001111 010011 111100 001010K16 = 110010 110011 110110 001011 000011 100001 011111 110101到这里,16个48位的子密钥就生成了
7、加密数据块明文初始变换,仍然是64位变为64位58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 7参照上表,M的第58位成为IP的第1位,M的第50位成为IP的第2位,M的第7位成为IP的最后一位。对明文M:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111IP:1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010这里M的第58位是1,变成了IP的第1位。M的第50位是1,变成了IP的第2位。M的第7位是0,变成了IP的最后一位。
8、数据分组:IP分为左半边的L0和右半边的R0对上面的IPL0:1100 1100 0000 0000 1100 1100 1111 1111R0:1111 0000 1010 1010 1111 0000 1010 1010
9、16轮迭代然后我们定义一个函数f,输入一个32位的数据和一个48位的子密钥,产生一个32位的输出从n=1到n=16Ln=Rn-1Rn=Ln-1^f(Rn-1,Kn)通俗的说就是当前迭代的L是上一次迭代的L,当前迭代的R是上一次迭代的L异或f(上次迭代的R,当前子密钥)
10、下面就是要了解f函数是怎献垴淄睬么工作的了f函数第一步:32位的数据扩展成为48位明文扩展表:32 1 2 3 4 54 5 6 7 8 98 9 10 11 12 1312 13 14 15 16 1716 17 18 19 20 2120 21 22 23 24 2524 25 26 27 28 2928 29 30 31 32 1对R0:1111 0000 1010 1010 1111 0000 1010 1010扩展一下:E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101f函数第二步:将扩展的结果和48位的子密钥进行异或运算比如,对K1, E(R0),我们有:K1 = 000110 110000 001011 101111 111111 000111 000001 110010E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101K1^E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111.f函数第三步:S盒替代,48位变成32位一共有8个S盒,分别位S1到S8,所以48位的数据可以分为8组,每组6个数据,用a1a2a3a4a5a6表示每组数据对应一个S盒a1和a6组合成2进制,然后转换为10进制,代表对应S盒的行号a2,a3,a4,a5组合成2进制,然后转换为10进制,代表对应S盒的列号从行号和列号可以从对应的S盒中确定一个数X,X是十进制的,转化为4位的二进制输出所以每个S盒都是输入6位,输出4位,所以最后输出的数据是4*8=32位
11、关于解密:解密只要将密文看作明文,然后子密钥逆序使用就可以还原成为明文,因为DES是对称加密算法