“填充无效,无法删除”使用AesManaged

时间:2014-09-03 14:00:26

标签: windows-phone-8 encryption aes

我收到错误"填充无效,无法移除。" 尝试以块的形式解密文件内容时(使用缓冲区)。我能够一次解密整个文件,但不能在块中解密。我找到了很多关于这个问题的链接,他们中的大多数建议设置Padding of AesManaged对象 比如 aesManaged.Padding = PaddingMode.None 但是这个属性在窗口电话应用程序中不可用。 以下是方法:

internal static byte[] DecryptBytes(byte[] cipherText, string password)
{
    // Check arguments.
    if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("cipherText");

    byte[] decryptedBytes= new byte[cipherText.Length];

    using (var rijAlg = new AesManaged { KeySize = 256, BlockSize = 128 })
    {
        var key = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(Salt));
        rijAlg.Key = key.GetBytes(rijAlg.KeySize / 8);
        rijAlg.IV = key.GetBytes(rijAlg.BlockSize / 8);

        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

        // Create the streams used for decryption.
        using (var msDecrypt = new MemoryStream())
        {
            using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write))
            {
                csDecrypt.Write(cipherText, 0, cipherText.Length);
                csDecrypt.FlushFinalBlock();
            }
            decryptedBytes = msDecrypt.ToArray();
        }
    }
    return decryptedBytes;
}

请在上述代码或任何其他解决方法中建议问题

1 个答案:

答案 0 :(得分:1)

不要使用aesManaged.Padding = PaddingMode.None它只会隐藏错误,而不会解决错误。你会得到错误导出的密钥,不正确的密文或 - 对于较小的密文 - 错误的IV。

在执行解密之前,以十六进制格式打印所有输入的值,然后将它们与为加密获得的值进行比较。