medium rsa
PCTF{256b_i5_m3dium}
压缩包里一个 .pem 一个 .enc,没看见 ppt 后面有介绍怎么写的,所以直接查了一下这题,才知道一开始要 openssl rsa -pubin -text -modulus -in pubkey.pem
得到 e、N,N 转为 10 进制后用 yafu 分解出 p 、q,把他们复制进 RSA-Tool 计算出 d
用网上的脚本生成私钥,命令行输 openssl rsautl -decrypt -in flag.enc -inkey private.pem
出 flag
extremly hard rsa
PCTF{Sm4ll_3xpon3nt_i5_W3ak}
内容和之前一样,所以一上来还是 openssl rsa -pubin -text -modulus -in pubkey.pem
发现 e=3,ppt 里有“低加密指数攻击”,照着那一页写脚本( p,q 用 yafu 分解出, c 用 hex < flag.enc
得到)。
得到 m 简单,快速地暴力破解和输出 m 难。经过唐老板、董斌、尹大佬指点,最终脚本如下(还有问题,但反正能用):
import gmpy2
from Crypto.Util import number
from concurrent.futures import ProcessPoolExecutor
c = 0x85c0de5f # 太长,影响阅读
N = 0xB0BEE5E3 # 后面截掉了
e = 3
def breach(i):
print(i) # 没有这句我就觉得程序没在运行
for k in range(i, i + 2000000):
m = gmpy2.iroot(c + k * N, e)
m, b = m
if True == b:
print(number.long_to_bytes(m))
if __name__ == "__main__":
with ProcessPoolExecutor(max_workers=4) as pool:
# 尹大佬加的第三个参数,立刻快了许多👇
pool.map(breach, range(0, 1000000000, 2000000))
netcat 123.207.38.247 9999
islab{RSA_i5_v5ry_eazzzzy}
问尹大佬我的多进程怎么改的时候,听到冯大佬说这是选择明文攻击,然后上网查到这篇文章。虽然不明白为啥,但跟着它做就做出来了:
- 选 3 ,得到 flag 加密后的 C
- 选 1 ,输入 0x2 ,得到的是 Ca
- Ca × C 得到 Cb
- 选 2 ,输入 Cb ,得到解密后的 Cb ,我管他叫 cbd_modn
- 根据 cbd_modn = cbd mod n 求 cbd(应该有很多可能值,我一开始把 cdb_modn 直接当成 cbd 用出结果了,试了试加了几倍的 n 反而不行,所以不改脚本了)
- 根据 cbd = flag × 2 mod n 求 flag
脚本:
from Crypto.Util import number
from concurrent.futures import ProcessPoolExecutor
import re
n = 0xe8e24510 # 太长
cbd = 0xd2e6d8c2 # 截掉
def cca(i):
for k in range(i, i + 25):
# 不用整除会报错float存不下,反正bytes也没小数
m = (cbd + k * n) // 2
m = number.long_to_bytes(m)
if re.match(r"islab", m.decode()):
print(m.decode())
if __name__ == "__main__":
with ProcessPoolExecutor(max_workers=4) as pool:
pool.map(cca, range(0, 100, 25))