抽象出接口,可以得到字节数组和字符串两种方式的对称加解密:
VS2005(http://blog.csdn.net/seamonkey/archive/2007/03/21/1536059.aspx)作了小的调整才能编译通过.
using System;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
namespace NMS.BR.Common
{
public interface IEncrypt
{
byte[] Encrypt(ref byte[] arryByte);
byte[] DeEncrypt(ref byte[] arryByte);
string Encrypt(ref string strPassword);
string DeEncrypt(ref string strPassword);
}
/// <summary>
/// Encrypt 加密类
/// </summary>
public class RijndaelEncrypt : IEncrypt
{
/// <summary>
/// 密钥
/// </summary>
private byte[] _key = {0x01, 0x02, 0x03, 0x04, 0x05, 0xf6, 0x07, 0x08, 0x09, 0x10, 0x11, 0x02, 0x13, 0x14, 0x15, 0x16};
/// <summary>
/// 随机向量
/// </summary>
private byte[] _IV = {0x01, 0x02, 0x03, 0xd4, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x04, 0x15, 0x16};
/// <summary>
/// Rijndael对称加密算法加密对象
/// </summary>
ICryptoTransform _encryptor;
/// <summary>
/// Rijndael解密对象
/// </summary>
ICryptoTransform _deEncryptor;
/// <summary>
/// 字符串编码器
/// </summary>
Coder _enCoder = null;
public RijndaelEncrypt()
{
//初始化字符串编码器
_enCoder = new Coder(Coder.EncodingMothord.Default);
RijndaelManaged enryManage = new RijndaelManaged();
enryManage.Key = this._key;
enryManage.IV = this._IV;
_encryptor = enryManage.CreateEncryptor();
_deEncryptor = enryManage.CreateDecryptor();
}
public RijndaelEncrypt(ref Coder enCoder)
{
//初始化字符串编码器
_enCoder = enCoder;
RijndaelManaged enryManage = new RijndaelManaged();
enryManage.Key = this._key;
enryManage.IV = this._IV;
_encryptor = enryManage.CreateEncryptor();
_deEncryptor = enryManage.CreateDecryptor();
}
#region IEncrypt 成员
public byte[] Encrypt(ref byte[] arryByte)
{
byte[] encrypted;
//加密数据
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, this._encryptor, CryptoStreamMode.Write);
//写入所有字节
csEncrypt.Write(arryByte, 0, arryByte.Length);
csEncrypt.FlushFinalBlock();
//取得加密后的字节数组
encrypted = msEncrypt.ToArray();
//返回
return encrypted;
}
public byte[] DeEncrypt(ref byte[] arryByte)
{
byte[] fromEncrypt;
byte[] resultByte;
//解密数据
MemoryStream msEncrypt = new MemoryStream(arryByte);
CryptoStream csDencrypt = new CryptoStream(msEncrypt, this._deEncryptor, CryptoStreamMode.Read);
fromEncrypt = new byte[arryByte.Length];
//读取字节数据
int nLength = csDencrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
resultByte = new byte[nLength];
for(int i = 0; i < nLength; i++)
{
resultByte[i] = fromEncrypt[i];
}
return resultByte;
}
public string Encrypt(ref string strPassword)
{
//System.Text.UnicodeEncoding unicodeEnc = new UnicodeEncoding();
string strEncrypted;
byte[] encrypted;
//unicodeEnc.GetBytes(strPassword);
byte[] preEncrypt = _enCoder.GetEncodingBytes(strPassword);
//加密
encrypted = this.Encrypt(ref preEncrypt);
//unicodeEnc.GetString(encrypted, 0, encrypted.Length);
strEncrypted = _enCoder.GetEncodingString(encrypted, encrypted.Length);
return strEncrypted;
}
public string DeEncrypt(ref string strPassword)
{
//System.Text.UnicodeEncoding unicodeEnc = new UnicodeEncoding();
string strDeEncrypted;
byte[] deEncrypted;
//unicodeEnc.GetBytes(strPassword);
byte[] preDeEncrypt = _enCoder.GetEncodingBytes(strPassword);
deEncrypted = this.DeEncrypt(ref preDeEncrypt);
//unicodeEnc.GetString(deEncrypted, 0, deEncrypted.Length);
strDeEncrypted = _enCoder.GetEncodingString(deEncrypted, deEncrypted.Length);
return strDeEncrypted;
}
#endregion
}
}