mysql 学习之基础架构

显示字符串如何避免出现方框

  返回  

BUU-RSA [RoarCTF2019]babyRSA(威尔逊定理)

2021/7/21 19:44:09 浏览:

[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?

解题思路

这道题求解的重点在sympy.nextPrime((B!)%A)

因为A和B题目都给我们了,所以难点就在于求B的阶乘的模,而B又很大,计算阶乘不大现实

好在有一个定理可以解决这个问题,即威尔逊定理

威尔逊定理

当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )

借助此定理,各个参数都可以计算出来

例如,p = sympy.nextPrime((B1!)%A1)

由威尔逊定理,( A1 -1 )! ≡ -1 ( mod A1 )

即B1! * k = ≡ -1 ( mod A1 ),其中k = (A1-1)! / (B1)!,也就是B1之后的数字之积

两边同时乘上k的逆元,B1! = -k-1 (mod A1)

从而可计算p = sympy.nextPrime((B1!)%A1)

还有一点需要注意,这里模数n由三个素数p, q, r相乘得到,但是类似的,其欧拉函数phi(n) = (p-1)(q-1)(r-1)

附上代码

import gmpy2
import sympy
import binascii
#p = sympy.nextPrime((B!)%A)
def getPrime(A, B):
    k = 1
    for i in range(B+1, A):
        k = (k*i) % A
    res = (-gmpy2.invert(k, A)) % A
    return sympy.nextprime(res)
    
if __name__ == '__main__':
    A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
    B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
    A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
    B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
    n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
    e=0x1001
    c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
    p = getPrime(A1, B1)
    q = getPrime(A2, B2)
    r = n//(p*q)
    d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
    m = gmpy2.powmod(c, d, n)
    flag = binascii.unhexlify(hex(m)[2:])
    print(flag)

运行结果

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

flag

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

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号