0
votes

In DevGlan, at https://www.devglan.com/online-tools/aes-encryption-decryption, there is an online tool where you can upload a file and then encrypt it into Base64 format by using AES encryption and also choosing a cipher mode, secret key, and initialization vector. I want to achieve the same thing in my C# web app. Here is my code:

FileUpload3.SaveAs(Server.MapPath(FileUpload3.FileName));
string inputFile = Server.MapPath(FileUpload3.FileName);
byte[] bytesToEncrypt = File.ReadAllBytes(inputFile);
byte[] encryptedBytes = EncryptAESfile(bytesToEncrypt, CipherMode.CBC, keyArray, IV);
string encryptedFileBase64 = Convert.ToBase64String(encryptedBytes);
string encryptedFileHex = BitConverter.ToString(encryptedBytes).Replace("-", "");

    public byte[] EncryptAESfile(byte[] data, CipherMode mode, byte[] key, byte[] iv)
    {
        byte[] encryptedData = null;
        if (data == null)
            throw new ArgumentNullException("data");

        if (data == key)
            throw new ArgumentNullException("key");

        if (data == iv)
            throw new ArgumentNullException("iv");

        using (RijndaelManaged aesAlg = new RijndaelManaged())
        {
            aesAlg.Key = key;
            aesAlg.IV = iv;
            aesAlg.Mode = mode;
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            encryptedData = encryptor.TransformFinalBlock(data, 0, data.Length);
        }

        return encryptedData;
    }

The code does return a Base64 string of the file, as in the variable encryptedFileBase64, but not the correct one in reference to DevGlan. My code only returns a Base64 string of length 24 whereas DevGlan returns a string of nearly 100,000 characters. Also, when I test to see if bytes are being read, the following code returns 0, so the problem could be in my first few lines:

lblBytes.Text += "Bytes read: " + bytesToEncrypt.Length;

I've also seen many examples of encrypting files - whether in AES or some other symmetric encryption algorithm - but not ones that return a Base64 string. Most end with lines like this before the CryptoStream is closed:

byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);   // The input FileStream
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

Reference: Encrypting any file using AES

Is there a way to read the byte array of the CryptoStream and then convert it to Base64, because I don't see bytearrayinput left alone as storing the correct information. Help would be much appreciated. Thanks!

1
If you're reading zero bytes from the input file, you definitely need to solve that problem first. The rest of your question (encryption etc) isn't really even relevant. Does the file exist? What does Server.MapPath do to it? - Blorgbeard
The file should exist - as it is uploaded via an ASP.NET FileUpload control, and then the Server.MapPath() method saves it to my Azure web server's root directory, which is D:/home/site/wwwroot. If you're interested in helping me, I need to figure out how to get the file from the FileUpload control and then put it in the code to encrypt it through Rijndael. - Max Voisard

1 Answers

0
votes

First: How is key created? Have you double-checked that your salt is the same?

Also I haven't checked, but this code should work:

AesManaged cipher = new AesManaged();
cipher.Mode = MODE;
ICryptoTransform encryptor = cipher.CreateEncryptor(KEY, IV);
MemoryStream to = new MemoryStream();
CryptoStream writer = new CryptoStream(to, encryptor, CryptoStreamMode.Write);

writer.Write(input, 0, input.Length);
writer.FlushFinalBlock();
byte[] encrypted = to.ToArray();
return Convert.ToBase64String(encrypted);