I finally have the luxury of time to learn new things, in which I decided to beef up some of my cryptography knowledge. A basic cryptography category in which certain CTFs present is a classic XOR challenge.
Being a person with ZERO knowledge in cryptography, some research were needed. So in a nutshell, XOR is the operation of taking 2 bits, putting in through the XOR operation or also known as
Some XOR rules:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
Since XOR works at the bit level, in order to encryt a message like
ATTACK AT DAWN, the message needs to be in bit representation before taking each for a spin in the XOR operator.
As this was just a simple practice, I decided to expeirment using a single key. Take the example of the following.
ATTACK AT DAWN
Key chosen is
So to encrypt that message using XOR, which individual character have to be XOR-ed by the key, therefore a conersion was needed. Thankfully, converting from string to bits was easy, by using the following
bin(ord('a')), then putting it into a list (Using python over here).
Since some of the XOR cipher text is not readable as text, I encoded the cipher text in base64 to make it "transportable". In which, a decode is needed before passing the message through the decryption process.
Here is the code sample code for encryption and decryption:
import base64 #Encryption cipher_bits =  input_string = 'ATTACK AT DAWN' key = 'H' print "XOR Key: " + key key_bin = (bin(ord(key)))[2:] key_left_zeros = '0' * (8-len(key_bin)) new_key_bin = key_left_zeros + key_bin # print new_key_bin str_bits =  for ch in input_string: tmp_bit = (bin(ord(ch)))[2:] bit_left_zeros = '0' * (8 - len(tmp_bit)) new_bit = bit_left_zeros + tmp_bit str_bits.append(list(new_bit)) # print str_bits temp_bits = '' for i in range(len(str_bits)): for j in range(len(str_bits[i])): temp_bits += str(int(str_bits[i][j]) ^ int(new_key_bin[j])) cipher_bits.append(list(temp_bits)) temp_bits = '' # print cipher_bits tmp_bits_holder =  for i in range(len(cipher_bits)): tmp_bits_holder.append(''.join(cipher_bits[i])) # print tmp_bits_holder tmp_cipher_text = '' tmp_ch_holder = '' for i in range(len(tmp_bits_holder)): tmp_ch_holder = chr(int(tmp_bits_holder[i],2)) tmp_cipher_text += tmp_ch_holder tmp_ch_holder = '' new_cipher_text = base64.b64encode(tmp_cipher_text) print "XOR RAW Encrypted" + tmp_cipher_text print "XOR RAW Encrypted Encoded: " + new_cipher_text #Decryption cipher_text = base64.b64decode(new_cipher_text) cipher_str_bits =  for ch in cipher_text: c_tmp_bit = (bin(ord(ch)))[2:] c_bit_left_zeros = '0' * (8 - len(c_tmp_bit)) c_new_bit = c_bit_left_zeros + c_tmp_bit cipher_str_bits.append(list(c_new_bit)) # print cipher_str_bits c_temp_bits = '' message_bits =  for i in range(len(cipher_str_bits)): for j in range(len(cipher_str_bits[i])): c_temp_bits += str(int(cipher_str_bits[i][j]) ^ int(new_key_bin[j])) message_bits.append(list(c_temp_bits)) c_temp_bits = '' # print message_bits tmp_message_bolder =  for bits in message_bits: tmp_message_bolder.append(''.join(bits)) decrypted_message = '' for i in tmp_message_bolder: decrypted_message += chr(int(i,2)) print "XOR Decrypted: " + decrypted_message