关于MD5说明及代码实现

上传人:jiups****uk12 文档编号:40253259 上传时间:2018-05-25 格式:DOCX 页数:17 大小:421.33KB
返回 下载 相关 举报
关于MD5说明及代码实现_第1页
第1页 / 共17页
关于MD5说明及代码实现_第2页
第2页 / 共17页
关于MD5说明及代码实现_第3页
第3页 / 共17页
关于MD5说明及代码实现_第4页
第4页 / 共17页
关于MD5说明及代码实现_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《关于MD5说明及代码实现》由会员分享,可在线阅读,更多相关《关于MD5说明及代码实现(17页珍藏版)》请在金锄头文库上搜索。

1、Comment P1: 先将初始链表变量赋 值给中间变量。Comment P2: 上面提到的非线性函 数。一、一、MD5MD5 概念概念MD5,全名 Message Digest Algorithm 5 ,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。MD5 是一种信息摘要算法,主要是通过特定的 hash 散列方法将文本信息转换成简短的信息摘要,压缩+加密+hash 算法的结合体,是绝对不可逆的。备注:HASH 算法,哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形

2、式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。二、二、MD5MD5 计算步骤计算步骤MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。备注:512 位(64 字节)分组 = 16 * 32 位(4 字节)子分组。输出为 4 * 32 位(4 字节) = 128 位(16 字节),16

3、 字节用 16 进制表示为 32 个 ASCII 码。第一步、填充。在 MD5 算法中,首先需要对信息进行填充,使其位长对 512 求余的结果等于 448,并且填充必须进行,即使其位长对 512 求余的结果等于 448(则需要填充 512 位) 。因此,信息的位长(Bits Length)将被扩展至 N*512+448,N 为一个非负整数,N 可以是零(如填充前的位长 (32-(n) / 外部函数 void md5(INT8U* ); #endif /* * * 文件名称:md5.c * 作 者:曾光辉 * 版 本: * 硬件平台: * 软件平台: * 说 明:本程序实现的是一种非规范 md5

4、 算法。它不规范的地方在于有: 1)字符串的 bit 长度是 8 的整数倍,而不是任意的。2)字符串的 bit 长度被限制在 065535 之间。 * 创建日期:2010-9-1 * 修改记录: * */ 文件包含 #include“md5.h“ #include #include/ 全局变量 INT32U xdata x16;/*分组暂存区*/ INT32U xdata a,b,c,d;/*中间变量*/ INT32U xdata state4;/*md5 码*/* * * 函数名称:INT32U f();INT32U g();INT32U h();INT32U i();void ff();v

5、oid gg();void hh();void ii() * 函数功能:md5 算法定义的函数 * 入口参数: * 出口参数: * 作 者:曾光辉 * 说 明: * 创建日期:2010-9-2 * 修改记录: * */ /注意形参的类型应该是 U32 INT32U f(INT32U x,INT32U y,INT32U z) return (x INT32U g(INT32U x,INT32U y,INT32U z) return (x INT32U h(INT32U x,INT32U y,INT32U z) return xyz; INT32U i(INT32U x,INT32U y,INT3

6、2U z) return y(x|(z); / 第一轮运算函数 void ff(INT32U x,INT32U s,INT32U ac) if(s=S11|s=S21|s=S31|s=S41) a+=f(b,c,d)+x+ac; a=ROTATE_LEFT(a,s); a+=b; if(s=S12|s=S22|s=S32|s=S42) d+=f(a,b,c)+x+ac; d=ROTATE_LEFT(d,s); d+=a; if(s=S13|s=S23|s=S33|s=S43) c+=f(d,a,b)+x+ac; c=ROTATE_LEFT(c,s); c+=d; if(s=S14|s=S24|

7、s=S34|s=S44) b+=f(c,d,a)+x+ac; b=ROTATE_LEFT(b,s); b+=c; / 第二轮运算函数 void gg(INT32U x,INT32U s,INT32U ac) if(s=S11|s=S21|s=S31|s=S41) a+=g(b,c,d)+x+ac; a=ROTATE_LEFT(a,s); a+=b; if(s=S12|s=S22|s=S32|s=S42) d+=g(a,b,c)+x+ac; d=ROTATE_LEFT(d,s); d+=a; if(s=S13|s=S23|s=S33|s=S43) c+=g(d,a,b)+x+ac; c=ROTA

8、TE_LEFT(c,s); c+=d; if(s=S14|s=S24|s=S34|s=S44) b+=g(c,d,a)+x+ac; b=ROTATE_LEFT(b,s); b+=c; / 第三轮运算函数 void hh(INT32U x,INT32U s,INT32U ac) if(s=S11|s=S21|s=S31|s=S41) a+=h(b,c,d)+x+ac; a=ROTATE_LEFT(a,s); a+=b; if(s=S12|s=S22|s=S32|s=S42) d+=h(a,b,c)+x+ac; d=ROTATE_LEFT(d,s); d+=a; if(s=S13|s=S23|s=

9、S33|s=S43) c+=h(d,a,b)+x+ac; c=ROTATE_LEFT(c,s); c+=d; if(s=S14|s=S24|s=S34|s=S44) b+=h(c,d,a)+x+ac; b=ROTATE_LEFT(b,s); b+=c;/ 第四轮运算函数 void ii(INT32U x,INT32U s,INT32U ac) if(s=S11|s=S21|s=S31|s=S41) a+=i(b,c,d)+x+ac; a=ROTATE_LEFT(a,s); a+=b; if(s=S12|s=S22|s=S32|s=S42)d+=i(a,b,c)+x+ac; d=ROTATE_L

10、EFT(d,s); d+=a; if(s=S13|s=S23|s=S33|s=S43) c+=i(d,a,b)+x+ac; c=ROTATE_LEFT(c,s); c+=d; if(s=S14|s=S24|s=S34|s=S44) b+=i(c,d,a)+x+ac; b=ROTATE_LEFT(b,s); b+=c; /* * * 函数名称:INT32U GetStrLen() * 函数功能:获取字符串的长度 * 入口参数:ptr-字符串指针 * 出口参数:len-32 位的返回值 * 作 者:曾光辉 * 说 明:原 md5 算法要求存储字符串长度的变量为 64 位,即 8 个字节。这里只用了

11、 4 个字节,根 据应用场合 的不同修改相应的变量定义及函数 md5()中对 x14x15的赋值语句即可。 * 创建日期:2010-9-1 * 修改记录: * */INT32U GetStrLen(INT8U xdata*data ptr) INT32U xdata len=0; INT8U xdata*data pTmp;pTmp=ptr; while(pTmp!=NULL pTmp+; return len; /* * * 函数名称:void md5_ClearX() * 函数功能:将分组暂存器 x清零 * 入口参数: * 出口参数: * 作 者:曾光辉 * 说 明: * 创建日期:201

12、0-9-1 * 修改记录: * */void md5_ClearX() INT8U data i;for(i=0;i8; pTmp+; /* * * 函数名称:void md5_Print() * 函数功能:输出 md5 的结果 * 入口参数: * 出口参数: * 作 者:曾光辉 * 说 明: * 创建日期:2010-9-1 * 修改记录: * */void md5_Print() INT8U i;for(i=0;i8); printf(“%02bx“,(INT8U)(statei16); printf(“%02bx“,(INT8U)(statei24); /* * * 函数名称:void md5_ProChunk(

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号