哈希算法MD5

合集下载

MD5加密算法的原理及应用

MD5加密算法的原理及应用

MD5加密算法的原理及应用MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于将任意长度的数据加密成固定长度的(通常为128位)哈希值。

它由美国密码学家罗纳德·李维斯特(Ronald Rivest)于1992年提出,被广泛应用于网络安全、数据完整性检查和密码保护等领域。

通过对MD5算法的原理和应用进行理解,可以更好地了解MD5算法的特点和局限性。

一、原理:MD5算法的核心原理可以概括为以下几个步骤:1.填充数据:首先,需要对原数据进行填充以满足一定的要求。

填充的规则是:向原数据的尾部添加一个1和若干个0,直到满足总长度模512(即以512位为一个分组)的余数为4482.添加长度:在填充数据后,需要将原数据的长度以64位的二进制形式添加到填充后的数据尾部,这样可以保证每个分组长度为512位。

3.初始化变量:MD5算法使用四个32位的寄存器A、B、C、D作为变量,用于迭代运算。

4.循环计算:将填充和添加长度后的数据进行分组,并进行循环的运算。

MD5算法根据数据的每个分组进行64次迭代计算,并且每次迭代都会更新四个变量的值。

5.输出结果:经过循环计算后,最后输出的四个变量值即为加密后的128位哈希值。

二、应用:MD5算法在网络安全和密码保护中有着广泛的应用,主要体现在以下几个方面:1.数据完整性验证:MD5算法可以用于验证数据的完整性和防篡改性。

发送方可以通过对数据进行MD5加密后,将哈希值同数据一起发送给接收方。

接收方在接收到数据后,也对数据进行MD5加密,并将得到的哈希值与发送方发送的哈希值进行对比,如果一致,则说明数据在传输过程中没有受到篡改。

2.密码保护:MD5算法可以用于密码的存储与验证,通常将用户密码加密后存储在数据库中。

当用户登录时,系统会将用户输入的密码进行加密后与数据库中存储的密码进行比对,如果一致,则认为用户输入的密码正确。

3.数字证书验证:MD5算法可用于数字证书的验证和签名过程中。

md5校验原理

md5校验原理

md5校验原理
MD5(Message Digest Algorithm 5)是一种常见的哈希算法,用于对任意长度的数据生成固定长度的数字指纹,通常为128位(16字节)。

MD5校验的原理是通过对原始数据进行算法处理,得到一个固定长度的MD5值,然后将得到的MD5值与原始数据一同传输或存储。

在接收方或验证方可通过对接收到的数据再进行一次MD5处理,将得到的MD5值与原始的MD5值进行比较,从而判断原始数据的完整性与准确性。

具体的MD5校验过程如下:
1. 将原始数据分割成固定长度的数据块,并在数据块末尾进行填充,使其长度符合算法要求。

2. 初始化一个128位的中间状态,通常是一些固定的初始值。

3. 利用一系列的位操作、非线性函数和循环操作,对每个数据块进行处理,将数据块的信息混合进中间状态。

4. 当所有数据块处理完毕后,将最终的中间状态输出,并转化为一个128位的MD5值。

MD5校验的实质是利用MD5算法对原始数据进行摘要计算,并通过比较接收到的摘要值与之前生成的摘要值是否一致,来判断数据的完整性和准确性。

如果接收到的摘要值与之前生成的摘要值不一致,那么说明数据在传输过程中出现了错误或被篡改。

需要注意的是,MD5算法是一种单向的不可逆算法,即无法
通过摘要值来恢复原始数据。

因此,MD5校验一般用于验证
数据在传输或存储过程中是否发生变化,而不是用于加密数据。

此外,由于MD5算法的安全性存在漏洞,如碰撞攻击,因此
在安全性要求较高的场景中,建议使用其他更安全的哈希算法如SHA-256。

MD5原理及定义算法

MD5原理及定义算法

MD5原理及定义算法MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,用来将任意长度的数据块(message)通过一种算法,转换为固定长度的输出(digest)。

MD5算法是由美国密码学家罗纳德·李维斯特在1992年提出的。

MD5算法的核心原理是:将输入的数据通过一系列复杂的计算过程,转换为一个128位(16字节)长的输出,这个输出称为MD5值或者摘要。

对于相同的输入数据,无论多大或多小,输出的MD5值都是唯一的。

MD5算法的定义如下:1.初始化:选择4个32位的字作为初始变量(A、B、C、D),这些变量的初始值是固定的。

2.编码:将待处理的原始二进制数据分割成若干个512位的块(每个块由16个32位字组成),每个块的最后64位用于保存长度信息(单位为比特)。

3.填充:对于每个块,如果长度不是512位的整数倍,就添加填充位(一般为1和若干个0),直到长度达到512位的整数倍。

4.处理:对每个512位的块进行处理,每次处理都会更新变量值(A、B、C、D),通过一系列逻辑运算和非线性函数实现。

5.输出:将最终的变量值(A、B、C、D)依次连接起来,形成128位的输出,即MD5值或者摘要。

MD5算法的具体算法步骤如下:1.初始化变量A、B、C、D为固定值。

2.将输入数据分为若干512位的块。

3.对每个块进行处理,包括消息扩展、压缩函数和更新变量值。

-消息扩展:对512位块进行填充,并添加64位的长度信息。

-压缩函数:将消息块与当前变量值进行运算,包括四轮迭代运算。

-更新变量值:每一轮迭代运算之后,更新变量值。

4.返回最终的变量值(A、B、C、D)连接成的128位输出。

MD5算法具有以下特点:1.简单快速:MD5算法的计算过程相对简单,能够快速地处理。

2.不可逆:MD5值无法通过逆向算法恢复原始数据。

3.高度离散:输入数据发生微小变化,输出的MD5值也会发生巨大变化,具有很强的离散性。

哈希算法和md5算法

哈希算法和md5算法

哈希算法和md5算法一、引言在计算机科学领域中,哈希算法是一种常用的密码技术。

它通过将输入数据映射到一个固定大小的输出值,称为哈希值或摘要,来提供数据完整性和安全性。

其中,md5算法是一种广泛使用的哈希算法之一。

本文将对哈希算法和md5算法进行深入探讨。

二、哈希算法2.1 定义和原理哈希算法,又称散列算法,是一种将任意长度的输入数据映射为固定长度输出的算法。

它具有以下特点:•输入数据的任何微小变化都会导致输出的巨大变化,称为雪崩效应。

•不同的输入数据可能会产生相同的输出,称为哈希碰撞。

哈希算法的原理是将输入数据通过一个哈希函数进行计算,得到固定长度的哈希值。

常用的哈希算法有md5、sha1、sha256等。

2.2 应用领域哈希算法在计算机科学领域有广泛的应用,包括但不限于以下几个方面:1.数据完整性校验:通过对数据进行哈希计算,可以生成哈希值,用于校验数据在传输或存储过程中是否发生了变化。

2.数据加密:通过对数据进行哈希计算,并结合加密算法,可以实现数据的加密存储和传输,提高数据的安全性。

3.密码验证:将用户的密码通过哈希算法计算得到哈希值,并将哈希值存储在数据库中。

在用户登录时,将输入的密码进行哈希计算,并与数据库中的哈希值进行比对,从而验证密码的正确性,保护用户的隐私信息。

三、md5算法3.1 定义和特点md5算法是一种广泛使用的哈希算法,它将输入数据映射为128位的哈希值。

md5算法具有以下特点:•快速计算:md5算法具有较快的计算速度,适用于对大量数据进行哈希计算。

•不可逆性:md5算法是单向的,即无法从哈希值反推出原始数据。

•唯一性:不同的输入数据几乎不可能产生相同的md5哈希值。

3.2 安全性问题尽管md5算法在计算速度和广泛应用方面具有优势,但它在安全性方面存在一些问题:1.易受碰撞攻击:由于md5算法的哈希值较短,不同的输入数据可能产生相同的哈希值,从而导致碰撞攻击的风险。

2.易受彩虹表攻击:彩虹表是一种预先计算好的哈希值与其对应的原始数据的映射表。

MD5加密算法详解

MD5加密算法详解

MD5加密算法详解MD5(Message Digest Algorithm 5)是一种常见的哈希算法,用于将任意长度的信息转换为固定长度(通常为128位)的输出。

它是MD4算法的改进版本,由Ron Rivest在1991年设计。

MD5算法在密码学和数据完整性检查方面被广泛应用。

1.算法概述:MD5算法的输入是任意长度的消息,输出是一个128位(32个字符)的消息摘要。

这个摘要是唯一的,即使消息只有微小的变化,它的摘要也会有较大的差异。

MD5具有以下特点:-可逆性:MD5是单向散列函数,即不能从摘要中恢复原始消息。

这意味着无法通过知道MD5摘要的人来确定原始消息,所以MD5算法通常用于验证消息的完整性。

-高度可靠性:MD5算法能够快速计算,且其输出分布均匀,几乎每个消息都有不同的摘要。

-高速性:MD5算法的计算速度非常快,在软件和硬件上都可以轻松实现。

2.算法步骤:MD5算法的核心包括四个基本步骤:填充、初始化、循环操作和输出。

下面是详细的步骤说明:-填充:首先将消息进行填充,使其长度(以比特位为单位)满足对512求余等于448、填充的格式为一个1后面跟随若干个0,然后是64位的原始消息长度。

-初始化:使用4个固定的32位字作为初始变量(A、B、C、D),这些变量用于存储中间摘要和最终摘要。

-循环操作:MD5算法使用了64个循环运算来处理填充后的消息。

在每个循环中,输入消息的一部分被处理,并按照一系列算法步骤进行变换,然后将变换的结果添加到当前状态变量中。

-输出:循环运算结束后,将中间变量连接起来形成最终的128位摘要。

最终的结果可以表示为一个32位的十六进制数。

3.安全性:尽管MD5算法在之前被广泛应用于检验文件完整性和密码验证等领域,但现在已经不再被认为是安全的。

主要原因有:-容易受到碰撞攻击:由于MD5算法的输出空间相对较小(只有128位),因此存在相同摘要的不同输入。

这使得攻击者可以通过找到相同摘要的两个不同输入来冒充验证身份或篡改数据。

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公式

md5公式
MD5公式是一种常用的哈希算法,它将任意长度的消息作为输入,并通过一
系列的计算步骤,生成一个128位的哈希值。

MD5公式的全称是"Message Digest Algorithm 5",由罗纳德·李维斯特(Ronald Rivest)于1991年设计。

MD5公式的应用十分广泛,主要用于数据完整性校验和密码存储。

在数据完
整性校验中,利用MD5可以确保消息在传输过程中没有被篡改或损坏。

通过对原
始数据进行MD5计算,然后将计算结果与接收到的数据进行比较,如果两个结果
相同,则可以确认数据的完整性。

这种校验方式在文件下载、软件校验等场景下被广泛使用。

在密码存储方面,MD5常常用于将用户密码进行哈希处理后存储在数据库中。

这样即使数据库被黑客攻击,也无法直接获取用户的明文密码。

当用户登录时,输入的密码经过MD5计算后的哈希值与数据库中存储的值进行比较,若一致则认证
通过。

然而,由于MD5是单向哈希函数,存在哈希碰撞的风险,即不同的输入可
能会产生相同的哈希值。

因此,在密码存储中,为了增加安全性,通常会加入额外的措施,如加盐处理(salt)和多次迭代(iteration)。

尽管MD5公式在过去被广泛使用,但随着计算能力的提高和新的攻击技术的
出现,它的安全性逐渐降低。

目前已经发现了多个针对MD5的碰撞攻击和事前图
像攻击的方法。

因此,在安全性要求较高的场景下,推荐使用更强大的哈希算法,如SHA-2系列(如SHA-256、SHA-512)或SHA-3系列。

哈希加密解密算法

哈希加密解密算法

哈希加密解密算法
2. SHA(Secure Hash Algorithm)系列:SHA系列包括SHA-1、SHA-256、SHA-384 、SHA-512等不同长度的哈希算法。SHA-1是较早的版本,而SHA-256、SHA-384和SHA512是更安全的版本。
3. HMAC(Hash-based Message Authentication Code):HMAC是一种基于哈希函 数的消息认证码算法,结合了哈希函数和密钥,用于验证消息的完整性和真实性。
需要注意的是,哈希加密算法是单向的,即无法从哈希值还原出原始数据。因此,哈希加 密算法通常用于验证密码、数字签名、数据完整性检查等场景,而不适用于加密和解密敏感 信息。
哈希加密解密算法
如果需要加密和解密敏感信息,应使用对称加密算法(如AES、DES)或非对称加密算法 (如RSA、ECC),这些算法可以通过使用密钥来加密和解密数据。
哈希加密解密算法
哈希加密算法是一种单向加密算法,也称为哈希函数。它将输入数据转换为固定长度的哈 希值,使得无论输入数据的大小如何,哈希值的长度始终保持不变。哈希加密算法通常用于 验证数据的完整性和唯一性,而不是用于加密和解密敏感信息。
常见的哈希加密算法包括:
1. MD5(Message Di来自est Algorithm 5):MD5是一种广泛使用的哈希算法,可以将 任意长度的输入数据转换为128位的哈希值。然而,由于MD5存在安全性问题,如碰撞攻击 ,因此不推荐用于加密敏感信息。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二哈希算法MD51、目的使学生认识理解数据哈希算法:了解其基本原理,掌握MD5算法过程。

2、环境PC 1 台、软件VC60、3、方法和步骤(1)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现MD5和MAC算法,//以姓名小写全拼为消息,求消息的Md5指纹值如图1填充:图2:4轮线性调用图3:第i轮指纹参数变到第i+1轮指纹参数。

4、注意实验报告画出MD5的流程图;对MD5照指导书进行详细描述。

记录64次线性过程所变的局部32位指纹的值,及变量名;第一个参数被更新,循环右移一个参数后作为下次的4参数。

如:1:a: D6D117B42:d: 344A84323:c: 2F6FBD724:b: 7AD956F2…64b: C08226B3以计算器为工具,手工验证,第1次和16,32,48,64次执行的a,b,c,d的计算过程。

验证过程与比对过程写于报告之上。

思考题:如果以姓名消息,以8位学号为密钥求MD5的HMAC值,共要做几次哈希,每次哈希分别调用了次”round”?5、预备知识1.理解MD5过程Step 1: Padding M0 → M1|M1| ≡ 448 mod 512填充到512位的整数倍差64位。

或者64字节整数倍差8个字节。

–Padding内容: 100 0Step 2: Append 64-bit length 填充前长度(单位:bits)。

–若|M0| > 2^64,则仅取低64位。

即|M|%2^64–数据格式:低字节在前(little-endian)小端格式。

–|M2|为512的倍数: Y1,…,YL-1(L个分组)Step 3: 实始化指纹值(小端格式)(little-endian)←CV0←IV ,I=1。

,(ABCD)A = 01 23 45 67 (左边是内存状况,值形式:0x67452301)B = 89 AB CD EF (0xEFCDAB89)C = FE DC BA 98 (0x98BADCFE)D = 76 54 32 10 (0x10325476)=IV, CVi= HMD5(CVi-1,Pi)Step 4: MD5:压缩;CV4-1 (a=A,b=B,c=C,d=D)4-2:从消息左边选出第三1个512位的分组,将其分16个整数x[ 0-15]。

连同a,b,c,d 指纹整数,移位数组s,常数数组ac,进行16位FF非线性变换。

F(x, y, z)=(((x) & (y)) | ((~x) & (z)))FF(a, b, c, d, x, s, ac) {(a)+= F ((b), (c), (d)) + (x) + (UINT4)(ac);(a)= ROTATE_LEFT ((a), (s)); (a)+= (b);}//第1轮S盒#define S11 7#define S12 12#define S13 17#define S14 22轮数开始:FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* 第二轮循环 */G(x, y, z)=(((x) & (z)) | ((y) & (~z)))GG(a, b, c, d, x, s, ac){ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac);= ROTATE_LEFT ((a), (s));(a) += (b);}//第2轮S盒#define S21 5#define S22 9#define S23 14#define S24 20GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 *//* 第三轮循环 */H(x, y, z)=((x) ^ (y) ^ (z))HH(a, b, c, d, x, s, ac) {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b); }//第3轮S盒#define S31 4#define S32 11#define S33 16#define S34 23HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 *//* 第四轮循环 */I(x, y, z)=((y) ^ ((x) | (~z)))II(a, b, c, d, x, s, ac) {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s));(a) += (b); }//第4轮S盒#define S41 6#define S42 10#define S43 15#define S44 21II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */分组指纹累加;A+= a;B += b;C += c;D+= d;还有下个512位分组?有则重复,没则作为指纹输出。

相关文档
最新文档