網絡傳遞加密數據
雖然不對稱加密解決了用對稱加密傳遞消息必須傳遞密鑰的問題,但是由於不對稱加密無法使用流進行處理,因此與對稱加密相比效率較低,不適用於加密大量數據的場合。在實際應用中,一般將兩種加密方法配合使用。其基本思想是:用不對稱加密算法加密對稱加密算法的密鑰,用對稱加密算法加密實際數據。
具體設計思路可以簡單描述為:A和B相互傳遞加密的數據前,B首先生成一個不對稱加密算法使用的公鑰/私鑰對,假定公鑰為publicKey,私鑰為privateKey,然后B將公鑰publicKey通過網絡傳遞給A;A接收到此公鑰后,根據此公鑰初始化不對稱加密對象,並用此對象加密使用對稱加密算法的密鑰key,並將加密后的密鑰key通過網絡傳遞給B;這樣,A和B都有了一個共同使用的對稱加密的密鑰,然后雙方用此密鑰加密數據,並將加密后的數據傳遞給對方,對方收到加密后的數據后,再用密鑰key解密數據。
下面通過一個例子說明具體的實現方法
客戶端
客戶端發送
//使用默認密鑰創建對稱加密對象
TripleDESCryptoServiceProvider
tdes = new TripleDESCryptoServiceProvider();
//使用默認密鑰創建不對稱加密對象
RSACryptoServiceProvider
rsa = new RSACryptoServiceProvider();
//導出不對稱加密密鑰的xml表示形式,false表示不包括私鑰
string rsaPublicKey = rsa.ToXmlString(false);
//將導出的公鑰發送到服務器,公鑰可以對任何人公開
SendData("rsaPublicKey,true", Encoding.Default.GetBytes(rsaPublicKey));
客戶端接收
case "tdesKey":
//解密
tdes.Key = rsa.Decrypt(receiveBytes, false);//Rsa解密Key
break;
case "tdesIV":
//解密
tdes.IV = rsa.Decrypt(receiveBytes, false);//Rsa解密IV
break;
case "Talk":
//解密
string talkString = DecryptText(receiveBytes, tdes.Key, tdes.IV);用對稱解密獲取解密后數據
服務端接收
case "rsaPublicKey":
//使用傳遞過來的公鑰重新初始化該客戶端對
//應的RSACryptoServiceProvider對象,
//然后就可以使用這個對象加密對稱加密的私鑰了
user.rsa.FromXmlString(Encoding.Default.GetString(receiveBytes));
//加密對稱加密的私鑰
try
{
//使用RSA算法加密對稱加密算法的私鑰Key
byte[] encryptedKey = user.rsa.Encrypt(user.tdes.Key, false);
SendToClient(user, "tdesKey,true", encryptedKey);
//加密IV
byte[] encryptedIV = user.rsa.Encrypt(user.tdes.IV, false);
SendToClient(user, "tdesIV,true", encryptedIV);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
break;
case "Talk":
//解密
string talkString = DecryptText(receiveBytes, user.tdes.Key, user.tdes.IV);//對稱加密數據
break;
Hash算法與數字簽名
用HASH算法加密的提供方法有MD5,SHA等,
Hash算法具有如下特點:
1) 散列效果好。即使原始數據只發生一個小小的改動,數據的散列也會發生非常大的變化。假如兩個單詞非常相似,比如只有一個字母不同,使用Hash算法得到的結果也相差甚遠。甚至根本看不出二者之間有什么相似之處。
2) 散列函數不可逆。即不可能從散列結果推導出原始數據。(MD5,SHA等不可逆)
3) 對不同的數據進行Hash運算不可能生成相同的Hash值。
Hash算法的用途主要有兩大類:一類是將Hash值作為消息身份驗證代碼(MAC,Message Authentication Code),用於和數字簽名一起實現對消息數據進行身份驗證;另一類是將Hash值作為消息檢測代碼(MDC,Message Detection Code),用於檢測數據完整性。
在應用程序中,可以利用數字簽名實現數據身份驗證和數據完整性驗證。數據身份驗證是為了驗證數據是不是持有私鑰的人發送的;數據完整性驗證則用於驗證數據在傳輸過程中是否被修改過。
驗證數據完整性的實現原理是:發送方先使用Hash算法對數據進行Hash運算得到數據的Hash值,然后將數據和Hash值一塊兒發送給接收方;接收方接收到數據和Hash值后,對接收的數據進行和發送方相同的Hash運算,然后將計算得到的Hash值和接收的Hash值進行比較,如果二者一致,說明收到的數據肯定與發送方發送的原始數據相同,從而說明數據是完整的。
byte[] HashVal = new MD5CryptoServiceProvider().ComputeHash(dataToEncrypt);產生hash值,然后對比是否相等來判斷.
