一文打通DES算法以及在ctf中的运用!【附2024NepCTF simpleDES巨细题解~】_ctf des(2)

+ [基本解密流程](#_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个子密钥

image-20230818181249244

首先是对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位

image-20230818181223524

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

image-20230818211739419

关于C和D的迭替 依靠固定的移位表

image-20230818181404405

此时

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

image-20230818181513587

这里就可以说明Kn的第一位是CnDn 组合中的第14位

故K1 = 000110110000001011101111111111000111000001110010


上面我们知道了DES子密钥的生成过程

下面就去了解DES子密钥的逆推过程

前提条件:如果已知两个或者两个以上的子密钥则可以逆推出初始密钥KEY(感觉第一个子密钥就可以捏

但是根据生成的过程我们知道KEY的长度是56bits(去除8个第8位) 但是子密钥的长度是48bits 所以存在8bits未知

每一bit有0和1两种情况 8bits则一共有2^8=256中情况 所以使用暴力破解

那么如何知道我们爆破的结果是正确的呢?就需要根据CTF题目中的部分已知明文进行判断


然后回到主体流程中 f 函数利用密钥继续加密

image-20230818181758830

式子:B1B2…B8 = K + E®

输出:P(S1(B1)S2(B2)…S8(B8)

其中E函数功能:32bits的输入转化为48bits输出

image-20230818182059318

其含义就是根据给出的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盒举例

image-20230818183218327

其中行编号是0-3 可以用两位二进制数字表示

列编号是0-15 用四位二进制数字表示

同时我们发现在S盒中的数据不超过15 正好4位二进制可以表示的 4位!!我们就可以联想到四位的输出

了解了上面的基础部分之后

我们有六位bits的输入 比如011011

那么我们把第一位和最后一位组合 01 转为十进制 1 就是对应行号为1的那一行

中间四位组合 1101 转为十进制就是13 就是对应列号为13的那一列

十字交叉 我们找到数字5 转为二进制0101 到此我们

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值