现在的位置: 首页 > 综合 > 正文

《企业考试系统》项目实践(03):通用工具类库之对称加密算法

2013年01月18日 ⁄ 综合 ⁄ 共 3353字 ⁄ 字号 评论关闭

摘要:实现通用的对称加密算法工具类。

 

在.Net Framework中与安全、加密相关的共有三大类:

  • Hash算法:将一个流使用Hash算法计算其相应的Hash值,我们最常见的MD5、SHA1均属于Hash算法。
  • 对称算法:顾名思义,可以双向对一个流(Byte数组)进行加密和解密操作,本文主要使用的就是此算法
  • 非对称算法:只能单向“加密”一个流(Byte数组),而不能反向解密

在.Net Framework中,涉及对称加密的算法的类有如下一些,其继承结构图为:

1

其中: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:  

抱歉!评论已关闭.