1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Security.Cryptography;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace DemoCrtpto
10 {
11 /// <summary>
12 /// 对称加密算法帮助类
13 /// </summary>
14 public class SymHelper
15 {
16 #region DES加密
17
18 /// <summary>
19 /// DES加密
20 /// </summary>
21 /// <param name="source"></param>
22 /// <param name="key"></param>
23 /// <param name="iv"></param>
24 /// <returns></returns>
25 public static string GetEnCryptoInfoByDES(string source, string key, string iv)
26 {
27 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);
28 return Encrypto(sym, source, key, iv);
29
30 }
31
32 /// <summary>
33 /// DES解密
34 /// </summary>
35 /// <param name="dest"></param>
36 /// <param name="key"></param>
37 /// <param name="iv"></param>
38 /// <returns></returns>
39 public static string GetDeCryptoInfoByDES(string dest, string key, string iv)
40 {
41 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);
42 return Decrypto(sym, dest, key, iv);
43
44 }
45
46 #endregion
47
48 #region RC2加密与解密
49
50 /// <summary>
51 /// RC2加密
52 /// </summary>
53 /// <param name="source"></param>
54 /// <param name="key"></param>
55 /// <param name="iv"></param>
56 /// <returns></returns>
57 public static string GetEnCryptoInfoByRC2(string source, string key, string iv)
58 {
59 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);
60 return Encrypto(sym, source, key, iv);
61
62 }
63
64 /// <summary>
65 /// RC2解密
66 /// </summary>
67 /// <param name="dest"></param>
68 /// <param name="key"></param>
69 /// <param name="iv"></param>
70 /// <returns></returns>
71 public static string GetDeCryptoInfoByRC2(string dest, string key, string iv)
72 {
73 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);
74 return Decrypto(sym, dest, key, iv);
75
76 }
77
78 #endregion
79
80 #region 3DES加密与解密
81
82 /// <summary>
83 /// 3DES加密
84 /// </summary>
85 /// <param name="source"></param>
86 /// <param name="key"></param>
87 /// <param name="iv"></param>
88 /// <returns></returns>
89 public static string GetEnCryptoInfoBy3DES(string source, string key, string iv)
90 {
91 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);
92 return Encrypto(sym, source, key, iv);
93
94 }
95
96 /// <summary>
97 /// 3DES解密
98 /// </summary>
99 /// <param name="dest"></param>
100 /// <param name="key"></param>
101 /// <param name="iv"></param>
102 /// <returns></returns>
103 public static string GetDeCryptoInfoBy3DES(string dest, string key, string iv)
104 {
105 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);
106 return Decrypto(sym, dest, key, iv);
107
108 }
109
110 #endregion
111
112 #region Rijndael加密与解密
113
114 /// <summary>
115 /// Rijndael加密
116 /// </summary>
117 /// <param name="source"></param>
118 /// <param name="key"></param>
119 /// <param name="iv"></param>
120 /// <returns></returns>
121 public static string GetEnCryptoInfoByRijndael(string source, string key, string iv)
122 {
123 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);
124 return Encrypto(sym, source, key, iv);
125
126 }
127
128
129 /// <summary>
130 /// Rijndael解密
131 /// </summary>
132 /// <param name="dest"></param>
133 /// <param name="key"></param>
134 /// <param name="iv"></param>
135 /// <returns></returns>
136 public static string GetDeCryptoInfoByRijndael(string dest, string key, string iv)
137 {
138 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);
139 return Decrypto(sym, dest, key, iv);
140 }
141
142 #endregion
143
144 public static SymmetricAlgorithm getSymmetricAlgorithm(SymType t)
145 {
146 SymmetricAlgorithm sym;
147 switch (t)
148 {
149 case SymType.DES:
150 sym = new DESCryptoServiceProvider();
151 break;
152 case SymType.RC2:
153 sym = new RC2CryptoServiceProvider();
154 break;
155 case SymType.TripleDES:
156 sym = new TripleDESCryptoServiceProvider();
157 break;
158 case SymType.Rijndael:
159 sym = new RijndaelManaged();
160 break;
161 default:
162 sym = new DESCryptoServiceProvider();
163 break;
164 }
165 return sym;
166 }
167
168 /// <summary>
169 /// 加密
170 /// </summary>
171 /// <param name="sym"></param>
172 /// <param name="source"></param>
173 /// <param name="key"></param>
174 /// <param name="iv"></param>
175 /// <returns></returns>
176 private static string Encrypto(SymmetricAlgorithm sym, string source, string key, string iv)
177 {
178 string dest = string.Empty;
179 try
180 {
181 byte[] btnSource = Encoding.Default.GetBytes(source);
182 //1.创建对称加密算法实例创建对称加密算法实例
183 sym.Mode = CipherMode.CBC;
184 int keyLen = sym.LegalKeySizes[0].MaxSize / 8;
185 int ivLen = sym.BlockSize / 8;
186 if (key.Length < keyLen)
187 {
188 key = key.PadRight(keyLen, '0');
189 }
190 if (iv.Length < ivLen)
191 {
192 iv = iv.PadRight(ivLen, '0');
193 }
194 //使用 PBKDF1 算法的扩展从密码派生密钥
195 PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,
196 ASCIIEncoding.ASCII.GetBytes("123456"));
197
198 //2.设置初始化参数,包括密钥和初始化向量等
199 sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);
200 sym.IV = Encoding.Default.GetBytes(iv);
201 //3.使用CreateEncryptor方法创建加密实例
202 ICryptoTransform trans = sym.CreateEncryptor();
203 //4.创建加密流
204 MemoryStream ms = new MemoryStream();
205 CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Write);
206 //5.利用加密流进行数据加密
207 cs.Write(btnSource, 0, btnSource.Length);
208 cs.FlushFinalBlock();
209 //6.返回密文
210 byte[] cryptoByte = ms.ToArray();
211 dest = Convert.ToBase64String(cryptoByte, 0, cryptoByte.GetLength(0));
212 }
213 catch (Exception ex)
214 {
215 throw ex;
216 }
217 return dest;
218 }
219
220 /// <summary>
221 /// 解密
222 /// </summary>
223 /// <param name="sym"></param>
224 /// <param name="dest"></param>
225 /// <param name="key"></param>
226 /// <param name="iv"></param>
227 /// <returns></returns>
228 private static string Decrypto(SymmetricAlgorithm sym, string dest, string key, string iv)
229 {
230 string source = string.Empty;
231 try
232 {
233 byte[] btnDest = Convert.FromBase64String(dest);
234 //1.创建对称加密算法实例创建对称加密算法实例
235 sym.Mode = CipherMode.CBC;
236 int keyLen = sym.LegalKeySizes[0].MaxSize / 8;
237 int ivLen = sym.BlockSize / 8;
238 if (key.Length < keyLen)
239 {
240 key = key.PadRight(keyLen, '0');
241 }
242 if (iv.Length < ivLen)
243 {
244 iv = iv.PadRight(ivLen, '0');
245 }
246 //使用 PBKDF1 算法的扩展从密码派生密钥
247 PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,
248 ASCIIEncoding.ASCII.GetBytes("123456"));
249 //2.设置初始化参数,包括密钥和初始化向量等
250 sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);
251 sym.IV = Encoding.Default.GetBytes(iv);
252 //3.使用CreateDecryptor方法创建解密实例
253 ICryptoTransform trans = sym.CreateDecryptor();
254 //4.创建解密流
255 MemoryStream ms = new MemoryStream(btnDest, 0, btnDest.Length);
256 CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Read);
257
258 //5.返回明文
259 StreamReader sr = new StreamReader(cs);
260 source = sr.ReadToEnd();
261 }
262 catch (Exception ex)
263 {
264 throw ex;
265 }
266 return source;
267 }
268 }
269
270 /// <summary>
271 /// 加密类型
272 /// </summary>
273 public enum SymType {
274 DES=0,
275 RC2=1,
276 TripleDES=2,
277 Rijndael=3
278 }
279 }