雜湊作為相互獨立的鍵
對於級聯加密(即 AES-Twofish-Serpent),最安全的實現是使用相互獨立的密鑰。我的問題是,為每一層加密散列前一個密鑰是否安全。就我而言,Serpent 將是最內層的密碼,而 AES 是最外層的密碼。
password = "my_hopefully_secure_password" masterKey = argon2(password,...) serpentKey = sha3_256(masterKey) twofishKey = sha3_256(serpentKey) aesKey = sha3_256(twofishKey) ciphertext = aes(twofish(serpent(plaintext,serpentKey),twofishKey),aesKey)
在這種情況下,攻擊者必須首先攻擊 AES,因為它是外殼。假設攻擊者成功找到了 AES 的密鑰並對其進行了解密。現在攻擊者留下了 Twofish 和 Serpent,但 AES 密鑰沒有透露任何內容,因為它是 Twofish 密鑰的雜湊(雜湊是單向的)。如果攻擊者破解了 Twofish,他們仍然不會知道 Serpent 的密鑰,因為 Twofish 密鑰只是 Serpent 密鑰的雜湊。
這安全嗎?
編輯:這安全嗎?它是否提供 256 位安全性?該方案能否正確實現級聯加密並提供三層保護?
正如 Uraguan 提到的,打破這個方案所需的努力與密鑰空間的大小成正比。這裡有兩個限制因素。
其中一個因素是任何學習萬能鑰匙的人都可以輕鬆地提取其他人。因此,您的密鑰空間最多可以是 256 位大小,因為任何攻擊者最多只能嘗試 $ 2^{256} $ 輸入到密鑰空間以派生密鑰。如果您在這裡使用密碼,更好的方法是從 Argon2 中分別提取每個密鑰,這通常是獨立的。Argon2可以提供 $ 2^{512} $ 最多安全。
這裡的另一個因素是您使用的是密碼。如果您使用的是您記住的密碼,而不是您使用 CSPRNG 生成的密碼,那麼您的安全性是有限的,因為人們通常不擅長記住 256 位熵的密碼。再多的複雜操作也不會改變這一點。但是,如果您選擇了一個由 256 位熵偽隨機生成的密碼,那麼您在這裡不需要 Argon2,因為對密碼的攻擊仍然需要 $ 2^{256} $ 工作和 Argon2 主要旨在提高對熵相對較低的密碼攻擊的強韌性。
如果您的密碼以這種方式很強大,那麼您可以將 HKDF 與 HMAC-SHA-512(或任何其他合適的安全雜湊函式)一起使用,然後像這樣導出密鑰:
$ mainkey = HKDF-Extract(secret, salt) $ $ serpentkey = HKDF-Expand(mainkey, “serpent key”) $ $ twofishkey = HKDF-Expand(mainkey, “twofish key”) $ $ aeskey = HKDF-Expand(mainkey, “aes key”) $
這將提供與您的秘密中的熵相稱的安全性,直至散列函式的長度。
說了這麼多,我通常不建議使用這樣的不同算法進行多次加密。它增加了相當多的複雜性,並且不太可能顯著提高安全性。針對 AES-256 的最著名的非相關密鑰攻擊將其破解 $ 2^{254.4} $ ,這比蠻力快不到四倍,並且在可預見的未來仍有望超出我們的能力,但量子電腦除外。