标签:mat more 工作 def str 序号 enc ima 接下来
密码学课程上老师讲DES很清楚,然而分成了几节课来讲总是断断续续的,理解的不够全面还容易忘记,因此这篇文章特地好好学习一些DES算法,并努力争取学习完后自己写出c程序。
本文内容大多翻译自J.Orlin Grabbe的The DES Algorithm Illustrated,外加一些自己的理解
实际上密钥也是64位的,但只使用其中的56位,并不使用8, 16, 24, 32, 40, 48, 56, 64这些位
64位的key生成16个subkey,每个都是48位
使用方法:
PC-1
处理后的结果PC-1
是一个矩阵,对于每一项,值表示K的第几位,下标表示K+的第几位,比如,57表示“K的第57位成为K+的第1位”,49表示“K的第49位成为K+的第2位”注意我们忽略了8,16……64这些位,不让它们参与运算,所以K是64位,K+是56位
K+=1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
如:K+=1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111,
则
n | 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 |
C0 = 1111 0000 1100 1100 1010 1010 1111
D0 = 0101 0101 0110 0110 0111 1000 1111
C1 = 1110 0001 1001 1001 0101 0101 1111
D1 = 1010 1010 1100 1100 1111 0001 1110
C2 = 1100 0011 0011 0010 1010 1011 1111
D2 = 0101 0101 1001 1001 1110 0011 1101
C3 = 0000 1100 1100 1010 1010 1111 1111
D3 = 0101 0110 0110 0111 1000 1111 0101
C4 = 0011 0011 0010 1010 1011 1111 1100
D4 = 0101 1001 1001 1110 0011 1101 0101
C5 = 1100 1100 1010 1010 1111 1111 0000
D5 = 0110 0110 0111 1000 1111 0101 0101
C6 = 0011 0010 1010 1011 1111 1100 0011
D6 = 1001 1001 1110 0011 1101 0101 0101
C7 = 1100 1010 1010 1111 1111 0000 1100
D7 = 0110 0111 1000 1111 0101 0101 0110
C8 = 0010 1010 1011 1111 1100 0011 0011
D8 = 1001 1110 0011 1101 0101 0101 1001
C9 = 0101 0101 0111 1111 1000 0110 0110
D9 = 0011 1100 0111 1010 1010 1011 0011
C10 = 0101 0101 1111 1110 0001 1001 1001
D10 = 1111 0001 1110 1010 1010 1100 1100
C11 = 0101 0111 1111 1000 0110 0110 0101
D11 = 1100 0111 1010 1010 1011 0011 0011
C12 = 0101 1111 1110 0001 1001 1001 0101
D12 = 0001 1110 1010 1010 1100 1100 1111
C13 = 0111 1111 1000 0110 0110 0101 0101
D13 = 0111 1010 1010 1011 0011 0011 1100
C14 = 1111 1110 0001 1001 1001 0101 0101
D14 = 1110 1010 1010 1100 1100 1111 0001
C15 = 1111 1000 0110 0110 0101 0101 0111
D15 = 1010 1010 1011 0011 0011 1100 0111
C16 = 1111 0000 1100 1100 1010 1010 1111
D16 = 0101 0101 0110 0110 0111 1000 1111
CnDn
序列产生48位的KnCnDn
的第14位成为Kn的第1位,CnDn
的第32位成为Kn的第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
到这里我们终于得到了16个subkey
加密64位明文
注意这里使用加号(+)来表示异或
- 例如,n=1时
K1 = 000110 110000 001011 101111 111111 000111 000001 110010
L1 = R0 = 1111 0000 1010 1010 1111 0000 1010 1010
R1 = L0 + f(R0,K1)
注意f的两个参数,Rn是32位,Kn是48位,因此我们需要对Rn进行扩展
使用结果:32位的Rn成为48位的E(R0)
使用方法同上,R0的第32位成为E(R0)的第1位,R0的第1位成为E(R0)的第48位
此时我们得到
R0 = 1111 0000 1010 1010 1111 0000 1010 1010
E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101
注意f函数到现在还没有结束
异或之后我们得到了48位的序列,6位一组将其分成8组,记为B1,B2,B3……B8
对于每一个6位的Bi都要使用一次S-box,一共有8个box,B的下标和盒子的序号对应,即B1使用S1,B8使用S8
使用结果6位的B产生4位的S,以S1为例
使用方法:
- B的第1位和最后一位组成的二进制数字表示box的行号(0011表示03)
- B的中间4位组成的二进制数字表示box的列号(00001111表示016)
例如,B:011011
行号:01→1;列号:1101→13;查表得:5;转换成二进制:0101
因此S1(011011)=0101
具体的8个box可以查看文末的附录
注意到现在,f函数还是没有结束
![](https://img2020.cnblogs.com/blog/1380694/202003/1380694-20200322150841918-1940103685.png)
翻转序列
LnRn
成RnLn
并查表
LnRn
翻转成RnLn
,这两个序列都是64位IP^(-1)
表DES算法原理很简单,并没有什么不能理解的地方,让人望而生畏的是它那复杂的过程。需要注意的是查表的源-目标关系不要混乱。
接触了一些加密算法之后,总觉得所谓著名的加密算法就是过程怎么复杂怎么来,那些算法的发明者就是绞尽脑汁,逻辑位运算还不够,还得弄几个表来查查,等到最后自己都不知道绕了多少个弯、走到了哪一步、明文已经没人样的时候,这个伟大算法就算是成功了。无论如何致敬这些创造者吧!
标签:mat more 工作 def str 序号 enc ima 接下来
原文地址:https://www.cnblogs.com/tc43/p/des_algorithm.html