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

时间:2015-02-10 13:15:05

标签: c# cryptography key aes rijndaelmanaged

我正在开发一个使用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

你看错了什么吗?

1 个答案:

答案 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)。