[WP] cryptohack mathematics brainteasers-part-1

突然发现数学这一节没有其他格相关内容了,可能后面的章节还有?反正先做着!

这一节名字叫脑筋急转弯,看样子是脑洞题巨多

目录传送门:cryptohack 练习学习汇总(writeup index)

Successive Powers

以下是数学方法(代码仅供计算使用)

注意到有这样连续的两个数:4,8364, 836。我们断言,8364=209\frac{836}{4}=209 即为 xx

这是因为: 不妨设 0<x<p<10000<x<p<1000(若不是,可以通过 x=xmodpx'=x \bmod p 来使 xx 满足范围,且表现不变)
8364=209\frac{836}{4}=209 不是 xx
因为有 4x836(modp)4x\equiv836\pmod p
则必有 4x=836+pR(RZ+)4x=836+pR(R\in Z_+)
x=209+pR4x=209+\frac{pR}{4}
考虑到 xx 为整数,必有 4pR4|pR。因为 pp 是一个奇质数,故 4R4|R,故 R4R\ge 4
可以得到 x209+px\ge 209+p
注意到给出的数列中含有 836,故 p>836p>836,故 x>1045x>1045 矛盾
综上,x=209x=209

然后通过任意两个相邻的数可以求出某一个 pRpR 的值,从而通过质因数分解很容易可以得到 pp

代码: cryptohack/mathematics brainteasers-part-1 Successive-Powers.py

Adrien's Signs

这题很有意思啊
利用了一个性质:有二次剩余的数的乘方还是有二次剩余,且 p3(mod4)p\equiv 3\pmod 4 的时候一个有二次剩余的数的相反数没有二次剩余

恰好的是,xx 有二次剩余,且题目所给的 pp 确实是 4x+34x+3 型素数,因此直接判断一个数有无二次剩余即可

代码: cryptohack/mathematics brainteasers-part-1 Adriens-Signs.py

Modular Binomials

非预期:Factordb 可以直接分解

这题也太有意思了。首先考虑到指数不一样很难处理,变化为如下形式:

{c1e2=(2p+3q)e1e2(modN)c2e1=(5p+7q)e1e2(modN)\begin{cases} c_1^{e_2}=(2p+3q)^{e_1e_2}\pmod N\\ c_2^{e_1}=(5p+7q)^{e_1e_2}\pmod N \end{cases}

注意到,二项式展开后,除了边缘两项之外,其他项均含 pqpq 可以忽略

{c1e2(2p)e1e2+(3q)e1e2(modN)c2e1(5p)e1e2+(7q)e1e2(modN)\begin{cases} c_1^{e_2}\equiv(2p)^{e_1e_2}+(3q)^{e_1e_2}\pmod N\\ c_2^{e_1}\equiv(5p)^{e_1e_2}+(7q)^{e_1e_2}\pmod N \end{cases}

{a2e1e2(modN)b3e1e2(modN)c5e1e2(modN)d7e1e2(modN)\begin{cases} a\equiv2^{e_1e_2}\pmod N\\ b\equiv3^{e_1e_2}\pmod N\\ c\equiv5^{e_1e_2}\pmod N\\ d\equiv7^{e_1e_2}\pmod N\\ \end{cases}

则有

{ape1e2+bqe1e2c1e2(modN)cpe1e2+dqe1e2c2e1(modN)\begin{cases} a\cdot p^{e_1e_2}+b\cdot q^{e_1e_2}\equiv c_1^{e_2}\pmod N\\ c\cdot p^{e_1e_2}+d\cdot q^{e_1e_2}\equiv c_2^{e_1}\pmod N \end{cases}

可视为一个一个二元一次方程组,可以求出 pe1e2modNp^{e_1e_2}\bmod Nqe1e2modNq^{e_1e_2}\bmod N
最后将结果与 N 求 gcd 即可得到 p,qp,q

代码: cryptohack/mathematics brainteasers-part-1 Modular-Binomials.py

Broken RSA

虽然 nn 是素数,e=16e=16 导致 gcd(n1,e)1\gcd(n-1,e)\not=1,但是我们可以简单地开 4 次根号(求 4 次二次剩余)直接获取明文

代码: cryptohack/mathematics brainteasers-part-1 Broken-RSA.py

No Way Back Home

易知

v=vkavkbvkakbv = \dfrac{vka\cdot vkb}{vkakb}

但是 pvka,vkb,vkakbp|vka,vkb,vkakb,因此 vkakbvkakb 没有逆元
不过容易想到

v=vkapvkbpvkakbppv = \dfrac{\frac{vka}{p}\cdot \frac{vkb}{p}}{\frac{vkakb}{p}}\cdot p

其中前面的部分(p\cdot p 前)在 modq\bmod q 意义下进行
由此可以解得 vv 进而得到 flag

代码: cryptohack/mathematics brainteasers-part-1 No-Way-Back-Home.py