LFSR_Calculation
0x01 An extend of my previous blog
上个博客研究了矩阵对递归的实现,本就应该想到与lfsr的联系的,但直到最近做题才想到。参考学习群大佬的博客Canzik's Blog || 关于LFSR的原理以及攻击方式,用矩阵实现了lfsr。
baby lfsr
初始状态s0=0,s1=0,s2=1,变换公式为
变换矩阵
顺便:大佬博客好像有问题,生成的序列不一样?奇怪
0x02 Attack lfsr
以d3ctf的d3bug为例:
1 | from Crypto.Util.number import * |
说实话这题贼签到,观察到在lfsr_MyCode
部分得到的每一位output
相当于是前面所有位的异或和。每次移位时最高位会消失,直接把这两次得到的output随意简单异或一下就可以得到这一次消失的高位。
而剩下的低位通过lfsr_CopiedfromInternet
的结果可以得到一个模二加方程组(就是异或),解一下方程就可以了
1 | from Crypto.Util.number import * |
0x03 补充
异或在数学上被称为GF有限域上的加法,对矩阵指定类型,sage自动将该矩阵之后的运算限制为我们规定的域下的运算(指定运算方式)
模运算和多项式也是可以的
说白了就是解一个方程。
0x04 z3 solution
看其他人博客的时候发现,还可用z3solver来解。代码太复杂了,思路是:每参与一次运算,有效位在R中都会向右移动一位(R在向左移,有效位在mask中不变,所以对应着R中的有效位在向右移动)
例如第一次调用函数中:
1 |
第二次调用中:
以此类推
需要注意的就是,message即R总长64位,当大于64位以后,需要的就是我们补上的lastbit