欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#對(duì)稱加密與非對(duì)稱加密實(shí)例

 更新時(shí)間:2014年10月22日 10:08:09   投稿:shichen2014  
這篇文章主要介紹了C#對(duì)稱加密與非對(duì)稱加密實(shí)例,詳細(xì)分析了對(duì)稱加密與非對(duì)稱加密的原理與具體實(shí)現(xiàn)方法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C#對(duì)稱加密與非對(duì)稱加密的原理與實(shí)現(xiàn)方法,分享給大家供大家參考。具體分析如下:

一、對(duì)稱加密(Symmetric Cryptography)

對(duì)稱加密是最快速、最簡(jiǎn)單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對(duì)稱加密有很多種算法,由于它效率很高,所以被廣泛使用在很多加密協(xié)議的核心當(dāng)中。

對(duì)稱加密通常使用的是相對(duì)較小的密鑰,一般小于256 bit。因?yàn)槊荑€越大,加密越強(qiáng),但加密與解密的過(guò)程越慢。如果你只用1 bit來(lái)做這個(gè)密鑰,那黑客們可以先試著用0來(lái)解密,不行的話就再用1解;但如果你的密鑰有1 MB大,黑客們可能永遠(yuǎn)也無(wú)法破解,但加密和解密的過(guò)程要花費(fèi)很長(zhǎng)的時(shí)間。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個(gè)trade-off。

2000年10月2日,美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael算法作為新的高級(jí)加密標(biāo)準(zhǔn)(AES--Advanced Encryption Standard)。.NET中包含了Rijndael算法,類名叫RijndaelManaged,下面舉個(gè)例子。

加密過(guò)程:

復(fù)制代碼 代碼如下:
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);
    }
}

解密過(guò)程:

復(fù)制代碼 代碼如下:
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);
    }
}

對(duì)稱加密的一大缺點(diǎn)是密鑰的管理與分配,換句話說(shuō),如何把密鑰發(fā)送到需要解密你的消息的人的手里是一個(gè)問(wèn)題。在發(fā)送密鑰的過(guò)程中,密鑰有很大的風(fēng)險(xiǎn)會(huì)被黑客們攔截?,F(xiàn)實(shí)中通常的做法是將對(duì)稱加密的密鑰進(jìn)行非對(duì)稱加密,然后傳送給需要它的人。

二、非對(duì)稱加密(Asymmetric Cryptography)

非對(duì)稱加密為數(shù)據(jù)的加密與解密提供了一個(gè)非常安全的方法,它使用了一對(duì)密鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發(fā)給任何請(qǐng)求它的人。非對(duì)稱加密使用這對(duì)密鑰中的一個(gè)進(jìn)行加密,而解密則需要另一個(gè)密鑰。比如,你向銀行請(qǐng)求公鑰,銀行將公鑰發(fā)給你,你使用公鑰對(duì)消息加密,那么只有私鑰的持有人--銀行才能對(duì)你的消息解密。與對(duì)稱加密不同的是,銀行不需要將私鑰通過(guò)網(wǎng)絡(luò)發(fā)送出去,因此安全性大大提高。

目前最常用的非對(duì)稱加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年發(fā)明,他們那時(shí)都是在MIT。.NET中也有RSA算法,請(qǐng)看下面的例子:

加密過(guò)程:

復(fù)制代碼 代碼如下:
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)));
}

解密過(guò)程:

復(fù)制代碼 代碼如下:
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));
}

雖然非對(duì)稱加密很安全,但是和對(duì)稱加密比起來(lái),它非常的慢,所以我們還是要用對(duì)稱加密來(lái)傳送消息,但對(duì)稱加密所使用的密鑰我們可以通過(guò)非對(duì)稱加密的方式發(fā)送出去。為了解釋這個(gè)過(guò)程,請(qǐng)看下面的例子:

① Alice需要在銀行的網(wǎng)站做一筆交易,她的瀏覽器首先生成了一個(gè)隨機(jī)數(shù)作為對(duì)稱密鑰。

② Alice的瀏覽器向銀行的網(wǎng)站請(qǐng)求公鑰。

③ 銀行將公鑰發(fā)送給Alice。

④ Alice的瀏覽器使用銀行的公鑰將自己的對(duì)稱密鑰加密。

⑤ Alice的瀏覽器將加密后的對(duì)稱密鑰發(fā)送給銀行。

⑥ 銀行使用私鑰解密得到Alice瀏覽器的對(duì)稱密鑰。

⑦ Alice與銀行可以使用對(duì)稱密鑰來(lái)對(duì)溝通的內(nèi)容進(jìn)行加密與解密了。

三、總結(jié)

① 對(duì)稱加密加密與解密使用的是同樣的密鑰,所以速度快,但由于需要將密鑰在網(wǎng)絡(luò)傳輸,所以安全性不高。

② 非對(duì)稱加密使用了一對(duì)密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。

③ 解決的辦法是將對(duì)稱加密的密鑰使用非對(duì)稱加密的公鑰進(jìn)行加密,然后發(fā)送出去,接收方使用私鑰進(jìn)行解密得到對(duì)稱加密的密鑰,然后雙方可以使用對(duì)稱加密來(lái)進(jìn)行溝通。

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C# 繪制統(tǒng)計(jì)圖大全(柱狀圖, 折線圖, 扇形圖)

    C# 繪制統(tǒng)計(jì)圖大全(柱狀圖, 折線圖, 扇形圖)

    本篇文章介紹了C# 繪制統(tǒng)計(jì)圖大全,其中包括狀圖, 折線圖, 扇形圖,有需要的同學(xué)可以了解一下。
    2016-11-11
  • C#通過(guò)創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法詳解

    C#通過(guò)創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法詳解

    這篇文章主要介紹了C#通過(guò)創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法,較為詳細(xì)的分析了C#創(chuàng)建Windows服務(wù)應(yīng)用程序的步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • Unity3D Shader實(shí)現(xiàn)鏡子效果

    Unity3D Shader實(shí)現(xiàn)鏡子效果

    這篇文章主要為大家詳細(xì)介紹了Unity3D Shader實(shí)現(xiàn)鏡子效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決

    Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決

    今天在做個(gè)東西,發(fā)現(xiàn)報(bào)錯(cuò),特此來(lái)記錄一下,本文介紹了Unity報(bào)錯(cuò)InvalidOperationException: out of sync的解決,感興趣的可以了解一下
    2021-05-05
  • 淺談C#中Process類的使用詳解

    淺談C#中Process類的使用詳解

    本篇文章是對(duì)C#中Process類的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#讀取二進(jìn)制文件方法分析

    C#讀取二進(jìn)制文件方法分析

    這篇文章主要介紹了C#讀取二進(jìn)制文件方法,較為詳細(xì)的分析了C#讀取二進(jìn)制文件的原理與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • C#中數(shù)組、ArrayList、List、Dictionary的用法與區(qū)別淺析(存取數(shù)據(jù))

    C#中數(shù)組、ArrayList、List、Dictionary的用法與區(qū)別淺析(存取數(shù)據(jù))

    在工作中經(jīng)常遇到C#數(shù)組、ArrayList、List、Dictionary存取數(shù)據(jù),但是該選擇哪種類型進(jìn)行存儲(chǔ)數(shù)據(jù)呢?很迷茫,今天小編抽空給大家整理下這方面的內(nèi)容,需要的朋友參考下吧
    2017-02-02
  • C# WPF ListView控件的實(shí)例詳解

    C# WPF ListView控件的實(shí)例詳解

    這篇文章主要介紹了C# WPF ListView控件的實(shí)例詳解的相關(guān)資料,希望通過(guò)本能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • c#高效比對(duì)大量圖片的實(shí)例代碼

    c#高效比對(duì)大量圖片的實(shí)例代碼

    以前傳統(tǒng)的比較方式是遍歷圖片中的每一個(gè)像素,然后進(jìn)行比對(duì)。這樣的比對(duì)在少量圖片的比對(duì)上雖然效率低一點(diǎn),但是也沒(méi)有什么不好。但是在大量圖片比對(duì)的時(shí)候,過(guò)長(zhǎng)的反應(yīng)時(shí)間和對(duì)服務(wù)器比較高的消耗肯定是不行的,下面介紹下新的方法
    2013-10-10
  • C#基礎(chǔ)知識(shí)之GetType與typeof的區(qū)別小結(jié)

    C#基礎(chǔ)知識(shí)之GetType與typeof的區(qū)別小結(jié)

    在比較對(duì)象時(shí),需要了解他們的類型,才能決定他們的值是否能比較。所有的類都從System.Object中繼承了GetType()方法,常常與typeo()運(yùn)算符一起使用。這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識(shí)之GetType與typeof區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-06-06

最新評(píng)論