Advanced Python (Fall 2017)/lecture10
Lecture 10
Cryptopals
Very good solutions here (better than mine): https://github.com/ricpacca/cryptopals
Binary, Hex, Base64
Look them up if you don't know what they are. Unfortanetly, I cannot find a very good introduction to the topics in python.
In python you have integer literals in base 10, like 10
or in base 16, like 0xf
or in base 2, like 0b1
Binary numbers can easily be representing in base 16 (called "Hex"). 8 bits (binary digits) is 2 digits in hex. Base64 is a way of storing binary data so it uses only ascii characters. A string of Base64 is shorter than a string of equivalent Hex, so Base64 is popular way to put binary data embeded in a text document.
Problems
The problems are good because they require us to understand encoding in python. My solutions are poorer quality in comparison to the solutions here: https://github.com/ricpacca/cryptopals
Problem 1-1
import base64
message_hex = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"
message_bytes = bytearray.fromhex(message_hex)
message_base64 = base64.encodebytes(message_bytes)
print(message_base64)
Problem 1-2
one way
# Convert both hex string to bytes
hex_string_1 = '1c0111001f010100061a024b53535009181c'
hex_string_2 = '686974207468652062756c6c277320657965'
bytes_1 = bytearray.fromhex(hex_string_1)
bytes_2 = bytearray.fromhex(hex_string_2)
# Pair each byte with other byte in same position
byte_pair_list = list(zip(bytes_1, bytes_2))
# go through each bit in hex string bytes, and xor, and store result
# XOR opertator is ^
result_list = []
for b1, b2 in byte_pair_list:
xor_result = b1 ^ b2
result_list.append(xor_result)
# convert list of integers to hex
result_bytes = bytearray(result_list)
print(bytearray.hex(result_bytes))