记5道RSA

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

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

通过invert函数,一步步将A推成B

import gmpy2
import sympy
import libnum
def wilson(A,B):
	t=A-B-1
	res=-1
	k=A-1
	for i in range(t):
		res=(res*gmpy2.invert(k,A))%A
		k=k-1
	if(res<0):
		return res+A
	else:
		return res
n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
e=0x1001
c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
p=sympy.nextprime(wilson(A1,B1))
q=sympy.nextprime(wilson(A2,B2))
r=n//p//q
phi=(p-1)*(q-1)*(r-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(libnum.n2s(m))
#RoarCTF{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}

或者

	tmp = 1
    for i in range (B+1,A-1):   
        tmp *= i
        tmp %= A
    a = gmpy2.invert(tmp,A)
    result = sympy.nextprime(a)

[NPUCTF2020]共 模 攻 击

hint.py

from gmpy2 import *
from Crypto.Util.number import *
from secret import hint

m = bytes_to_long(hint)
p = getPrime(256)
c = pow(m, 256, p)
print(p)

p, q = getPrime(256), getPrime(256)
n = p * q
e1, e2 = getPrime(32), getPrime(32)
c1, c2 = pow(c, e1, n), pow(c, e2, n)
print(n)
print(e1, c1)
print(e2, c2)

'''
107316975771284342108362954945096489708900302633734520943905283655283318535709
6807492006219935335233722232024809784434293293172317282814978688931711423939629682224374870233587969960713638310068784415474535033780772766171320461281579
2303413961 1754421169036191391717309256938035960912941109206872374826444526733030696056821731708193270151759843780894750696642659795452787547355043345348714129217723
2622163991 1613454015951555289711148366977297613624544025937559371784736059448454437652633847111272619248126613500028992813732842041018588707201458398726700828844249
'''

c = m^256 mod p
m = nthroot_mod(c, 256, p)

from gmpy2 import *
from libnum import *
from sympy import nthroot_mod
e1 = 2303413961
e2 = 2622163991
n = 6807492006219935335233722232024809784434293293172317282814978688931711423939629682224374870233587969960713638310068784415474535033780772766171320461281579
c1 = 1754421169036191391717309256938035960912941109206872374826444526733030696056821731708193270151759843780894750696642659795452787547355043345348714129217723
c2 = 1613454015951555289711148366977297613624544025937559371784736059448454437652633847111272619248126613500028992813732842041018588707201458398726700828844249
p = 107316975771284342108362954945096489708900302633734520943905283655283318535709
s = gcdext(e1, e2)
s1 = s[1]
s2 = s[2]
# 求模反元素
if s1 < 0:
  s1 = - s1
  c1 = invert(c1, n)
elif s2<0:
  s2 = - s2
  c2 = invert(c2, n)
c = pow(c1,s1,n) * pow(c2,s2,n) % n
print(n2s(nthroot_mod(c, 256, p)))
# m.bit_length() < 400

Coppersmith定理:在一个e阶的mod n多项式f(x)中,如果有一个根小于n^1/e,就可以运用一个O(log n)的算法求出这些根。

c1 = mp mod n = mp mod p*q

c2 = mq mod n = mq mod p*q

因为p、q为素数,所以由费马定理可得:

mp ≡ m mod p

mq ≡ m mod q

所以,又有:

c1 = m + ip + xpq,可整理成 c1 = m + ip

c2 = m + jq + ypq,可整理成 c2 = m + jq

因此:

c1 * c2 = m2 + (ip + jq)m + ijn

(c1 + c2)m = 2m2 + (ip+jq)m

有: m2 - (c1 + c2)m + c1 * c2 = ijn ≡ 0 mod n

n = 128205304743751985889679351195836799434324346996129753896234917982647254577214018524580290192396070591032007818847697193260130051396080104704981594190602854241936777324431673564677900773992273463534717009587530152480725448774018550562603894883079711995434332008363470321069097619786793617099517770260029108149
c1 = 96860654235275202217368130195089839608037558388884522737500611121271571335123981588807994043800468529002147570655597610639680977780779494880330669466389788497046710319213376228391138021976388925171307760030058456934898771589435836261317283743951614505136840364638706914424433566782044926111639955612412134198
c2 = 9566853166416448316408476072940703716510748416699965603380497338943730666656667456274146023583837768495637484138572090891246105018219222267465595710692705776272469703739932909158740030049375350999465338363044226512016686534246611049299981674236577960786526527933966681954486377462298197949323271904405241585
a = c1 + c2
b = c1 * c2
P.<x> = PolynomialRing(Zmod(n))
f = x^2 - a * x + b
flag = f.small_roots(X=2^400)
print(flag)
# 4242839043019782000788118887372132807371568279472499477998758466224002905442227156537788110520335652385855
print(n2s(4242839043019782000788118887372132807371568279472499477998758466224002905442227156537788110520335652385855))
# verrrrrrry_345yyyyyyy_rsaaaaaaa_righttttttt?

[NCTF2019]easyRSA

from flag import flag

e = 0x1337
p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059
q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741
n = p * q

assert(flag.startswith('NCTF'))
m = int.from_bytes(flag.encode(), 'big')
assert(m.bit_length() > 1337)

c = pow(m, e, n)
print(c)
# 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359

e是φ(n)的一个因子,无法求出私钥d

from gmpy2 import *
from Crypto.Util.number import *
from tqdm import tqdm
def onemod(p,r):
    t = p-2
    while pow(t, (p-1) // r, p) == 1: t -= 1
    return pow(t, (p-1) // r, p)
def solution(p,root): 
    g = onemod(p, 0x1337)
    may = []
    for i in range(0x1337):
        if i % 100 == 0:
            print(i)
        may.append(root * pow(g,i,p) % p)
    return may
c = 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359
p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059
q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741
e = 0x1337
n = p * q
c_p = pow(c, (1 + 3307 * (p - 1) // e) // e, p)
C1 = solution(p, c_p)
c_q = pow(c, (1 + (2649 * (q - 1) // e)) // e, q)
C2 = solution(q, c_q)
a = invert(p, q)
b = invert(q, p)
flag=0
for i in tqdm(C1):
    for j in tqdm(C2):
        flag += 1
        if flag % 1000000 == 0:
            print(flag)
        x = (b * q * i + a * p * j) % n
        if b"NCTF{" in long_to_bytes(x):
            print(long_to_bytes(x))
            exit()

[DJBCTF]RealSimpleAlgorithm

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

def findPrime(k):
	return k if isPrime(k) else findPrime(k+1)
	
p = getPrime(256)
q = findPrime(20210123 * p * p)
r = findPrime(p * q * q)
s = findPrime(p * q * r)
n = p * q * r * s
e = 0x10001
m = bytes_to_long(flag)

w = open('output','wb')
w.write(long_to_bytes(n))
w.write(b'\n\n')
w.write(long_to_bytes(pow(m, e, n)))

猜想n约等于20210123的6次方乘上p的16次方

from gmpy2 import *
from libnum import *
from Crypto.Util.number import *
def findPrime(k):
	return k if isPrime(k) else findPrime(k+1)
n = s2n(b'\x14r\xa6\xc3\xc1\xd1\xcd\xbf\xe7m8Q\x19*\xb5\x8f~\xd9\x08iD\xc6W\xca)_4\xd8tR\xd0_\xfd\xfb\xcb\xb1\x9cRc\xff\x18\x93\x8b\x1f\xe3\x07\xfe\xe2\xa1\x8d\xfa\xe4D\xe1qv]\xc3\x8808as\n\xac8S\xb7\xe1\x1b*\xde\xf5\x16\x02\xecv\xe2\x83*\x89g\x17\x9f\xe5\xe2U,\xb1\x94+\x17\xf0\x99\xa4%\xb9~^7_\x84\x0b\xa0\x98\xf8\xb2\xcf\x8c<\xc4\x1a\x87f\xcaZ\x8f\xbb\x1a\xb8\xddh\xd3mL\x85\x87\xb6dfv\x01G\x9aX\xa5[\xff\x1e\xea\xfc5o\x9co\xad\xd5\xa6\xae\xffg!\xee\x9c\xaa\\\xdate\xf4\xea\x1a\xe2*\xbd\xa0\x1e\xcd\xf1j;\xa8\xd0^(d1`\xeb\xa43I\xfb\x8e4P!\xa9\xcd\x86\x95\x0e\xc1l\x96\xfc\x8f*\xb5$6\x03l\xbd\xf9\xbe\x0cBm\nm4\xa6aa9?pK]Y\x01:\xfaM\xc6\x1f\xe83\x0c\xe7\xfeW\xba\xa2\xf5\x88\x18h\xb5?+\x04\xb6@\xdf\x85\x15\x8c\xe5!8-&\xc7FCfw\xba\x1d\xb2(\xe026?\xa3\x0b\x19\xf6\x9f\x1cB2\xee\x87\x02y\xc5\x95\x9a\xeb\t1E5x\x08\x0f\xafF\x96a\xe8\xa73P5*\xe4Y\\\xcaa\xfcy\xb0\x97DHm\xeb>;\xfadfu\xec\x90\xa4x\xc8\\\x87\xbf\xcdz(\x96^\x10\xd2\xe2\xc0\xd6\xe1\xb1\x9dk&\xfb\x06J\x8c\x9f\x0c%\x97 \xd4i\xbbo\x1ft\x89Q-\x11\xf8\x9e\xce\xc2\x143\x1a\xf6\x05\x11\x9cn\xc9]o\xb40\xfa\x8c\xb8\xee\xaa\xc7\xf2_\x80\x81=ry\xb5\xc3\x1d\xcd\x1f\xc1)\x0b\xe8/[\xc3\x19\xb1\x1b`\x15\x07\xb2\x87\xce\xe6J1\xe6\xbcC<\xd7\x99\x10:U\x92\x00d\x9eE3\xa7\xb0\x89\x180\xb6$pCWU)\x14\xb3\x11\x8c\x86V0>JQ\xf2h/\xcf\x15\xd2\x02\x0e\x9c\xab\xb3H\xf4\xe7\xd4\xd9\xe8<Pk\x05qRN\xf8-\xa9=)J\xf4\x01j\x81\xc6\x99X\xf2\x87_\xaenl\xf3\xfb\xf6P\xa3_p\xc7\xc0a\xc1\xd4e<\xc0\x8ei#Y\xeb\xb1\xa9z\xe0;I3U\x89\x84\xe9"S\x87?')
c = s2n(b'\r\xf3\xeb\xf3\x96\x9aGc\x10\xb8\xe7\x88P\xa9\x1f/\xfb\xf7;z \xc9\xca\xb3=\x9c\xee\x95vL\xd2y\x05\xafm\x18 \x7f\x1b\x8c\xfe#\x17\xc1+#\xf0\xa7\xbf\xe1\xc6\xf7\xb76L\xf7\xb0n\xf7(\xd5\xe59E\xfbp4\xe1\xa2w\xe5\xe5\xe5\xf2@%\xab\xfe@\xc8#^T\xa3\xb1w\xfb\xd9\x8bp\x0bxoR)\x9a\xc6\xe1\x9dT\xbd\xe7{\xef\xbc\xba\xa8\x0c\x8e\xbc/\xc9}\xcd\xd6\xc2\xdd\x16\xf1Qa\xed\x1a\x86\x1c)\x9e\xf0,\xf2\x11\xccD\t\x02M\x12\x85\xd6\xe1\x15"\xbd\x8b\xc4\x92\x94Y\x1d:\xc1\x17\x1c\x92\xd3>c\xc0BG\t\xac(#\x7f\\\xd6\x10Y\xdd\xf2\x06Nf\xac\x97 \xc3$\xd1\x06*\xf0\t\xcbM\xe4\x92\xa1,\xf0\x97\x86\x1e\xc2\x10gM\xe7\xf1L\x00b\xc6\xbeH|\xba\xa1o\x81\xf6\xe3\x87\xaa\xd3\xde\xbd\xafa\x81|\x8c\xb8\x91\xed\xca\x80\xf4\xf3\x91\x189\x0ciH\xdf\xcfj\x9eK\x83\x7f)d\xa8\x08\xe7F\\\xaa8\x1c\x96N\xb0\xb1\xabvP\'\xd4\xea\x02E:\xe0\xe9\x96\xc6\xdc\xd2\xd6\xce\xb7e\xcd\x8b\x1b\xc5\x9a/\xdd\x98\x94\x00\x18NC\x9e\xb2z\x9e\x0f\xffol\xc2\xf43\xbd\x1b\xea\xdf$\xc4\xe3\x96\x03_\x16a\x15\x13\xc7_g!\x11\xb2\xb9=\xe5?\x0b\xc0\xdf6!U\x06\xb2i\x94\xed0\xe8\xd8\xaf\x9f\'z\x02\xa1\x17\x8e\xdb@\xd9R\x9c&\xed\x97&\x9f\x82Y\nXS@\x976!\x19\x17c|Rv\xfc4@\xad\xed\x92U\xe2T\xed8qbn\xdf\xd8\xe06\xcf\xa0\x87;X\xe3:0\xa3Z\x98\x89\xbe\x8eJ\xd0\xd5rV\xea2\xa4\xc6\xaf\xdeBi\xd1`QR\x90W\x83\xb7Yy\xba\xaa\x08\x81\xe7|U\xde\xf5\xaeF\xb6K\x13\xa4]\xec\x931\xfb\xb0\xf4\xc5\x9e,\x8d\x138\x8c~\x03\xa9\xf2/dCw\xf6\xb7\x1d\xc9b\xdc\xc1\xde+.{PK\x17:\xa8\xd6\xcc\x9a\xee06\x00\x04\xbf\xcfXN\xb4\xcc\x03qQ/\x9e\x95\xf0\xa3\x0b\x08f\x0f\x03\x8e\xb7\xb1\xc4\x1avo\xbb\x9dGF\xb7.\t\xdd#\xf72 \xa8\x9f2b!')
p = iroot(n//(20210123**6), 16)[0]
q = findPrime(20210123 * p * p)
r = findPrime(p * q * q)
s = findPrime(p * q * r)
n = p * q * r * s
e = 0x10001
phi = (p-1)*(q-1)*(r-1)*(s-1)
d = invert(e, phi)
print n2s(pow(c, d, n))
# flag{we11_y0U_aRe_n07_AFra1d_0F_nA1VE_R5A_NOw~}

某校月赛

m = "CSA{xxxx...}"
m = bytes_to_long(m)

def GetP():
    a = getPrime(1024)
    b = gmpy2.next_prime(a)
    print a*b
    c = (sympy.factorial(a+1))%b
    p = gmpy2.next_prime(c)
    return p

def GetQ():
    a = getPrime(1024)
    b = getPrime(1024)
    assert a>b
    print b
    q = gmpy2.next_prime(pow(b,pow(a,a),a))
    return q

e = 0x10001
p = GetP()
q = GetQ()
n = p*q
c = pow(m,e,n)
print c

因b是a的下一个质数,所以相差不大,可以先开方再依次减一来爆破
大整数求阶乘模,相差不多,可用威尔逊定理

def wilson(A,B):
	t=A-B-1
	res=-1
	k=A-1
	for i in range(t):
		res=(res*invert(k,A))%A
		k=k-1
	if(res<0):
		return res+A
	else:
		return res
e = 0x10001
a_b = 8791983291862316547120032002246797778973254864878605386970992669673492259939968094797888952000007665099557258875733921945858542033686958451053071321949445567554111280121591346171077943880260679125991880697230370219526880175562742459075094530147965941656736934866149682649579460280980677646021442609216740720035530819475189210391218236576964069192397380463810610320042000382292193209315399852054457274097472992485848055230344883241567824771770093197030208652860081386700063761662731826974842068243177453217775722649679295194925961548515215408631410811652474082983292228905477331688617735677908498102304912120235373673
b = 118830448651410685339257790004824429485649682854840323484849009324486118171877706146949014994839630959269120471558355441928485561834486801067099318678275406237859608336855343079327803228141993768895085486382938883215719857931006640727311171816907582743931515808064737866306165395059736627157339004410141600439
c = 1883542149569091174279536150168908263646954186271291671824785843443243892583487651671300286308926172470442971603905412854092328155166231193046952547441484309496731233232032329302915437265167230962789623953726262153609071938085116529042215589144472265020275468260088671221409979372525200484718932529778499387278835971899408449219198570586884993769637405957394495603493918863913753918387538916758810844800356847596945689024738607675026456041290170218954590732925097228128824030100261173705092887218946711496138633451915979360395821610285826057145659991391437575320290538094685588193509092498259185122588642642635746
_a = iroot(a_b, 2)[0]
_b = next_prime(_a)
# while _a*_b!=a_b:
# 	_a -= 1
# 	_b = next_prime(_a)
# print _a
# print _b
_a = 93765576262625915496683241788947101718343164873988642315984413216815591384688881866482241684943051686788225803937137421688879814888625596496853667570833634103978674488665724274162336184943604672899422874130229212143055853110350654929253902909062114677358501123568396278075295297381414205770662659185396216063
_b = 93765576262625915496683241788947101718343164873988642315984413216815591384688881866482241684943051686788225803937137421688879814888625596496853667570833634103978674488665724274162336184943604672899422874130229212143055853110350654929253902909062114677358501123568396278075295297381414205770662659185396216471
q = next_prime(b)
_c = wilson(_b, _a+1)
p = next_prime(_c)
d = invert(e, (p-1)*(q-1))
print n2s(pow(c, d, p*q))
# CSA{RSARSaRsarsaRS4Rs4rs4rS4}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值