一、什么是DES
数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及被怀疑内含美国国家安全局(NSA)的后门而在开始时是有争议的,因此DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以得到应用。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。在某些文献中,作为算法的DES被称为DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来(详情:DES说明)。
PS:对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。
二、C#中的DES加密
.NET Framework 类库提供了System.Security 命名空间,System.Security 命名空间提供公共语言运行时安全系统的基础结构,包括权限的基类,而该命名空间下提供了DESCryptoServiceProvider类来执行DES算法的对称加密和解密。
代码如下:
/// <summary> /// 随机生成KEY /// </summary> /// <returns></returns> public string GenerateKey() { int _len = 8; Random random = new Random(DateTime.Now.Millisecond); byte[] keybyte = new byte[_len]; for (int i = 0; i < _len; i++) { keybyte[i] = (byte)random.Next(65, 122); } return ASCIIEncoding.ASCII.GetString(keybyte); } /// <summary> /// DES 加密过程 /// </summary> /// <param name="dataToEncrypt">待加密数据</param> /// <param name="DESKey"></param> /// <returns></returns> public string Encrypt(string dataToEncrypt, string DESKey) { using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { byte[] inputByteArray = Encoding.Default.GetBytes(dataToEncrypt);//把字符串放到byte数组中 des.Key = ASCIIEncoding.ASCII.GetBytes(DESKey); //建立加密对象的密钥和偏移量 des.IV = ASCIIEncoding.ASCII.GetBytes(DESKey); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:x2}", b); } return ret.ToString(); } } } } /// <summary> /// DES 解密过程 /// </summary> /// <param name="dataToDecrypt">待解密数据</param> /// <param name="DESKey"></param> /// <returns></returns> public string Decrypt(string dataToDecrypt, string DESKey) { using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { byte[] inputByteArray = new byte[dataToDecrypt.Length / 2]; for (int x = 0; x < dataToDecrypt.Length / 2; x++) { int i = (Convert.ToInt32(dataToDecrypt.Substring(x * 2, 2), 16)); inputByteArray[x] = (byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(DESKey); //建立加密对象的密钥和偏移量,此值重要,不能修改 des.IV = ASCIIEncoding.ASCII.GetBytes(DESKey); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return System.Text.Encoding.Default.GetString(ms.ToArray()); } } } }
Demo下载:DESCrypto.rar
参考资料: