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

掃一掃
關注微信公眾號

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

介紹

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

注意:雖然大多數托管代碼里的加密類實現使用了很多CryptoAPI庫。

SymmetricAlgorithms基礎

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

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

●對稱加密的一個風險是密碼應該讓第二個人知道(這個人必須用你的密鑰來解密數據)。

●這種加密算法是基于簡單的數學操作,因此它工作的非常快。因此當你要加密的數據量非常大的時候它是最好的選擇。

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

●一旦用戶定義了密鑰。黑客可以使用暴力破解或者字典來編碼或者解密你的信息。但是長的密鑰可以在黑客破解你的密碼的時候保護你的數據更長的時間。

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

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

對稱算法和對稱算法類

下面是對稱算法和他們的類的關鍵信息。

算法名稱 算法類(抽象) 有效密鑰大小(Bit) 默認密鑰大小(Bit) 默認實現類

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。并且你可以看到每個類都支持不同的密鑰大小。相同的情況下,他們也支持不同的初始化向量的大小。正如我剛才所說的他們所有的類都是抽象類,因此我們不能直接創建這些抽象類的任何實例。但是SymmetricAlgorithm類(也是抽象類)有一個共享的方法叫Create可以不用操心它是如何實現來創建一個類的具體實例。意思是,你可以通過下面的方式使用它。

RC2 mRC2 = RC2.Create();

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

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

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

上面的機制看起來很有用。我們可以用同樣的方法使用我們自己的算法定義自己的類。但是要想這樣,我們必須要對machine.config文件作一些小的改動。我在這里不詳細描述。你可以參考Wrox關于密碼學的書得到更多的信息。

現在讓我們看看SymmetricAlgorithm類里面的一些方法和屬性。

●BlockSize:分開處理的數據塊的大小。大的數據將被分成小的數據塊來處理,如果數據小于塊大小,則被追加(使用一些默認值填充)。

●Key:在處理數據的時候將要使用密鑰。這個密鑰被配置成使用字節數組。

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

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

●LegalBlockSize: 返回BlockSize的枚舉告訴你判斷包括最大值,最小值和跳躍值在內的塊的大小。跳躍值意思是還有多少值應該添加判斷值得到下一個值。比如如果最小值是32,跳躍值是16那么下一個判斷值就是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: 位操作得到或者設置模式。見上面描述。值是CipherMode枚舉中的一個。

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

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

●Create: 上面已經描述,使用它創建默認算法實現的類的實例。

●CreateEncryptor: 返回一個可以手動加密數據的IcryptoTransform對象。一會將仔細描述。

●CreateDecryptor: 返回一個可以手動解密數據的IcryptoTransform對象。一會將仔細描述。

●GeneratrKey and GenerateIV: 在加密或者解密的過程中如果Key和IV是null則這些方法可以產生默認的密鑰和IV。

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

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

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

CreateEncryptor和CreateDecryptor

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

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

ICryptoTransform mTransform = mCrypt.CreateEncryptot();

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

CryptoStream類

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

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

IcryptoTransform mTransform = mCrypt.CreateEncryptor();

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

fileStream是請求從硬盤或者內存中讀取數據的原始文件的流(或者是MemoryStream)。現在通過使用mStream對象和StreamReader/StreamWriter對象讀寫數據。當你將要讀寫時,你的加密解密信息將依賴IcryptoTransform對象。

代碼例子

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

SymmetricAlgorithm mCryptProv;

MemoryStream mMemStr;

// 加密txtData中的數據,然后將加密結果用MessageBox顯示并且回寫到TextBox中

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

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

// 加密數據將要以流的形式存儲在內存中因此我們需要內存Stream對象

mMemStr = new MemoryStream();

// 創建ICryptTransform對象.(在這里我們使用默認的密鑰和初始向量).

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();

有一件事情在這里需要注意我們沒有在代碼的任何地方使用IV和密鑰。事實上,在我們在代碼里面沒有指定他們的時候.NET Framework將為我們自動產生。但是本文包含的例子代碼使用的是用戶指定的密鑰和IV。我們將加密以后的數據使用MemoryStream寫到內存中。現在讓我們從內存中得到數據的代碼。

// 數據已經寫入內存但是我們需要回顯它到TextBox和MessageBox中,因此要做下面的工作。

// 為接受數據創建字節數組。

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(“加密數據為:\n”+mEncData);

This.txtData.Text = mEncData;

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

// 現在讓我們從內存中得到解密后的數據

// 因為我們的數據在內存中,所以我們需要重新使用MemoryStream對象。

// 將內存點置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(“解密數據為:\n”+mDecData);

This.txtData.Text = mDecData;

這是所有的工作。解密那些數據我們使用了相同的內存流。為了能從流的其實部分讀數據我們首先將它置為開始。然后我們用SymmetricAlgorithm對象的CreateDecryptor方法創建IcryptoTransform對象。我們在上面的代碼中為了解密重復使用了對象(mMemStr)。你可以創建新的對象(使用新的變量)。然后我們為了從內存中讀取數據需要StreamReader對象。While reading that it will also decrypt that data since we passed CryptoStream object during the creation of StreamReader object.

最后的話

.NET為我們提供了一個非常好的托管途徑保護我們的數據。我們可以使用.NET內建的一組類來加密我們的數據。雖然很多的類后臺依然使用Crypto APIs技術,我們使用老的Crypto APIs沒有任何問題。但是我們可以不用擔心那些類的具體實現來安全的使用這些類。在后面的文章我將描述非對稱加密算法的神話和用途。

關于例子

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


熱詞搜索:

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

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
国产日韩欧美一区二区三区在线观看| 亚洲激情啪啪| 国产精品揄拍500视频| 国产亚洲亚洲| 久久激情综合网| 国产精品一区二区三区久久久| 亚洲免费激情| 久久久精品2019中文字幕神马| 国产精品一区久久久久| 亚洲永久免费| 欧美亚州一区二区三区| 亚洲午夜一二三区视频| 国产精品乱子久久久久| 欧美一区二区国产| 一区二区在线看| 欧美经典一区二区| 亚洲性感激情| 精品99一区二区三区| 免费观看成人网| 亚洲免费小视频| 亚洲国内精品在线| 国产精品欧美日韩久久| 久久久亚洲国产天美传媒修理工| 亚洲婷婷综合久久一本伊一区| 亚洲第一综合天堂另类专| 国产精一区二区三区| 欧美三级午夜理伦三级中文幕| 欧美高清影院| 免费91麻豆精品国产自产在线观看| 久久精品一区二区三区不卡牛牛| 亚洲小少妇裸体bbw| 亚洲一区二区三区四区在线观看| 一区二区三区四区在线| 一本色道**综合亚洲精品蜜桃冫 | 亚洲第一久久影院| 在线不卡免费欧美| 亚洲激情视频在线观看| 亚洲美女尤物影院| 亚洲欧美日韩精品| 久久久综合视频| 欧美精品久久久久久久| 国产欧美视频一区二区| 国产精品盗摄久久久| 国产精品老牛| 在线精品国产成人综合| 亚洲精品色婷婷福利天堂| 99亚洲精品| 欧美一区二区国产| 免费看黄裸体一级大秀欧美| 欧美精品激情| 99天天综合性| 午夜久久久久久久久久一区二区| 海角社区69精品视频| 欧美一区二区在线视频| 国产一区二区三区奇米久涩| 国模叶桐国产精品一区| 91久久在线视频| 午夜精品视频在线观看| 女同一区二区| 国产欧美日韩一级| 亚洲高清在线精品| 中文国产成人精品| 久久久国产亚洲精品| 欧美日韩在线高清| 国产一区二区视频在线观看| 一区二区三欧美| 久久伊人免费视频| 国产一区二区日韩| 另类亚洲自拍| 国产午夜亚洲精品不卡| 亚洲午夜电影在线观看| 欧美日韩在线亚洲一区蜜芽| 亚洲国语精品自产拍在线观看| 久久成人精品电影| 黄色成人在线网址| 亚洲一区二区黄色| 欧美精品在线视频| 最近中文字幕日韩精品| 久久久精品五月天| 国产偷国产偷亚洲高清97cao| 亚洲一区久久| 国产亚洲日本欧美韩国| 久久午夜电影网| 美女精品在线| 国产精品成人一区二区三区夜夜夜| 午夜在线电影亚洲一区| 亚洲人妖在线| 最新日韩精品| 国产精品国产三级国产aⅴ浪潮| 欧美亚洲一区二区在线观看| 亚洲国产精品精华液网站| 欧美性猛交一区二区三区精品| 亚洲欧美视频在线| 亚洲国产精品ⅴa在线观看| 国产精品xxxxx| 久久久久久久精| 日韩视频精品在线观看| 国产精品久久久久久久7电影| 性欧美在线看片a免费观看| 国内自拍一区| 国产精品免费区二区三区观看| 久久女同互慰一区二区三区| 亚洲国产精品成人精品| 久久噜噜亚洲综合| 亚洲综合99| 亚洲小视频在线| 亚洲人成网站在线播| 国产精品视频一区二区三区 | 久久综合久久久| av成人毛片| 在线国产精品播放| 国产欧美日韩精品专区| 欧美视频在线观看一区| 欧美高清视频在线播放| 久热精品视频在线免费观看| 亚洲国产91| 精久久久久久| 国产在线精品一区二区夜色| 欧美视频三区在线播放| 欧美激情片在线观看| 欧美成人国产一区二区| 蜜臀av性久久久久蜜臀aⅴ| 老司机精品久久| 欧美日韩高清免费| 国产精品福利久久久| 国产有码在线一区二区视频| 亚洲国产精品第一区二区三区| 亚洲免费电影在线| 99在线精品视频| 日韩一级在线观看| 一区二区日韩免费看| 亚洲免费av观看| 久久av一区二区三区漫画| 女主播福利一区| 国产精品大片| 韩国一区二区三区美女美女秀| 激情视频一区二区| 一二三区精品| 久久先锋影音av| 国产精品v欧美精品v日韩| 国产一区二区在线观看免费播放| 亚洲欧洲日韩综合二区| 久久精品卡一| 久久久久欧美精品| 欧美日韩国产免费观看| 国产日韩精品久久| 日韩一二三区视频| 久久三级福利| 国产精品一区二区三区成人| 亚洲国产福利在线| 久久久精品2019中文字幕神马| 欧美激情偷拍| 狠狠噜噜久久| 欧美成人精品在线观看| 国产在线精品一区二区夜色| 亚洲精品国产精品久久清纯直播| 欧美一区二区三区免费看| 欧美激情一区二区三区| 亚洲第一视频| 看欧美日韩国产| 樱花yy私人影院亚洲| 欧美在线观看你懂的| 国产午夜精品全部视频播放| 亚洲一区二区av电影| 欧美日韩你懂的| 亚洲少妇自拍| 国产乱码精品一区二区三| 亚洲欧美日韩精品一区二区| 欧美三级不卡| 性做久久久久久免费观看欧美 | 亚洲国内高清视频| 久久久亚洲国产天美传媒修理工| 国产情侣一区| 免费日韩视频| 999在线观看精品免费不卡网站| 欧美日本不卡| 久久av免费一区| 亚洲欧洲在线看| 欧美日精品一区视频| 欧美亚洲三区| 亚洲高清自拍| 国产精品视频你懂的| 久久国产88| 艳女tv在线观看国产一区| 国产农村妇女精品一二区| 久久久噜久噜久久综合| 99亚洲视频| 一色屋精品视频免费看| 欧美三区免费完整视频在线观看| 久久精品欧美日韩精品| 一本到高清视频免费精品| 国产日韩欧美三级| 欧美日韩伦理在线免费| 久久精品国产久精国产一老狼| 亚洲黄色成人久久久| 国产精品美女久久久久久2018| 久久久天天操| 久久精品女人的天堂av| 在线视频精品一区| 亚洲国产日日夜夜|