Tamevic’s Ctf-Web writeup@Crypto实验‘RSA’(2019强网杯’强网先锋-辅助‘)
还好在课上弥补一下当时比赛最后十分钟差点做出来的遗憾…
题目源码:
from Crypto.Util.number import getPrime,bytes_to_long,long_to_bytes
import sys
from fractions import gcd
# p=getPrime(1024)
# q=getPrime(1024)
# e=65537
# n=p*q
# m=bytes_to_long(flag)
# c=pow(m,e,n)
# print c,e,n
# p=getPrime(1024)
# e=65537
# n=p*q
# m=bytes_to_long("1"*32)
# c=pow(m,e,n)
# print c,e,n
分析
还是简单分析一下代码:
第一次加密flag的时候p和q都取得是随机素数,c1是加密后的密文,第二次加密是明文是32个1,但是这里只是重新取了p,却用了和加密flag一样的q。所以尝试以找到q为突破口。
而在我们这里有所有的密文和公钥。只需要对n1和n2取最大公因数就能找到q。
gcd(n1,n2)
知道q以后就能知道第一次的p。
n1/q
然后就可以按欧拉公式计算φn。
φn=(p-1)*(q-1)
再用拓展欧几里得计算e模φn的乘法逆元即可以求得私钥d。
d=computeD(φn,e)
再对n1进行解密,将long型转成bytes型即可求得flag。
m1=pow(c