-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy path20.py
34 lines (24 loc) · 902 Bytes
/
20.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from base64 import b64decode
from .. import random_helper
from ..aes import ctr_encrypt
from ..xor import xor_bytes, rank_xor_repeating_keys
key = random_helper.random_bytes(16)
nonce = 0
with open("src/set_3/20.txt") as f:
secrets = f.readlines()
secrets = [b64decode(secret) for secret in secrets]
expected = secrets
secrets = [ctr_encrypt(key, nonce, secret) for secret in secrets]
min_length = min(len(secret) for secret in secrets)
truncated = [secret[:min_length] for secret in secrets]
concatenated = b"".join(truncated)
keys = rank_xor_repeating_keys(concatenated, min_length)
# found through analysis
key_indices = {
0: 3,
}
key = bytes([keys[i][key_indices.get(i, 0)] for i in range(len(keys))])
plaintexts = [xor_bytes(secret, key) for secret in secrets]
for i in range(len(expected)):
print(plaintexts[i])
assert(expected[i].startswith(plaintexts[i]))