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 攻擊,不適用於大量資料加密...