MD5算法

您所在的位置:网站首页 c语言md5实现 MD5算法

MD5算法

2024-06-30 18:15| 来源: 网络整理| 查看: 265

MD5算法原理

MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。

具体实现可参考博客 https://blog.csdn.net/sinat_27933301/article/details/79538169

和官方标准RFC1321 https://tools.ietf.org/html/rfc1321

算法实现 一些常量的定义 //定义循环右移函数 #define RPTATE_SHIFT(x, n) (((x) > (32-(n)))) //定义F,G,H,I函数 #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) //定义寄存器word A,B,C,D #define A 0x67452301 #define B 0xefcdab89 #define C 0x98badcfe #define D 0x10325476 //strBaye的长度 unsigned int strlength = 0; //A,B,C,D的临时变量 int tempA = 0, tempB = 0, tempC = 0, tempD = 0; //定义k数组,用于压缩函数 const unsigned int k[] = { 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821, 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a, 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70, 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665, 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1, 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391 }; //用数组存储向左位移数,方便操作 //每一行 表示一轮的左位移数 , 根据 RFC 1321的标准参数来做 const unsigned int s[] = { 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22, 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23, 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21 }; //用于转换16进制 const char str16[] = "0123456789abcdef";

这些定义包括标准里的 A,B,C,D word, F,G,H,I函数, 用于压缩参数的常量值, 这些先定义下来,方便后面写程序,防止出错

在这里插入图片描述

主要函数getMD5Code

此暗示通过传入一个字符串,返回对此字符串进行MD4处理得到的摘要字符串ik, 这是一个主要的流程。

首先初始化最终的变量A,B,C,D, 然后进行填充操作, 进行压缩操作, 最后转换为16进制哈希值。

string getMD5Code(string source) { //初始化 tempA = A; tempB = B; tempC = C; tempD = D; //把string变成二进制, 同时附加填充位 unsigned int *strByte = padding(source); // 对于i = 0到N / 16-1 将块i复制到X. // 对于j = 0到15做 // 将X [j]设置为M [i * 16 + j]。 // 进行压缩函数操作 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3