题目:
('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e') c=768896221699590111551397334346583376174312684057067400178334
('e=', '0x872a335') e=141730613
#q + q*p^3 =128536731745208998078944182958039785532190189135042941441365578240x872a33531779727560841427444135440068248152908241981758331600586
#qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
从题目我们看出给出了关于p和q的两个关系式,由此我们可以通过数学方法求出p和q,然后再正常解密即可。
求解p,q
from Cryptodome.Util.number import *
from gmpy2 import *
from gmpy2 import gmpy2
from sympy import *
c = 0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e
e = 0x872a335
k1 = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
k2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
p,q=symbols('p,q')
eq1=Eq(q+q*pow(p,3),k1)
eq2=Eq(q*p+q*pow(p,2),k2)
s=solve((eq1,eq2),(p,q))
for i in s:
print(i)
'''
这段代码使用了 SymPy 库中的 `symbols`、`Eq` 和 `solve` 函数,用于求解两个方程组成的方程组。
首先,使用 `symbols` 函数创建了两个符号变量 `p` 和 `q`。然后,定义了两个方程 `eq1` 和 `eq2`,分别表示 `q+q*p^3=k1` 和 `q*p+q*p^2=k2`。其中,`k1` 和 `k2` 是给定的常数。
接下来,使用 `solve` 函数求解这个方程组。`solve` 函数的第一个参数是一个元组,包含了需要求解的方程。第二个参数是一个元组,包含了需要求解的未知数。在这个例子中,需要求解的未知数是 `p` 和 `q`。
最后,使用 `for` 循环遍历所有可能的解,并输出结果。需要注意的是,由于 `solve` 函数返回的是一个列表,其中每个元素都是一个字典,表示一组解。因此,需要使用字典的方式来访问每个解的值。例如,可以使用 `i[p]` 和 `i[q]` 分别获取解中 `p` 和 `q` 的值。同时,需要注意解的数量可能不止一个,因此需要使用循环来遍历所有的解。另外,代码缩进也需要注意,`print` 函数应该缩进到 `for` 循环内部,以保证输出的正确性。
'''
最后正常解密
p,q=1158310153629932205401500375817, 827089796345539312201480770649
phi=(p-1)*(q-1)
n=p*q
d = gmpy2.invert(e, phi)
print('d=',d)
m=pow(c,d,n)
print(long_to_bytes(m))