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     }

 

posted @ 2016-09-23 09:03  百年明日能几何  阅读(279)  评论(0编辑  收藏  举报