2009-06-01 30 views
0

C#2008'Bad Data'使用DES3解密郵件時

我正在使用以下代碼來加密和加密郵件。但是,當我嘗試解密時,出現「錯誤數據」錯誤。

我的代碼下面有什麼問題嗎?

非常感謝,

public string encryptText(string text) 
    { 
     try 
     { 
      TripleDESCryptoServiceProvider encrypt = new TripleDESCryptoServiceProvider(); 

      encrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 }; 
      encrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 }; 
      byte[] byteText = Encoding.Unicode.GetBytes(text); 

      ICryptoTransform encryptor = encrypt.CreateEncryptor(); 

      byte[] encryptedText = encryptor.TransformFinalBlock(byteText, 0, byteText.Length); 

      return Encoding.Unicode.GetString(encryptedText); 
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex.Message); 

      return ex.Message; 
     } 

    } 

    /// Decrypt the text 
    public string decryptText(string encryptedText) 
    { 
     try 
     { 
      byte[] bytesText = Encoding.Unicode.GetBytes(encryptedText); 

      TripleDESCryptoServiceProvider decrypt = new TripleDESCryptoServiceProvider(); 

      decrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 }; 
      decrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 }; 

      ICryptoTransform decryptor = decrypt.CreateDecryptor(); 

      byte[] originalText = decryptor.TransformFinalBlock(bytesText, 0, encryptedText.Length); 

      return Encoding.Unicode.GetString(originalText); 
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex.Message); 

      return ex.Message; 
     } 
    } 

回答

5

你把加密的字節並將其轉換爲使用Encoding.Unicode一個字符串,但你正在做的字符串,並使用Encoding.Default將其轉換回字節。這幾乎是保證不工作(除非默認情況下是UTF-16)。

但是,您應該使用或者這些 - 使用編碼將任意二進制數據轉換爲文本是一個壞主意。改爲使用Convert.ToBase64String(在加密器中)和Convert.FromBase64String(在解密器中)。

(我還非常查詢返回的異常信息的智慧,就好像它是加密/解密的成功的結果,但希望你只是這樣做的示例代碼的緣故。)

+0

因此,假設`stringToDecrypt`是使用`Convert.ToBase64String`創建的,這是一種可接受的解密方法嗎? `inputByteArray = Convert.FromBase64String(_decodedString); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms,des.CreateDecryptor(key,IV),CryptoStreamMode.Write); cs.Write(inputByteArray,0,inputByteArray.Length); cs.FlushFinalBlock(); System.Text.Encoding encoding = new System.Text.UTF8Encoding();返回encoding.GetString(ms.ToArray());`[許多道歉的格式..我似乎無法設置換行符] – TimDog 2011-10-04 20:47:49

+0

@TimDog:是的,雖然我會用`Encoding.UTF8`而不是調用構造函數。 – 2011-10-04 20:51:19

1

是的,代碼中有一些錯誤。

  • encryptedText和bytesText必須是相同的字節數組。 Jon Skeet建議你可以使用Base64編碼。

  • IV是密文的一部分。因此,您在解密時不必設置IV。

  • 加密的默認模式是CBC。這種模式要求IV是隨機的(rsp。不可預知的)。因此,您在加密時不能設置固定的IV。當您創建CryptoServiceProvider時,已經設置了隨機IV。因此用固定值覆蓋IV會降低您的安全性。

  • 明確地在代碼中放置一個鍵不是一個好主意。我希望你的代碼離開實驗狀態後你會改變它。

  • 是否有使用TripleDes的理由?否則,您可能需要考慮使用AES。