3

Every time I run this and encrypt, the output is variable, and when I attempt to decrypt I get "Padding is invalid and cannot be removed." Been fighting with this for a day or two now and I am at a loss.

    private static string strIV = "abcdefghijklmnmo"; //The initialization vector.
    private static string strKey = "abcdefghijklmnmoabcdefghijklmnmo"; //The key used to encrypt the text.

    public static string Decrypt(string TextToDecrypt)
    {
        return Decryptor(TextToDecrypt);
    }

    private static string Encryptor(string TextToEncrypt)
    {
        //Turn the plaintext into a byte array.
        byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);            

        //Setup the AES providor for our purposes.
        AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
        aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
        aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
        aesProvider.BlockSize = 128;
        aesProvider.KeySize = 256;            
        aesProvider.Padding = PaddingMode.PKCS7;
        aesProvider.Mode = CipherMode.CBC;

        ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);            
        byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length);
        return Convert.ToBase64String(EncryptedBytes);                        
    }

    private static string Decryptor(string TextToDecrypt)
    {
        byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt);

        //Setup the AES provider for decrypting.            
        AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
        aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
        aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
        aesProvider.BlockSize = 128;
        aesProvider.KeySize = 256;            
        aesProvider.Padding = PaddingMode.PKCS7;
        aesProvider.Mode = CipherMode.CBC;

        ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);
        byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length);
        return System.Text.Encoding.ASCII.GetString(DecryptedBytes);
    }
}
user274063
  • 33
  • 1
  • 1
  • 4

1 Answers1

11

You need to set the BlockSize and the KeySize before you set the Key and the IV. Additionally you should probably be generating a random IV for each message and note that ICryptoTransform implements IDisposable so these objects should be disposed.

Dave
  • 4,420
  • 1
  • 34
  • 39
  • This was the response that solved my problem. Everybody was really helpful. It would have took me awhile to realize that setting those properties were order dependent. Thanks Dave! – user274063 Feb 16 '10 at 06:19
  • The AesCryptoServiceProvider used in this example also implements IDisposable as it is the unmanaged AES implementation available in .NET. A using statement is recommended. – enablor Feb 02 '12 at 18:38
  • @GregLoehr Can you please elaborate more give some sample code as I am new bee to windows and getting the same crash for padding at "TransformFinalBlock". I have set `aesProvider.BlockSize = 128; aesProvider.KeySize = 256; aesProvider.IV = App.iv; aesProvider.Key = KeyHashValue; aesProvider.Mode = CipherMode.CBC; aesProvider.Padding = PaddingMode.PKCS7;` – Heena Jun 21 '17 at 08:18