Encryption
使用安全 PRNG 進行 XOR 加密有什麼問題?
假設我想用密碼加密一條消息。
難道我不能將字節與來自加密安全偽隨機數生成器 (CSPRNG) 的字節進行異或運算,種子是密碼或它的雜湊值嗎?我看不出這有什麼問題。
還是 CSPRNG 太慢以至於需要更複雜的加密方案?
與消息進行異或以獲取密文的字節稱為密鑰流。使用 CSPRNG yes、密碼安全的偽隨機數生成器和靜態種子來創建密鑰流是安全的。
但是,如果您使用系統的 CSPRNG,則會出現實際問題:
- 它可能會決定偶爾(重新)播種;
- 算法可能會隨著時間或系統之間的變化而變化;
- 提取隨機字節的方式可能會改變(例如,它可能決定對齊單詞)。
因此,在使用 CSPRNG 操作加密某些內容之前,您必須確保它是一成不變的。在最壞的情況下,隨機數據被包含在您的密碼中,在這種情況下,數據實際上會失去。這發生在Sun 的“SHA1PRNG”首先被另一種算法替換,然後被 Android 上的 OpenSSL 隨機數據替換之前。
從理論上講,流密碼(或流模式下的分組密碼)都是 CSPRNG,其中有一個種子(密鑰和 IV/nonce 的組合)、特定算法和檢索密鑰流的規定方式。所以通常無聊的答案是使用 AES-CTR 來創建密鑰流,並使用 AES-GCM - 它在內部使用 AES-CTR - 如果您還需要消息身份驗證。在沒有硬體加速的系統上,可以使用諸如 ChaCha20 之類的流密碼。
稍微不那麼無聊,您還可以使用計數器模式從散列函式建構流密碼。最好使用 MAC 結構,例如 HMAC。實際上,系統提供的大多數 CSPRNG 僅此而已 - 但如前所述,它們通常旨在提供隨機數據,而不是確定性數據。是的,通常這些算法比專用流密碼或硬體加速分組密碼慢——它們更複雜而不是更簡單。