当前位置:文档之家› 实验三MD算法方案与实现

实验三MD算法方案与实现

实验三MD5算法的设计与实现MD5 算法及C++ 实现一、理论部分1 、预备知识1.1 什么是数据校验通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。

接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。

1.2 最简单的检验实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。

同时也是效率最低的。

适用范围:简单的数据量极小的通讯。

应用例子:龙珠cpu在线调试工具bbug.exe。

它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。

1.3奇偶校验Parity Check 实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。

校验位可以通过数据位异或计算出来。

应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。

1.4bcc 异或校验法(block check character〉实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。

它就是把所有数据都和一个指定的初始值 <通常是0)异或一 次, 最后的结果就是校验值, 通常 把她附在通讯数据的最后一起发送出去。

接收方收到数据后自己也 计算一次异或和校验值, 如果和收到的校验值 致就说明收到的数据 是 宀兀整的。

校 验值 计 算 的代码 类 似 于un sig neduCRC=0 。

//校验初始 值 for(i nti=0。

ivDataLe nth。

i++>uCRC A=Data[i]。

适用范 围: 适用 于大多 数 要 求不 高的数据通讯。

应用例子:ic 卡接口通讯、很多单片机系统的串口通讯都使用。

1.5 crc循 环冗 余校 验 (CyclicRedundancy Check 〉实现方法:这是利用除法及余数的原理来进行错误检测的 .将接收到 的 码 组 进 行 除 法 运 算 ,如果除尽,贝朋明传输无误;如果未除尽,贝y 表明传输出现差 错。

crc校 验具 还 有 自 动 纠 错 能 力。

crc 检验主要有计算法和查表法两种方法,网上很多实现代码。

适用范围:CRC-12码通常用来传送6-bit 字符串。

CRC-16及CRC-CCITT 码 则 用 是 来 传 送 8-bit 字符。

CRC-32 :硬盘数据,网络传输等应用例子:rar,以太网卡芯片、MPEG 解码芯片中1.6 md5 校 验 和 数实现方法:主要有 md5和适用范围:数据比较大或要求比较高的场合。

如 据、文件校验,des 用于保密数据的校验 < 数字签名)等等应用例子:文件校验、银行系统的交易数据2 、 具 体 的 实 现 理 论 2.1算法概述MD5算法是 MD4算法的改进算法。

Ron Rivest 于1990年提出 MD4单向散列函数,MD 表示消息摘要(Message Digest 〉,对输入消息, 算法产生128位散列值。

该算法首次公布之后,Bert den Boer 和An toon Bosselaers 对算法三轮中的后两轮进行了成功的密码分析。

在一个不相关的分析结果中,Ralph MerKle 成功地攻击了前两轮。

尽 管这些攻击都没有扩展到整个算法,但 Rivest 还是改进了其算法, 结 果 就 是MD5 算 法 。

MD5算法是MD4的改进算法,它比MD4更复杂,但设计思想相似, 输入的消息可任意长,输出结果也仍为128位,特别适用于高速软件 实现,是基于32-位操作数的一些简单的位操作。

2.2算 法步 骤l 将输入消息按512-位分组,最后要填充成为512位的整数倍,且最 后一组的后64位用来填充消息长度(填充前 >。

填充方法为附一个1 在消息后,后接所要求的多个0。

这样可以确保不同消息在填充后不 相 同。

字 签 名des 算法。

md5用于大量数l由于留出64位用来表示消息长度,那么消息的长度最多可达264字节,相当于4GMG字节,文件的长度是不可能达到这么大,因此通常都是只采用64位中的低32位来表示消息长度,高32位填充0。

I初始化MD变量。

由于每轮输出128位,这128位可用下面四个32 位字A,B,C,D 来表示。

其初始值设为:A=0x01234567B=0x89ABCDEFC=0xFEDCBA98D=0x76543210I开始进入算法主循环,循环的次数是消息中512位消息分组的数目。

先将上面A、B、C、D四个变量分别复制到另外四个变量a、b、c、d中去。

主循环有四轮,每轮很相似。

每轮进行16次操作,每次操作对a、b、c、d四个变量中的三个作一次非线性函数运算,然后将所得结果加上第四个变量,消息的一个子分组和一个常数。

再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。

最后用该结果取代a,b,c 或 d 中之一。

以下是每次操作中用到的四个非线性函数< 每轮一个)。

F(X,YZ>=(X A Y> V (( X> A Z>G(X,YZ>=(X A Z> V (Y A ( Z>> H(X,Y,Z>=X ㊉Y ㊉ZI(X,Y,Z>=Y ㊉(X V ( Z>> 其中,㊉是异或,A是与,V是或,是反符号。

这些函数是这样设计的:如果X、丫和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

函数F是按逐位方式操作:如果X,那么丫否则Z。

函数H是逐位奇偶操作符。

设Mj表示消息的第j个子分组<从0到15) ,<<<s表示循环左移s ,则四种操作为:FF(a,b,c,d,Mj,s,ti> 表示 a = b+((a+F(b,c,d>+ Mj + ti>vvvs> GG(a,b,c,d,Mj,s,ti> 表示 a = b+((a+G(b,c,d>+ Mj + ti>vvvs> HH(a,b,c,d,Mj,s,ti> 表示 a = b+((a+H(b,c,d>+ Mj + ti>vvvs>ll(a,b,c,d,Mj,s,ti> 表示 a = b+((a+I(b,c,d>+ Mj + ti>vvvs> 四轮(64 步> 结果略注:常数ti 的选择第i步中,ti是232冷bs (sin(i>>的整数部分,i的单位是弧度。

所有这些完成之后,将A,B,C,D分别加上a,b,c,d。

然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。

l最后得到的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组2.3 成128MD5位的输出安结全果。

性Ron Rivest 概述了MD5 安全性[8]l 与MD4 相比增力口了第四轮。

l 每一步均有唯一的加法、常数。

l为减弱第二轮中函数G 的对称性从((X A Y> V (X A Z> V (Y A Z>>变为((X A Z> V (Y A ( Z>>> 。

l每一步加上了上一步的结果,引起更快的雪崩效应。

l改变了第二轮和第三轮中访问消息子分组的次序,使其形式更不相似。

I近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。

各轮的位移量互不相同。

从安全角度讲,MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可实验1 000 000 000个消息的计算机需时1.07 X1022年。

若采用生日攻击法,寻找有相同Hash值的两个消息需要实验264个消息,用每秒可实验1 000 000 000个消息的计算机需时585年。

二、实现方法由于此处的文件校验用到要求比较高的场合,故采用了方法6, md5校验算法,从CodeGuru下载了一个md5校验算法的实现模块,加入自己要校验的文件名,实现完成。

下面具体描述一下实现过程:1 、创建一个简单的对话框程序;2、设置CString 类型的变量m_filename 和m_strFileChecksum 以存放要校验的文件名和校验和;3、在对话框类中创建ChecksumSelectedFilev )函数,调用md5校验和类< 附录中有其实现文件)中的GetMD5计算文件校验和。

4、使用定时器定时巡检该文件的校验和,一旦发现校验和发生变化,立刻出现提示。

三、附录<md5 算法实现的源码)以下代码实现均来自 。

1、MD5ChecksumDefines.hv 定义相关常量的头文件)//Magic in itializatio n con sta nts #defi ne MD5_ _INIT_STATE_0 0x67452301 #defi ne MD5. _INIT_STATE_1 0xefcdab89 #defi ne MD5. _INIT_STATE_2 0x98badcfe #defi ne MD5_ 」NIT_STATE_ 3 0x10325476//Con sta nts for Tran sform routi ne. #defi ne MD5_S11 7 #defi ne MD5_S12 12 #defi ne MD5_S13 17 #defi ne MD5_S14 22 #defi ne MD5_S21 5 #defi ne MD5_S22 9 #defi ne MD5_S23 14 #defi ne MD5_S24 20 #defi ne MD5_S31 4 #defi ne MD5_S32 11 #defi ne MD5_S33 16 #defi ne MD5_S34 23 #defi ne MD5_S41 6 #defi ne MD5_S42 10#defi ne MD5_S43 15 #defi ne MD5_S44 21//Tran sformatio n Con sta nts - Rou nd 1 #defi ne MD5_T01 0xd76aa478 //Tran sformatio n Con sta nt 1 #defi ne MD5_T02 0xe8c7b756 //Tran sformatio n Con sta nt 2 #defi ne MD5_T03 0x242070db //Tran sformatio n Con sta nt 3 #defi ne MD5_T04 0xc1bdceee //Tran sformatio n Con sta nt 4 #defi ne MD5_T05 0xf57c0faf //Tran sformatio n Con sta nt 5 #defi ne MD5_T06 0x4787c62a //Tran sformatio n Con sta nt 6 #defi ne MD5_T07 0xa8304613 //Tran sformatio n Con sta nt 7 #defi ne MD5_T08 0xfd469501 //Tran sformatio n Con sta nt 8 #defi ne MD5_T09 0x698098d8 //Tran sformatio n Con sta nt 9 #defi ne MD5_T10 0x8b44f7af //Tran sformatio n Con sta nt 10 #defi ne MD5_T11 0xffff5bb1 //Tra nsformatio n Con sta nt 11 #defi ne MD5_T12 0x895cd7be //Tran sformatio n Con sta nt 12 #defi ne MD5_T13 0x6b901122 //Tran sformatio n Con sta nt 13 #defi ne MD5_T14 0xfd987193 //Tra nsformatio n Con sta nt 14 #defi ne MD5_T15 0xa679438e //Tran sformatio n Con sta nt 15 #defi ne MD5_T16 0x49b40821 //Tran sformation Con sta nt 16//Tran sformatio n Con sta nts - Rou nd 2 #defi ne MD5_T17 0xf61e2562 //Tra nsformatio n Con sta nt 17 #defi ne MD5_T18 0xc040b340 //Tran sformatio n Con sta nt 18#defi ne MD5_ T19 0x265e5a51 //Tran sformatio n Con sta nt 19 #defi ne MD5_ T20 0xe9b6c7aa //Tra nsformatio n Con sta nt 20 #defi ne MD5_ _T21 0xd62f105d //Tra nsformatio n Con sta nt 21 #defi ne MD5_ T22 0x02441453 //Tran sformatio n Con sta nt 22 #defi ne MD5_ T23 0xd8a1e681 //Tran sformatio n Con sta nt 23 #defi ne MD5_ _T24 0xe7d3fbc8 //Tran sformatio n Con sta nt 24 #defi ne MD5_ T25 0x21e1cde6 //Tran sformatio n Con sta nt 25 #defi ne MD5_ T26 0xc33707d6 //Tran sformatio n Con sta nt 26 #defi ne MD5_ T27 0xf4d50d87 //Tra nsformatio n Con sta nt 27 #defi ne MD5_ T28 0x455a14ed //Tran sformatio n Con sta nt 28 #defi ne MD5_ T29 0xa9e3e905 //Tran sformatio n Con sta nt 29 #defi ne MD5_ _T30 0xfcefa3f8 //Tran sformatio n Con sta nt 30 #defi ne MD5_ _T31 0x676f02d9 //Tra nsformatio n Con sta nt 31#defi ne MD5_T32 0x8d2a4c8a //Tran sformation Con sta nt 32//Tran sformatio n Con sta nts - Rou nd 3 #defi ne MD5_T33 0xfffa3942 //Tran sformatio n Con sta nt 33 #defi ne MD5_T34 0x8771f681 //Tra nsformatio n Con sta nt 34 #defi ne MD5_T35 0x6d9d6122 //Tran sformatio n Con sta nt 35 #defi ne MD5_T36 0xfde5380c //Tran sformatio n Con sta nt 36 #defi ne MD5_T37 0xa4beea44 //Tran sformatio n Con sta nt 37 #defi ne MD5_T38 0x4bdecfa9 //Tran sformatio n Con sta nt 38 #defi ne MD5_T39 0xf6bb4b60 //Tra nsformatio n Con sta nt 39#defi ne MD5_ _T40 0xbebfbc70 //Tran sformatio n Con sta nt 40 #defi ne MD5_ T41 0x289b7ec6 //Tran sformatio n Con sta nt 41 #defi ne MD5_ _T42 0xeaa127fa //Tran sformatio n Con sta nt 42 #defi ne MD5_ _T43 0xd4ef3085 //Tra nsformatio n Con sta nt 43 #defi ne MD5_ _T44 0x04881d05 //Tran sformatio n Con sta nt 44 #defi ne MD5_ _T45 0xd9d4d039 //Tran sformatio n Con sta nt 45 #defi ne MD5_ T46 0xe6db99e5 //Tran sformatio n Con sta nt 46 #defi ne MD5_ _T47 0x1fa27cf8 //Tran sformatio n Con sta nt 47#defi ne MD5_T48 0xc4ac5665 //Tran sformatio n Con sta nt 48//Tran sformatio n Con sta nts - Rou nd 4 #defi ne MD5_T49 0xf4292244 //Tra nsformatio n Con sta nt 49 #defi ne MD5_T50 0x432aff97 //Tran sformatio n Con sta nt 50 #defi ne MD5_T51 0xab9423a7 //Tran sformatio n Con sta nt 51 #defi ne MD5_T52 0xfc93a039 //Tran sformatio n Con sta nt 52 #defi ne MD5_T53 0x655b59c3 //Tran sformatio n Con sta nt 53 #defi ne MD5_T54 0x8f0ccc92 //Tran sformatio n Con sta nt 54 #defi ne MD5_T55 0xffeff47d //Tra nsformatio n Con sta nt 55 #defi ne MD5_T56 0x85845dd1 //Tran sformatio n Con sta nt 56 #defi ne MD5_T57 0x6fa87e4f //Tran sformatio n Con sta nt 57 #defi ne MD5_T58 0xfe2ce6e0 //Tran sformatio n Con sta nt 58 #defi ne MD5_T59 0xa3014314 //Tran sformatio n Con sta nt 59#defi ne MD5_T60 0x4e0811a1 //Tran sformatio n Con sta nt 60 #defi ne MD5_ _T61 0xf7537e82 //Tra nsformatio n Con sta nt 61#defi ne MD5_ _T62 0xbd3af235 //Tra nsformatio n Con sta nt 62#defi ne MD5_ T63 0x2ad7d2bb //Tran sformatio n Con sta nt 63 #defi ne MD5_T64 0xeb86d391 //Tran sformation Con sta nt 64//Null data (except for first BY TE> used to fin alise the checksum calculati on static un sig ned char PADDING[64] = { 0x 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,} 。

相关主题