当前位置:编程学习 > C#/ASP.NET >>

关于DES加密的疑问

有密钥K(64位) = 133457799BBCDFF1
,即 K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001 


对K使用PC-1(8×7) 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 

从而,由K(64位) = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001 
得到K+(56位) = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111 
进而, C0(28位) = 1111000 0110011 0010101 0101111  D0(28位) = 0101010 1011001 1001111 0001111 


 C1和D1分别为C0和D0左移1位。… C3和D3分别为C2和D2左移2位 …(如下向左偏移)

1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16   (第i次)
 1,  1,  2,  2,  2,  2,  2,  2,  1,   2,  2,   2,   2,   2,   2,  1    (左移位数)



从而得到C1D1 ~ C16D16:
C1 = 1110000110011001010101011111 D1 = 1010101011001100111100011110 
C2 = 1100001100110010101010111111 D2 = 0101010110011001111000111101 
C3 = 0000110011001010101011111111 D3 = 0101011001100111100011110101 
C4 = 0011001100101010101111111100 D4 = 0101100110011110001111010101 
… …
C15 = 1111100001100110010101010111 D15 = 1010101010110011001111000111 
C16 = 1111000011001100101010101111 D16 = 0101010101100110011110001111 


Kn(48位) = PC-2( CnDn(56位) )
PC-2(8×6) 
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
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


对明文M使用IP(8×8)
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 


由于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 


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 


从L0和R0开始,循环16次,得出L1R1到L16R16,依据递推公式:
Ln = R(n-1)  Rn = L(n-1) + f (R(n-1),Kn) 
其中除了Kn为48位,其他变量及函数均为32位。
其中+号表示异或XOR运算,函数f 从一个32位的数据块R(n-1)和一个48位子钥Kn得到一个新的32位数据块。(算法从略)

到此为止,我们得到了16对32位的数据块,即 L1R1, L2R2, L3R3, …, L16R16
最后一对L16R16就是我们需要的。

继续对R16L16(64位)运用一次重排列: IP-1(8×8) 
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
 38 6 46 14 54 22 62 30
 37 5 45 13 53 21 61 29
 36 4 44 12 52 20 60 28
 35 3 43 11 51 19 59 27
 34 2 42 10 50 18 58 26
 33 1 41 9 49 17 57 25 


即在 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
从而,经过以上步骤,最终从明文 M = 0123456789ABCDEF 得到密文 C = IP-1 = 85E813540F0AB405 
以上为加密过程,要解密,依次反向计算即可





上面是DES加密过程 但是红色部分有点看不懂  谁能帮我解答下。谢谢 --------------------编程问答-------------------- 就是L1=R0 R1=L0+F函数操作
L2=R1 R2=L1+F函数操作
以此类推 --------------------编程问答-------------------- 一直到处理到L16和R16  
http://www.softshome.com/html/ebooks/system/200808/09-499.html
这本书关于加解密讲的很详细的 我大三的时候的教科书 --------------------编程问答--------------------
引用 1 楼 steven_huangyaoshi 的回复:
就是L1=R0 R1=L0+F函数操作
L2=R1 R2=L1+F函数操作
以此类推


 f (R(n-1),Kn) 这个函数怎么算 --------------------编程问答-------------------- Fn是具体运算的函数啊,你资料里没有运算过程吗 --------------------编程问答--------------------
引用 4 楼 steven_huangyaoshi 的回复:
Fn是具体运算的函数啊,你资料里没有运算过程吗
资料就是上面那样 --------------------编程问答-------------------- 先看DES算法,再看公式,最后对照着看代码; --------------------编程问答-------------------- 学习。。。。 --------------------编程问答-------------------- 那PPT 上写算法从略。。。。。我无语 --------------------编程问答-------------------- 学习。。。。。。。。。。。 --------------------编程问答-------------------- 你把我给你那本书下下来 自己看看 绝对有的 我就是对照这个自己手写C版本DES的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,