DES算法加密解密
1 /// <summary> 2 /// DES算法加密解密 3 /// </summary> 4 public class DESProvider 5 { 6 private DESProvider() 7 { 8 } 9 //默认的初始化密钥 10 private static string key = "netskycn"; 11 12 /// <summary> 13 /// 对称加密解密的密钥 14 /// </summary> 15 public static string Key 16 { 17 get 18 { 19 return key; 20 } 21 set 22 { 23 key = value; 24 } 25 } 26 #region 加密 27 /// <summary> 28 /// 采用DES算法对字符串加密 29 /// </summary> 30 /// <param name="encryptString">要加密的字符串</param> 31 /// <param name="key">加密的密钥</param> 32 /// <returns></returns> 33 public static string EncryptString(string encryptString, string key) 34 { 35 //加密加密字符串是否为空 36 if (string.IsNullOrEmpty(encryptString)) 37 { 38 throw new ArgumentNullException("encryptString", "不能为空"); 39 } 40 //加查密钥是否为空 41 if (string.IsNullOrEmpty(key)) 42 { 43 throw new ArgumentNullException("key", "不能为空"); 44 } 45 //将密钥转换成字节数组 46 byte[] keyBytes = Encoding.UTF8.GetBytes(key); 47 //设置初始化向量 48 byte[] keyIV = keyBytes; 49 //将加密字符串转换成UTF8编码的字节数组 50 byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); 51 //调用EncryptBytes方法加密 52 byte[] resultByteArray = EncryptBytes(inputByteArray, keyBytes, keyIV); 53 //将字节数组转换成字符串并返回 54 return Convert.ToBase64String(resultByteArray); 55 } 56 57 /// <summary> 58 /// DES加密 59 /// </summary> 60 /// <param name="encryptString">要加密的字符串</param> 61 /// <returns></returns> 62 public static string EncryptString(string encryptString) 63 { 64 return EncryptString(encryptString, key); 65 } 66 /// <summary> 67 /// 采用DES算法对字节数组加密 68 /// </summary> 69 /// <param name="sourceBytes">要加密的字节数组</param> 70 /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param> 71 /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param> 72 /// <returns></returns> 73 public static byte[] EncryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV) 74 { 75 if (sourceBytes == null || keyBytes == null || keyIV == null) 76 { 77 throw new ArgumentNullException("sourceBytes和keyBytes", "不能为空。"); 78 } 79 else 80 { 81 //检查密钥数组长度是否是8的倍数并且长度是否小于64 82 keyBytes = CheckByteArrayLength(keyBytes); 83 //检查初始化向量数组长度是否是8的倍数并且长度是否小于64 84 keyIV = CheckByteArrayLength(keyIV); 85 DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 86 //实例化内存流MemoryStream 87 MemoryStream mStream = new MemoryStream(); 88 //实例化CryptoStream 89 CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write); 90 cStream.Write(sourceBytes, 0, sourceBytes.Length); 91 cStream.FlushFinalBlock(); 92 //将内存流转换成字节数组 93 byte[] buffer = mStream.ToArray(); 94 mStream.Close();//关闭流 95 cStream.Close();//关闭流 96 return buffer; 97 } 98 } 99 #endregion 100 #region 解密 101 public static string DecryptString(string decryptString, string key) 102 { 103 if (string.IsNullOrEmpty(decryptString)) 104 { 105 throw new ArgumentNullException("decryptString", "不能为空"); 106 } 107 if (string.IsNullOrEmpty(key)) 108 { 109 throw new ArgumentNullException("key", "不能为空"); 110 } 111 byte[] keyBytes = Encoding.UTF8.GetBytes(key); 112 byte[] keyIV = keyBytes; 113 //将解密字符串转换成Base64编码字节数组 114 byte[] inputByteArray = Convert.FromBase64String(decryptString); 115 //调用DecryptBytes方法解密 116 byte[] resultByteArray = DecryptBytes(inputByteArray, keyBytes, keyIV); 117 //将字节数组转换成UTF8编码的字符串 118 return Encoding.UTF8.GetString(resultByteArray); 119 } 120 121 /// <summary> 122 /// DES解密 123 /// </summary> 124 /// <param name="decryptString">要解密的字符串</param> 125 /// <returns></returns> 126 public static string DecryptString(string decryptString) 127 { 128 return DecryptString(decryptString, key); 129 } 130 131 /// <summary> 132 /// 采用DES算法对字节数组解密 133 /// </summary> 134 /// <param name="sourceBytes">要加密的字节数组</param> 135 /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param> 136 /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param> 137 /// <returns></returns> 138 public static byte[] DecryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV) 139 { 140 if (sourceBytes == null || keyBytes == null || keyIV == null) 141 { 142 throw new ArgumentNullException("soureBytes和keyBytes及keyIV", "不能为空。"); 143 } 144 else 145 { 146 //检查密钥数组长度是否是8的倍数并且长度是否小于64 147 keyBytes = CheckByteArrayLength(keyBytes); 148 //检查初始化向量数组长度是否是8的倍数并且长度是否小于64 149 keyIV = CheckByteArrayLength(keyIV); 150 DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 151 MemoryStream mStream = new MemoryStream(); 152 CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write); 153 cStream.Write(sourceBytes, 0, sourceBytes.Length); 154 cStream.FlushFinalBlock(); 155 //将内存流转换成字节数组 156 byte[] buffer = mStream.ToArray(); 157 mStream.Close();//关闭流 158 cStream.Close();//关闭流 159 return buffer; 160 } 161 } 162 #endregion 163 /// <summary> 164 /// 检查密钥或初始化向量的长度,如果不是8的倍数或长度大于64则截取前8个元素 165 /// </summary> 166 /// <param name="byteArray">要检查的数组</param> 167 /// <returns></returns> 168 private static byte[] CheckByteArrayLength(byte[] byteArray) 169 { 170 byte[] resultBytes = new byte[8]; 171 //如果数组长度小于8 172 if (byteArray.Length < 8) 173 { 174 return Encoding.UTF8.GetBytes("12345678"); 175 } 176 //如果数组长度不是8的倍数 177 else if (byteArray.Length % 8 != 0 || byteArray.Length > 64) 178 { 179 Array.Copy(byteArray, 0, resultBytes, 0, 8); 180 return resultBytes; 181 } 182 else 183 { 184 return byteArray; 185 } 186 } 187 }