题目给了一个public.key文件和flag.enc,首先还是利用public.key解出n和e
from Crypto.PublicKey import RSA
public = RSA.importKey(open("public.key").read())
n = public.n
e = public.e
print(n, e, sep='\n')
# 10306247299477991196335954707897189353577589618180446614762218980226685668311143526740800444344046158260556585833057716406703213966249956775927205061731821632025483608182881492214855240841820024816859031176291364212054293818204399157346955465232586109199762630150640804366966946066155685218609638749171632685073
# 65537
按照往常的流程发现解出来是乱码,这是因为这道题采用了PKCS#1填充方式,而往常的题目是nopadding的,需要使用pycryptodome库中的PKCS1_OAEP对象求解
n = 10306247299477991196335954707897189353577589618180446614762218980226685668311143526740800444344046158260556585833057716406703213966249956775927205061731821632025483608182881492214855240841820024816859031176291364212054293818204399157346955465232586109199762630150640804366966946066155685218609638749171632685073
e = 65537
p = 97
q = 106249972159566919549855203174197828387397831115262336234662051342543151219702510584956705611794290291345944183845955839244363030579896461607496959399297130227066841321473005074379950936513608503266587950271044991876848389878395867601515004796212227929894460104645781488319246866661398816686697306692491058609
import gmpy2 as gp
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
phi = (p - 1) * (q - 1)
d = int(gp.invert(e, phi))
rsa = PKCS1_OAEP.new(RSA.construct([n, e, d, p, q]))
m = rsa.decrypt(open('flag.enc', 'rb').read())
print(m)
# b'flag{p_1s_5mall_num6er}'
第一次碰到采取了填充模式的题目,简单但值得纪念