예제 #1
0
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
예제 #2
0
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]
예제 #3
0
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)]
예제 #4
0
 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(''))