当我研究某些方法所消耗的时间时,我发现加密比解密花费更多的时间。这是正确的吗?我正在使用 AES(在 enc 和 dec 期间将采取相同的步骤)
为什么AES加密比解密需要更多时间?
信息安全
加密
AES
2021-09-03 20:28:55
1个回答
多个对称分组密码(特别是像 AES、DES、Blowfish、RC5 之类的密码)在对单个块(例如 AES 的 128 位)进行操作时,将花费相同的时间(在测量误差范围内)进行加密和解密。
但是,在加密/解密多个块时它看起来不同的原因有几个。例如,使用密码块链接(CBC),必须按顺序进行加密(先加密块 0,然后再加密块 1,然后再加密块 2……),而解密可以并行化为 XOR 步骤(使用前一个密文块)是在应用块密码之后完成的。
请参见下图(XOR 用带圆圈的加号 ⊕ 表示)。要加密第二个明文块p[1]
,您使用,这意味着您在完成生成之前c[1] = AES_Encrypt(p[1] XOR c[0])
无法生成。c[1]
c[0]
同时要解密第二个密文块,您使用p[1] = c[0] XOR AES_Decrypt(c[1])
. 这不依赖于前一个明文块,p[0]
因此可以完全并行化(并且可以在多核系统上运行得更快)。
如果您想要快速解密和加密,您可以考虑使用 CTR,因为它可以在加密和解密上并行化。
您还可能应该警惕由于系统上的缓存而出现偏差的测试。如果您随机决定从磁盘读取文件并对其进行加密,则读取文件的每个块需要几毫秒;但是,下次您访问它时,该文件通常会缓存在内存中并且访问速度会更快。同时,对于您的解密测试,最近写入磁盘的加密文件可能仍然在内存中的缓存中,并且不会受到从磁盘读取的惩罚。
点击率时间
$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted
real 0m58.217s
user 0m5.788s
sys 0m8.493s
$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted
real 0m34.780s
user 0m4.800s
sys 0m7.748s
$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted
real 0m34.989s
user 0m4.120s
sys 0m6.444s
$ time openssl aes-256-ctr -d -salt -pass pass:passwd -in vmdk.encrypted -out decrypted
real 0m35.944s
user 0m4.140s
sys 0m7.008s
前三个加密显示了磁盘缓存的效果,其中文件的第一次访问比后续访问慢得多。它还显示,对于 CTR,这台 7.4G 虚拟机的加密/解密都花费了大约 35 秒。(偶尔重复,解密会更快或更慢)。
其它你可能感兴趣的问题