如何使用 Base64 字母表對替換密碼進行頻率分析
讓我們想像一個像下面這樣工作的密碼:
- 明文編碼為 Base64。
- 編碼明文中的字元被隨機打亂的字元集(Az,0-9,-,_,=)替換。打亂的字母表本質上是關鍵。
不是特別複雜甚至安全。但…
如果我想做頻率分析怎麼辦?
例如,以 Base64 編碼時的“RUNFORYOURLIFE”為:
UlVORk9SWU9VUkxJRkU=
當字元集被洗牌時,最終的密碼文本可能看起來像這樣:
xv24DYG9qxG2xYg6DYxf
關鍵是:
yhAc5bTOWeYvBXCpVuoMJLdg8P1jHN3ZIsi67SrK4E_D9-x2qRQmnlkwUaFt0G=zf
這是一個洗牌的版本:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_=
我們還假設後續消息中的字元集順序相同(即密鑰被重複使用)。
由於字節基本上是分開的,導致不同的字元單元可能對應也可能不對應,頻率分析是否仍然可行?在加密之前以這種方式編碼明文是否會增加任何形式的安全性?
我的問題主要與較長的消息有關,因為我的範例可能太短,無法進行任何實際分析。
我假設明文完全由大寫的 ASCII 字母組成,如範例中所示。這意味著明文每個字節的高 3 位是
010
.視覺化 3 個連續字節的明文如何映射到 4 個連續的Base64字元 是很有用的。
- 密文中4字元塊最後一個字元的頻率分析
我們看到從明文中每三個字元的最後一個到 Base64 編碼中每四個字元的最後一個直接映射(請注意,Base64 中的字元編碼明文中字元的低 5 位,右側上面的圖片,這是字母的特徵)。由此可見,我們可以對限制在每個四個字元塊的最後一個字元的密文進行單字母頻率分析。如果保留的字元中最後一個與其他所有字元不同,則可能表示
=
為Base64;保留的所有其他字元應在 26 個字元之間(否則上述假設被推翻)。映射,按減少英文明文中預期字母頻率排序(根據此來源)是:Plaintext Plaintext Plaintext Plaintext | Base64 | Base64 | Base64 | Base64 | | Frequency | | Frequency | | Frequency | | Frequency E F 0.12702 H I 0.06094 W X 0.02360 K L 0.00772 T U 0.09056 R S 0.05987 F G 0.02228 J K 0.00153 A B 0.08167 D E 0.04253 G H 0.02015 X Y 0.00150 O P 0.07507 L M 0.04025 Y Z 0.01974 Q R 0.00095 I J 0.06966 C D 0.02782 P Q 0.01929 Z a 0.00074 N O 0.06749 U V 0.02758 B C 0.01492 S T 0.06327 M N 0.02406 V W 0.00978
並且對於一千字節的密文,很可能保留的密文部分中最常見的字元對應
E
於明文中,因此F
在 Base64 中。
- 密文中4字元塊首字元頻率分析
從明文的每三個字元的第一個到Base64編碼的每四個字元的第一個都有一個函式;我們可以對密文執行單字母頻率分析的變體,限制為每個四個字元塊的第一個字元。保留的字元應在 7 個之間。預期頻率為
Plaintext Base64 Frequency DEFG R 0.21198 = 0.04253 + 0.12702 + 0.02228 + 0.02015 LMNO T 0.20687 = 0.04025 + 0.02406 + 0.06749 + 0.07507 TUVW V 0.15152 = 0.09056 + 0.02758 + 0.00978 + 0.02360 PQRS U 0.14338 = 0.01929 + 0.00095 + 0.05987 + 0.06327 HIJK S 0.13985 = 0.06094 + 0.06966 + 0.00153 + 0.00772 ABC Q 0.12441 = 0.08167 + 0.01492 + 0.02782 XYZ W 0.02198 = 0.00150 + 0.01974 + 0.00074
碰巧第二種方法中的 Base64 字元集是第一種方法的子集;這允許交叉檢查猜測。
- 密文中4字元塊第三個字元的頻率分析
從明文每三個字元的第二個到Base64編碼的每四個字元的第三個都有一個函式;我們可以對密文執行單字母頻率分析的變體,限制為每個四個字元塊的第三個字元。保留的字元應該在 16 個之間(可能最後一個除外,它可能映射到
=
Base64 字元集中)。預期頻率為Plaintext Plaintext | Base64 | Base64 | | Frequency | | Frequency EU V 0.15460 = 0.12702 + 0.02758 HX h 0.06244 = 0.06094 + 0.0015 DT R 0.13309 = 0.04253 + 0.09056 GW d 0.04375 = 0.02015 + 0.0236 CS N 0.09109 = 0.02782 + 0.06327 L x 0.04025 IY l 0.08940 = 0.06966 + 0.01974 FV Z 0.03206 = 0.02228 + 0.00978 AQ F 0.08262 = 0.08167 + 0.00095 M 1 0.02406 O 9 0.07507 P B 0.01929 BR J 0.07479 = 0.01492 + 0.05987 K t 0.00772 N 5 0.06749 JZ p 0.00227 = 0.00153 + 0.00074
第三種方法的 Base64 字元集中的幾個字元也出現在前兩種方法中;這允許交叉檢查猜測。
二元組的頻率分析
我們還可以考慮明文中出現在三個塊的最後一個字元和下一個塊的第一個字元中的二元組;以及它們如何映射到 Base64 中出現在四個塊的最後一個字元以及後面的字元中的二元組。我們可以通過保留(作為二元組的第一個字元)四個塊的最後一個字元和(作為二元組的另一個字元)下一個字元來計算在密文中獲得的公共二元組;並與英語中常見的二元組進行比較(添加最多 4 個二元組的頻率,就像我們在第二種方法中所做的那樣)。
這也適用於出現在三個塊的最後兩個字元中的明文雙元組,映射到出現在四個塊的最後兩個字元中的 Base64 中的雙元組;再次與英語中常見二元組的頻率進行比較(如我們在第三種方法中所做的那樣,添加最多 2 個二元組的頻率)。
明文中常見/可猜測的三元組以完成分析
以上將允許將映射恢復為 Base64 中使用的 65 個字元中不超過 36 個的密文。對於其他的,我們應該根據我們已經知道的和常見的英文單詞來猜測明文中的一些對齊的三個字元塊,將這些三個明文字元塊轉碼為四個Base64字元,看看是否與建立的映射有矛盾Base64 到密文,如果不小心應用新的猜測。
自動密碼分析
正如其他答案中正確指出的那樣,啟發式算法可以自動處理搜尋。不過,我想前三種技術(可以適應不同的明文字母,例如空格、小寫字母……)將大大簡化啟發式算法。