您的位置:首页 > 编程语言 > C#

C#版的一个加密解密类

2008-12-24 20:28 417 查看
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 数据组合

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息