簡體   English   中英

解密流時填充無效

[英]Padding invalid when decrypting stream

我正在嘗試使用AesManaged加密流(來自文件)。 我可以無錯誤地加密文件,但在解密時我得到以下CryptographicException:

填充無效,無法刪除。

處理CryptoStream時會引發異常。 我使用以下內容來加密輸入數據:

public byte[] Encrypt(Stream plain)
{
    // Create a decrytor to perform the stream transform.
    using( var msEncrypt = new MemoryStream() )
    {
        using (ICryptoTransform encryptor = _myAes.CreateEncryptor(_myAes.Key, _myAes.IV))
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
        using (BinaryWriter swEncrypt = new BinaryWriter(csEncrypt))
        {
            int buf_size = 32768;
            byte[] buffer = new byte[buf_size];
            int read = 0;
            while ((read = plain.Read(buffer, 0, buf_size)) > 0)
            {
                swEncrypt.Write(buffer, 0, read);
            }
        }

        return msEncrypt.ToArray();
    }
}

這解密數據:

public byte[] Decrypt(Stream cipherText)
{

    using (MemoryStream ms = new MemoryStream())
    {
        // Create a decrytor to perform the stream transform.
        using (ICryptoTransform decryptor = _myAes.CreateDecryptor(_myAes.Key, _myAes.IV))
        using (CryptoStream csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
        using (BinaryWriter swDecrypt = new BinaryWriter(csDecrypt))
        {
            int buf_size = 32768;
            byte[] buffer = new byte[buf_size];
            int read = 0;
            while ((read = cipherText.Read(buffer, 0, buf_size)) > 0)
            {
                swDecrypt.Write(buffer, 0, read);
            }
        }

        return ms.ToArray();
    }
}

關於為什么會出現這種異常的任何想法都會很棒。 謝謝

UPDATE

這里是Aes對象的創建位置,注意Key和IV只是暫時設置為它們的當前值,它不是將要使用的真正鍵:

private Crypto()
{
    _myAes = new AesManaged();
    _myAes.Padding = PaddingMode.PKCS7;
    _myAes.KeySize = 128;
    _myAes.Key = Enumerable.Repeat((byte)'B', 128 / 8).ToArray();
    _myAes.IV = Enumerable.Repeat((byte)'C', 128 / 8).ToArray();
}

在過去,當我嘗試解密長度不是16字節倍數的緩沖區時,我遇到了這個異常。

您在處理之前嘗試在CryptoStream上調用Flush嗎? 可能,如果它沒有被刷新,那么它最終會嘗試解密具有不對齊長度的緩沖區。

另一個注意事項 - 我不知道這是否會解決您的問題,但是當您創建CryptoStream以解密緩沖區時,您是否應該使用CryptoStreamMode.Read而不是CryptoStreamMode.Write

我不知道4年后發布一些東西是否仍然有用,但是你應該嘗試將填充設置為無。 我遇到了與3DES相同的問題,問題解決了(但要確保要解密的數據長度是正確的......)

private Crypto()
{
    _myAes = new AesManaged();
    _myAes.Padding = PaddingMode.none; //rather than _myAes.Padding = PaddingMode.PKCS7;
    _myAes.KeySize = 128;
    _myAes.Key = Enumerable.Repeat((byte)'B', 128 / 8).ToArray();
    _myAes.IV = Enumerable.Repeat((byte)'C', 128 / 8).ToArray();
}

確保在寫入端干凈地完成CryptoStream 您可能需要調用FlushFinalBlock()以確保寫入流末尾填充 - 否則,您可能最終錯過流的最后一個塊,這將導致無效的填充異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM