1 介绍
1.1 DES对称加密算法介绍
对称加密算法
通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成。通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥完成。即钥匙如果泄露,将暴露自己的全部信息。
DES(Data Encrytion Standard)算法
DES是IBM在上世纪70年代开发的单密钥对称加解密算法。该算法利用一个56+8奇偶效验位(第8,16,24,32,40,48,56,64位)的密钥对以64为单位的块数据进行加解密。它已经成为国际上商用保密通信和计算机通信的最常用加解密算法,现在虽然其安全性受到技术发展的威胁,但在非国防领域其应用性还非常健壮,研究它对于研究以后新的加密标准算法有重要的启示作用。
原理
该算法是一个利用56+8奇偶校验位(第8,16,24,32,40,48,56,64)=64位的密钥对以64位为单位的块数据进行加解密。
DES加密算法现已经被破解,建议在实际项目中不要使用DES算法,要使用也要用更复杂的3DES加密算法。
1.2 SHA1信息摘要算法介绍
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。
计算过程
对于任意长度的明文,SHA1首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。对于每个明文分组的摘要生成过程如下:
1、将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。
2、申请5个32位的链接变量,记为A、B、C、D、E。
3、16份子明文分组扩展为80份。
4、80份子明文分组进行4轮运算。
5、链接变量与初始链接变量进行求和运算。
6、链接变量作为下一个明文分组的输入重复进行以上操作。
7、 最后,5个链接变量里面的数据就是SHA1摘要。
想深挖原理的可以看引用处的SHA1原理链接,不想看的也没关系,直接拿来用,知道怎么用就行了。
1.3 MD5信息摘要算法介绍
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-1 SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
应用
MD5一般用于校验文件的完整性,如通过网络下载的文件,可能缺少部分或者被篡改,通过计算实际接收文件的MD5码,与原始MD5比较,判断文件是否正确。在密码存储方面,将用户输入的明文密码转成MD5码保存,后期应用只匹配比较MD5码,这样即使后台管理员也无法查看到真实密码。
1.4 SHA1和MD5算法比较
相同点:
MD5、SHA-1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性,对相同的数据加密后相同;MD5和SHA-1用于安全(Security)领域,比如文件校验、数字签名等。
不同点:
1、安全性不同,SHA-1 的安全性比MD5高;
2、校验值的长度不同,MD5校验位的长度是16个字节(128位);SHA-1是20个字节(160位);
3、运行速度不同,SHA-1 的运行速度比MD5慢。
2 代码实现
2.1 DES加密算法实现代码
#region DES加密解密 /* * 概况: * DES加密算法现已经被破解,要使用也是用3DES加密算法 */ //用于对称算法的初始化向量(公钥) private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; public static string KeyDES = "87654321"; /*DES加密字符串 encryptString:待加密的字符串 encryptKey:加密密钥,要求为8位(8个字符) */ public static string EncryptDES(string encryptString,string encryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0,8)); byte[] rgbIV = Keys; byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); //des服务者 DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); //内存流 MemoryStream mStream = new MemoryStream(); //加密流 CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey,rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray,0,inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray()); } catch { return encryptString; } } /*DES解密 decryptString: 待解密的字符串 decryptKey : 解密密钥,要求8位,要求和加密密钥相同 */ public static string DecryptDES(string decryptString,string decryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0,8)); byte[] rgbIV = Keys; byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream,DCSP.CreateDecryptor(rgbKey, rgbIV),CryptoStreamMode.Write); cStream.Write(inputByteArray,0,inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray()); } catch { return decryptString; } } #endregion
2.2 SHA1信息摘要算法实现代码
#region Sha1 //Sha1加密 public static string Sha1(this string value) { if (string.IsNullOrEmpty(value)) return null; SHA1 sha1 = new SHA1CryptoServiceProvider(); byte[] bytResult = sha1.ComputeHash(Encoding.Default.GetBytes(value)); string strResult = BitConverter.ToString(bytResult); strResult = strResult.Replace("-", ""); return strResult; } #endregion
2.3 MD5信息摘要算法实现代码
#region Md5 //Md5算法 public static string Md5(this string sDataIn) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bytValue, bytHash; bytValue = Encoding.UTF8.GetBytes(sDataIn); bytHash = md5.ComputeHash(bytValue); md5.Clear(); string sTemp = ""; for (int i = 0; i < bytHash.Length; ++i) { sTemp += bytHash[i].ToString("X").PadLeft(2, '0'); } return sTemp.ToUpper(); } /*Md5算法 * value:原始字符串 * Is16:是否16位密码 */ public static string Md5(this string value,bool Is16) { if (string.IsNullOrEmpty(value)) return null; if (Is16) { //截取前16位数(这样出现Hash值冲突的概率增高了) return value.Md5().Substring(0, 16); } else { return value.Md5(); } } #endregion
3 引用
DES堆成加密算法原理:DES对称加密算法详解 - 小白糖 - 博客园;
SHA1信息摘要算法原理:SHA1算法实现及详解_Y-peak的博客-CSDN博客_sha1算法;
MD5信息摘要算法原理:MD5算法_夏沫の浅雨的博客-CSDN博客_md5算法;
SHA1和MD5比较:md5和SHA-1算法的区别,哪种比较安全_哈客部落的博客-CSDN博客_md5和sha1区别;