+ [基本解密流程](#_183)
+ [simple\_des](#simple_des_202)
基本加密流程
首先是将64bits的待加密数据块进行排列,形成IP盒
然后对IP进行一系列操作
将数据切割成左右两部分
Ln=Rn-1
Rn=Ln-1 ^ f(Rn-1,Kn)
然后关于Kn 子密钥的加密流程:
Kn = KS(n,KEY)
其中KS表示一个函数 n表示轮次数 KEY表示密钥 通过KEY生成16个子密钥
首先是对KEY进行排列 每8bit 删除最后一个(奇偶校验位)
根据PC-1盒(8行7列)生成相应位置的数值
举例一个密钥KEY: 0001001100110100010101110111100110011011101111001101111111110001
0 0 0 1 0 0 1 1 #8
0 0 1 1 0 1 0 0 #16
0 1 0 1 0 1 1 1 #24
0 1 1 1 1 0 0 1 #32
1 0 0 1 1 0 1 1 #40
1 0 1 1 1 1 0 0 #48
1 1 0 1 1 1 1 1 #56
1 1 1 1 0 0 0 1 #64
根据PC-1盒的数值选择对应位置 比如第一个是57 则置换之后的结果的第一位就是KEY中的第57位
result:
1 1 1 1 0 0 0
0 1 1 0 0 1 1
0 0 1 0 1 0 1
0 1 0 1 1 1 1
----------------------
0 1 0 1 0 1 0
1 0 1 1 0 0 1
1 0 0 1 1 1 1
0 0 0 1 1 1 1
前4行作为C 后四行作为D
关于C和D的迭替 依靠固定的移位表
此时
C0 = 1111000011001100101010101111
D0 = 0101010101100110011110001111
获得C1 就去按照1去查找 对应的左移位也是1
所以
C1 = 1110000110011001010101011111
D1 = 1010101011001100111100011110
比如C5就是 5对应左移2
左移举个例子:
原始:1,2,3,4,……,27,28
左移:3,4,5,6,……,28,1,2
然后根据PC-2提取Kn
这里就可以说明Kn的第一位是CnDn 组合中的第14位
故K1 = 000110110000001011101111111111000111000001110010
上面我们知道了DES子密钥的生成过程
下面就去了解DES子密钥的逆推过程
前提条件:如果已知两个或者两个以上的子密钥则可以逆推出初始密钥KEY(感觉第一个子密钥就可以捏
但是根据生成的过程我们知道KEY的长度是56bits(去除8个第8位) 但是子密钥的长度是48bits 所以存在8bits未知
每一bit有0和1两种情况 8bits则一共有2^8=256中情况 所以使用暴力破解
那么如何知道我们爆破的结果是正确的呢?就需要根据CTF题目中的部分已知明文进行判断
然后回到主体流程中 f 函数利用密钥继续加密
式子:B1B2…B8 = K + E®
输出:P(S1(B1)S2(B2)…S8(B8)
其中E函数功能:32bits的输入转化为48bits输出
其含义就是根据给出的E这个盒子 我们可以发现盒子里面的数字范围是(1-32)也正是R的比特数,同时也可以发现E的个数正好是6*8=48bits 所以就可以进行置换 比如E中前3位是 32 1 2 就代表输出的对应位置分别放置R的第32位 第1位 第2位 作为输出的前三位bit数
然后将输出的结果与我们获得的Kn密钥进行一次异或
然后48bits的数值 分为8组每组6bits 分别进入到8个不同的S盒中 然后每个S盒给出4bits的输出
S盒的处理原理:
给出一个S1盒举例
其中行编号是0-3 可以用两位二进制数字表示
列编号是0-15 用四位二进制数字表示
同时我们发现在S盒中的数据不超过15 正好4位二进制可以表示的 4位!!我们就可以联想到四位的输出
了解了上面的基础部分之后
我们有六位bits的输入 比如011011
那么我们把第一位和最后一位组合 01 转为十进制 1 就是对应行号为1的那一行
中间四位组合 1101 转为十进制就是13 就是对应列号为13的那一列
十字交叉 我们找到数字5 转为二进制0101 到此我们