2014-12-13 69 views
1

我試圖用這個功能來解密,但我不確定是什麼原因導致它失敗AesCryptoServiceProvider解密

public string Decrypt(byte[] cipherText, byte[] IV, byte[] key) 
    { 

     using (AesCryptoServiceProvider AESDecrypt = new AesCryptoServiceProvider()) 
     { 

      //here we set the key and IV instead having the class generate them. 
      AESDecrypt.IV = IV; 
      AESDecrypt.Key = key; 

      ICryptoTransform decryptor = AESDecrypt.CreateDecryptor(AESDecrypt.Key, 
           AESDecrypt.IV); 

      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, 
        decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 
         csDecrypt.Flush(); 
         plainText = srDecrypt.ReadToEnd(); 
         return plainText; 
        } 
       } 
      } 
     } 

    } 

明文返回一個空字符串。密鑰和IV是在前一個函數中生成的系統,並且正在正確傳遞。

+1

當你打開你的'StreamReader'時,msDecrypt/cipherText是你期望它們的長度嗎?我只用流而不是'byte []'來做這件事 - 但是你是否嘗試過檢查msDecrypt流的位置(當你打開流讀取器?)。它需要在位置0. – ne1410s 2014-12-13 14:47:40

+1

您是否正在使用加密方法沖洗?檢查方法開始處的密文長度,如果爲零則拋出異常。使用上一個線程中的加密代碼,如果您沒有正確實施Flush(),則可能會有長度爲零的字節數組。 – 2014-12-13 14:57:56

+1

請刪除沖洗,看看它是否工作。如果您只有16個字節的密文,則可能是明文本身由0個字節組成(或者,如果您只是將其打印出來,則使用不可打印的字符)。在這種情況下,你只需要一個16個填充字節的塊。 – 2014-12-13 15:16:02

回答

0

我誤解了第一個問題的答案,並使用.flushfinalblock使其返回「密文」而未真正解決潛在問題。當我移動密碼= msEncrypt.ToArray();在加密流之外它完美地工作。並刪除.flush()。 .FacePalm()

相關問題