簡體   English   中英

關閉密碼流時 C# 中的 DES 解密錯誤“錯誤數據”

[英]DES decryption error “Bad Data” in C# when closing cryptostream

我嘗試解密一個加密的字節數組(用 K1 加密並用 K2 解密)。 Visual Studio 在嘗試關閉我的加密 stream 時拋出異常“BAD DATA”

這是我的DES解密代碼片段

public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }

初始向量與加密相同。 我不知道為什么會發生這個錯誤。

補充:根據 Greg B 的建議,我在這里發布了我的加密代碼片段。 加密的 output 是解密的輸入(兩個不同的密鑰)

        public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv)
    {
        MemoryStream ms = new MemoryStream();
        DES mDES = DES.Create();
        mDES.Key = key;
        mDES.IV = iv;
        mDES.Padding = PaddingMode.PKCS7;
        CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(cipherData, 0, cipherData.Length);
        cs.Close();
        Byte[] decryptedData = ms.ToArray();
        return decryptedData;
    }

您遇到的問題來自所選的填充模式。

由於在解密密文時使用了填充,因此加密流會在您檢索解密的字節時嘗試刪除填充。 由於您不使用加密數據的密鑰,因此您將得到“垃圾”......密碼流無法檢測到需要刪除的填充,並且操作失敗並出現觀察到的異常。

如果您想使用 DES class 重建 3DES 之類的東西,請使用 PaddingMode NONE 進行解密和以下加密步驟(因此只有第一次加密或最后一次解密使用填充)

暫無
暫無

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

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