RSA作业
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))