Tamevic's Ctf-Crypto writeup@Crypto实验‘RSA’(2019强网杯’强网先锋-辅助‘)

本文介绍了在2019年'强网杯'竞赛中遇到的一道Crypto题目,涉及RSA加密。题目中存在一个漏洞,即第二次加密时只重新选取了素数p,而保持了q不变。通过计算两个密文的n的最大公因数,可以找到q,从而获得p。接着利用欧拉公式和拓展欧几里得算法求得私钥d,最终解密得到flag。作者强调,RSA虽看似简单,但还有许多攻击方式值得学习。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值