def single_byte_xor_decrypt(message, key): '''Key should be a single character, represented in Hex.''' if not crypt_utils.is_hex(message) or not crypt_utils.is_hex(key): raise TypeError("Error: message and key expected in Hex format") decode = '' for i in range(len(message), 0, -2): b = message[i-2:i] tmp = crypt_utils.xor(b, key) if len(tmp) < 2: tmp = '0' + tmp decode = tmp + decode return decode
def hex_to_base64(hex_string): if type(hex_string) != str and type(hex_string) != bytes: raise TypeError("Error: hex_to_base64 requires a string") if not crypt_utils.is_hex(hex_string): raise TypeError("Error: passed data is not Hex") if type(hex_string) is not bytes: hex_string = bytes(hex_string, 'UTF8') s = binascii.unhexlify(hex_string) return str(base64.standard_b64encode(s))[2:-1]
def crack_vigenere(cyphertext): if not crypt_utils.is_hex(cyphertext): cyphertext = crypt_utils.toHex(cyphertext) keysizes = generate_vigenere_key_sizes(cyphertext) options = {} for keysize in keysizes: blocks = vigenere_blocks(cyphertext, keysize) try: # Chunk the hex strings into 8 bit lengths (2 Hex digits) # Otherwise transpose would split bytes incorrectly blocks = [[s[i] + s[i+1] for i in range(0, len(s), 2)] for s in blocks] except IndexError: # blocks contain invalid Hex, so assume this is not the solution continue blocks = vigenere_transpose(blocks) decrypted_message = [] key = '' for block in blocks: key_byte, message_part = search_single_byte_xor_key(block) decrypted_message.append(message_part) key += key_byte decrypted_message = vigenere_transpose(decrypted_message) decrypted_message = ''.join(decrypted_message) score = score_char_freq(decrypted_message) try: key = binascii.unhexlify(key).decode('ascii') except: #if key cannot be converted to ascii, leave as is pass options[score] = (key, decrypted_message) return options[min(options)]
def test_is_hex(self): self.assertTrue(crypt_utils.is_hex('0')) self.assertTrue(crypt_utils.is_hex('1')) self.assertTrue(crypt_utils.is_hex('2')) self.assertTrue(crypt_utils.is_hex('3')) self.assertTrue(crypt_utils.is_hex('4')) self.assertTrue(crypt_utils.is_hex('5')) self.assertTrue(crypt_utils.is_hex('6')) self.assertTrue(crypt_utils.is_hex('7')) self.assertTrue(crypt_utils.is_hex('8')) self.assertTrue(crypt_utils.is_hex('9')) self.assertTrue(crypt_utils.is_hex('A')) self.assertTrue(crypt_utils.is_hex('B')) self.assertTrue(crypt_utils.is_hex('C')) self.assertTrue(crypt_utils.is_hex('D')) self.assertTrue(crypt_utils.is_hex('E')) self.assertTrue(crypt_utils.is_hex('F')) self.assertTrue(crypt_utils.is_hex('AF')) self.assertTrue(crypt_utils.is_hex('23')) self.assertTrue(crypt_utils.is_hex('1A0F5')) self.assertTrue(crypt_utils.is_hex('A0F5DF')) self.assertTrue(crypt_utils.is_hex('A0F5D34FAB45Bc54Abcd12345002300Fd')) self.assertFalse(crypt_utils.is_hex('G')) self.assertFalse(crypt_utils.is_hex('Z')) self.assertFalse(crypt_utils.is_hex('FA00M')) self.assertFalse(crypt_utils.is_hex('&')) self.assertFalse(crypt_utils.is_hex(''))