国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:06:01
字體:
來源:轉載
供稿:網友

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


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

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

  Click 事件過程將調用名為 EncryptString() 的方法,從 Original String(原始字符串)文本框中接受值并對其進行加密。然后返回該值并將其放到 Encrypted String(加密字符串)文本框中。下面是 EncryptString() 方法的代碼。
  
 Microsoft .NET 中的簡化加密(2)(圖)(圖四)

  現在我們分開看一下各行代碼并了解這些代碼的作用。首先是加密進程的幾個變量。
  
 Microsoft .NET 中的簡化加密(2)(圖)(圖五)

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

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

  Encrypt 函數和 Decrypt 函數只有三個不同之處
  1、需要使用 CryptoServicePRovider 類的 CreateDecryptor 方法來創建相應的 ICtryptoTransform 對象。
  2、需要將 Base64 編碼字符串轉換成字節數組。需要使用 Convert.FromBase64String 方法來實現此轉換。
  3、通過對原始字節數組進行轉換,將字節數組轉換成相應的內存數據流。需要將內存數據流從字節數組轉換回可以在窗體上再次顯示的普通字符串。需要使用 Encoding.UTF8.GetString() 方法來實現此轉換。
  注重:Encoding.UTF8 類來自于 System.Text 命名空間。
  是否可以使其更簡單?!
  盡管到目前為止顯示的代碼并不難,但有很多不同的類和接口您可能還不習慣于使用。此外,還要記住很多代碼。下面我們學習如何將 Cryptography 類包裝成易于使用的類。
  名為 PDSACryptography 的程序集中有兩個類,分別為 PDSAHash 和 PDSAEncryption。這兩個類用于封裝創建散列字符串或加密字符串的實際機制。此外,它們還答應您使用枚舉常數來決定要使用哪種散列或加密算法。不必記住每個不同的加密服務提供程序的所有不同的名稱,即可獲得不錯的 Intellisense? 提供程序列表。
  
  使用 PDSAHash 包裝散列
  PDSAHash 類包含屬性 HashType、HashObject、OriginalString、HashString、SaltValue、UseSalt 和 SaltLength。與該類相關的方法包括 SetEncryptor、CreateSalt、Reset 和 CreateHash。該類中創建了一個稱為 PDSAHashType 的枚舉,您可以從中選擇要使用的相應散列類。該類的作用是將上文所示的代碼簡化為以下代碼。
  
 Microsoft .NET 中的簡化加密(2)(圖)(圖八)

  我寧愿鍵入以上代碼也不愿意記住上文顯示的所有代碼。如您所見,這段代碼相當簡單,與上文所述的代碼完全相同,只是被包裝到一個易于使用的接口中。您可以從本文包含的示例中找到完整的類。下面列舉了可以使用該類創建的不同散列算法。
  
 Microsoft .NET 中的簡化加密(2)(圖)(圖九)

  其中的每個算法都為最終的散列提供了一個不同的安全級別。.NET 中完整的散列類列表如下所示:
  ●md5CryptoServiceProvider
  ●SHA1CryptoServiceProvider
  ●SHA256Managed
  ●SHA384Managed
  ●SHA512Managed
  有關這些不同的散列類型的具體信息,請參閱 Visual Studio .NET 聯機文檔。
  
  使用 PDSAEncryption 包裝加密
  就像 PDSAHash 類可以包裝 .NET Framework 中的所有散列功能一樣,PDSAEncryption 類可用于包裝 .NET Framework 中的各種對稱算法類。PDSAEncryption 類包括以下枚舉類型,答應您創建各種加密/解密對象。
  
 Microsoft .NET 中的簡化加密(2)(圖)(圖十)

  同樣,每個服務提供程序都為加密字符串提供了不同的安全級別。這在 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 中的簡化加密(2)(圖)(圖十)

  小結
  使用 Microsoft .NET Framework 中的類可以很輕易地在計算機中保存機密信息。您會發現 Cryptography 命名空間中的多個類都可以很好完成這一任務。為這些類創建包裝可以幫助您大大減少需要編寫的代碼量。強烈建議您按照本文所述,創建類似的包裝。
  
  作者簡介
  Paul Sheriff 是 PDSA, Inc. 的總裁,該公司提供有關 .NET 的咨詢、產品和服務,包括 SDLC 文檔和體系結構框架 (www.pdsa.com)。Paul 是 Microsoft 在南加利福尼亞的區域負責人(英文)。他編寫的 .NET 方面的書籍包括《asp.net Developer's Jumpstart》(Addison-Wesley) 以及在 PDSA Web 站點(英文)上列出的一些電子圖書。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲靖市| 盐津县| 白沙| 河津市| 井陉县| 遂川县| 平武县| 元江| 扎赉特旗| 南岸区| 水城县| 南丹县| 合江县| 子长县| 西昌市| 信丰县| 谢通门县| 九寨沟县| 三原县| 江西省| 会宁县| 任丘市| 连州市| 塔河县| 惠东县| 永州市| 宾川县| 普陀区| 新巴尔虎右旗| 罗田县| 中江县| 广州市| 高台县| 阿坝县| 永安市| 承德市| 澳门| 油尖旺区| 乐清市| 亚东县| 宁武县|