学院首页>网络编程>ASP.NET>.net加密技术的应用(加密类代码参考)

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

作者: 来源: 添加时间:2006-5-21 19:37:55

using System;
using System.Text;
using System.Security;
using System.Security.Cryptography;
using System.IO;
namespace EncryptClasses
{
 /// <summary>
 /// 此处定义的是DES加密,为了便于今后的管理和维护
 /// 请不要随便改动密码,或者改变了密码后请一定要
 /// 牢记先前的密码,否则将会照成不可预料的损失
 /// </summary>
 public class DESEncrypt
 {
  #region "member fields"
  private string iv="12345678";
  private string key="12345678";
  private Encoding encoding=new UnicodeEncoding();
  private DES des;
  #endregion
  /// <summary>
  /// 构造函数
  /// </summary>
  public DESEncrypt()
  {
des=new DESCryptoServiceProvider();
  }
  #region "propertys"
  /// <summary>
  /// 设置加密密钥
  /// </summary>
  public string EncryptKey
  {
get{return this.key;}
set
{
   this.key=value;
}
  }
  /// <summary>
  /// 要加密字符的编码模式
  /// </summary>
  public Encoding EncodingMode
  {
get{return this.encoding;}
set{this.encoding=value;}
  }
  #endregion
  #region "methods"
  /// <summary>
  /// 加密字符串并返回加密后的结果
  /// </summary>
  /// <param name="str"></param>
  /// <returns></returns>
  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);
  }
  /// <summary>
  /// 加密指定的文件,如果成功返回True,否则false
  /// </summary>
  /// <param name="filePath">要加密的文件路径</param>
  /// <param name="outPath">加密后的文件输出路径</param>
  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("没有找到指定的文件");
}
  }
  /// <summary>
  /// 文件加密函数的重载版本,如果不指定输出路径,
  /// 那么原来的文件将被加密后的文件覆盖
  /// </summary>
  /// <param name="filePath"></param>
  public void EncryptFile(string filePath)
  {
this.EncryptFile(filePath,filePath);
  }
  /// <summary>
  /// 解密给定的字符串
  /// </summary>
  /// <param name="str">要解密的字符</param>
  /// <returns></returns>
  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);
  }
  /// <summary>
  /// 解密指定的文件
  /// </summary>
  /// <param name="filePath">要解密的文件路径</param>
  /// <param name="outPath">解密后的文件输出路径</param>
  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("指定的解密文件没有找到");
}
  }
  /// <summary>
  /// 解密文件的重载版本,如果没有给出解密后文件的输出路径,
  /// 则解密后的文件将覆盖先前的文件
  /// </summary>
  /// <param name="filePath"></param>
  public void DecryptFile(string filePath)
  {
this.DecryptFile(filePath,filePath);
  }
  #endregion
 }
 /// <summary>
 /// MD5加密类,注意经MD5加密过的信息是不能转换回原始数据的
 /// ,请不要在用户敏感的信息中使用此加密技术,比如用户的密码,
 /// 请尽量使用对称加密
 /// </summary>
 public class MD5Encrypt
 {
  private MD5 md5;
  public MD5Encrypt()
  {
md5=new MD5CryptoServiceProvider();
  }
  /// <summary>
  /// 从字符串中获取散列值
  /// </summary>
  /// <param name="str">要计算散列值的字符串</param>
  /// <returns></returns>
  public string GetMD5FromString(string str)
  {
byte[] toCompute=Encoding.Unicode.GetBytes(str);
byte[] hashed=md5.ComputeHash(toCompute,0,toCompute.Length);
return Encoding.ASCII.GetString(hashed);
  }
  /// <summary>
  /// 根据文件来计算散列值
  /// </summary>
  /// <param name="filePath">要计算散列值的文件路径</param>
  /// <returns></returns>
  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("指定的文件没有找到");
}
  }
 }
 /// <summary>
 /// 用于数字签名的hash类
 /// </summary>
 public class MACTripleDESEncrypt
 {
  private MACTripleDES mact;
  private string __key="ksn168ch";
  private byte[] __data=null;
  public MACTripleDESEncrypt()
  {
mact=new MACTripleDES();
  }
  /// <summary>
  /// 获取或设置用于数字签名的密钥
  /// </summary>
  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;
}
  }
  /// <summary>
  /// 获取或设置用于数字签名的用户数据
  /// </summary>
  public byte[] Data
  {
get{return this.__data;}
set{this.__data=value;}
  }
  /// <summary>
  /// 得到签名后的hash值
  /// </summary>
  /// <returns></returns>
  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);
  }
 }
}

站内搜索