2012-07-10 44 views
1

我正在通過.Net處理mvc應用程序,以確保我的敏感信息(如web.config中的信息)我有兩個函數用於加密和使用Triple DES解密信息,但是我對此很陌生,並且在朋友的幫助下成功地到達了這裏,並在這裏問了很多問題。如何在加密的字符串中添加和檢索TDES IV(初始化向量)

我現在卡住的地方是我如何在加密字符串的末尾添加TDES IV (Initialization Vector)以及如何在解密時再次檢索它?我的意思是,如何在加密信息中識別出IV (Initialization Vector)星?

請幫忙。

public static string Encrypt(string Message) 
    { 
     byte[] iv; 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String())); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     // Capture the randomly generated IV 
     iv = TDESAlgorithm.IV; 
     byte[] DataToEncrypt = UTF8.GetBytes(Message); 
     try 
     { 
      ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor(); 
      Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); 
      //var lnght=Results.GetLength(0); 
      //System.Buffer.BlockCopy(iv, 0, Results, lnght + 1, iv.Length()); //HOW? 
     } 
     finally 
     { 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 
     return Convert.ToBase64String(Results); 
     //return Encoding.UTF8.GetString(Results); 
    } 

    public static string Decrypt(string Message) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String())); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     // Apply the same IV used during encryption 
     //TDESAlgorithm.IV = iv; // HOW? 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     try 
     { 
      byte[] DataToDecrypt = Convert.FromBase64String(Message); 
      //byte[] DataToDecrypt = UTF8.GetBytes(Message); 
      //byte[] DataToDecrypt = Encoding.UTF8.GetBytes(Message); 
      ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
      Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); // << ERROR is here. 
     } 
     finally 
     { 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 
     return UTF8.GetString(Results); 
    } 

… 
… 
… 
+0

首先,消息傳遞易受填充Oracle攻擊的影響,因此您需要完整性檢查。其次,您至少需要使用CBC,或者您可以在密文中區分純文本。然後你需要在純文本中將*添加到*密文*中。您可以保留PKCS#7,並且您至少可以獲得滿分(字符)編碼/解碼的全部分數。使用AES而不是3DES也是一個非常好的主意,儘管讓模式等等更爲重要。 – 2012-07-10 23:35:07

回答

2

您的問題是您正在使用ECB模式。 ECB不支持IV,並且具有許多不良特性。你可以改用CBC。

通常,您將IV放在加密數據之前而不是之後。 GameScripting的答案顯示了一種方法。

最後,你的密鑰派生看起來可疑,但由於它不完整,我不能告訴你你應該在那裏做什麼。

+0

我想你需要再看看GameScripting的答案。 – 2012-07-10 23:24:11

+0

至於密鑰推導,我猜想有比MD5更糟糕的方式來將SHA256輸出減少到16個字節。使用['Rfc2898DeriveBytes'](http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx)肯定勝過它。 – 2012-07-10 23:33:18

+0

@CodesInChaos:謝謝你的回答,我剛接觸這個,這就是爲什麼在實現這個方面有點困難。你能指導我一點我怎麼能切換到CBC? – Maven 2012-07-24 14:43:17

相關問題