“Padding is invalid and cannot be removed” using AesManaged

前端 未结 6 882
傲寒
傲寒 2020-11-29 04:55

I\'m trying to get simple encryption/decryption working with AesManaged, but I keep getting an exception when trying to close the decryption stream. The string here gets en

6条回答
  •  温柔的废话
    2020-11-29 05:45

    The trick is to use MemoryStream.ToArray(). I also changed your code so that it uses the CryptoStream to Write, in both encrypting and decrypting. And you don't need to call CryptoStream.FlushFinalBlock() explicitly, because you have it in a using() statement, and that flush will happen on Dispose(). The following works for me.

    byte[] rawPlaintext = System.Text.Encoding.Unicode.GetBytes("This is all clear now!");
    
    using (Aes aes = new AesManaged())
    {
        aes.Padding = PaddingMode.PKCS7;
        aes.KeySize = 128;          // in bits
        aes.Key = new byte[128/8];  // 16 bytes for 128 bit encryption
        aes.IV = new byte[128/8];   // AES needs a 16-byte IV
        // Should set Key and IV here.  Good approach: derive them from 
        // a password via Cryptography.Rfc2898DeriveBytes 
        byte[] cipherText= null;
        byte[] plainText= null;
    
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(rawPlaintext, 0, rawPlaintext.Length);
            }
    
            cipherText= ms.ToArray();
        }
    
    
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(cipherText, 0, cipherText.Length);
            }
    
            plainText = ms.ToArray();
        }
        string s = System.Text.Encoding.Unicode.GetString(plainText);
        Console.WriteLine(s);
    }
    

    Also, I guess you know you will want to explicitly set the Mode of the AesManaged instance, and use System.Security.Cryptography.Rfc2898DeriveBytes to derive the Key and IV from a password and salt.

    see also:
    - AesManaged

提交回复
热议问题