3个著名加密算法(MD5、RSA、DES)的解析、、有兴趣的可以来瞅瞅!

上周强强老师提到MD5加密, 挺感兴趣就顺便查了下,不过没看明白, 把抽取出来的部分内容分享给大家、、、有兴趣的可以了解下!


MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。 

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的, 用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。 

RSA是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。 

DES算法 
美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES?DataEncryption Standard)。 

1.加密算法之MD5算法 

在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。 
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。 
四个32位变量初始化为: 
A=0x01234567 
B=0x89abcdef 
C=0xfedcba98 
D=0x76543210 
它们称为链接变量(chaining variable) 
接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。 
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。 
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行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^Z 
I(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步)是:
第一轮 
FF(a,b,c,d,M0,7,0xd76aa478) 
FF(d,a,b,c,M1,12,0xe8c7b756) 
FF(c,d,a,b,M2,17,0x242070db) 
FF(b,c,d,a,M3,22,0xc1bdceee) 
FF(a,b,c,d,M4,7,0xf57c0faf) 
FF(d,a,b,c,M5,12,0x4787c62a) 
FF(c,d,a,b,M6,17,0xa8304613) 
FF(b,c,d,a,M7,22,0xfd469501) 
FF(a,b,c,d,M8,7,0x698098d8) 
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) 
HH(a,b,c,d,M13,4,0x289b7ec6) 
HH(d,a,b,c,M0,11,0xeaa127fa) 
HH(c,d,a,b,M3,16,0xd4ef3085) 
HH(b,c,d,a,M6,23,0x04881d05) 
HH(a,b,c,d,M9,4,0xd9d4d039) 
HH(d,a,b,c,M12,11,0xe6db99e5) 
HH(c,d,a,b,M15,16,0x1fa27cf8) 
HH(b,c,d,a,M2,23,0xc4ac5665) 
第四轮 
II(a,b,c,d,M0,6,0xf4292244) 
II(d,a,b,c,M7,10,0x432aff97) 
II(c,d,a,b,M14,15,0xab9423a7) 
II(b,c,d,a,M5,21,0xfc93a039) 
II(a,b,c,d,M12,6,0x655b59c3) 
II(d,a,b,c,M3,10,0x8f0ccc92) 
II(c,d,a,b,M10,15,0xffeff47d) 
II(b,c,d,a,M1,21,0x85845dd1) 
II(a,b,c,d,M8,6,0x6fa87e4f) 
II(d,a,b,c,M15,10,0xfe2ce6e0) 
II(c,d,a,b,M6,15,0xa3014314) 
II(b,c,d,a,M13,21,0x4e0811a1) 
II(a,b,c,d,M4,6,0xf7537e82) 
II(d,a,b,c,M11,10,0xbd3af235) 
II(c,d,a,b,M2,15,0x2ad7d2bb) 
II(b,c,d,a,M9,21,0xeb86d391) 
常数ti可以如下选择: 
在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。 
(2的32次方) 
所有这些完成之后,将A,B,C,D分别加上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.近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应.各轮的位移量互不相同. 

2.加密算法之RSA算法 

它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。 

一、RSA算法 : 

首先, 找出三个数, p, q, r, 
其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数...... 
p, q, r 这三个数便是 private key 

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)..... 
这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了..... 
再来, 计算 n = pq....... 
m, n 这两个数便是 public key 

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n.... 
如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t), 
则每一位数均小於 n, 然後分段编码...... 
接下来, 计算 b == a^m mod n, (0 <= b < n), 
b 就是编码後的资料...... 

解码的过程是, 计算 c == b^r mod pq (0 <= c < pq), 
於是乎, 解码完毕...... 等会会证明 c 和 a 其实是相等的 

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b...... 
他如果要解码的话, 必须想办法得到 r...... 
所以, 他必须先对 n 作质因数分解......... 
要防止他分解, 最有效的方法是找两个非常的大质数 p, q, 
使第三者作因数分解时发生困难......... 

<定理> 
若 p, q 是相异质数, rm == 1 mod (p-1)(q-1), 
a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq, 
则 c == a mod pq 

证明的过程, 会用到费马小定理, 叙述如下: 
m 是任一质数, n 是任一整数, 则 n^m == n mod m 
(换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m) 
运用一些基本的群论的知识, 就可以很容易地证出费马小定理的........ 

<证明> 
因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数 
因为在 modulo 中是 preserve 乘法的 
(x == y mod z and u == v mod z => xu == yv mod z), 
所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq 

1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时, 
则 a^(p-1) == 1 mod p (费马小定理) => a^(k(p-1)(q-1)) == 1 mod p 
a^(q-1) == 1 mod q (费马小定理) => a^(k(p-1)(q-1)) == 1 mod q 
所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1 
即 a^(k(p-1)(q-1)) == 1 mod pq 
=> c == a^(k(p-1)(q-1)+1) == a mod pq 

2. 如果 a 是 p 的倍数, 但不是 q 的倍数时, 
则 a^(q-1) == 1 mod q (费马小定理) 
=> a^(k(p-1)(q-1)) == 1 mod q 
=> c == a^(k(p-1)(q-1)+1) == a mod q 
=> q | c - a 
因 p | a 
=> c == a^(k(p-1)(q-1)+1) == 0 mod p 
=> p | c - a 
所以, pq | c - a => c == a mod pq 

3. 如果 a 是 q 的倍数, 但不是 p 的倍数时, 证明同上 

4. 如果 a 同时是 p 和 q 的倍数时, 
则 pq | a 
=> c == a^(k(p-1)(q-1)+1) == 0 mod pq 
=> pq | c - a 
=> c == a mod pq 
Q.E.D. 

这个定理说明 a 经过编码为 b 再经过解码为 c 时, a == c mod n (n = pq).... 
但我们在做编码解码时, 限制 0 <= a < n, 0 <= c < n, 
所以这就是说 a 等於 c, 所以这个过程确实能做到编码解码的功能..
RSA 的安全性 

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。 
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。 
加密算法之DES算法 
美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的(通常称为DES密码算法要求)主要为以下四点: ☆提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改; 

☆具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握; 

☆DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础; 

☆实现经济,运行有效,并且适用于多种完全不同的应用。
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(23) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值