1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
| import math
A = '0x67452301' B = '0xefcdab89' C = '0x98badcfe' D = '0x10325476'
F = lambda x, y, z: ((x & y) | ((~x) & z)) G = lambda x, y, z: ((x & z) | (y & (~z))) H = lambda x, y, z: (x ^ y ^ z) I = lambda x, y, z: (y ^ (x | (~z))) L = lambda x, n: (((x << n) | (x >> (32 - n))) & 0xffffffff)
shi_1 = (7, 12, 17, 22) * 4 shi_2 = (5, 9, 14, 20) * 4 shi_3 = (4, 11, 16, 23) * 4 shi_4 = (6, 10, 15, 21) * 4
m_1 = (i for i in range(16)) m_2 = ((1 + 5 * i) % 16 for i in range(16)) m_3 = ((5 + 3 * i) % 16 for i in range(16)) m_4 = (7 * i % 16 for i in range(16))
def reverse_hex(hex_str): """翻转十六进制数的顺序:'0x01234567' => '0x67452301'""" hex_str = hex_str[2:] hex_str_list = [] for i in range(0, len(hex_str), 2): hex_str_list.append(hex_str[i:i + 2]) hex_str_list.reverse() hex_str_result = '0x' + ''.join(hex_str_list) return hex_str_result
def T(i): """定义函数,用来产生常数T[i],常数有可能超过32位,同样需要&0xffffffff操作。注意返回的是十进制的数。""" result = (int(2 ** 32 * abs(math.sin(i)))) & 0xffffffff return result
def shift(shift_list): """用来将列表中的元素循环右移。""" shift_list = [shift_list[3], shift_list[0], shift_list[1], shift_list[2]] return shift_list
def fun(fun_list, f, m, shi): """主要的函数,参数为当做种子的列表,每轮用到的F,G,H,I,生成的M[],以及循环左移的位数。该函数完成一轮运算。""" count = 0 global Ti_count while count < 16: xx = int(fun_list[0], 16) + f(int(fun_list[1], 16), int(fun_list[2], 16), int(fun_list[3], 16)) + int(m[count],16) + T(Ti_count) xx = xx & 0xffffffff ll = L(xx, shi[count]) fun_list[0] = hex((int(fun_list[1], 16) + ll) & 0xffffffff) fun_list = shift(fun_list) count += 1 Ti_count += 1 return fun_list
def genM16(order, ascii_list, f_offset): """该函数生成每轮需要的M[],最后的参数是为了当有很多分组时,进行偏移。""" ii = 0 m16 = [0] * 16 f_offset = f_offset * 64 for i in order: i = i * 4 m16[ii] = '0x' + ''.join((ascii_list[i + f_offset] + ascii_list[i + 1 + f_offset] + ascii_list[ i + 2 + f_offset] + ascii_list[i + 3 + f_offset]).split('0x')) ii += 1 for c in m16: ind = m16.index(c) m16[ind] = reverse_hex(c) return m16
def show_result(f_list): """显示结果函数,将最后运算的结果列表进行翻转,合并成字符串的操作。""" result = '' f_list1 = [0] * 4 for i in f_list: f_list1[f_list.index(i)] = reverse_hex(i)[2:] result = result + f_list1[f_list.index(i)] return result
def fill_input(): """输入数据并填充,非中文""" input_m = input('msg > ') ascii_list = list((map(hex, map(ord, input_m)))) msg_lenth = len(ascii_list) * 8 ascii_list.append('0x80') while (len(ascii_list) * 8 + 64) % 512 != 0: ascii_list.append('0x00') msg_lenth_0x = hex(msg_lenth)[2:] msg_lenth_0x = '0x' + msg_lenth_0x.rjust(16, '0') msg_lenth_0x_big_order = reverse_hex(msg_lenth_0x)[2:] msg_lenth_0x_list = [] for i in range(0, len(msg_lenth_0x_big_order), 2): msg_lenth_0x_list.append('0x' + msg_lenth_0x_big_order[i:i + 2]) ascii_list.extend(msg_lenth_0x_list) return ascii_list
if __name__ == '__main__': """主函数""" abcd_list = [A, B, C, D] Ti_count = 1 ascii_list = fill_input() for i in range(0, len(ascii_list) // 64): aa, bb, cc, dd = abcd_list order_1 = genM16(m_1, ascii_list, i) order_2 = genM16(m_2, ascii_list, i) order_3 = genM16(m_3, ascii_list, i) order_4 = genM16(m_4, ascii_list, i) abcd_list = fun(abcd_list, F, order_1, shi_1) abcd_list = fun(abcd_list, G, order_2, shi_2) abcd_list = fun(abcd_list, H, order_3, shi_3) abcd_list = fun(abcd_list, I, order_4, shi_4) output_a = hex((int(abcd_list[0], 16) + int(aa, 16)) & 0xffffffff) output_b = hex((int(abcd_list[1], 16) + int(bb, 16)) & 0xffffffff) output_c = hex((int(abcd_list[2], 16) + int(cc, 16)) & 0xffffffff) output_d = hex((int(abcd_list[3], 16) + int(dd, 16)) & 0xffffffff) abcd_list = [output_a, output_b, output_c, output_d] Ti_count = 1 print('md5 > ' + show_result(abcd_list))
|