攻防世界 Crypto best_rsa

题目给了两个密文文件和两个公钥文件,首先解析一下公钥,命令:

openssl rsa -pubin -text -modulus -in publickey2.pem

由于对openssl rsa命令不熟,这里做一下记录:
用法

openssl rsa [inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
[-sgckey] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id] [-des] [-des3] [-idea]

常用选项

-in filename :RSA密钥输入文件,默认读取的是私钥,若指定"-pubin"选项将表示读取公钥。
-out filename:RSA密钥输出文件
-text :转换输入和输出的密钥文件格式为纯文本格式
-noout :不输出任何密钥信息
-modulus :打印公钥信息
-check :检查RSA密钥是否完整未被修改过
-pubin :从输入文件中读取公钥内容,公钥文件可以通过文件中的公钥标识符"-----BEGIN PUBLIC KEY-----“和”-----END PUBLIC KEY-----“来辨别。
-pubout :从私钥中提取公钥,即从”-in filename"指定的私钥中提取公钥并输出
-des|-des3|-idea :加密输出文件,使得每次读取输出文件时都需要提供密码。

成功解析出两个文件的公钥:
在这里插入图片描述
在这里插入图片描述
不难发现,两个文件的模数相同,想到同模攻击,通过脚本求得题解:

from Crypto.PublicKey import RSA
import libnum
import gmpy2

c1=libnum.s2n(open('cipher1.txt','rb').read())
c2=libnum.s2n(open('cipher2.txt','rb').read())

pub1=RSA.importKey(open('publickey1.pem').read())
pub2=RSA.importKey(open('publickey2.pem').read())
n = pub1.n
e1= pub1.e
e2= pub2.e

s = gmpy2.gcdext(e1,e2)
s1 = s[1]
s2 = s[2]

if s1<0:
	s1 = -s1
	c1 = gmpy2.invert(c1, n)
elif s2<0:
	s2 = -s2
	c2 = gmpy2.invert(c2, n)

m = pow(c1,s1,n)*pow(c2,s2,n) % n
flag = libnum.n2s(m)
print(flag)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值