模N不互素(多组公钥,其中的模数共用了素因子)
原理
当题目提供了多组N值,这多组N值之间可能存在公因数,即私钥 p或 q。
例题 【2022羊城杯 Easy RSA】
#task.py from flag import flag from Crypto.Util.number import * m = bytes_to_long(flag) e = 65537 f = open("output.txt", "r") a = f.readlines() for i in a: n = int(i) c = pow(m, e, n) m = c print 'c = %s' % (m) f.close()
题目分析:
读取output文件,每次的模数N就是output文件中的一行数字,也就是说用了多组N去不断加密明文。
首先测试这多组N值之间是否存在公因数。
from gmpy2 import *
f = open("output.txt","r").read().splitlines()
print(f)
p = gcd(int(f[0]), int(f[1]))
for i in range(len(f) - 1):
assert gcd(int(f[i]), int(f[i+1])) == p
print('ok')
然后我们就已经得到了p,且已知每次的n,以及e,下面只需要从后向前解密就行了,要从后向前啊啊啊。
for n in n_list[::-1]:
q = n//p
d = invert(e,(q-1)*(p-1))
m = pow(c,d,n)
c = m
print(long_to_bytes(m))