Safe_box

点击此处获得更好的阅读体验

## WriteUp来源
本WP由Vanish提供
## 题目考点

解题思路

主要逻辑

  1. 过了PoW进行交互

  2. 1可以得到一组23*20的key

  3. 3可以得到flag的密文c

  4. 加密函数生成23*40的key,一共23组明文,每组明文加密40次,记录每次的结果

  5. 每一次的加密逻辑为b = m + Σ((a_j**i)*e_i),其中a_j为组里的加密次数,j=1,2,,40;e_i为列表e里的每一个元素,i = 1,2,3,,,29

解密流程

  1. 第一组,当i=0时,a=1,b_1 = m_1 + Σ(e_i)

  2. 第二组,当i=0时,a=1,b_2 = m_2 + Σ(e_i)

  3. 第三组,当i=0时,a=1,b_3 = m_3 + Σ(e_i)

  4. 我们得到的23组信息中的每组的第一条就是b_1, b_2,b_3

  5. 所以我们只需要获得Σ(e_i)就可以还原所有的m

  6. 被加密的是pri,pri是PEM文件格式,有固定的开头、结尾格式,所以我们知道部分明文,所以我们知道m_1

  7. 利用b_1和m_1获取Σ(e_i)

  8. 再利用b_1,,,b_23和Σ(e_i) 获取所有m

  9. 再利用私钥文件对flag进行解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding: utf8 -*-
from Crypto.PublicKey import RSA
from Crypto.Util.number import *
import re

with open('data.txt') as f:
data = f.read()

ms = re.findall("{'a': 1, 'b': (.*?)L}",data)
c = re.findall("flag:(.*)",data)
m1 = b'-----BEGIN RSA PRIVATE KEY-----\\nMIICXAIB'
es = int(ms[0])-bytes_to_long(m1)
print es
pri=""
for i in ms:
pri = pri + long_to_bytes(int(i)-es)
print pri
pri = RSA.importKey(pri.replace("\\"",""))
print(long_to_bytes(pow(int(c[0]),pri.d,pri.n)))

Flag