先上图
我开始在网上找了许久,没找到详细的题解,于是就自己肝出来后与大家分享一下,如果大家有更好的方法,也可以多交流一下
题目给了flag.enc与pubkey.pem两个文件
对于pubkey.pem,我们可以用linux中命令:openssl rsa -pubin -in public.pem -text -modulus
来提取n与e,再从flag.enc中提取出c
以下是目前已知信息:
c= 26174096085413982127350513827814096003393781011967421505411183900736523574240
e=2
c很容易分解,用yafu很容易分解,直接上p,q
p = 275127860351348928173285174381581152299 q = 319576316814478949870590164193048041239
到这里会发现,这好像是RSA低加密指数攻击,我上脚本跑了一下,没跑出来(实在是不想等了)
于是稍微整理了一下已知信息,会得出
推出学过信息安全数学基础的同学一看???这不是书上例题求解同余式吗,首先解二次剩余,我使用的Tonelli-Shanks算法,大家感兴趣可以去自己了解一下,这里我就直接用脚本了嘿嘿嘿,然后就使用中国剩余定理求解了,m有四种情况(不清楚的同学可以看一下信息安全数学基础的书或者数论,我在这里偷个懒直接过了)
上代码
from Crypto.Util.number import *
from sympy.ntheory.modular import crt
import gmpy2
c = 26174096085413982127350513827814096003393781011967421505411183900736523574240
p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
#shanks算法,x^2=n mod p,已知,n,p求x
def Legendre(n, p):
return pow(n, (p - 1) // 2, p)
def Tonelli_Shanks(n, p):
assert Legendre(n, p) == 1
if p % 4 == 3:
return pow(n, (p + 1) // 4, p)
q = p - 1
s = 0
while q % 2 == 0:
q = q // 2
s += 1
for z in range(2, p):
if Legendre(z, p) == p - 1:
c = pow(z, q, p)
break
r = pow(n, (q + 1) // 2, p)
t = pow(n, q, p)
m = s
if t % p == 1:
return r
else:
i = 0
while t % p != 1:
temp = pow(t, 2 ** (i + 1), p)
i += 1
if temp % p == 1:
b = pow(c, 2 ** (m - i - 1), p)
r = r * b % p
c = b * b % p
t = t * c % p
m = i
i = 0
return r
result1 = Tonelli_Shanks(c, p)#解出m^2=c(modp),求得一解为result1,其另外一解为p-result1
result2 = Tonelli_Shanks(c, q)#同上
#第一种情况
l1=[result1,result2]
l2=[p,q]
m=crt(l2,l1)
print(long_to_bytes(m[0]))
#第二种情况
l1=[p-result1,result2]
l2=[p,q]
m=crt(l2,l1)
print(long_to_bytes(m[0]))
#第三种情况
l1=[p-result1,q-result2]
l2=[p,q]
m=crt(l2,l1)
print(long_to_bytes(m[0]))
#第四种情况
l1=[result1,q-result2]
l2=[p,q]
m=crt(l2,l1)
print(long_to_bytes(m[0]))
得出flag:PCTF{sp3ci4l_rsa}
这题不知道有没有大佬用RSA低加密指数攻击脚本跑出来,反正我试了一下没出来,文章如果有什么错误的地方还请大家多多指正!