CTF-RSA多组公钥,模数共用素因子

模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))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值