国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

NET中的密鑰(密碼)學(xué)--對(duì)稱加密
2005-12-07   

介紹

在.NET之前,使用非托管的Win32APIs加密解密數(shù)據(jù)是一件非常痛苦的事情。為了這個(gè)加密解密的目的,.NET配置了一組類(和命名空間)。現(xiàn)在你有很多類可以使用每種不同 的算法保護(hù)你的數(shù)據(jù)。在.NET里面Crypttography命名空間下又定義了3種類型的加密方法。他們是AsymmetricAlgorithm,SymmetricAlgorithm和HashAlgorithm。所有的這些類(和.NET密碼學(xué)類型)都是抽象類。我們今天將要描述SymmetricAlgorithm。剩下的將在以后的文章中陸續(xù)講解。

注意:雖然大多數(shù)托管代碼里的加密類實(shí)現(xiàn)使用了很多CryptoAPI庫(kù)。

SymmetricAlgorithms基礎(chǔ)

對(duì)稱算法使用用戶的密鑰(密碼)工作。它的意思是,任何時(shí)候你都可以實(shí)現(xiàn)它而且可以使用對(duì)稱算法加密或者解密你的數(shù)據(jù),為了加密或者解密你的數(shù)據(jù)你必須定義一個(gè)密碼或者一個(gè)密鑰。下面描述了對(duì)稱加密的特性。

●加密的強(qiáng)度依賴于你的密鑰(密碼)。如果你配置一個(gè)長(zhǎng)的密鑰,它將是非常難破解的。意思是他將要花費(fèi)很長(zhǎng)的時(shí)間讓黑客找到密鑰。

●對(duì)稱加密的一個(gè)風(fēng)險(xiǎn)是密碼應(yīng)該讓第二個(gè)人知道(這個(gè)人必須用你的密鑰來(lái)解密數(shù)據(jù))。

●這種加密算法是基于簡(jiǎn)單的數(shù)學(xué)操作,因此它工作的非常快。因此當(dāng)你要加密的數(shù)據(jù)量非常大的時(shí)候它是最好的選擇。

●基于對(duì)稱的加密可以被黑客暴力破解。但是如果你定義一個(gè)非常好的密碼(足夠長(zhǎng)),這個(gè)破解的過(guò)程將需要很長(zhǎng)的時(shí)間。

●一旦用戶定義了密鑰。黑客可以使用暴力破解或者字典來(lái)編碼或者解密你的信息。但是長(zhǎng)的密鑰可以在黑客破解你的密碼的時(shí)候保護(hù)你的數(shù)據(jù)更長(zhǎng)的時(shí)間。

另外在使用密鑰或者密碼對(duì)稱加密過(guò)程中有一件非常重要的事情。就是初始化向量(IV)。IV被使用在最初的編碼中(加密或者解密)。在所有的對(duì)稱算法類中我們有一個(gè)名叫Mode的屬性。這是被IV使用的。如果我們?cè)O(shè)置Mode屬性為CipherMode.CBC(Cipher Block Chaining),則使用這個(gè)模式,每個(gè)數(shù)據(jù)塊使用來(lái)自前一個(gè)塊的值來(lái)處理。意思是如果系統(tǒng)在處理第三塊數(shù)據(jù),則它會(huì)從第二塊中取一些信息(處理第三塊數(shù)據(jù))。接著它會(huì)取第一塊數(shù)據(jù)中的信息用來(lái)處理第二塊數(shù)據(jù)。但是在第一塊數(shù)據(jù)之前沒(méi)有可以用的塊,因此它將使用IV來(lái)處理第一塊。這個(gè)技術(shù)確保沒(méi)有兩個(gè)相同的塊產(chǎn)生相同的輸出并且因此使得數(shù)據(jù)更安全。然而如果你使Mode=CipherModer.ECB(Electronic codebook mode),則他不會(huì)使用上面的方法(使用前面的處理的塊信息處理后面的塊)。如果你想用很少的資源和時(shí)間處理大量的消息那么這個(gè)方法對(duì)于你來(lái)說(shuō)就很有用。他也可以讓你從數(shù)據(jù)的中間開(kāi)始處理。

應(yīng)此,上面我們包含了在對(duì)稱加密中的兩間非常重要的事情。他們是密鑰和初始化向量。現(xiàn)在讓我們看看對(duì)稱加密支持哪些算法。

對(duì)稱算法和對(duì)稱算法類

下面是對(duì)稱算法和他們的類的關(guān)鍵信息。

算法名稱 算法類(抽象) 有效密鑰大小(Bit) 默認(rèn)密鑰大小(Bit) 默認(rèn)實(shí)現(xiàn)類

DES DES 64 64 DESCryptoServiceProvider

TripleDES TripleDES 128, 192 192 TripleDESCryptoServiceProvider

RC2 RC2 40-128 128 RC2CryptoServiceProvider

RijnDael RijnDael 128, 192, 256 256 RijnDaelManaged

這里需要注意的是所有的算法類都是繼承于抽象類SymmetricAlgorithm。并且你可以看到每個(gè)類都支持不同的密鑰大小。相同的情況下,他們也支持不同的初始化向量的大小。正如我剛才所說(shuō)的他們所有的類都是抽象類,因此我們不能直接創(chuàng)建這些抽象類的任何實(shí)例。但是SymmetricAlgorithm類(也是抽象類)有一個(gè)共享的方法叫Create可以不用操心它是如何實(shí)現(xiàn)來(lái)創(chuàng)建一個(gè)類的具體實(shí)例。意思是,你可以通過(guò)下面的方式使用它。

RC2 mRC2 = RC2.Create();

它將為您返回一個(gè)RC2默認(rèn)實(shí)現(xiàn)的一個(gè)實(shí)例,而不用去關(guān)心具體如何實(shí)現(xiàn)RC2這個(gè)類。如果你想在微軟以后更新RC2類的實(shí)現(xiàn)還能共享代碼(成為可能),這個(gè)技術(shù)是非常有用的。在那種情況下,你的代碼將自動(dòng)適應(yīng)它們的改變并且正確的工作。或者可能在將來(lái)RC2類用托管代碼寫,你的代碼依然可以接受它。在相同的情況下,你同樣可以使用下面的語(yǔ)句。

RC2 mCrypto = SymmetricAlgorithm.Create(“RC2”);

這也可以給你返回一個(gè)RC2的對(duì)象(默認(rèn)實(shí)現(xiàn))。在這種情況下你要使用重裁Create方法用算法的名字設(shè)置參數(shù)來(lái)返回算法的對(duì)象。 這個(gè)Create方法來(lái)自SymmetricAlgorithm類,并且向我前面說(shuō)的所有的使用對(duì)稱算法的其它類都繼承于SymmetricAlgorithm,因此你可以在上面所有的類里面找到Create這個(gè)方法。意思是如果你使用RC2.Create(“DES”)則它也能工作并且將返回一個(gè)DES的對(duì)象。但是不能使用RC2類得到DES對(duì)象。

上面的機(jī)制看起來(lái)很有用。我們可以用同樣的方法使用我們自己的算法定義自己的類。但是要想這樣,我們必須要對(duì)machine.config文件作一些小的改動(dòng)。我在這里不詳細(xì)描述。你可以參考Wrox關(guān)于密碼學(xué)的書得到更多的信息。

現(xiàn)在讓我們看看SymmetricAlgorithm類里面的一些方法和屬性。

●BlockSize:分開(kāi)處理的數(shù)據(jù)塊的大小。大的數(shù)據(jù)將被分成小的數(shù)據(jù)塊來(lái)處理,如果數(shù)據(jù)小于塊大小,則被追加(使用一些默認(rèn)值填充)。

●Key:在處理數(shù)據(jù)的時(shí)候?qū)⒁褂妹荑€。這個(gè)密鑰被配置成使用字節(jié)數(shù)組。

●IV:數(shù)據(jù)處理的時(shí)候使用初始化向量(上面已經(jīng)描述)。配置成字節(jié)數(shù)組。

●KeySize:密鑰的所有位的大小。

●LegalBlockSize: 返回BlockSize的枚舉告訴你判斷包括最大值,最小值和跳躍值在內(nèi)的塊的大小。跳躍值意思是還有多少值應(yīng)該添加判斷值得到下一個(gè)值。比如如果最小值是32,跳躍值是16那么下一個(gè)判斷值就是48,64等等。(Returns the BlockSize Enumeration which tells you legal values for block size including max value, min value and Skip value. Skip value means that how much value should be added to last legal value to get next value. Like if min value is 32 and Skipvalue is 16, it means next legal values will be 48, 64 and so on.)

●Mode: 位操作得到或者設(shè)置模式。見(jiàn)上面描述。值是CipherMode枚舉中的一個(gè)。

●Padding: 得到或者設(shè)置PaddingMode枚舉中的一個(gè)追加值。(填充塊中空余的區(qū)域)

●LegalKeySize: 和LegalBlockSize一樣,但是處理的是KeySize。

●Create: 上面已經(jīng)描述,使用它創(chuàng)建默認(rèn)算法實(shí)現(xiàn)的類的實(shí)例。

●CreateEncryptor: 返回一個(gè)可以手動(dòng)加密數(shù)據(jù)的IcryptoTransform對(duì)象。一會(huì)將仔細(xì)描述。

●CreateDecryptor: 返回一個(gè)可以手動(dòng)解密數(shù)據(jù)的IcryptoTransform對(duì)象。一會(huì)將仔細(xì)描述。

●GeneratrKey and GenerateIV: 在加密或者解密的過(guò)程中如果Key和IV是null則這些方法可以產(chǎn)生默認(rèn)的密鑰和IV。

●VaildKeySize: 檢查給定的密鑰是不是算法的有效的密鑰。

●Clear: 清除和消除所有的資源以及象密鑰和IV這樣的內(nèi)存信息。

在寫代碼之前,讓我們說(shuō)幾件對(duì)我們理解代碼非常用幫助的事情。

CreateEncryptor和CreateDecryptor

SymmetricAlgorithm類的CreateEncryptor和CreateDecryptor方法返回ICryptoTransform對(duì)象。IcryptoTransform是一個(gè)想要處理數(shù)據(jù)塊的類來(lái)實(shí)現(xiàn)的接口。這個(gè)過(guò)程可以是加密,解密,散列,基于64的編碼和解碼等等。這個(gè)接口的基本目的是完成數(shù)據(jù)處理分塊(The basic purpose of this Interface is to perform Blockwize processing of data.)。你可以直接使用它的實(shí)例,但是在大多數(shù)情況下,為了方便,我們通過(guò)其他的名叫CryptoStream來(lái)完成。讓我們看一個(gè)例子是如何使用它的。

DES mCrypt = new SymmetricAlgorithm.Create(“DES”);

ICryptoTransform mTransform = mCrypt.CreateEncryptot();

CreateEncryptor或者CreateDecryptor是兩個(gè)重裁的方法。如果你沒(méi)有任何參數(shù)傳入其中,那么將使用默認(rèn)的密鑰和IV(使用SymmetricAlgoruthm類里面的GenerateKey和GenerateIV方法)。另一方面,你可以通過(guò)傳入一個(gè)IV和密鑰到CreateEncryptor和CreateDecryptor的對(duì)象中。以致加密和解密將使用我們自己定義的IV和密鑰。

CryptoStream類

CryptoStream類通常被使用來(lái)讀寫數(shù)據(jù)同時(shí)也在讀或者寫的時(shí)候加密或者解密數(shù)據(jù)。它是簡(jiǎn)單的包裝了一下原始流類Stream。It uses the buffered access taking all worries from you to manage buffer, block sizes, padding etc.你可以使用下面的代碼得到它的實(shí)例。

DES mCrypt = SymmetricAlgorithm.Create(“DES”);

IcryptoTransform mTransform = mCrypt.CreateEncryptor();

CryptoStream mStream = new CryptoStream(fileStream,mTransform,CryptoStramMode.Read)

fileStream是請(qǐng)求從硬盤或者內(nèi)存中讀取數(shù)據(jù)的原始文件的流(或者是MemoryStream)。現(xiàn)在通過(guò)使用mStream對(duì)象和StreamReader/StreamWriter對(duì)象讀寫數(shù)據(jù)。當(dāng)你將要讀寫時(shí),你的加密解密信息將依賴IcryptoTransform對(duì)象。

代碼例子

現(xiàn)在我們有足夠關(guān)于SymmetricAlgorithm的信息。最后,讓我們看看將要編碼和解碼的代碼片斷。我假設(shè)你擁有一個(gè)包含txtData和命令按鈕控件的窗體。在命令按鈕的代碼事件里寫如下代碼。這個(gè)代碼將要加密TextBox里面的文本并用MessageBox顯示,在將加密結(jié)果寫回到TextBox中。

SymmetricAlgorithm mCryptProv;

MemoryStream mMemStr;

// 加密txtData中的數(shù)據(jù),然后將加密結(jié)果用MessageBox顯示并且回寫到TextBox中

// 這里你可以配置任何.NET支持的類

DES mCryptProv = SymmetricAlgorithm.Create(“Rijndael”);

// 加密數(shù)據(jù)將要以流的形式存儲(chǔ)在內(nèi)存中因此我們需要內(nèi)存Stream對(duì)象

mMemStr = new MemoryStream();

// 創(chuàng)建ICryptTransform對(duì)象.(在這里我們使用默認(rèn)的密鑰和初始向量).

ICryptTramsform mTransform = mCryptProv.CreateEncryptor();

CryptoStream mCSWriter = new CryptoStream(mMemStr,mTransform,CryptoStreamMode.Write);

StreamWriter mSWriter = StreamWriter(mCSWriter);

mSwriter.Writer(this.txtData.Text);

mSWriter.Flush();

mCSWriter.FlushFinalBlock();

有一件事情在這里需要注意我們沒(méi)有在代碼的任何地方使用IV和密鑰。事實(shí)上,在我們?cè)诖a里面沒(méi)有指定他們的時(shí)候.NET Framework將為我們自動(dòng)產(chǎn)生。但是本文包含的例子代碼使用的是用戶指定的密鑰和IV。我們將加密以后的數(shù)據(jù)使用MemoryStream寫到內(nèi)存中。現(xiàn)在讓我們從內(nèi)存中得到數(shù)據(jù)的代碼。

// 數(shù)據(jù)已經(jīng)寫入內(nèi)存但是我們需要回顯它到TextBox和MessageBox中,因此要做下面的工作。

// 為接受數(shù)據(jù)創(chuàng)建字節(jié)數(shù)組。

byte[] mBytes = new byte[mMemStr.Length - 1];

mMemStr.Position = 0;

mMemStr.Read(mBytes,0,mMemStr.Length);

Text.UTF8Encoding mEnc = new Text.UTF8Encoding();

String mEncData = mEnc.GetString(mBytes);

MessageBox.Show(“加密數(shù)據(jù)為:\n”+mEncData);

This.txtData.Text = mEncData;

從字節(jié)轉(zhuǎn)換為字符串必須要編碼。在這里我使用了UTF8Encoding。最后,讓我們將解密后的數(shù)據(jù)再次顯示在MessageBox和TextBox中。

// 現(xiàn)在讓我們從內(nèi)存中得到解密后的數(shù)據(jù)

// 因?yàn)槲覀兊臄?shù)據(jù)在內(nèi)存中,所以我們需要重新使用MemoryStream對(duì)象。

// 將內(nèi)存點(diǎn)置0

mMemStr.Position = 0;

mTransform = mCryptProv.CreateDecryptor();

CryptoStream mCSReader = new CryptoStream(mMemStr,mTransform,CryptoStreamMode.Read);

StreamReader mStrReader = new StreamReader(mCSReader);

String mDecData = mStrReader.ReadToEnd();

MessageBox(“解密數(shù)據(jù)為:\n”+mDecData);

This.txtData.Text = mDecData;

這是所有的工作。解密那些數(shù)據(jù)我們使用了相同的內(nèi)存流。為了能從流的其實(shí)部分讀數(shù)據(jù)我們首先將它置為開(kāi)始。然后我們用SymmetricAlgorithm對(duì)象的CreateDecryptor方法創(chuàng)建IcryptoTransform對(duì)象。我們?cè)谏厦娴拇a中為了解密重復(fù)使用了對(duì)象(mMemStr)。你可以創(chuàng)建新的對(duì)象(使用新的變量)。然后我們?yōu)榱藦膬?nèi)存中讀取數(shù)據(jù)需要StreamReader對(duì)象。While reading that it will also decrypt that data since we passed CryptoStream object during the creation of StreamReader object.

最后的話

.NET為我們提供了一個(gè)非常好的托管途徑保護(hù)我們的數(shù)據(jù)。我們可以使用.NET內(nèi)建的一組類來(lái)加密我們的數(shù)據(jù)。雖然很多的類后臺(tái)依然使用Crypto APIs技術(shù),我們使用老的Crypto APIs沒(méi)有任何問(wèn)題。但是我們可以不用擔(dān)心那些類的具體實(shí)現(xiàn)來(lái)安全的使用這些類。在后面的文章我將描述非對(duì)稱加密算法的神話和用途。

關(guān)于例子

該文章的例子代碼讓你可以選擇一個(gè)算法來(lái)加密或者解密數(shù)據(jù)。而且它還讓你指定你自己的IV和密鑰。代碼以兩種方式工作。一種是TextBox,意思是你在TextBox中寫些東西然后加密或者解密這些內(nèi)容。第二種,你可以選擇要加密或者解密的文件。


熱詞搜索:

上一篇:在Web中使用SSL
下一篇:加密是安全的基礎(chǔ)

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
六月丁香婷婷色狠狠久久| 日韩一区二区视频在线观看| 日韩高清欧美激情| 韩国女主播一区| 欧美午夜精品久久久久久超碰| 精品999在线播放| 亚洲超丰满肉感bbw| 色吧成人激情小说| 国产精品女同一区二区三区| 国产在线播精品第三| 欧美日韩国产中文| 亚洲综合偷拍欧美一区色| 一本久久综合亚洲鲁鲁五月天 | 亚洲精品五月天| a4yy欧美一区二区三区| 国产精品美女久久久久av爽李琼| 国产综合色在线视频区| 国产午夜精品一区二区三区嫩草 | 欧美电影精品一区二区 | 欧洲人成人精品| 亚洲精品免费一二三区| 色视频成人在线观看免| 亚洲一区二区视频在线观看| 色老综合老女人久久久| 亚洲午夜激情av| 色老汉一区二区三区| 综合久久久久久| 欧美性生活大片视频| 视频一区欧美精品| 精品裸体舞一区二区三区| 国产精品影视在线| 亚洲欧美在线aaa| 91麻豆国产精品久久| 一区二区三区中文字幕电影 | 国产欧美日韩中文久久| 99国产一区二区三精品乱码| 亚洲第一福利一区| 日韩女同互慰一区二区| 国产成人三级在线观看| 亚洲欧美电影院| 91精品国产欧美一区二区成人| 美女视频一区二区三区| 国产女人水真多18毛片18精品视频| 成人av在线播放网址| 亚洲品质自拍视频| 欧美一区二区三区系列电影| 九九九久久久精品| 一区二区久久久久| 欧美成人精品1314www| 粉嫩一区二区三区性色av| 亚洲综合一二三区| 欧美成人精品高清在线播放| av不卡在线播放| 蜜臀av性久久久久av蜜臀妖精| 国产欧美日韩中文久久| 欧美日韩电影在线播放| 国产伦精品一区二区三区视频青涩| 亚洲免费av网站| 精品区一区二区| 欧美午夜一区二区三区免费大片| 国产一区二三区| 日韩高清一区二区| 亚洲欧美日韩成人高清在线一区| 精品国内二区三区| 欧美猛男男办公室激情| 成人开心网精品视频| 青青国产91久久久久久| 亚洲乱码日产精品bd| 日本一区二区视频在线| 日韩欧美久久一区| 欧美日韩一区精品| 91免费精品国自产拍在线不卡| 国产在线精品一区二区不卡了| 亚洲图片有声小说| 亚洲三级在线看| 亚洲欧洲另类国产综合| 久久久久国产精品免费免费搜索| 欧美精品一二三| 欧美午夜在线一二页| 色婷婷综合中文久久一本| 成人做爰69片免费看网站| 国产一区美女在线| 久草精品在线观看| 国产在线精品国自产拍免费| 免费久久精品视频| 免费人成在线不卡| 日本成人在线网站| 爽爽淫人综合网网站| 亚洲va欧美va人人爽| 午夜精品久久一牛影视| 亚洲福利视频三区| 亚洲大片在线观看| 五月综合激情网| 日韩高清在线观看| 国精产品一区一区三区mba桃花 | 91.xcao| 欧美亚洲国产bt| 欧美日韩国产成人在线91| 在线观看亚洲一区| 777xxx欧美| 日韩女优毛片在线| 精品国产99国产精品| 精品伦理精品一区| 国产日韩精品一区| 亚洲欧美日韩一区二区三区在线观看 | 欧美一区二区私人影院日本| 日韩欧美在线1卡| 久久亚洲精品国产精品紫薇| 久久久91精品国产一区二区三区| 久久精品男人天堂av| 欧美精品一区男女天堂| 中文字幕第一区综合| 亚洲精品久久久蜜桃| 天天色图综合网| 韩国成人在线视频| 97国产精品videossex| 欧美电影在哪看比较好| 91精品麻豆日日躁夜夜躁| 欧美mv和日韩mv国产网站| 久久综合99re88久久爱| 亚洲女同一区二区| 蜜臂av日日欢夜夜爽一区| 成人性生交大片免费看视频在线 | 精品综合久久久久久8888| 99热精品国产| 欧美日韩免费一区二区三区视频| 欧美精品一区二区久久婷婷| 国产精品视频一区二区三区不卡| 亚洲国产精品久久久男人的天堂| 久久91精品国产91久久小草| 97久久超碰国产精品| 91精品国产色综合久久久蜜香臀| 久久精品人人做人人综合| 亚洲国产一区二区在线播放| 国产一区二区看久久| 欧美色精品天天在线观看视频| 国产亚洲欧美中文| 天堂精品中文字幕在线| 成人a级免费电影| 欧美大胆人体bbbb| 亚洲1区2区3区4区| 不卡免费追剧大全电视剧网站| 欧美一区二区三区婷婷月色| 亚洲精品国产精华液| 国产精品一区二区三区乱码| 在线91免费看| 亚洲一区二区三区四区不卡| 成人精品视频一区| 久久久亚洲午夜电影| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品影院一区二区久久久| 欧美日韩精品一区二区三区| 亚洲女与黑人做爰| 成人午夜激情在线| 久久亚洲影视婷婷| 久久99精品国产| 欧美一级黄色大片| 天堂午夜影视日韩欧美一区二区| 91老司机福利 在线| 国产精品黄色在线观看| 国产69精品久久久久777| 久久综合九色欧美综合狠狠| 奇米精品一区二区三区在线观看一 | 日韩亚洲欧美中文三级| 亚洲va在线va天堂| 欧美日韩在线播放一区| 亚洲成人动漫在线观看| 在线视频欧美区| 一区二区三区高清不卡| 色哦色哦哦色天天综合| 亚洲精品成人精品456| 色狠狠综合天天综合综合| 亚洲欧美日本韩国| 色哟哟精品一区| 亚洲aⅴ怡春院| 日韩视频免费观看高清完整版在线观看| 亚洲国产精品麻豆| 91精品久久久久久久99蜜桃| 日本欧美一区二区在线观看| 日韩一区二区三区电影| 国产在线一区二区综合免费视频| 欧美α欧美αv大片| 岛国av在线一区| 一区二区三区中文字幕电影| 欧洲av在线精品| 麻豆91在线播放免费| 精品成人一区二区三区| 懂色av一区二区在线播放| 亚洲欧美国产77777| 欧美日韩中文字幕一区二区| 美女视频第一区二区三区免费观看网站| 亚洲精品在线观看网站| 高潮精品一区videoshd| 一区二区欧美视频| 日韩视频在线永久播放| 成人福利电影精品一区二区在线观看| 亚洲视频在线一区二区| 欧美一卡二卡三卡| av在线播放成人| 日韩不卡一区二区三区|