简单的RSA解密
0x01、已知p、q、e,求解d,将得到的 d通过md5加密为32位小写即为flag
1、题目
p= 18255878996579787209
q= 324206965464727676218470615969477348407
e= 13
2、解题代码
import math
def getEuler(p1,q1):
return (p1-1)*(q1-1)
def getDkey(e,Eulervalue):
k=1
while True:
if ((Eulervalue*k)+1)%e==0:
(d,m)=divmod(Eulervalue*k+1,e)
return d
k += 1
def Mingwen(c,d,n):
return pow(c,d,n)
if __name__=='__main__':
p=18255878996579787209
q=324206965464727676218470615969477348407
d=getDkey(13,getEuler(p,q))
print('私钥为:%d'%d)
3、结果:
私钥为:4552833177978761857275087159381075983327579204175044608037
0x02、已知n、e、c,求解m
1、题目
c = 34533624647193630459864898193867716746457242698156942414136896826169638045191
n = 38915622445322594788113853812230848083133274092845339659216148461050062802771
e = 65537
2、先通过分解大素数的网站,将n分解为p和q
网站:分解素数
3、利用脚本,求解m
脚本一:
from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long
import gmpy2
c = 34533624647193630459864898193867716746457242698156942414136896826169638045191
e = 65537
p=184447441856923584506972548629664462921
q=210984885740565358250291732634631217851
n = p * q
wn = (p-1)*(q-1) # φ(n) 欧拉函数,p、q互质
d = gmpy2.invert(e, wn) # 逆元 同名 egcd, modinv
#c = pow(m, e, n) # 加密
m = pow(c, d, n) # 解密
# gmpy.mpz(x).root(n)[0].digits() # x开n方
print(m)
print(long_to_bytes(m))
脚本二:
from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_long
def gcd(a, b):
if a < b:
a, b = b, a
while b != 0:
temp = a % b
a = b
b = temp
return a
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m
if __name__ == "__main__":
c = 34533624647193630459864898193867716746457242698156942414136896826169638045191
e = 65537
p = 184447441856923584506972548629664462921
q = 210984885740565358250291732634631217851
n = p * q
d = modinv(e, (p - 1) * (q - 1))
m=pow(c,d,n)
print(m)
print(long_to_bytes(m))
4、结果:
824096532222641710063932599341632812357322908548805519227907861002810237
b'wgpsec{no_no_no_you_are_guess}'