最近由於項目的原因,接觸到DES加密解密,結合網上的例子整合了一個單例模式的加密解密幫助類,希望對大家有幫助,歡迎多交流。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Cryptography;
namespace Controller
{
class DESHelper
{
string iv = "1234的yzo"; //可以改成讀取配置文件
string key = "123在yzo";
private static DESHelper instance = null;
private DESHelper() { }
public static DESHelper getInstance()
{
if (instance == null)
{
instance = new DESHelper();
}
return instance;
}
/// <summary>
/// DES加密偏移量,必須是>=8位長的字符串
/// </summary>
public string IV
{
get { return iv; }
set { iv = value; }
}
/// <summary>
/// DES加密的私鑰,必須是8位長的字符串
/// </summary>
public string Key
{
get { return key; }
set { key = value; }
}
/// <summary>
/// 對字符串進行DES加密
/// </summary>
/// <param name="sourceString">待加密的字符串</param>
/// <returns>加密後的BASE64編碼的字符串</returns>
public string Encrypt(string sourceString)
{
try
{
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.Default.GetBytes(sourceString);
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
}
catch (Exception ex)
{
Logger.error("加密異常!" + ex.ToString());
}
return sourceString;
}
/// <summary>
/// 對DES加密後的字符串進行解密
/// </summary>
/// <param name="encryptedString">待解密的字符串</param>
/// <returns>解密後的字符串</returns>
public string Decrypt(string encryptedString)
{
try
{
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Convert.FromBase64String(encryptedString);
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Encoding.Default.GetString(ms.ToArray());
}
}
catch (Exception ex)
{
Logger.error("解密異常!" + ex.ToString());
}
return encryptedString;
}
/// <summary>
/// 對文件內容進行DES加密
/// </summary>
/// <param name="sourceFile">待加密的文件絕對路徑</param>
/// <param name="destFile">加密後的文件保存的絕對路徑</param>
public void EncryptFile(string sourceFile, string destFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路徑不存在!", sourceFile);
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] btFile = File.ReadAllBytes(sourceFile);
using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
{
try
{
using (CryptoStream cs = new CryptoStream(fs, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(btFile, 0, btFile.Length);
cs.FlushFinalBlock();
}
}
catch
{
throw;
}
finally
{
fs.Close();
}
}
}
/// <summary>
/// 對文件內容進行DES加密,加密後覆蓋掉原來的文件
/// </summary>
/// <param name="sourceFile">待加密的文件的絕對路徑</param>
public void EncryptFile(string sourceFile)
{
EncryptFile(sourceFile, sourceFile);
}
/// <summary>
/// 對文件內容進行DES解密
/// </summary>
/// <param name="sourceFile">待解密的文件絕對路徑</param>
/// <param name="destFile">解密後的文件保存的絕對路徑</param>
public void DecryptFile(string sourceFile, string destFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路徑不存在!", sourceFile);
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] btFile = File.ReadAllBytes(sourceFile);
using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
{
try
{
using (CryptoStream cs = new CryptoStream(fs, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(btFile, 0, btFile.Length);
cs.FlushFinalBlock();
}
}
catch
{
throw;
}
finally
{
fs.Close();
}
}
}
/// <summary>
/// 對文件內容進行DES解密,加密後覆蓋掉原來的文件
/// </summary>
/// <param name="sourceFile">待解密的文件的絕對路徑</param>
public void DecryptFile(string sourceFile)
{
DecryptFile(sourceFile, sourceFile);
}
}
}
使用例子:
string es = DESHelper.getInstance().Encrypt("在");
Console.WriteLine(es);
Console.Write(DESHelper.getInstance().Decrypt(es));
DESHelper.getInstance().EncryptFile(@"d:\a.txt", @"d:\b.txt");
DESHelper.getInstance().DecryptFile(@"d:\b.txt");
C# DES 加密/解密類庫,支持文件和中文/UNICODE字符,返回BASE64編碼字符串