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

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

2006-11-01 14:00 459 查看
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




...{




"member fields""member fields"#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();


}




"propertys""propertys"#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




"methods""methods"#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);


}


}


}

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