Click here to Skip to main content
15,920,005 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi i have a file encryption program that im working on and im on the last few steps but for some reason i can only set the encryption key to 16 bits when it should be accepting 32 bit keys because i have set the key size to 256 bit AES?

C#
private void Encrypt_Click(object sender, RoutedEventArgs e)
{
    {
        Stream myStream;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "Encrypted File (*.enc)|*.enc";
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == true)
        {
            if ((myStream = saveFileDialog1.OpenFile()) != null)
                myStream.Close();
            {
                using (AesManaged encrypt = new AesManaged())
                {
                    encrypt.KeySize = 256;
                    encrypt.BlockSize = 128;


               UTF8Encoding utf = new UTF8Encoding();
               byte[] newkey = new byte[32];
               newkey = utf.GetBytes(Genkey.Text);
                string cryptFile = saveFileDialog1.FileName;
                using (FileStream fileCrypt = new FileStream(cryptFile, FileMode.Create))
                {


                    using (CryptoStream cs = new CryptoStream(fileCrypt, encrypt.CreateEncryptor(newkey, newkey), CryptoStreamMode.Write))
                        {
                            using (FileStream fileInput = new FileStream(Openfile.Text, FileMode.Open))
                            {
                                int data;
                                while ((data = fileInput.ReadByte()) != -1)
                                    cs.WriteByte((byte)data);
                            }
                        }
                    }
                }
                MessageBox.Show("File Successfully Encrypted", "Encrypted!", MessageBoxButton.OK, MessageBoxImage.Information);
            }

        }
    }

}


As you can see i have tried to set the byte to a 32 bit integer but still no joy.
Posted

1 solution

The problem you are running into is you are never making sure the text in Genkey.Text is padded or truncated to the correct size. Your key needs to be 32 bytes while your IV needs to be 16 bytes (based on your 256 bit key and 128 bit block). If you look at my code, you will see how I handle this using the PadLeft method.

You can plug the following code into a console application to test, just make sure you have the input file created.

C#
static void Main(string[] args)
{
    string keyText = "Test";
            
    byte[] keyBytes = ASCIIEncoding.ASCII.GetBytes(keyText.PadLeft(32));
    byte[] ivBytes = ASCIIEncoding.ASCII.GetBytes(keyText.PadLeft(16));

    Console.WriteLine("Key Length: {0}", keyBytes.Length);

    string inputFile = @"C:\TestFiles\Input.txt";
    string encryptedFile = @"C:\TestFiles\Output.enc";
    string decryptedFile = @"C:\TestFiles\Decrypted.txt";

    using (FileStream inputFileStream = File.Open(inputFile, FileMode.Open))
    using (FileStream outputFileStream = File.Open(encryptedFile, FileMode.Create))
    {
        using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
        {
            aesCryptoServiceProvider.KeySize = 256;
            aesCryptoServiceProvider.BlockSize = 128;

            aesCryptoServiceProvider.Key = keyBytes;
            aesCryptoServiceProvider.IV = ivBytes;

            ICryptoTransform cryptoTransform = aesCryptoServiceProvider.CreateEncryptor();

            using (CryptoStream cryptoStream = new CryptoStream(outputFileStream, cryptoTransform, CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[inputFileStream.Length];
                inputFileStream.Read(buffer, 0, buffer.Length);
                cryptoStream.Write(buffer, 0, buffer.Length);
            }
        }
    }

    using (FileStream inputFileStream = File.Open(encryptedFile, FileMode.Open))
    using (FileStream outputFileStream = File.Open(decryptedFile, FileMode.Create))
    {
        using (AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider())
        {
            aesCryptoServiceProvider.KeySize = 256;
            aesCryptoServiceProvider.BlockSize = 128;

            aesCryptoServiceProvider.Key = keyBytes;
            aesCryptoServiceProvider.IV = ivBytes;

            ICryptoTransform cryptoTransform = aesCryptoServiceProvider.CreateDecryptor();

            using (CryptoStream cryptoStream = new CryptoStream(outputFileStream, cryptoTransform, CryptoStreamMode.Write))
            {
                byte[] buffer = new byte[inputFileStream.Length];
                inputFileStream.Read(buffer, 0, buffer.Length);
                cryptoStream.Write(buffer, 0, buffer.Length);
            }
        }
    }
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900