C#對稱加密與非對稱加密實例。本站提示廣大學習愛好者:(C#對稱加密與非對稱加密實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#對稱加密與非對稱加密實例正文
本文實例講述了C#對稱加密與非對稱加密的道理與完成辦法,分享給年夜家供年夜家參考。詳細剖析以下:
1、對稱加密(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);
}
}
對稱加密的一年夜缺陷是密鑰的治理與分派,換句話說,若何把密鑰發送到須要解密你的新聞的人的手裡是一個成績。在發送密鑰的進程中,密鑰有很年夜的風險會被黑客們攔阻。實際中平日的做法是將對稱加密的密鑰停止非對稱加密,然後傳送給須要它的人。
2、非對稱加密(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));
}
固然非對稱加密很平安,然則和對稱加密比起來,它異常的慢,所以我們照樣要用對稱加密來傳送新聞,但對稱加密所應用的密鑰我們可以經由過程非對稱加密的方法發送出去。為懂得釋這個進程,請看上面的例子:
① Alice須要在銀行的網站做一筆生意業務,她的閱讀器起首生成了一個隨機數作為對稱密鑰。
② Alice的閱讀器向銀行的網站要求公鑰。
③ 銀即將公鑰發送給Alice。
④ Alice的閱讀器應用銀行的公鑰將本身的對稱密鑰加密。
⑤ Alice的閱讀器將加密後的對稱密鑰發送給銀行。
⑥ 銀行應用私鑰解密獲得Alice閱讀器的對稱密鑰。
⑦ Alice與銀行可使用對稱密鑰來對溝通的內容停止加密與解密了。
3、總結
① 對稱加密加密與解密應用的是異樣的密鑰,所以速度快,但因為須要將密鑰在收集傳輸,所以平安性不高。
② 非對稱加密應用了一對密鑰,公鑰與私鑰,所以平安性高,但加密與解密速度慢。
③ 處理的方法是將對稱加密的密鑰應用非對稱加密的公鑰停止加密,然後發送出去,吸收方應用私鑰停止解密獲得對稱加密的密鑰,然後兩邊可使用對稱加密來停止溝通。
願望本文所述對年夜家的C#法式設計有所贊助。