about summary refs log tree commit diff
path: root/users/wpcarro/scratch/cryptopals/set1/c3.py
diff options
context:
space:
mode:
Diffstat (limited to 'users/wpcarro/scratch/cryptopals/set1/c3.py')
-rw-r--r--users/wpcarro/scratch/cryptopals/set1/c3.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/cryptopals/set1/c3.py b/users/wpcarro/scratch/cryptopals/set1/c3.py
new file mode 100644
index 0000000000..187b58c1c7
--- /dev/null
+++ b/users/wpcarro/scratch/cryptopals/set1/c3.py
@@ -0,0 +1,28 @@
+from c2 import fixed_xor
+from collections import Counter
+import string
+
+alphabet = string.ascii_lowercase + string.ascii_uppercase
+
+def score(bs):
+    chars = [b for b in bs if b in alphabet]
+    return sum(Counter(chars).values())
+
+def decode_cipher(x):
+    x = bytearray.fromhex(x)
+    num_bytes = len(x)
+
+    mx, result, key = 0, None, None
+    for c in alphabet:
+        mask = bytearray(bytes(c, 'ascii') * num_bytes)
+        y = fixed_xor(x, mask, decode_hex=False, encode_hex=False).decode('ascii')
+        test = score(y)
+        if test > mx:
+            result = y
+            mx = test
+            key = mask.decode('ascii')
+    return result
+
+run_tests = False
+if run_tests:
+    print(decode_cipher("1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"))