摩爾斯電碼的最佳現代密碼?
我正在尋找一種現代密碼來編碼莫爾斯電碼,即。輸入是
$$ A-Z 0-9 $$(
base36
正如我在下面的評論中了解到的)並且輸出是相同的,一次一個字元。舊謎團在這方面做得很好,但顯然被打破了。 密碼不一定必須“手動”使用(正如定義中的“經典密碼”所做的那樣),但如果可以的話會很有趣。是否有這樣一種密碼可以將輸入映射到輸出 1:1 並將輸出保持在上述範圍內(或者可能是 ASCII 7 位)?
我當然知道 base64 和
codegroup
,但第一個使用小寫字母,而後者不映射 1:1。如果這樣的密碼不存在或不可行,我會對*“為什麼”*感興趣- 為什麼我們不能 1:1 映射,為什麼輸出不能保持在某些“界限”內?
另一個答案正確地解釋了我們如何製作現代流密碼,在密鑰流生成器的設置中使用(與密鑰一起)密文開頭的公共隨機 IV,限制在範圍內 $ [0..35] $ , 並使用加法模 $ 36 $ (博福特密碼)對每個字元進行加密。
這是對此類系統的更詳細描述,該系統由 CTR 模式下的 AES-128 建構。加密進行:
使用 24 個十六進制骰子隨機生成一個 12 字節的 IV (一些第一個十六進制數字可以替換為公共消息號、來源/目的地(如果是公共的)、日期..,但必須保持足夠的隨機性,以便 IV 是具有壓倒性優勢的獨特性);IV 將構成密文的開頭;
初始化計數器 $ N $ 到 IV 後跟 32 個零位(這將是一個 128 位的數量),以及 $ \text{available raw keystream} $ 清空;
雖然有一個字元 $ p $ 加密,轉換為範圍內的整數 $ [0..35] $ 每張公共桌子;
重複 ..
如果 $ \text{available raw keystream} $ 是空的
- (可選)如果最右邊的 32 位 $ N $ 都是一;這將在超過 330 億個字元被加密後發生。
- 放 $ \text{available raw keystream} $ 到加密形成的 8 個字節 $ N $ 使用 AES-128 和商定的密鑰;
- 遞增(低 32 位)128 位 $ N $
獲取最左邊的字節 $ b $ 的 $ \text{available raw keystream} $ ,並刪除它;
.. 直到 $ b<252 $ (那是 $ 2^8-(2^8\bmod36) $ );
$ b\gets b\bmod36 $ ; 這是我們在範圍內均勻分佈的密鑰流字元 $ [0..35] $ ;
$ c\gets p+b\bmod36 $ ,輸出該密文字元(根據公共表轉換);
解密工作如下:
獲取IV作為密文的開頭,超過前24個符號;
初始化計數器 $ N $ 到 IV 後跟 32 個零位(這將是一個 128 位的數量),以及 $ \text{available raw keystream} $ 清空;
雖然有一個字元 $ c $ 解密,轉換為範圍內的整數 $ [0..35] $ 根據公共表
重複 ..
如果 $ \text{available raw keystream} $ 是空的
- 放 $ \text{available raw keystream} $ 到加密形成的 8 個字節 $ N $ 使用 AES-128 和約定的密鑰;
- 遞增(低 32 位)128 位 $ N $ ;
獲取最左邊的字節 $ b $ 的 $ \text{available raw keystream} $ ,並刪除它;
直到 $ b<252 $ ;
$ b\gets b\bmod36 $ ; 這是范圍內相同的均勻分佈的密鑰流字元 $ [0..35] $ 用於加密的;
$ p\gets 36+c-b\bmod36 $ ,輸出該明文字元(根據公共表轉換)。
這是現代的;從保密的角度來看,學術上是安全的;並按措辭回答問題;但有嚴重的操作缺陷:
- 消息未經過身份驗證;攻擊者可以將密文替換為將解密為另一條消息的密文,如果知道原始明文,則攻擊者可以在不知道密鑰的情況下將替換解密為攻擊者想要的任何內容。
- 在某種程度上,這在對明文有部分了解的情況下有效。例如,如果對手知道一個 19 字元的消息的格式為
AMOLEFT123REPEAT123
,並且公共表中的數字被編碼為 0..9,並且編碼的數字在範圍內$$ 000..299 $$,然後將密文的第 8位和第 17位字元加 2(模 36)將使傳輸的數量增加 200,也許給人的印像是 amo 很充足,而實際上是短缺的。- 如果 IV 不包含日期,則有更簡單的攻擊:重播過去一天的舊消息,當時 amo 庫存很高。
- IV 中的任何錯誤都會使整個密文無法解密(可以通過三次發送 IV 來修復,這是前向糾錯的原始形式)。
- 即使是密文中的意外錯誤也可能未被檢測到。
- 密文中的錯誤(發送者和接收者之間失去同步)使跟隨錯誤的消息出現亂碼(這通常可以通過明文中的冗餘來檢測並在很大程度上修復);
- 如果密文以莫爾斯電碼傳輸,即使它(在 IV 的恆定成本內)與明文具有相同數量的字元,它的傳輸時間也比明文要長得多,因為明文中的頻繁符號使用短莫爾斯序列,但密文的優化失去了。
因此,一個好的現代系統(例如,設計為遵守競賽規則或古代條約,規定資訊必須由人類操作員使用摩爾斯電碼發送,但不禁止電腦用於其他任何事情)的工作方式將完全不同:
- 明文將被壓縮作為加密的第一步。一種可能的方法是使案例如 gzip,對明文具有恆定的公共固定前綴,該明文由具有與真實明文相同特徵的公共虛擬明文(相同的字元集,常用詞和句子)組成,並產生恆定的壓縮頭從此被 gzip 輸出抑制;這將提供公平的壓縮,並輕鬆適應任何字母表和使用模式。需要注意的是,在實際明文中使用不常用的單詞和句子會降低壓縮率,這在某種程度上可以從密文的長度中檢測到。
- 生成的壓縮明文字節流將使用一種也提供消息完整性的方案進行加密。如果我們堅持使用對稱加密,就會想到AES-GCM 。在保證完整性的情況下,可以通過在消息中輸入序列號(或 UTC 日期/時間)來檢測重放。或者我們可以轉向非對稱加密(其優勢在於,如果敵人完全破壞了發送站,仍然不允許解密);如果做得對(混合加密),它將增加很少的成本。
- 生成的密文將使用針對手頭介質優化的方法重新編碼為莫爾斯電碼(輸出符號的頻率與其傳輸持續時間成反比;因此
E
編碼為“。”比0
編碼為“ - - - - —"),並提供一定程度的前向糾錯。將使用諸如Hufffman或算術編碼以及Reed-Solomon糾錯(或一些 ad-hoc 系統)之類的技術。總而言之,即使是短消息,密文的傳輸速度也比以前的系統更快,同時保證了消息的完整性;對於大型消息,密文的傳輸速度將比明文快幾倍。