C#做的一个加密解密的类.docx
- 文档编号:24313231
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:17
- 大小:17.52KB
C#做的一个加密解密的类.docx
《C#做的一个加密解密的类.docx》由会员分享,可在线阅读,更多相关《C#做的一个加密解密的类.docx(17页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 一个 加密 解密