• NSSCTF CRYPTO 题解(四)


    [GWCTF 2019]babyRSA

    [GWCTF 2019]BabyRSA-CSDN博客

    下载附件,解压打开

    encrypt.py内容如下

    import hashlib
    import sympy
    from Crypto.Util.number import *

    flag = 'GWHT{******}'
    secret = '******'

    assert(len(flag) == 38)

    half = len(flag) / 2

    flag1 = flag[:half]
    flag2 = flag[half:]

    secret_num = getPrime(1024) * bytes_to_long(secret)

    p = sympy.nextprime(secret_num)
    q = sympy.nextprime(p)

    N = p * q

    e = 0x10001

    F1 = bytes_to_long(flag1)
    F2 = bytes_to_long(flag2)

    c1 = F1 + F2
    c2 = pow(F1, 3) + pow(F2, 3)
    assert(c2 < N)

    m1 = pow(c1, e, N)
    m2 = pow(c2, e, N)

    output = open('secret', 'w'
    output.write('N=' + str(N) + '\n')
    output.write('m1=' + str(m1) + '\n')
    output.write('m2=' + str(m2) + '\n')
    output.close()

    secret内容如下

    已知,e,n,m1,m2 可以求出c1,c2。

    c1 = F1 + F2

    c2 = pow(F1, 3) + pow(F2, 3)

    使用factordb.com分解n可得

    编写脚本,进行解题

    1. import gmpy2
    2. from gmpy2 import *
    3. from Crypto.Util.number import *
    4. import sympy
    5. e = 0x10001
    6. n = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
    7. m1 = 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
    8. m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
    9. # n=mpz(636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163)
    10. q = next_prime(iroot(n,2)[0])
    11. p = n//q
    12. d = gmpy2.invert(e, (q-1)*(p-1))#计算逆元
    13. c1 = gmpy2.powmod(m1,d,n)#解密
    14. c2 = gmpy2.powmod(m2,d,n)#解密
    15. #解方程组c1 = F1 + F2
    16. # c2 = pow(F1, 3) + pow(F2, 3)
    17. F1 = sympy.Symbol('F1')#方程组定义变量
    18. F2 = sympy.Symbol('F2')
    19. f1 = F1+F2-c1
    20. f2 = pow(F1,3)+pow(F2,3)-c2
    21. result = sympy.solve([f1,f2],[F1,F2])
    22. flag1 = long_to_bytes(result[0][1])
    23. flag2 = long_to_bytes(result[0][0])
    24. flag = flag1 + flag2
    25. print(flag)

    运行得到

    [LitCTF 2023]yafu (中级)

    [LitCTF 2023]yafu (中级) (素数分解)-CSDN博客

    [LitCTF 2023]yafu (中级)-CSDN博客

    下载附件,内容如下

    from Crypto.Util.number import *
    from secret import flag

    m = bytes_to_long(flag)
    n  = 1
    for i in range(15):
        n *=getPrime(32)
    e = 65537
    c = pow(m,e,n)
    print(f'n = {n}')
    print(f'c = {c}')
    '''
    n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
    c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
    '''

    题目问:你知道yafu分解吗?

    yafu是用来分解大素数的,但是没搞太懂这个东西怎么用

    使用factordb.com  对n进行分解,得到了15个因子

    求这15个数字乘积的欧拉函数再求解

    1. import gmpy2
    2. from Crypto.Util.number import long_to_bytes
    3. n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
    4. e = 65537
    5. c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
    6. p1=2151018733
    7. p2=2201440207
    8. p3=2315495107
    9. p4=2585574697
    10. p5=2719600579
    11. p6=2758708999
    12. p7=2767137487
    13. p8=2906576131
    14. p9=2923522073
    15. p10=3354884521
    16. p11=3355651511
    17. p12=3989697563
    18. p13=4021078331
    19. p14=4044505687
    20. p15=4171911923
    21. phi = (p1 - 1) * (p2 - 1) * (p3 - 1) * (p4 - 1) * (p5 - 1) * (p6 - 1) * (p7 - 1) * (p8 - 1) * (p9 - 1) * (p10 - 1) * (p11 - 1) * (p12 - 1) * (p13 - 1) * (p14 - 1) * (p15 - 1)
    22. d = gmpy2.invert(e, phi)
    23. m = pow(c, d, n)
    24. print(long_to_bytes(m))

    运行

    得到flag

    或者

    1. from Cryptodome.Util.number import *
    2. import libnum
    3. from gmpy2 import gmpy2
    4. e = 65537
    5. n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307
    6. c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717
    7. f_list=libnum.factorize(n)
    8. print(f_list)
    9. phi=1
    10. for f in f_list:
    11. phi*=(f-1)*f**(f_list[f]-1)
    12. d=gmpy2.invert(e,phi)
    13. print(long_to_bytes(pow(c,d,n)))

    也可以得到flag

    [CISCN 2021初赛]rsa

    密码CTF_[swpuctf 2021 新生赛]crypto7-CSDN博客

    [山海关crypto 训练营 day9]_rsa高位泄露-CSDN博客

    下载附件,解压打开

    chall.py内容如下

    from flag import text,flag
    import md5
    from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrime

    assert md5.new(text).hexdigest() == flag[6:-1]

    msg1 = text[:xx]
    msg2 = text[xx:yy]
    msg3 = text[yy:]

    msg1 = bytes_to_long(msg1)
    msg2 = bytes_to_long(msg2)
    msg3 = bytes_to_long(msg3)

    p1 = getPrime(512)
    q1 = getPrime(512)
    N1 = p1*q1
    e1 = 3
    print pow(msg1,e1,N1)
    print (e1,N1)

    p2 = getPrime(512)
    q2 = getPrime(512)
    N2 = p2*q2
    e2 = 17
    e3 = 65537
    print pow(msg2,e2,N2)
    print pow(msg2,e3,N2)
    print (e2,N2)
    print (e3,N2)

    p3 = getPrime(512)
    q3 = getPrime(512)
    N3 = p3*q3
    print pow(msg3,e3,N3)
    print (e3,N3)
    print p3>>200

    这题全程看大佬的wp解的

    flag如下

    3943e8843a19149497956901e5d98639

    [LitCTF 2023]factordb (中级)

    下载打开附件,内容如下

    e = 65537
    n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
    c = 87677652386897749300638591365341016390128692783949277305987828177045932576708

    大整数n分解

    得到

    p=275127860351348928173285174381581152299 q=319576316814478949870590164193048041239

    编写脚本

    1. from gmpy2 import *
    2. from Crypto.Util.number import *
    3. e = 65537
    4. n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
    5. c = 87677652386897749300638591365341016390128692783949277305987828177045932576708
    6. p=275127860351348928173285174381581152299
    7. q=319576316814478949870590164193048041239
    8. phi=(q-1)*(p-1)
    9. d=gmpy2.invert(e,(p-1)*(q-1))
    10. m=pow(c,d,n)
    11. print(long_to_bytes(m))

    运行后得到flag

    [LitCTF 2023]P_Leak

    下载附件,内容如下

    from Crypto.Util.number import *
    e=65537
    m=bytes_to_long(b'xxxx')
    p=getPrime(512)
    q=getPrime(512)
    n=p*q
    phi=(p-1)*(q-1)
    d=inverse(e,phi)
    dp=d%(p-1)
    c=pow(m,e,n)
    print("dp=",dp)
    print("n=",n)
    print("c=",c)
    #dp= 5892502924236878675675338970704766304539618343869489297045857272605067962848952532606770917225218534430490745895652561015493032055636004130931491316020329
    #n= 50612159190225619689404794427464916374543237300894011803225784470008992781409447214236779975896311093686413491163221778479739252804271270231391599602217675895446538524670610623369953168412236472302812808639218392319634397138871387898452935081756580084070333246950840091192420542761507705395568904875746222477
    #c= 39257649468514605476432946851710016346016992413796229928386230062780829495844059368939749930876895443279723032641876662714088329296631207594999580050131450251288839714711436117326769029649419789323982613380617840218087161435260837263996287628129307328857086987521821533565738409794866606381789730458247531619
     

    代码审计,给了dp,分解n

    脚本如下:

    1. dp= 5892502924236878675675338970704766304539618343869489297045857272605067962848952532606770917225218534430490745895652561015493032055636004130931491316020329
    2. n= 50612159190225619689404794427464916374543237300894011803225784470008992781409447214236779975896311093686413491163221778479739252804271270231391599602217675895446538524670610623369953168412236472302812808639218392319634397138871387898452935081756580084070333246950840091192420542761507705395568904875746222477
    3. c= 39257649468514605476432946851710016346016992413796229928386230062780829495844059368939749930876895443279723032641876662714088329296631207594999580050131450251288839714711436117326769029649419789323982613380617840218087161435260837263996287628129307328857086987521821533565738409794866606381789730458247531619
    4. def known_dp_e_n_get_p(dp, e, n):
    5. for i in range(1, e):
    6. if (dp*e-1)%i == 0:
    7. if n%(((dp*e-1)//i)+1) == 0:
    8. p = ((dp*e-1)//i)+1
    9. print(i, p)
    10. return p
    11. p = known_dp_e_n_get_p(dp, e, n)
    12. q = n//p
    13. phi=(p-1)*(q-1)
    14. d=inverse(e,phi)
    15. m = pow(c,d,n)
    16. long_to_bytes(m)

    运行后,可以得到flag

    关于dp泄露的一些知识点

    [HUBUCTF 2022 新生赛]RSAaaa

    [HUBUCTF 2022 新生赛]RSAaaa-CSDN博客

    下载附件,内容如下

    就你小子是黑客?
    我忘记怎么解密了!
    靠你了,大黑阔!

    (536970330703, 65537)
    message: 473878130775 40132555282 40132555282 94619939727 72818765591 208015808884 42561234694 159353248388 27748063975 159353248388 159353248388 278953790403 410746718603 496849210942 27748063975 142521857906 103632267191 17774494147 328684046745 278953790403 129956887006 129956887006 366275425558 328684046745 142521857906 410746718603 142521857906 129956887006 379067009467 328684046745 159353248388 366275425558 129956887006 103632267191 27748063975 27748063975 17774494147 160623996897 278953790403 182341799525

    观察附件,题目给了n,e,以及40个c的值

    模仿大佬编写的脚本

    1. import gmpy2
    2. from Crypto.Util.number import *
    3. from binascii import a2b_hex, b2a_hex
    4. import binascii
    5. c_list = ['473878130775', '40132555282', '40132555282', '94619939727', '72818765591', '208015808884', '42561234694', '159353248388', '27748063975', '159353248388', '159353248388', '278953790403', '410746718603', '496849210942', '27748063975', '142521857906', '103632267191', '17774494147', '328684046745', '278953790403',
    6. '129956887006', '129956887006', '366275425558', '328684046745', '142521857906', '410746718603', '142521857906', '129956887006', '379067009467', '328684046745', '159353248388', '366275425558', '129956887006', '103632267191', '27748063975', '27748063975', '17774494147', '160623996897', '278953790403', '182341799525']
    7. for i in range(len(c_list)):
    8. e = 65537
    9. # c = 473878130775
    10. # 1.将n分解为p和q
    11. p = 992623
    12. q = 540961
    13. n = p * q
    14. phi = (p - 1) * (q - 1)
    15. # 2.求d
    16. d = gmpy2.invert(e, phi)
    17. # 3.m=pow(c,d,n)
    18. m = gmpy2.powmod(int(c_list[i]), d, n)
    19. print(chr(m), end="")
    20. # binascii.unhexlify(hexstr):从十六进制字符串hexstr返回二进制数据

    运行后得到flag

    [NISACTF 2022]sign_crypto

    [NISACTF 2022]sign_crypto_n,e,sign crypto解密-CSDN博客

    提示为:flag为大写

    下载附件,得到一张图片如下

    搜索了wp才知道,是LaTeX符号,可以根据LaTeX表进行解密Latex常见符号对照表_latex冒号-CSDN博客

    也可以利用这个网站进行解密在线LaTeX公式编辑器-编辑器 (latexlive.com)

    在{ }中取每个字段的首字母

    注意为大写字母

    获得flag:NSSCTF{EDIT_WITH_LATEX}

    [RoarCTF 2019]babyRSA

    下载附件,内容如下

    import sympy
    import random

    def myGetPrime():
        A= getPrime(513)
        print(A)
        B=A-random.randint(1e3,1e5)
        print(B)
        return sympy.nextPrime((B!)%A)
    p=myGetPrime()
    #A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
    #B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596

    q=myGetPrime()
    #A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
    #B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026

    r=myGetPrime()

    n=p*q*r
    #n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
    c=pow(flag,e,n)
    #e=0x1001
    #c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
    #so,what is the flag?

    B!%A,威尔逊定理:威尔逊定理-CSDN博客

    (A−1)!≡−1(modA)

    (A−2)!≡1(modA)

    脚本如下

    1. from Cryptodome.Util.number import long_to_bytes
    2. from gmpy2 import *
    3. from sympy import nextprime
    4. def get_p_q(A,B):
    5. tmp = 1
    6. for i in range(B+1,A-1):
    7. tmp *= i
    8. tmp %= A
    9. tmp_inv = invert(tmp,A)
    10. result = nextprime(tmp_inv)
    11. print(result)
    12. return result
    13. A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
    14. B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
    15. A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
    16. B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
    17. n = 85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
    18. e = 0x1001
    19. c = 75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
    20. p = get_p_q(A1,B1)
    21. q = get_p_q(A2,B2)
    22. r = n // p // q
    23. phi = (p - 1) * (q - 1) * (r - 1)
    24. d = invert(e, phi)
    25. print(long_to_bytes(powmod(c, d, n)))

    [RoarCTF 2019]RSA

    [RoarCTF2019]RSA_[roarctf 2019]rsa-CSDN博客

    下载附件,内容如下

    A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
    p=next_prime(z*x*y)
    q=next_prime(z)
    A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
    n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
    c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128

    题目给的n很大,直接把它放到网站上去分解

    factordb.com

    使用大佬的脚本,爆破e,并得到flag

    1. import gmpy2
    2. import libnum
    3. import sympy
    4. A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
    5. n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
    6. c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
    7. p=842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
    8. q=139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183
    9. phi=(p-1)*(q-1)
    10. # 爆破e
    11. for e in range(100000):
    12. if(gmpy2.gcd(e,phi)==1):
    13. d=gmpy2.invert(e,phi)
    14. m=pow(c,d,n)
    15. flag=libnum.n2s(int(m))
    16. if('CTF' in str(flag)):
    17. print(flag)
    18. break

    运行后得到flag

    [NCTF 2019]childRSA

    [NCTF2019]childRSA(费马定理)-CSDN博客

    下载附件,内容如下

    from random import choice
    from Crypto.Util.number import isPrime, sieve_base as primes
    from flag import flag


    def getPrime(bits):
        while True:
            n = 2
            while n.bit_length() < bits:
                n *= choice(primes)
            if isPrime(n + 1):
                return n + 1

    e = 0x10001
    m = int.from_bytes(flag.encode(), 'big')
    p, q = [getPrime(2048) for _ in range(2)]
    n = p * q
    c = pow(m, e, n)

    # n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
    # c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108

    费马小定理   费马小定理详解-CSDN博客

    脚本如下

    1. from Crypto.Util.number import isPrime, sieve_base as primes,long_to_bytes
    2. import gmpy2
    3. e = 65537
    4. n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
    5. c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
    6. num=1
    7. for i in primes:
    8. num*=i
    9. p=gmpy2.gcd(gmpy2.powmod(2,num,n)-1,n)
    10. q=n//p
    11. d=gmpy2.invert(e,(p-1)*(q-1))
    12. m=gmpy2.powmod(c,d,n)
    13. print(long_to_bytes(m))

    运行得到flag

    [黑盾杯 2020]Factor

    [黑盾杯 2020]Factor(分解素数)-CSDN博客

    下载附件,解压打开,内容如下

    n = 3454083680130687060405946528826790951695785465926614724373
    e = 3
    c = 1347530713288996422676156069761604101177635382955634367208
    gcd(m, n) = 1

    n比较小,可以直接分解n

    编写脚本如下

    1. from gmpy2 import *
    2. from Cryptodome.Util.number import *
    3. n = 3454083680130687060405946528826790951695785465926614724373
    4. e = 3
    5. c = 1347530713288996422676156069761604101177635382955634367208
    6. # 对n进行分解,然后取与e互质的因数,得到新的phi和n。然后求得私钥和m
    7. p = [17172929050033177661, 11761833764528579549, 17100682436035561357]
    8. phi = 1
    9. n = 1
    10. for i in p:
    11. if gcd(e, i - 1) == 1:
    12. print(i)
    13. print(i-1)
    14. phi *= i - 1
    15. print(phi)
    16. n *= i
    17. d = invert(e, phi)
    18. print(long_to_bytes(powmod(c, d, n)))

    运行得到flag

    [HDCTF 2023]Normal_Rsa(revenge)

    [HDCTF 2023]Normal_Rsa(revenge)(素数分解)-CSDN博客

    确定吗?

    下载附件,打开得到内容如下

    脚本如下

    1. import gmpy2
    2. from Cryptodome.Util.number import *
    3. P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
    4. Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
    5. n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
    6. c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
    7. e=0x10001
    8. p=gmpy2.iroot(P,2)[0]
    9. q=gmpy2.iroot(Q,2)[0]
    10. r=n//q//p
    11. phi=(p-1)*(q-1)*(r-1)
    12. d = gmpy2.invert(e, phi)
    13. m = pow(c,d,n)
    14. print(long_to_bytes(m))

    运行后,可以得到flag

    [LitCTF 2023]e的学问

    下载打开附件,内容如下

    from Crypto.Util.number import *
    m=bytes_to_long(b'xxxxxx')
    p=getPrime(256)
    q=getPrime(256)
    e=74
    n=p*q
    c=pow(m,e,n)
    print("p=",p)
    print("q=",q)
    print("c=",c)
    #p= 86053582917386343422567174764040471033234388106968488834872953625339458483149
    #q= 72031998384560188060716696553519973198388628004850270102102972862328770104493
    #c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
     

    e是偶数与phi互质,可以找到e与phi的最大公因数s,然后让e除以s,再正常解rsa,只不过得到的不是m而是m的s次幂,

    1. from Crypto.Util.number import *
    2. from gmpy2 import *
    3. p = 86053582917386343422567174764040471033234388106968488834872953625339458483149
    4. q = 72031998384560188060716696553519973198388628004850270102102972862328770104493
    5. c = 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
    6. n = p * q
    7. e = 74
    8. phi = (p - 1) * (q - 1)
    9. s = gcd(e, phi)
    10. d = inverse(e // s, phi)
    11. m = powmod(c, d, n)
    12. m1 = iroot(m, s)
    13. print(long_to_bytes(m1[0]))

    运行后,得到flag

    [HNCTF 2022 Week1]baBAbaseSEse

    bases

    下载得到附件,内容如下

    BlS0*r4qV&kRo7dh=NuQ+,*0..?ijiJ5L\%>sY13yoQz?wMA6r\X\3W1bWlCTG]XM_t|U4/YUC:hpfL}<)'8n,[dPB\T=Yd>\,SGYOowHIFx?oZnbhy!WeXWIkR[&R*_saYcoz943\somf'rJTtkn}d|=w$Mv?87DsiMV9dyDxkWd:^$KYRmXj5D3s[Sb+Eake@>7;hK[jJN53Z]%v)B

    base92解码CTF在线工具-在线base92编码|在线base92解码|base92编码|base92解码 (hiencode.com)

    base91解码

    BASE91编码解码 - Bugku CTF

    使用在线工具:CyberChef

    BASE85解码

    BASE64解码

    BASE32解码

    BASE16解码

    得到flag

    [HGAME 2022 week2]RSA Attack2

    2022年HGAME中CRYPTO的RSA Attack2_rsa task.py-CSDN博客

    week4-CSDN博客

    下载解压,打开附件

    task.py内容如下

    import re
    from math import ceil
    from Crypto.Util.number import getPrime
    from libnum import s2n
    from secret import flag

    flag_parts = list(map(s2n, re.findall(rf".{{,{ceil(len(flag) / 3)}}}", flag)))

    print("# task1")
    m = flag_parts[0]
    e = 65537
    p = getPrime(1024)
    q = getPrime(1024)
    r = getPrime(1024)
    n1 = p * q
    c1 = pow(m, e, n1)
    n2 = r * q
    c2 = pow(m, e, n2)
    print("e =", e)
    print("n1 =", n1)
    print("c1 =", c1)
    print("n2 =", n2)
    print("c2 =", c2)

    print("# task2")
    m = flag_parts[1]
    e = 7
    p = getPrime(1024)
    q = getPrime(1024)
    n = p * q
    c = pow(m, e, n)
    print("e =", e)
    print("n =", n)
    print("c =", c)

    print("# task3")
    m = flag_parts[2]
    p = getPrime(1024)
    q = getPrime(1024)
    n = p * q
    e1 = getPrime(32)
    e2 = getPrime(32)
    c1 = pow(m, e1, n)
    c2 = pow(m, e2, n)
    print("n =", n)
    print("e1 =", e1)
    print("c1 =", c1)
    print("e2 =", e2)
    print("c2 =", c2)

    output.txt内容如下

    代码审计

    flag_parts = list(map(s2n, re.findall(rf".{{,{ceil(len(flag) / 3)}}}", flag)))

    将flag切割成了长度差不多的三部分,还对三部分分别加密

    tsak1:欧几里得算法

    task2:低加密指数攻击

    task3:共模攻击

    大佬编写的脚本如下

    1. from Crypto.Util.number import *
    2. import gmpy2
    3. # task1
    4. e = 65537
    5. n1 = 14611545605107950827581005165327694782823188603151768169731431418361306231114985037775917461433925308054396970809690804073985835376464629860609710292181368600618626590498491850404503443414241455487304448344892337877422465715709154238653505141605904184985311873763495761345722155289457889686019746663293720106874227323699288277794292208957172446523420596391114891559537811029473150123641624108103676516754449492805126642552751278309634846777636042114135990516245907517377320190091400729277307636724890592155256437996566160995456743018225013851937593886086129131351582958811003596445806061492952513851932238563627194553
    6. c1 = 965075803554932988664271816439183802328812013694203741320763105376036912584995031647672348468111310423680858101990670067065306237596121664884353679987689532305437801346923070145524106271337770666947677115752724993307387122132705797012726237073550669419110046308257408484535063515678066777681017211510981429273346928022971149411064556225001287399141306136081722471075032423079692908380267160214143720516748000734987068685104675254411687005690312116824966036851568223828884335112144637268090397158532937141122654075952730052331573980701136378212002956719295192733955673315234274064519957670199895100508623561838510479
    7. n2 = 20937478725109983803079185450449616567464596961348727453817249035110047585580142823551289577145958127121586792878509386085178452171112455890429474457797219202827030884262273061334752493496797935346631509806685589179618367453992749753318273834113016237120686880514110415113673431170488958730203963489455418967544128619234394915820392908422974075932751838012185542968842691824203206517795693893863945100661940988455695923511777306566419373394091907349431686646485516325575494902682337518438042711296437513221448397034813099279203955535025939120139680604495486980765910892438284945450733375156933863150808369796830892363
    8. c2 = 11536506945313747180442473461658912307154460869003392732178457643224057969838224601059836860883718459986003106970375778443725748607085620938787714081321315817144414115589952237492448483438910378865359239575169326116668030463275817609827626048962304593324479546453471881099976644410889657248346038986836461779780183411686260756776711720577053319504691373550107525296560936467435283812493396486678178020292433365898032597027338876045182743492831814175673834198345337514065596396477709839868387265840430322983945906464646824470437783271607499089791869398590557314713094674208261761299894705772513440948139429011425948090
    9. # task2
    10. ee = 7
    11. nn = 14157878492255346300993349653813018105991884577529909522555551468374307942096214964604172734381913051273745228293930832314483466922529240958994897697475939867025561348042725919663546949015024693952641936481841552751484604123097148071800416608762258562797116583678332832015617217745966495992049762530373531163821979627361200921544223578170718741348242012164115593777700903954409103110092921578821048933346893212805071682235575813724113978341592885957767377587492202740185970828629767501662195356276862585025913615910839679860669917255271734413865211340126544199760628445054131661484184876679626946360753009512634349537
    12. cc = 10262871020519116406312674685238364023536657841034751572844570983750295909492149101500869806418603732181350082576447594766587572350246675445508931577670158295558641219582729345581697448231116318080456112516700717984731655900726388185866905989088504004805024490513718243036445638662260558477697146032055765285263446084259814560197549018044099935158351931885157616527235283229066145390964094929007056946332051364474528453970904251050605631514869007890625
    13. # task3
    14. n = 18819509188106230363444813350468162056164434642729404632983082518225388069544777374544142317612858448345344137372222988033366528086236635213756227816610865045924357232188768913642158448603346330462535696121739622702200540344105464126695432011739181531217582949804939555720700457350512898322376591813135311921904580338340203569582681889243452495363849558955947124975293736509426400460083981078846138740050634906824438689712748324336878791622676974341814691041262280604277357889892211717124319329666052810029131172229930723477981468761369516771720250571713027972064974999802168017946274736383148001865929719248159075729
    15. e11 = 2519901323
    16. c11 = 3230779726225544872531441169009307072073754578761888387983403206364548451496736513905460381907928107310030086346589351105809028599650303539607581407627819797944337398601400510560992462455048451326593993595089800150342999021874734748066692962362650540036002073748766509347649818139304363914083879918929873577706323599628031618641793074018304521243460487551364823299685052518852685706687800209505277426869140051056996242882132616256695188870782634310362973153766698286258946896866396670872451803114280846709572779780558482223393759475999103607704510618332253710503857561025613632592682931552228150171423846203875344870
    17. e22 = 3676335737
    18. c22 = 940818595622279161439836719641707846790294650888799822335007385854166736459283129434769062995122371073636785371800857633841379139761091890426137981113087519934854663776695944489430385663011713917022574342380155718317794204988626116362865144125136624722782309455452257758808172415884403909840651554485364309237853885251876941477098008690389600544398998669635962495989736021020715396415375890720335697504837045188626103142204474942751410819466379437091569610294575687793060945525108986660851277475079994466474859114092643797418927645726430175928247476884879817034346652560116597965191204061051401916282814886688467861
    19. #task1
    20. p = gmpy2.gcd(n1,n2) # 欧几里得算法
    21. q = n1 // p
    22. phi = (p-1)*(q-1)
    23. d = gmpy2.invert(e,phi)
    24. m = gmpy2.powmod(c1,d,n1)
    25. m1 = long_to_bytes(m)
    26. #task2
    27. k = 0
    28. while 1:
    29. res = gmpy2.iroot(cc+k*nn,ee) #c+k*n 开3次方根 能开3次方即可
    30. if(res[1] == True):
    31. m2=long_to_bytes(res[0]) #转为字符串
    32. break
    33. k=k+1
    34. #task3
    35. import gmpy2
    36. def rsa_gong_N_def(e1,e2,c1,c2,n):
    37. e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n)
    38. # print("e1,e2:",e1,e2)
    39. # print(gmpy2.gcd(e1,e2))
    40. s = gmpy2.gcdext(e1, e2)
    41. # print(s)
    42. s1 = s[1]
    43. s2 = s[2]
    44. if s1 < 0:
    45. s1 = - s1
    46. c1 = gmpy2.invert(c1, n)
    47. elif s2 < 0:
    48. s2 = - s2
    49. c2 = gmpy2.invert(c2, n)
    50. m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
    51. return long_to_bytes(int(m))
    52. m3 = rsa_gong_N_def(e11,e22,c11,c22,n)
    53. print(m1+m2+m3)

    运行后可以得到flag

     
    

  • 相关阅读:
    无人机/飞控--ArduPilot、PX4学习记录(4)
    数据结构之二叉树
    基于python实现Web自动化测试(selenium)、API自动化测试(requests)&附学习视频
    Element UI 日期组件自定义可选范围
    【构建并发程序】7-如何理解并发队列?
    数据链路层-概述
    指针进阶(三)之指针与数组笔试题
    Vue Webpack介绍及安装
    kafka增加磁盘或者分区,topic重分区
    SAP,ABAP:ALV变式复制
  • 原文地址:https://blog.csdn.net/2301_81105268/article/details/139363177