历史:

MD5 叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被修改的话,那么这个文件的MD5码就会发生变化,通过对文件MD5的验证,可以得知获得的文件是否完整

md5 的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述(h++p://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由ronald l. rivest在1992年8月向ieft提交。

rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和 chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是唯一的--既没有重复。

为了加强算法的安全性,rivest在1990年又开发出md4算法。md4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位黑吧表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。den boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,md4就此被淘汰掉了。

尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。

一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了"安全-带子"(safety-belts)的概念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息-摘要的大小和填充的必要条件与md4完全相同。den boer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

van oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。

简介:

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。

(应用1)MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的(应用2)数字签名应用。

MD5还广泛用于加密和解密技术上,在很多操作系统中,(应用3)用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。

一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。

即使假设密码的最大长度为8,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是 P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘组,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。

MD5用途:
    1、防止被篡改:
    1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

2、防止直接看到明文:
    现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码(其实这样是不安全的,后面我会提到)。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)

3、防止抵赖(数字签名):
    这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

MD5算法过程:
    对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

第一步、填充:如果输入信息的长度(以bit为单位)对512 (也即64Bytes) 求余的结果不等于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,C=0X98BADCFEL,D=0X10325476L)。有点晕哈,其实想一想就明白了。

第四步、四轮循环运算:循环的次数是分组的个数(N+1)

1)将每一 512bit 细分成16个小组,每个小组32位;
     2)先认识四个线性函数(&是与, |是或, ~是非, ^是异或);

  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))

3)设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)

常数ti可以如下选择: 
在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)

4)四轮运算

第一轮
a=FF(a,b,c,d,M0,7,0xd76aa478)
b=FF(d,a,b,c,M1,12,0xe8c7b756)
c=FF(c,d,a,b,M2,17,0x242070db)
d=FF(b,c,d,a,M3,22,0xc1bdceee)
a=FF(a,b,c,d,M4,7,0xf57c0faf)
b=FF(d,a,b,c,M5,12,0x4787c62a)
c=FF(c,d,a,b,M6,17,0xa8304613)
d=FF(b,c,d,a,M7,22,0xfd469501)
a=FF(a,b,c,d,M8,7,0x698098d8)
b=FF(d,a,b,c,M9,12,0x8b44f7af)
c=FF(c,d,a,b,M10,17,0xffff5bb1)
d=FF(b,c,d,a,M11,22,0x895cd7be)
a=FF(a,b,c,d,M12,7,0x6b901122)
b=FF(d,a,b,c,M13,12,0xfd987193)
c=FF(c,d,a,b,M14,17,0xa679438e)
d=FF(b,c,d,a,M15,22,0x49b40821)第二轮
a=GG(a,b,c,d,M1,5,0xf61e2562)
b=GG(d,a,b,c,M6,9,0xc040b340)
c=GG(c,d,a,b,M11,14,0x265e5a51)
d=GG(b,c,d,a,M0,20,0xe9b6c7aa)
a=GG(a,b,c,d,M5,5,0xd62f105d)
b=GG(d,a,b,c,M10,9,0x02441453)
c=GG(c,d,a,b,M15,14,0xd8a1e681)
d=GG(b,c,d,a,M4,20,0xe7d3fbc8)
a=GG(a,b,c,d,M9,5,0x21e1cde6)
b=GG(d,a,b,c,M14,9,0xc33707d6)
c=GG(c,d,a,b,M3,14,0xf4d50d87)
d=GG(b,c,d,a,M8,20,0x455a14ed)
a=GG(a,b,c,d,M13,5,0xa9e3e905)
b=GG(d,a,b,c,M2,9,0xfcefa3f8)
c=GG(c,d,a,b,M7,14,0x676f02d9)
d=GG(b,c,d,a,M12,20,0x8d2a4c8a)第三轮
a=HH(a,b,c,d,M5,4,0xfffa3942)
b=HH(d,a,b,c,M8,11,0x8771f681)
c=HH(c,d,a,b,M11,16,0x6d9d6122)
d=HH(b,c,d,a,M14,23,0xfde5380c)
a=HH(a,b,c,d,M1,4,0xa4beea44)
b=HH(d,a,b,c,M4,11,0x4bdecfa9)
c=HH(c,d,a,b,M7,16,0xf6bb4b60)
d=HH(b,c,d,a,M10,23,0xbebfbc70)
a=HH(a,b,c,d,M13,4,0x289b7ec6)
b=HH(d,a,b,c,M0,11,0xeaa127fa)
c=HH(c,d,a,b,M3,16,0xd4ef3085)
d=HH(b,c,d,a,M6,23,0x04881d05)
a=HH(a,b,c,d,M9,4,0xd9d4d039)
b=HH(d,a,b,c,M12,11,0xe6db99e5)
c=HH(c,d,a,b,M15,16,0x1fa27cf8)
d=HH(b,c,d,a,M2,23,0xc4ac5665)第四轮
a=II(a,b,c,d,M0,6,0xf4292244)
b=II(d,a,b,c,M7,10,0x432aff97)
c=II(c,d,a,b,M14,15,0xab9423a7)
d=II(b,c,d,a,M5,21,0xfc93a039)
a=II(a,b,c,d,M12,6,0x655b59c3)
b=II(d,a,b,c,M3,10,0x8f0ccc92)
c=II(c,d,a,b,M10,15,0xffeff47d)
d=II(b,c,d,a,M1,21,0x85845dd1)
a=II(a,b,c,d,M8,6,0x6fa87e4f)
b=II(d,a,b,c,M15,10,0xfe2ce6e0)
c=II(c,d,a,b,M6,15,0xa3014314)
d=II(b,c,d,a,M13,21,0x4e0811a1)
a=II(a,b,c,d,M4,6,0xf7537e82)
b=II(d,a,b,c,M11,10,0xbd3af235)
c=II(c,d,a,b,M2,15,0x2ad7d2bb)
d=II(b,c,d,a,M9,21,0xeb86d391)

5)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环。

MD5的安全性 :

MD5相对MD4所作的改进: 
1.增加了第四轮. 
2.每一步均有唯一的加法常数. 
3.为减弱第二轮中函数G的对称性从(X&Y)|(X&Z)|(Y&Z)变为(X&Z)|(Y&(~Z)) 
4.第一步加上了上一步的结果,这将引起更快的雪崩效应. 
5.改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似. 
6.近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应.各轮的位移量互不相同.

测试:
当你按照我上面所说的方法实现md5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

md5 ("") = d41d8cd98f00b204e9800998ecf8427e 
md5 ("a") = 0cc175b9c0f1b6a831c399e269772661 
md5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 
md5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 
md5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b 
md5 ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789") = 
d174ab98d277d9f5a5611c2c9f419d9f 
md5 ("123456789012345678901234567890123456789012345678901234567890123456789 
01234567890") = 57edf4a22be3c955ac49da2e2107b67a

附一份网上的C代码实现:

https://github.com/yangxt225/MD5

---------------------------------------------------------------------------------------------------------------------------------

下面附一个网上整理的一份算法流程:

http://blog.163.com/cissyxxy0629@126/blog/static/28702276201022691836522/

MD5算法简介

MD5算法是单向散列算法的一种。单向散列算法也称为HASH算法,是一种将任意长度的信息压缩至某一固定长度(称之为消息摘要)的函数(该压缩过程不可逆)。Hash函数可用于数字签名、信息完整性检查等用途。常见的散列算法还有SHA、RIPE-MD、HAVAL、N-Hash等。

MD5 算法流程详解

MD5 算法将输入的信息进行分组,每组512 位(64个 字节),顺序处理完所有分组后输出128 位结果。将这128 位用十六进制表示便是常见的32 字符的MD5 码,而所谓的16 字符的MD5 码,其实是这32 字符中间的16 个字符。
      在每一组消息的处理中,都要进行4 轮、每轮16 步、总计64 步的处理。其中每步计算中含一次左循环移位,每一步结束时将计算结果进行一次右循环移位。详见下方流程(未优化)。

算法流程:
一. 初始化
▲(a) 设置二维数组 g_nTable[4][16],他有64 个常量,对应每组处理的4×16=64 步。由于是常量,也可
以在计算时直接嵌入数据。具体结果如下:
unsigned int g_nTable[4][16] = {
{ 0xD76AA478,0xE8C7B756,0x242070DB,0xC1BDCEEE,
0xF57C0FAF,0x4787C62A,0xA8304613,0xFD469501,
0x698098D8,0x8B44F7AF,0xFFFF5BB1,0x895CD7BE,
0x6B901122,0xFD987193,0xA679438E,0x49B40821 },

{ 0xF61E2562,0xC040B340,0x265E5A51,0xE9B6C7AA,
0xD62F105D,0x02441453,0xD8A1E681,0xE7D3FBC8,
0x21E1CDE6,0xC33707D6,0xF4D50D87,0x455A14ED,
0xA9E3E905,0xFCEFA3F8,0x676F02D9,0x8D2A4C8A },

{ 0xFFFA3942,0x8771F681,0x6D9D6122,0xFDE5380C,
0xA4BEEA44,0x4BDECFA9,0xF6BB4B60,0xBEBFBC70,
0x289B7EC6,0xEAA127FA,0xD4EF3085,0x04881D05,
0xD9D4D039,0xE6DB99E5,0x1FA27CF8,0xC4AC5665 },

{ 0xF4292244,0x432AFF97,0xAB9423A7,0xFC93A039,
0x655B59C3,0x8F0CCC92,0xFFEFF47D,0x85845DD1,
0x6FA87E4F,0xFE2CE6E0,0xA3014314,0x4E0811A1,
0xF7537E82,0xBD3AF235,0x2AD7D2BB,0xEB86D391 }};(这个表的存在是在IDA中确认MD5算法的关键。)

▲(b) 初始化每步左循环移位的位数g_nMove[4][16],对应每轮处理的4×16=64 步处理。由于是常量,也可以在计算时直接嵌入数据。(此数据有规律,实际代码中可以对此进行优化)
int g_nMove[4][16] = {
{ 7,12,17,22, 7,12,17,22, 7,12,17,22, 7,12,17,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, 6,10,15,21, 6,10,15,21 }};

▲(c) 初始化g_nResult[4]。g_nResult 用于存放当前分组的计算结果,但同时又参与下一组信息的处理过程。直至最后一组计算结束,g_nResult 即为所需的MD5 码。g_nResult 数组成员应为32 位长,这样总计32×4=128 位。
unsigned int g_nResult[4] = { 0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476 };

二. 信息的读取、填充
▲(a) 将需加密的信件信息(如一份文件)分次读取到缓冲区中,一次最好读取64*n 个字节,这样就是n 组,方便处理。
▲(b) 判断信息是否已全部读完,没有则对刚才读取的信息分组进行计算,如果已经读完了就要在信息尾部进行适当的填充。
▲(c) 对信息进行填充,使其字节数除以64 时余数为56。比如在处理一个文件时,
(1) 最后一次读取为70 字节,70%64=6 小于56,则需在尾部填充56-6=50 个字节,得(70+50)%64=56。注:若消息为64n 倍数字节,则最后一次读取0 字节,据本规则将填充56 字节。
(2) 最后一次读取为124 字节,124%64=60 大于56 了,则先将这一组填满(此处为4 字节)再在下一组空间上填56 个字节,得(124+4+56)%64=56。
(3) 最后一次读取为120 字节,120%64=56 等于56,此时仍需填充,填充字节总数为64,即一组,得(120+64)%64=56。
知道了填充长度,那用什么数据来填充呢?填充的第一个字节为128,其余字节全为0,128的 二进制数为1000 0000,0 的二进制应为0000 0000。
经过上面的填充后最后一组只有56 字节,还有剩余的8 字节呀(64字节一组)?这8 个字节用于存放消息填充前的总长度,而且单位不是字节,是位。vc下可以用unsigned __int64 类型变量保存消息总长度,(操作文件时直接取得文件长度后乘8 保存到变量中,填充时用内存拷贝函数拷贝过去即可。)
▲(d) 进入 分组处理,计算MD5码。

 三. 分组处理
这是MD5算法最核心的环节,在这里对每一组消息进行4 轮、每轮16 步、总计64 步的处理。在进行讲解之前,需要先介绍4 个逻辑函数F,G,H,I,分别对应4 轮运算,它们将参与运算。

第一轮逻辑函数:F(b,c,d)=(b&c)|((~b)&d) 参与第一轮的16 步运算  (b,c,d均为32位数)
第二轮逻辑函数:G(b,c,d)=(b&d)|(c&(~d)) 参与第二轮的16 步运算
第三轮逻辑函数:H(b,c,d)= b^c^d 参与第三轮的16 步运算
第四轮逻辑函数:I(b,c,d)= c^(b|(~d)) 参与第四轮的16 步运算
再引入一个移位函数MOVE(X,n),它将整型变量X 左循环移n 位,如变量X 为32 位,则MOVE(X,n)= (X
<< n) | (X >> (32 - n))。
(& 为按位与,| 为按位或,~ 为按位取非,^ 为按位异或。b、c、d 均为unsigned int。)

MD5算法处理流程:
▲(a) 将数组g_nResult 内容复制到数组g_nTemp(类型大小与g_nResult 同)。
▲(b) 将新的一组内容从缓冲区读到unsigned int unBuff[16]中。(unsigned int unBuff[16]为512字节长)
▲(c) 第一轮计算:j 从0 循环到15,轮数ln=0,i=j%16=j。将下面1)- 4)执行16 遍。
(1) unsigned int Temp = g_nTemp[0] + F(g_nTemp[1], g_nTemp[2], g_nTemp[3]) + unBuff[i] + g_nTable[ln][i]。
(2) Temp = MOVE(Temp, g_nMove[ln][j])。 
(3) g_nTemp[0] = g_nTemp[1] + Temp。
(4) 将 g_nTemp 数组右循环移位4 字节,即

{Temp = g_nTemp[3]; g_nTemp[3]= g_nTemp[2]; g_nTemp[2]= g_nTemp[1]; g_nTemp[1]= g_nTemp[0]; g_nTemp[0]= Temp;} (本博客附件C代码没有这一步右移)
▲(d) 第二轮计算:j 从0 循环到15, 轮数ln=1,i=(1+5*j)%16,使用循环函数G,其他同第一轮。
▲(e) 第三轮计算:j 从0 循环到15, 轮数ln=2,i=(5+3*j)%16,使用循环函数H,其他同第一轮。
▲(f) 第四轮计算: j 从0 循环到15, 轮数ln=3,i=(7*j)%16,使用循环函数I,其他同第一轮。

▲(g) 累加结果:g_nResult[0] += g_nTemp [0]; g_nResult[1] += g_nTemp [1];
   g_nResult[2] += g_nTemp [2]; g_nResult[3] += g_nTemp [3];
▲(h) 如果缓冲区中还有分组未处理完,则转回到a)。

四. 输出结果
判断消息(或文件)是否已经处理完了,如果没有则转到二.消息读取与填充,如果已经处理完了,则g_nResult 就是结果,从低地址开始用16 进制逐个输出字节便得MD5 码。

MD5单向散列算法详解相关推荐

  1. sha1散列算法详解示例

    //python3 res = '123456'print(hashlib.sha1(res.encode('utf-8')).hexdigest()) //输出: 7c4a8d09ca3762af6 ...

  2. MD5(单向散列算法)原理分析

    注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. ...

  3. 物联网安全-单向散列算法

    单向散列函数简介 概论 ​  单项散列函数又称为安全散列函数或者哈希函数,可以将一段可变长度是输入数据转化为固定长度的一段输出值. 输入数据通常称为消息,输出数据通常称为消息摘要或者摘要,可用于检查消 ...

  4. 【计算机网络】网络安全 : 报文鉴别 ( 密码散列函数 | 报文摘要算法 MD5 | 安全散列算法 SHA-1 | MAC 报文鉴别码 )

    文章目录 一.报文鉴别 二.鉴别分类 三.报文鉴别 四.密码散列函数 五.MD5 算法 六.SHA-1 安全散列算法 七.MAC 报文鉴别码 一.报文鉴别 计算机网络安全措施 : ① 针对被动攻击 ( ...

  5. 密码学(一)—— 背景、常用的密码算法简介,单向散列简介、数字签名简介

    背景 密码,最初的目的就是用于对信息的加密,计算机领域的密码技术种类繁多,但随着密码学的运用,密码还用于身份认证,防止否认等功能上.最基本的,是信息加密解密分为对称加密和非对称加密,这两者的区别在于是 ...

  6. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...

    2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...

  7. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  8. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  9. 散列算法(也叫:摘要算法)

    散列算法(也叫:摘要算法): 特点: ① 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的. ② 消息摘要看起来是"随机的".这些比特看上去是胡乱的杂凑在一起的. ③ 一般 ...

最新文章

  1. Vertica的这些事lt;十二gt;—— vertica存储统计信息
  2. ext3grep practice record
  3. numpy比较运算符和其对应的通用函数
  4. 配置Java_Home,临时环境变量信息
  5. 动态内存的分配用法和构造动态一维数组
  6. matlab 异步程序代码,正弦波电压源供电时三相异步电动机系统动态运行MATLAB仿真源程序...
  7. soupUI生成webservice客户端代码
  8. List与数组的相互转换
  9. load dll failed java_【软件安装故障排除】安装完PyCharm,启动时弹出Failed to load JVM DLL\bin\server\jvm.dll解决方案...
  10. 实战MongoDB-Replication之Master-Slave
  11. SaaS应用架构师所面临的最大挑战
  12. Linux shell脚本中判断变量文件目录:权限、是否存在、空值、相等
  13. 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
  14. 4399ATAPI讲解操作事件篇
  15. Excel学习 -- 数据透视表功能
  16. win10安装Visual Studio2019时卡在了提取文件处
  17. 戴口罩直播1天卖3亿的雷军,像极了曾经的李嘉诚
  18. wafw00f--一款基于python识别网站WAF的工具
  19. how2heap 深入学习(2)
  20. Chrome 灵魂插件!

热门文章

  1. Stata:多元 Logit 模型详解 (mlogit)
  2. 硬核干货合集!500+篇Java干货技术文章整理|资源|书单|工具|面试指南|强烈建议打开!
  3. django通用视图(CBV)
  4. Bonferroni校正
  5. Winform(C#) 国内开源美化控件主题库2:花木兰控件库
  6. c++析构函数的调用
  7. 析构函数什么时候会调用?
  8. 一篇文章理解Promise原理
  9. 大数据概述:传统数据与大数据的区别
  10. 关于iperf工具的了解