天天看點

轉摘一個可逆加密的類(使用3DES加密)

一、提要

命名空間:System.Security.Cryptography.TripleDES 類

簡單說明: 表示三重資料加密标準算法的基類,TripleDES 的所有實作都必須從此基類派生。是從 SymmetricAlgorithm 類裡繼承出來。TripleDES 使用 DES 算法的三次連續疊代。它可以使用兩個或三個 56 位密鑰。

       使用目的:比較安全的加密一種方式,密鑰和矢量的不同,會生産不同的加密字串。因為是DES算法的三次連續疊代,而且算法可逆,這樣對于資料保密性和可恢複性都不錯。

二、代碼示例

本代碼參照了部分MSDN上的代碼示例,再根據自己的實際情況,補充了一部分MSDN上沒有提到的内容

  1. using System; 
  2. using System.Security; 
  3. using System.Security.Cryptography; 
  4. using System.IO; 
  5. using System.Text; 
  6. using System.Threading; 
  7. namespace TRIP3DES 
  8.     /// <summary> 
  9.     /// Class1 的摘要說明。 
  10.     /// </summary> 
  11.     public class dllEncrypt 
  12.     { 
  13.       //密鑰 
  14.       private const string sKey = "qJzGEh6hESZDVJeCnFPGuxzaiB7NLQM3"; 
  15.       //矢量,矢量可以為空 
  16.       private const string sIV = "qcDY6X+aPLw="; 
  17.       //構造一個對稱算法 
  18.       private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider(); 
  19.         public dllEncrypt(){} 
  20.       #region public string EncryptString(string Value) 
  21.       /// <summary> 
  22.       /// 加密字元串 
  23.       /// </summary> 
  24.       /// <param name="Value">輸入的字元串</param> 
  25.       /// <returns>加密後的字元串</returns> 
  26.       public string EncryptString(string Value) 
  27.       { 
  28.          ICryptoTransform ct; 
  29.          MemoryStream ms; 
  30.          CryptoStream cs; 
  31.          byte[] byt; 
  32.          mCSP.Key = Convert.FromBase64String(sKey); 
  33.          mCSP.IV = Convert.FromBase64String(sIV); 
  34.          //指定加密的運算模式 
  35.          mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; 
  36.         //擷取或設定加密算法的填充模式 
  37.          mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7; 
  38.          ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV); 
  39.          byt = Encoding.UTF8.GetBytes(Value); 
  40.          ms = new MemoryStream(); 
  41.          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); 
  42.          cs.Write(byt, 0, byt.Length); 
  43.          cs.FlushFinalBlock(); 
  44.          cs.Close(); 
  45.          return Convert.ToBase64String(ms.ToArray()); 
  46.       } 
  47.       #endregion 
  48.       #region public string DecryptString(string Value) 
  49.       /// <summary> 
  50.       /// 解密字元串 
  51.       /// </summary> 
  52.       /// <param name="Value">加過密的字元串</param> 
  53.       /// <returns>解密後的字元串</returns> 
  54.       public string DecryptString(string Value) 
  55.       { 
  56.          ICryptoTransform ct; 
  57.          MemoryStream ms; 
  58.          CryptoStream cs; 
  59.          byte[] byt; 
  60.          mCSP.Key = Convert.FromBase64String(sKey); 
  61.          mCSP.IV = Convert.FromBase64String(sIV); 
  62.          mCSP.Mode = System.Security.Cryptography.CipherMode.ECB; 
  63.          mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7; 
  64.          ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV); 
  65.          byt = Convert.FromBase64String(Value); 
  66.          ms = new MemoryStream(); 
  67.          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); 
  68.          cs.Write(byt, 0, byt.Length); 
  69.          cs.FlushFinalBlock(); 
  70.          cs.Close(); 
  71.          return Encoding.UTF8.GetString(ms.ToArray()); 
  72.       } 
  73.       #endregion 
  74.     } 
using System;
using System.Security;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Threading;
namespace TRIP3DES
{
/// <summary>
/// Class1 的摘要說明。
/// </summary>
public class dllEncrypt
{
//密鑰
private const string sKey = "qJzGEh6hESZDVJeCnFPGuxzaiB7NLQM3";
//矢量,矢量可以為空
private const string sIV = "qcDY6X+aPLw=";
//構造一個對稱算法
private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
public dllEncrypt(){}
#region public string EncryptString(string Value)
/// <summary>
/// 加密字元串
/// </summary>
/// <param name="Value">輸入的字元串</param>
/// <returns>加密後的字元串</returns>
public string EncryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
mCSP.Key = Convert.FromBase64String(sKey);
mCSP.IV = Convert.FromBase64String(sIV);
//指定加密的運算模式
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
//擷取或設定加密算法的填充模式
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
byt = Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
#endregion
#region public string DecryptString(string Value)
/// <summary>
/// 解密字元串
/// </summary>
/// <param name="Value">加過密的字元串</param>
/// <returns>解密後的字元串</returns>
public string DecryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
mCSP.Key = Convert.FromBase64String(sKey);
mCSP.IV = Convert.FromBase64String(sIV);
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
#endregion
}
}
      

三、總結

做成類庫對于密鑰和矢量的保管比較友善,輸入輸出全部是string型變量,這樣也比較友善,密鑰的生成可以用mSCP. GenerateKey()來生成,矢量的生成也可以用mCSP.GenerateIV()來生成。大家也可以自己靈活的編寫符合自己的3DES算法。