摘要:实现通用的对称加密算法工具类。
在.Net Framework中与安全、加密相关的共有三大类:
- Hash算法:将一个流使用Hash算法计算其相应的Hash值,我们最常见的MD5、SHA1均属于Hash算法。
- 对称算法:顾名思义,可以双向对一个流(Byte数组)进行加密和解密操作,本文主要使用的就是此算法
- 非对称算法:只能单向“加密”一个流(Byte数组),而不能反向解密
在.Net Framework中,涉及对称加密的算法的类有如下一些,其继承结构图为:
其中:SymmetricAlgorithm类为对称算法的根类,其子类为几种对称加密算法,再子类是具体的实现类。
使用对称加密算法实现对称加密时,代码基本类似,我将其封装一下,定义两个类型:
- SymmetricCryptographyTypeEnum枚举:表示系统支持的对称加密类型
- SymmetricCryptographyUtility类:提供对于Byte数组及字符串进行加密及解密的方法
SymmetricCryptographyTypeEnum枚举的定义如下:
1: namespace DHC_Certification_System.CommonLibrary.SymmetricCryptography
2: {
3: /// <summary>
4: /// 使用的对称加密类型
5: /// </summary>
6: public enum SymmetricCryptographyTypeEnum
7: {
8: DESCryptoServiceProvider,
9: AesCryptoServiceProvider,
10: RC2CryptoServiceProvider,
11: RijndaelManaged,
12: TripleDESCryptoServiceProvider
13: }
14: }
SymmetricCryptographyUtility类定义如下:
1: using System;
2: using System.IO;
3: using System.Security.Cryptography;
4: using System.Text;
5:
6: namespace DHC_Certification_System.CommonLibrary.SymmetricCryptography
7: {
8: /// <summary>
9: /// 对称加密工具类
10: /// </summary>
11: public sealed class SymmetricCryptographyUtility
12: {
13: /// <summary>
14: /// 对称加密类的驱动类型
15: /// </summary>
16: private readonly SymmetricAlgorithm _Provider;
17:
18: /// <summary>
19: /// 构造方法,使用自定义的的IV和KEY
20: /// </summary>
21: /// <param name="cryptType">使用的加密算法</param>
22: /// <param name="iv">IV值</param>
23: /// <param name="key">KEY值</param>
24: public SymmetricCryptographyUtility(
25: SymmetricCryptographyTypeEnum cryptType,
26: byte[] iv, byte[] key)
27: {
28: switch (cryptType)
29: {
30: case SymmetricCryptographyTypeEnum.DESCryptoServiceProvider:
31: _Provider = new DESCryptoServiceProvider();
32: break;
33: case SymmetricCryptographyTypeEnum.AesCryptoServiceProvider:
34: _Provider = new AesCryptoServiceProvider();
35: break;
36: case SymmetricCryptographyTypeEnum.RC2CryptoServiceProvider:
37: _Provider = new RC2CryptoServiceProvider();
38: break;
39: case SymmetricCryptographyTypeEnum.RijndaelManaged:
40: _Provider = new RijndaelManaged();
41: break;
42: case SymmetricCryptographyTypeEnum.TripleDESCryptoServiceProvider:
43: _Provider = new TripleDESCryptoServiceProvider();
44: break;
45: }
46:
47: _Provider.IV = iv;
48: _Provider.Key = key;
49: }
50:
51: public SymmetricAlgorithm Provider
52: {
53: get
54: {
55: return _Provider;
56: }
57: }
58:
59: /// <summary>
60: /// 加密字符串
61: /// </summary>
62: /// <param name="input"></param>
63: /// <returns></returns>
64: public string EncryptBase64String(string input)
65: {
66: string result = null;
67:
68: if (string.IsNullOrEmpty(input) == false)
69: {
70: byte[] inputArray = Encoding.Unicode.GetBytes(input);
71: byte[] cryptArray = EncryptByteArray(inputArray);
72:
73: result = Convert.ToBase64String(cryptArray);
74: }
75:
76: return result;
77: }
78:
79: /// <summary>
80: /// 解密字符串
81: /// </summary>
82: /// <param name="input"></param>
83: /// <returns></returns>
84: public string DecryptBase64String(string input)
85: {
86: string result = null;
87:
88: if (string.IsNullOrEmpty(input) == false)
89: {
90: byte[] inputArray = Convert.FromBase64String(input);
91: byte[] cryptArray = DecryptByteArray(inputArray);
92:
93: result = Encoding.Unicode.GetString(cryptArray);
94: }
95:
96: return result;
97: }
98:
99: /// <summary>
100: /// 加密Byte数组
101: /// </summary>
102: /// <param name="input"></param>
103: /// <returns></returns>
104: public byte[] EncryptByteArray(byte[] input)
105: {
106: MemoryStream ms = new MemoryStream();
107:
108: CryptoStream cs = new CryptoStream(
109: ms, _Provider.CreateEncryptor(), CryptoStreamMode.Write);
110:
111: cs.Write(input, 0, input.Length);
112: cs.FlushFinalBlock();
113:
114: byte[] result = ms.ToArray();
115: