前言
这篇博客其实在xman培训的时候就应该出的,但当时还有一些没学通,所以拖到现在
简介
这个其实是硬件实现的一个过程,但是被人搬去了密码学上使用,于是就有了这个知识点啦
这其实是一种流密码,整个过程可以简单的理解成一串数据放去进行一系列随机化操作以后获得加密后的数据,这中间的操作,也就是反馈函数如果是线性的,那就是线性反馈移位寄存器,如果是非线性的,那就是非线性反馈移位寄存器,emmm,这么说很难理解,放几个例题就能懂了
线性反馈移位寄存器LFSR
2018 ciscn oldstream
1 |
flag = "flag{xxxxxxxxxxxxxxxx}" |
这是国赛的一道题,也是一道比较简单的LSRF的题目,先读代码,简单的可以理解成:将mask的二进制为1的地方跟flag对应起来,然后记录到I上,然后将1的个数记录到output上,一直循环进行运算,再简单一点的理解就是循环将高位的值异或到低位上,信息并没有丢失,所以我们要解密逆推回去就行了
1 |
import libnum |
这题还有另一种使用矩阵变幻的做法
1 |
mask = 0b10100100000010000000100010010100 |
2019 de1ctf babylfsr
前面的做法只能适用于flag长度比较小的时候,当flag长度比较长的时候,直接爆破显然是不现实的,算力支撑不了,因此只能进行矩阵变换进行求解
非线性反馈移位寄存器NFSR
非线性的反馈移位寄存器一般有三种
1 |
非线性组合生成器,对多个LFSR的输出内容使用一个非线性的组合函数 |
2018 ciscn streamgame3
源码在这里
1 |
flag='flag{01b9cb05979c16b2f3}' |
2019 TCTF zer0lfsr
这题跟上一题差不多,也是先求三个lfsr,然后再联合获得结果,源码如下
1 |
from secret import init1,init2,init3,FLAG |
这题没有把l1、l2、l3的长度给出来,也没有更多的信息,所以不能直接用相关攻击,但是我们可以仔细观察,虽然有掩码位数很长,但是只有两位是1,其他位都是0,所以我们可以先思考一下,next处理的部分,对他进行影响的,只是init中位数为1的部分,而且处理后的信息储存到了最低位,没有丢失,因此可以逆推回去获得原值,而其中combine的三个值因为输入为单位,所以实际上可以变换为
1 |
def combine(x1, x2, x3): |
因此结合一起的三个lfsr就可以轻易的分解为单个lfsr了,剩下的求解可以直接用z3去跑
1 |
# -*- coding:utf8 -*- |
后记
看来还得继续拖着了……生成函数啥的没学懂,做题到后面地动山摇Orz
FROM:Xi4or0uji
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论