前言
这次出了ez_lattice, LFSR_Signin和Pollard & Williams三个题以及一个ez_lattice的revenge。(lattice出得依托,以后再也不出了)
LFSR_Signin
题目
1 | from Crypto.Util.number import * |
思路&exp
非常简单的LFSR,给出flag长度为255,所以在模2下有以下等式:
变换得:
根据生成的值即可还原flag。
exp:
1 | from Crypto.Util.number import * |
Pollard & Williams
题目
1 | from Crypto.Util.number import * |
思路&exp
part 1
已知:
注意到这其实就是pollard p-1的本质思想,即通过小的质因子相乘得到R,若满足(p-1)|R即可通过R分解n。 exp:
1 | def solve_part1(n1, c1, n2, c2): |
part2
对于如下的Lucas序列:
exp:
1 | def lucas_v(a, n): |
ez_lattice & Siesta's revenge
全是非预期 这题出的实在是有点难绷了()
题目
1 | from Crypto.Util.number import * |
思路&exp
part1
这部分其实没什么好说的,显然a, b都是小量,可以由如下等式构造格:
exp:
1 | p = 12478746590758967738992827236548867094406642228843048782158822830242432957850861746109083849369751421558416546441433265483311369062332823391326650330844473 |
part2 & Siesta's revenge
这部分我本来是想考类似于extend wiener attack的造格方法的,但是因为flag取的太短导致了第一次的非预期,然后第二次s取的有点问题导致了第二次的非预期(烂完了)但是还是讲一下预期解的思路 我们有:
拆开得到:
然而由于未知数的个数过多,难以像part1那样构造线性的方程,因此需要想方法构造更多等式。我们可以先看一下①*②的式子如何:
因此可以想到如下的方程构造:
于是有:
exp:
1 | P = 8064317391291915578249751043887298750752952396481901402238164933671762816998644264248732894561122039999833298392825353792148892469165631966482732750535761 |