实验三 MD5算法的设计与实现

合集下载

MDI5算法简介及主要实现

MDI5算法简介及主要实现

MD5算法简介及其实现Abstract:With the abroad application of computer technology, more and more people have been depending on the information systems, the research of data encryptiontechnology has been paid more and more attention by people as well. Data security is not only need in the military, political and the diplomatic, but also everywhere in science, technology research and development, trade and so on. Cryptology technique is the core of safeguarding information security, and digital signature is always companioned with Hash functions, which is a kernel of modern Cryptography. MD5 is a typical Hash encryption technique which is quite popular.The paper mainly gives detail discussion of the MD5 encryption algorithms principle and its realization.Keywords:MD5 digital signature摘要:随着计算机在社会各个领域的广泛应用,人们对信息系统的依赖程度越来越高,数据加密技术的研究也越来越受到人们重视,数据安全保密问题己不仅仅出于军事、政治和外交上的需要,科学技术的研究和发展及商业等方面,无一不与数据安全息息相关。

实验三 MD5算法的设计与实现

实验三 MD5算法的设计与实现

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

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

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

同时也是效率最低的。

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

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

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

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

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

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

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

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

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

校验值计算的代码类似于:unsigned uCRC=0;//校验初始值for(int i=0;i<DataLenth;i++) uCRC^=Data[i];适用范围:适用于大多数要求不高的数据通讯。

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

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

md5实验报告

md5实验报告

md5实验报告
# MD5实验报告
## 简介
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,用于对任意
长度的信息产生一个128位的哈希值。

它由美国密码学家罗纳德·李维斯特(Ronald Rivest)设计,于1992年公开。

MD5算法的设计目标是在计算速度
上尽量保持优秀的性能,同时也要尽量保证安全性。

## 实验目的
本实验旨在通过对MD5算法的实验,了解其在信息安全领域的应用和特点。

## 实验过程
1. 选择一段文本作为输入数据。

2. 使用MD5算法对输入数据进行哈希运算,得到对应的128位哈希值。

3. 对比不同输入数据产生的哈希值,观察MD5算法的碰撞概率。

## 实验结果
经过实验,我们发现MD5算法在对不同输入数据进行哈希运算时,能够产生唯一的128位哈希值。

虽然MD5算法在碰撞概率上存在一定的问题,但在实际
应用中,仍然具有一定的安全性和可靠性。

## 结论
MD5算法作为一种广泛使用的哈希函数,在信息安全领域有着重要的应用价值。

然而,随着计算能力的提升和攻击技术的发展,MD5算法的安全性逐渐受到挑战。

因此,在实际应用中,我们需要谨慎选择合适的哈希算法,并结合其他安
全措施,以确保信息的安全性和完整性。

MD5算法的原理与实现

MD5算法的原理与实现

MD5算法的原理与实现***********************************************声明************************************************原创作品,出⾃ “晓风残⽉xj” 博客,欢迎转载。

转载时请务必注明出处()。

因为各种原因。

可能存在诸多不⾜。

欢迎斧正!*****************************************************************************************************⼀、MD5概念MD5,全名Message Digest Algorithm 5 ,中⽂名为消息摘要算法第五版,为计算机安全领域⼴泛使⽤的⼀种散列函数,⽤以提供消息的完整性保护。

上⾯这段话话引⽤⾃百度百科。

我的理解MD5是⼀种信息摘要算法,主要是通过特定的hash散列⽅法将⽂本信息转换成简短的信息摘要,压缩+加密+hash算法的结合体,是绝对不可逆的。

⼆、MD5计算步骤MD5以512位分组来处理输⼊的信息。

且每⼀分组⼜被划分为16个32位⼦分组。

经过了⼀系列的处理后。

算法的输出由四个32位分组组成,将这四个32位分组级联后将⽣成⼀个128位散列值。

第⼀步、填充假设输⼊信息的长度(bit)对512求余的结果不等于448,就须要填充使得对512求余的结果等于448。

填充的⽅法是填充⼀个1和n个0。

填充完后,信息的长度就为N*512+448(bit)。

第⼆步、记录信息长度⽤64位来存储填充前信息长度。

这64位加在第⼀步结果的后⾯,这样信息长度就变为N*512+448+64=(N+1)*512位。

第三步、装⼊标准的幻数(四个整数)标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16。

C=(FEDCBA98)16,D=(76543210)16)。

假设在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L。

MD5实验报告(word文档良心出品)

MD5实验报告(word文档良心出品)

一、MD5算法描述MD5算法是计算机安全领域广泛使用的一种散列算法之一,用以提供消息的完整性保护。

本次实验中,对于输入的任意长度的一段数据,输出唯一固定的128位MD5散列值。

MD噂法分为以下步骤:1 、初始化(填充)首先对于任意长度的消息,将其按照512 位进行分组,为保证每个分组都是512 位,需要对消息进行填充。

填充方法是先在消息末尾填一个1,再在后面填若干个0,使其长度I恰好满足I=448(mod512),然后在其后附加上64 位的(填充前)消息长度, 确保不同的消息在填充后不相同消息在填充后不相同。

其次将每个分组512 位的数据划分为16个32 位的子分组,在实现过程中,将其表示为16 个32 位整数进行运算。

初始化四个32 位链接变量为:A=0x67452301B=0xefcdab89C=0x98badcfeD=0x103254762、单步操作与主循环MD5共分为4轮,每轮进行16步单步操作,MD5的单步操作如下其中,g k (k=0,123)是每次运算中用到的非线性函数(每轮一个),用C 语言定义如下^define gO(b> c,. d) ((b&c) (、b 赴d))ftdefine gl (b, c> d) ((b&d) )ffdef ine g2(b, c f d) (b e d) tfdef ine g3(b, c f d) (c (b d))数据块X[ d(i)]来自于初始化中分好的16个32位数据分组,根据循环 步数按以下置换函数选取(i 表示循环的第i 步)T i 是一些随机数序列,T i 的值如下(按顺序选取)Pdefine rO(i)#define rl (i)Sdefine r2(i)Sdefine r3 (i)(i%16) <(l+5*i)%16) ((5+3*i)%16) <(7*i)%16)unsigned int T .64.=:0xd76aa478;0xe8c7b756?Ox242070dL Oxclbdce-ee,0xf57c0faf,0x4787c62a T0xa8304613:0xfd469501? 0x698098d8,0x8b44f7af7OxffffSbbl. 0x895cd7te7 0x6b90U22f0xfd987193,0x3679438^ 0x49b40821, Ch<f61u2562, OxcO4Ob34O, 0x265e5a51?Oxe^GcTaa, 0xd62fl05d. 0x02141453, 0xd8ale68L?0xe7d3fbc8?Ox21.elcde6, 0xc337O7d6T0xf4d50d87r0x455al4ed f0^a9e3e905,OxfcefaofS, 0x676f02d9. 0x8d2a4c8a, 0xfffa3942,0x8771f681, 0x6旳d6122, 0xfM538(k, 0xa4beea44:0x4bdecfa9?0xf6bb4b60?Oxbebfbc7O? 0x289b7ec6:0xeaaI27£a T0s64ef3085:0x04851 dO5? 0xd9d4d039, 0xe6db99e5?DxlfaSycfS, 0xc4ac566570xf4292244?0x432aff97I0xab9423a7J0xfc93a039, 0x655b59c3,0x8f0ccc92, Oxffeff47d. 0x85845ddl? 0x6faS7e4f, 0xfe2ce6e0,0xa3014314?Ox4eO811al, Oxf7537eS2. 0xbd3af2o570x2ad7d2bb.0xeb86d391?};vv<S i表示循环左移S i位,S i的数值如下(按顺序选取)unsigned int S[64]={7,12417, 22, 7,12f17f 22, 7, 12,17, 22t 1, 12,17t 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, 6F10,15, 21, 6, 10, 15, 21};因此,MD5主要的一个单步操作可以表示为a =b ((a f(b,c,d) T[i] X[J(i)])尺S[i])每轮16步结束后的4个32位数作为下一轮的输入继续循环束后的输入再加上初始值即得到最终结果128位的散列值' 循环如下图四轮结64步主A| B| C| Bjn 彳第1轮16步便用卧P Q; 电 B ] cl 叫+1第2轮"步便用驻Pl |A| Bl C| D| "■►f 第3轮16步便用知pt1 ~Al Bl Cl Dl ~程序验证为了验证程序的正确性,我们通过查找 Wikipedia 上使用的3个 测试向量来进行测试,测试向量如下:ND5(*The quick bxown fox jumps over the lazy dog")=9e 107d9d372bb6326b d8Id3542a419d6KD5 (*The quick brown fos jumps over the lazy dog- ■*)= edd909c290dOfb IcaOGSff addf 2 2cbdOMD5(^)=d41J8cd98f0Ob204e980O99SecfS427e运行程序,得到的结果如下:X * - ■ <■>第4轮"步使用g 尹P3v ! I ! I 1 + 模屮加C ^D 工cyniF可以看到,实验结果与测试向量相同,验证了程序的正确性。

毕业设计-md5算法的研究与实现数据存储加密—论文[管理资料]

毕业设计-md5算法的研究与实现数据存储加密—论文[管理资料]

毕业设计(论文)MD5算法的研究与实现------数据存储加密论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:MD5算法的研究与实现------数据存储加密摘要随着网络技术的广泛应用,网络信息安全越来越引起人们的重视。

针对数据在存储的时候存在大量的安全问题,目前通常将需要存储的数据进行加密然后再存储,应用MD5算法是一个不错的选择。

MD5算法的全称是Message-Digest algorithm 5,是一种用于产生数字签名的单项散列算法。

它的作用是让大容量信息在用数字签名软件签署私人密钥前被“压缩”成一种保密的格式,即将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的串。

该毕业设计是运用microsoft visual c++ ,主要是通过算法实现数据的加密存储。

文章分成五部分。

第一,二部分描述了MD5的目前现状和相关理论知识,也让我们了解MD5的定义。

重点是MD5的流程实现和封装DLL。

在MD5算法的DLL 封装这章,主要是描述我们为什么要选用封装DLL的原因,以及封装的好处。

设计流程这一部分里包含读取,修改,插入,删除这几个功能的实现情况,并用流程图的方式来分别描述了这四大功能模块的实现过程。

最后一部分显示了系统测试的内容和系统主要功能运行界面图。

关键词:信息安全;MD5;加密;封装The Research and Implementation for MD5 Algorithm-------- Data Storage and EncryptionAbstractWith the wide application of the network technology, the information of the network safety causes people's attention more and more. A large number of security questions appear while storing data, the data that usually store needing at present are encrypted then stored, it is a good choice to use MD5 algorithm. The full name of MD5 algorithm is Message-Digest algorithm 5, is that a kind of individual event used for producing figures and signed breaks up and arranges algorithms. Its function is to let large capacity information " compress " and become a kind of secret form before signing the private key with the digital signature software, vary " byte bunch " of a wanton length into a great integer of one 128bit through an irreversible one bunch of algorithms of varying of character .Used Microsoft Visual C++ software and developed in this graduation project, is mainly to realize through the algorithm that the encryption of the data is stored. The article is divided into five parts. The first and second parts are describing the current situation and relevant theory knowledge at present of MD5, let us understand the definition of MD5. The focal point is the procedure of MD5 is realized and encapsulation to Dynamic Link Library. In this chapter of encapsulation MD5 class library to Dynamic Link Library, mainly describe why we will select encapsulation Dynamic Link Library for use , and the advantage of encapsulation . Design this of procedure and include reading in the part , revise , insert, delete the realization situations of these functions, and has described the realization course of this four major functions module respectively in way of the flow chart . The last part has shown that the content of system testing and main function of system operate the interface picture .Key words: information security; MD5; encrypt; Packaging目录论文总页数:23页1 引言 (1)研究现状 (1)选题意义 (2)选题背景 (2)2 相关理论基础 (3)单向散列函数 (3)单向散列函数的基本原理 (3)散列值的长度 (4)MD5算法的基本原理 (4)MD5的应用 (12)3 需求分析及设计方案 (14)主要功能模块 (14)数据加密 (14)数据存储 (14)数据库设计 (14)主要流程图 (15)4 MD5算法的DLL封装 (15)加载时动态链接 (16)运行时动态链接 (16)DLL封装情况 (16)5 具体设计流程及实现 (17)读取的设计和实现 (17)插入的设计和实现 (18)修改的设计和实现 (18)删除的设计和实现 (19)6 调试与分析 (19)概述 (19)测试分析报告 (20)结论 (20)参考文献 (21)致谢 (22)声明 (23)1引言随着网络通信技术和Internet的联系日益增强,出现了一系列与网络安全相关的问题:如对主机的攻击,网络上传输的信息被截取、篡改、重发等,由此,它对网络应用的进一步推广构成了巨大威胁,因此密码体制[1]就在这种背景下应运而生了。

MD5算法实验报告

MD5算法实验报告

MD5算法实验报告实验报告:MD5算法的原理与应用一、实验目的本实验旨在通过研究MD5(Message-Digest Algorithm 5)算法的原理和应用,了解其工作原理和实现过程,并掌握其具体应用技巧。

二、实验内容1.了解MD5算法的基本原理和特点;2.分析MD5算法的具体实现过程;3.实现一个简单的MD5加密程序,并进行测试;4.掌握MD5算法的应用技巧。

三、实验原理1. 输入任意长度的数据,输出固定长度的Hash值,通常为128位;2. 安全性较高,Hash值的变化能较好地反映原始数据的变化;3. 不可逆性:无法通过Hash值反推出原始数据;4. Hash值相同的概率很低,冲突概率较小。

1.数据填充:对输入数据进行填充,使其长度满足一定要求;2.划分数据:将填充后的数据划分为多个512位的数据块;3.初始化变量:设置四个32位的变量,作为初始值;4.处理数据块:对每个数据块进行处理,分为四轮,每轮包括四个步骤,即置换、模运算、加法和循环左移操作。

5. 输出结果:将四个32位变量连接起来,即得到最终的128位Hash值。

四、实验过程1.学习MD5算法的原理和实现细节;2. 使用Python编程语言实现一个简单的MD5加密程序,并进行测试。

实验代码如下:```import hashlibdef md5_encrypt(source):md5 = hashlib.md5md5.update(source.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':source_str = input("请输入要加密的字符串:")encrypted_str = md5_encrypt(source_str)print("加密后的字符串为:", encrypted_str)```五、实验结果与分析通过上述实验代码,可以输入一个字符串,程序将会对该字符串进行MD5加密,并将加密结果输出。

《信息安全》实验报告3 MD5的计算和破解

《信息安全》实验报告3 MD5的计算和破解

《信息安全》实验报告(3)实验名称:________________ 指导教师:___________ 完成日期:________________ 专 业:________________ 班 级:___________ 姓 名:________________ 一、实验目的:理解数字摘要的原理;能够利用现有软件工具进行MD5摘要的计算;了解MD5在实际数据库应用系统中的应用;能够进行简单的MD5摘要破解。

二、实验内容:1、自行寻找一款能够计算文件MD5摘要值的软件,对一个文本文件(或其他类型文件)进行摘要值计算并记录。

将该文件内容进行稍许修改后再进行一次摘要值计算并记录,比较两次摘要值。

2、自行寻找一款能够计算字符串MD5摘要值的软件,对一个任意字符串进行摘要值计算并记录。

对该字符串内容进行稍许修改后再进行一次摘要值计算并记录,比较两次摘要值。

3、自行寻找方法找到以下三个md5值的原文(字符串)3508d8fedc70d04c5d178dbbc2eac72a (7位,纯数字)ef73781effc5774100f87fe2f437a435(8位,数字+字母)909cc4dab0b2890e981533d9f27aad97(8位,数字+字母+特殊符号)三、实验过程:(实现步骤等)使用Hash 1.04版的计算MD5值软件,如下:MD5的计算和破解 于泳海 2014-11-6 信息管理与信息系统11级新本班 贾文丽计算某一文件的MD5,将文件进行更改后,查看两次MD5值,如下:更改文件后:四、实验结果与结论:将两次文件的MD5进行比较我们发现,同一文件如果进行修改,内容上出现一个字符的不同都会导致其MD5校验不同。

五、实验总结:(实验中遇到的问题及解决方法,心得体会等)在本节实验中,理解了数字摘要的原理并能够利用现有软件工具进行MD5摘要的计算,而且了解了MD5在实际数据库应用系统中的应用并能够进行简单的MD5摘要破解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

同时也是效率最低的。

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

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

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

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

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

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

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

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

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

校验值计算的代码类似于:unsigned uCRC=0;//校验初始值for(int i=0;i<DataLenth;i++) uCRC^=Data[i];适用范围:适用于大多数要求不高的数据通讯。

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

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

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

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

适用范围:CRC-12码通常用来传送6-bit字符串;CRC-16及CRC-CCITT 码则用是来传送8-bit字符。

CRC-32:硬盘数据,网络传输等应用例子:rar,以太网卡芯片、MPEG解码芯片中1.6 md5校验和数字签名实现方法:主要有md5和des算法。

适用范围:数据比较大或要求比较高的场合。

如md5用于大量数据、文件校验,des用于保密数据的校验(数字签名)等等。

应用例子:文件校验、银行系统的交易数据2、具体的实现理论2.1 算法概述MD5 算法是MD4算法的改进算法。

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

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

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

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

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

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

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

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

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

l 初始化MD变量。

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

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

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

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

每轮进行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⊕ZI(X,Y,Z)=Y⊕(X∨( Z))其中,⊕是异或,∧是与,∨是或,是反符号。

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

函数F是按逐位方式操作:如果X,那么Y,否则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)<<<s)GG(a,b,c,d,Mj,s,ti)表示a = b+((a+G(b,c,d)+ Mj + ti)<<<s)HH(a,b,c,d,Mj,s,ti)表示a = b+((a+H(b,c,d)+ Mj + ti)<<<s)II(a,b,c,d,Mj,s,ti)表示a = b+((a+I(b,c,d)+ Mj + ti)<<<s)四轮(64步)结果略。

注:常数ti的选择:第i步中,ti是232 ×abs (sin(i))的整数部分,i的单位是弧度。

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

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

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

2.3 MD5的安全性Ron Rivest概述了MD5安全性[8]:l 与MD4相比,增加了第四轮。

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

l 为减弱第二轮中函数G的对称性从((X∧Y) ∨(X∧Z) ∨(Y∧Z))变为((X∧Z) ∨(Y∧( Z)))。

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

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

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

各轮的位移量互不相同。

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

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

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

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

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

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

1、MD5ChecksumDefines.h(定义相关常量的头文件)//Magic initialization constants#define MD5_INIT_STATE_0 0x67452301#define MD5_INIT_STATE_1 0xefcdab89#define MD5_INIT_STATE_2 0x98badcfe#define MD5_INIT_STATE_3 0x10325476//Constants for Transform routine.#define MD5_S11 7#define MD5_S12 12#define MD5_S13 17#define MD5_S14 22#define MD5_S21 5#define MD5_S22 9#define MD5_S23 14#define MD5_S24 20#define MD5_S31 4#define MD5_S32 11#define MD5_S33 16#define MD5_S34 23#define MD5_S41 6#define MD5_S42 10#define MD5_S43 15#define MD5_S44 21//Transformation Constants - Round 1#define MD5_T01 0xd76aa478 //Transformation Constant 1 #define MD5_T02 0xe8c7b756 //Transformation Constant 2 #define MD5_T03 0x242070db //Transformation Constant 3 #define MD5_T04 0xc1bdceee //Transformation Constant 4 #define MD5_T05 0xf57c0faf //Transformation Constant 5 #define MD5_T06 0x4787c62a //Transformation Constant 6 #define MD5_T07 0xa8304613 //Transformation Constant 7 #define MD5_T08 0xfd469501 //Transformation Constant 8 #define MD5_T09 0x698098d8 //Transformation Constant 9 #define MD5_T10 0x8b44f7af //Transformation Constant 10 #define MD5_T11 0xffff5bb1 //Transformation Constant 11 #define MD5_T12 0x895cd7be //Transformation Constant 12 #define MD5_T13 0x6b901122 //Transformation Constant 13 #define MD5_T14 0xfd987193 //Transformation Constant 14 #define MD5_T15 0xa679438e //Transformation Constant 15 #define MD5_T16 0x49b40821 //Transformation Constant 16 //Transformation Constants - Round 2#define MD5_T17 0xf61e2562 //Transformation Constant 17 #define MD5_T18 0xc040b340 //Transformation Constant 18#define MD5_T20 0xe9b6c7aa //Transformation Constant 20 #define MD5_T21 0xd62f105d //Transformation Constant 21 #define MD5_T22 0x02441453 //Transformation Constant 22 #define MD5_T23 0xd8a1e681 //Transformation Constant 23 #define MD5_T24 0xe7d3fbc8 //Transformation Constant 24 #define MD5_T25 0x21e1cde6 //Transformation Constant 25 #define MD5_T26 0xc33707d6 //Transformation Constant 26 #define MD5_T27 0xf4d50d87 //Transformation Constant 27 #define MD5_T28 0x455a14ed //Transformation Constant 28 #define MD5_T29 0xa9e3e905 //Transformation Constant 29 #define MD5_T30 0xfcefa3f8 //Transformation Constant 30 #define MD5_T31 0x676f02d9 //Transformation Constant 31 #define MD5_T32 0x8d2a4c8a //Transformation Constant 32 //Transformation Constants - Round 3#define MD5_T33 0xfffa3942 //Transformation Constant 33 #define MD5_T34 0x8771f681 //Transformation Constant 34 #define MD5_T35 0x6d9d6122 //Transformation Constant 35 #define MD5_T36 0xfde5380c //Transformation Constant 36 #define MD5_T37 0xa4beea44 //Transformation Constant 37 #define MD5_T38 0x4bdecfa9 //Transformation Constant 38 #define MD5_T39 0xf6bb4b60 //Transformation Constant 39#define MD5_T41 0x289b7ec6 //Transformation Constant 41 #define MD5_T42 0xeaa127fa //Transformation Constant 42 #define MD5_T43 0xd4ef3085 //Transformation Constant 43 #define MD5_T44 0x04881d05 //Transformation Constant 44 #define MD5_T45 0xd9d4d039 //Transformation Constant 45 #define MD5_T46 0xe6db99e5 //Transformation Constant 46 #define MD5_T47 0x1fa27cf8 //Transformation Constant 47 #define MD5_T48 0xc4ac5665 //Transformation Constant 48 //Transformation Constants - Round 4#define MD5_T49 0xf4292244 //Transformation Constant 49 #define MD5_T50 0x432aff97 //Transformation Constant 50 #define MD5_T51 0xab9423a7 //Transformation Constant 51 #define MD5_T52 0xfc93a039 //Transformation Constant 52 #define MD5_T53 0x655b59c3 //Transformation Constant 53 #define MD5_T54 0x8f0ccc92 //Transformation Constant 54 #define MD5_T55 0xffeff47d //Transformation Constant 55 #define MD5_T56 0x85845dd1 //Transformation Constant 56 #define MD5_T57 0x6fa87e4f //Transformation Constant 57 #define MD5_T58 0xfe2ce6e0 //Transformation Constant 58 #define MD5_T59 0xa3014314 //Transformation Constant 59 #define MD5_T60 0x4e0811a1 //Transformation Constant 60#define MD5_T61 0xf7537e82 //Transformation Constant 61#define MD5_T62 0xbd3af235 //Transformation Constant 62#define MD5_T63 0x2ad7d2bb //Transformation Constant 63#define MD5_T64 0xeb86d391 //Transformation Constant 64//Null data (except for first BYTE) used to finalise the checksum calculationstatic unsigned char PADDING[64] = {0x80, 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, 0};2、CountChecksum.h(md5校验和类的头文件)class CMD5Checksum{public://interface functions for the RSA MD5 calculationstatic CString GetMD5(BYTE* pBuf, UINT nLength);static CString GetMD5(CFile& File);static CString GetMD5(const CString& strFilePath);protected://constructor/destructorCMD5Checksum();virtual ~CMD5Checksum() {};//RSA MD5 implementationvoid Transform(BYTE Block[64]);void Update(BYTE* Input, ULONG nInputLen);CString Final();inline DWORD RotateLeft(DWORD x, int n);inline void FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);inline void GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);inline void HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);inline void II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);//utility functionsvoid DWordToByte(BYTE* Output, DWORD* Input, UINT nLength); void ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength); private:BYTE m_lpszBuffer[64]; //input bufferULONG m_nCount[2]; //number of bits, modulo 2^64 (lsb first) ULONG m_lMD5[4]; //MD5 checksum};#endif// !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE _A4A60E20D2C3__INCLUDED_)3、CountChecksum.cpp (md5校验和类的实现文件)/***************************************************** ************************************FUNCTION: CMD5Checksum::GetMD5DETAILS: static, publicDESCRIPTION: Gets the MD5 checksum for a specified file RETURNS: CString : the hexadecimal MD5 checksum for the specified fileARGUMENTS: CString& strFilePath : the full pathname of the specified fileNOTES: Provides an interface to the CMD5Checksum class. 'strFilePath' name shouldhold the full pathname of the file, eg C:\My Documents\Arcticle.txt.NB. If any problems occur with opening or reading this file, a CFileExceptionwill be thrown; callers of this function should be ready to catch thisexception.****************************************************** ***********************************/CString CMD5Checksum::GetMD5(const CString& strFilePath){//open the file as a binary file in readonly mode, denying write accessCFile File(strFilePath, CFile::shareDenyNone);//the file has been successfully opened, so now get and return its checksumreturn GetMD5(File);}/***************************************************** ************************************FUNCTION: CMD5Checksum::GetMD5DETAILS: static, publicDESCRIPTION: Gets the MD5 checksum for a specified file RETURNS: CString : the hexadecimal MD5 checksum for the specified fileARGUMENTS: CFile& File : the specified fileNOTES: Provides an interface to the CMD5Checksum class. 'File'should be open inbinary readonly mode before calling this function.NB. Callers of this function should be ready to catch any CFileExceptionthrown by the CFile functions****************************************************** ***********************************/CString CMD5Checksum::GetMD5(CFile& File){try{CMD5Checksum MD5Checksum; //checksum objectint nLength = 0; //number of bytes read from the fileconst int nBufferSize = 1024; //checksum the file in blocks of 1024 bytesBYTE Buffer[nBufferSize]; //buffer for data read from the file //checksum the file in blocks of 1024 byteswhile ((nLength = File.Read( Buffer, nBufferSize )) > 0 ){MD5Checksum.Update( Buffer, nLength );}//finalise the checksum and return itreturn MD5Checksum.Final();}//report any file exceptions in debug mode onlycatch (CFileException* e ){TRACE0("CMD5Checksum::GetMD5: CFileException caught");throw e;}}/***************************************************** ************************************FUNCTION: CMD5Checksum::GetMD5DETAILS: static, publicDESCRIPTION: Gets the MD5 checksum for data in a BYTE array RETURNS: CString : the hexadecimal MD5 checksum for the specified dataARGUMENTS: BYTE* pBuf : pointer to the BYTE array UINT nLength : number of BYTEs of data to be checksumed NOTES: Provides an interface to the CMD5Checksum class. Any data that canbe cast to a BYTE array of known length can be checksummedby thisfunction. Typically, CString and char arrays will be checksumed, although this function can be used to check the integrity of any BYTE array.A buffer of zero length can be checksummed; all buffers of zero lengthwill return the same checksum.****************************************************** ***********************************/CString CMD5Checksum::GetMD5(BYTE* pBuf, UINT nLength) {//entry invariantsAfxIsValidAddress(pBuf,nLength,FALSE);//calculate and return the checksumCMD5Checksum MD5Checksum;MD5Checksum.Update( pBuf, nLength );return MD5Checksum.Final();}/***************************************************** ************************************FUNCTION: CMD5Checksum::RotateLeftDETAILS: privateDESCRIPTION: Rotates the bits in a 32 bit DWORD left by a specified amountRETURNS: The rotated DWORDARGUMENTS: DWORD x : the value to be rotatedint n : the number of bits to rotate by****************************************************** ***********************************/DWORD CMD5Checksum::RotateLeft(DWORD x, int n){//check that DWORD is 4 bytes long - true in Visual C++ 6 and 32 bit WindowsASSERT( sizeof(x) == 4 );//rotate and return xreturn (x << n) | (x >> (32-n));}/***************************************************** ************************************FUNCTION: CMD5Checksum::FFDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformationalgorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksum DWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constant NOTES: None****************************************************** ***********************************/void CMD5Checksum::FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){DWORD F = (B & C) | (~B & D);A += F + X + T;A = RotateLeft(A, S);A += B;}/***************************************************** ************************************FUNCTION: CMD5Checksum::GGDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksum DWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constant NOTES: None****************************************************** ***********************************/void CMD5Checksum::GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){DWORD G = (B & D) | (C & ~D);A += G + X + T;A = RotateLeft(A, S);A += B;}/***************************************************** ************************************FUNCTION: CMD5Checksum::HHDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksum DWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constant NOTES: None****************************************************** ***********************************/void CMD5Checksum::HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){DWORD H = (B ^ C ^ D);A += H + X + T;A = RotateLeft(A, S);A += B;}/***************************************************** ************************************FUNCTION: CMD5Checksum::IIDETAILS: protectedDESCRIPTION: Implementation of basic MD5 transformation algorithmRETURNS: noneARGUMENTS: DWORD &A, B, C, D : Current (partial) checksum DWORD X : Input dataDWORD S : MD5_SXX Transformation constantDWORD T : MD5_TXX Transformation constant NOTES: None****************************************************** ***********************************/void CMD5Checksum::II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T){DWORD I = (C ^ (B | ~D));A += I + X + T;A = RotateLeft(A, S);A += B;}/*****************************************************************************************FUNCTION: CMD5Checksum::ByteToDWordDETAILS: privateDESCRIPTION: Transfers the data in an 8 bit array to a 32 bit array RETURNS: voidARGUMENTS: DWORD* Output : the 32 bit (unsigned long) destination arrayBYTE* Input : the 8 bit (unsigned char) source arrayUINT nLength : the number of 8 bit data items in the source arrayNOTES: Four BYTES from the input array are transferred to each DWORD entryof the output array. The first BYTE is transferred to the bits (0-7)of the output DWORD, the second BYTE to bits 8-15 etc.The algorithm assumes that the input array is a multiple of 4 bytes longso that there is a perfect fit into the array of 32 bit words.****************************************************** ***********************************/void CMD5Checksum::ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength){//entry invariantsASSERT( nLength % 4 == 0 );ASSERT( AfxIsValidAddress(Output, nLength/4, TRUE) ); ASSERT( AfxIsValidAddress(Input, nLength, FALSE) );//initialisationsUINT i=0; //index to Output arrayUINT j=0; //index to Input array//transfer the data by shifting and copyingfor ( ; j < nLength; i++, j += 4){Output[i] = (ULONG)Input[j] |(ULONG)Input[j+1] << 8 |(ULONG)Input[j+2] << 16 |(ULONG)Input[j+3] << 24;}}/***************************************************** ************************************FUNCTION: CMD5Checksum::TransformDETAILS: protectedDESCRIPTION: MD5 basic transformation algorithm; transforms'm_lMD5'RETURNS: voidARGUMENTS: BYTE Block[64]NOTES: An MD5 checksum is calculated by four rounds of 'Transformation'.The MD5 checksum currently held in m_lMD5 is merged by the transformation process with data passed in 'Block'.****************************************************** ***********************************/void CMD5Checksum::Transform(BYTE Block[64]){//initialise local data with current checksumULONG a = m_lMD5[0];ULONG b = m_lMD5[1];ULONG c = m_lMD5[2];ULONG d = m_lMD5[3];//copy BYTES from input 'Block' to an array of ULONGS 'X' ULONG X[16];ByteToDWord( X, Block, 64 );//Perform Round 1 of the transformationFF (a, b, c, d, X[ 0], MD5_S11, MD5_T01);FF (d, a, b, c, X[ 1], MD5_S12, MD5_T02);FF (b, c, d, a, X[ 3], MD5_S14, MD5_T04); FF (a, b, c, d, X[ 4], MD5_S11, MD5_T05); FF (d, a, b, c, X[ 5], MD5_S12, MD5_T06); FF (c, d, a, b, X[ 6], MD5_S13, MD5_T07); FF (b, c, d, a, X[ 7], MD5_S14, MD5_T08); FF (a, b, c, d, X[ 8], MD5_S11, MD5_T09); FF (d, a, b, c, X[ 9], MD5_S12, MD5_T10); FF (c, d, a, b, X[10], MD5_S13, MD5_T11); FF (b, c, d, a, X[11], MD5_S14, MD5_T12); FF (a, b, c, d, X[12], MD5_S11, MD5_T13); FF (d, a, b, c, X[13], MD5_S12, MD5_T14); FF (c, d, a, b, X[14], MD5_S13, MD5_T15); FF (b, c, d, a, X[15], MD5_S14, MD5_T16); //Perform Round 2 of the transformation GG (a, b, c, d, X[ 1], MD5_S21, MD5_T17); GG (d, a, b, c, X[ 6], MD5_S22, MD5_T18); GG (c, d, a, b, X[11], MD5_S23, MD5_T19); GG (b, c, d, a, X[ 0], MD5_S24, MD5_T20); GG (a, b, c, d, X[ 5], MD5_S21, MD5_T21); GG (d, a, b, c, X[10], MD5_S22, MD5_T22); GG (c, d, a, b, X[15], MD5_S23, MD5_T23);GG (a, b, c, d, X[ 9], MD5_S21, MD5_T25); GG (d, a, b, c, X[14], MD5_S22, MD5_T26); GG (c, d, a, b, X[ 3], MD5_S23, MD5_T27); GG (b, c, d, a, X[ 8], MD5_S24, MD5_T28); GG (a, b, c, d, X[13], MD5_S21, MD5_T29); GG (d, a, b, c, X[ 2], MD5_S22, MD5_T30); GG (c, d, a, b, X[ 7], MD5_S23, MD5_T31); GG (b, c, d, a, X[12], MD5_S24, MD5_T32); //Perform Round 3 of the transformation HH (a, b, c, d, X[ 5], MD5_S31, MD5_T33); HH (d, a, b, c, X[ 8], MD5_S32, MD5_T34); HH (c, d, a, b, X[11], MD5_S33, MD5_T35); HH (b, c, d, a, X[14], MD5_S34, MD5_T36); HH (a, b, c, d, X[ 1], MD5_S31, MD5_T37); HH (d, a, b, c, X[ 4], MD5_S32, MD5_T38); HH (c, d, a, b, X[ 7], MD5_S33, MD5_T39); HH (b, c, d, a, X[10], MD5_S34, MD5_T40); HH (a, b, c, d, X[13], MD5_S31, MD5_T41); HH (d, a, b, c, X[ 0], MD5_S32, MD5_T42); HH (c, d, a, b, X[ 3], MD5_S33, MD5_T43); HH (b, c, d, a, X[ 6], MD5_S34, MD5_T44);HH (d, a, b, c, X[12], MD5_S32, MD5_T46);HH (c, d, a, b, X[15], MD5_S33, MD5_T47);HH (b, c, d, a, X[ 2], MD5_S34, MD5_T48);//Perform Round 4 of the transformationII (a, b, c, d, X[ 0], MD5_S41, MD5_T49);II (d, a, b, c, X[ 7], MD5_S42, MD5_T50);II (c, d, a, b, X[14], MD5_S43, MD5_T51);II (b, c, d, a, X[ 5], MD5_S44, MD5_T52);II (a, b, c, d, X[12], MD5_S41, MD5_T53);II (d, a, b, c, X[ 3], MD5_S42, MD5_T54);II (c, d, a, b, X[10], MD5_S43, MD5_T55);II (b, c, d, a, X[ 1], MD5_S44, MD5_T56);II (a, b, c, d, X[ 8], MD5_S41, MD5_T57);II (d, a, b, c, X[15], MD5_S42, MD5_T58);II (c, d, a, b, X[ 6], MD5_S43, MD5_T59);II (b, c, d, a, X[13], MD5_S44, MD5_T60);II (a, b, c, d, X[ 4], MD5_S41, MD5_T61);II (d, a, b, c, X[11], MD5_S42, MD5_T62);II (c, d, a, b, X[ 2], MD5_S43, MD5_T63);II (b, c, d, a, X[ 9], MD5_S44, MD5_T64);//add the transformed values to the current checksumm_lMD5[0] += a;m_lMD5[1] += b;m_lMD5[2] += c;m_lMD5[3] += d;}/***************************************************** ************************************ CONSTRUCTOR: CMD5ChecksumDESCRIPTION: Initialises member dataARGUMENTS: NoneNOTES: None****************************************************** ***********************************/CMD5Checksum::CMD5Checksum(){// zero membersmemset( m_lpszBuffer, 0, 64 );m_nCount[0] = m_nCount[1] = 0;// Load magic state initialization constantsm_lMD5[0] = MD5_INIT_STATE_0;m_lMD5[1] = MD5_INIT_STATE_1;m_lMD5[2] = MD5_INIT_STATE_2;m_lMD5[3] = MD5_INIT_STATE_3;}/***************************************************** ************************************FUNCTION: CMD5Checksum::DWordToByteDETAILS: privateDESCRIPTION: Transfers the data in an 32 bit array to a 8 bit array RETURNS: voidARGUMENTS: BYTE* Output : the 8 bit destination array DWORD* Input : the 32 bit source arrayUINT nLength : the number of 8 bit data items in the source arrayNOTES: One DWORD from the input array is transferred into four BYTESin the output array. The first (0-7) bits of the first DWORD are transferred to the first output BYTE, bits bits 8-15 are transferred fromthe second BYTE etc.The algorithm assumes that the output array is a multiple of 4 bytes longso that there is a perfect fit of 8 bit BYTES into the 32 bit DWORDs.****************************************************** ***********************************/void CMD5Checksum::DWordToByte(BYTE* Output, DWORD* Input, UINT nLength ){//entry invariantsASSERT( nLength % 4 == 0 );ASSERT( AfxIsValidAddress(Output, nLength, TRUE) );ASSERT( AfxIsValidAddress(Input, nLength/4, FALSE) );//transfer the data by shifting and copyingUINT i = 0;UINT j = 0;for ( ; j < nLength; i++, j += 4){Output[j] = (UCHAR)(Input[i] & 0xff);Output[j+1] = (UCHAR)((Input[i] >> 8) & 0xff);Output[j+2] = (UCHAR)((Input[i] >> 16) & 0xff);Output[j+3] = (UCHAR)((Input[i] >> 24) & 0xff);}}/***************************************************** ************************************FUNCTION: CMD5Checksum::FinalDETAILS: protectedDESCRIPTION: Implementation of main MD5 checksum algorithm; ends the checksum calculation.RETURNS: CString : the final hexadecimal MD5 checksum result ARGUMENTS: NoneNOTES: Performs the final MD5 checksum calculation ('Update' does most of the work,this function just finishes the calculation.)****************************************************** ***********************************/CString CMD5Checksum::Final(){//Save number of bitsBYTE Bits[8];DWordToByte( Bits, m_nCount, 8 );//Pad out to 56 mod 64.UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3f);UINT nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);Update( PADDING, nPadLen );//Append length (before padding)Update( Bits, 8 );//Store final state in 'lpszMD5'const int nMD5Size = 16;unsigned char lpszMD5[ nMD5Size ]; DWordToByte( lpszMD5, m_lMD5, nMD5Size ); //Convert the hexadecimal checksum to a CString CString strMD5;for ( int i=0; i < nMD5Size; i++){CString Str;if (lpszMD5[i] == 0) {Str = CString("00");}else if (lpszMD5[i] <= 15) {Str.Format("0%x",lpszMD5[i]);}else {Str.Format("%x",lpszMD5[i]);}ASSERT( Str.GetLength() == 2 );strMD5 += Str;}ASSERT( strMD5.GetLength() == 32 );return strMD5;}/***************************************************** ************************************FUNCTION: CMD5Checksum::UpdateDETAILS: protectedDESCRIPTION: Implementation of main MD5 checksum algorithm RETURNS: voidARGUMENTS: BYTE* Input : input blockUINT nInputLen : length of input blockNOTES: Computes the partial MD5 checksum for 'nInputLen' bytes of data in 'Input'****************************************************** ***********************************/void CMD5Checksum::Update( BYTE* Input, ULONG nInputLen ) {//Compute number of bytes mod 64UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3F);//Update number of bitsif ( ( m_nCount[0] += nInputLen << 3 ) < ( nInputLen << 3) ) {m_nCount[1]++;}m_nCount[1] += (nInputLen >> 29);//Transform as many times as possible.UINT i=0;UINT nPartLen = 64 - nIndex;if (nInputLen >= nPartLen){memcpy( &m_lpszBuffer[nIndex], Input, nPartLen );Transform( m_lpszBuffer );for (i = nPartLen; i + 63 < nInputLen; i += 64){Transform( &Input[i] );}nIndex = 0;}else{i = 0;}// Buffer remaining inputmemcpy( &m_lpszBuffer[nIndex], &Input[i], nInputLen-i); }。

相关文档
最新文档