這個簡單的加密聊天程序使用 One Time Pads 是否可行?
假設我想建構一個簡單的聊天程序,該程序具有任何人都無法破解的加密,即使是擁有大型超級電腦的理論上的政府。好的,這是我的想法。您需要閱讀所有要點才能了解我認為的全貌。
- 只有兩個人可以通過聊天程序相互交流。沒有群聊。
- 人們將通過網際網路和暗網進行交流。
- 聊天程序將只處理標準美式鍵盤上的基本字元、數字和符號。這是為了讓事情變得簡單。
- 我們會說每條聊天消息限制為 160 個字元。但顯然,作為網際網路上的實時聊天程序,您可以輸入多條消息。聊天人 #1 (Bob) 生成大量秘密隨機密鑰(或 pad)。每個一次性墊的長度為 160 個字元。所以我們最終得到了一長串的墊子。這些被放入 SQLite 數據庫或主鍵編號從 1 到 5000 的東西中。
- Bob 將數據庫複製到 USB 驅動器/CD/DVD/Blu-ray 並親自與聊天人員 #2 (Alice) 會面並將數據庫提供給他們。Alice 將該數據庫載入到她的電腦上。然後他們安全地擦除 USB 驅動器或刻錄/粉碎 CD/DVD/藍光。無論如何,現在他們的電腦上都有相同的一次性便箋列表。
- 好的 Bob,看到他生成了列表,他使用奇數主鍵盤加密並向 Alice 發送消息(#1、#3、#5 等)。Alice 是載入列表的人,使用偶數主鍵盤(#2、#4、#6 等)加密並將消息發送回 Bob。
- 每個人的程序總是記錄他們使用過哪個編號的鍵盤,這樣消息就不會被同一個鍵盤加密兩次。一個人使用與另一個人相同的墊子沒有混淆,因為他們使用奇數和偶數的墊子。用於解密消息的鍵盤編號可以附加在消息的末尾。要解密的鍵盤編號不一定需要加密,也可能只是在消息的末尾,例如“#123”。
- 現在為了保護會話,並提供一層防止 MITM 攻擊的保護,整個聊天會話可以使用 SSH 或 SSL 加密。
- 在使用者發送每條消息後,它和鍵盤都會從他們的設備上安全擦除。一旦接收者閱讀了消息,它也會從他們的設備中安全刪除。
- 使用 3 個強分組密碼和在聊天程序執行前需要輸入的強使用者密碼的組合將鍵盤儲存在設備上。
- 如果使用者認為他們很快就會受到威脅,他們可以使用按鈕快速安全地擦除設備上的墊子。這也將通知其他聊天使用者他們也應該擦拭他們的墊子。安全擦除算法可能類似於 Gutmann 35 pass。
- 現在假設聊天會話被想要干擾通信的攻擊者 (Eve) 截獲,可能會欺騙 Bob 用同一個鍵盤再次發送另一條消息,以便他們弄清楚所說的內容。好吧,她不能這樣做,因為 Bob 正在維護一個列表,其中列出了他使用過的所有 pad 以及 Alice 發送給他的所有帶編號的 pad。如果攻擊者 Eve 試圖向 Bob 發送不同的消息以假裝它來自 Alice,那麼她不能,因為消息和 pad 的 HMAC 與密文一起發送。接收器將在其末端驗證 HMAC 匹配,以確保沒有發生篡改。
- 如果 Eve 篡改了最後指定要解密的鍵盤的數字,那麼接收者將嘗試解密該消息並意識到該消息是亂碼,因此他們會知道有什麼事情發生了。如果她試圖重新使用一個舊的墊子,那麼 Bob 也會知道,因為已經收到了表明篡改的消息。此外,如果與收到的最後一條消息相比,數量顯著增加,例如收到的最後一條消息是#200,而收到的下一條消息是#230,那麼你就會知道有失去的消息或中間有人玩人。
- 當雙方用完他們的 5000 條消息時,聊天會話就結束了,他們需要再次重新生成一個 pad 列表並將它們親自交給另一個聊天方,以便他們可以繼續聊天。顯然,5000 個焊盤是一個任意數字。理論上,您可以生成一百萬個墊子並與它們進行終生交流。
好的,簡而言之,這就是我的想法。是否有任何潛在的缺陷或弱點,或者您可以看到的可能的攻擊媒介?你會對這個想法做出哪些改進?
只有兩個人可以通過聊天程序相互交流。沒有群聊。
這是相當有限的,但讓我們承認。
人們將通過網際網路進行交流。
所以,一個不安全的渠道。好的。
聊天程序將只處理標準美式鍵盤上的基本字元、數字和符號。這是為了讓事情變得簡單。
這並不重要——所有這些東西都只是位,數據的實際內容與加密和安全性無關。不過,它確實使實施更容易。
我們會說每條聊天消息限制為 160 個字元。但顯然,作為網際網路上的實時聊天程序,您可以輸入多條消息。聊天人 #1 (Bob) 生成大量秘密隨機密鑰(或 pad)。每個一次性墊的長度為 160 個字元。所以我們最終得到了一長串的墊子。這些被放入 SQLite 數據庫或主鍵編號從 1 到 5000 的東西中。
好的。這是它開始走下坡路的地方。首先,您需要生成完全隨機的焊盤。這些不能是偽隨機的!僅隨機。因此,您已經將 100% 的安全性投入到隨機數生成器中,它可以是硬體設備,也可以是作業系統提供的熵池(如 /dev/random)。這也可能很慢!
Bob 將數據庫複製到 USB 驅動器/CD/DVD/Blu-ray 並親自與聊天人員 #2 (Alice) 會面並將數據庫提供給他們。Alice 將該數據庫載入到她的電腦上。然後他們安全地擦除 USB 驅動器或刻錄/粉碎 CD/DVD/藍光。無論如何,現在他們的電腦上都有相同的一次性便箋列表。
好啊,為什麼不。現在,攻擊者需要物理訪問任何一台電腦才能獲得墊子,這是可以接受的。
好的 Bob,看到他生成了列表,他使用奇數主鍵盤加密並向 Alice 發送消息(#1、#3、#5 等)。Alice 是載入列表的人,使用偶數主鍵盤(#2、#4、#6 等)加密並將消息發送回 Bob。
這行得通,是的。
每個人的程序總是記錄他們使用過哪個編號的鍵盤,這樣消息就不會被同一個鍵盤加密兩次。一個人使用與另一個人相同的墊子沒有混淆,因為他們使用奇數和偶數的墊子。用於解密消息的鍵盤編號可以附加在消息的末尾。要解密的鍵盤編號不一定需要加密,也可能只是在消息的末尾,例如“#123”。
如果您每次都發送墊號,它會洩露一些關於到目前為止已發送多少條消息的資訊。
現在為了保護會話,並提供一層防止 MITM 攻擊的保護,整個聊天會話可以使用 SSH 或 SSL 加密。
好吧,如果您要使用 SSL 或 SSH,那麼使用一次性鍵盤毫無意義,正如我在評論中指出的那樣,但讓我們承認這是為了好玩。請注意,SSH/SSL 本身不會阻止 MITM - 受信任的證書會阻止它。無論如何,在這種情況下,您甚至都不需要它,因為您在留言板中有一個共享密鑰,您可以使用它來安全地驗證雙方的身份。
現在假設聊天會話被想要干擾通信的攻擊者 (Eve) 截獲,可能會欺騙 Bob 用同一個鍵盤再次發送另一條消息,以便他們弄清楚所說的內容。好吧,她不能這樣做,因為 Bob 正在維護一個列表,其中列出了他使用過的所有 pad 以及 Alice 發送給他的所有帶編號的 pad。如果攻擊者 Eve 試圖向 Bob 發送不同的消息以假裝它來自 Alice,那麼她就不能,因為她沒有任何 pad 來加密消息。
這並不完全正確 - 請參閱下一點。
如果 Eve 篡改了最後指定要解密的鍵盤的數字,那麼接收者將嘗試解密該消息並意識到該消息是亂碼,因此他們會知道有什麼事情發生了。如果她試圖重新使用一個舊的墊子,那麼 Bob 也會知道,因為已經收到了表明篡改的消息。此外,如果與收到的最後一條消息相比,數量顯著增加,例如收到的最後一條消息是#200,而收到的下一條消息是#230,那麼你就會知道有失去的消息或中間有人玩人。
您需要客觀地量化“意識到消息是亂碼”。這通常通過提供消息驗證碼 (MAC) 和密文來完成。該 MAC 只能由擁有共享密鑰(在本例中為 pad)的任何人生成,並且如果接收到的 MAC(因此,原始密文的 MAC)與接收到的密文的計算 MAC 不匹配,則密文已被修改在傳輸中(即使是單個位翻轉也會被檢測到)。
這一點特別重要,因為 OTP 對已知的明文攻擊非常脆弱。如果攻擊者知道消息類似於“在貝克街 10 號見我”,他可以在不知道墊子的情況下,使用 XOR 的屬性(或任何組合操作)將其更改為“在貝克街 04 號見我”你用)。
當雙方用完他們的 5000 條消息時,聊天會話就結束了,他們需要再次重新生成一個 pad 列表並將它們親自交給另一個聊天方,以便他們可以繼續聊天。顯然,5000 個焊盤是一個任意數字。理論上,您可以生成一百萬個墊子並與它們進行終生交流。
好吧,問題顯然是要保證這些墊子的安全。如果你能確保,那麼肯定,沒有問題。用完後還必須擦拭墊子,但實際上,如果您勤奮,這並不太難。
因此,總的來說,您的方案存在一些缺陷:
- 它僅限於兩個人
- 墊必須隨機生成
- 墊必須保持安全
- 一旦墊子用完,就必須安排一次安全的物理會議來交換墊子
- 墊子一旦使用就必須徹底銷毀,以確保永遠無法閱讀以前的消息
- 沒有身份驗證/完整性檢查會嚴重損害系統,如果對話是可猜到的(像“你好”等嬰兒床都可能受到損害)
因此,如果您添加身份驗證/完整性檢查(例如 HMAC-SHA256,或者如果您想保持“完美安全”主題,則可以使用其中一種無條件安全的身份驗證方案),但它會相對笨拙、笨拙,並且在現實生活中使用和維護繁瑣。殺手當然是隨機數生成。
將此與使用諸如 AES 之類的分組密碼的方案進行比較——您只需要交換一個 128 位密鑰,它基本上可以永遠使用。
總而言之,正如您所料,缺陷不在於密碼學本身——畢竟,這是無條件安全的密碼學。真正的問題在於管理所有的焊盤,這更像是一個實際問題而不是理論問題。因為在現實世界中,沒有什麼是完美的——即使是密碼學也是如此。