题目地址
题目名称:best_rsa
题目描述:暂无
题目附件:附件1
WriteUp:
解题思路:
下载附件,解压后打开文件夹,包含4个文件
给出了2个公钥文件和和2个密文文件,用常规的RSA解密方式分别解密,解密失败(n为2048位难以分解)
猜想应该是同一个明文,使用了2个不同的公钥加密得到了不同的密文,对同一明文的多次加密使用相同的模数和不同的公钥指数可能导致共模攻击
共模攻击适用情况:明文m、模数n相同,公钥指数e、密文c不同,gcd(e1,e2)==1也就是e1和e2互质
解题过程:
判断e1和e2是否互质的python3脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
def gcd(a, b): if (b == 0): return a else: return gcd(b, a % b) def main(): x = 117 y = 65537 if gcd(x, y) == 1: print(str(x) + " " + str(y) + " 两个数互素") else: print(str(x) + " " + str(y) + " 两个数不互素") if __name__ == "__main__": main()
|
共模攻击python3解密脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import gmpy2 from Crypto.Util.number import * from Crypto.PublicKey import RSA
public_key1 = RSA.importKey(open(r"G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\publickey1.pem",'rb').read()) public_key2 = RSA.importKey(open(r"G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\publickey2.pem",'rb').read())
n1 = public_key1.n e1 = public_key1.e n2 = public_key2.n e2 = public_key2.e
assert n1==n2 n=n1
c1=bytes_to_long(open(r'G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\cipher1.txt','rb').read()) c2=bytes_to_long(open(r'G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\cipher2.txt','rb').read())
_, r, s = gmpy2.gcdext(e1, e2)
m = pow(c1, r, n) * pow(c2, s, n) % n print(long_to_bytes(m))
|
运行结果:
得到flag为:flag{interesting_rsa}