使用 Digital Dead Drop 生成 OTP
我有一個想法,我想知道這是否是設計和分發一次性便箋簿的有用方法。它依賴於數字死點和散列函式。
數字死點可以採取多種形式。
- 對於廣泛分發,它可能是 Twitter、Facebook 或 Instagram 提要、雲儲存容器(Dropbox、Pastebin 等)或類似方法。
- 對於本地分發,它可以是使用 Raspberry Pi、Beaglebone 或類似硬體在公共區域設置的無線伺服器。它甚至可能是使用拇指驅動器的物理死角。如果需要,可以對此類儲存庫進行密碼保護。
死點的“有效載荷”將通過公共電腦的 VPN 訪問進行傳遞和檢索,並且可以是 5 個文件的任何集合。這些可以是任何東西:來自 NOAA 氣象衛星的照片、莎士比亞的文本文件、從 Youtube 上隨機下載的影片等等。每組 5 個文件將位於一個帶標籤的文件夾中,編號為 1 到 5。
要生成密鑰,使用者將在每個文件上執行 SHA-3-512,生成五個散列輸出。每個使用者將擁有一個唯一的 ID 號,例如 12345、24315 等,並按順序排列五個密鑰,以生成他或她唯一的一次性密匙,總長度為 2560 位。
密文將包含使用者 ID 的一些指示符和儲存庫文件夾中的標籤,以允許接收者生成正確的密鑰。
我已經發現這種方法存在一些安全問題。最明顯的是輸入文件的性質。輸入依賴於隱蔽性的安全性,輸入文件“隱藏在眾目睽睽之下”,要麼作為無害的 Twitter 文章,要麼作為僅在小型公共區域內可用的不起眼伺服器上的文件。但是,考慮到這是一個操作安全性的重大問題,這種方法是否可用?
**編輯添加:**根據一些回饋(感謝所有寫過文章的人),我想到了一種變體,可以解決死掉的一些問題,同時保持模糊性和實用性的基本原則。這是書籍程式碼的變體。
每個使用者都會獲得一本 PDF 格式、Word 格式或文本(明確劃分為頁面的文本)的數字書籍。每個使用者都有一本獨特的書,但它們可以是任何類型的無害作品:完整的莎士比亞、化學和物理手冊、完整版的塔木德——任何長書都可以。
使用者通過將書的單頁複製到單獨的文件中來生成 OTP 密鑰,並對這些文件進行雜湊處理。
至於您使用散列創建 OTP 的想法,請閱讀散列函式以生成一次性密碼,以避免出現定義錯誤的明顯 OTP 陷阱。
…
提醒一下:一次性墊……
- 必須是真正隨機的,
- 必須至少與明文一樣長,
- 從未全部或部分重複使用,並且
- 完全保密。
只有當所有四點都滿足時,我們才談論 OTP。…
現在,連結的問答詢問散列 PRNG 輸出是否足以創建 OTP 流……但您的固定文件想法最終並沒有太大不同(只是與您正在散列的數據相比,波動性較小,製作文件-基於解決方案更糟)。
- 您在第 1 點中的 OTP 定義失敗,因為文件不是真正隨機的。雜湊不會神奇地使它真正隨機。
- 您在第 3 點中的 OTP 定義失敗,因為即使重用 OTP 的一小部分也是一個大問題(導致部分可恢復數據/明文的關鍵重用問題)。
- 您未通過第 4 點中的 OTP 定義,因為它沒有完全保密。隱藏用作雜湊源的文件無論如何都不是秘密。這將我們帶到了您的“……幸運的是,有可能使它們變得非常晦澀。” – 在您所描述的“政府對手”情景中,這是不相關且有缺陷的假設。最明顯的場景(在許多場景中)將是一個破壞脖子的場景是簡單的監視。出於這個原因,“默默無聞的安全”並不是真正被認為是加密領域的安全解決方案。這是 RSA & Co. 得以發展的原因之一。
最後但同樣重要的是:您還缺少身份驗證,這是與您的想法相關的另一個安全問題。與此相關,請查看問答,例如“為什麼我應該使用經過身份驗證的加密而不僅僅是加密?” 也許還有關於“Authenticated Encryption”的相關維基百科文章。
把它包起來
我的建議是寧願依賴經過嚴格審查的公開可用的加密解決方案:加密算法(例如,ChaCha20 之類的東西)、MAC(啟用身份驗證)、KDF(允許使用者根據一個或多個公共秘密),以及可能的類似 RSA 的東西,允許使用者通過公鑰加密就一個公共秘密達成一致。
如果您 -正如您的評論所描述的那樣- 想要避免使用專用加密算法並認為雜湊“不太明顯”(我個人不同意),您應該知道您可以從雜湊建構蒸汽密碼(參見“使用雜湊函式建構流密碼?”,您可以使用雜湊來創建 MAC(請參閱HMAC),甚至可以使用雜湊創建 KDF(請參閱HKDF)。如果您這樣做,請確保依賴安全雜湊。MD5 和 SHA-1 被認為是損壞的,因此應避免用於這些目的。然而,SHA-2 和 SHA-3 也可用且安全。
如果你真的堅持使用“數字死點”,你可以使用它而不是公鑰加密來就一個共同的秘密達成一致。然而,我建議不要這樣做,因為“默默無聞的安全”通常是一個壞主意……尤其是在面對政府對手時。
這應該是您正在尋找的內容,並涵蓋了您的場景描述的所有問題。
有一種更簡單的方法可以共享在實踐中有效的一次性便箋簿。
首先,分享一個簡短的秘密,比如 256 位,對手無法猜到——對手的知識狀態應該至少有 256 位的熵。例如,您可以通過共享經過身份驗證的公鑰並執行 X25519 密鑰協議來做到這一點,或者,對於當機,通過使用您最喜歡的密鑰封裝機制(例如Shoup 的 RSA-KEM)封裝密鑰。
接下來,使用長輸出偽隨機函式族將短密碼擴展為長密碼。例如,您可以使用 $ \operatorname{MD5}(k\mathop\Vert 0)\mathop\Vert \operatorname{MD5}(k\mathop\Vert 1)\mathop\Vert \cdots $ . 這是一種非正常的方法:更傳統的方法是在 CTR 模式下使用 ChaCha20 代替 MD5,或使用 HKDF-MD5 代替 MD5。但是您似乎在尋找一些非傳統的東西,因此您可以像時髦人士一樣粗心地使用 MD5-CTR 而不會產生不利後果,因為您沒有任何審核員可以回答。
您可以使用生成的長密碼作為一次性密碼來加密長消息。如果你這樣做,我建議你也使用它的一部分作為一次性身份驗證器的密鑰,這樣你的對手就無法在你不注意的情況下翻轉消息中的位。記住不要對兩條消息使用相同的 pad 或驗證器。
(“但這不是一次性的!”你反對。只要你的對手的能量預算限制在太陽可以熄滅的範圍內,只要對手的最佳猜測大約是 $ 2^{256} $ 對於正確的機率為 1,那麼就對手而言,它也可能均勻分佈在所有可能的墊上。流密碼的現代概念是一次性密碼模型的實用近似,就像 AES 是 PRF 的實用近似一樣,牛頓萬有引力定律是當沒有人注視時大質量的實際行為的實用近似.)
如果您不允許使用 X25519 或 RSA-KEM 或類似的東西,您的任務可能會更加困難。但是現代密碼學的基本概念是,使用當今的網際網路(以及國家暴力執法等),數万億美元經濟價值的安全所有權依賴於現代密碼學,您可以將問題分為兩部分:
- 一是公開交換少量資訊,建立統一的隨機小秘密。
- 然後將這些小秘密擴展為長秘密,以隱藏和驗證長的不統一的秘密。
然後,您的問題就歸結為面對您心目中的任何對手如何做第一部分,這取決於對手的能力以及您可以使用的資源。