-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchallenge3.py
executable file
·42 lines (36 loc) · 1.41 KB
/
challenge3.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
35
36
37
38
39
40
41
42
#!/usr/bin/env python3
import binascii
def single_byte_xor(ciphertext):
results = {}
for i in range(0, 256):
c = chr(i)
plaintext = bytearray([a ^ b for a, b in zip(ciphertext, [i]*len(ciphertext))])
score = compute_score(plaintext.lower())
results[score] = plaintext
# print(c, ": error: ", score, ' plaintext: ', plaintext)
if len(results) > 0:
best = max(results)
return best, results[best]
def compute_score(plaintext):
score = 0
# From http://www.data-compression.com/english.html
frequencies = {
'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339,
'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881,
'g': 0.0158610, 'h': 0.0492888, 'i': 0.0558094,
'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490,
'm': 0.0202124, 'n': 0.0564513, 'o': 0.0596302,
'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563,
's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692,
'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182}
for letter in plaintext:
c = chr(letter).lower()
if c in frequencies:
score += frequencies[c]
else:
score -= 0.5
return score
if __name__ == '__main__':
output = single_byte_xor(binascii.unhexlify('1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736'))
print(output)