Windows phone 8 “;填充无效,无法删除”;使用AES管理

Windows phone 8 “;填充无效,无法删除”;使用AES管理,windows-phone-8,encryption,aes,Windows Phone 8,Encryption,Aes,我收到错误“填充无效,无法删除。” 尝试以块形式解密文件内容时(使用缓冲区)。我可以一次解密整个文件,但不能分块解密。我发现了许多关于这个问题的链接,其中大多数都建议设置托管对象的填充 如aesManaged.Padding=PaddingMode.None 但此属性在Windows phone应用程序中不可用。 方法如下: internal static byte[] DecryptBytes(byte[] cipherText, string password) { // Check

我收到错误“填充无效,无法删除。” 尝试以块形式解密文件内容时(使用缓冲区)。我可以一次解密整个文件,但不能分块解密。我发现了许多关于这个问题的链接,其中大多数都建议设置托管对象的填充 如aesManaged.Padding=PaddingMode.None 但此属性在Windows phone应用程序中不可用。 方法如下:

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;
}
内部静态字节[]解密字节(字节[]密文,字符串密码)
{
//检查参数。

如果(cipherText==null | | cipherText.Length不使用
aesManaged.Padding=PaddingMode.None
它只会隐藏错误,而不会解决错误。如果派生密钥不正确、密文不正确或-对于较小的密文-IV不正确,则会出现错误


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

csDecrypt.FlushFinalBlock()
应仅在[real]上调用最后一个块,不是任意块。另外,默认的
AesManaged::mode
是什么?它是可查找的模式吗?(请不要告诉我它的ECB)。这样使用相同的{key/iv}对可能是不安全的,不管操作的密码模式如何。