實現加密和解密的密鑰 要使用對稱算法
必須提供要使用的密鑰
每個 CryptoSymmetricAlgorithm 實現都提供一種 GenerateKey 方法
它們實際上使用的是公共語言運行時 (CLR) 類中內置的隨機數生成器類
我們來看一下 Gen Key(生成密鑰)按鈕的 Click 事件處理程序
看它如何生成要使用的隨機密鑰值
獲取服務提供程序的特定實現後
只需調用 GenerateKey 方法來創建一個用於加密的新的隨機密鑰
密鑰的大小取決於用來加密的特定提供程序
例如
DES 密鑰的大小為
位
而 TripleDES 密鑰的大小為
位
每個 SymmetricAlgorithm 類上都有一個 KeySize 屬性
它將返回用於生成密鑰的密鑰大小
我們還需要生成初始化向量 (IV)
IV 將幫助算法生成最終加密字符串的數據塊
IV 用於開始第一個塊的加密
如果不提供 IV
那麼只要密鑰相同
在字符串之間傳遞的通用數據將保持同一種模式
因此
需要使用 IV 作為加密數據的
隨機
組件
通過這種方式
只要使用的 IV 不同
即使密鑰相同
同一個數據也會被加密成完全不同的值
下面是生成新的 IV 的 Gen IV(生成 IV)按鈕的源代碼
此代碼看起來與生成密鑰的代碼非常相似
每個加密服務提供程序類上都有一個 GenerateIV() 方法
如果未提供 IV
該方法將生成一個 IV
加密數據 獲得密鑰和初始化向量後
現在可以使用 Key
IV 和 Original String 值來創建原始字符串值的加密版本
單擊 Encrypt(加密)按鈕將運行以下代碼
Click 事件過程將調用名為 EncryptString() 的方法
從 Original String(原始字符串)文本框中接受值並對其進行加密
然後返回該值並將其放到 Encrypted String(加密字符串)文本框中
下面是 EncryptString() 方法的代碼
現在我們分開看一下各行代碼並了解這些代碼的作用
首先是加密進程的幾個變量
ICryptoTransform 是一個接口
需要此接口才能在任何服務提供程序上調用 CreateEncryptor 方法
服務提供程序將返回定義該接口的實際 encryptor 對象
然後需要將原始字符串轉換成字節數組
大多數
NET 加密算法處理的是字節數組而不是字符串
byt = Encoding
UTF
GetBytes(Value)
現在可以執行實際的加密了
此進程需要創建一個數據流
用於將加密的字節寫入到其中
要使用名為 ms 的 MemoryStream 對象
ICryptoTransform 對象(提供給 CryptoStream 類的構造函數)以及說明您希望在何種模式(讀
寫等)下創建該類的枚舉常數
創建 CryptoStream 對象 cs 後
現在使用 CryptoStream 對象的 Write 方法將數據寫入到內存數據流
這就是進行實際加密的方法
加密每個數據塊時
數據將被寫入 MemoryStream 對象
創建 MemoryStream 後
該代碼將在 CryptoStream 對象上執行 FlushFinalBlock 方法
以確保所有數據均被寫入 MemoryStream 對象
該過程將關閉 CryptoStream 對象
最後
該過程將內存數據流從字節數組轉換回字符串
這樣才可以在窗體上的文本框內顯示該字符串
可以使用 MemoryStream ToArray() 方法從數據流中獲取字節數組
然後調用 Convert
ToBase
String() 方法
該方法接受字節數組輸入並使用 Base
編碼方法將該字符串編碼為可讀內容
解密數據 加密數據後
有時還需要解密數據
解密數據的過程非常簡單
與加密過程相似
您需要提供加密過程中使用的密鑰和初始化向量
SymmetricAlgorithm 類的 Key 和 IV 屬性被定義為字節數組
因此
設置這些屬性之前需要提供您創建的字符串並將其轉換成字節數組
下面我們看一下窗體內用於解密字符串的 DecryptString 方法
該方法是從窗體上 Decrypt(解密)按鈕的 Click 事件處理程序中調用的
Encrypt 函數和 Decrypt 函數只有三個不同之處 需要使用 CryptoServiceProvider 類的 CreateDecryptor 方法來創建相應的 ICtryptoTransform 對象
需要將 Base
編碼字符串轉換成字節數組
需要使用 Convert
FromBase
String 方法來實現此轉換
通過對原始字節數組進行轉換
將字節數組轉換成相應的內存數據流
需要將內存數據流從字節數組轉換回可以在窗體上再次顯示的普通字符串
需要使用 Encoding
UTF
GetString() 方法來實現此轉換
注意
Encoding
UTF
類來自於 System
Text 命名空間
是否可以使其更簡單?!
盡管到目前為止顯示的代碼並不難
但有很多不同的類和接口您可能還不習慣於使用
此外
還要記住很多代碼
下面我們學習如何將 Cryptography 類包裝成易於使用的類
名為 PDSACryptography 的程序集中有兩個類
分別為 PDSAHash 和 PDSAEncryption
這兩個類用於封裝創建散列字符串或加密字符串的實際機制
此外
它們還允許您使用枚舉常數來決定要使用哪種散列或加密算法
不必記住每個不同的加密服務提供程序的所有不同的名稱
即可獲得不錯的 Intellisense? 提供程序列表
使用 PDSAHash 包裝散列 PDSAHash 類包含屬性 HashType
HashObject
OriginalString
HashString
SaltValue
UseSalt 和 SaltLength
與該類相關的方法包括 SetEncryptor
CreateSalt
Reset 和 CreateHash
該類中創建了一個稱為 PDSAHashType 的枚舉
您可以從中選擇要使用的相應散列類
該類的作用是將上文所示的代碼簡化為以下代碼
我寧願鍵入以上代碼也不願意記住上文顯示的所有代碼
如您所見
這段代碼相當簡單
與上文所述的代碼完全相同
只是被包裝到一個易於使用的接口中
您可以從本文包含的示例中找到完整的類
下面列舉了可以使用該類創建的不同散列算法
其中的每個算法都為最終的散列提供了一個不同的安全級別
NET 中完整的散列類列表如下所示
●MD
CryptoServiceProvider
●SHA
CryptoServiceProvider
●SHA
Managed
●SHA
Managed
●SHA
Managed
有關這些不同的散列類型的詳細信息
請參閱 Visual Studio
NET 聯機文檔
使用 PDSAEncryption 包裝加密 就像 PDSAHash 類可以包裝
NET Framework 中的所有散列功能一樣
PDSAEncryption 類可用於包裝
NET Framework 中的各種對稱算法類
PDSAEncryption 類包括以下枚舉類型
允許您創建各種加密/解密對象
同樣
每個服務提供程序都為加密字符串提供了不同的安全級別
這在 Visual Studio
NET 聯機文檔中都有詳細的介紹
這裡不再贅述
該類包含屬性 EncryptionType
OriginalString
EncryptedString
Key
KeyString
IV
IVString 和 CryptoProvider
其中的大多數屬性都是不言自明的
但 Key 和 IV 屬於字節數組
而 KeyString 和 IVString 是這些字節數組的字符串表示
該類還包含一些方法
例如 Encrypt 和 Decrypt
還有 GenerateKey 和 GenerateIV 方法
如果沒有現成的密鑰和 IV
可以使用這兩個方法創建一個密鑰和 IV
另外還有 SetEncryptor 方法
它用於創建將在各種方法中使用的新的 CryptoProvider 對象
該類的作用是使加密和解密字符串更容易實現
例如
下面的代碼片斷顯示了使用該類加密字符串是多麼容易
小結 使用 Microsoft
NET Framework 中的類可以很容易地在計算機中保存機密信息
您會發現 Cryptography 命名空間中的多個類都可以很好完成這一任務
為這些類創建包裝可以幫助您大大減少需要編寫的代碼量
強烈建議您按照本文所述
創建類似的包裝
作者簡介
Paul Sheriff 是 PDSA
Inc
的總裁
該公司提供有關
NET 的咨詢
產品和服務
包括 SDLC 文檔和體系結構框架 ()
Paul 是 Microsoft 在南加利福尼亞的區域負責人(英文)
他編寫的
NET 方面的書籍包括《ASP
NET Developer
s Jumpstart》(Addison
Wesley) 以及在 PDSA Web 站點(英文)上列出的一些電子圖書
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25621.html