RSA算法的具体描述如下:
(1)任意选取两个不同的大素数p和q计算乘积 n = p q n=pq n=pq , φ ( n ) = ( p − 1 ) ( q − 1 ) φ(n)=(p-1)(q-1) φ(n)=(p−1)(q−1) ;
(2)任意选取一个大整数e,满足 g c d ( e , φ ( n ) ) = 1 gcd(e,φ(n))=1 gcd(e,φ(n))=1,也就是e 和φ(n)互质,整数e用做加密钥;
(3)确定的解密钥d,满足 d e m o d φ ( n ) = 1 de mod φ(n)=1 demodφ(n)=1,即 d e = k φ ( n ) + 1 , k ≥ 1 de = kφ(n)+1,k≥1 de=kφ(n)+1,k≥1 是一个任意的整数;
所以,若知道e和φ(n) ,则很容易计算出d;
(4)公开整数n和e,秘密保存d;即公钥 P K = ( e , n ) PK=(e,n) PK=(e,n),私钥 S K = ( d , n ) SK=(d,n) SK=(d,n);
(5)将明文m(m
(6)将密文c解密为明文m,解密算法为:
m = D ( c ) = c d m o d n m = D(c) = c^d mod n m=D(c)=cdmodn
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。
欧拉代数定理:
若n, a为正整数,且n,a互质,则,φ(n) 为欧拉函数,表示小于n且和n互质的数的个数。特别的,当n为素数时, φ ( n ) = n − 1 φ(n)=n-1 φ(n)=n−1,当p,q为素数时 φ ( p q ) = ( p − 1 ) ( q − 1 ) φ(pq)=(p-1)(q-1) φ(pq)=(p−1)(q−1)。
所以有
参考链接:https://blog.csdn.net/qq_45198339/article/details/128741483
from Crypto.Util.number import bytes_to_long,inverse,getPrime
from flag import flag
m = bytes_to_long(flag)
p = getPrime(1024)
q = getPrime(1024)
n = p*q
print(n)
e = 65537
c = pow(m,e,n)
pq = p*(q-1)
qp = q*(p-1)
print("c=",c)
print("n=",n)
print("pq=",pq)
print("qp=",qp)
'''
c= 8722269075970644434253339592758512788160408912707387632591552130175707843950684315083250494010055435391879036285103810263591951437829414438640307561645721347859659807138051841516634704123100270651976676182059252251162982609391666023674158274992400910869692389001622774140191223807887675081808561012755545464977015973615407965906513878979919700065923364884766974187303774330319143647840846354404070430118235352622445115153298578370521811697710289716188726587743282814946239856766713516166990341116198180068191759095913957606379780234116317390622824096667107736103270907349927467971817639795094030622157581511033950777
n= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074584935050067254029262890188260006596141011807724688556673520261743199388391094490191001701011230322653422314758778116196105077883955436582364267530633358016652912054880813710531145973799193443828969535902856467548523653920307742364119002349899553478815101092655897400295925170383678499125295006364960124859003
pq= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074488896197029704465200125337817646702009123916866455067019234171839614862660036737875747177391796376553159880972782837853473250804807544086701088829096838316550146794766718580877976153967582795248676367265069623900208276878140709691073369415161936376086988069213820933152601453587292943483693378833664901178324
qp= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074475956379708898904933143429835002718457573266164923043251954374464149976302585916538814746811455883837138715445492053610047383292461097590195481556557381952895539341802954749542143253491617052100969586396996063822508764438280468492894012685918249843558593322831683872737943676955669923498182824352081785243246
'''
根据n、pq、qp得到 φ(n):
pq*qp = p ∗ ( q − 1 ) ∗ q ∗ ( p − 1 ) = n ∗ ( p − 1 ) ( q − 1 ) = n ∗ φ ( n ) p*(q-1)*q*(p-1) = n*(p-1)(q-1) = n*φ(n) p∗(q−1)∗q∗(p−1)=n∗(p−1)(q−1)=n∗φ(n)
根据e、φ(n),求d
使用gmpy2中的invert函数,根据 d e m o d φ ( n ) = 1 de mod φ(n)=1 demodφ(n)=1可以求得e的逆元,即私钥d:
d=gmpy2.invert(e,φ(n))
根据c、d、n,解出明文m:
m = pow(c,d,n) = c d m o d n c^d mod n cdmodn
最后将明文m转换成bytes得到flag
from Crypto.Util.number import *
import gmpy2
'''
n = p*q
e = 65537
c = pow(m,e,n)
pq = p*(q-1)
qp = q*(p-1)
'''
e = 65537
c= 8722269075970644434253339592758512788160408912707387632591552130175707843950684315083250494010055435391879036285103810263591951437829414438640307561645721347859659807138051841516634704123100270651976676182059252251162982609391666023674158274992400910869692389001622774140191223807887675081808561012755545464977015973615407965906513878979919700065923364884766974187303774330319143647840846354404070430118235352622445115153298578370521811697710289716188726587743282814946239856766713516166990341116198180068191759095913957606379780234116317390622824096667107736103270907349927467971817639795094030622157581511033950777
n= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074584935050067254029262890188260006596141011807724688556673520261743199388391094490191001701011230322653422314758778116196105077883955436582364267530633358016652912054880813710531145973799193443828969535902856467548523653920307742364119002349899553478815101092655897400295925170383678499125295006364960124859003
pq= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074488896197029704465200125337817646702009123916866455067019234171839614862660036737875747177391796376553159880972782837853473250804807544086701088829096838316550146794766718580877976153967582795248676367265069623900208276878140709691073369415161936376086988069213820933152601453587292943483693378833664901178324
qp= 10466186506773626671397261081802640650185744558208505628349249045496105597268556020207175016523119333667851114848452038431498926527983706092607207796937431312520131882751891731564121558651246025754915145600686076505962750195353958781726515647847167067621799990588328894365930423844435964506372428647802381074475956379708898904933143429835002718457573266164923043251954374464149976302585916538814746811455883837138715445492053610047383292461097590195481556557381952895539341802954749542143253491617052100969586396996063822508764438280468492894012685918249843558593322831683872737943676955669923498182824352081785243246
phi = (pq * qp)//n #除法使用地板除//得到整数,而传统除法和精确除法/得到的都是浮点数,会有溢出的问题
d = gmpy2.invert(e,phi)
print("d=",d)
m = pow(c,d,n)
print("m=",m)
flag = long_to_bytes(m)
print("flag=",flag)
#flag= b'flag{719014b3-c4e1-4f81-a7be-b4f0d65c9e10}'
import libnum
from Crypto.Util import number
from secret import flag
size = 128
e = 65537
p = number.getPrime(size)
q = number.getPrime(size)
n = p*q
m = libnum.s2n(flag)
c = pow(m, e, n)
print('n = %d' % n)
print('c = %d' % c)
'''
n = 88503001447845031603457048661635807319447136634748350130947825183012205093541
c = 40876621398366534035989065383910105526025410999058860023908252093679681817257
'''
import gmpy2
import libnum
n = 88503001447845031603457048661635807319447136634748350130947825183012205093541
c = 40876621398366534035989065383910105526025410999058860023908252093679681817257
e = 65537
#n比较小,尝试直接分解pq
p = 274539690398523616505159415195049044439
q = 322368694010594584041053487661458382819
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi) #p,q,e求d
m = pow(c,d,n)
print("m=",m)
print(libnum.n2s(int(m))
#m= 27060087196965709690728077779982651425716608910311549
#b'HSCTF{@Zh3n_Ba1_G3i!@}'
nc访问:
emmm找了一下,是pwn结合crypto,先放放
解题链接:https://blog.csdn.net/figfig55/article/details/128508274