將 CSPRNG 用於 One-time pad 或 AES 哪個更安全?
在閱讀有關一次性鍵盤的資訊時,它似乎需要真正的隨機鍵。由於生成真正的隨機值是不切實際的,這會帶來一個問題(從而使一次性填充不太實用)。相反,如果我使用作業系統提供的 CSPRNG 來生成密鑰,那是否比在 GCM 模式下使用 AES 更好?
**更新:**為了清楚起見,一次性墊不能用 CSPRNG 完成。
首先,一個術語 nit:請不要說“由 CSPRNG 生成的 One-time-pad”;根據定義,一次性 pad 必須是隨機生成的,其安全證明的一個重要部分是它是隨機生成的(因此攻擊者不能取消任何潛在的 pad 的資格,即使該攻擊者擁有無限的計算資源)。將 CSPRNG 輸出與明文異或形成密文是流密碼;雖然它是一個完全可用的原語,但它不是稱為 OTP 的原語。
此外,如果我們使用流密碼,我們通常不會在一側生成整個密鑰流,並將其發送到另一側。相反,我們通常將密鑰(初始 CSPRNG 狀態)從一側發送到另一側;這大大減少了需要發送的密鑰材料的數量,並且同樣安全。
現在,完成這些細節後,您的問題的答案(更安全,GCM 或安全流密碼)取決於您所說的“安全”。
如果“安全”是指隱私(即竊聽者無法獲取加密消息的任何資訊),那麼 GCM 和安全流密碼對於真正的潛在對手來說都是完全安全的;在這一點上,他們是平的。
如果“安全”是指完整性(也就是說,中間的某個人可以攔截消息,並註入修改後的版本不能欺騙接收者接受發送者未發送的消息),那麼經典的流密碼會遇到問題。那是因為流密碼具有延展性。具體來說,攻擊者可以在密文中翻轉一點。在解密時,相應的明文位將被翻轉(因此猜測明文是什麼的攻擊者可以修改密文,使其解密為他想要的任何內容)。這不適用於 GCM;如果攻擊者以任何方式修改密文,GCM 內部的完整性檢查將失敗,因此接收者將拒絕該消息。是的,這意味著主動攻擊者可以導致消息被拒絕;在任何情況下,主動攻擊者都可以做到這一點。
現在,在標準流密碼設備之上還有標準結構(例如 MAC),它也提供完整性保護。所以,如果我們問 CSPRNG+MAC 與 GCM,嗯,從安全的角度來看並沒有太大的區別(但可能存在實際差異,例如“如果消息失去會發生什麼;你需要處理那個案子?”)。
如果您使用 CSPRNG 生成墊,則根據定義,您不再使用一次性墊,因為墊不再是隨機的,因此所述問題在術語方面是不正確的。
使用流密碼的優點是您不再遇到 OTP 的密鑰分配問題,因為您的密鑰現在只有幾十位長,並且如果處理得當,密鑰重用問題也可以解決 - 也許使用 KDF。當然,你失去了有吸引力的理論安全屬性,但如果你不能在現實生活中真正有效地使用加密算法,那麼它有什麼用呢?假設流密碼對於一個不完美的世界來說是一個不完美的解決方案。
現在,您建議使用 OS 提供的 CSPRNG 來生成 pad - 這種方法的問題在於它本質上是一個 OTP,但具有所有缺點並且沒有安全證明,這是弄巧成拙的:
- 密鑰重用:您只是與您的明文進行異或操作,與 OTP 相同,因此您必須在每條消息後更改密鑰(因此每條新消息都將其發送給您的收件人)。
- 密鑰分發:任何體面的 CSPRNG 都無法重播(它使用外部熵源),因此您需要將完整的 pad 發送給您的收件人,而不僅僅是一個種子,就像在 OTP 中一樣。
另一方面,任何流模式下的 AES 都會更好地工作:您的密鑰只有 128 位到 256 位長,因此您可以相當方便地分發它,並且您可以使用初始化向量將您的密鑰重用於許多消息(所以您可能只需要共享一次密鑰 - 除非它被洩露)
如果使用流密碼 - 甚至,如果必須,OTP - 或使用 GCM 等身份驗證模式,請不要忘記包含 MAC。一次性便箋可能會提供完美的保密性,但它絕對不能保證您的完整性。任何人都可以在這里和那裡截取您的密文和翻轉位,如果格式有點為人所知,可能會改變預期的消息以使其受益。沒有消息驗證碼,你就無法知道密文是否被改變,你就完蛋了。