One-Time-Pad
Vernam Cipher 的小問題
我們有一個任務,內容如下:
給定的是一種有 3 個字母的語言:A、B、C。
二進製表達式為:
A = 000, B = 1111 and C = 0011
在這種語言中使用相同的密鑰對兩個單詞進行了加密:
W1 = 0101001110111010101100100 W2 = 1011001010000000000101011
確定可能的消息對。
我怎麼能做到這一點?
我認為猜測關鍵位並檢查明文在兩個單詞中是否有效是要走的路(很像二進制謎題)。
例如,很明顯至少有一個單詞以 an 開頭,
A
因為如果你取前 4 位,除了最後一個之外,它們都是不同的。這排除BB
,BC
,CB
或CC
作為第一個字母的組合,因為它們在最後一位為 1 的情況下不會相差 3 位。同樣,您應該能夠排除其他兩種組合,只留下一個組合 - 不幸的是,您沒有還不知道是AX
還是XA
。類似地,您希望在最後一位上使用 AA 和 B 組合,因為這些位必須相互補碼。我將使用從左到右猜測帶有回溯的關鍵位來實現這一點,以防 W1 或 W2 的模式變得不可能。你甚至可以從每一端開始,但我認為沒有必要。您應該能夠手動完成此操作,但程式也可能很有趣。
最後我看到 13 位設置為 0 和 13 位設置為 1,我不得不回溯 18 次才能找到解決方案(假設在可能回溯之前將位設置為 0,只需從左到右工作),這完全是對一個普通人來說是可行的。當然給出密鑰,W1 或 W2 的模式給出了整個結果,所以我不會這樣做。
在這種特殊情況下,找到的密鑰的補碼也是一種解決方案。
高級設計:
為密鑰創建一棵樹;
創建程式碼以執行關鍵位的呼吸優先搜尋;
創建一個方法來檢查給定的(部分密鑰)是否有效;
- 創建一個創建模式樹的方法;
- 檢查 W1 和 W2 - 直到密鑰大小 - 如果密鑰產生直到葉節點的樹;
- 為此,您可以使用深度優先搜尋來搜尋樹;
創建檢查以查看:
- 如果密鑰完整;
- 最後是否有部分匹配;
請注意正確檢查結束條件,否則您可能需要在最後進行一些手動重組。
這不是一個容易程式的任務。基本上,您需要為密鑰和生成的明文創建一棵樹來執行模式匹配。
之後,Maarten 評論,這裡是通過兩次墊解決的介紹;
我們有;
A = 000 B = 1111 C = 0011 0101001110111010101100100 1011001010000000000101011 ------------------------- 1110000100111010101001111 x-ored ciphertext gives us x-ored plaintext 1111 only this possible. 000 ------------------------- 1110000100111010101001111 1111 0001111 only this possible. ------------------------- 1110000100111010101001111 11111111 0001111 only this possible. ------------------------- 1110000100111010101001111 11111111 0001111 Now here we have a branching 000 and 0011 but one causes an immediate contradiction.
其餘的留給OP。