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


 /**********************Created by Chen**************************

*如果你觉得本人的文章好,要引用请尊重著作人的劳动果实,说明 

*出处以及原创作者,Thank you!!!   email:aishen944-sohu.com

******************************************************************
*/


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

 }

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值