I have a problem with AES encryption / decryption. The commented code worked, but sometimes it gave the error "the filling is invalid and cannot be deleted", so I changed it, as explained here. The filling is invalid and cannot be deleted. Exception when decrypting a string using "AesManaged" C #
but when I tried this, the code below when decrypting gives an empty string. I do not know where I am wrong. The two static functions bytesToString and stringToBytes have nothing to do with encryption, and I use them elsewhere. The key length and block size are OKAY. I found this in debbuger:
'' csEncrypt.Length 'throws an exception of type' System.NotSupportedException "
I am working on 3.5.NET Visual STudio 2008
there is prtscr from the debugger, as you can see, after you left the block, encrypted with a length of 0 bytes, and the cryptostrel has some exceptions
Print screen from debugger
How to fix it? Please give me some tips.
static class Aes { public static string bytesToHexString(byte[] key) { return BitConverter.ToString(key).Replace("-", String.Empty); } public static byte[] stringToBytes(string key) { return Enumerable.Range(0, key.Length) .Where(x => x % 2 == 0) .Select(x => Convert.ToByte(key.Substring(x, 2), 16)) .ToArray(); } public static void generateKeyAndIv(out byte[] key, out byte[] IV) { using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) { aesAlg.BlockSize = 128; aesAlg.KeySize = 256; aesAlg.Padding = PaddingMode.None;
Well, maybe I will explain the whole situation a little more. I wrote my own secure email. I have 2x encryption. Communication between the server and the client is encrypted by RSA and AES. Messages created by users are also encrypted with RSA + AES.
Post Message
as follows:
- The client connects to the server.
- They establish a secure connection (the server sends its public key, the client generates an AES key, encrypts it through the serverβs public key and sends it to the server. After that, the server and the client use the AES key for communication).
- The client creates the message in XML, the message may contain files that are read on base64, and after that they are encrypted using AES.
- The message is written to db.
Receiving a message is as follows:
- Connection to the server.
- Establish a secure connection.
- Receive messages from the server.
- Decrypt the AES key using the RSA private key.
- Decrypt the message using the decrypted AES key.
- If there are files, decrypt them with AES and base64_decode in bytes and save.
Now the problem is encryption of big data. Sometimes there are even 200-300 kB.
Another interesting thing that I discovered is that when I run the code through the debugger, it works, but when I run the code without it. This does not work.
Decision
I found a solution to the problem. Since I used AES encryption / decryption twice very fast one after another with different / ivs keys, the garbage collector did not clear these objects. The solution was added
GC.Collect(); GC.WaitForPendingFinalizers();
before returning DecryptStringFromBytes_Aes and EncryptStringToBytes_Aes
I hope this helps someone who has the same problem as mine.