我正在开发一个使用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;
}
然后我以这种方式使用我的RijndaelManaged方法:
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
你看错了什么吗?
答案 0 :(得分:2)
AES-256使用14轮,AES-128使用10轮。关键时间表当然有更大的投入,但这并不重要。加密/解密期间的状态大小是相同的(因为块大小相同)。所以你应该期望最多的速度差异大约为40%左右。
对于较小的文件:Rfc2898DeriveBytes
使用HMAC与SHA-1和1000(!)迭代。这将比AES加密慢得多。除此之外,您还需要担心磁盘寻道时间和操作系统调用。
对于较大的文件,您可能会受到磁盘I / O的限制,尤其是对于诸如硬盘或USB-2驱动器之类的狗慢速介质。用硬盘替换USB-2拇指驱动器对你没有多大帮助(如果有的话)。
要测试AES速度,从内存(甚至反复使用相同的缓冲区)加密,使用RAM驱动器或购买SSD(按照优先顺序进行测试,我总是建议购买SSD)。