熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Microsoft .NET 中的簡化加密(2)(圖)

2022-06-13   來源: Java核心技術 

  實現加密和解密的密鑰
  要使用對稱算法必須提供要使用的密鑰每個 CryptoSymmetricAlgorithm 實現都提供一種 GenerateKey 方法它們實際上使用的是公共語言運行時 (CLR) 類中內置的隨機數生成器類我們來看一下 Gen Key(生成密鑰)按鈕的 Click 事件處理程序看它如何生成要使用的隨機密鑰值
  
 

  獲取服務提供程序的特定實現後只需調用 GenerateKey 方法來創建一個用於加密的新的隨機密鑰密鑰的大小取決於用來加密的特定提供程序例如DES 密鑰的大小為 而 TripleDES 密鑰的大小為 每個 SymmetricAlgorithm 類上都有一個 KeySize 屬性它將返回用於生成密鑰的密鑰大小
  我們還需要生成初始化向量 (IV)IV 將幫助算法生成最終加密字符串的數據塊IV 用於開始第一個塊的加密如果不提供 IV那麼只要密鑰相同在字符串之間傳遞的通用數據將保持同一種模式因此需要使用 IV 作為加密數據的隨機組件通過這種方式只要使用的 IV 不同即使密鑰相同同一個數據也會被加密成完全不同的值下面是生成新的 IV 的 Gen IV(生成 IV)按鈕的源代碼
  
 

  此代碼看起來與生成密鑰的代碼非常相似每個加密服務提供程序類上都有一個 GenerateIV() 方法如果未提供 IV該方法將生成一個 IV
  
  加密數據
  獲得密鑰和初始化向量後現在可以使用 KeyIV 和 Original String 值來創建原始字符串值的加密版本單擊 Encrypt(加密)按鈕將運行以下代碼
  
 

  Click 事件過程將調用名為 EncryptString() 的方法從 Original String(原始字符串)文本框中接受值並對其進行加密然後返回該值並將其放到 Encrypted String(加密字符串)文本框中下面是 EncryptString() 方法的代碼
  
 

  現在我們分開看一下各行代碼並了解這些代碼的作用首先是加密進程的幾個變量
  
 

  ICryptoTransform 是一個接口需要此接口才能在任何服務提供程序上調用 CreateEncryptor 方法服務提供程序將返回定義該接口的實際 encryptor 對象
  然後需要將原始字符串轉換成字節數組大多數 NET 加密算法處理的是字節數組而不是字符串
  byt = EncodingUTFGetBytes(Value)
  現在可以執行實際的加密了此進程需要創建一個數據流用於將加密的字節寫入到其中要使用名為 ms 的 MemoryStream 對象ICryptoTransform 對象(提供給 CryptoStream 類的構造函數)以及說明您希望在何種模式(讀寫等)下創建該類的枚舉常數創建 CryptoStream 對象 cs 後現在使用 CryptoStream 對象的 Write 方法將數據寫入到內存數據流這就是進行實際加密的方法加密每個數據塊時數據將被寫入 MemoryStream 對象
  
 

  創建 MemoryStream 後該代碼將在 CryptoStream 對象上執行 FlushFinalBlock 方法以確保所有數據均被寫入 MemoryStream 對象該過程將關閉 CryptoStream 對象
  最後該過程將內存數據流從字節數組轉換回字符串這樣才可以在窗體上的文本框內顯示該字符串可以使用 MemoryStream ToArray() 方法從數據流中獲取字節數組然後調用 ConvertToBaseString() 方法該方法接受字節數組輸入並使用 Base 編碼方法將該字符串編碼為可讀內容
  
  解密數據
  加密數據後有時還需要解密數據解密數據的過程非常簡單與加密過程相似您需要提供加密過程中使用的密鑰和初始化向量SymmetricAlgorithm 類的 Key 和 IV 屬性被定義為字節數組因此設置這些屬性之前需要提供您創建的字符串並將其轉換成字節數組下面我們看一下窗體內用於解密字符串的 DecryptString 方法該方法是從窗體上 Decrypt(解密)按鈕的 Click 事件處理程序中調用的
  
 

  Encrypt 函數和 Decrypt 函數只有三個不同之處
  需要使用 CryptoServiceProvider 類的 CreateDecryptor 方法來創建相應的 ICtryptoTransform 對象
  需要將 Base 編碼字符串轉換成字節數組需要使用 ConvertFromBaseString 方法來實現此轉換
  通過對原始字節數組進行轉換將字節數組轉換成相應的內存數據流需要將內存數據流從字節數組轉換回可以在窗體上再次顯示的普通字符串需要使用 EncodingUTFGetString() 方法來實現此轉換
  注意EncodingUTF 類來自於 SystemText 命名空間
  是否可以使其更簡單?!
  盡管到目前為止顯示的代碼並不難但有很多不同的類和接口您可能還不習慣於使用此外還要記住很多代碼下面我們學習如何將 Cryptography 類包裝成易於使用的類
  名為 PDSACryptography 的程序集中有兩個類分別為 PDSAHash 和 PDSAEncryption這兩個類用於封裝創建散列字符串或加密字符串的實際機制此外它們還允許您使用枚舉常數來決定要使用哪種散列或加密算法不必記住每個不同的加密服務提供程序的所有不同的名稱即可獲得不錯的 Intellisense? 提供程序列表
  
  使用 PDSAHash 包裝散列
  PDSAHash 類包含屬性 HashTypeHashObjectOriginalStringHashStringSaltValueUseSalt 和 SaltLength與該類相關的方法包括 SetEncryptorCreateSaltReset 和 CreateHash該類中創建了一個稱為 PDSAHashType 的枚舉您可以從中選擇要使用的相應散列類該類的作用是將上文所示的代碼簡化為以下代碼
  
 

  我寧願鍵入以上代碼也不願意記住上文顯示的所有代碼如您所見這段代碼相當簡單與上文所述的代碼完全相同只是被包裝到一個易於使用的接口中您可以從本文包含的示例中找到完整的類下面列舉了可以使用該類創建的不同散列算法
  
 

  其中的每個算法都為最終的散列提供了一個不同的安全級別NET 中完整的散列類列表如下所示
  ●MDCryptoServiceProvider
  ●SHACryptoServiceProvider
  ●SHAManaged
  ●SHAManaged
  ●SHAManaged
  有關這些不同的散列類型的詳細信息請參閱 Visual Studio NET 聯機文檔
  
  使用 PDSAEncryption 包裝加密
  就像 PDSAHash 類可以包裝 NET Framework 中的所有散列功能一樣PDSAEncryption 類可用於包裝 NET Framework 中的各種對稱算法類PDSAEncryption 類包括以下枚舉類型允許您創建各種加密/解密對象
  
 

  同樣每個服務提供程序都為加密字符串提供了不同的安全級別這在 Visual Studio NET 聯機文檔中都有詳細的介紹這裡不再贅述
  該類包含屬性 EncryptionTypeOriginalStringEncryptedStringKeyKeyStringIVIVString 和 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 方面的書籍包括《ASPNET Developers Jumpstart》(AddisonWesley) 以及在 PDSA Web 站點(英文)上列出的一些電子圖書

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25621.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.