学如逆水行舟,不进则退。开一个刷题专栏,持之以恒地练习。PS:难度大约是中等。
hgame2023 week4
ECRSA
1 | p=115192265954802311941399019598810724669437369433680905425676691661793518967453 |
LLLCG
相较于普通的lcg,其增量为随机值,即$seed\cdot a + (random\;mod\;n)$,注意是先模再加,所以增量可以看作一个小的噪音,问题转化为LWE。格子造两行就行了:
这样的话规约时的系数分别为a和1,a即是flag。
1 | n = next_prime(2**360) |
LLLCG-Revenge
在LLLCG的基础上改的,增加了括号,即$(seed\cdot a + random)\;mod\;n$,这样整个问题不再是一个LWE,已知信息为$as_1+e_1=k_1n+s_2,as_2+e_2=k_2n+s_3\cdots$,可以构造如下的格:
那么$(e1,e_2\cdots e{n-1},a,2^{340})$是该格上的短向量,a (flag)就可以规约得到。刚开始我没意识到这是个HNP,造的格少了两列,结果规约失败,与tsuppari师傅交流后发现加上两列构成方阵就很容易出了,感谢师傅。
1 | n = next_prime(2^360) |
长城杯2022
xor
利用异或的性质恢复即可。
1 | start = 'flag{' |
known_phi
已知phi和e,分解n是容易的,后边就是DSA的共用k攻击。
1 | from Crypto.Util.number import * |
baby_rsa(2021)
enc1只给了c和e,没给n但给了不少p q的限制条件,p 的比特位数仅1000多,因此v1和m1应该都不大,那么进行遍历即可,当满足条件的时候进行解密,用flag头判断解密是否成功。
1 | from Crypto.Util.number import long_to_bytes |
第二部分更简单,因为flag是uuid格式,所以flag2小于512比特,用fac[0]+fac[1]+fac[2]) << 1) - 1解密即可。
RSA
只要注意给了$d_1-d_2$的值就很容易构造出kphi,那么求d解密即可。
1 | from Crypto.Util.number import * |
VNCTF2021
whitegive
前一部分可以通过数论推导得到两个关于p的式子,求公因子分解以后解出e,发现e很大,于是尝试boneh_durfee求解即可。
1 | from gmpy2 import * |
factor
考查的是[Lattice Based Attack on Common Private Exponent RSA],但给的是$e_id\equiv1\;mod\;(p+1)(q+1)$,参考论文可知这题$\phi(N_i)=N_i - s_i=N_i-(-p_i-q_i-1)$,所以有$e_id-1=k_i(N_i-s_i)$,变形一下就是$e_id-k_iN_i=1-k_is_i$,利用这个关系就能规约,规约的结果为向量$(dM,1-k_1s_1,…,1-k_is_i)$,由于$1-k_is_i$的比特大约是$k_ip$,所以我们在构造格的时候才需要取$M=N_r^{1/2}$。本题求出的d并不能用于解密,因为$e_id\equiv1\;mod\;(p+1)(q+1)$,需要取规约的系数得到$k_i$,利用$k_i$求出p+q分解n,最后利用正确的phi来求私钥d。
1 | ###Sage### |
湖湘杯2021
signin
考查的是维纳攻击的变式,即利用维纳攻击的思想(连分数)去求解参数。本题根据gen的算法可知p1和p2的比特差距并不是很大,那么近似有$q_1/q_2=n_1/n_2$,而$n_1$和$n_2$是已知的,可以考虑展开$n_1/n_2$的连分数来求解q1和q2。exp:
1 | from gmpy2 import iroot |
CISCN2022 东北赛区
gcrd2
gcrd是矩阵分析的内容,参考链接,根据定义,这里的矩阵T是aT和bT的一个最大右公因子,因此可以用gcrd的构造定理求解,即将aT和bT堆叠,进行初等行变换,最后划归的非零部分就是两个多项式矩阵的最大右公因子,在matlab里 用rref()函数即可化简,拿到T之后求一下res就能计算flag了。
1 | import numpy as np |
math1
没做出来,参考博客进行复现。首先根据密钥生成算法可知$n_1=a_1b_1+1,n_2=a_2b_2+1,n_3=a_1b_2+1,v_2=kb_1+1,N_1=n_1n_2,N_2=n_3v_2$,那么近似有$N_1/N_2=a_2/k$,展开连分数就可以求到a2和k,又$ed-1=k\phi$,所以$\phi_1\equiv(-1)k^{-1}\;mod\;e$,并且$\phi_1 \equiv a_1a_2b_1b_2\;mod\;a_2$,用crt可将$\phi_1$上升到模$a_2e$下。这仍然不足以求出$\phi_1$,需要爆破,因为$N_1-\phi_1$大约是512比特级别,和$a_2e$是同一个量级,所以考虑用$\phi_1=\phi_1low+N_1//(a_2e)*(a_2e)+te_2e$来爆破,t应该比较小。需要注意用N1是不行的,它不是$a_2e$的倍数。exp:
1 | import gmpy2 |
巅峰极客2022
point-power
根据倍点公式和椭圆曲线公式建立方程组求解,用代入法比较好解: $y_1^2=x_1^3+ax_1+b$ $\lambda=\frac{3x_1^2+a}{2y_1}$ $\lambda^2-2x_1=x_2$
1 | p = 3660057339895840489386133099442699911046732928957592389841707990239494988668972633881890332850396642253648817739844121432749159024098337289268574006090698602263783482687565322890623 |
strange curve
gcd
推导一下,做gcd求p*q 。本题实际上是基于公钥加密体制Schmidt-Samoa。
1 | from gmpy2 import gcd |
Learning with fault
vikeCTF2023
Ramparts, Shields & Armour
1 | from Crypto.Util.number import * |