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}

posted @ 2025-10-05 14:47  JasonJHu  阅读(6)  评论(0)    收藏  举报