def main(argv):
    if argv[0] == 'enum_key':
        print enum_key(argv[1])
    elif argv[0] == 'crack':
        """TODO: Add your own code and do whatever you do.
        """
        message = open('plaintext', 'r').read()
        message_binary = '0' + bin(int(binascii.hexlify(message), 16))[2:]
        message_binary_list = [int(x) for x in message_binary]

        ciphertext = open('ciphertext', 'r').read()

        ranges = ['8080010d80808080', '8080010d7f7f7f7f']

        start_binary = bin(int(ranges[0], 16))[2:]
        end_binary = bin(int(ranges[1], 16))[2:]

        startbinary_byte_blocks = [
            start_binary[0 + i:8 + i] for i in range(0, len(start_binary), 8)
        ]
        endbinary_byte_blocks = [
            end_binary[0 + i:8 + i] for i in range(0, len(end_binary), 8)
        ]

        for i in range(len(startbinary_byte_blocks)):
            startbinary_byte_blocks[i] = startbinary_byte_blocks[i][1:]

        for i in range(len(endbinary_byte_blocks)):
            endbinary_byte_blocks[i] = endbinary_byte_blocks[i][1:]

        start_removed_parity_binary = ''.join(
            str(i) for i in startbinary_byte_blocks)

        start = int(start_removed_parity_binary, 2)

        end_removed_parity_binary = ''.join(
            str(i) for i in endbinary_byte_blocks)

        end = int(end_removed_parity_binary, 2)

        start = start + 68435456
        end = start + 100000000
        start_time = time.time()
        while start <= end:

            key_list = get_key(start)
            cracked_bytes = bits2bytes(
                dw.des_encrypt(key_list, message_binary_list))
            if cracked_bytes == ciphertext:
                print "Cracked bytes: " + cracked_bytes
                break

            start += 1
        end_time = time.time()
        print "Consumed CPU time=%f" % (end_time - start_time)

    else:
        raise Exception("Wrong mode!")
def main(argv):
    if argv[0] == 'enum_key':
        print enum_key(argv[1])
    elif argv[0] == 'crack':

        #load in my ciphertext and plaintext
        f = open('ciphertext_student_247.txt', 'r')
        ciphertext =  f.read()

        g = open('plaintext', 'r')
        plaintext = g.read()

        binary_message = bin(int(binascii.hexlify(plaintext),16))[2:].zfill(64)
        binary_message_list = map(int,list(binary_message))

        start = time.time() #start the count

        #first try (I know, this violates the DON'T-REPEAT-YOURSELF rule)
        currentKey = '8080807580808080'                     #starter key for Nick Lee
        binary_current = convert_to_binary(currentKey)
        test = des_wrapper.des_encrypt(binary_current, binary_message_list)
        test = bit2str(test)
        number_of_tries = 1

        if test == ciphertext:
            print "Found it on the first try! The key is: " + currentKey
        else:
            while currentKey != '808080757f7f7f7f':         #end key for Nick Lee
                currentKey = enum_key(currentKey)
                binary_current = convert_to_binary(currentKey)
                test = des_wrapper.des_encrypt(binary_current, binary_message_list)
                test = bit2str(test)
                number_of_tries += 1
                if test == ciphertext:
                    print "Found it after " + str(number_of_tries) + " tries. The key is: " + currentKey
                    break

        end = time.time()

        print "Consumed CPU time=%f" % (end - start)
        print "Average number per minute = %f" % (number_of_tries/(end-start)*60)

    else:
        raise Exception("Wrong mode!")
def main(argv):
    if argv[0] == 'enum_key':
        print enum_key(argv[1])
    elif argv[0] == 'crack':
        """TODO: Add your own code and do whatever you do.
        """
        message = open('plaintext', 'r').read()
        message_binary = '0' + bin(int(binascii.hexlify(message), 16))[2:]
        message_binary_list = [int(x) for x in message_binary]
        

        ciphertext = open('ciphertext', 'r').read()
        

        ranges = ['8080010d80808080','8080010d7f7f7f7f']

        start_binary = bin(int(ranges[0], 16))[2:]
        end_binary = bin(int(ranges[1], 16))[2:]

        startbinary_byte_blocks = [start_binary[0+i:8+i] for i in range(0, len(start_binary), 8)]
        endbinary_byte_blocks = [end_binary[0+i:8+i] for i in range(0, len(end_binary), 8)]

        for i in range(len(startbinary_byte_blocks)):
            startbinary_byte_blocks[i] = startbinary_byte_blocks[i][1:]

        for i in range(len(endbinary_byte_blocks)):
            endbinary_byte_blocks[i] = endbinary_byte_blocks[i][1:]

        start_removed_parity_binary = ''.join(str(i) for i in startbinary_byte_blocks)

        start = int(start_removed_parity_binary, 2)

        end_removed_parity_binary = ''.join(str(i) for i in endbinary_byte_blocks)

        end = int(end_removed_parity_binary, 2)

        start = start + 68435456
        end = start + 100000000
        start_time = time.time()
        while start <= end:
        
            key_list = get_key(start)
            cracked_bytes = bits2bytes(dw.des_encrypt(key_list, message_binary_list))
            if cracked_bytes == ciphertext:
                print "Cracked bytes: " + cracked_bytes
                break

            start +=1  
        end_time = time.time()
        print "Consumed CPU time=%f"% (end_time - start_time)

    else:
        raise Exception("Wrong mode!")
def main(argv):
    if argv[0] == 'enum_key':
        print(enum_key(argv[1]))
    elif argv[0] == 'crack':
        """TODO: Add your own code and do whatever you do.
        """
        plaintext = open('plaintext', 'r').read()
        print "plaintext = ", plaintext
        plaintext_bin = '0' + bin(int(binascii.hexlify(plaintext), 16))[2:]
        plaintext_list = [int(x) for x in plaintext_bin]
        ciphertext = open('ciphertext', 'r').read()
        keyrange = ['808080C180808080', '808080C17F7F7F7F']
        start_bin = bin(int(keyrange[0], 16))[2:]
        if len(start_bin) < 64:
            start_bin = (64 - len(start_bin)) * '0' + start_bin
        end_bin = bin(int(keyrange[1], 16))[2:]
        if len(end_bin) < 64:
            end_bin = (64 - len(end_bin)) * '0' + end_bin

        startbin_blocks = [
            start_bin[0 + i:8 + i] for i in range(0, len(start_bin), 8)
        ]
        endbin_blocks = [
            end_bin[0 + i:8 + i] for i in range(0, len(end_bin), 8)
        ]

        for i in range(len(startbin_blocks)):
            startbin_blocks[i] = startbin_blocks[i][1:]

        for i in range(len(endbin_blocks)):
            endbin_blocks[i] = endbin_blocks[i][1:]

        start_rmparity_bin = ''.join(str(i) for i in startbin_blocks)
        #print "length of start_rmparity_bin = ", len(start_rmparity_bin)

        start = int(start_rmparity_bin, 2)
        #print "start = ", start

        end_rmparity_bin = ''.join(str(i) for i in endbin_blocks)
        #print "length of end_rmparity_bin = ", len(end_rmparity_bin)

        end = int(end_rmparity_bin, 2)
        print end - start
        begintime = time.time()

        while start <= end:
            #to_hex = hex(start)[2:len(hex(start))-1]
            #key = bin(int(enum_key(to_hex), 16))[2:]
            #keylist = [int(x) for x in key]
            keylist = generatekey(start)
            decrypttext = bit2byte(
                des_wrapper.des_encrypt(keylist, plaintext_list))
            #print decrypttext
            if decrypttext == ciphertext:
                print 'key found'
                break
            start += 1
            #print "start = ",start
        endtime = time.time()
        print "time difference is = ", endtime - begintime
    else:
        raise Exception("Wrong mode!")
def main(argv):
    if argv[0] == 'enum_key':
        print enum_key(argv[1])
    elif argv[0] == 'crack':
        """TODO: Add your own code and do whatever you do.
        """
        message = open('plaintext', 'r').read()
        message_binary = '0' + bin(int(binascii.hexlify(message), 16))[2:]
        message_binary_list = [int(x) for x in message_binary]
        print len(message_binary_list)

        ciphertext = open('ciphertext', 'r').read()
        print len(ciphertext)

        ranges = ['8080010d80808080','8080010d7f7f7f7f']

        #start = int(enum_key(range[0]), 16)
        #end = int(enum_key(range[1]), 16)

        start_binary = bin(int(ranges[0], 16))[2:]
        end_binary = bin(int(ranges[1], 16))[2:]

        startbinary_byte_blocks = [start_binary[0+i:8+i] for i in range(0, len(start_binary), 8)]
        endbinary_byte_blocks = [end_binary[0+i:8+i] for i in range(0, len(end_binary), 8)]

        for i in range(len(startbinary_byte_blocks)):
            startbinary_byte_blocks[i] = startbinary_byte_blocks[i][1:]

        for i in range(len(endbinary_byte_blocks)):
            endbinary_byte_blocks[i] = endbinary_byte_blocks[i][1:]

        start_removed_parity_binary = ''.join(str(i) for i in startbinary_byte_blocks)
        #print len(start_removed_parity_binary)

        start = int(start_removed_parity_binary, 2)

        end_removed_parity_binary = ''.join(str(i) for i in endbinary_byte_blocks)

        end = int(end_removed_parity_binary, 2)

        #print end-start

        #print start_removed_parity_num
        #get_key(start_removed_parity_num)
        #print end_removed_parity_num
        #print end_removed_parity_num - start_removed_parity_num

        start = start + 168435456
        start_time = time.time()
        while start <= end:
            #to_hex = hex(start)[2:len(hex(start))-1]
            #key = bin(int(enum_key(to_hex), 16))[2:]
            #key_list = [int(x) for x in key]
            key_list = get_key(start)
            cracked_bytes = bits2bytes(dw.des_encrypt(key_list, message_binary_list))
            if cracked_bytes == ciphertext:
                print 'cracked'
                break
            else:
                print cracked_bytes
                print str(float(start)/float(end)) + '%'
            start +=1  
        end_time = time.time()
        print "Consumed CPU time=%f"% (end_time - start_time)

    else:
        raise Exception("Wrong mode!")
def main(argv):
    if argv[0] == 'enum_key':
        print enum_key(argv[1])
    elif argv[0] == 'crack':
        """TODO: Add your own code and do whatever you do.
        """
        message = open('plaintext', 'r').read()
        message_binary = '0' + bin(int(binascii.hexlify(message), 16))[2:]
        message_binary_list = [int(x) for x in message_binary]
        print len(message_binary_list)

        ciphertext = open('ciphertext', 'r').read()
        print len(ciphertext)

        ranges = ['8080010d80808080', '8080010d7f7f7f7f']

        #start = int(enum_key(range[0]), 16)
        #end = int(enum_key(range[1]), 16)

        start_binary = bin(int(ranges[0], 16))[2:]
        end_binary = bin(int(ranges[1], 16))[2:]

        startbinary_byte_blocks = [
            start_binary[0 + i:8 + i] for i in range(0, len(start_binary), 8)
        ]
        endbinary_byte_blocks = [
            end_binary[0 + i:8 + i] for i in range(0, len(end_binary), 8)
        ]

        for i in range(len(startbinary_byte_blocks)):
            startbinary_byte_blocks[i] = startbinary_byte_blocks[i][1:]

        for i in range(len(endbinary_byte_blocks)):
            endbinary_byte_blocks[i] = endbinary_byte_blocks[i][1:]

        start_removed_parity_binary = ''.join(
            str(i) for i in startbinary_byte_blocks)
        #print len(start_removed_parity_binary)

        start = int(start_removed_parity_binary, 2)

        end_removed_parity_binary = ''.join(
            str(i) for i in endbinary_byte_blocks)

        end = int(end_removed_parity_binary, 2)

        #print end-start

        #print start_removed_parity_num
        #get_key(start_removed_parity_num)
        #print end_removed_parity_num
        #print end_removed_parity_num - start_removed_parity_num

        start = start + 168435456
        start_time = time.time()
        while start <= end:
            #to_hex = hex(start)[2:len(hex(start))-1]
            #key = bin(int(enum_key(to_hex), 16))[2:]
            #key_list = [int(x) for x in key]
            key_list = get_key(start)
            cracked_bytes = bits2bytes(
                dw.des_encrypt(key_list, message_binary_list))
            if cracked_bytes == ciphertext:
                print 'cracked'
                break
            else:
                print cracked_bytes
                print str(float(start) / float(end)) + '%'
            start += 1
        end_time = time.time()
        print "Consumed CPU time=%f" % (end_time - start_time)

    else:
        raise Exception("Wrong mode!")