onepiece
一、概要
1、标题:onepiece
2、关键字:e=2,rabin,凯撒
3、比赛:2020新基建决赛
4、工具:python,米斯特工具
二、开始
1、题目分析
题目给了一个pubkey.pem和onepiece.enc,考虑通过pem解析出n后再进行下一步处理,走一步算一步吧。
2、开始解题
第一步:python解析pem得到n
import gmpy2
import string
from Crypto.PublicKey import RSA
# 读取公钥参数
with open('pubkey.pem', 'r') as f:
key = RSA.importKey(f)
N = key.n
e = key.e
print N
print e
得到
n=87924348264132406875276140514499937145050893665602592992418171647042491658461
e=2
第二步:分解n
惊喜的发现e=2,rabin大概率能成功。
用yafu分解n得到p、q
yafu-x64.exe factor(87924348264132406875276140514499937145050893665602592992418171647042491658461)
得到
P39 = 275127860351348928173285174381581152299
P39 = 319576316814478949870590164193048041239
到此为止顺利。
第三步:上rabin
直接上脚本就行了。
#!/usr/bin/python
# coding=utf-8
# 适合e=2
import gmpy2
import string
from Crypto.PublicKey import RSA
# 读取公钥参数
with open('pubkey.pem', 'r') as f:
key = RSA.importKey(f)
N = key.n
e = key.e
print N
print e
p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
with open('onepiece.enc', 'r') as f:
cipher = f.read().encode('hex')
cipher = string.atoi(cipher, base=16)
# print cipher # 计算yp和yq
yp = gmpy2.invert(p,q)
yq = gmpy2.invert(q,p)
# 计算mp和mq
mp = pow(cipher, (p + 1) / 4, p)
mq = pow(cipher, (q + 1) / 4, q)
# 计算a,b,c,d
a = (yp * p * mq + yq * q * mp) % N
b = N - int(a)
c = (yp * p * mq - yq * q * mp) % N
d = N - int(c)
for i in (a,b,c,d):
s = '%x' % i
if len(s) % 2 != 0:
s = '0' + s
print s.decode('hex')
得到
synt{I0vpr_0s_Z1ar}
第四步:凯撒
ctf菜鸡都能看出来synt就是flag凯撒后的。上米斯特工具凯撒跑起来,就得到了答案
get-flag
flag{V0ice_0f_M1ne}
P.S:
相对于其他题和决赛这个名头,这题我觉得对于大佬们来说才是签到题吧?