c = int(0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e) e = int(0x872a335) a =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586 b = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
gift = gmpy2.gcd(a, b) p = b // gift q = a // (1+p**3) n = p * q phi = (p - 1) * (q - 1) d = pow(e, -1, phi)
m = pow(c, d, n) print(long_to_bytes(m))
[SWPUCTF 2021 新生赛]crypto4
由题可知,p 和 q非常接近,这适用于费马定理
直接将n开平方再取附近质数,判断相乘是否等于n就可以求出p和q
1 2 3 4 5 6 7 8 9 10
import gmpy2 n = 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153
p = q = 0
if n != p * q: q = gmpy2.next_prime(gmpy2.iroot(n, 2)[0]) p = n // q print('p = ', p) print('q = ', q)
求出了p和q接下来就是正常流程,最终payload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import * import gmpy2
flag = 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243 n = 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153
e = 65537 q = gmpy2.next_prime(gmpy2.iroot(n, 2)[0]) p = n // q
n_ = (p - 1) * (q - 1) d = pow(e, -1, n_) m = pow(flag, d, n) print(long_to_bytes(m))
[羊城杯 2021]Bigrsa
打开附件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from Crypto.Util.number import * from flag import *
n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 m = bytes_to_long(flag) c = pow(m, e, n1) c = pow(c, e, n2)
print("c = %d" % c)
# output # c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264