【问题标题】:Encryption time difference between 128-bits AES and 256-bits AES?128位AES和256位AES的加密时间差?
【发布时间】:2015-04-10 13:00:16
【问题描述】:

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

你看出什么不对了吗?

【问题讨论】:

  • 如果是读取文件,时间很可能以磁盘I/O为主,所以编码时间的差异可能会变得微不足道。
  • @MatthewWatson :我也是这么想的,所以我尝试在我的硬盘驱动器上而不是 USB 驱动器上(读/写速度有限),结果是一样的。我会进一步调查。 Artjom B. : 谢谢你的精确。

标签: c# cryptography key aes rijndaelmanaged


【解决方案1】:

AES-256 使用 14 轮,AES-128 使用 10 轮。关键时间表当然有更大的输入,但这应该无关紧要。加密/解密期间的状态大小相同(因为块大小相同)。所以你应该预计最多会有大约 40% 左右的速度差异。

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

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

要测试 AES 速度,从内存(甚至反复使用相同的缓冲区)加密,使用 RAM 驱动器或购买 SSD(按照测试的优先顺序,我总是建议购买 SSD)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2019-08-17
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2013-08-11
    • 2016-05-26
    相关资源
    最近更新 更多