/* * DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。 * 这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。 * 使用子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算; * 接着交换这两半,这一过程会继续下去,但最后一个循环不交换。 * DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。 */ using System; using System.Text; using System.Security.Cryptography;//这个是处理文字编码的前提 using System.IO; namespace GTech.Solution.Api.Common { public static class DESEncrytion { #region 1、加密向量自定义 /// /// DES加密方法 /// /// 明文 /// 密钥 /// 向量 /// 密文 public static string DESEncrypt(string strPlain, string strDESKey, string strDESIV) { //把密钥转换成字节数组 byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey); //把向量转换成字节数组 byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV); //声明1个新的DES对象 DESCryptoServiceProvider desEncrypt = new DESCryptoServiceProvider(); //开辟一块内存流 MemoryStream msEncrypt = new MemoryStream(); //把内存流对象包装成加密流对象 CryptoStream csEncrypt = new CryptoStream(msEncrypt, desEncrypt.CreateEncryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Write); //把加密流对象包装成写入流对象 StreamWriter swEncrypt = new StreamWriter(csEncrypt); //写入流对象写入明文 swEncrypt.WriteLine(strPlain); //写入流关闭 swEncrypt.Close(); //加密流关闭 csEncrypt.Close(); //把内存流转换成字节数组,内存流现在已经是密文了 byte[] bytesCipher = msEncrypt.ToArray(); //内存流关闭 msEncrypt.Close(); //把密文字节数组转换为字符串,并返回 return UnicodeEncoding.Unicode.GetString(bytesCipher); } /// /// DES解密方法 /// /// 密文 /// 密钥 /// 向量 /// 明文 public static string DESDecrypt(string strCipher, string strDESKey, string strDESIV) { //把密钥转换成字节数组 byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey); //把向量转换成字节数组 byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV); //把密文转换成字节数组 byte[] bytesCipher = UnicodeEncoding.Unicode.GetBytes(strCipher); //声明1个新的DES对象 DESCryptoServiceProvider desDecrypt = new DESCryptoServiceProvider(); //开辟一块内存流,并存放密文字节数组 MemoryStream msDecrypt = new MemoryStream(bytesCipher); //把内存流对象包装成解密流对象 CryptoStream csDecrypt = new CryptoStream(msDecrypt, desDecrypt.CreateDecryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Read); //把解密流对象包装成读出流对象 StreamReader srDecrypt = new StreamReader(csDecrypt); //明文=读出流的读出内容 string strPlainText = srDecrypt.ReadLine(); //读出流关闭 srDecrypt.Close(); //解密流关闭 csDecrypt.Close(); //内存流关闭 msDecrypt.Close(); //返回明文 return strPlainText; } #endregion #region 2、加密向量默认值 //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// /// DES加密字符串 /// /// 待加密的字符串 /// 加密密钥,要求为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); 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解密字符串 /// /// 待解密的字符串 /// 解密密钥,要求为8位,和加密密钥相同 /// 解密成功返回解密后的字符串,失败返源串 public static string DecryptDES(string decryptString, string decryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey); 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 } }