1993 年,密碼學家 Bruce Schneier 設計了 Blowfish,目標是以一款免費、快速且安全的演算法取代老舊的 DES。時至今日,它仍活躍於密碼雜湊與加密場景中。
演算法核心架構
Blowfish 採用 64-bit 區塊大小,支援 32 至 448-bit 可變金鑰長度,以 Feistel 網路結構進行 16 輪加密迭代。其設計核心包含兩個關鍵元件:一組 18 個 32-bit 的 P 陣列(P-array),以及四個 256 項的 S-Box 替換表,總計佔用約 4KB 記憶體。金鑰排程(Key Schedule)階段需執行 521 次加密運算,這使得暴力破解的成本極高。每次更換金鑰都必須重新計算 P 陣列與 S-Box,此特性讓 Blowfish 對字典攻擊具備天然抵抗力,也是 bcrypt 密碼雜湊函式選用它作為底層的主因。
實際應用與限制
Blowfish 在軟體環境中的加密速度極快,於當時明顯優於 DES 與 3DES。其免費授權特性促使 OpenSSH、OpenVPN 及多款加密工具廣泛採用。然而,64-bit 區塊大小是現代環境下的主要限制:當加密資料量超過 4GB 時,會面臨「生日攻擊」(Birthday Attack)風險,即 SWEET32 漏洞。因此 Schneier 本人建議,新系統應優先採用 Twofish 或 AES 等 128-bit 區塊演算法。Blowfish 目前最適合的場景仍是透過 bcrypt 進行密碼儲存,而非大量資料的串流加密。
import bcrypt
password = b"my_secret_password"
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
print(bcrypt.checkpw(password, hashed)) # True
💡 重點整理
- 結構:16 輪 Feistel 網路,P 陣列 + 4 個 S-Box,金鑰長度 32~448-bit。
- 優勢:金鑰排程成本高,天然抵抗暴力破解與字典攻擊。
- 限制:64-bit 區塊易受 SWEET32 攻擊,不適用於大量資料加密。
- 最佳用途:透過 bcrypt 進行密碼雜湊,而非直接用於資料加密。
Blowfish 是一個設計優雅的時代產物。若你的需求是密碼儲存,bcrypt 仍是可靠選擇;若需加密大量資料,請直接升級至 AES-256。
📚 參考文獻
- Bruce Schneier, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)(1993)— schneier.com/academic/blowfish
- SWEET32 Attack Research — sweet32.info
- Python bcrypt 套件文件 — pypi.org/project/bcrypt
⚠️ 本文內容基於撰寫時的最新資訊,實際應用時請參考官方文件的最新版本。
留言
張貼留言