在.NET之前,使用非托管的Win32APIs加密解密數據是一件非常痛苦的事情。為了這個加密解密的目的,.NET配置了一組類(和命名空間)。現在你有很多類可以使用每種不同的算法保護你的數據。在.NET裡面Crypttography命名空間下又定義了3種類型的加密方法。他們是AsymmetricAlgorithm,SymmetricAlgorithm和HashAlgorithm。所有的這些類(和.NET密碼學類型)都是抽象類。我們今天將要描述SymmetricAlgorithm。剩下的將在以後的文章中陸續講解。
注意:雖然大多數托管代碼裡的加密類實現使用了很多CryptoAPI庫。
對稱算法使用用戶的密鑰(密碼)工作。它的意思是,任何時候你都可以實現它而且可以使用對稱算法加密或者解密你的數據,為了加密或者解密你的數據你必須定義一個密碼或者一個密鑰。下面描述了對稱加密的特性。
另外在使用密鑰或者密碼對稱加密過程中有一件非常重要的事情。就是初始化向量(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類裡面的一些方法和屬性。
在寫代碼之前,讓我們說幾件對我們理解代碼非常用幫助的事情。
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和密鑰。