[摘 要] .NET中有多種可用的加密和解密算法。支持對(duì)稱(chēng)密鑰算法和非對(duì)稱(chēng)密鑰算法,支持對(duì)常規(guī)算法的缺省實(shí)現(xiàn),用戶(hù)也可以自定義加密和解密算法。本文重點(diǎn)討論如何運(yùn)用.NET進(jìn)行加密和解密。
[關(guān)鍵詞] .NET 加密 解密
一、引言
電子商務(wù)在當(dāng)今世界已經(jīng)被廣泛應(yīng)用,其在技術(shù)方面的核心問(wèn)題是信息的保密性、完整性和不可否認(rèn)性。加密技術(shù)是電子商務(wù)采取的主要的安全措施。.NET中有多種可用的加密和解密算法。支持對(duì)稱(chēng)密鑰算法和非對(duì)稱(chēng)密鑰算法,支持對(duì)常規(guī)算法的缺省實(shí)現(xiàn),用戶(hù)也可以自定義加密和解密算法。本文重點(diǎn)討論如何運(yùn)用.NET進(jìn)行加密和解密。
二、加密和解密的算法
加密和解密的算法分為對(duì)稱(chēng)算法和不對(duì)稱(chēng)算法。對(duì)稱(chēng)算法在加密和解密數(shù)據(jù)時(shí)使用相同的密鑰和初始化矢量,典型的有DES、TripleDES和Rijndael算法,主要用于本地文檔或數(shù)據(jù)的加密。不對(duì)稱(chēng)算法有兩個(gè)不同的密鑰,分別是公共密鑰和私有密鑰,公共密鑰在網(wǎng)絡(luò)中傳遞,用于加密數(shù)據(jù),而私有密鑰用于解密數(shù)據(jù)。不對(duì)稱(chēng)算法主要有RSA、DSA等,主要用于網(wǎng)絡(luò)數(shù)據(jù)的加密。
三、加密和解密本地文檔
采用對(duì)稱(chēng)密鑰算法,首先獲取服務(wù)提供者的特定實(shí)例,創(chuàng)建一個(gè)用于加密的新的隨機(jī)密鑰和初始化向量IV。密鑰的大小取決于用來(lái)加密的特定提供程序。IV將幫助算法生成最終加密字符串的數(shù)據(jù)塊。IV用于開(kāi)始第一個(gè)塊的加密。如果不提供IV,那么只要密鑰相同,在字符串之間傳遞的通用數(shù)據(jù)將保持同一種模式。因此,需要使用IV作為加密數(shù)據(jù)的“隨機(jī)”組件。通過(guò)這種方式,只要使用的IV不同,即使密鑰相同,同一個(gè)數(shù)據(jù)也會(huì)被加密成完全不同的值。下面以DES加密算法演示加密和解密的過(guò)程:
1.數(shù)據(jù)加密
public byte[] Encrypt(byte[] bytesData,outbyte[] bytesKey,outbyte[] bytesIV){
MemoryStream Data1 = new MemoryStream();
SymmetricAlgorithm sa=new DESCryptoServiceProvider();
ICryptoTransform transform =sa.CreateEncryptor();
CryptoStream encStream =newCryptoStream(Data1,transform,CryptoStreamMode.Write);
encStream.Write(bytesData, 0, bytesData.Length);
encStream.FlushFinalBlock();
encStream.Close();
bytesKey = sa.Key;
bytesIV = sa.IV;
return Data1.ToArray();}
2.數(shù)據(jù)解密
public byte[] Decrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV){
MemoryStream Data2 = new MemoryStream();
SymmetricAlgorithm sa=new DESCryptoServiceProvider();
ICryptoTransform transform = sa.CreateDecryptor(bytesKey,bytesIV);
CryptoStream decStream =newCryptoStream(Data2,transform,CryptoStreamMode.Write);
decStream.Write(bytesData,0,bytesData.Length);
decStream.FlushFinalBlock();
decStream.Close();
return Data2.ToArray();}
四、網(wǎng)絡(luò)數(shù)據(jù)加密和解密
非對(duì)稱(chēng)算法就是一種解決方案。不對(duì)稱(chēng)加密算法(也稱(chēng)作公鑰算法) 要求發(fā)送方和接收方共同維護(hù)一對(duì)相關(guān)的密鑰:私鑰和公鑰。兩個(gè)密鑰對(duì)實(shí)體來(lái)說(shuō)都是惟一的。公鑰可由任何人使用; 該密鑰用于對(duì)發(fā)送給接收方的數(shù)據(jù)進(jìn)行加密。私鑰必須由接收方保持私有;該密鑰用于對(duì)使用接收方的公鑰編碼的消息進(jìn)行解密。這類(lèi)算法使用的兩個(gè)密鑰有如下關(guān)系:使用公共密鑰加密的信息只能被相應(yīng)的私有密鑰解密。
不對(duì)稱(chēng)算法比對(duì)稱(chēng)算法計(jì)算的花費(fèi)多、速度慢。因此在線(xiàn)對(duì)話(huà)中使用不對(duì)稱(chēng)算法加密對(duì)稱(chēng)密鑰。實(shí)際上安全接口層(SSL)建立服務(wù)器和瀏覽器之間的安全對(duì)話(huà)使用的就是這種工作方式:
public byte[] RSAEncrypt(byte[] DToe,RSAKeyInfo,bool Tof){
RSACryptoServiceProvider RSA = new RSACryptoService-Provider();
RSA.ImportParameters(RSAKeyInfo);
return RSA.Encrypt(DToe, Tof);}
public byte[] RSADecrypt(byte[] DTod, RSAKeyInfo,bool Tof) {
RSACryptoServiceProvider RSA = new RSACryptoService-Provider();
RSA.ImportParameters(RSAKeyInfo);
return RSA.Decrypt(DTod, Tof);}
static string TestRSA(string src){
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dToe = ByteConverter.GetBytes(src);
byte[] eData,dData;
RSACryptoServiceProvider RSA = new RSACryptoService-Provider();
eData = RSAEncrypt(dToe,RSA.ExportParameters(1),1);
dData = RSADecrypt(eData,RSA.ExportParameters(true), 1);
return ByteConverter.GetString(dData);}
五、結(jié)論
在實(shí)際用中,電子商務(wù)的安全加密系統(tǒng)普遍采用對(duì)稱(chēng)加密體制和非對(duì)稱(chēng)加密體制相結(jié)合的混合加密體制:用對(duì)稱(chēng)密碼算法來(lái)加密或解密大量的數(shù)據(jù),而用非對(duì)稱(chēng)密碼算法來(lái)加密關(guān)鍵性的、核心的機(jī)密數(shù)據(jù)(如會(huì)話(huà)密鑰)。這樣既發(fā)揮了對(duì)稱(chēng)密碼算法的高速、簡(jiǎn)便性又充分利用了非對(duì)稱(chēng)密碼體制密鑰管理的方便、安全性,較好地解決了運(yùn)算速度問(wèn)題和密鑰分配管理問(wèn)題。
參考文獻(xiàn):
[1]祁 明:電子商務(wù)安全與保密[M].北京:高等教育出版社,2001,(7)
[2]邱新建:信息加密技術(shù)概論[J].石家莊職業(yè)技術(shù)學(xué)院學(xué)報(bào),2004,12(6)
[3]楊波等:基于Rabin加密算法的密鑰托管體制[J].西安電子科技大學(xué)學(xué)報(bào),1999