Aes
為什麼 Blowfish 比 AES 快?
我無法準確理解 Blowfish 比 AES 快的原因。它取決於塊大小嗎?還是依賴於處理器?(如果是,那麼假設不使用 AES 加速器)我想知道它背後的確切原因。謝謝。
Blowfish 在速度方面具有優勢,因為批量加密(和解密)減少到以下交替:8->32 位表查找,以及一個或兩個 32 位操作(加法或 XOR)。這種結構非常適合具有短流水線和至少 4 kByte 快速記憶體的 32 位 CPU;並且非常適合直接的 C 實現,它生成的程式碼通常非常接近最優。
對於每個加密的字節,除非我記錯了:
- Blowfish 平均執行 8 次表查找和 10.25 次直接 32 位操作。
- AES-128 平均執行 10 次表查找和7.75次 10.25 次直接 32 位操作(使用常見優化時也需要 4 kByte 的表)。
表查找比直接的 32 位操作要昂貴得多(其中大部分在實踐中幾乎是免費的),並且占主導地位。因此,是的,Blowfish 可以比在軟體中實現的 AES 快一點;特別是如果 AES 實現沒有優化到最大值,或者是 AES-256。
除此之外,Blowfish 和 AES 不在同一個聯賽中,而且 AES 經常不戰而勝:
- Blowfish 是 64 位分組密碼,而 AES 是 128 位分組密碼;在越來越多的應用程序中,這是一個嚴重的問題。
- Blowfish 密鑰設置是一個緩慢的過程,每個實例在 RAM 中生成 4 kByte 的表。相比之下,AES 可以在沒有 RAM 的情況下有效地實現(至少在硬體中),並且(對於最常用的加密)根本不需要預計算(解密需要微小的預計算)。
- 用於快速軟體 AES 實現的 4 kByte 表(或 1 kByte、512 字節甚至 256 字節)可以在實例之間(或在 ROM/快閃記憶體中)共享,但不能在 Blowfish 中共享。
這使得 Blowfish 在 64 位塊成為問題時成為一種糟糕的算法(例如,具有千兆字節數據的 CBC 模式);或者當密鑰敏捷性很重要時(有時 Blowfish 的密鑰設置相對緩慢是一種資產,請參閱bcrypt);或用於硬體實現;或者當 4 kByte 是很多 RAM 時(例如某些嵌入式系統,或處理許多同時連接的伺服器)。
另外:正如cherio 的評論中正確指出的那樣,AES 在許多現代 CPU 上都有硬體實現,這遠遠抵消了 Blowfish 可能擁有的任何速度優勢(但問題指出“未使用 AES 加速器”)。