using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ETD.Data
{
///
/// 数据加密类
///
public sealed class Security
{
private static byte[] Keys = new byte[] { 0x41, 0x72, 0x65, 0x79, 0x6f, 0x75, 0x6d, 0x79, 0x53, 110, 0x6f, 0x77, 0x6d, 0x61, 110, 0x3f };
///
/// 初始化向量变量
///
private string m_IV = string.Empty;
///
/// 密钥变量
///
private string m_Key = string.Empty;
///
/// 3DES加密对象的实例
///
private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
///
/// 构造器
///
public Security()
{
this.GetKey();
this.GetIV();
}
///
///
///
///
///
///
public static string Decode(string decryptString, string decryptKey)
{
try
{
decryptKey = Text.CutString(decryptKey, 0x20, "");
decryptKey = decryptKey.PadRight(0x20, ' ');
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV = Keys;
ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
byte[] inputData = Convert.FromBase64String(decryptString);
byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
return Encoding.UTF8.GetString(decryptedData);
}
catch
{
return "";
}
}
///
///
///
///
///
///
public static string Encode(string encryptString, string encryptKey)
{
encryptKey = Text.CutString(encryptKey, 0x20, "");
encryptKey = encryptKey.PadRight(0x20, ' ');
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 0x20));
rijndaelProvider.IV = Keys;
ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
byte[] inputData = Encoding.UTF8.GetBytes(encryptString);
return Convert.ToBase64String(rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length));
}
///
/// 3DES+异或加密数据
///
/// 需要解码密的数据
/// 密钥
/// 加密后的数据
public string Encrypt(string EncryString, string Key)
{
string str = this.Encrypt3DESString(EncryString);
return this.EncryptKey(str, Key, true);
}
///
/// 3DES加密数据
///
/// 需要加密的数据
/// 加密后的数据
public string Encrypt3DESString(string EncryptString)
{
StringBuilder p_strEncStr = new StringBuilder();
p_strEncStr.Append(EncryptString);
ICryptoTransform ct = this.mCSP.CreateEncryptor(this.mCSP.Key, this.mCSP.IV);
byte[] byt = Encoding.UTF8.GetBytes(p_strEncStr.ToString());
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return this.GetOut3DESLicense(Convert.ToBase64String(ms.ToArray()));
}
///
/// 异或字符串加密方法
///
/// 需要加密的字符串
/// 加密密钥,为空时使用默认密钥
/// true:使用随机加密因子;false:不使用随机加密因子
/// 返回加密后的字符串
public string EncryptKey(string str, string key, bool bl)
{
int offset;
int keyLen = key.Length;
if (keyLen == 0)
{
key = "zllscs";
}
int keyPos = 0;
int SrcPos = 0;
int SrcAsc = 0;
Random rd = new Random();
if (bl)
{
offset = rd.Next(0, 0x100);
}
else
{
offset = 14;
}
string dest = string.Format("{0:X2}", offset);
char[] chr = str.ToCharArray();
char[] keychr = key.ToCharArray();
byte[] strBt = Encoding.ASCII.GetBytes(chr);
byte[] keyBt = Encoding.ASCII.GetBytes(keychr);
for (SrcPos = 0; SrcPos < str.Length; SrcPos++)
{
SrcAsc = (strBt[SrcPos] + offset) % 0xff;
if (keyPos < keyLen)
{
SrcAsc ^= keyBt[keyPos];
keyPos++;
}
else
{
keyPos = 0;
SrcAsc ^= keyBt[keyPos];
}
dest = dest + string.Format("{0:X2}", SrcAsc);
offset = SrcAsc;
}
return dest;
}
///
/// 输出3DES加密的数据,并将3DES的初始化向量和关键字赋给对应属性
///
/// 加密的数据
/// 组合好的数据
private string Get3DESLicenseKey(string EnyData)
{
string p_strKey = EnyData.Substring(20, 0x20);
this.mCSP.Key = Convert.FromBase64String(p_strKey);
EnyData = EnyData.Remove(20, 0x20);
string p_strIV = EnyData.Substring(10, 12);
this.mCSP.IV = Convert.FromBase64String(p_strIV);
EnyData = EnyData.Remove(10, 12);
return EnyData;
}
///
/// 获得3DES加密的初始化向量
///
private void GetIV()
{
this.mCSP.GenerateIV();
this.IV = Convert.ToBase64String(this.mCSP.IV);
}
///
/// 获得3DES加密的密钥
///
private void GetKey()
{
this.mCSP.GenerateKey();
this.Key = Convert.ToBase64String(this.mCSP.Key);
}
///
/// 3DES组合输出的到文件中的数据
///
/// 加密的数据
/// 组合好的数据
private string GetOut3DESLicense(string EnyData)
{
EnyData = EnyData.Insert(10, this.IV);
EnyData = EnyData.Insert(20, this.Key);
return EnyData;
}
///
/// Md5加密
///
/// 加密的字符串
/// 编码方式
///
public static string MD5Encode(string Code, string CodeType)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] InBytes = Encoding.GetEncoding(CodeType).GetBytes(Code);
byte[] OutBytes = md5.ComputeHash(InBytes);
string OutString = "";
for (int i = 0; i < OutBytes.Length; i++)
{
OutString = OutString + OutBytes[i].ToString("x2");
}
return OutString;
}
///
/// 3DES+异或解密数据
///
/// 需要解密的数据
/// 密钥
/// 加密后的数据
public string Uncrypt(string EncryString, string Key)
{
string str = this.UncryptKey(EncryString, Key, true);
return this.Uncrypt3DESString(str);
}
///
/// 3DES数据解密
///
/// 需要解密的字符串
/// 解密后的原始数据
public string Uncrypt3DESString(string EncryString)
{
EncryString = this.Get3DESLicenseKey(EncryString);
ICryptoTransform ct = this.mCSP.CreateDecryptor(this.mCSP.Key, this.mCSP.IV);
byte[] byt = Convert.FromBase64String(EncryString);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
///
/// 异或字符串加密方法
///
/// 需要加密的字符串
/// 加密密钥,为空时使用默认密钥
/// true:使用随机加密因子;false:不使用随机加密因子
/// 返回加密后的字符串
public string UncryptKey(string str, string key, bool bl)
{
string row;
try
{
int offset;
string dest = "";
int keyLen = key.Length;
if (keyLen == 0)
{
key = "zllscs";
}
int keyPos = 0;
int SrcPos = 0;
int SrcAsc = 0;
int TmpSrcAsc = 0;
char[] keychr = key.ToCharArray();
byte[] keyBt = Encoding.ASCII.GetBytes(keychr);
if (bl)
{
offset = Convert.ToInt32("0x" + str.Substring(0, 2), 0x10);
}
else
{
offset = 14;
}
for (SrcPos = 2; SrcPos < str.Length; SrcPos += 2)
{
SrcAsc = Convert.ToInt32("0x" + str.Substring(SrcPos, 2), 0x10);
if (keyPos < keyLen)
{
TmpSrcAsc = SrcAsc ^ keyBt[keyPos];
keyPos++;
}
else
{
keyPos = 0;
TmpSrcAsc = SrcAsc ^ keyBt[keyPos];
}
if (TmpSrcAsc <= offset)
{
TmpSrcAsc = (0xff + TmpSrcAsc) - offset;
}
else
{
TmpSrcAsc -= offset;
}
dest = dest + Convert.ToChar(TmpSrcAsc);
offset = SrcAsc;
}
row = dest;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
return row;
}
///
/// 初始化向量字符串形式
///
private string IV
{
get
{
return this.m_IV;
}
set
{
this.m_IV = value;
}
}
///
/// 密钥字符串形式
///
private string Key
{
get
{
return this.m_Key;
}
set
{
this.m_Key = value;
}
}
}
}