202312_四川网信人才技能大赛_简单的RSA
Tags:RSA
,高次方爆破
0x00. 题目
task.py
from Crypto.Util.number import *
from secret import flag
from sympy import nextprime
flag=b''
r = getRandomNBitInteger(64)
p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023
p =nextprime(p)
q =nextprime(q)
n = p*q
def enc(flag, n):
m = bytes_to_long(flag)
return pow(m, 65537, n)
c = enc(flag, n)
print(n)
print(c)
# 25066797992811602609904442429968244207814135173233823574561146780193277243588729282392464721760638040595480284865294238118778099149754637586361909432730412493061503054820202744474632665791457
# 18808483076270941157829928736000549389727451019027515249724024369421942132354537978233676261769285858813983730966871222263698559152437016666829640339912308636169767041243411900882395764607422
0x01. WP
1. 分析
由已知脚本可得n=p*q=(r∗∗5+...)∗(r∗∗5−...)
由上可知,n约为r的10次方。如果对n开10次方,则低位可忽略,爆破一下即可求出r。
2. 编写脚本
rsa_exp.py
from Crypto.Util.number import *
from gmpy2 import iroot
N = 25066797992811602609904442429968244207814135173233823574561146780193277243588729282392464721760638040595480284865294238118778099149754637586361909432730412493061503054820202744474632665791457
t,f = iroot(N, 10)
for r in range(t-10000,t+10000):
p = r**5 + r**4 - r**3 + r**2 - r + 2023
q = r**5 - r**4 + r**3 - r**2 + r + 2023
p =nextprime(p)
q =nextprime(q)
n = p*q
if n==N:
print(f"p = {p}\nq = {q}\n")
break
# 得到:
# p = 158324975897082020097339281935818129320954195255971408941591049179715138878370817761203475160123
# q = 158324975897082020068454470275147007824077754451975255433855101769279209145578273309232489165459
后续常规RSA解密
from Crypto.Util.number import *
n = 25066797992811602609904442429968244207814135173233823574561146780193277243588729282392464721760638040595480284865294238118778099149754637586361909432730412493061503054820202744474632665791457
c = 18808483076270941157829928736000549389727451019027515249724024369421942132354537978233676261769285858813983730966871222263698559152437016666829640339912308636169767041243411900882395764607422
e = 65537
d = inverse(e, (p-1)*(q-1))
m = pow(c,d,n)
print(long_to_bytes(m))
# flag{5afe5cbb-4b4c-9cb6-f8b6-032cabf4b7e7}
最终得到flag为flag{5afe5cbb-4b4c-9cb6-f8b6-032cabf4b7e7}