簡體   English   中英

CryptographicEngine.Decrypt方法在ac#UWP應用中返回錯誤

[英]CryptographicEngine.Decrypt method return an error in a c# UWP app

我不明白為什么這段代碼會返回錯誤:

Data error (cyclic redundancy check). (Exception from HRESULT: 0x80070017)

因為Silverlight Platform中的等效代碼不會引發異常。這是下面的UWP c#代碼:

public static async Task<Stream> Decrypt(Stream source,
            IBuffer easKey,IBuffer IV, byte[] masterKey)
        {
            try
            {

                SymmetricKeyAlgorithmProvider aes = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
                if ((source.Length % aes.BlockLength) != 0)
                {
                    var temp = new MemoryStream();
                    temp.SetLength(source.Length + (aes.BlockLength - source.Length % aes.BlockLength));
                    source.CopyTo(temp);
                    source = temp;
                }

                CryptographicKey symmKey = aes.CreateSymmetricKey(easKey);
                var sarray = ((MemoryStream)source).ToArray();
                IBuffer resultBuffer = CryptographicEngine.Decrypt(symmKey,sarray.AsBuffer(), IV);
                byte[] result;
                CryptographicBuffer.CopyToByteArray(resultBuffer, out result);

                return new MemoryStream(result);


            }
            catch (Exception e)
            {
                await new MessageDialog(e.StackTrace, e.Message).ShowAsync();
            }
            return null;

        }

vcsjones在您的問題下的評論中占據了重要位置。 如果您檢查數據長度是否為塊長度的偶數倍,而不是塊長度的倍數,則應立即拋出異常,表明數據不正確。 因為用AES加密的任何東西都不會導致與塊長度的偶數倍不同的東西。 即使是空字符串也會產生一個1塊長的密文。

話雖如此,您已經准備好使用PKCS7填充解密塊的加密算法。 另一方面,如果得到一個較短的塊,則將其復制到正確長度的MemoryStream中。 我假設最后一個字節為零。 因此,該塊不是有效的密文塊。

PKCS7填充將X字節數相加以獲得塊大小的偶數倍,並且這些字節中的每個字節都是相同的數。 因此,如果塊大小為16個字節(128位),而最后一個塊僅包含10個字節的實際信息,則將最后6個字節填充為0x06 0x06 0x06 0x06 0x06 0x06。

不過,關鍵是在加密之前,將此填充添加到純文本中。 您不能簡單地將填充添加到部分密文的末尾並能夠對其進行解密。 這些強加密算法的本質是,塊中任何給定位的最終值實際上是該塊中其他所有位的函數。 因此,如果丟失了該塊的任何部分,則將無法挽回地丟失整個塊。

現在,如果您確實確實需要盡可能多地解密消息,則丟棄部分塊(無論如何我都不會像上面提到的那樣解密它)。 用0x10的完整塊替換它(重復16次)。 這告訴算法,您有正好為X數量的純文本塊,並且對於每個PKCS7,您正好添加了整個與PKCS7兼容的填充塊。 這將允許您解密除消息的部分塊以外的所有塊。

編輯說您應該使用相同的密鑰對填充塊進行加密,並將其附加到密文上,以便能夠解密除部分塊以外的所有塊。 但這畢竟不是最簡單的方法。 在您的位置,我只需將解密設置更改為padding = None。 再次丟棄該部分塊,其余部分只要沒有損壞就應該解密而沒有問題。

暫無
暫無

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

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