C/C++ MD5算法的实现代码
副问题[/!--empirenews.page--]
在逆向措施的时辰,常常会遇到加密的算法的题目,前面说明UC的逆向工程师的口试题2的时辰,发明行使了MD5的加密算法(MD5算法是本身实现的,不是行使的算法库函数)。尤其是在逆向说明收集协议的时辰,一样平常的措施行使的加密算法都是行使的库函数提供的算法,有些措施行使的算法是本身实现的;相对来说行使函数库提供的加密函数的算法相对来说较量好辨认,由于有算法常见函数在;可是假如不是行使的函数库提供的加密的函数而是本身去实现某些算法话,辨认起来有必然的难度,这就必要你对函数的加密道理以及流程还算法的特性较量认识才气很快辨认出来。下面就将网上有关MD5算法一些常识清算一下,方面本身查阅。 md5简介 动静择要算法第五版(英语:Message-Digest Algorithm 5,缩写为MD5),是当前计较机规模用于确保信息传输完备同等而普及行使的散列算法之一(又译哈希算法、择要算法等),主流编程说话广泛已有MD5的实现。将数据 (如一段笔墨)运算变为另一牢靠长度值,是散列算法的基本道理,MD5的前身有MD2、MD3和MD4。MD5由MD4、MD3、MD2改造而来,首要加强算法伟大度和不行逆性。今朝,MD5算法因其广泛、不变、快速的特点,仍普及应用于平凡 数据的错误搜查规模。譬喻在一些BitTorrent下载中,软件将通过计较MD5检讨下载到的文件片断的完备性。MD5已经普及行使在为文件传输提供必然的靠得住性方面。譬喻,处事器预先提供一个MD5校验和,用户下载完文件往后, 用MD5算法计较下载文件的MD5校验和,然后通过搜查这两个校验和是否同等,就能判定下载的文件是否堕落。MD5是输入不定长度信息,输出牢靠长度128-bits的算法。颠末措施流程,天生四个32位数据,最后连系起来成为一个 128-bits散列。根基方法为,求余、取余、调解长度、与链接变量举办轮回运算。得出功效。 md5算法描写 假设输入信息(input message)的长度为b(bit),我们想要发生它的报文择要,在此处b为恣意的非负整数:b也也许为0,也不必然为8的整数倍,且也许是恣意大的长度。设该信息的比特流暗示如下: M[0] M[1] M[2] ... M[b-1] 计较此信息的报文择要必要如下5步: 1.补位 信息计较前先要举办位补位,设补位后信息的长度为LEN(bit),则LEN%512 = 448(bit),即数据扩展至 K * 512 + 448(bit)。即K * 64+56(byte),K为整数。补位操纵始终要执行,纵然补位前信息的长度对512求余的功效是448。详细补位操纵:补一个1,然后补0至满意上述要求。总共起码要补1bit,最多补512bit。 2.尾部加上信息长度 将输入信息的原始长度b(bit)暗示成一个64-bit的数字,把它添加到上一步的功效后头(在32位的呆板上,这64位将用2个字来暗示而且低位在前)。当碰着b大于2^64这种少少的环境时,b的高位被截去,仅行使b的低64位。颠末上面两步,数据就被弥补生长度为512(bit)的倍数。也就是说,此时的数据长度是16个字(32byte)的整数倍。此时的数据暗示为: M[0 ... N-1] 个中的N是16的倍数。 3.初始化缓存区 用一个四个字的缓冲器(A,B,C,D)来计较报文择要,A,B,C,D别离是32位的寄存器,初始化行使的是十六进制暗示的数字,留意低字节在前: word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10 4.转换 起首界说4个帮助函数,每个函数的输入是三个32位的字,输出是一个32位的字: F(X,Y,Z) = XY v not(X) Z G(X,Z) = XZ v Y not(Z) H(X,Z) = X xor Y xor Z I(X,Z) = Y xor (X v not(Z)) FF(a,b,c,d,Mj,s,ti)暗示 a = b + ((a + F(b,d) + Mj + ti) << s) GG(a,ti)暗示 a = b + ((a + G(b,d) + Mj + ti) << s) HH(a,ti)暗示 a = b + ((a + H(b,d) + Mj + ti) << s) Ⅱ(a,ti)暗示 a = b + ((a + I(b,d) + Mj + ti) << s) 这四轮(64步)是: 第一轮 FF(a,M0,7,0xd76aa478) FF(d,a,M1,12,0xe8c7b756) FF(c,M2,17,0x242070db) FF(b,M3,22,0xc1bdceee) FF(a,M4,0xf57c0faf) FF(d,M5,0x4787c62a) FF(c,M6,0xa8304613) FF(b,M7,0xfd469501) FF(a,M8,0x698098d8) FF(d,M9,0x8b44f7af) FF(c,M10,0xffff5bb1) FF(b,M11,0x895cd7be) FF(a,M12,0x6b901122) FF(d,M13,0xfd987193) FF(c,M14,0xa679438e) FF(b,M15,0x49b40821) 第二轮 GG(a,5,0xf61e2562) GG(d,9,0xc040b340) GG(c,14,0x265e5a51) GG(b,20,0xe9b6c7aa) GG(a,0xd62f105d) GG(d,0x02441453) GG(c,0xd8a1e681) GG(b,0xe7d3fbc8) GG(a,0x21e1cde6) GG(d,0xc33707d6) GG(c,0xf4d50d87) GG(b,0x455a14ed) GG(a,0xa9e3e905) GG(d,0xfcefa3f8) GG(c,0x676f02d9) GG(b,0x8d2a4c8a) 第三轮 HH(a,4,0xfffa3942) HH(d,11,0x8771f681) HH(c,16,0x6d9d6122) HH(b,23,0xfde5380c) HH(a,0xa4beea44) HH(d,0x4bdecfa9) HH(c,0xf6bb4b60) HH(b,0xbebfbc70) HH(a,0x289b7ec6) HH(d,0xeaa127fa) HH(c,0xd4ef3085) HH(b,0x04881d05) HH(a,0xd9d4d039) HH(d,0xe6db99e5) HH(c,0x1fa27cf8) HH(b,0xc4ac5665) 第四轮 Ⅱ(a,6,0xf4292244) Ⅱ(d,10,0x432aff97) Ⅱ(c,15,0xab9423a7) Ⅱ(b,21,0xfc93a039) Ⅱ(a,0x655b59c3) Ⅱ(d,0x8f0ccc92) Ⅱ(c,0xffeff47d) Ⅱ(b,0x85845dd1) Ⅱ(a,0x6fa87e4f) Ⅱ(d,0xfe2ce6e0) Ⅱ(c,0xa3014314) Ⅱ(b,0x4e0811a1) Ⅱ(a,0xf7537e82) Ⅱ(d,0xbd3af235) Ⅱ(c,0x2ad7d2bb) Ⅱ(b,0xeb86d391) 下面是MD5算法的详细的实现 MD5算法的头文件Md5.h: #ifndef MD5_H #define MD5_H typedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64]; }MD5_CTX; #define F(x,y,z) ((x & y) | (~x & z)) #define G(x,z) ((x & z) | (y & ~z)) #define H(x,z) (x^y^z) #define I(x,z) (y ^ (x | ~z)) #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n))) #define FF(a,x,ac) { a += F(b,d) + x + ac; a = ROTATE_LEFT(a,s); a += b; } #define GG(a,ac) { a += G(b,d) + x + ac; a = ROTATE_LEFT(a,s); a += b; } #define HH(a,ac) { a += H(b,s); a += b; } #define II(a,ac) { a += I(b,s); a += b; } void MD5Init(MD5_CTX *context); void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen); void MD5Final(MD5_CTX *context,unsigned char digest[16]); void MD5Transform(unsigned int state[4],unsigned char block[64]); void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len); void MD5Decode(unsigned int *output,unsigned int len); #endif (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |