实验三MD算法方案与实现
- 格式:docx
- 大小:73.08 KB
- 文档页数:38
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摘要:随着计算机在社会各个领域的广泛应用,人们对信息系统的依赖程度越来越高,数据加密技术的研究也越来越受到人们重视,数据安全保密问题己不仅仅出于军事、政治和外交上的需要,科学技术的研究和发展及商业等方面,无一不与数据安全息息相关。
一、实验内容:实验三 利用欧拉法、梯形数法和二阶显式Adams 法对RLC 串联电路的仿真1前向欧拉法状态方程:Du CX y Bu AX X m +=+=+•1 然后根据前向欧拉法(其中h 为步长)•++=m m m hX X X 1即可得到系统的差分方程2后向欧拉法根据前向欧拉法得到的系统状态方程,结合后向欧拉法(其中h 为步长)•+++=11m m m hX X X 即可得到系统的差分方程3梯形法由前面的系统状态方程,结合梯形法)(211+••+++=m m m m X X h X X 即可得到系统的差分方程4二阶显式Adams 方法由前面的状态方程,结合二阶显式Adams 方法)51623(12211--++-+=m m m m m F F F h X X 即可得到系统的差分方程但是二阶显式Adams 法不能自起步,要使方程起步,需要知道开始的三个值,但是我们只知道第一个值。
经过分析后,二阶显式Adams 方法精度是二阶的,而梯形法精度也是二阶的,因此我们可以先借助梯形法得到输出的前三个值,以达到起步的目的,然后借助上面得到的差分方程对其进行求解。
二、实验波形:下图为前向欧拉法、后向欧拉法、梯形法、二阶显式Adams 方法的系统差分方程得到相应的输出波形:图1 h=410 时四种方法的输出波形图2 h=56-⨯时四种方法的输出波形10图3 h=510-时四种方法的输出波形图4 h=610-时四种方法的输出波形三、实验分析:由输出波形可以看到各种方法的特点(在图中蓝色线均表示连续系统模型的实际输出波形,红色线表示在对应方法下系统的输出波形。
):1前向欧拉法和二阶显式Adams方法对步长的要求很强。
步长太大,最后的到的结果不是绝对收敛,而是发散。
在小步长下才显得收敛,这也从另一方面验证,步长越小,截断误差越小;2步长不能太小,太小的步长相应的舍入误差和累积误差也会增大;3前向欧拉法也可称为显式欧拉法,后向欧拉法也可称为隐式欧拉法,可以看到,后向欧拉法的稳定域要比前向欧拉法大,计算精度也要高一些。
实验三最短路径的算法(离散数学实验报告)实验3:最短路径算法⼀、实验⽬的通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想⼆、实验内容⽤C语⾔编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点⾃动求出最短路径三、实验原理、⽅法和⼿段1、Floyd算法的原理定义:Dk[i,j] 表⽰赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度,若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即D-1[i,j] 表⽰赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝D0[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点D1[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点┉┉┉根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] }定义:path[i,j]表⽰从结点vi到vj的“最短”路径上vi的后继结点四、实验要求要求输出每对结点之间的最短路径长度以及其最短路径五、实验步骤(⼀)算法描述Step 1 初始化有向图的成本邻矩阵D、路径矩阵path若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i;否则D[i,j]=∝,path[i,j]=-1Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新⾏对i=1,2,┉n 重复Step 4Step 4 刷新Mij 对j=1,2,┉n若D k-1[i,k]+D k-1[k,j][结束循环][结束Step 3循环][结束Step 2循环]Step 5 退出(⼆)程序框图参考主程序框图其中,打印最短路径中间结点调⽤递归函数dist(),其框图如下,其中fist,end是当前有向边的起点和终点dist(int first, int end)七、测试⽤例:1、输⼊成本邻接矩阵:D :06380532290141003210∝∝∝∝V V V V V V V V (其中∝可⽤某个⾜够⼤的数据值代替,⽐如100)可得最短路径矩阵:P :131132122211111010103210--------V V V V V V V V以及各顶点之间的最短路径和最短路径长度:从V0到V1的最短路径长度为:1 ;最短路径为:V0→V1 从V0到V2的最短路径长度为:9 ;最短路径为:V0→V1→V3→V2 从V0到V3的最短路径长度为:3 ;最短路径为:V0→V1→V3 从V1到V0的最短路径长度为:11;最短路径为:V1→V3→V2→V0从V1到V2的最短路径长度为:8 ;最短路径为:V1→V3→V2 从V1到V3的最短路径长度为:2 ;最短路径为:V1→V3 从V2到V0的最短路径长度为:3 ;最短路径为:V2→V0 从V2到V1的最短路径长度为:4 ;最短路径为:V2→V0→V1 从V2到V3的最短路径长度为:6 ;最短路径为:V2→V0→V1→V3 从V3到V0的最短路径长度为:9 ;最短路径为:V3→V2→V0 从V3到V1的最短路径长度为:10;最短路径为:V3→V2→V0→V1 从V3到V2的最短路径长度为:6 ;最短路径为:V3→V2 参考程序: #include #define INFINITY 100 #define Max 10int a[Max][Max],P[Max][Max]; main() {void Print_Flod(int d);int i,j,k,D=4;printf("请输⼊成本邻接矩阵:\n");for(i=0;ifor(j=0;j{scanf("%d",&a[i][j]);}for(i=0;ifor(j=0;j{if(a[i][j]>0&& a[i][j]elseP[i][j]=-1;}for(k=0;kfor(i=0;ifor(j=0;jif (a[i][k]+a[k][j]{a[i][j]=a[i][k]+a[k][j];P[i][j]=k;}Print_Flod(D);}void Print_Flod(int d){void dist(int first,int end);int i,j;for(i=0;ifor(j=0;jif(i!=j){ printf("from V%d to V%d: ",i,j); dist(i,j);printf("V%d",j);printf(" (The length is: %d)\n",a[i][j]); }}void dist(int first,int end){ int x;x=P[first][end];if(x!=first){ dist(first,x); dist(x,end); }else printf("V%d->",x);}输出结果:。
MD模拟在新材料研究中的应用MD模拟,在物理、化学与材料科学中被广泛应用,是分子动力学模拟的缩写。
它通过模拟原子、分子等粒子在其相互作用力下的运动过程,探索材料结构与动力学性质。
MD模拟的成功归功于计算机技术的不断发展,尤其是高性能计算机和云计算。
MD 模拟为材料研究提供了一种全新的手段,它可以同实验相结合,更快地理解材料的行为,并提出预测和优化新材料的方案。
在本文中,我们将探讨MD模拟在新材料研究中的应用。
一、理解材料的结构与性质MD模拟是一种原子层次的数值计算方法,因此可以捕捉材料中原子和分子的行为。
通过该方法,我们可以计算材料的结构、形态以及有关材料的化学物理特征。
这些信息提供了材料研究的基础,例如晶体结构、电荷转移、电学性质、热学性质、机械性能、光学性质等。
MD模拟可以通过改变温度、压力、化学反应和外界环境等因素,来探索材料不同填充状态下的性质,从而发现材料中潜在的性能。
生成更好的结构、提高性能和确定制造过程可能需要的良好了解材料行为的基本知识。
这是MD模拟的优势之一。
二、预测新材料的性质借助MD模拟,研究人员可以探究具有不同的化学组成的化合物的电学、热学和机械属性。
这有助于开发更好的新材料以满足不同需求。
通过预测的物质属性,研究人员可以在不必测试的情况下比较不同材料的性能。
这防止了更多实验的进行并节省了大量的时间和资源。
虽然实验室测量是不可避免的,但MD模拟可以提供有关材料性能的有价值的信息,这是在难以实现的实验条件的情况下尤其重要。
此外,预测性能突出的新材料还可以在应用领域中广泛使用,例如电池材料、半导体材料、太阳能电池等。
三、创建分子机器人系统MD模拟可以帮助科学家研究分子机器人的运作,从而设计更好的分子机械系统。
科学家可以通过构建分子块、计算其行为来深入研究分子机器人的机制。
通过MD模拟,可以了解这些机器人如何在不同外部条件下运作,以及他们如何与其他分子交互以完成其任务。
这些机器人可以用作可编程分子集合,例如分子存储、分子计算等。
动力学模拟计算方法探究动力学模拟计算方法(Molecular Dynamics Simulation,以下简称MD)是一种利用计算机对分子运动进行模拟的方法。
它可以在原子和分子水平上揭示材料或生物分子的动态性质。
MD方法广泛应用于物理学、化学、材料科学、生物学等领域。
MD方法的基本原理是根据牛顿力学模拟粒子间相互作用。
模拟系统中每个原子或分子的位置和速度都是由牛顿方程决定的。
通过揭示这些微观运动,我们可以了解更多关于分子结构、运动和相互作用的信息。
MD方法的具体步骤包括建立模型、设定初始条件、进行能量最小化和长时间动力学模拟。
建立模型需要确定分子的种类、数量、分子间力场等。
设定初始条件需要给每个原子或分子分配初始位置和速度。
能量最小化是为了使模拟系统处于一个平衡状态,避免模拟过程中分子浮动太大。
长时间动力学模拟是模拟分子在一段时间内的运动轨迹。
MD方法的优点在于可以模拟现实中很难或不可能观察到的物理和化学现象。
例如,MD方法可以模拟蛋白质分子的折叠过程,以及纳米材料的力学性质等。
同时,MD方法还可以为实验提供预测信息,缩短实验的周期和成本。
除了在基础研究中的应用外,MD方法也在工业生产过程中得到广泛应用。
例如,MD方法可以帮助设计材料的性质,提高材料的稳定性和生产效率。
同时,MD方法也可以帮助设计新的药物和生物分子,为药物研发和生物医学领域的重大疾病提供治疗方案。
然而,MD方法也存在一些局限性。
一方面,模拟系统必须是孤立的,没有外界干扰,这对一些材料和生物物质来说是不可行的。
另一方面,MD方法需要极高的计算能力和存储资源,计算成本也比较高。
为了弥补这些局限性,近年来出现了许多改进MD方法的技术。
例如,Monte Carlo方法可用于处理超过百万级别的分子,Metropolis-Coupled Monte Carlo方法可用于处理高度非均匀和外部约束系统,快速多极子算法(Fast Multipole Method)可用于处理大型电动力学模拟等。
MD5算法原理及代码实现MD5(Message Digest Algorithm 5)是一种被广泛使用的消息摘要算法,它是MD家族中的第五个版本。
MD5算法能将任意长度的输入数据转换为一个128位(16字节)的散列值,通常表示为32个十六进制数。
1. 填充(Padding):为了使输入消息的位数对512求余数等于448,填充是必要的。
例如,如果输入消息的位数是L,填充后的消息长度为K* 512 + 448,其中K是一个非负整数。
填充后的消息被分为512位(64字节)的块。
2. 初始化(Initialization):算法对四个32位的缓冲区A、B、C、D进行初始化,通常初始化为常量。
这些缓冲区用于保存中间计算结果。
3. 循环(Iteration):通过进行四轮循环的操作,将每个512位的块以及前一个块的连续散列结果作为输入,产生新的散列结果。
每轮循环包括四个步骤:数据的复制、数据的变换、数据的交换以及数据的加法。
4. 输出(Output):将最后一轮循环的输出结果根据顺序连接起来,形成128位的散列值。
下面是一个简单的MD5算法的代码示例,使用Python语言实现:```pythonimport hashlibdef md5(message):md5_hash = hashlib.md5md5_hash.update(message.encode('utf-8'))return md5_hash.hexdigest#测试message = "Hello, world!"md5_value = md5(message)print("MD5 hash value:", md5_value)```在上述代码中,我们首先导入了Python标准库中的hashlib模块,该模块提供了MD5算法的实现。
然后,我们定义了一个名为md5的函数,它接受一个字符串形式的消息作为输入,并返回该消息的MD5散列值。
第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。
通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。
二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。
- 实验步骤:1. 编写各排序算法的C++实现。
2. 使用随机生成的不同规模的数据集进行测试。
3. 记录并比较各算法的运行时间。
4. 分析不同排序算法的时间复杂度和空间复杂度。
2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。
- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。
2. 使用标准测试数据集进行测试。
3. 对比分析三种算法的执行时间和求解质量。
3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。
- 实验步骤:1. 编写动态规划算法的C++实现。
2. 使用不同规模的矩阵链乘实例进行测试。
3. 分析算法的时间复杂度和空间复杂度。
4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。
- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。
2. 编写遗传算法的C++实现。
3. 使用标准测试数据集进行测试。
4. 分析算法的收敛速度和求解质量。
三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。
- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。
2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。
- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。
- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。
3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。
MD5算法的设计与实现MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于对任意长度的数据进行加密和校验。
MD5算法由美国密码学家罗纳德·李维斯特(Ronald Rivest)于1991年提出,目前仍广泛应用于数据完整性校验、密码存储等领域。
1.不可逆性:MD5算法是单向的,无法通过哈希值逆向推导出原始数据。
这意味着即使知道哈希值,也无法还原出原始数据。
2.高度离散性:MD5算法对输入数据的任意细微更改都会产生完全不同的哈希值。
这意味着即使数据只有一点点改变,其哈希值也会完全不同。
3.快速性:MD5算法的计算速度相对较快,能够在短时间内对大量数据进行哈希计算。
1.填充数据:对输入数据进行填充,使其长度恰好为512的倍数。
填充时,在数据末尾添加一个1,后面补0至满足长度要求。
2.填充长度:将填充后的数据长度(以比特位为单位)表示为64位二进制数,并添加到填充数据的末尾。
3.初始化状态:定义四个32位的寄存器A、B、C、D,并初始化为特定的常量值。
4.分组处理:将填充后的数据分成若干个512位的分组,每次处理一个分组。
5.循环操作:对每个分组进行四轮循环操作,每轮操作包括四个步骤。
a.F函数:根据当前轮数选择不同的非线性函数,并将寄存器A、B、C、D的值传入。
b.G函数:根据当前轮数选择不同的线性函数,并将寄存器A、B、C、D的值传入。
c.H函数:根据当前轮数选择不同的线性函数,并将寄存器A、B、C、D的值传入。
d.I函数:根据当前轮数选择不同的线性函数,并将寄存器A、B、C、D的值传入。
6.更新寄存器:根据循环操作的结果更新寄存器A、B、C、D的值。
7.输出结果:将最终的寄存器值按顺序连接起来,得到128位的哈希值。
1.碰撞攻击:由于MD5算法的哈希值只有128位,因此存在不同的输入数据生成相同的哈希值的可能性,这被称为碰撞。
攻击者可以通过特定的方法找到两个不同的输入数据,生成相同的哈希值,从而绕过数据完整性校验。
化合物MD模拟计算方法的研究与应用随着计算机技术和软件的发展,分子动力学模拟(Molecular Dynamics,MD)计算方法在材料科学、生命科学等领域中得到了广泛应用。
在化学化工领域中,MD模拟被用于研究材料的结构、性质以及反应机制等问题。
本文将从化合物MD模拟计算方法的研究和应用两个方面来探讨这一方法在化学领域中的价值。
一、化合物MD模拟计算方法的研究MD模拟的本质是通过数值计算模拟粒子之间的相互作用,以得到材料的结构和性质等信息。
而化合物MD模拟是将MD模拟运用于化合物的研究中。
首先,化合物MD模拟研究需要建立能够准确描述化学键、原子位置以及分子间相互作用等信息的模型。
目前,常用的模型包括力场(force field)和量子化学方法(Quantum Chemistry,QC)。
力场方法采用原子-分子相互作用势能函数来模拟材料的分子结构和动力学。
力场方法具有计算速度快、适用范围广、精度可控等优点,已成为化合物MD模拟的重要方法。
而量子化学方法是基于量子力学理论的计算方法,其结果更加准确,但计算复杂度很大,适用范围也相对有限。
因此,一般情况下,研究者会根据材料类型和实际需要,选择适当的模型来进行化合物MD模拟研究。
其次,化合物MD模拟研究需要建立物理学上合理的计算模拟条件。
这些条件包括温度、压力、体积等因素。
相应的计算方法包括NVT系综(恒定温度、体积和粒子数)、NPT系综(恒定温度、压力、体积和粒子数)等。
最后,化合物MD模拟还需要合理的计算算法。
常见的算法包括Verlet算法、Leapfrog算法、Predictor-Corrector算法等。
这些算法的核心都是基于牛顿力学方程,根据系统的初始状态推演出随时间变化的物理学过程。
二、化合物MD模拟计算方法的应用化合物MD模拟计算方法已被应用于多个领域。
1. 化学反应机制研究化学反应机制研究是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,} 。