C# 128位AES和256位AES之间的加密时间差?

C# 128位AES和256位AES之间的加密时间差?,c#,cryptography,key,aes,rijndaelmanaged,C#,Cryptography,Key,Aes,Rijndaelmanaged,我正在开发一个程序,使用C#中的RijndaelManaged方法对USB驱动器进行加密,可以在128/192/256位密钥大小之间进行选择。 我假设使用256位密钥进行加密需要更多的时间,但是,即使使用大量文件,加密过程所需的时间也与使用128位密钥所需的时间完全相同。你认为这是一个编程错误吗 我使用此功能从密码生成密钥和iv: private List<byte[]> GenerateKeys(string password, int strength) { byte[]

我正在开发一个程序,使用C#中的RijndaelManaged方法对USB驱动器进行加密,可以在128/192/256位密钥大小之间进行选择。 我假设使用256位密钥进行加密需要更多的时间,但是,即使使用大量文件,加密过程所需的时间也与使用128位密钥所需的时间完全相同。你认为这是一个编程错误吗

我使用此功能从密码生成密钥和iv:

private List<byte[]> GenerateKeys(string password, int strength)
{
    byte[] key;
    byte[] iv;

    List<byte[]> result = new List<byte[]>();

    Rfc2898DeriveBytes rfcDb = new Rfc2898DeriveBytes(password, System.Text.Encoding.UTF8.GetBytes(password));

    key = rfcDb.GetBytes(strength); // strength value can be 16, 24 or 32 depending
    iv = rfcDb.GetBytes(strength);  // on the user choice


    result.Add(key);
    result.Add(iv);

    return result;
}

你看到有什么问题吗?

AES-256使用14轮,AES-128使用10轮。当然,关键的日程安排有更大的投入,但这并不重要。加密/解密期间的状态大小相同(因为块大小相同)。所以你应该预计最多有40%左右的速度差

对于较小的文件:
Rfc2898DeriveBytes
使用HMAC进行SHA-1和1000(!)次迭代。这将比AES加密慢得多。此外,您还需要担心磁盘寻道时间和操作系统调用

对于较大的文件,您可能会受到磁盘I/O的限制,特别是对于低速介质,如硬盘或USB-2驱动器。用HDD替换USB-2拇指驱动器对你没有多大帮助(如果有的话)


要测试AES速度,请从内存(甚至是同一个缓冲区反复加密)、使用RAM驱动器或购买SSD(根据测试的优先顺序,我始终建议购买SSD)。

如果您正在读取文件,时间可能主要由磁盘I/O控制,所以编码时间的差异可能变得无关紧要。@MatthewWatson:我也是这么想的,所以我试着用我的硬盘代替usb驱动器(读/写速度有限),结果是一样的。我会进一步调查。ArtjomB.:谢谢你的精确性。
RijndaelManaged rijndael = new RijndaelManaged();
rijndael.Mode = CipherMode.CBC;
rijndael.BlockSize = Strenght * 8;
rijndael.KeySize = Strenght * 8;
ICryptoTransform aesEncryptor = rijndael.CreateEncryptor(key, iv); // key and iv from the other method