Duwamish密碼分析篇, Part 3

Duwamish密碼分析篇, Part 3

 

Written by: Rickie Lee

Nov. 07, 2004

 

通過前面關於《Duwamish密碼分析篇, Part 12》的POST,可以瞭解到Duwamish中關於Password的處理方式。Duwamish 7.0範例中的帳戶密碼通過SHA1散列運算和對散列執行Salt運算後,然後以byte形式存放在Database中,避免明文的方式,以提高系統的安全性。

 

但是,由於散列是單向操作,使用散列算法對原始密碼加密後將無法再恢復。因此,在實際的應用系統中,上述的加密過程有一個小問題:就是當有大量的用戶忘記了自己的Password,如何幫助他們恢復自己的Password呢?這個問題地球人都不知道。

 

因此,對於一般的商業應用,通過.Net的加密/解密類庫來同時實現上述目的,既加密Password等重要信息,同時也可以在必要的時候解密這些信息。

 

加密算法使可以將數據掩蓋起來,除了特定人員能夠對其解密外,其他人員不大可能通過數學方法讀取該數據。但如果希望讀取該數據,則可以爲其提供一個特定的“密鑰”,使其能夠解密並讀取數據。.NET Framework 中有多種可用的加密/解密算法。

 

目前有兩種加密方法:

對稱算法(或密鑰算法)的速度非常快,非常適於加密大型的數據流。這些算法可以加密數據,也可以解密數據。對稱加密技術的數據交換兩邊(即加密方和解密方)必須使用一個保密的私有密鑰。

不對稱算法(或公鑰算法)沒有對稱算法快,但其代碼較難破密。這些算法取決於兩個密鑰,一個是私鑰,另一個是公鑰。公鑰用來加密消息,私鑰是可以解密該消息的唯一密鑰。公鑰和私鑰通過數學方法鏈接在一起,因此要成功進行加密交換,必須獲得這兩個密鑰。由於可能會影響到計算機性能,因此不對稱算法不太適用於加密大量數據。不對稱算法的常見用法是將對稱密鑰和初始化向量加密並傳輸給對方。然後在雙方之間來回發送的消息中使用對稱算法加密和解密數據。不對稱算法主要有RSADSA等,主要用於網絡數據的加密。保護HTTP傳輸安全的SSL就是使用非對稱技術。

 

本文先主要學習.Net中如下對稱算法(或密鑰算法)類庫,包括以下幾種:

DESData Encryption Standard),TripleDESRC2Rijndael

對稱算法(或密鑰算法)使用一個密鑰和一個初始化向量 (Initialization VectorIV) 來保證數據的安全。加密的功效取決於所用密鑰的大小,密鑰越長,保密性越強。典型的密鑰長度有64位、128位、192位、256位和512位。使用該數據的雙方都必須知道這個密鑰和初始化向量才能夠加密和解密數據。必須確保該密鑰的安全,否則其他人將有可能解密該數據並讀取該消息。初始化向量只是一個隨機生成的字符集,使用它可以確保任何兩個文本都不會生成相同的加密數據。然後,在此基礎上學習開發一套標準的加密/解密通用類庫,供今後開發應用系統時使用。

 

.Net Framework內置加密/解密算法類庫

.NET Framework 爲各種最廣泛使用的對稱加密算法提供了支持。.NET構架從基本的SymmetricAlgorithm類擴展出來四種算法:

·System.Security.Cryptography.DES

·System.Security.Cryptography.TripleDES

·System.Security.Cryptography.RC2

·System.Security.Cryptography.Rijndael

.NET的對稱加密和解密通過CryptoStream類來處理的,它繼承自System.IO.Stream,使用 CryptoStream 對象的 Write 方法將數據寫入到內存數據流(Memory Stream),這就是進行實際加密/解密的方法。

 

先以DES算法爲例,瞭解.Net爲我們提供的簡單加密/解密過程:

1DES加密

上圖Encrypt實例代碼:

private void btnEncrypt_Click(object sender, System.EventArgs e)

{

          SymmetricAlgorithm mCSP = new DESCryptoServiceProvider();

          ICryptoTransform ct;

          MemoryStream ms;

          CryptoStream cs;

          byte[] byt;

          byte [] key, iv;

 

          // If this property is a null reference (Nothing in Visual Basic) when it is used,

          // GenerateKey is called to create a new random value.

          key = mCSP.Key;

          // If this property is a null reference (Nothing in Visual Basic) when it is used,

          // GenerateIV is called to create a new random value.

          iv = mCSP.IV;

          // Creates a symmetric Data Encryption Standard (DES) encryptor object.

          ct = mCSP.CreateEncryptor(key, iv);

          // Refresh textboxes

          txtKey.Text = Convert.ToBase64String(key);

          txtIV.Text = Convert.ToBase64String(iv);

 

          byt = Encoding.Unicode.GetBytes(txtOriginal.Text.Trim());

 

          ms = new MemoryStream();

          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);

          cs.Write(byt, 0, byt.Length);

          cs.FlushFinalBlock();

 

          cs.Close();

 

          txtResults.Text = Convert.ToBase64String(ms.ToArray());

}

首先創建 DESCryptoServiceProvider 對象,要使用對稱算法,必須提供要使用的密鑰。每個 CryptoSymmetricAlgorithm 實現都提供一種 GenerateKey 方法。它們實際上使用的是公共語言運行時 (CLR) 類中內置的隨機數生成器類。在首次調用DESCryptoServiceProvider 對象的Key屬性時,因爲該屬性爲Null,則自動調用GenerateKey 方法來生成隨機Key。密鑰的大小取決於用來加密的特定提供程序。例如,DES 密鑰的大小爲 64 位,而 TripleDES 密鑰的大小爲 192 位。每個 SymmetricAlgorithm 類上都有一個 KeySize 屬性,它將返回用於生成密鑰的密鑰大小。

然後是需要生成初始化向量 (IV),如果IV屬性爲Null,也是自動調用GenerateIV方法,生成IV。只要使用的 IV 不同,即使密鑰相同,同一個數據也會被加密成完全不同的值。當然,你可以自己指定特定的KeyIV,但要注意的不同的加密算法,可能採用不同的Key長度和IV長度。

ICryptoTransform 是一個接口。需要此接口才能在任何服務提供程序上調用 CreateEncryptor 方法,服務提供程序將返回定義該接口的實際 encryptor 對象。

Encoding.Unicode.GetBytes()方法負責將原始字符串轉換成字節數組。大多數 .NET 加密算法處理的是字節數組而不是字符串。

現在可以執行實際的加密了。此進程需要創建一個數據流,用於將加密的字節寫入到其中。要使用名爲 ms MemoryStream 對象、ICryptoTransform 對象(提供給 CryptoStream 類的構造函數)以及說明您希望在何種模式(讀、寫等)下創建該類的枚舉常數。創建 CryptoStream 對象 cs 後,現在使用 CryptoStream 對象的 Write 方法將數據寫入到內存數據流。這就是進行實際加密的方法,加密每個數據塊時,數據將被寫入 MemoryStream 對象。

創建 MemoryStream 後,該代碼將在 CryptoStream 對象上執行 FlushFinalBlock 方法,以確保所有數據均被寫入 MemoryStream 對象。並調用CryptoStream 對象的Close方法關閉 CryptoStream 對象。

最後,調用 Convert.ToBase64String() 方法,該方法接受字節數組輸入並使用 Base64 編碼方法將加密結果編碼爲可讀內容,輸出到TextBox顯示。

 

2DES解密

上圖Decrypt實例代碼:

private void btnDecrypt_Click(object sender, System.EventArgs e)

{

          SymmetricAlgorithm mCSP = new DESCryptoServiceProvider();

          ICryptoTransform ct;

          MemoryStream ms;

          CryptoStream cs;

          byte[] byt;

          // Sets the key for the symmetric algorithm.

          mCSP.Key = Convert.FromBase64String(txtKey.Text.Trim());

          // Sets the initialization vector (IV) for the symmetric algorithm.

          mCSP.IV = Convert.FromBase64String(txtIV.Text.Trim());

          // Creates a symmetric Data Encryption Standard (DES) decryptor object.

          ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);

 

          byt = Convert.FromBase64String(txtOriginal.Text.Trim());

 

          ms = new MemoryStream();

          cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);

          cs.Write(byt, 0, byt.Length);

          cs.FlushFinalBlock();

 

          cs.Close();

 

          txtResults.Text = Encoding.Unicode.GetString(ms.ToArray());

 

}

 

Decrypt過程代碼與Encrypt過程很相似,只有細微的差別。首先,Decrypt過程不需要重新生成隨機的KeyIV,必須使用與上述Encrypt過程中相同的KeyIV,否則無法解密。

另外,ICryptoTransform 是一個接口,這裏是在DESCryptoServiceProvider服務提供程序上調用 CreateDecryptor方法,服務提供程序將返回定義該接口的實際decryptor對象。

 

.Net Framework也支持其他加密/解密算法,如TripleDESRC2Rijndael,並且只要簡單替換上述代碼的DESCryptoServiceProvider服務提供程序對象,就可以切換到對應的加密算法。正是基於這一點,我們可以非常方便地構建一套標準的加密/解密通用類庫,請參考Microsoft的《如何創建加密庫》,這裏不重複了。

根據Microsoft的《如何創建加密庫》編寫的一個DEMO

知識點:Base64編碼

前面的加密/解密過程中,使用到.Net Framework提供的關於Base64編碼的方法:

1Convert.ToBase64String() 方法,該方法接受字節數組輸入並使用 Base64 編碼方法將加密結果編碼爲可讀內容

2Convert.FromBase64String()方法,該方法接受Base64 編碼的字符串,輸出字節數組。

 

Base64MIME郵件中常用的編碼方式之一。它的主要思想是將輸入的字符串或數據編碼成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}64個可打印字符的串,故稱爲“Base64”。

Base64編碼的方法是,將輸入數據流每次取6 bit,不足6bit的補0,用此6 bit的值(0-63)作爲索引去查表,輸出相應字符。這樣,每3個字節將編碼爲4個字符(3×8 4×6)(之後在6位的前面補兩個0,形成8位一個字節的形式),不滿4個字符的以'='填充。轉換後的字符串理論上將要比原來的長1/3

 

現在回到前面的DES算法中Key或者IVKey長度爲64位(8個字節),爲了讓Base64編碼是4的倍數,就要補1個等號。

 
發佈了17 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章