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

.net加密技术的应用(加密类代码参考)

2008-01-16 10:14 615 查看
导读:
  *如果你觉得本人的文章好,要引用请尊重著作人的劳动果实,说明
  *出处以及原创作者,Thank you!!! email:aishen944-sohu.com
  *******************************************************************/
  using System;
  using System.Text;
  using System.Security;
  using System.Security.Cryptography;
  using System.IO;
  namespace EncryptClasses
  {
  ///
  /// 此处定义的是DES加密,为了便于今后的管理和维护
  /// 请不要随便改动密码,或者改变了密码后请一定要
  /// 牢记先前的密码,否则将会照成不可预料的损失
  ///
  public class DESEncrypt
  {
  #region "member fields"
  private string iv="12345678";
  private string key="12345678";
  private Encoding encoding=new UnicodeEncoding();
  private DES des;
  #endregion
  ///
  /// 构造函数
  ///
  public DESEncrypt()
  {
  des=new DESCryptoServiceProvider();
  }
  #region "propertys"
  ///
  /// 设置加密密钥
  ///
  public string EncryptKey
  {
  get{return this.key;}
  set
  {
  this.key=value;
  }
  }
  ///
  /// 要加密字符的编码模式
  ///
  public Encoding EncodingMode
  {
  get{return this.encoding;}
  set{this.encoding=value;}
  }
  #endregion
  #region "methods"
  ///
  /// 加密字符串并返回加密后的结果
  ///
  ///
  ///
  public string EncryptString(string str)
  {
  byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
  byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);//得到加密密钥
  byte[] toEncrypt=this.EncodingMode.GetBytes(str);//得到要加密的内容
  byte[] encrypted;
  ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
  MemoryStream msEncrypt=new MemoryStream();
  CryptoStream csEncrypt=new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write);
  csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
  csEncrypt.FlushFinalBlock();
  encrypted=msEncrypt.ToArray();
  csEncrypt.Close();
  msEncrypt.Close();
  return this.EncodingMode.GetString(encrypted);
  }
  ///
  /// 加密指定的文件,如果成功返回True,否则false
  ///
  /// 要加密的文件路径
  /// 加密后的文件输出路径
  public void EncryptFile(string filePath,string outPath)
  {
  bool isExist=File.Exists(filePath);
  if(isExist)//如果存在
  {
  byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
  byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
  //得到要加密文件的字节流
  FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
  StreamReader reader=new StreamReader(fin,this.EncodingMode);
  string dataStr=reader.ReadToEnd();
  byte[] toEncrypt=this.EncodingMode.GetBytes(dataStr);
  fin.Close();
  FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
  ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
  CryptoStream csEncrypt=new CryptoStream(fout,encryptor,CryptoStreamMode.Write);
  try
  {
  //加密得到的文件字节流
  csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
  csEncrypt.FlushFinalBlock();
  }
  catch(Exception err)
  {
  throw new ApplicationException(err.Message);
  }
  finally
  {
  try
  {
  fout.Close();
  csEncrypt.Close();
  }
  catch
  {
  ;
  }
  }
  }
  else
  {
  throw new FileNotFoundException("没有找到指定的文件");
  }
  }
  ///
  /// 文件加密函数的重载版本,如果不指定输出路径,
  /// 那么原来的文件将被加密后的文件覆盖
  ///
  ///
  public void EncryptFile(string filePath)
  {
  this.EncryptFile(filePath,filePath);
  }
  ///
  /// 解密给定的字符串
  ///
  /// 要解密的字符
  ///
  public string DecryptString(string str)
  {
  byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
  byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
  byte[] toDecrypt=this.EncodingMode.GetBytes(str);
  byte[] deCrypted=new byte[toDecrypt.Length];
  ICryptoTransform deCryptor=des.CreateDecryptor(keyb,ivb);
  MemoryStream msDecrypt=new MemoryStream(toDecrypt);
  CryptoStream csDecrypt=new CryptoStream(msDecrypt,deCryptor,CryptoStreamMode.Read);
  try
  {
  csDecrypt.Read(deCrypted,0,deCrypted.Length);
  }
  catch(Exception err)
  {
  throw new ApplicationException(err.Message);
  }
  finally
  {
  try
  {
  msDecrypt.Close();
  csDecrypt.Close();
  }
  catch{;}
  }
  return this.EncodingMode.GetString(deCrypted);
  }
  ///
  /// 解密指定的文件
  ///
  /// 要解密的文件路径
  /// 解密后的文件输出路径
  public void DecryptFile(string filePath,string outPath)
  {
  bool isExist=File.Exists(filePath);
  if(isExist)//如果存在
  {
  byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
  byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
  FileInfo file=new FileInfo(filePath);
  byte[] deCrypted=new byte[file.Length];
  //得到要解密文件的字节流
  FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
  //解密文件
  try
  {
  ICryptoTransform decryptor=des.CreateDecryptor(keyb,ivb);
  CryptoStream csDecrypt=new CryptoStream(fin,decryptor,CryptoStreamMode.Read);
  csDecrypt.Read(deCrypted,0,deCrypted.Length);
  }
  catch(Exception err)
  {
  throw new ApplicationException(err.Message);
  }
  finally
  {
  try
  {
  fin.Close();
  }
  catch{;}
  }
  FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
  fout.Write(deCrypted,0,deCrypted.Length);
  fout.Close();
  }
  else
  {
  throw new FileNotFoundException("指定的解密文件没有找到");
  }
  }
  ///
  /// 解密文件的重载版本,如果没有给出解密后文件的输出路径,
  /// 则解密后的文件将覆盖先前的文件
  ///
  ///
  public void DecryptFile(string filePath)
  {
  this.DecryptFile(filePath,filePath);

4000
  }
  #endregion
  }
  ///
  /// MD5加密类,注意经MD5加密过的信息是不能转换回原始数据的
  /// ,请不要在用户敏感的信息中使用此加密技术,比如用户的密码,
  /// 请尽量使用对称加密
  ///
  public class MD5Encrypt
  {
  private MD5 md5;
  public MD5Encrypt()
  {
  md5=new MD5CryptoServiceProvider();
  }
  ///
  /// 从字符串中获取散列值
  ///
  /// 要计算散列值的字符串
  ///
  public string GetMD5FromString(string str)
  {
  byte[] toCompute=Encoding.Unicode.GetBytes(str);
  byte[] hashed=md5.ComputeHash(toCompute,0,toCompute.Length);
  return Encoding.ASCII.GetString(hashed);
  }
  ///
  /// 根据文件来计算散列值
  ///
  /// 要计算散列值的文件路径
  ///
  public string GetMD5FromFile(string filePath)
  {
  bool isExist=File.Exists(filePath);
  if(isExist)//如果文件存在
  {
  FileStream stream=new FileStream(filePath,FileMode.Open,FileAccess.Read);
  StreamReader reader=new StreamReader(stream,Encoding.Unicode);
  string str=reader.ReadToEnd();
  byte[] toHash=Encoding.Unicode.GetBytes(str);
  byte[] hashed=md5.ComputeHash(toHash,0,toHash.Length);
  stream.Close();
  return Encoding.ASCII.GetString(hashed);
  }
  else//文件不存在
  {
  throw new FileNotFoundException("指定的文件没有找到");
  }
  }
  }
  ///
  /// 用于数字签名的hash类
  ///
  public class MACTripleDESEncrypt
  {
  private MACTripleDES mact;
  private string __key="ksn168ch";
  private byte[] __data=null;
  public MACTripleDESEncrypt()
  {
  mact=new MACTripleDES();
  }
  ///
  /// 获取或设置用于数字签名的密钥
  ///
  public string Key
  {
  get{return this.__key;}
  set
  {
  int keyLength=value.Length;
  int[] keyAllowLengths=new int[]{8,16,24};
  bool isRight=false;
  foreach(int i in keyAllowLengths)
  {
  if(keyLength==keyAllowLengths[i])
  {
  isRight=true;
  break;
  }
  }
  if(!isRight)
  throw new ApplicationException("用于数字签名的密钥长度必须是8,16,24值之一");
  else
  this.__key=value;
  }
  }
  ///
  /// 获取或设置用于数字签名的用户数据
  ///
  public byte[] Data
  {
  get{return this.__data;}
  set{this.__data=value;}
  }
  ///
  /// 得到签名后的hash值
  ///
  ///
  public string GetHashValue()
  {
  if(this.Data==null)
  throw new NotSetSpecialPropertyException("没有设置要进行数字签名的用户"+
  "数据(property:Data)");
  byte[] key=Encoding.ASCII.GetBytes(this.Key);
  this.mact.Key=key;
  byte[] hash_b=this.mact.ComputeHash(this.mact.ComputeHash(this.Data));
  return Encoding.ASCII.GetString(hash_b);
  }
  }
  }
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=381361
本文转自
http://blog.csdn.net/xyjnzy/archive/2005/05/26/381361.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息