標籤:
(一)對稱式加密(Symmetric Cryptography)
對稱式加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對稱式加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
對稱式加密通常使用的是相對較小的密鑰,一般小於256 bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個密鑰,那駭客們可以先試著用0來解密,不行的話就再用1解;但如果你的密鑰有1 MB大,駭客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個trade-off。
2000年10月2日,美國國家標準與技術研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael演算法作為新的進階加密標準(AES--Advanced Encryption Standard)。.NET中包含了Rijndael演算法,類名叫RijndaelManaged,下面舉個例子。
加密過程:
private string myData = "hello"; private string myPassword = "OpenSesame"; private byte[] cipherText; private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 }; private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e) { var key = new Rfc2898DeriveBytes(myPassword, salt); // Encrypt the data. var algorithm = new RijndaelManaged(); algorithm.Key = key.GetBytes(16); algorithm.IV = key.GetBytes(16); var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData); using (var sourceStream = new MemoryStream(sourceBytes)) using (var destinationStream = new MemoryStream()) using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read)) { moveBytes(crypto, destinationStream); cipherText = destinationStream.ToArray(); } MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText))); } private void moveBytes(Stream source, Stream dest) { byte[] bytes = new byte[2048]; var count = source.Read(bytes, 0, bytes.Length); while (0 != count) { dest.Write(bytes, 0, count); count = source.Read(bytes, 0, bytes.Length); } }
解密過程:
private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e) { if (cipherText == null) { MessageBox.Show("Encrypt Data First!"); return; } var key = new Rfc2898DeriveBytes(myPassword, salt); // Try to decrypt, thus showing it can be round-tripped. var algorithm = new RijndaelManaged(); algorithm.Key = key.GetBytes(16); algorithm.IV = key.GetBytes(16); using (var sourceStream = new MemoryStream(cipherText)) using (var destinationStream = new MemoryStream()) using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read)) { moveBytes(crypto, destinationStream); var decryptedBytes = destinationStream.ToArray(); var decryptedMessage = new UnicodeEncoding().GetString( decryptedBytes); MessageBox.Show(decryptedMessage); } }
對稱式加密的一大缺點是密鑰的管理與分配,換句話說,如何把密鑰發送到需要解密你的訊息的人的手裡是一個問題。在發送密鑰的過程中,密鑰有很大的風險會被駭客們攔截。現實中通常的做法是將對稱式加密的密鑰進行非對稱式加密,然後傳送給需要它的人。
(二)非對稱式加密(Asymmetric Cryptography)
非對稱式加密為資料的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公開金鑰(public key)和私密金鑰(private key)。私密金鑰只能由一方安全保管,不能外泄,而公開金鑰則可以發給任何請求它的人。非對稱式加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公開金鑰,銀行將公開金鑰發給你,你使用公開金鑰對訊息加密,那麼只有私密金鑰的持有人--銀行才能對你的訊息解密。與對稱式加密不同的是,銀行不需要將私密金鑰通過網路發送出去,因此安全性大大提高。
目前最常用的非對稱式加密演算法是RSA演算法,是Rivest, Shamir, 和Adleman於1978年發明,他們那時都是在MIT。.NET中也有RSA演算法,請看下面的例子:
加密過程:
private byte[] rsaCipherText; private void mnuAsymmetricEncryption_Click(object sender, RoutedEventArgs e) { var rsa = 1; // Encrypt the data. var cspParms = new CspParameters(rsa); cspParms.Flags = CspProviderFlags.UseMachineKeyStore; cspParms.KeyContainerName = "My Keys"; var algorithm = new RSACryptoServiceProvider(cspParms); var sourceBytes = new UnicodeEncoding().GetBytes(myData); rsaCipherText = algorithm.Encrypt(sourceBytes, true); MessageBox.Show(String.Format("Data: {0}{1}Encrypted and Encoded: {2}", myData, Environment.NewLine, Convert.ToBase64String(rsaCipherText))); }
解密過程:
private void mnuAsymmetricDecryption_Click(object sender, RoutedEventArgs e) { if(rsaCipherText==null) { MessageBox.Show("Encrypt First!"); return; } var rsa = 1; // decrypt the data. var cspParms = new CspParameters(rsa); cspParms.Flags = CspProviderFlags.UseMachineKeyStore; cspParms.KeyContainerName = "My Keys"; var algorithm = new RSACryptoServiceProvider(cspParms); var unencrypted = algorithm.Decrypt(rsaCipherText, true); MessageBox.Show(new UnicodeEncoding().GetString(unencrypted)); }
雖然非對稱式加密很安全,但是和對稱式加密比起來,它非常的慢,所以我們還是要用對稱式加密來傳送訊息,但對稱式加密所使用的密鑰我們可以通過非對稱式加密的方式發送出去。為瞭解釋這個過程,請看下面的例子:
(1) Alice需要在銀行的網站做一筆交易,她的瀏覽器首先產生了一個隨機數作為對稱金鑰。
(2) Alice的瀏覽器向銀行的網站請求公開金鑰。
(3) 銀行將公開金鑰發送給Alice。
(4) Alice的瀏覽器使用銀行的公開金鑰將自己的對稱金鑰密碼編譯。
(5) Alice的瀏覽器將加密後的對稱金鑰發送給銀行。
(6) 銀行使用私密金鑰解密得到Alice瀏覽器的對稱金鑰。
(7) Alice與銀行可以使用對稱金鑰來對溝通的內容進行加密與解密了。
(三)總結
(1) 對稱式加密加密與解密使用的是同樣的密鑰,所以速度快,但由於需要將密鑰在網路傳輸,所以安全性不高。
(2) 非對稱式加密使用了一對密鑰,公開金鑰與私密金鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對稱式加密的密鑰使用非對稱式加密的公開金鑰進行加密,然後發送出去,接收方使用私密金鑰進行解密得到對稱式加密的密鑰,然後雙方可以使用對稱式加密來進行溝通。
轉載:http://www.cnblogs.com/jfzhu/p/4020928.html
軟體對稱式加密與非對稱式加密