MD5算法
- 格式:doc
- 大小:47.50 KB
- 文档页数:20
md5流程图MD5流程图。
MD5(Message Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值,通常以32位的十六进制数表示。
MD5算法主要用于确保数据的完整一致性,防止数据被篡改。
在实际应用中,MD5常被用于加密存储用户密码、验证文件完整性等场景。
MD5算法的流程可以用一张流程图来清晰地展现出来。
下面我们将从输入数据、数据填充、初始化向量、循环压缩等方面来介绍MD5算法的流程图。
1. 输入数据。
MD5算法的输入数据可以是任意长度的二进制数据,首先需要将输入数据分割成512位(64字节)的块。
如果输入数据的长度不足512位,需要进行数据填充。
2. 数据填充。
数据填充是为了保证输入数据的长度是512位的整数倍。
填充的方法是在数据的末尾添加一个1和若干个0,直到数据的长度满足要求。
然后在末尾添加一个64位的整数,表示原始数据的长度(以位为单位)。
3. 初始化向量。
MD5算法使用4个32位的寄存器(A、B、C、D)作为初始化向量,这些寄存器的初始值是固定的。
初始化向量的作用是在压缩函数中引入一些固定的值,增加算法的随机性和安全性。
4. 循环压缩。
MD5算法使用了64个循环压缩函数,每个函数都对512位的数据块进行一次处理。
在每个循环中,都会对寄存器进行一系列的位运算和逻辑操作,最终得到一个新的寄存器值。
5. 输出结果。
经过64个循环压缩函数的处理后,MD5算法将得到一个128位的散列值,这个值就是MD5算法对输入数据的加密结果。
总结。
MD5算法的流程图清晰地展示了整个算法的处理过程,从输入数据到数据填充、初始化向量、循环压缩再到输出结果,每个步骤都有清晰的逻辑关系。
通过了解MD5算法的流程图,我们可以更加深入地理解MD5算法的工作原理,为我们的实际应用提供了更多的参考和指导。
在实际应用中,虽然MD5算法曾经被广泛使用,但是由于其存在一些安全性问题,现在已经逐渐被更安全的算法所取代。
md5 加密原理MD5 加密原理什么是 MD5 加密•MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于将任意长度的信息压缩成一个128位的哈希值。
•MD5 加密主要用于数据的完整性校验,比如验证文件是否被篡改过,密码是否正确等等。
MD5 加密的原理1.密码转换:将输入的密码转换成二进制形式。
2.消息填充:根据 MD5 算法规定的填充方法,将密码进行填充,使其长度满足一定条件。
3.初始向量:MD5 算法中存在一个初始向量,将其与填充后的密码进行逻辑运算,得到一个中间结果。
4.分组处理:将中间结果按照一定规则进行分组,每个分组进行一次处理。
5.小段加工:每个分组进行一系列的加工操作,包括逻辑运算、位运算等。
6.合并结果:将每个分组得到的结果,按照一定的顺序进行合并,得到最终的加密结果。
MD5 加密的特点•不可逆性:MD5 加密是单向的,即无法通过加密结果反推出原始密码。
•完整性:如果原始密码有一点改动,经过 MD5 加密后的结果将会截然不同。
•快速性:MD5 加密过程相对较快,适合在大量数据上进行加密。
MD5 加密的安全性问题•易碰撞:由于 MD5 的哈希值长度固定,存在不同的输入可能生成相同的哈希值,这被称为碰撞。
•容易被破解:由于现代计算能力的增强,MD5 加密已被证明相对较弱,容易被暴力破解。
如何增强 MD5 加密的安全性•加盐:通过在原始密码中添加一段随机字符串,增加破解的难度。
•应用更强大的算法:如 SHA-256、SHA-3 等更安全的哈希算法来替代 MD5。
总结MD5 加密是一种常用的哈希算法,用于数据完整性校验和密码存储等场景。
然而,由于其存在碰撞和易破解的问题,建议在实际应用中采用更安全的哈希算法,以保证数据的安全性。
以上就是关于 MD5 加密原理的介绍,希望对您有所帮助!。
md5加密算法的基本原理
MD5(Message Digest Algorithm 5)是一种常用的哈希函数,被广泛用于数据加密、数字签名、数据完整性验证以及密码保护等领域。
它可以将任意长度的数据转换成固定长度的128位(16字节)数字指纹,并且不同的数据会产生不同的指纹,因此可以用于验证数据的完整性和真实性。
MD5算法的基本原理可以简单概括为以下几个步骤:
1. 填充数据:将待处理的数据按照一定规则进行填充,使得填充后的数据长度为64的整数倍,同时在末尾增加一个64位的长度描述,用于记录原始数据的长度。
2. 初始化状态:MD5算法使用4个32位寄存器(A、B、C、D)来维护状态,初始化时会将这些寄存器赋初值,其中A、B、C、D的初始值分别为0x67452301、0xEFCDAB89、0x98BADCFE和0x10325476。
3. 循环压缩:将填充后的数据按照512位(64字节)的分组进行处理,每个分组包含16个32位字。
通过循环压缩的方式,先对这些字进行一系列的位运算和加法运算,然后再将结果与寄存器中的值进行合并,最终得到新的寄存器状态。
4. 输出结果:对所有分组处理完毕后,将A、B、C、D四个寄存器中的值按照
一定顺序拼接起来,得到最终的128位数字指纹。
需要注意的是,MD5算法虽然是一种较为安全的哈希函数,但也存在被攻击的风险。
近年来,随着计算机技术的不断进步,MD5算法已经被证明存在一定的弱点,容易被暴力破解、碰撞攻击等攻击手段破解。
因此,在实际应用中,建议使用更加安全的哈希函数,如SHA-256等。
MD5加密算法的原理及应用MD5加密算法是一种常见的哈希算法,用于产生固定长度的摘要信息。
该算法由美国计算机安全专家罗纳德·李维斯特于1991年设计,并在1992年首次公开。
MD5是指“Message Digest Algorithm 5”的缩写。
MD5加密算法的原理是将任意长度的输入消息通过一系列操作转换为长度固定(128位)的输出摘要。
这一过程是不可逆的,即无法通过摘要信息还原出原始的输入消息。
MD5算法的核心函数包括位操作、模运算、异或运算和与非运算。
具体过程如下:1.初始填充:将输入消息分割为若干个512位的消息块,并添加填充位,使每个消息块的长度为512位。
2.初始化状态:将四个32位的寄存器A、B、C、D初始化,作为MD5算法的内部状态。
3.处理消息块:循环处理每个消息块,对每个消息块进行一系列的位运算、模运算和异或运算,修改内部状态。
4.输出:处理完所有消息块后,将最终的内部状态输出为一个128位(32位×4)的摘要。
1.文件完整性校验:MD5可以对文件进行哈希计算,生成唯一的摘要值,通过比对两个文件的MD5摘要是否一致,可以判断文件是否被篡改。
2.密码存储:在用户注册过程中,通常不会将用户的密码明文存储在数据库中,而是将其进行MD5加密后存储。
当用户登录时,输入的密码再次通过MD5加密与数据库中存储的加密密码进行对比。
4.垃圾邮件过滤:MD5可以用于检测垃圾邮件。
将邮件的正文内容通过MD5加密并与已知的垃圾邮件MD5值进行对比,可以快速判定该邮件是否为垃圾邮件。
5.数据库索引:MD5可以作为数据库索引的一部分,提高查询效率。
通过对需要索引的数据进行MD5加密,可以将一部分数据转化为固定长度的摘要,便于数据库的查询操作。
然而,由于MD5算法的安全性较低,易受到碰撞攻击(即找到不同的原始消息,但其MD5摘要值相同)和彩虹表攻击(通过预先计算MD5摘要的映射关系,快速破解密码)等攻击方式的影响,因此在一些对安全性要求较高的场景,如数据加密、验证、身份认证等领域,MD5算法已经不再推荐使用。
MD5原理及定义算法MD5(Message-Digest Algorithm 5)是一种常见的哈希算法,用于将任意长度的数据(消息)映射为固定长度(128位)的哈希值。
它由美国密码学家罗纳德·李维斯特(Ronald Rivest)在1991年设计,并于1992年被广泛应用于密码学和数据完整性验证领域。
MD5算法的原理可以简单概括为以下几个步骤:1. 填充消息:首先,将消息填充为一个长度为512-bit的块。
填充规则是在消息的末尾添加一个1,然后填充0直到消息长度满足对512取模等于448的条件。
剩余的64位用来存储消息的原始长度。
2.初始化状态:定义4个32位的寄存器A、B、C、D,初始值为固定常量。
每个寄存器都会在后续的操作中被修改。
3. 处理消息块:将填充后的消息分割为若干512-bit的块,并对每个块进行处理。
每个块又被分为16个32-bit的子块。
4.定义运算函数:定义了4个基本的逻辑函数,用于对寄存器进行操作。
这些函数包括与、或、非和异或等操作。
5.循环运算:对每个子块进行四轮循环运算。
每轮中,根据当前轮数选择不同的逻辑函数,并使用一个常量表来确定逻辑函数的参数。
6.更新寄存器:在每轮循环运算中,根据逻辑函数的结果和常量表的参数,更新寄存器的值。
7. 输出结果:在处理完所有块后,将最终得到的寄存器值按照特定的顺序连接起来,得到最终的128-bit哈希值。
MD5算法的定义包括以下几个关键点:1. 唯一性:对不同的输入消息,MD5算法应该生成不同的哈希值,即使输入消息只有一个bit的不同。
2.雪崩效应:对输入消息的微小改动,应该导致哈希值的显著变化。
任何对输入消息的修改都应该在哈希值中产生不可预测的结果。
3.不可逆性:从哈希值无法推导出原始消息的内容。
即使两个消息的哈希值相同,也不能推断它们的内容相同。
4.高效性:MD5算法应该在合理时间内计算出哈希值,即使输入消息非常大。
然而,尽管MD5算法在设计时被广泛应用于密码学和数据完整性验证领域,但随着计算能力的提升和算法的发展,MD5算法已经逐渐被认为不再安全。
md5密码强度判断逻辑【原创版】目录一、引言二、MD5 密码强度判断逻辑的概述1.MD5 算法简介2.MD5 密码强度判断逻辑的作用三、MD5 密码强度判断逻辑的实现1.密码长度的判断2.密码包含数字的判断3.密码包含大写字母的判断4.密码包含小写字母的判断四、MD5 密码强度判断逻辑的示例五、总结正文一、引言在互联网时代,密码安全显得越来越重要。
作为一种广泛应用的加密算法,MD5 在保障密码安全方面起到了重要作用。
本文将介绍如何通过MD5 密码强度判断逻辑来提高密码的安全性。
二、MD5 密码强度判断逻辑的概述1.MD5 算法简介MD5(Message-Digest Algorithm 5)是一种广泛应用的加密散列算法,由 RSA 安全公司于 1995 年提出。
它可以将任意长度的明文转换为固定长度(128 位)的密文,具有速度快、安全性高等特点。
2.MD5 密码强度判断逻辑的作用MD5 密码强度判断逻辑用于评估用户输入的密码是否具有足够的安全性。
通过这种逻辑,可以在用户注册或登录时提醒用户修改密码,从而提高整个系统的安全性。
三、MD5 密码强度判断逻辑的实现1.密码长度的判断密码长度是衡量密码强度的重要指标。
一般来说,密码越长,强度越高。
因此,在实现 MD5 密码强度判断逻辑时,首先需要判断密码的长度。
如果密码长度小于一定值(如 8 个字符),则认为密码强度不足。
2.密码包含数字的判断在密码中包含数字可以提高密码的强度。
因此,在实现 MD5 密码强度判断逻辑时,需要判断密码中是否包含数字。
如果密码中包含数字,则认为密码强度较高。
3.密码包含大写字母的判断同样地,在密码中包含大写字母也可以提高密码的强度。
因此,在实现 MD5 密码强度判断逻辑时,需要判断密码中是否包含大写字母。
如果密码中包含大写字母,则认为密码强度较高。
4.密码包含小写字母的判断在密码中包含小写字母同样可以提高密码的强度。
因此,在实现 MD5 密码强度判断逻辑时,需要判断密码中是否包含小写字母。
md5加密算法原理MD5加密算法原理。
MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值。
MD5算法主要用于确保数据完整一致,防止数据被篡改。
在计算机安全领域,MD5算法被广泛应用于加密存储密码、数字签名、校验文件完整性等方面。
本文将介绍MD5加密算法的原理及其应用。
MD5算法的原理主要包括四个步骤,填充消息、初始化变量、处理消息块、输出结果。
首先,对消息进行填充,使其长度满足448模512,即长度对512取余的结果为448。
然后,初始化四个32位的变量A、B、C、D,这些变量将用于存储最终的散列值。
接下来,对填充后的消息进行分块处理,每个消息块包含512位。
最后,将处理完的消息块按照一定的顺序进行合并,并输出最终的128位散列值。
MD5算法的核心是基于四轮循环的压缩函数,每轮循环包括16次操作。
在每次操作中,都会对A、B、C、D四个变量进行一系列的位运算和非线性函数操作,以及与消息块中的数据进行混合和置换。
通过这些操作,最终得到了128位的散列值。
MD5算法的安全性一直备受争议。
由于其设计上的一些缺陷,如碰撞攻击、预映射攻击等,使得MD5算法在一些安全领域已经不再被推荐使用。
因此,一些安全专家建议使用更安全的散列算法,如SHA-256、SHA-3等。
尽管MD5算法存在安全性问题,但在一些非安全领域仍然有着广泛的应用。
例如,在一些需要校验文件完整性的场景下,可以使用MD5算法生成文件的校验值,并与接收方进行比对,以确保文件未被篡改。
此外,在一些对安全性要求不高的场景下,如密码加密存储、数字签名等,MD5算法仍然可以被使用。
总的来说,MD5算法作为一种密码散列函数,在数据完整性校验、密码存储等方面有着广泛的应用。
然而,由于其安全性存在一定的问题,建议在对安全性要求较高的场景下,选择更加安全的散列算法。
在使用MD5算法时,也需要注意对数据进行合理的加盐处理,以增加密码的安全性。
md5加密算法原理MD5的全称是Message-DigestAlgorithm,是Hash算法中的一种重要算法,具有单项加密、加密结果唯一、安全性能好等特点。
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
(1)信息填充首先需要对明文信息进行填充,使其位长度对512求余的结果等于448.因此,信息的位长度(BitsLength)将被扩展至N512+448.然后,再在这个结果后面附加一个以64位二进制表示的填充前信息长度。
经过这两步的处理,现在的信息字节长度为N512+448+64=(N+1)*512,即长度恰好是512的整数倍。
(2)结构初始化在处理过程中需要定义一个结构。
该结构包含了每一次需要处理的一个明文块(512bit)和计算出来的散列值(128bit)。
在散列的整个过程中,它的作用非常重要,各个明文块计算出来的散列值都是通过它来传递的。
(3)分组文件将填充好的文件进行分组,每组512位,共有N组。
(4)处理分组使用算法处理每组数据。
MD5算法在计算时会用到四个32位被称作链接变量;(ChainingVariable)的整数参数,在使用之前要对它们赋初值,分别就为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210.当设置好这四个链接变量后,就开始进入算法的四轮循环运算。
循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C 到c,D到d。
主循环有四轮,每轮循环都很相似。
第一轮进行16次操作。
每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,一个子分组和一个常数。
再将所得结果向右移一个不定的数,并加上a、b、c或d中之一,最后用该结果取代a、b、c或d中之一。
添加到搜藏编辑词条词条统计MD5简介算法的应用算法描述具体的一个MD5实现一些破解MD5的网站FF(d, a, b, c, M9, 12, 0x8b44f7af) FF(c, d, a, b, M10, 17, 0xffff5bb1) FF(b, c, d, a, M11, 22, 0x895cd7be) FF(a, b, c, d, M12, 7, 0x6b901122) FF(d, a, b, c, M13, 12, 0xfd987193) FF(c, d, a, b, M14, 17, 0xa679438e) FF(b, c, d, a, M15, 22, 0x49b40821) 第二轮GG(a, b, c, d, M1, 5, 0xf61e2562) GG(d, a, b, c, M6, 9, 0xc040b340) GG(c, d, a, b, M11, 14, 0x265e5a51) GG(b, c, d, a, M0, 20, 0xe9b6c7aa) GG(a, b, c, d, M5, 5, 0xd62f105d) GG(d, a, b, c, M10, 9, 0x02441453) GG(c, d, a, b, M15, 14, 0xd8a1e681) GG(b, c, d, a, M4, 20, 0xe7d3fbc8) GG(a, b, c, d, M9, 5, 0x21e1cde6) GG(d, a, b, c, M14, 9, 0xc33707d6) GG(c, d, a, b, M3, 14, 0xf4d50d87) GG(b, c, d, a, M8, 20, 0x455a14ed) GG(a, b, c, d, M13, 5, 0xa9e3e905) GG(d, a, b, c, M2, 9, 0xfcefa3f8)GG(c, d, a, b, M7, 14, 0x676f02d9) GG(b, c, d, a, M12, 20, 0x8d2a4c8a)第三轮HH(a, b, c, d, M5, 4, 0xfffa3942)HH(d, a, b, c, M8, 11, 0x8771f681) HH(c, d, a, b, M11, 16, 0x6d9d6122) HH(b, c, d, a, M14, 23, 0xfde5380c) HH(a, b, c, d, M1, 4, 0xa4beea44) HH(d, a, b, c, M4, 11, 0x4bdecfa9) HH(c, d, a, b, M7, 16, 0xf6bb4b60) HH(b, c, d, a, M10, 23, 0xbebfbc70)件Security.h===============================================/*使用方法:char Md5Buffer[33];CSecurity Security;Security.MD5("a string",Md5Buffer);执行完成之后Md5Buffer中即存储了由"a string"计算得到的MD5值*/// 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法。
md5加密用法范文MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,广泛应用于信息安全领域。
它能将任意长度的数据映射成固定长度(通常是128位)的哈希值,且不同的输入会产生不同的输出。
在本文中,我们将详细介绍MD5加密的用法。
一、MD5加密的原理MD5是一种单向散列函数,它的主要原理如下:1.输入数据:用户输入一条消息作为输入数据。
2.填充数据:MD5算法会对输入数据进行填充,使得填充后的数据长度满足一定的条件。
3.分块处理:填充后的数据会被分成若干个块进行处理。
4.初始向量:MD5算法会使用一个初始向量作为计算哈希值的起点。
5.迭代过程:每个块都会进行迭代处理,生成一个中间结果。
这些中间结果会在最后合并成最终的哈希值。
6.输出结果:最终的哈希值就是MD5加密后的结果。
二、MD5加密的应用MD5加密具有以下几个应用场景:1.密码存储:在存储用户密码时,通常不建议明文存储。
将用户密码经过MD5加密后存储,即使数据库泄露,也不会直接暴露用户密码。
2.数字签名:MD5加密可以用于数字签名,比如验证文件的完整性和真实性。
发送方可以对文件进行MD5加密,将加密后的哈希值发送给接收方。
接收方可以对收到的文件进行MD5加密,然后与发送方发送的哈希值进行对比,以验证文件是否被篡改。
3.防篡改:在一些系统中,为了防止数据被篡改,可以对数据进行MD5加密,然后将加密结果与数据一起发送给接收方。
接收方可以对数据进行MD5加密,然后将加密结果与接收到的加密结果进行对比,如果不一致,则说明数据被篡改。
4.版权保护:MD5加密可以用于保护文档的版权。
对于文档的内容进行MD5加密后得到一个唯一标识符,可以用于验证文档的原始性,防止他人对文档进行盗版。
5.安全认证:在一些场景下,为了验证数据的真实性,可以通过MD5加密生成一个校验值,然后将校验值通过安全渠道传输给接收方。
接收方可以对数据进行MD5加密,然后与接收到的校验值进行对比,如果一致,则说明数据是可信的。
/* md5.h */#ifndef _MD5_H_#define _MD5_H_#define R_memset(x, y, z) memset(x, y, z)#define R_memcpy(x, y, z) memcpy(x, y, z)#define R_memcmp(x, y, z) memcmp(x, y, z)typedef unsigned long UINT4;typedef unsigned char *POINTER;/* MD5 context. */typedef struct {/* state (ABCD) *//*四个32bits数,用于存放最终计算得到的消息摘要。
当消息长度〉64字节时,也用于存放每个64字节的中间结果*/UINT4 state[4];/* number of bits, modulo 2^64 (lsb first) *//*存储原始信息的bits数长度,不包括填充的bits,最长为2^64 bits,因为2^64是一个64位数的最大值*/UINT4 count[2];/* input buffer *//*存放输入的信息的缓冲区,64字节*/unsigned char buffer[64];} MD5_CTX;void MD5Init(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char *, unsigned int); void MD5Final(unsigned char [16], MD5_CTX *);#endif /* _MD5_H_ *//////////////////////////////////////////////////////////////////// /////////* md5.cpp */#include "stdafx.h"/* Constants for MD5Transform routine. *//*md5转换用到的常量,算法本身规定的*/#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23#define S41 6#define S42 10#define S43 15#define S44 21static void MD5Transform(UINT4 [4], unsigned char [64]); static void Encode(unsigned char *, UINT4 *, unsigned int); static void Decode(UINT4 *, unsigned char *, unsigned int);/*用于bits填充的缓冲区,为什么要64个字节呢?因为当欲加密的信息的bits数被512除其余数为448时,需要填充的bits的最大值为512=64*8 。
*/static 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};/*接下来的这几个宏定义是md5算法规定的,就是对信息进行md5加密都要做的运算。
据说有经验的高手跟踪程序时根据这几个特殊的操作就可以断定是不是用的md5*//* F, G, H and I are basic MD5 functions.*/#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)))/* ROTATE_LEFT rotates x left n bits.*/#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */#define FF(a, b, c, d, x, s, ac) { \(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define GG(a, b, c, d, x, s, ac) { \(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define HH(a, b, c, d, x, s, ac) { \(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}#define II(a, b, c, d, x, s, ac) { \(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \(a) = ROTATE_LEFT ((a), (s)); \(a) += (b); \}/* MD5 initialization. Begins an MD5 operation, writing a new context. *//*初始化md5的结构*/void MD5Init (MD5_CTX *context){/*将当前的有效信息的长度设成0,这个很简单,还没有有效信息,长度当然是0了*/context->count[0] = context->count[1] = 0;/* Load magic initialization constants.*//*初始化链接变量,算法要求这样,这个没法解释了*/ context->state[0] = 0x67452301;context->state[1] = 0xefcdab89;context->state[2] = 0x98badcfe;context->state[3] = 0x10325476;}/* MD5 block update operation. Continues an MD5 message-digestoperation, processing another message block, and updating thecontext. *//*将与加密的信息传递给md5结构,可以多次调用context:初始化过了的md5结构input:欲加密的信息,可以任意长inputLen:指定input的长度*/void MD5Update(MD5_CTX *context,unsigned char * input,unsigned int inputLen){unsigned int i, index, partLen;/* Compute number of bytes mod 64 *//*计算已有信息的bits长度的字节数的模64, 64bytes=64字节。
用于判断已有信息加上当前传过来的信息的总长度能不能达到64字节,如果能够达到则对凑够的64字节进行一次处理*/index = (unsigned int)((context->count[0] >> 3) & 0x3F);/* Update number of bits *//*更新已有信息的bits长度*/if((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3))context->count[1]++;context->count[1] += ((UINT4)inputLen >> 29);/*计算已有的字节数长度还差多少字节可以凑成64的整倍数*/partLen = 64 - index;/* Transform as many times as possible.*//*如果当前输入的字节数大于已有字节数长度补足64字节整倍数所差的字节数*/if(inputLen >= partLen){/*用当前输入的内容把context->buffer的内容补足64字节*/R_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);/*用基本函数对填充满的64字节(已经保存到context->buffer中)做一次转换,转换结果保存到context->state中*/MD5Transform(context->state, context->buffer);/*对当前输入的剩余字节做转换(如果剩余的字节<在输入的input缓冲区中>大于64字节的话),转换结果保存到context->state中*/for(i = partLen; i + 63 < inputLen; i += 64)/*把i+63<inputlen 改为i+64<=inputlen更容易理解*/MD5Transform(context->state, &input[i]);index = 0;}elsei = 0;/* Buffer remaining input *//*将输入缓冲区中的不足填充满64字节的剩余内容填充到context->buffer中,留待以后再作处理*/R_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);}/* MD5 finalization. Ends an MD5 message-digest operation, writing thethe message digest and zeroizing the context. *//*获取加密的最终结果digest:保存最终的加密串context:你前面初始化并填入了信息的md5结构*/void MD5Final (unsigned char digest[16],MD5_CTX *context) {unsigned char bits[8];unsigned int index, padLen;/* Save number of bits *//*将要被转换的信息(所有的)的bits长度拷贝到bits中*/ Encode(bits, context->count, 8);/* Pad out to 56 mod 64. *//* 计算所有的bits长度的字节数的模64, 64bytes=64字节*/index = (unsigned int)((context->count[0] >> 3) & 0x3f);/*计算需要填充的字节数,padLen的取值范围在1-64之间*/padLen = (index < 56) ? (56 - index) : (120 - index);/*这一次函数调用绝对不会再导致MD5Transform的被调用,因为这一次不会填满64字节*/MD5Update(context, PADDING, padLen);/* Append length (before padding) *//*补上原始信息的bits长度(bits长度固定的用64bits表示),这一次能够恰巧凑够64字节,不会多也不会少*/MD5Update(context, bits, 8);/* Store state in digest *//*将最终的结果保存到digest中。