一、简介

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。 1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

二、MD5 哈希算法流程

1、按位补充数据

在MD5算法中,首先需要对信息进行填充,这个数据按位(bit)补充,要求最终的位数对512求模的结果为448。补位至 N *512+448。即 N *64+56个字节(Bytes),N为一个正整数
言而总之,至少补1位,而最多可能补512位 。

2、扩展长度

用一个64位的数字表示数据的原始长度b,把b用两个32位数表示。那么只取b的低64位。
当遇到b大于2^64这种极少遇到的情况时,数据就被填补成长度为512位的倍数。也就是说,
此时的数据长度是16个字(32位)的整数倍数。现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。

3、初始化MD缓存器

MD5运算要用到一个128位的MD5缓存器,用来保存中间变量和最终结果。该缓存器又可看成是4个32位的寄存器A、B、C、D。初始化为:

A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210

4、处理数据段

将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。

F(X,Y,Z) =(X&Y) | ((~X)&Z)
G(X,Y,Z) =(X&Z) | (Y&(~Z))
H(X,Y,Z) =X ^ Y^ Z
I(X,Y,Z)=Y^(X | (~Z))
(&是与,|是或,~是非,^是异或)

5、四轮运算

首先,应当将初始输入ABCD存起来:

NPUT_A = AINPUT_B = BINPUT_C = CINPUT_D = D

第一轮:
F(X,Y,Z) =(X&Y)|((~X)&Z)

A = B+((A+F(B,C,D)+M[0]+T[1])<<<7) D = A+((D+F(A,B,C)+M[1]+T[2])<<<12) C = D+((C+F(D,A,B)+M[2]+T[3])<<<17) B = C+((B+F(C,D,A)+M[3]+T[4])<<<22) A = B+((A+F(B,C,D)+M[4]+T[5])<<<7) D = A+((D+F(A,B,C)+M[5]+T[6])<<<12) C = D+((C+F(D,A,B)+M[6]+T[7])<<<17) B = C+((B+F(C,D,A)+M[7]+T[8])<<<22) A = B+((A+F(B,C,D)+M[8]+T[9])<<<7) D = A+((D+F(A,B,C)+M[9]+T[10])<<<12) C = D+((C+F(D,A,B)+M[10]+T[11])<<<17) B = C+((B+F(C,D,A)+M[11]+T[12])<<<22) A = B+((A+F(B,C,D)+M[12]+T[13])<<<7) D = A+((D+F(A,B,C)+M[13]+T[14])<<<12) C = D+((C+F(D,A,B)+M[14]+T[15])<<<17) B = C+((B+F(C,D,A)+M[15]+T[16])<<<22)

第二轮:
G(X,Y,Z) =(X&Z)|(Y&(~Z))

A = B+((A+G(B,C,D)+M[1]+T[17])<<<5) D = A+((D+G(A,B,C)+M[6]+T[18])<<<9) C = D+((C+G(D,A,B)+M[11]+T[19])<<<14) B = C+((B+G(C,D,A)+M[0]+T[20])<<<20) A = B+((A+G(B,C,D)+M[5]+T[21])<<<5) D = A+((D+G(A,B,C)+M[10]+T[22])<<<9) C = D+((C+G(D,A,B)+M[15]+T[23])<<<14) B = C+((B+G(C,D,A)+M[4]+T[24])<<<20) A = B+((A+G(B,C,D)+M[9]+T[25])<<<5) D = A+((D+G(A,B,C)+M[14]+T[26])<<<9) C = D+((C+G(D,A,B)+M[3]+T[27])<<<14) B = C+((B+G(C,D,A)+M[8]+T[28])<<<20) A = B+((A+G(B,C,D)+M[13]+T[29])<<<5) D = A+((D+G(A,B,C)+M[2]+T[30])<<<9) C = D+((C+G(D,A,B)+M[7]+T[31])<<<14) B = C+((B+G(C,D,A)+M[12]+T[32])<<<20)

第三轮:
H(X,Y,Z) =X ^ Y ^ Z

A = B+((A+H(B,C,D)+M[5]+T[33])<<<4) D = A+((D+H(A,B,C)+M[8]+T[34])<<<11) C = D+((C+H(D,A,B)+M[11]+T[35])<<<16) B = C+((B+H(C,D,A)+M[14]+T[36])<<<23) A = B+((A+H(B,C,D)+M[1]+T[37])<<<4) D = A+((D+H(A,B,C)+M[4]+T[38])<<<11) C = D+((C+H(D,A,B)+M[7]+T[39])<<<16) B = C+((B+H(C,D,A)+M[10]+T[40])<<<23) A = B+((A+H(B,C,D)+M[13]+T[41])<<<4) D = A+((D+H(A,B,C)+M[0]+T[42])<<<11) C = D+((C+H(D,A,B)+M[3]+T[43])<<<16) B = C+((B+H(C,D,A)+M[6]+T[44])<<<23) A = B+((A+H(B,C,D)+M[9]+T[45])<<<4) D = A+((D+H(A,B,C)+M[12]+T[46])<<<11) C = D+((C+H(D,A,B)+M[15]+T[47])<<<16) B = C+((B+H(C,D,A)+M[2]+T[48])<<<23)

第四轮:I(X,Y,Z)=Y^(X|(~Z))

A = B+((A+I(B,C,D)+M[0]+T[33])<<<6) D = A+((D+I(A,B,C)+M[7]+T[34])<<<10) C = D+((C+I(D,A,B)+M[14]+T[35])<<<15) B = C+((B+I(C,D,A)+M[5]+T[36])<<<21) A = B+((A+I(B,C,D)+M[12]+T[37])<<<6) D = A+((D+I(A,B,C)+M[3]+T[38])<<<10) C = D+((C+I(D,A,B)+M[10]+T[39])<<<15) B = C+((B+I(C,D,A)+M[1]+T[40])<<<21) A = B+((A+I(B,C,D)+M[8]+T[41])<<<6) D = A+((D+I(A,B,C)+M[15]+T[42])<<<10) C = D+((C+I(D,A,B)+M[6]+T[43])<<<15) B = C+((B+I(C,D,A)+M[13]+T[44])<<<21) A = B+((A+I(B,C,D)+M[4]+T[45])<<<6) D = A+((D+I(A,B,C)+M[11]+T[46])<<<10) C = D+((C+I(D,A,B)+M[2]+T[47])<<<15) B = C+((B+I(C,D,A)+M[9]+T[48])<<<21)

四轮运算完成后,将此时的ABCD与原始输入分别相加。

A = A + INPUT_AB = B + INPUT_BC = C + INPUT_CD = D + INPUT_D

至此,一次循环就完成了,最后的输出ABCD可以作为下一次的初始输入或最终输出。

三、测试

# coding=utf-8# 引入math模块,因为要用到sin函数
import math# 定义常量,用于初始化128位变量,注意字节顺序,文中的A=0x01234567,这里低值存放低字节,即01 23 45 67,所以运算时A=0x67452301,其他类似。
# 这里用字符串的形势,是为了和hex函数的输出统一,hex(10)输出为'0xA',注意结果为字符串。
A = '0x67452301'
B = '0xefcdab89'
C = '0x98badcfe'
D = '0x10325476'# 定义每轮中用到的函数。L为循环左移,注意左移之后可能会超过32位,所以要和0xffffffff做与运算,确保结果为32位。
# (&是与,|是或,~是非,^是异或)
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))# 定义每轮中循环左移的位数,这里用4个元组表示,用元组是因为速度比列表快。
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[i]次序。
m_1 = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
m_2 = (1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12)
m_3 = (5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2)
m_4 = (0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9)# 定义函数,用来产生常数T[i],常数有可能超过32位,同样需要&0xffffffff操作。注意返回的是十进制的数。
def T(i):result = (int(4294967296 * abs(math.sin(i)))) & 0xffffffffreturn result# 定义函数,用来将列表中的元素循环右移。原因是在每轮操作中,先运算A的值,然后是D,C,B,16轮之后右恢复原来顺序,所以只要每次操作第一个元素即可。
def shift(shift_list):shift_list = [shift_list[3], shift_list[0], shift_list[1], shift_list[2]]return shift_list# 定义主要的函数,参数为当做种子的列表,每轮用到的F,G,H,I,生成的M[],以及循环左移的位数。该函数完成一轮运算。
def fun(fun_list, f, m, shi):count = 0global Ti_count# 引入全局变量,T(i)是从1到64循环的。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 & 0xffffffffll = L(xx, shi[count])fun_list[0] = hex((int(fun_list[1], 16) + ll) & (0xffffffff))[:-1]# 最后的[:-1]是为了去除类似'0x12345678L'最后的'L'fun_list = shift(fun_list)count += 1Ti_count += 1print fun_listreturn fun_list# 该函数生成每轮需要的M[],最后的参数是为了当有很多分组时,进行偏移。
def genM16(order, ascii_list, f_offset):ii = 0m16 = [0] * 16f_offset = f_offset * 64for i in order:i = i * 4m16[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 += 1for c in m16:ind = m16.index(c)m16[ind] = reverse_hex(c)return m16# 翻转十六进制数的顺序:'0x01234567' => '0x67452301'
def reverse_hex(hex_str):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 show_result(f_list):result = ''f_list1 = [0] * 4for i in f_list:f_list1[f_list.index(i)] = reverse_hex(i)[2:]result = result + f_list1[f_list.index(i)]return result# 程序主循环
while True:abcd_list = [A, B, C, D]Ti_count = 1input_m = raw_input('msg>>>')# 对每一个输入先添加一个'0x80',即'10000000'ascii_list = map(hex, map(ord, input_m))msg_lenth = len(ascii_list) * 8ascii_list.append('0x80')# 补充0while (len(ascii_list) * 8 + 64) % 512 != 0:ascii_list.append('0x00')# 最后64为存放消息长度,注意长度存放顺序低位在前。# 例如,消息为'a',则长度为'0x0800000000000000'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)print ascii_list# 对每个分组进行4轮运算for i in range(0, len(ascii_list) / 64):# 将最初128位种子存放在变量中,aa, bb, cc, dd = abcd_list# 根据顺序产生每轮M[]列表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)print '--------------------------------------'abcd_list = fun(abcd_list, G, order_2, shi_2)print '--------------------------------------'abcd_list = fun(abcd_list, H, order_3, shi_3)print '--------------------------------------'abcd_list = fun(abcd_list, I, order_4, shi_4)print '--------------------------------------'# 将最后输出与最初128位种子相加,注意,最初种子不能直接使用abcd_list[0]等,因为abcd_list已经被改变output_a = hex((int(abcd_list[0], 16) + int(aa, 16)) & 0xffffffff)[:-1]output_b = hex((int(abcd_list[1], 16) + int(bb, 16)) & 0xffffffff)[:-1]output_c = hex((int(abcd_list[2], 16) + int(cc, 16)) & 0xffffffff)[:-1]output_d = hex((int(abcd_list[3], 16) + int(dd, 16)) & 0xffffffff)[:-1]# 将输出放到列表中,作为下一次128位种子abcd_list = [output_a, output_b, output_c, output_d]# 将全局变量Ti_count恢复,一遍开始下一个分组的操作。Ti_count = 1# 最后调用函数,格式化输出print 'md5>>>' + show_result(abcd_list)

1、test1

输入为test1,输出为:5a105e8b9d40e1329780d62ea2265d8a

['0x74', '0x65', '0x73', '0x74', '0x31', '0x80', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x28', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00']
--------------------------------------------------------
['0x10325476', '0xded2a12e', '0xefcdab89', '0x98badcfe']
['0x98badcfe', '0x176ffdac', '0xded2a12e', '0xefcdab89']
['0xefcdab89', '0xf97d74e7', '0x176ffdac', '0xded2a12e']
['0xded2a12e', '0x26fd3c3', '0xf97d74e7', '0x176ffdac']
['0x176ffdac', '0xe086ba37', '0x26fd3c3', '0xf97d74e7']
['0xf97d74e7', '0x5a3051be', '0xe086ba37', '0x26fd3c3']
['0x26fd3c3', '0xf51415b8', '0x5a3051be', '0xe086ba37']
['0xe086ba37', '0x15e82801', '0xf51415b8', '0x5a3051be']
['0x5a3051be', '0xa1ba8ed5', '0x15e82801', '0xf51415b8']
['0xf51415b8', '0xb7e3f287', '0xa1ba8ed5', '0x15e82801']
['0x15e82801', '0xafc12002', '0xb7e3f287', '0xa1ba8ed5']
['0xa1ba8ed5', '0x5552f02d', '0xafc12002', '0xb7e3f287']
['0xb7e3f287', '0xeb342d07', '0x5552f02d', '0xafc12002']
['0xafc12002', '0xc3762cbb', '0xeb342d07', '0x5552f02d']
['0x5552f02d', '0x82f48799', '0xc3762cbb', '0xeb342d07']
['0xeb342d07', '0xbe572662', '0x82f48799', '0xc3762cbb']
--------------------------------------------------------
['0xc3762cbb', '0x43865dee', '0xbe572662', '0x82f48799']
['0x82f48799', '0xbf922972', '0x43865dee', '0xbe572662']
['0xbe572662', '0x168853ab', '0xbf922972', '0x43865dee']
['0x43865dee', '0x6a3604c7', '0x168853ab', '0xbf922972']
['0xbf922972', '0xe42e278f', '0x6a3604c7', '0x168853ab']
['0x168853ab', '0xcb94feb', '0xe42e278f', '0x6a3604c7']
['0x6a3604c7', '0xa5372ec3', '0xcb94feb', '0xe42e278f']
['0xe42e278f', '0x9c671ad9', '0xa5372ec3', '0xcb94feb']
['0xcb94feb', '0x34b22af', '0x9c671ad9', '0xa5372ec3']
['0xa5372ec3', '0x6a602c81', '0x34b22af', '0x9c671ad9']
['0x9c671ad9', '0x839c95de', '0x6a602c81', '0x34b22af']
['0x34b22af', '0x48e16471', '0x839c95de', '0x6a602c81']
['0x6a602c81', '0x2e5986df', '0x48e16471', '0x839c95de']
['0x839c95de', '0xc1c47842', '0x2e5986df', '0x48e16471']
['0x48e16471', '0xe0a5ccbb', '0xc1c47842', '0x2e5986df']
['0x2e5986df', '0xba1145d5', '0xe0a5ccbb', '0xc1c47842']
--------------------------------------------------------
['0xc1c47842', '0x565c5ab1', '0xba1145d5', '0xe0a5ccbb']
['0xe0a5ccbb', '0x50716d61', '0x565c5ab1', '0xba1145d5']
['0xba1145d5', '0xf05377e0', '0x50716d61', '0x565c5ab1']
['0x565c5ab1', '0xd2ab23f', '0xf05377e0', '0x50716d61']
['0x50716d61', '0x8f719089', '0xd2ab23f', '0xf05377e0']
['0xf05377e0', '0x540490fb', '0x8f719089', '0xd2ab23f']
['0xd2ab23f', '0xc9924e69', '0x540490fb', '0x8f719089']
['0x8f719089', '0x2f01b747', '0xc9924e69', '0x540490fb']
['0x540490fb', '0xd949498d', '0x2f01b747', '0xc9924e69']
['0xc9924e69', '0x77c1b124', '0xd949498d', '0x2f01b747']
['0x2f01b747', '0x469dd12e', '0x77c1b124', '0xd949498d']
['0xd949498d', '0x302ba0ac', '0x469dd12e', '0x77c1b124']
['0x77c1b124', '0x79894777', '0x302ba0ac', '0x469dd12e']
['0x469dd12e', '0x5d993ae5', '0x79894777', '0x302ba0ac']
['0x302ba0ac', '0x88fdb561', '0x5d993ae5', '0x79894777']
['0x79894777', '0x8b4e9841', '0x88fdb561', '0x5d993ae5']
--------------------------------------------------------
['0x5d993ae5', '0xf99c7282', '0x8b4e9841', '0x88fdb561']
['0x88fdb561', '0x4e11ded8', '0xf99c7282', '0x8b4e9841']
['0x8b4e9841', '0x1683cb7', '0x4e11ded8', '0xf99c7282']
['0xf99c7282', '0x75a2684a', '0x1683cb7', '0x4e11ded8']
['0x4e11ded8', '0x552aef9e', '0x75a2684a', '0x1683cb7']
['0x1683cb7', '0x45f6e93a', '0x552aef9e', '0x75a2684a']
['0x75a2684a', '0xe6a1b750', '0x45f6e93a', '0x552aef9e']
['0x552aef9e', '0x79967ca4', '0xe6a1b750', '0x45f6e93a']
['0x45f6e93a', '0xfe24655c', '0x79967ca4', '0xe6a1b750']
['0xe6a1b750', '0x2daa3c88', '0xfe24655c', '0x79967ca4']
['0x79967ca4', '0x98202a41', '0x2daa3c88', '0xfe24655c']
['0xfe24655c', '0x2e2fa843', '0x98202a41', '0x2daa3c88']
['0x2daa3c88', '0x2418ed59', '0x2e2fa843', '0x98202a41']
['0x98202a41', '0x7a2ad22c', '0x2418ed59', '0x2e2fa843']
['0x2e2fa843', '0x961ba399', '0x7a2ad22c', '0x2418ed59']
['0x2418ed59', '0x43139514', '0x961ba399', '0x7a2ad22c']
--------------------------------------------------------

2、test2

再来看看2个分组的,输入为:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

输出为:8c0b45ac70826fd5e9e128bb53ccee

['0x41', '0x42', '0x43', '0x44', '0x45', '0x46', '0x47', '0x48', '0x49', '0x4a', '0x4b', '0x4c', '0x4d', '0x4e', '0x4f', '0x50', '0x51', '0x52', '0x53', '0x54', '0x55', '0x56', '0x57', '0x58', '0x59', '0x5a', '0x61', '0x62', '0x63', '0x64', '0x65', '0x66', '0x67', '0x68', '0x69', '0x6a', '0x6b', '0x6c', '0x6d', '0x6e', '0x6f', '0x70', '0x71', '0x72', '0x73', '0x74', '0x75', '0x76', '0x77', '0x78', '0x79', '0x7a', '0x41', '0x42', '0x43', '0x44', '0x45', '0x46', '0x47', '0x48', '0x49', '0x4a', '0x4b', '0x4c', '0x4d', '0x4e', '0x4f', '0x50', '0x51', '0x52', '0x53', '0x54', '0x55', '0x56', '0x57', '0x58', '0x59', '0x5a', '0x61', '0x62', '0x63', '0x64', '0x65', '0x66', '0x67', '0x68', '0x69', '0x6a', '0x6b', '0x6c', '0x6d', '0x6e', '0x6f', '0x70', '0x71', '0x72', '0x73', '0x74', '0x75', '0x76', '0x77', '0x78', '0x79', '0x7a', '0x80', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x40', '0x03', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00']
--------------------------------------------------------
['0x10325476', '0xc6c10796', '0xefcdab89', '0x98badcfe']
['0x98badcfe', '0x99a09999', '0xc6c10796', '0xefcdab89']
['0xefcdab89', '0x11067980', '0x99a09999', '0xc6c10796']
['0xc6c10796', '0x27bce07a', '0x11067980', '0x99a09999']
['0x99a09999', '0xf22e6c4e', '0x27bce07a', '0x11067980']
['0x11067980', '0xb4ac9218', '0xf22e6c4e', '0x27bce07a']
['0x27bce07a', '0xa95a2fc0', '0xb4ac9218', '0xf22e6c4e']
['0xf22e6c4e', '0xa4799506', '0xa95a2fc0', '0xb4ac9218']
['0xb4ac9218', '0x1eb3e7c1', '0xa4799506', '0xa95a2fc0']
['0xa95a2fc0', '0xa6e70cfe', '0x1eb3e7c1', '0xa4799506']
['0xa4799506', '0xca27520b', '0xa6e70cfe', '0x1eb3e7c1']
['0x1eb3e7c1', '0x8a7612ec', '0xca27520b', '0xa6e70cfe']
['0xa6e70cfe', '0x3cbdcd45', '0x8a7612ec', '0xca27520b']
['0xca27520b', '0xc9efd874', '0x3cbdcd45', '0x8a7612ec']
['0x8a7612ec', '0x17455fbf', '0xc9efd874', '0x3cbdcd45']
['0x3cbdcd45', '0x89d7fc8e', '0x17455fbf', '0xc9efd874']
--------------------------------------------------------
['0xc9efd874', '0xe73b0bf1', '0x89d7fc8e', '0x17455fbf']
['0x17455fbf', '0x325e88e9', '0xe73b0bf1', '0x89d7fc8e']
['0x89d7fc8e', '0x20fd8f8e', '0x325e88e9', '0xe73b0bf1']
['0xe73b0bf1', '0x411c1487', '0x20fd8f8e', '0x325e88e9']
['0x325e88e9', '0x10eb59c9', '0x411c1487', '0x20fd8f8e']
['0x20fd8f8e', '0xb39c39a', '0x10eb59c9', '0x411c1487']
['0x411c1487', '0x8dc25993', '0xb39c39a', '0x10eb59c9']
['0x10eb59c9', '0x70faeaf6', '0x8dc25993', '0xb39c39a']
['0xb39c39a', '0x37a8c09a', '0x70faeaf6', '0x8dc25993']
['0x8dc25993', '0x199217b2', '0x37a8c09a', '0x70faeaf6']
['0x70faeaf6', '0x479a9250', '0x199217b2', '0x37a8c09a']
['0x37a8c09a', '0x3f3d97df', '0x479a9250', '0x199217b2']
['0x199217b2', '0xdc4e0e2f', '0x3f3d97df', '0x479a9250']
['0x479a9250', '0xd46913ec', '0xdc4e0e2f', '0x3f3d97df']
['0x3f3d97df', '0x59c74e62', '0xd46913ec', '0xdc4e0e2f']
['0xdc4e0e2f', '0x25f142e9', '0x59c74e62', '0xd46913ec']
--------------------------------------------------------
['0xd46913ec', '0xf5dd15c6', '0x25f142e9', '0x59c74e62']
['0x59c74e62', '0x723e2047', '0xf5dd15c6', '0x25f142e9']
['0x25f142e9', '0xd9e0033', '0x723e2047', '0xf5dd15c6']
['0xf5dd15c6', '0x84194dae', '0xd9e0033', '0x723e2047']
['0x723e2047', '0x6de4904b', '0x84194dae', '0xd9e0033']
['0xd9e0033', '0xee55001', '0x6de4904b', '0x84194dae']
['0x84194dae', '0x4cbfa1d8', '0xee55001', '0x6de4904b']
['0x6de4904b', '0x5cb22646', '0x4cbfa1d8', '0xee55001']
['0xee55001', '0xf774b565', '0x5cb22646', '0x4cbfa1d8']
['0x4cbfa1d8', '0xede6e8f', '0xf774b565', '0x5cb22646']
['0x5cb22646', '0x2d3485a6', '0xede6e8f', '0xf774b565']
['0xf774b565', '0x2580a2a3', '0x2d3485a6', '0xede6e8f']
['0xede6e8f', '0x87945bd7', '0x2580a2a3', '0x2d3485a6']
['0x2d3485a6', '0x27824bd1', '0x87945bd7', '0x2580a2a3']
['0x2580a2a3', '0x270e6a89', '0x27824bd1', '0x87945bd7']
['0x87945bd7', '0x176d32e7', '0x270e6a89', '0x27824bd1']
--------------------------------------------------------
['0x27824bd1', '0x34946395', '0x176d32e7', '0x270e6a89']
['0x270e6a89', '0xe267d287', '0x34946395', '0x176d32e7']
['0x176d32e7', '0xaaa7cf2d', '0xe267d287', '0x34946395']
['0x34946395', '0x96568b33', '0xaaa7cf2d', '0xe267d287']
['0xe267d287', '0xefc1485', '0x96568b33', '0xaaa7cf2d']
['0xaaa7cf2d', '0xc9b13eb2', '0xefc1485', '0x96568b33']
['0x96568b33', '0x18fb40d9', '0xc9b13eb2', '0xefc1485']
['0xefc1485', '0xab4dce79', '0x18fb40d9', '0xc9b13eb2']
['0xc9b13eb2', '0xdbf0865d', '0xab4dce79', '0x18fb40d9']
['0x18fb40d9', '0x67740c00', '0xdbf0865d', '0xab4dce79']
['0xab4dce79', '0xb484f132', '0x67740c00', '0xdbf0865d']
['0xdbf0865d', '0xb62723d5', '0xb484f132', '0x67740c00']
['0x67740c00', '0x26bda321', '0xb62723d5', '0xb484f132']
['0xb484f132', '0x1ab924f4', '0x26bda321', '0xb62723d5']
['0xb62723d5', '0x51c3f96a', '0x1ab924f4', '0x26bda321']
['0x26bda321', '0xed3e6c31', '0x51c3f96a', '0x1ab924f4']
--------------------------------------------------------
md5>>>22c6028eba170cdd68d67eea6a79eb2a
['0x2aeb796a', '0x3327bf8a', '0xdd0c17ba', '0xea7ed668']
['0xea7ed668', '0x60d773a0', '0x3327bf8a', '0xdd0c17ba']
['0xdd0c17ba', '0xb3bbbab', '0x60d773a0', '0x3327bf8a']
['0x3327bf8a', '0x33880c49', '0xb3bbbab', '0x60d773a0']
['0x60d773a0', '0x67dfaf32', '0x33880c49', '0xb3bbbab']
['0xb3bbbab', '0x73cb5319', '0x67dfaf32', '0x33880c49']
['0x33880c49', '0x6ebe5e61', '0x73cb5319', '0x67dfaf32']
['0x67dfaf32', '0xa1c02162', '0x6ebe5e61', '0x73cb5319']
['0x73cb5319', '0xd2479cbf', '0xa1c02162', '0x6ebe5e61']
['0x6ebe5e61', '0xf2a1af27', '0xd2479cbf', '0xa1c02162']
['0xa1c02162', '0x80943325', '0xf2a1af27', '0xd2479cbf']
['0xd2479cbf', '0xb893ab4f', '0x80943325', '0xf2a1af27']
['0xf2a1af27', '0xfc7e2e4f', '0xb893ab4f', '0x80943325']
['0x80943325', '0xc240c8db', '0xfc7e2e4f', '0xb893ab4f']
['0xb893ab4f', '0xcc5089c', '0xc240c8db', '0xfc7e2e4f']
['0xfc7e2e4f', '0x9fc1b914', '0xcc5089c', '0xc240c8db']
--------------------------------------------------------
['0xc240c8db', '0x56677bee', '0x9fc1b914', '0xcc5089c']
['0xcc5089c', '0xbfaba0fe', '0x56677bee', '0x9fc1b914']
['0x9fc1b914', '0x912665b0', '0xbfaba0fe', '0x56677bee']
['0x56677bee', '0x9cdf9d1b', '0x912665b0', '0xbfaba0fe']
['0xbfaba0fe', '0xed6d6a1', '0x9cdf9d1b', '0x912665b0']
['0x912665b0', '0xadfbd03e', '0xed6d6a1', '0x9cdf9d1b']
['0x9cdf9d1b', '0xb5b6ce67', '0xadfbd03e', '0xed6d6a1']
['0xed6d6a1', '0xee0fdbf3', '0xb5b6ce67', '0xadfbd03e']
['0xadfbd03e', '0xd64f4a1f', '0xee0fdbf3', '0xb5b6ce67']
['0xb5b6ce67', '0x5abd20bd', '0xd64f4a1f', '0xee0fdbf3']
['0xee0fdbf3', '0xe87e3a8b', '0x5abd20bd', '0xd64f4a1f']
['0xd64f4a1f', '0xe8656863', '0xe87e3a8b', '0x5abd20bd']
['0x5abd20bd', '0xfbb31150', '0xe8656863', '0xe87e3a8b']
['0xe87e3a8b', '0x6a89e680', '0xfbb31150', '0xe8656863']
['0xe8656863', '0xf242b5fc', '0x6a89e680', '0xfbb31150']
['0xfbb31150', '0xbe192fa6', '0xf242b5fc', '0x6a89e680']
--------------------------------------------------------
['0x6a89e680', '0x8cac2cde', '0xbe192fa6', '0xf242b5fc']
['0xf242b5fc', '0xd4ebee29', '0x8cac2cde', '0xbe192fa6']
['0xbe192fa6', '0xd95b3468', '0xd4ebee29', '0x8cac2cde']
['0x8cac2cde', '0xa1f9c218', '0xd95b3468', '0xd4ebee29']
['0xd4ebee29', '0xc271dedb', '0xa1f9c218', '0xd95b3468']
['0xd95b3468', '0xdcc8e0eb', '0xc271dedb', '0xa1f9c218']
['0xa1f9c218', '0xc927e2b3', '0xdcc8e0eb', '0xc271dedb']
['0xc271dedb', '0x8ec40ee0', '0xc927e2b3', '0xdcc8e0eb']
['0xdcc8e0eb', '0xf24ab478', '0x8ec40ee0', '0xc927e2b3']
['0xc927e2b3', '0x7c5a2e3', '0xf24ab478', '0x8ec40ee0']
['0x8ec40ee0', '0x8dd21ea6', '0x7c5a2e3', '0xf24ab478']
['0xf24ab478', '0xd48f29f6', '0x8dd21ea6', '0x7c5a2e3']
['0x7c5a2e3', '0x27a857b0', '0xd48f29f6', '0x8dd21ea6']
['0x8dd21ea6', '0xdc959b1c', '0x27a857b0', '0xd48f29f6']
['0xd48f29f6', '0x5d8e7843', '0xdc959b1c', '0x27a857b0']
['0x27a857b0', '0x2d5a9b88', '0x5d8e7843', '0xdc959b1c']
--------------------------------------------------------
['0xdc959b1c', '0xf2ae95ff', '0x2d5a9b88', '0x5d8e7843']
['0x5d8e7843', '0x4f0cfbc6', '0xf2ae95ff', '0x2d5a9b88']
['0x2d5a9b88', '0x53a616d9', '0x4f0cfbc6', '0xf2ae95ff']
['0xf2ae95ff', '0x7c9ac13e', '0x53a616d9', '0x4f0cfbc6']
['0x4f0cfbc6', '0x568bab3f', '0x7c9ac13e', '0x53a616d9']
['0x53a616d9', '0x47be7649', '0x568bab3f', '0x7c9ac13e']
['0x7c9ac13e', '0xb8a4e8ce', '0x47be7649', '0x568bab3f']
['0x568bab3f', '0x358f806d', '0xb8a4e8ce', '0x47be7649']
['0x47be7649', '0xbacf4cfd', '0x358f806d', '0xb8a4e8ce']
['0xb8a4e8ce', '0xabc2313d', '0xbacf4cfd', '0x358f806d']
['0x358f806d', '0x1189bee5', '0xabc2313d', '0xbacf4cfd']
['0xbacf4cfd', '0x2e9a0149', '0x1189bee5', '0xabc2313d']
['0xabc2313d', '0x1e42456a', '0x2e9a0149', '0x1189bee5']
['0x1189bee5', '0xc3e0da51', '0x1e42456a', '0x2e9a0149']
['0x2e9a0149', '0x15aa0b81', '0xc3e0da51', '0x1e42456a']
['0x1e42456a', '0xf8636ab6', '0x15aa0b81', '0xc3e0da51']
--------------------------------------------------------

四、结论

MD5作为一种检验手段被广泛应用,特别在用户密码保存方面,因其不可逆和低碰撞的特性更是大受欢迎。安卓逆向中很多时候都会用到MD5,所以了解MD5对于逆向工程师来说是非常有必要的。

密码学 MD5信息摘要算法相关推荐

  1. 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法

    1 介绍 1.1 DES对称加密算法介绍 对称加密算法 通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成.通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥 ...

  2. MD5信息摘要算法详解

    MD5信息摘要算法详解 文章目录 MD5信息摘要算法详解 01 MD5概要 02 MD5特性 03 MD5应用 04 MD5实现算法 05 MD5在线网站 01 MD5概要 MD5信息摘要算法,一种被 ...

  3. 简述MD5信息摘要算法

    在之前的文章中,我们聊了不少的加密算法,今天我们聊一种被广泛使用的密码散列函数--MD5. MD5又叫MD5信息摘要算法,经常用于确保信息传输的完整性和一致性 .从严格意义上来说,MD5并不是加密算法 ...

  4. 一文详解 MD5 信息摘要算法

    对于软件研发人员来说 MD5 不是一个陌生的词汇,平时的软件研发中,经常使用 MD5 校验消息是否被篡改.验证文件完整性,甚至将MD5当作加密算法使用. MD5虽不陌生,但不是所有研发人员都了解其算法 ...

  5. MD5信息摘要算法解析

    个人博客请访问 http://www.x0100.top 小明:老师,最近老板让我研究微信支付的接口文档,可是有个地方我总是弄不明白. 老师:什么地方不明白,说来听听. 小明:微信支付的接口有许多业务 ...

  6. 密码学专题 信息摘要和数字签名指令

    信息摘要 区别于对称加密和非对称加密,信息摘要算数是一种不可逆的操作,无论输入数据的大小输出的数据长度是固定的 信息摘要算数对输入很敏感,即使数据变化很细微,输出的结果会出现很大的差异 从不同输入得到 ...

  7. 【愚公系列】2022年04月 现代密码学-MD5

    一.MD5概念 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value), ...

  8. 信息摘要算法之一:MD5算法解析及实现

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  9. 加密解密、信息摘要算法收集

    MD5算法研究 综述 md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa ...

最新文章

  1. 博士生宿舍条件太好,本科生因疫情暂住惊到结巴!网友:不然咱读个博?
  2. ALV标准过滤功能失效
  3. 蓝桥杯JAVA省赛2013-----B------4(黄金连分数)
  4. 保驾护航金三银四,含BATJM大厂
  5. 自已开发完美的触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
  6. 视觉SLAM笔记(41) 光流
  7. vc通过ADO连接sql server 2000的核心代码
  8. php中的each()用法和list()用法
  9. 嵌入式Linux进程信息及内存布局
  10. 万能python,画个滑稽来玩玩
  11. 四年前,我设计了一款纹胸小样儿……如图……
  12. 文件下载文件中文名问题
  13. 动态DNS的定义以及优缺点有哪些
  14. 对话 IJCAI 07「卓越研究奖」得主 Alan Bundy :理解智能的本质是 AI 发展的终极目标
  15. 计算机没有网络时间不准如何设置,轻松解决电脑时间不准的方法
  16. 最全的100个Python精选库,建议收藏!
  17. sql语言学习——数据定义语言
  18. 人脸、指纹、虹膜、行为,你需要的人工智能生物识别AI数据集全在这里
  19. 数据结构学习之二叉树(理论篇)
  20. 利用STM32F103的DAC结合xtr111实现4-25mA输出的数据分析

热门文章

  1. 第九章 账务处理子系统设计
  2. 01背包中是否背包装满问题
  3. 农行网银显示获取服务器超时,农业银行网上银行证书更新
  4. Assertion failed: (KALDI_ISFINITE(sigma) “Tridiagonalizing matrix that is too large or has NaNs.“
  5. vue实现仿DJI大疆官网顶部导航栏组件
  6. 关于程序猿,你不知道的15件事
  7. Simple WPF:实现一个透明、无边框、鼠标穿透的WPF窗体
  8. 实验室规划设计方案SICOLAB
  9. 汤家凤高等数学基础阶段课程的随堂笔记并标记重点
  10. 普通话测试第四题评分标准_普通话水平测试评分标准