首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

.NET加密技术施用

2012-12-23 
.NET加密技术应用using Systemusing System.Textusing System.Securityusing System.Security.Cryptogr

.NET加密技术应用

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);  } }}
?

热点排行