AES仅在密钥大小设置为256位时接受16位密钥 [英] AES Only accepting 16 bit key when key size is set to 256-bit

查看:119
本文介绍了AES仅在密钥大小设置为256位时接受16位密钥的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨我有一个文件加密程序即时工作,我在最后几个步骤但由于某种原因我只能将加密密钥设置为16位,因为我应该接受32位密钥,因为我已设置密钥大小到256位AES?



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?

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);
            }

        }
    }

}





如你所见,我试图将字节设置为32位整数,但仍然没有快乐。



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

推荐答案

您遇到的问题是您永远不会确保 Genkey.Text 中的文本被填充或截断为正确的大小。您的密钥需要为32个字节,而您的IV需要为16个字节(基于您的256位密钥和128位块)。如果你查看我的代码,你会看到我如何使用 PadLeft 方法处理它。



你可以将以下代码插入控制台应用程序进行测试,只需确保创建输入文件。



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.

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);
            }
        }
    }
}


这篇关于AES仅在密钥大小设置为256位时接受16位密钥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆