由于极客大挑战有很多签到难度的题,这里只选取了我认为有学习意义的题目
PolyRSA
题面:
1 | import gmpy2 |
分析:
题目提供了:
$$
c_1\ =\ (2p+3q)^{e_1}\ mod\ n\
c_2\ =\ (5p+7q)^{e_2}\ mod\ n
$$
我们需要借助c1和c2解出p,q
(最后解出的时候才意识到Poly是指多项式的意思)
下面进行求解:
- 二项式展开
$$
c_1\ =\ (2p)^{e_1}+(3q)^{e_1}\ \ (mod\ n)\
c_2\ =\ (5p)^{e_2}+(7q)^{e_2}\ \ (mod\ n)\
$$
-
两边同幂另一个指数
$$
c_1^{e_2}\ =\ (2p)^{e_1e_2}+(3q)^{e_1e_2}\ \ (mod\ n)\
c_2^{e_1}\ =\ (5p)^{e_1e_2}+(7q)^{e_1e_2}\ \ (mod\ n)\
$$ -
消元
$$
5^{e_1e_2}c_1^{e_2}\ =\ (10p)^{e_1e_2}+(15q)^{e_1e_2}\ \ (mod\ n)\
2^{e_1e_2}c_2^{e_1}\ =\ (10p)^{e_1e_2}+(14q)^{e_1e_2}\ \ (mod\ n)\
$$ -
做差即可
$$
5^{e_1e_2}c_1^{e_2}\ -\ 2^{e_1e_2}c_2^{e_1}\ =\ 0\ (mod\ q)
$$
所以说此式是q的倍数,直接gcd即可求出q
exp:
1 | from Crypto.Util.number import * |
EzComplex
题面:
1 | #sage9.3 |
分析:
已知N如下:
$$
N\ =\ p^2+q^2
$$
结合题目中的Complex,说明应该把N放在复数域中分解,由以下公式可知:
$$
N\ =\ (p+qi)(p-qi)
$$
通过遍历所有可能的因子从而得到p和q
利用sage中的divisors()函数返回可能的除数,并把范围定在Zn,即高斯整数,
同时满足高斯整数的范数等于N
exp:
1 | #sage |