public sealed class cMyCrypt
{
public static byte[] MD5Encrypt(string s)
{
return (new MD5CryptoServiceProvider()).ComputeHash((new UTF8Encoding()).GetBytes(s));
}
#region 加密过程
/// <summary>
/// 加密过程
/// </summary>
public string MyEncoding(string ss)
{
SymmetricAlgorithm symm = new RijndaelManaged();
symm.GenerateKey();
symm.GenerateIV();
byte[] key=symm.Key;
byte[] iv=symm.IV;
byte[] bs=_getBytesFromUnicode(ss);
byte[] be2=_combinateBytes(bmd5,key,iv,be);
return System.Convert.ToBase64String(be2);
}
#endregion 加密过程
#region 解密过程
/// <summary>
/// 解密过程
/// </summary>
/// <param name="ss">加密串</param>
/// <returns>若解密并数据校验成功, 返回源串, 否则返回null</returns>
public string MyDecoding(string ss)
{
byte[] bs=System.Convert.FromBase64String(ss);
if( bs2==null )
return null;
else
return _getUnicodeFromBytes(bs);
}
#endregion 解密过程
#region 将一个Unicode字符串映射到内存中
/// <summary>
/// 将一个Unicode字符串映射到内存中
/// </summary>
/// <param name="ss">Unicode编码的源字符串</param>
/// <returns>映射后的内存数组</returns>
private byte[] _getBytesFromUnicode(string ss)
{
System.IO.MemoryStream ms=new MemoryStream(System.Text.Encoding.Unicode.GetBytes(ss));
BinaryReader br2=new BinaryReader(ms);
br2.Close();
ms.Close();
return buf;
}
#endregion 将一个Unicode字符串映射到内存中
#region Rijndael加密
/// <summary>
/// Rijndael加密
/// </summary>
/// <param name="key">密钥</param>
/// <param name="iv">初始化矢量数组</param>
/// <param name="bs">源数据</param>
/// <returns></returns>
private byte[] _doDESEncoding(byte[] key,byte[] iv,byte[] bs)
{
System.IO.MemoryStream sin=new MemoryStream(bs);
System.IO.MemoryStream sout=new MemoryStream();
SymmetricAlgorithm symm = new RijndaelManaged();
ICryptoTransform transform = symm.CreateEncryptor(key,iv);
CryptoStream cstream = new CryptoStream( sout, transform, CryptoStreamMode.Write );
BinaryReader br = new BinaryReader(sin);
cstream.Write( br.ReadBytes((int)sin.Length), 0, (int)sin.Length );
cstream.FlushFinalBlock();
cstream.Close();
sout.Close();
sin.Close();
return sout.ToArray();
}
#endregion Rijndael加密
#region Rijndael解密(次序与加密过程相反)
/// <summary>
/// Rijndael解密(次序与加密过程相反)
/// </summary>
/// <param name="bs">(组合)加密码</param>
/// <returns>解密后的数据(若有数据验证错误, 返回null)</returns>
private byte[] _doDESDecoding(byte[] bs)
{
System.IO.MemoryStream sin=new MemoryStream(bs);
BinaryReader br=new BinaryReader(sin);
int nOff=0;
byte[] bMd5=br.ReadBytes(16);
nOff+=16;
int nc=br.ReadInt32();
nOff+=4;
byte[] bKey=br.ReadBytes(nc);
nOff+=nc;
nc=br.ReadInt32();
nOff+=4;
byte[] bIV=br.ReadBytes(nc);
nOff+=nc;
byte[] bss=br.ReadBytes(bs.Length-nOff);
br.Close();
sin.Close();
sin=new MemoryStream(bss);
SymmetricAlgorithm symm = new RijndaelManaged();
ICryptoTransform transform = symm.CreateDecryptor(bKey,bIV);
CryptoStream cstream = new CryptoStream( sin, transform, CryptoStreamMode.Read );
br = new BinaryReader(cstream);
byte[] buf=br.ReadBytes((int)sin.Length);
br.Close();
sin.Close();
// 数据验证
byte[] bMd52=(new MD5CryptoServiceProvider()).ComputeHash(buf);
bool b=false;
for( int i=0,nlen=bMd5.Length; i<nlen; i++ )
{
if( bMd5[i]!=bMd52[i] )
{
b=true;
break;
}
}
if(b)
buf=null;
return buf;
}
#endregion Rijndael解密(次序与加密过程相反)
#region 将数据转换成字符串
/// <summary>
/// 将数据转换成字符串
/// </summary>
/// <param name="bs">原始数据</param>
/// <returns>转换成的字符串</returns>
private string _getUnicodeFromBytes(byte[] bs)
{
return new string(System.Text.Encoding.Unicode.GetChars(bs));
}
#endregion 将数据转换成字符串
#region 数据组合
/// <summary>
/// 数据组合
/// </summary>
/// <param name="md5"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <param name="be"></param>
/// <returns></returns>
private byte[] _combinateBytes(byte[] md5,byte[] key,byte[] iv,byte[] be)
{
MemoryStream ms=new MemoryStream();
BinaryWriter bw=new BinaryWriter(ms);
bw.Write(md5);
bw.Write(key.Length);
bw.Write(key);
bw.Write(iv.Length);
bw.Write(iv);
bw.Write(be);
bw.Close();
ms.Close();
return ms.ToArray();
}
#endregion 数据组合
}