C#做的一个加密解密的类.docx

上传人:b****3 文档编号:10515280 上传时间:2023-05-26 格式:DOCX 页数:17 大小:17.52KB
下载 相关 举报
C#做的一个加密解密的类.docx_第1页
第1页 / 共17页
C#做的一个加密解密的类.docx_第2页
第2页 / 共17页
C#做的一个加密解密的类.docx_第3页
第3页 / 共17页
C#做的一个加密解密的类.docx_第4页
第4页 / 共17页
C#做的一个加密解密的类.docx_第5页
第5页 / 共17页
C#做的一个加密解密的类.docx_第6页
第6页 / 共17页
C#做的一个加密解密的类.docx_第7页
第7页 / 共17页
C#做的一个加密解密的类.docx_第8页
第8页 / 共17页
C#做的一个加密解密的类.docx_第9页
第9页 / 共17页
C#做的一个加密解密的类.docx_第10页
第10页 / 共17页
C#做的一个加密解密的类.docx_第11页
第11页 / 共17页
C#做的一个加密解密的类.docx_第12页
第12页 / 共17页
C#做的一个加密解密的类.docx_第13页
第13页 / 共17页
C#做的一个加密解密的类.docx_第14页
第14页 / 共17页
C#做的一个加密解密的类.docx_第15页
第15页 / 共17页
C#做的一个加密解密的类.docx_第16页
第16页 / 共17页
C#做的一个加密解密的类.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C#做的一个加密解密的类.docx

《C#做的一个加密解密的类.docx》由会员分享,可在线阅读,更多相关《C#做的一个加密解密的类.docx(17页珍藏版)》请在冰点文库上搜索。

C#做的一个加密解密的类.docx

C#做的一个加密解密的类

两年写的东西,现在整理一下发出来!

以前公司需要做WebService,并且对WebService的SoapHeader进行加密,所以就写了这么个东东!

使用这个类,需要密钥管理!

为了保证数据的安全性往往要对数据进行加密,但是加密的缺点之一,就是影响程序的运行效率,所以,当时我的思路是只对用户的登录信息(用户名,密码)进行加密!

数据用明文传输,用户信息验证没有通过的情况下,不进行数据传输。

实际在网络通讯中,使用密钥匙的方式并非无懈可击,如果黑客可以捕捉到用密钥加密的,用户验证信息,然后,做个模拟请求,向提供WebService的服务器发请求,还是可以获得请求数据!

所以,我又使用了IP或者域名绑定的方式!

毕竟,WebService不是直接对最终用户提供的!

所以,加上以上这些手段后,就算有不良企图者想通过非法方式获得WebService提供的服务,就再费点劲吧!

还有一点安全建议,就是定期的更换密钥,在这个例子中,我用的是对称加密,加密方和解密方的密钥一致!

定期的更换密钥可以让安全性提高一大截!

大家要有更好的方法,或者建议,可以留言讨论一下!

共同提高!

代码如下:

usingSystem;

usingSystem.Security.Cryptography;

usingSystem.Text;

usingSystem.IO;

 

namespaceSEDO

{

///

///SEDO的摘要说明。

///SEDO实现的是用一个封装了4种对称加密方法(Des,Rc2,Rijndael,TripleDes)的组件

///

///注意事项:

///1:

TripleDes和Rijndael加密/解密对象使用16或者24位byte的Key

///2:

Rijndael只能使用16位的初始化向量IV

///3:

Des和Rc2均使用8位Byte的Key和IV

///4:

对需要加密/解密的数据流采用何种方法进行编码/解码,由调用组件的用户自己决定

///5:

密钥和初始化向量IV由使用者自己定义

///程序员:

王海波2003-05-19hwnanghb@

///

//定义加密类型的枚举

publicenumEncryptionAlgorithm{Des=1,Rc2,Rijndael,TripleDes};

 

//定义加密类

internalclassEncryptTransformer

{

privateEncryptionAlgorithmalgorithmID;

privatebyte[]initVec;

privatebyte[]encKey;

internalEncryptTransformer(EncryptionAlgorithmalgId)

{

//Savethealgorithmbeingused.

algorithmID=algId;

}

internalICryptoTransformGetCryptoServiceProvider(byte[]bytesKey)

{

//当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV

switch(algorithmID)

{

caseEncryptionAlgorithm.Des:

{

DESdes=newDESCryptoServiceProvider();

des.Mode=CipherMode.CBC;

//Seeifakeywasprovided

if(null==bytesKey)

{

encKey=des.Key;

}

else

{

des.Key=bytesKey;

encKey=des.Key;

}

//Seeiftheclientprovidedaninitializationvector

if(null==initVec)

{//Havethealgorithmcreateone

initVec=des.IV;

}

else

{//No,giveittothealgorithm

des.IV=initVec;

}

returndes.CreateEncryptor();

}

caseEncryptionAlgorithm.TripleDes:

{

TripleDESdes3=newTripleDESCryptoServiceProvider();

des3.Mode=CipherMode.CBC;

//Seeifakeywasprovided

if(null==bytesKey)

{

encKey=des3.Key;

}

else

{

des3.Key=bytesKey;

encKey=des3.Key;

}

//SeeiftheclientprovidedanIV

if(null==initVec)

{//Yes,havethealgcreateone

initVec=des3.IV;

}

else

{//No,giveittothealg.

des3.IV=initVec;

}

returndes3.CreateEncryptor();

}

caseEncryptionAlgorithm.Rc2:

{

RC2rc2=newRC2CryptoServiceProvider();

rc2.Mode=CipherMode.CBC;

//Testtoseeifakeywasprovided

if(null==bytesKey)

{

encKey=rc2.Key;

}

else

{

rc2.Key=bytesKey;

encKey=rc2.Key;

}

//SeeiftheclientprovidedanIV

if(null==initVec)

{//Yes,havethealgcreateone

initVec=rc2.IV;

}

else

{//No,giveittothealg.

rc2.IV=initVec;

}

returnrc2.CreateEncryptor();

}

caseEncryptionAlgorithm.Rijndael:

{

Rijndaelrijndael=newRijndaelManaged();

rijndael.Mode=CipherMode.CBC;

//Testtoseeifakeywasprovided

if(null==bytesKey)

{

encKey=rijndael.Key;

}

else

{

rijndael.Key=bytesKey;

encKey=rijndael.Key;

}

//SeeiftheclientprovidedanIV

if(null==initVec)

{//Yes,havethealgcreateone

initVec=rijndael.IV;

}

else

{//No,giveittothealg.

rijndael.IV=initVec;

}

returnrijndael.CreateEncryptor();

}

default:

{

thrownewCryptographicException("AlgorithmID'"+

algorithmID+

"'notsupported.");

}

}

}

//加密的偏移向量

internalbyte[]IV

{

get{returninitVec;}

set{initVec=value;}

}

//加密的密钥

internalbyte[]Key

{

get{returnencKey;}

set{encKey=value;}

}

}

//定义解密类

internalclassDecryptTransformer

{

privateEncryptionAlgorithmalgorithmID;

privatebyte[]initVec;

privatebyte[]encKey;

internalDecryptTransformer(EncryptionAlgorithmdeCryptId)

{

algorithmID=deCryptId;

}

//加密的偏移向量

internalbyte[]IV

{

get{returninitVec;}

set{initVec=value;}

}

//加密的密钥

internalbyte[]Key

{

get{returnencKey;}

set{encKey=value;}

}

internalICryptoTransformGetCryptoServiceProvider(byte[]bytesKey)

{

//当数据密钥Key或者初始化向量IV为空的时候,将使用加密对象自动产生的密钥Key或者初始化向量IV

switch(algorithmID)

{

caseEncryptionAlgorithm.Des:

{

DESdes=newDESCryptoServiceProvider();

des.Mode=CipherMode.CBC;

des.Key=bytesKey;

des.IV=initVec;

returndes.CreateDecryptor();

}

caseEncryptionAlgorithm.TripleDes:

{

TripleDESdes3=newTripleDESCryptoServiceProvider();

des3.Mode=CipherMode.CBC;

returndes3.CreateDecryptor(bytesKey,initVec);

}

caseEncryptionAlgorithm.Rc2:

{

RC2rc2=newRC2CryptoServiceProvider();

rc2.Mode=CipherMode.CBC;

returnrc2.CreateDecryptor(bytesKey,initVec);

}

caseEncryptionAlgorithm.Rijndael:

{

Rijndaelrijndael=newRijndaelManaged();

rijndael.Mode=CipherMode.CBC;

returnrijndael.CreateDecryptor(bytesKey,initVec);

}

default:

{

thrownewCryptographicException("AlgorithmID'"+

algorithmID+

"'notsupported.");

}

}

}//endGetCryptoServiceProvider

}

//定义加密者类

publicclassEncryptor

{

privateEncryptTransformertransformer;

privatebyte[]initVec;

privatebyte[]encKey;

publicEncryptor(EncryptionAlgorithmalgId)

{

transformer=newEncryptTransformer(algId);

}

publicbyte[]Encrypt(byte[]bytesData,byte[]bytesKey,byte[]bytesIV)

{

//设置流对象用来保存加密数据字节流.

MemoryStreammemStreamEncryptedData=newMemoryStream();

transformer.IV=bytesIV;

transformer.Key=bytesKey;

ICryptoTransformtransform=transformer.GetCryptoServiceProvider(bytesKey);

CryptoStreamencStream=newCryptoStream(memStreamEncryptedData,transform,CryptoStreamMode.Write);

try

{

//将加密数据写进流对象

encStream.Write(bytesData,0,bytesData.Length);

}

catch(Exceptionex)

{

thrownewException("在数据加密的时候出现错误!

错误提示:

\n"+ex.Message);

}

//设置加密的Key和初始向量IV属性

encKey=transformer.Key;

initVec=transformer.IV;

encStream.FlushFinalBlock();

encStream.Close();

//Sendthedataback.

returnmemStreamEncryptedData.ToArray();

}

publicbyte[]IV

{

get{returninitVec;}

set{initVec=value;}

}

publicbyte[]Key

{

get{returnencKey;}

set{encKey=value;}

}

}

 

//定义解密者类

publicclassDecryptor

{

privateDecryptTransformertransformer;

privatebyte[]initVec;

privatebyte[]encKey;

publicDecryptor(EncryptionAlgorithmalgId)

{

transformer=newDecryptTransformer(algId);

}

publicbyte[]Decrypt(byte[]bytesData,byte[]bytesKey,byte[]bytesIV)

{

//设置流对象用来保存解密数据字节流.

MemoryStreammemStreamDecryptedData=newMemoryStream();

//Passintheinitializationvector.

transformer.IV=bytesIV;

transformer.Key=bytesKey;

ICryptoTransformtransform=transformer.GetCryptoServiceProvider(bytesKey);

CryptoStreamdecStream=newCryptoStream(memStreamDecryptedData,transform,CryptoStreamMode.Write);

try

{

decStream.Write(bytesData,0,bytesData.Length);

}

catch(Exceptionex)

{

thrownewException("在数据解密的时候出现错误!

错误提示:

\n"+ex.Message);

}

decStream.FlushFinalBlock();

decStream.Close();

//返回解密数据.

returnmemStreamDecryptedData.ToArray();

}

publicbyte[]IV

{

get{returninitVec;}

set{initVec=value;}

}

publicbyte[]Key

{

get{returnencKey;}

set{encKey=value;}

}

}

//类描述:

文件加密/解密类

publicclassSecurityFile

{

privateDecryptTransformerDec_Transformer;//解密转换器

privateEncryptTransformerEnc_Transformer;//加密转换器

privatebyte[]initVec;

privatebyte[]encKey;

publicSecurityFile(EncryptionAlgorithmalgId)

{

Dec_Transformer=newDecryptTransformer(algId);

Enc_Transformer=newEncryptTransformer(algId);

}

//加密的偏移向量

internalbyte[]IV

{

get{returninitVec;}

set{initVec=value;}

}

//加密的密钥

internalbyte[]Key

{

get{returnencKey;}

set{encKey=value;}

}

//功能描述:

加密文件

publicvoidEncryptFile(stringinFileName,stringoutFileName,byte[]bytesKey,byte[]bytesIV)

{

try

{

FileStreamfin=newFileStream(inFileName,FileMode.Open,FileAccess.Read);

FileStreamfout=newFileStream(outFileName,FileMode.OpenOrCreate,FileAccess.Write);

fout.SetLength(0);

//Createvariablestohelpwithreadandwrite.

byte[]bin=newbyte[100];//Thisisintermediatestoragefortheencryption.

longrdlen=0;//Thisisthetotalnumberofbyteswritten.

longtotlen=fin.Length;//Thisisthetotallengthoftheinputfile.

intlen;//Thisisthenumberofbytestobewrittenatatime.

Enc_Transformer.IV=bytesIV;

Enc_Transformer.Key=bytesKey;

ICryptoTransformtransform=Enc_Transformer.GetCryptoServiceProvider(bytesKey);

CryptoStreamencStream=newCryptoStream(fout,transform,CryptoStreamMode.Write);

//Readfromtheinputfile,thenencryptandwritetotheoutputfile.

while(rdlen

{

len=fin.Read(bin,0,100);

encStream.Write(bin,0,len);

rdlen=rdlen+len;

}

encStream.Close();

fout.Close();

fin.Close();

}

catch(Exceptionex)

{

thrownewException("在文件加密的时候出现错误!

错误提示:

\n"+ex.Message);

}

}

//功能描述:

解密文件

publicvoidDecryptFile(stringinFileName,stringoutFileName,byte[]bytesKey,byte[]bytesIV)

{

try

{

FileStreamfin=newFileStream(inFileName,FileMode.Open,FileAccess.Read);

FileStreamfout=newFileStream(outFileName,FileMode.OpenOrCreate,FileAccess.Write);

fout.SetLength(0);

//Createvariablestohelpwithreadandwrite.

byte[]bin=newbyte[100];//Thisisintermediatestoragefortheencryption.

longrdlen=0;//Thisisthetotalnumberofbyteswritten.

longtotlen=fin.Length;//Thisisthetotallengthoftheinputfile.

intlen;//Thisisthenumberofbytestobewrittenatatime.

Dec_Transformer.IV=bytesIV;

Dec_Transformer.Key=bytesKey;

ICryptoTransformtransform=Dec_Transformer.GetCryptoServiceProvider(by

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2