2. 对三对明文分别进行3轮DES加密得到三对密文(这里加密时要初始明文不必经过IP置换)
3. 根据明文可以得到L0’,根据密文可得到R3’和L3,然后根据得到的L0’和R3’可以得到C’,根据L3可以得到E(L3)和E(L3*)进而得到E’。(这里的E’就是S盒的差分输入,C’就是S盒的差分输出,通过这两个就可以得到第三轮加密时使用的子密钥)
其中的E’就是这里面的两个E的异或,C’就是两个通过P变换后的C的异或。
4. 将C’经过P的逆变换,得到S盒的输出S’(一个8组4位的串)。然后将C’和E’以及E通过testj方法来计算(这个变换的具体名词我现在还不知道,不过通过这个方法就可以得到J1~J8的一个矩阵分布)
a) testj中其实是对每一个S盒的输入和输出进行比较。首先遍历所有的可能的6位比特串,从000000(0)到111111(63),每次遍历都要取出两个比特串,然后判断这两个串是否在集合中。这里有两个判断条件,判断6位比特串是否在集合中。第一是这两个串异或结果是否等于E’[i](这里E’已经分为8组6位);第二个条件是这两个串分别进行S盒变换,对其结果进行异或看是否等于S’[i](这里的S’已经分为8组4位),如果等于则将这两个6位比特串放入集合中。
b) 对每个S盒都进行这样的遍历之后便可得到八个集合,暂且定义为T1~T8,每个集合中的6位比特串需要变为十进制tmpD,然后找到对应的J矩阵(8*64的矩阵),将其对应位加1。(举个例子来说比如集合T1中有{000000,000111,101000,101111},那么就需要对J[1]中的第0,7,40,47处的元素进行加1,其他的依次类推)
c) 这样每一个明文对就能得到一个J矩阵。
5.因为有三个明文对,因此循环三次之后得到三个J矩阵。对三个J矩阵对应位相加后便可得到最后的结果矩阵J_Result(8*64矩阵)。这里需要说明的是因为是经过了3轮DES加密,因此J_Result矩阵中的元素等于3的元素位置便是密钥比特。(对应的位置是十进制,需要变为6位二进制,设为J[i][6].此时便可得到第三轮加密时的密钥即第三个子密钥subkey3=J[0]J[1] J[2]J[3] J[4]J[5] J[6]J[7],这是一个48位的串)
6.因为知道第三个密钥是怎么算出来的,因此对其进行逆运算最后便可得到初始密钥,不过这里的初始密钥中并没有得到初始时去掉的8个校验位,和已经在PC-2置换中去掉的8个比特位,所以得到的初始密钥中有16位是未知的,不过会对加密结果造成影响的只有8位,即通过PC-2去掉的那8位。
7.到此也就完成了差分分析了,书上有提示说那8个未知的比特数可以通过搜索2^8=256种可能的情况来确定,这里我还不知道如何确定。
- from the5fire.com
----EOF-----
微信公众号:Python程序员杂谈
微信公众号:Python程序员杂谈