一些四月做的杂题,尽量记录一下,保持良好习惯。
贵阳大数据及网络安全精英对抗赛-解题赛
math
首先需要通过POW:
1 | from pwn import * |
后面部分解法不唯一,可以用两个式子建立方程,sagemath直接求解求p和q,也可以通过推导式子的关系来做,这里记录方法二。
已知$p^9+q^9…(1)$和$p^3+q^3…(2)$,把(2)式进行三次方和(1)式做差即可得到$3p^3q^3(p^3+q^3)$,这里除以一个(2)式可以求出pq,再利用$p^3+q^3=(p+q)(p^2-pq+q^2)=(p+q)[(p+q)^2-3pq]$和sagemath求解p+q。最后把pq%(p+q)发送到server获得flag。
1 | from gmpy2 import * |
childrsa
前一半给了P+Q的高位gift,可以把gift直接当作P+Q来用,解方程得到P的高位,然后再来一次P高位的copper恢复P,解出hint:
1 | import gmpy2 |
后一半是已知p低位攻击,但最右端5位未知,考虑爆破并构造copper:
1 | for low in range(2 ^ 5): |
求出p以后分解n解密即可。
还有一种解法是需要利用论文里的结论:
![](/.com//05/02/%E9%9A%8F%E7%BC%98%E5%88%B7%E9%A2%98-%E4%BA%8C/1.png)
这里的条件很容易被满足,因此先求P的大致值再做一次高位copper攻击即可,注意卡了下界。
1 | from Crypto.Util.number import * |
线性代数
已知S=L.U,那么$L^{-1} S^2 L (LU*L)^{-1}=U$,求出U以后通过另一个代换关系可求出R。利用U和R就可恢复A了,具体地:
利用A和encrypt的逻辑倒回去即可恢复flag,exp:
1 | p = 71 |
eezzrrssaa
利用tmp = prng2.next() * q + prng1.next()
除以q可以恢复prng2的序列,模q则可以得到prng1的序列,但由于get_prime函数存在if判断,序列的两个输出之间可能跳过很多个非素数。发现prng1给了a和b,通过序列1可以计算每两个数据之间间隔的个数,再利用序列2的关系建立方程,grobner basis求解恢复prng2的a和b,然后利用get_prime再跑几轮得到rsa的私钥解密。exp:
1 | from sage.all import * |
1 | from Crypto.Util.number import * |
某不知名小比赛
task6
1 | from Crypto.Util.number import * |
根据已知算式推导有:
$(o-2023)^e\;mod\;p=q^e$,$a\;mod\;p=q^e$,$(s-2023)^e\;mod\;p=r^e$,$b\;mod\;p=r^e$
因此只要把$q^e和r^e$消去就能用gcd求出p,然后利用p再去求q和r,注意需要用md5值爆破一下。exp:
1 | from Crypto.Util.number import * |
task14
1 | from Crypto.Util.number import * |
由于p+q-n-1 = -phi,info - n - 1 = d-phi。已知e,d分解n是比较容易的,也就是已知k*phi分解n,那么这里对(d-phi)乘上e就能得到k.phi,直接打即可。
1 | from hashlib import * |
2023数字中国.数据安全产业人才能力挑战赛初赛
math_exam
challenge1
由于 $p > q$,故
故 $\frac{leak}{2} + n= (p-1)(q-1)+2p \equiv 2 \mod (p-1)$
由费马小定理得 $2^{k(p-1)} \equiv 1 \mod p$
所以有 $2^{\frac{leak}{2} + n-2} -1 \equiv 0 \mod p$,由此得到$p$ 的一个倍数,与$n$ 求最大公因数得到$p$,从而分解 $n$,计算出flag1,此部分exp如下:
1 | from Crypto.Util.number import * |
challenge2
$leak = d + p+q$,故有
故 $(n+1-leak) e +1$ 是 $\phi(n) = (p-1)(q-1)$ 的倍数,在这里与 $(p-1)(q-1)$ 等价,故可以直接计算出 $d$ 从而得到flag,此部分exp如下:
1 | from Crypto.Util.number import * |
challenge3
由于 $p, q$ 互素
故 $p^q + q^p \equiv p+q \mod n$,故 $\phi(n) = (p-1)(q-1) -leak+1$,从而可以求出$d$,继而得到flag3,此部分exp如下:
1 | from Crypto.Util.number import * |
2023数字中国.数据安全产业人才能力挑战赛决赛
easybag
背包,但是模比较小,所以用常见的那几个格都打不了,可能的方法有二:一是用babai求解cvp,二是把原来的格子多加一维,放个模数进去规约,这里用的第二种:
1 |
|
[NSSRound#11 Basic]
确实basic…
MyMessage
1 | from pwn import * |
ez_fac
1 | c= 3866279781013543205658463982680574789263686965906473424577486426942775694532574930616672988611113833539702690921446200225171584718802440563150487891096712274831420836933939779382822469222602044856724471573453348450920756403685981523107389025461368280902766853394997570763802420010913302243342822394651909187 |
ez_signin
1 | num1= 52094189070805820804424069707311784807157194903972872439434677248883216068691427397091287206739227220919493383737034374096848668365439528625160682561322951470871293036263842642491522909243273773919260520717204606422128387000039062461612208327799165806265429050467490481951704165618350489409782368149856166950 |
MyGame
共模攻击。
NTR
数域上最简单的那个二维格。