Search code examples
c#aescryptoserviceprovider

AES Implementation issue


Here is my code for AES implementation. When string is passed, it Encrypt the string successfully. but when i try to convert byte[] into sting using the above mentioned method, it gives error. and same it does not perform decryption. next all value returning null in console windows. Here is the error on screen: Error: Padding is invalid and cannot be removed.this error is occurring when i try to insert the value in database. and when try to retrieve null value gets in return.what should i do?

namespace AES_Implmentatio
{
class Program
{
    static void Main(string[] args) // write public in start
    {
        try
        {
            string original = "Here is some data to encrypt!";


            using (AesManaged myAes = new AesManaged())
            {
                //byte[] cipherbytes = System.Text.ASCIIEncoding.Default.GetBytes(encypted);
                //string result = Encoding.ASCII.GetString(encrypted);

                Console.WriteLine("Original:   {0}", original);
                byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
                string result1 = Encoding.ASCII.GetString(encrypted); // Not showing the results 
                Console.WriteLine("Encypted Data", result1);

                byte[] cipherbytes = System.Text.ASCIIEncoding.Default.GetBytes(result1);
                string roundtrip = DecryptStringFromBytes_Aes(cipherbytes, myAes.Key, myAes.IV);



            }

        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e.Message);
        }
        Console.ReadLine();
    }
    static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
    {
        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("IV");
        byte[] encrypted;
        // Create an AesManaged object
        // with the specified key and IV.
        using (AesManaged aesAlg = new AesManaged())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {

                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }


        // Return the encrypted bytes from the memory stream.
        return encrypted;

    }

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

        // Declare the string used to hold
        // the decrypted text.
        string plaintext = null;

        // Create an AesManaged object
        // with the specified key and IV.
        using (AesManaged aesAlg = new AesManaged())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

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

            // Create the streams used for decryption.
            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {

                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }

        }

        return plaintext;

    }
}
}

Solution

  • You can't convert binary encrypted data to an string. If you want an intermediate string then you can convert the data to base64 and back, else it will be damaged:

                Console.WriteLine("Original:   {0}", original);
                byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
                string result1 = Convert.ToBase64String(encrypted); //Convert binary data to base64 data
                Console.WriteLine("Encypted Data", result1);
    
                byte[] cipherbytes = Convert.FromBase64String(result1); // Convert base64 data to binary data
                string roundtrip = DecryptStringFromBytes_Aes(cipherbytes, myAes.Key, myAes.IV);