DES,笔记

DES
参考彭长根所著《现代密码学趣味之旅》与朱小姐的博客(链接)以及百度百科
希望指出错误或解答问题。
一、置换密码
以凯撒密码为例
** 前进三步
明文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
如果你传达的信息为ATTACK 加密后就是DWWDFN
进一步 如果我们**改为LOVE 那么会得到这样的对应关系:
明文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文 L O V E A B C D F G H I J K M N P Q R S T U W X Y Z
如果你传达的信息为ILOVEYOU 加密后就是FINUAYNT
再次改进将原文按字母分组,每组四个字母,最后一组不足四个补上空格;然后内部按照(2 4 1 3)的置换规则换位相应的字母;最后将各个分组合成密文。解密时再用该置换规则就行了。
以I have had my best love before , but I didn’t treasure her为例 分组后得IHAV EHAD MYBE STLO VEBE FORE BUTI DIDN OTTR EASU REHE R
将每一小组按照(2 4 1 3)顺序摆放,就是将原来第二位放到第一位,第四位放到第二位,第一位放到第三位,第三位放到了第四位。先将偶数位排好再排奇数位。
以第一组为例IHAV 排完后是HVIA 每组都是如此之后再组合得
HVIA HDEA YEMB TOSL VBEE OEFR UIBT INDD TROT AUES EERH R
分组的思想借鉴了类似维吉尼亚密码的思想 下面是维吉尼亚密码的介绍

DES,笔记

继续以I have had my best love before but I didn’t treasure her为例 **为LOVE,则要将密文按照**长度来分组,再对照维吉尼亚密码本,明文字母作为行,**字母作为列。
IHAV EHAD MYBE STLO VEBE FORE BUTI DIDN OTTR EASU REHE R
最后密文得:TVVZ PVVH XMWI DHGS GSWI QCGI NIWM OWMR ZHOV PONY CSCI C
(明白规则之后,你就会发现同一组的相同位置都在同一行找因为**相同,那么不妨先将同一位置不同组的字母找到,你可以每一组写一行,将后面位置填在后面。
L行:IEMSVFBDOERR-TPXDGQNOZPCC
O行:HHYTEOUITAE-VVMHSCIWHOS
V行:AABLBRTDTSH-VVWGWMOYONC
E行:VDEOEEINRUE-ZHISIIMRVYI)
现代对称密码体制核心是扩散(明文与密文之间的统计关系尽可能复杂)和混淆(使密文与**之间的统计关系变得尽可能复杂)
二、分组密码
恩尼格玛密码机
???
Feistel法
DES,笔记
明文(2w位)-前w位成为L0(left) 后w位成为R0(right)-进行n轮迭代-迭代完成后左右两部分合并。注意此时Ln成为后w位 即右边 Rn成为前w位 即左边。如图
迭代的方法放到DES中 可以先看图。
DES
1、 明文M分组方法
每组8个字节 如果不是八个字节(共64位二进制数)需要填充成8的整数倍 如M=“happy every day thank you very much” 算上标点和空格,需要被分为5组,最后一组的“much”只有四个字节,所以用0补齐后四个字节,然后对每组采用相同的算法和**来加密。注:所有转二进制需要参考ASCII表(链接)
拿第一组举例P=“happy ev”转换成十进制是“104 97 112 112 121 32 101 118”,二进制是“01101000 01100001 01110000 01110000 01111001 00100000 01100101 01110110” 十六进制是“68 61 70 70 79 20 65 76”。**“BobAlice”的十进制是“66 111 98 65 108 105 99 101”二进制为“01000010 01101111 01100010 01000001 01101100 01101001 01100011 01100101”,即初始**,对应十六进制为“42 6f 62 41 6c 69 63 65”
2、 初始置换IP及逆置换IP-1
IP置换是将64位按位重排,就和(2,4,1,3)类似,先将这64位每8位一排,前32位为L0 后32位为R0(下列数字位置)

此为L0
01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
此为R0
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

将位置01放到40 位置,02放到08,位置03放到48,位置04放到16,位置05放到56,位置06放到24,位置07放到64,位置08放到32,位置09放到39,位置10放到07,位置11放到47……位置63放到57,位置64放到25。其实很明显地看出L0皆是偶数 R0皆是奇数,且从左到右从上到下依次递增,合并得到下面的IP置换表
IP置换表
58 50 42 34 26 18 10 02
60 52 44 36 28 20 12 04
62 54 46 38 30 22 14 06
64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01
59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05
63 55 47 39 31 23 15 07
而逆置换IP-1就是与置换操作相反,将位置40放到01,位置08放到02,位置48放到03,位置16放到04……得到下面这个逆置换IP-1表
40 08 48 16 56 24 64 32
39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30
37 05 45 13 53 21 61 29
36 04 44 12 52 20 60 28
35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26
33 01 41 09 49 17 57 25
你会发现第一行都是8的整数倍,而下面的数都是依次递减而偶数列是R0中的,奇数列都是L0中的,都是从左到右依次增大。
3、 函数F(·,·)的细节
32位的Ri-1-E置换变成48位-再与Ki进行异或运算-通过8个S盒压缩成32位-进行P置换
(1) 扩展置换E
分组P经IP置换分为两半L0=“11011111 10011100 11000000 01010010” R0=“00000000 11111111 00010001 10000000”,十六进制为“df9cc052”与“00ff1180”
将R0分4位为一组“0000 0000 1111 1111 0001 0001 1000 0000”,从32位变为48位,需要每组扩展俩位,左右各扩展一个,分别对应上一组最后一位和下一组第一位,扩展后第一组第一位是原最后一组的最后一位,最后一组的最后一位是原第一组第一位,事实上就是将每组算上本属于这组前后两位。

扩展置换E
32 01 02 03 04 05
04 05 06 07 08 09
08 09 10 11 12 13
12 13 14 15 16 17
16 17 18 19 20 21
20 21 22 23 24 25
24 25 26 27 28 29
28 29 30 31 32 01
DES,笔记

将R0进行扩展得E(R0)=“000000 000001 011111 111110 100010 100011 110000 000000”
(2) 异或运算
二进制中对应位上同为0,异为1
(3) S盒变换
又叫压缩替换,DES中唯一的非线性结构,DES用8个结构相似的S盒,每个S盒将6位转化为4bits。将E(R0)与Ki异或后的结果每6位为一组,分别作为S1盒、S2盒、S3盒、…、S8盒输入。取每组第一位和最后一位组成二进制,转换为十进制作为行号,中间4位转换成十进制作为列号,查表得数,再转换成二进制。

DES,笔记

(4) 置换P
将原来的位置16换到01位,位置07换到02,……。(?不知是怎么换的顺序)P的结果就是F(Ri-1,Ki)的输出。
P盒置换
16 07 20 21
29 12 28 17
01 15 23 26
05 18 31 10
02 08 24 14
32 27 03 09
19 13 30 06
22 11 04 25
4、 轮**
轮**Ki是由用户初始**经过变换产生的子**,在DES算法中初始**是64位,但其中第8、16、24、…、64位上的8比特用作校验位,所以初始**实际长度是56位。
子**的生成包含置换PC-1、循环左移和置换PC-2。首先经过PC-1将64位的初始**变换成56位,在经过16轮的循环移位和PC-2置换处理得到16个48位的轮**K1,K2,…,K16。
(1) 置换选择PC-1
置换PC-1就是处理不在8的整数位倍位置上的56位。按照如下重排
57 49 41 33 25 17 09
01 58 50 42 34 26 18
10 02 59 51 43 35 27
19 11 03 60 52 44 36
63 55 47 39 31 23 15
07 62 54 46 38 30 22
14 06 61 53 45 37 29
21 13 05 28 20 12 04
除去明文M中的每组的第八位,得
01 02 03 04 05 06 07
09 10 11 12 13 14 15
17 18 19 20 21 22 23
25 26 27 28 29 30 31
33 34 35 36 37 38 39
41 42 43 44 45 46 47
49 50 51 52 53 54 55
57 58 59 60 61 62 63
前28位由上面从左到右从下到上依次填充,后28位从右到左从下到上依次填充。
初始**”01000010 01101111 01100010 01000001 01101100 01101001 01100011 01100101”处理成56位”0100001 0110111 0110001 0100000 0110110 0110100 0110001 0110010”,经过PC-1置换后分为前后两大组C0D0各28位,”00000000 11111111 11110110 0000 01000111 10010010 00110010 0000”,十六进制是”00fff60792320”.
C0=00000000 11111111 11110110 0000
D0=01000111 10010010 00110010 0000
(2) 循环左移操作
所谓循环左移,就是将首位序列连在一起看作一个环,在做移动。对abcdef左移两个字符的话,就是左边去掉两个接到右边。结果是cdefab。
在子**生成的循环左移阶段,左移的位数取决于迭代轮数,在1、2、9、16轮中,左移1位,其余左移2位。
DES,笔记
C1=00000011 11111111 11011000 0000
D1=00011110 01001000 11001000 0001
以此作为PC-2的输入,同时作为第二轮迭代的输入,开始下一轮移位和变换。
(3) 置换PC-2
压缩置换,将56位压缩到48位,作为第i轮**Ki
PC-2(?暂时没有看出来怎么置换的,但是删去了09、18、22、5、35、38、43、54)
14 17 11 24 01 05
03 28 15 06 21 10
23 19 12 04 26 08
16 07 27 20 13 02
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
将C1,D1组成56位,经过PC-2变换后变为48位,“11100000 10110110 01100010 00001000 00100010 10111110”,对应的十六进制是,“e0b6620822be”,也就是说得到第一个**K1=“e0b6620822be”
回到之前F(R0,K1),K1=“111000 001011 011001 100010 000010 000010 001010 111110”,E(R0)=“000000 000001 011111 111110 100010 100011 110000 000000”,进行异或运算,E(R0)⊕K1=“111000 001010 000110 011100 100000 100001 111010 111110”,进行S盒计算得“3 11 14 4 4 4 5 8”,转换成二进制是“0011 1011 1110 0100 0100 0100 0101 1000”,在经过P盒置换,得到“01001010 00011101 01010011 00001110”,即F(R0,K0)
DES,笔记DES,笔记
个人觉得根据整数顺序填在相对位置上比按照P置换在S盒输出结果中找简单。
再往下,Li=Ri-1,Ri=Li-1⊕F(Ri-1,ki),L0=“11011111 10011100 11000000 01010010” R0=“00000000 11111111 00010001 10000000”,故R1=L0⊕F(R0,K1)=“10010101 10000001 10010011 01011100”,L1=R0=“00000000 11111111 00010001 10000000”,十六进制表示,(L1,R1)=“00ff118000ff1180”
“注意:每一个S-盒的输入数据是6位,输出数据是4位,
但是每个S-盒自身是64位!!”中每一个S-盒自身不是64位,而是644位
??如果是64
4位,是不是代表着S盒是16进制呢,但事实上是十进制呀。
3DES
说明:E表示加密,D表示解密,其后数字表示**的个数,**都是56位,但是不知道这个**是否是轮**
EEE3模式
加密C=EK1(EK2(EK3(P)))解密P=DK3(DK2(DK1(C)))
EDE3模式
加密C=EK1(DK2(EK3(P)))解密P=DK3(EK2(DK1(C)))
EEE2模式
加密C=EK1(EK2(EK1(P)))解密P=DK1(DK2(DK1(C)))
EDE2模式
加密C=EK1(DK2(EK1(P)))解密P=DK1(EK2(DK1(C)))