BUUCTF——rsa系列

目录

RSA

rsarsa

 RSA1

RSA3

RSA2

RSA

RSAROLL

RSA

 题目只需要解出d,故利用代码就可解出d

import gmpy2

e = 17
p = 473398607161
q = 4511491

phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)#即e*d mod phi_n = 1
print(d)

rsarsa

p、q、e、c都给出了,计算p*q得到n,再利用基础方法就可得到m,直接print(m)即可

import gmpy2
import binascii

p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

n = p*q
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)#即e*d mod phi_n = 1
m = gmpy2.powmod(c,d,n)#即m = c^d mod n
print(m)

 RSA1

实在搞不清公式原理,膜拜大佬:http://t.csdn.cn/qkmjb

import gmpy2
import binascii

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

I = gmpy2.invert(q,p)
mp = gmpy2.powmod(c,dp,p)#即mp = c^dp mod p
mq = gmpy2.powmod(c,dq,q)#即mq = c^dq mod q
m = ((mp-mq)*I%p)*q+mq#公式

print(binascii.unhexlify(hex(m)[2:]))

得到

 记得把前面'noxCTF'的换成flag

RSA3

 两组e、c,为共模攻击,与CTFshow中的easyrsa3相同

import gmpy2
import binascii

n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291

s = gmpy2.gcdext(e1,e2)#扩展欧几里得算法,得到x,y,即ax+by=gcd(a,b)
m1 = gmpy2.powmod(c1,s[1],n)
m2 = gmpy2.powmod(c2,s[2],n)

m = (m1*m2)%n
print(binascii.unhexlify(hex(m)[2:]))

RSA2

 dp泄露类型

import gmpy2
import binascii

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

for i in range(1, e):#在范围(1,e)之间进行遍历
    if (dp*e-1)%i == 0:
        if n%(((dp*e-1)//i)+1) == 0:#存在p使得n能被p整除
            p = ((dp*e-1)//i) + 1
            q = n//(((dp*e-1)//i)+1)
            phi_n = (q-1)*(p-1)
            d = gmpy2.invert(e,phi_n)
            m = pow(c,d,n)

print(binascii.unhexlify(hex(m)[2:]))

RSA

又是没见过的题型,给了.enc和.key文件,查阅了解到,可以根据pub.key文件值得是公钥解析类题,先将两个的文件分别改尾.txt,

http://www.hiencode.com/pub_asys.html,利用在线网站解析,得到e和n

 再利用分解大整数工具yafu(需要安装,自行查阅下载)分解n得到p和q

 最后利用代码可得flag:

import gmpy2
import rsa

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)#即e*d mod phi_n = 1
key = rsa.PrivateKey(n,e,d,p,q)

with open("C:\\Users\\lenovo\\Desktop\\flagenc.txt",'rb') as file:
    file = file.read()
    print(rsa.decrypt(file, key))
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

RSAROLL

题目给了两个文件

第一次见这种题型,不知道是什么意思,查阅了解到,这道题的意思就包含在了题目中‘ROLL’,每一串数代表的就是密文c中的一个字符,即c = c1+c2+、、、+cn,然后花括号里的分别是n和e。

先分解n得到p和qhttps://zh.numberempire.com/numberfactorizer.php

 用一个列表放入每一串数,再利用循环加上基础代码,解出每一个c,添加到flag中,最后打印即可得到完整flag,代码如下:

import gmpy2
from Crypto.Util.number import long_to_bytes

n = 920139713
e = 19
p = 18443
q = 49891
phi_n = (p-1)*(q-1)
list_c =[704796792,
752211152,
274704164,
18414022,
368270835,
483295235,
263072905,
459788476,
483295235,
459788476,
663551792,
475206804,
459788476,
428313374,
475206804,
459788476,
425392137,
704796792,
458265677,
341524652,
483295235,
534149509,
425392137,
428313374,
425392137,
341524652,
458265677,
263072905,
483295235,
828509797,
341524652,
425392137,
475206804,
428313374,
483295235,
475206804,
459788476,
306220148]

flag = ''
for i in list_c:
    c = i
    d = gmpy2.invert(e,phi_n)
    m = long_to_bytes(gmpy2.powmod(c,d,n))#正整数转化为byte类型字符串
    flag += m.decode()#byte类型字符串字符串
print(flag)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值