C# 128位AES和256位AES之间的加密时间差?
我正在开发一个程序,使用C#中的RijndaelManaged方法对USB驱动器进行加密,可以在128/192/256位密钥大小之间进行选择。 我假设使用256位密钥进行加密需要更多的时间,但是,即使使用大量文件,加密过程所需的时间也与使用128位密钥所需的时间完全相同。你认为这是一个编程错误吗 我使用此功能从密码生成密钥和iv: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[]
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