攻防世界_Crypto_进阶区

本文介绍了在攻防世界平台上,通过RSA算法和古典密码解决了一系列加密挑战。涉及RSA的公钥私钥计算、共模攻击、GCD应用以及 Vigener 密码的破解。通过分解大素数、使用在线工具和专门的CTF工具,成功解密并获取了flag。
摘要由CSDN通过智能技术生成


虽然攻防世界大多数的题已经过时了,但还是从基础开始吧!
不定期更新

1.flag_in_your_hand

下载得到一个html文件和一个js文件,进入html,尝试输入后失败,于是看页面源码,也没有什么重要的信息,那一定在js里。
在这里插入图片描述

ck()函数决定了输出内容,所以按照要求,输入的每一个字符的ASCII码要比a小3,于是得到要输入的内容为:security-xbu
然后得到flag:RenIbyd8Fgg5hawvQm7TDQ

13.wtc_rsa_bbq

下载得到一个叫“cry200”的文件,没有后缀名,用记事本打开有.pem后缀
在这里插入图片描述
一开始没想到是压缩文件,但是丢到kali里面自动变成了压缩文件,解压一下得到了key.pem和cipher.bin两个文件*(这里也可以用HxD打开,观察到文件头是504B0304,则可以确定是.zip压缩文件,应该是标准的做法)*
于是放在RsaCtfTool的路径下,执行命令“python3 RsaCtfTool.py --publickey key.pem --uncipherfile cipher.bin ”就得到了flag:flag{how_d0_you_7urn_this_0n?}在这里插入图片描述

看到WP区有个哥们设s=(n+1)**0.5,p=s+1,q=s-1,assert一下发现是对的,那么就可以按照标准的RSA来解了。

19.cr4-poor-rsa

下载得到两个文件,一个公钥文件,用在线网站解析得到n、e,再分解n得到p、q;flag.b64是一个用base64加密的文件,因此用b64decode读取文件内容,脚本如下:

import base64
import gmpy2
from Crypto.Util.number import *
n=833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019
e=65537
p=863653476616376575308866344984576466644942572246900013156919
q=965445304326998194798282228842484732438457170595999523426901
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)

f=open("./flag.b64","r").read()
c=base64.b64decode(f)
c=bytes_to_long(c)
m=gmpy2.powmod(c,d,n)

print(long_to_bytes(m))

20.best_RSA

两个公钥文件,用在线网站解析,发现n相同,e互质,为共模攻击;两个十六进制文件,注意读取的时候要转换成数字。脚本如下:

import gmpy2
from Crypto.Util.number import *
import libnum
n1=13060424286033164731705267935214411273739909173486948413518022752305313862238166593214772698793487761875251030423516993519714215306808677724104692474199215119387725741906071553437840256786220484582884693286140537492541093086953005486704542435188521724013251087887351409946184501295224744819621937322469140771245380081663560150133162692174498642474588168444167533621259824640599530052827878558481036155222733986179487577693360697390152370901746112653758338456083440878726007229307830037808681050302990411238666727608253452573696904083133866093791985565118032742893247076947480766837941319251901579605233916076425572961
e1=117
n2=13060424286033164731705267935214411273739909173486948413518022752305313862238166593214772698793487761875251030423516993519714215306808677724104692474199215119387725741906071553437840256786220484582884693286140537492541093086953005486704542435188521724013251087887351409946184501295224744819621937322469140771245380081663560150133162692174498642474588168444167533621259824640599530052827878558481036155222733986179487577693360697390152370901746112653758338456083440878726007229307830037808681050302990411238666727608253452573696904083133866093791985565118032742893247076947480766837941319251901579605233916076425572961
e2=65537
e=gmpy2.gcdext(e1,e2)
c1=libnum.s2n(open('cipher1.txt','rb').read())
c2=libnum.s2n(open('cipher2.txt','rb').read())
c2=gmpy2.invert(c2,n2)
m=gmpy2.powmod(c1,e[1],n1)*gmpy2.powmod(c2,-e[2],n2) % n1
print(long_to_bytes(m))

注意用扩展欧几里得得出两个系数时,如果有一个是负数则要对底数进行逆操作,并将幂变成正数
得到flag:flag{interesting_rsa}

21.shanghai

恶心的古典密码,一开始去网上学如何恢复密钥,要用到字母分析,直接头大。
然后看了下别人的思路,通过去猜密钥的长度,再猜测密钥是啥,然后再猜顺序巴拉巴拉,于是知道真正的密钥是”icqvigenere”,找个在线网站跑一下vigener在线,搜索flag就有了。

做完看了一下wp,用nokeyvigener可以直接跑出来。

22.RSA_gcd

下载得到两个文件,给出了如下信息:

n1= 23220619839642624127208804329329079289273497927351564011985292026254914394833691542552890810511751239656361686073628273309390314881604580204429708461587512500636158161303419916259271078173864800267063540526943181173708108324471815782985626723198144643256432774984884880698594364583949485749575467318173034467846143380574145455195152793742611717169602237969286580028662721065495380192815175057945420182742366791661416822623915523868590710387635935179876275147056396018527260488459333051132720558953142984038635223793992651637708150494964785475065404568844039983381403909341302098773533325080910057845573898984314246089
e = 65537
c1= 9700614748413503291260966231863562117502096284616216707445276355274869086619796527618473213422509996843430296526594113572675840559345077344419098900818709577642324900405582499683604786981144099878021784567540654040833912063141709913653416394888766281465200682852378794478801329251224801006820925858507273130504236563822120838520746270280731121442839412258397191963036040553539697846535038841541209050503061001070909725806574230090246041891486506980939294245537252610944799573920844235221096956391095716111629998594075762507345430945523492775915790828078000453705320783486744734994213028476446922815870053311973844961
n2= 22642739016943309717184794898017950186520467348317322177556419830195164079827782890660385734113396507640392461790899249329899658620250506845740531699023854206947331021605746078358967885852989786535093914459120629747240179425838485974008209140597947135295304382318570454491064938082423309363452665886141604328435366646426917928023608108470382196753292656828513681562077468846105122812084765257799070754405638149508107463233633350462138751758913036373169668828888213323429656344812014480962916088695910177763839393954730732312224100718431146133548897031060554005592930347226526561939922660855047026581292571487960929911
c2= 20513108670823938405207629835395350087127287494963553421797351726233221750526355985253069487753150978011340115173042210284965521215128799369083065796356395285905154260709263197195828765397189267866348946188652752076472172155755940282615212228370367042435203584159326078238921502151083768908742480756781277358357734545694917591921150127540286087770229112383605858821811640935475859936319249757754722093551370392083736485637225052738864742947137890363135709796410008845576985297696922681043649916650599349320818901512835007050425460872675857974069927846620905981374869166202896905600343223640296138423898703137236463508

看到两个n不是很大,第一反应是分解n,发现可以分解。那么就是最简单的RSA了:

import gmpy2
from Crypto.Util.number import *
n1= 23220619839642624127208804329329079289273497927351564011985292026254914394833691542552890810511751239656361686073628273309390314881604580204429708461587512500636158161303419916259271078173864800267063540526943181173708108324471815782985626723198144643256432774984884880698594364583949485749575467318173034467846143380574145455195152793742611717169602237969286580028662721065495380192815175057945420182742366791661416822623915523868590710387635935179876275147056396018527260488459333051132720558953142984038635223793992651637708150494964785475065404568844039983381403909341302098773533325080910057845573898984314246089
e = 65537
c1= 9700614748413503291260966231863562117502096284616216707445276355274869086619796527618473213422509996843430296526594113572675840559345077344419098900818709577642324900405582499683604786981144099878021784567540654040833912063141709913653416394888766281465200682852378794478801329251224801006820925858507273130504236563822120838520746270280731121442839412258397191963036040553539697846535038841541209050503061001070909725806574230090246041891486506980939294245537252610944799573920844235221096956391095716111629998594075762507345430945523492775915790828078000453705320783486744734994213028476446922815870053311973844961
n2= 22642739016943309717184794898017950186520467348317322177556419830195164079827782890660385734113396507640392461790899249329899658620250506845740531699023854206947331021605746078358967885852989786535093914459120629747240179425838485974008209140597947135295304382318570454491064938082423309363452665886141604328435366646426917928023608108470382196753292656828513681562077468846105122812084765257799070754405638149508107463233633350462138751758913036373169668828888213323429656344812014480962916088695910177763839393954730732312224100718431146133548897031060554005592930347226526561939922660855047026581292571487960929911
c2= 20513108670823938405207629835395350087127287494963553421797351726233221750526355985253069487753150978011340115173042210284965521215128799369083065796356395285905154260709263197195828765397189267866348946188652752076472172155755940282615212228370367042435203584159326078238921502151083768908742480756781277358357734545694917591921150127540286087770229112383605858821811640935475859936319249757754722093551370392083736485637225052738864742947137890363135709796410008845576985297696922681043649916650599349320818901512835007050425460872675857974069927846620905981374869166202896905600343223640296138423898703137236463508
p1=167807411649676462546661119644113081915542378755778327057156191284453150887662343414908916953154897183613548083558919410359642450001343644814021159828724844730881111955050992398535063409828169462180970629537792676998647880110463527555034040871485964361418080481113059959410616446772218038141157051007091689351
q1=138376604533530412400239558340424700312412702699022481119357799054715877829291635290832719835033140580690053865677079316241919169166375123691917675235979462772103681398725285808551041924624882840901583892858174270714471366531758975241868470938138238307005782651296179579961869801841395682782645916848523771439
p2=163631266233712837481823088378337134151021871060275887871338250274359922218053543333532579728777813509956261662615493179160669715503833949420308311581736674332268131534602581626817039237393599222688271607325131529790640375765697832746614700483681658911753936520482383592478743093233261371451718844275762094649
q2=138376604533530412400239558340424700312412702699022481119357799054715877829291635290832719835033140580690053865677079316241919169166375123691917675235979462772103681398725285808551041924624882840901583892858174270714471366531758975241868470938138238307005782651296179579961869801841395682782645916848523771439

phi1=(p1-1)*(q1-1)
phi2=(p2-1)*(q2-1)

d1=gmpy2.invert(e,phi1)
d2=gmpy2.invert(e,phi2)

m1=gmpy2.powmod(c1,d1,n1)
m2=gmpy2.powmod(c2,d2,n2)

print(long_to_bytes(m1),long_to_bytes(m2))

得到flag:flag{336BB5172ADE227FE68BAA44FDA73F3B}

看题目中写的是gcd,那么这道题可能不是想要我们去分解它,而是利用n1和n2的公因子来解出,试了一下也可以:

import gmpy2
from Crypto.Util.number import *
n1= 23220619839642624127208804329329079289273497927351564011985292026254914394833691542552890810511751239656361686073628273309390314881604580204429708461587512500636158161303419916259271078173864800267063540526943181173708108324471815782985626723198144643256432774984884880698594364583949485749575467318173034467846143380574145455195152793742611717169602237969286580028662721065495380192815175057945420182742366791661416822623915523868590710387635935179876275147056396018527260488459333051132720558953142984038635223793992651637708150494964785475065404568844039983381403909341302098773533325080910057845573898984314246089
e = 65537
c1= 9700614748413503291260966231863562117502096284616216707445276355274869086619796527618473213422509996843430296526594113572675840559345077344419098900818709577642324900405582499683604786981144099878021784567540654040833912063141709913653416394888766281465200682852378794478801329251224801006820925858507273130504236563822120838520746270280731121442839412258397191963036040553539697846535038841541209050503061001070909725806574230090246041891486506980939294245537252610944799573920844235221096956391095716111629998594075762507345430945523492775915790828078000453705320783486744734994213028476446922815870053311973844961
n2= 22642739016943309717184794898017950186520467348317322177556419830195164079827782890660385734113396507640392461790899249329899658620250506845740531699023854206947331021605746078358967885852989786535093914459120629747240179425838485974008209140597947135295304382318570454491064938082423309363452665886141604328435366646426917928023608108470382196753292656828513681562077468846105122812084765257799070754405638149508107463233633350462138751758913036373169668828888213323429656344812014480962916088695910177763839393954730732312224100718431146133548897031060554005592930347226526561939922660855047026581292571487960929911
c2= 20513108670823938405207629835395350087127287494963553421797351726233221750526355985253069487753150978011340115173042210284965521215128799369083065796356395285905154260709263197195828765397189267866348946188652752076472172155755940282615212228370367042435203584159326078238921502151083768908742480756781277358357734545694917591921150127540286087770229112383605858821811640935475859936319249757754722093551370392083736485637225052738864742947137890363135709796410008845576985297696922681043649916650599349320818901512835007050425460872675857974069927846620905981374869166202896905600343223640296138423898703137236463508
p1=p2=gmpy2.gcd(n1,n2)
q1=n1//p1
q2=n2//p2
phi1=(p1-1)*(q1-1)
phi2=(p2-1)*(q2-1)

d1=gmpy2.invert(e,phi1)
d2=gmpy2.invert(e,phi2)

m1=gmpy2.powmod(c1,d1,n1)
m2=gmpy2.powmod(c2,d2,n2)

print(long_to_bytes(m1),long_to_bytes(m2))

24.RSA256

下载得到两个文件,gy.key给了公钥内容,用在线网站SSL在线解一下得到n和e,然后写个脚本就都得到了flag:flag{2o!9CTFECUN}

也可以用工具做,把文件丢到RsaCtfTool里,执行命令python3 RsaCtfTool.py --publickey gy.key --uncipherfile fllllllag.txt
就跑出来了在这里插入图片描述

27.Decrypt-the-Message

文件给了一首诗和一段加密的话
搜了一下诗歌加密知道这是一种加密方式,叫pome code,github上有现成的脚本 poemcodecipher,把诗、密文、脚本放到一个目录下,输入python poemcode.py poem msg,找到那句有意义的,就是flag:ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemisabcdefghijklmnopqrstu
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值