2013-05-15 159 views
1

我試圖解密一個AES256位,但它給了我這個錯誤「解密數據的長度是無效的。」在線Plain_Text = Stream_Read.ReadToEnd();。我的加密方法有效,但解密不能。有人能幫助我嗎?謝謝。AES 256解密錯誤

private static string Decrypt(string stringCypher_Text, string stringKey, string stringIV) 
    { 
     //Hashes, and converts key to bytes 
     //hash 
     //convert 
     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     Byte[] Key = encoding.GetBytes(stringKey); 

     //converts string IV to bytes 
     Byte[] IV = encoding.GetBytes(stringIV); 

     //converts cypher string to bytes 
     Byte[] Cypher_Text = encoding.GetBytes(stringCypher_Text); 

     RijndaelManaged Crypto = null; 
     MemoryStream MemStream = null; 
     ICryptoTransform Decryptor = null; 
     CryptoStream Crypto_Stream = null; 
     StreamReader Stream_Read = null; 
     string Plain_Text; 

     try 
     { 
      Crypto = new RijndaelManaged(); 
      Crypto.Key = Key; 
      Crypto.IV = IV; 

      MemStream = new MemoryStream(Cypher_Text); 

      //Create Decryptor make sure if you are decrypting that this is here and you did not copy paste encryptor. 
      Decryptor = Crypto.CreateDecryptor(Crypto.Key, Crypto.IV); 

      //This is different from the encryption look at the mode make sure you are reading from the stream. 
      Crypto_Stream = new CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read); 

      //I used the stream reader here because the ReadToEnd method is easy and because it return a string, also easy. 
      Stream_Read = new StreamReader(Crypto_Stream); 
      Plain_Text = Stream_Read.ReadToEnd(); 

     } 
     finally 
     { 
      if (Crypto != null) 
       Crypto.Clear(); 

      MemStream.Flush(); 
      MemStream.Close(); 

     } 
     return Plain_Text; 

    } 
+2

您可以發佈您的加密方法,以便更容易排除故障嗎? – Kevin

回答

1

的問題是在你的加密方法或更準確的加密和解密之間的相互作用。 你真的不想對二進制數據使用UTF8Encoding或ANY編碼。文本編碼用於將文本轉換爲二進制數據並再次返回。加密文本實際上是純粹的二進制數據。我會建議使用Base64Strings。

在你的Encrypt方法中,你很可能有一個MemoryStream,你正在返回編碼字符。相反,返回這樣的Base64String ...

string cipherText = Convert.ToBase64String(memoryStream.ToArray()); 
return cipherText; 

然後在你解密你採取的密文,並把它放回一個byte []像這樣...

Byte[] Cypher_Text = Convert.FromBase64String(stringCypher_Text); 

你也應該通過你的關鍵和初始化向量作爲Base64Strings以及之後,你的代碼應該很好去。

+0

它轉換回一個字節時,拋出一個異常如何解決這個問題的任何想法?由於AES在使用轉換爲base64字符串時給了我一些非base64字符。 「輸入不是有效的Base-64字符串,因爲它包含非基本64字符,多於兩個填充字符或填充字符中的非法字符。」 – user2138160

+0

如果你用一個完整的例子(加密和解密)更新你的問題,我敢打賭,我可以很快看到有什麼問題。 – Kevin

+0

我的假設是,您正在嘗試執行Convert.FromBase64String的字符串與從Convert.ToBase64String返回的字符串不同。但是沒有看到代碼,我真的不知道更多。 – Kevin

0

嘗試改變Plain_Text = Steam_Read.ReadToEnd();

byte[] plainText = new byte[Plain_Text.Length]; 
    int dByte = Stream_Read.Read(plainText, 0, plainText.Length); 
    string decryptedText = Encoding.UTF8.GetString(plainText, 0, dByte); 
    return descryptedText; 
+0

「Stream_Read.Read(plainText,0,plainText.Length);」 「給System.IO.TextReader.Read(char [],int,int)的最佳重載方法匹配」有一些無效參數「AND」參數1:無法從'byte []'轉換爲' char []' 「 – user2138160