D E S 算 法 原 理 完 整 版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MD5加密算法与SHA加密算法
2、MD5加密
2.1?概述
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
该算法的文件号为RFC
1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992).
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT
Laboratory for Computer Science和RSA Data Security Inc的Ronald
L. Rivest开发出来,经MD2、MD3和MD4发展而来。
MD5用于确保信息传输完整一致。
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
2.2?算法原理
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。
因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。
填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。
经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
这样做的原因是为满足后面处理中对信息长度的要求。
2.3 Java中的MD5实现
MD5加密算法的Java实现如下所示:
[java]?view
plain?copy
package?amigo.endecrypt;?
import?java.security.MessageDigest;?
*采用MD5加密?
*@authorXingxing,Xie
*@datetime2014-5-31
public?class?MD5Util?{?
*MD5加密?生成32位md5码?
*@param待加密字符串?
*@return返回32位md5码?
publicstaticStringmd5Encode(StringinStr)throwsExcepti on?{?
MessageDigestmd5=null;
md5=MessageDigest.getInstance("MD5");
}catch(Exceptione){
System.out.println(e.toString());
e.printStackTrace();
return"";
byte[]byteArray=inStr.getBytes("UTF-8");
byte[]md5Bytes=md5.digest(byteArray);
StringBufferhexValue=newStringBuffer();
for(inti=0;imd5Bytes.length;i++){
intval=((int)md5Bytes[i])0xff;
if(val16){
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
returnhexValue.toString();
*测试主函数?
*@paramargs
*@throwsException
publicstaticvoidmain(Stringargs[])throwsException{ Stringstr=newString("amigoxiexiexingxing");
System.out.println("原始:"?+?str);?
System.out.println("MD5后:"?+?md5Encode(str));?
测试结果:
原始:amigoxiexiexingxing
MD5后:e9ac094091b96b84cca48098bc21b1d6
3、SHA加密
3.1?概述
SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。
该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
安全散列算法SHA(Secure Hash
Algorithm,SHA)是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。
其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。
SHA-1,SHA-224和SHA-256适用于长度不超过2^64二进制位的消息。
SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。
3.2?原理
SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。
如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。
SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。
该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。
输入是按512?位的分组进行处理的。
SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
MAC?(信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。
3.3 Java中的SHA实现
[java]?view
plain?copy
package?amigo.endecrypt;?
import?java.security.MessageDigest;?
*采用SHAA加密?
*@authorXingxing,Xie
*@datetime2014-6-1
public?class?SHAUtil?{?
*SHA加密?生成40位SHA码?
*@param待加密字符串?
*@return返回40位SHA码?
publicstaticStringshaEncode(StringinStr)throwsExcepti on?{?
MessageDigestsha=null;
sha=MessageDigest.getInstance("SHA");
}catch(Exceptione){
System.out.println(e.toString());
e.printStackTrace();
return"";
byte[]byteArray=inStr.getBytes("UTF-8");
byte[]md5Bytes=sha.digest(byteArray);
StringBufferhexValue=newStringBuffer();
for(inti=0;imd5Bytes.length;i++){
intval=((int)md5Bytes[i])0xff;
if(val16){
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
returnhexValue.toString();
*测试主函数?
*@paramargs
*@throwsException
publicstaticvoidmain(Stringargs[])throwsException{ Stringstr=newString("amigoxiexiexingxing");
System.out.println("原始:"?+?str);?
System.out.println("SHA后:"?+?shaEncode(str));?
测试结果如下所示:
原始:amigoxiexiexingxing
SHA后:04f79f496dd6bdab3439511606528a4ad9caac5e
3、SHA-1和MD5的比较
因为二者均由MD4导出,SHA-1和MD5彼此很相似。
相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32?位。
使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的
操作。
这样,SHA-1对强行攻击有更大的强度。
2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13
openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能。
openssl支持Linux、UNIX、windows、Mac等平台。
SHAd-256(m)=SHA-256(SHA-256(m))。
它会克服有关延伸长度攻击的问题。
md5=MessageDigest.getInstance("MD5");
5、服务端使用私钥解密获得随机“对称密码”,然后使用随机“对称密码”解密客户端浏览器发送的握手消息并验证hash与浏览器发送过来的是否一样;
前面的章节已经介绍了对称解密算法和非对称加密算法,有很多人疑惑:那我们在实际使用的过程中究竟该使用哪一种比较好呢?
public static String getPrivateKeyStr(PrivateKey privateKey) 对称性加密算法:对称式加密就是加密和解密使用同一个密钥。
信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。
对称加密算法用来对敏感数据等信息进行加密。
撰写本文之前,我阅读了官方给出的说明文档,参照官方文档和代码(注释3),自己写了C语言的实现,并用VS2010运行通过。
我的C实现中,每一步运算的结果都打印了出来,方便我在硬件实现SERPENT时,抓
取中间步骤的标准数据进行验证。
(3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。