zoukankan      html  css  js  c++  java
  • RoarCTF2019 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?
    

    分析

    1. 从代码中可以知道:

    [p=(B1!)\%A1 ]

    [q=(B2!)\%A2 ]

    1. 又由威尔逊定理知道,

    [(A-1)!equiv -1 mod A ]

    1. 而B=A-random.randint(1e3,1e5),所以在B的前面补上

    [(A-1)(A-2)(A-3)...(B+1) ]

    就有

    [(A-1)(A-2)(A-3)...(B+1)*(B!)\%A=-1\%A ]

    于是再整理一下又有

    [(A-2)(A-3)...(B+1)*(B!)\%A=1\%A ]

    这就意味这可由((A-2)(A-3)...(B+1))模A的逆元求得((B!)\%A)的值。再取nextprime(sympy.ntheory.generate模块里的nextprime不是nextPrime)即可得到p或q的值。

    from sympy import nextprime
    from Crypto.Util.number import *
    from gmpy2 import invert
    
    def get_p_q(A,B):
        tmp = 1
        # calculate remain value (mod A) of (A−1)(A−2)(A−3)...(B+1)
        for i in range(B+1,A-1):
            tmp *= i
            tmp %= A
    
        tmp_inv = invert(tmp,A)
        result = nextprime(tmp_inv)
        return result
    
    A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
    B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
    
    A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
    B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
    
    n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
    e=0x1001
    c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
    
    p = get_p_q(A1,B1)
    q = get_p_q(A2,B2)
    print(p)
    print(q)
    # p = 1276519424397216455160791032620569392845781005616561979809403385593761615670426423039762716291920053306063214548359656555809123127361539475238435285654851
    # q = 13242175493583584108411324143773780862426183382017753129633978933213674770487765387985282956574197274056162861584407275172775868763712231230219112670015751
    
    r = n // p // q
    print(r)
    # r = 5057572094237208127867754008134739503717927865750318894982404287656747895573075881186030840558129423864679886646066477437020450654848839861455661385205433
    
    phn = (p - 1) * (q - 1) * (r - 1)
    d = invert(e, phn)
    print(d)
    # d = 23245991568931089935575398139533179902151911325504278186895368123724684132878362590745372016987963378102056924287587028702166372731411906405181410326380814220943063812165970658883369631308421395770179828382024820676516261188276456737434776404340381374859304944884947772697915445301641449023374627214573292539161320959779418043275889202421521069705878414823578781441160766914068377017428380775625886023385019623499784980822629415795884228504498888092721097658433
    m = pow(c,d,n)
    print(m)
    # 49562188096458630410563044417358818341913265571373725266976612126526106528404944745044614126232074073813936259453
    print(long_to_bytes(m))
    

    RoarCTF{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}

  • 相关阅读:
    [React Testing] Intro to Shallow Rendering
    人物-IT-马化腾:马化腾
    人物-IT-雷军:雷军
    Less:Less(CSS预处理语言)
    文学-谚语-英文谚语:英文谚语
    文明-墓-太阳墓:太阳墓
    地理-撒哈拉之眼:撒哈拉之眼
    生物-海底人:海底人
    地理-蓝洞:蓝洞
    文明-根达亚文明:根达亚文明
  • 原文地址:https://www.cnblogs.com/vict0r/p/13563073.html
Copyright © 2011-2022 走看看