我无法确切了解Blowfish比AES更快的原因。它取决于块大小吗?还是取决于处理器? (如果是,则假定未使用AES加速器)我想知道其背后的确切原因。谢谢。

#1 楼

Blowfish在速度方面具有强项,因为批量加密(和解密)减少了以下交替形式:8-> 32位表查找以及一个或两个32位操作(加法或XOR)。这种结构非常适合具有短管线和至少4 kByte快速缓存的32位CPU。并且非常适合直接的C实现,该实现通常会生成非常接近最优的代码。

对于每个加密的字节,除非我记错了: Blowfish平均执行8次表查找和10.25个直接的32位操作。
AES-128平均执行10次表查找和7.75个10.25个直接32位操作(使用通用优化时也需要4 KB的表)。

表查找要比直接的32位操作昂贵(大多数操作实际上几乎都是免费的),并且控制了成本。因此,是的,Blowfish的速度可能比软件中实现的AES快。尤其是如果AES实现没有优化到最大程度或不是AES-256。 />

Blowfish是64位块密码,而AES是128位块密码;在越来越多的应用程序中,这是一个严重的问题。
Blowfish密钥设置是一个缓慢的过程,每个实例在RAM中产生4 KB的表。相比之下,AES可以高效地(至少在硬件中)无需RAM即可实现,并且(对于加密,这是最常用的)根本不需要预计算(解密需要很小的预计算)。用于快速软件AES实现的kByte表(或1 kByte,512字节,甚至256字节,具有速度折衷)可以在实例之间共享(或在ROM /闪存中),而在Blowfish中不能共享。
当出现64位块时(例如具有千兆字节数据的CBC模式),这使得Blowfish成为一种可怕的算法;或在密钥敏捷性很重要时(有时Blowfish的密钥设置相对缓慢是一种资产,请参阅bcrypt);或者或用于硬件实现;或当4 kByte的RAM很大时(例如某些嵌入式系统或处理许多同时连接的服务器)。

另外:正如cherio评论中正确指出的那样,AES在许多现代CPU上都有硬件实现,并抵消了Blowfish可能具有的任何速度优势(但问题是“未使用AES加速器”)。

评论


$ \ begingroup $
非常感谢您抽出宝贵时间给出详细的答案。
$ \ endgroup $
–Sid
2013年4月17日14:07在

$ \ begingroup $
在现实世界中,AES的确可能比河豚更快。这些旧的Linux dm-crypt基准测试。
$ \ endgroup $
–SørenLøvborg
2013年12月10日18:46



$ \ begingroup $
没有RAM如何实现?
$ \ endgroup $
– Melab
15年3月22日在18:45

$ \ begingroup $
如今,大多数CPU都支持AES指令。如果启用,EAS将河豚从水中吹走。测试您的计算机是否已启用:access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/…
$ \ endgroup $
–oᴉɹǝɥɔ
17年1月12日在18:38

$ \ begingroup $
@GroovyDotCom:对于AES和Blowfish,用于解密的表查找的数量(以及AFAIK,成本)与加密中的相同。在AES中(至少在软件中)解密比加密略慢,这是由于另一个原因:InvMixColumns比MixColumns花费更大。同样,解密时无法进行AES子密钥的即时计算,这会影响无法在多个加密之间摊销子密钥派生的实现。
$ \ endgroup $
–fgrieu♦
20 Nov 25'8:50