Cryptanalysis

給定明文和密文,如何找到 Playfair 密碼的關鍵字?

  • January 20, 2022

我知道 Playfair 密碼是如何工作的。給定一些密文和相應的明文,我想知道如何找到 Playfair 密碼的關鍵字。

例如:

  • 加密:gy mm ko kc gc
  • 純文字:he ll ow or ld

我在整個網際網路上搜尋,但似乎沒有教程可以逐步解釋如何獲取關鍵字。

首先,您不能唯一確定Playfair 密碼的關鍵字,甚至無法確定由它構造的密鑰表,因為有多個等效的密鑰表會產生相同的密文(以及多個關鍵字會產生每個表)。

特別是,以下鍵表都是等效的:

Original:        Row shift:       Column shift:
                                    <--
A B C D E        F G H I K        B C D E A
F G H I K      ^ L M N O P        G H I K F
L M N O P      | Q R S T U        M N O P L
Q R S T U        V W X Y Z        R S T U Q
V W X Y Z        A B C D E        W X Y Z V

我們可以像這樣移動任何 Playfair 密鑰表,以獲得另一個產生相同密文的不同表。行和列的移動可以重複和組合以將網格的任何字母移動到左上角,從而產生 25 個不同的等效表。

原則上,我們永遠無法僅通過檢查明文和密文來判斷使用了哪些等效表。當然,在實踐中,如果原始表是基於關鍵字建構的,則可能將這些等效表中的一個辨識為比其他表更有可能,但原則上它們中的每一個都可以從某個關鍵字中獲得。(簡單地說,只要把關鍵字就是表中的所有字母,逐行寫出來。)當然,由於關鍵字中重複的字母被忽略,每個表都有無限數量的可能關鍵字可以產生它(儘管在實踐中,有些可能看起來比其他的更有可能)。


好的,所以我們不能唯一確定鍵表。那我們能做什麼呢?

如果我們有一段密文並且知道對應的明文,我們可以將它們分成兩個字母的組,並編譯一個明文對對應哪個密文對的列表,如下所示:

Plaintext:  AT TA CK AT DA WN
Ciphertext: DQ QD EH DQ EB XM

Pairs:
 AT -> DQ
 CK -> EH
 DA -> EB
 TA -> QD
 WN -> XM

原則上,有了足夠多的已知明文/密文對,我們就可以像這樣編譯一個(幾乎)完整的字母對字典,並用它來解密未知消息。基本上,通過這樣做,我們只是將 Playfair 密碼視為字母對上的簡單替換密碼。即使我們從來沒有弄清楚實際的鍵表,擁有這樣的字典基本上和擁有鍵一樣好。

唯一的問題是,雖然像 或 這樣的常見字母對THHE可能AT在我們已知的明文和我們可能想要解碼的任何未知消息中經常出現,但其他不太常見的字母對可能不會碰巧出現在我們已知的明文中. 當然,我們可以直接推斷出一些新的對,例如從 Playfair 密碼的字母交換對稱性:如果我們知道XY加密到PQ,那麼我們也知道YX加密到QP。但是做更多的事情會很好。

事實上,只要對觀察到的字母對應用一些簡單的邏輯,我們就可以了解很多關於鍵表的結構:

  • 通常,每當我們觀察到一個字母X加密(或解密)Y任何字母對中的某個其他字母時,我們都知道X並且Y必須屬於同一行或同一列。

  • 如果我們觀察到任意兩對相互加密的字母,例如AXBY,那麼我們立即知道:

    • AandX不屬於同一行或列(也不屬於Band Y),
    • AandB屬於同一行(and 也是如此XY
    • AY屬於同一列(和 也是如此BX。(當然,使用交換對稱性,觀察AXBYYBXA也會產生相同的資訊。)
  • 如果我們觀察到明文和密文對共享一個字母,例如XYYZ,那麼我們知道所有這些字母必須屬於同一行或同一列,特別是這一行或列必須包含(左-to-right 或 top-to-down)字母序列X Y Z(當然,它可能會環繞邊緣)。

  • 如果我們觀察到XY加密為PQ,但PQ加密為YA(或BX),那麼我們知道所有這些字母也必須屬於同一行或列,並且整個行或列必須是X P Y Q A(or Y Q X P B)的某個移位版本.

(如果XY加密為PQ,則 的加密PQ 必須至少包含一個X和;在 Playfair 中,像→ →Y這樣的加密鏈可能的唯一方法是,如果所有這六個字母共享同一行或列;但是,當然,標準的 Playfair 鍵表每行或每列只有五個字母!)XY``PQ``AB

  • 類似地,如果我們觀察 egXA加密到YBXB加密到YC,那麼所有這些字母必須屬於同一行或列,並且它們的順序必須是X Y A B C
  • 最後,如果我們觀察到在→和→中都X加密,其中所有六個字母都是不同的,那麼我們知道所有這些字母不能都屬於同一列(因為它們不適合),因此並且必須是在同一行中(因此必須and ,and also and )。由於所有六個字母也不能放在一行中,我們可以進一步推斷它們必須以以下三種模式之一排列:Y``AX``BY``PX``QY``X``Y A``B``P``Q
X Y            X-Y A-B            X-Y P-Q
A B                               A-B
P Q            P-Q

其中行和列可以按任何順序重新排列,並且鍵表的其餘行和列插入在它們周圍或之間的任何位置,除了最後兩個模式中連接的列-必須在鍵表中相鄰並按顯示的順序出現(當然,可能環繞邊緣)。

(當然,這不是一個詳盡的列表;其他類似的規則也可以從 Playfair 密鑰表結構和加密規則的約束中推導出來。)

其餘的只是基本的解謎,與解數獨沒有完全不同。由於密鑰表的任何移位版本都會產生相同的加密,因此我們可以任意將任何我們想要的字母放在表的左上角。當然,最方便的方法是選擇一個我們已經使用上面的推導規則計算出完整行或列的字母,如果有的話,因為這樣我們可以立即填寫(或製作兩個候選表,如果我們不確定我們計算出的序列是一行還是一列)並從那裡開始。然後我們根據我們從已知的密文/明文對中推斷出的資訊,不斷地填寫越來越多的字母(可能一開始是試探性的,直到我們的猜測得到證實),直到整個表格被解決或直到我們用完線索.


例如,讓我使用前面給出的(普通)密鑰表加密一段文本,並嘗試從結果中重建密鑰表:

Plaintext:  EX AM PL EA QU IC KB RO WN FO XI UM PS OV ER TH EL AZ YD OG
Ciphertext: CZ BL LM AB RQ HD GE TM XM IL YH RP NU LY BU SI AP EV DI MI

讓我先看看明文和密文對共享一個字母的情況(因為那些總是意味著所有的字母必須共享一行或一列)。PL我們在開頭( → LMEAABQU→ )附近發現了一堆這些,RQ在結尾(YDDI)附近又找到了一個。所以我們知道序列P L ME A B和必須出現在鍵表中U Q RY D I水平或垂直,可能環繞)。

接下來要尋找的是明文和密文中都出現的字母對,但可惜的是,在這種情況下,沒有任何字母對,甚至沒有反轉。有一些未遂事件(例如 ciphertext pair EV,它在明文中發生反轉,但分成兩對),但這些並沒有真正幫助。

因此,接下來讓我查找常見字母及其加密/解密,看看它們與哪些字母共享它們的行和列。例如,字母E加密為C,解密為A和。B``B``A

我們已經知道該序列E A B在表格中水平或垂直出現,因此它A位於 的下方或右側EAZ因此可以加密的唯一方法EV是序列E A B是水平的,並且序列Z V ?(標記的字母?尚未知)出現在其他行的相同位置。

任意固定E到左上角(因為為什麼不呢?),因此我們已經有兩個部分行:

E A B ? ?
Z V ? ? ?

我們可以以某種方式擴展它們嗎?接下來尋找字母B,我們發現(除了我們已經考慮過的EAAB對)對AMBLKBGEERBU

AMBL對告訴我們L M必須出現在與 相同位置的某行中A B。它不適合我們已經擁有的行,所以我們最終得到了另一個部分行。事實上,我們也可以P根據已知的序列放置在同一行P L MKBGEER→對BU(以及已知的序列U Q R)給了我們另外兩個部分行,產生:

E A B ? ?
Z V ? ? ?
P L M ? ?
K ? G ? ?
U Q R ? ?

這已經是半張桌子了!請注意,行的順序仍然未知,但我們可以將其留到以後。(它實際上只影響密文/明文對中相對較小的一部分,因為它僅在兩個明文字母恰好位於同一列時才重要。)

為了填寫其餘部分,我們可以嘗試查找其中一個已放置的字母出現在明文中,並且來自同一列的另一個字母出現在相應的密文中。(由於 Playfair 加密的工作方式,這實際上很常見。)例如,第一個明文/密文對是EXCZ,我們已經知道EZ共享一列,讓我們暫時將CX放在相應的行中:

E A B ? ?  +  C
Z V ? ? ?  +  X
P L M ? ?
K ? G ? ?
U Q R ? ?

請注意,我暫時將它們放在一邊,因為我們仍然不知道它們屬於最後兩列中的哪一列。接下來的兩個字母對我們知道屬於同一列是ROTMPSNU,給我們:

E A B ? ?  +  C
Z V ? ? ?  +  X
P L M ? ?  +    O N
K ? G ? ?
U Q R ? ?  +    T S

同樣,我仍然不知道這些字母屬於其餘列中的哪一列,所以我也將它們作為部分列放在一邊。然而,下一對OVLY很有趣,因為除了字母Vand L(我們知道它屬於第二列)它還包括字母O,這意味著它Y必須屬於同一列O。這反過來又在該列中留下了Cand ,因此它們必須與andX屬於同一列,為我們提供下表(行的順序和最後兩列的相對順序尚未確定):N``S

E A B ? C
Z V ? Y X
P L M O N
K ? G ? ?
U Q R T S

接下來我們有對THSI。我們知道TandS屬於同一行,並且在該行中沒有空間Hand I,因此它們必須屬於唯一的另一行,這兩個列仍然是空閒的:

E A B ? C
Z V ? Y X
P L M O N
K ? G I H
U Q R T S

現在我們有兩個字母來自Y D I我們之前在同一列中確定的連續序列,所以我們終於可以開始計算行的順序(並D在唯一可以去的地方填寫缺失的字母):

Z V ? Y X
E A B D C
K ? G I H
P L M O N
U Q R T S

我們現在知道了前三行和前三列的順序,並且還有兩個字母 (FW) 尚未放置。在這一點上,我們甚至可以開始簡單地猜測,因為我們真的只剩下三個雙向選擇(最後兩行的順序,最後兩列的順序,F和的位置W),總共 2 × 2 × 2 = 8可能的鍵表。或者我們可以嘗試進一步縮小選擇範圍,例如,通過尋找其中包含F或的字母對W,我們會找到兩個:WNXMFOIL。這些讓我們自信地W放在第一行和F第三行,給我們完整的(但仍然部分未排序的)表:

Z V W Y X
E A B D C
K F G I H
P L M O N
U Q R T S

我們能弄清楚剩下的兩行和兩列的順序嗎?為此,我們需要找到更多對,其中所有字母共享同一行或同一列。唉,事實證明在這個例子中沒有任何明文/密文對,所以我們留下了四個非等價的密鑰表(以及它們所有的等價物),它們都可以產生這個密文:

Z V W Y X    Z V W X Y    Z V W Y X    Z V W X Y
E A B D C    E A B C D    E A B D C    E A B C D
K F G I H    K F G H I    K F G I H    K F G H I
P L M O N    P L M N O    U Q R T S    U Q R S T
U Q R T S    U Q R S T    P L M O N    P L M N O

當然,通過視覺檢查,我們可能會注意到這些關鍵表中的一個顯示了一個簡單的模式,而在其他表中卻被打破了。或者,如果我們更系統地傾向於,我們可以嘗試將它們全部移動,使字母X,YZ位於右下角(它們最有可能最終出現的位置,使用建構 Playfair 鍵表的標準方法基於關鍵字),然後檢查哪些表可以由最短的關鍵字生成(當然,在這個例子中,它是一個零長度的)。

讓我們首先解釋 Playfair 如何正常工作來加密消息。

首先,您創建一個 5x5 的表格,方法是在表格頂部從左到右逐個字母地書寫關鍵字,跳過重複的字母;然後在關鍵字後面按字母順序填寫剩餘的字元(將 i&j 或 j&k 組合到一個框中)。

這是一個帶有 BRIANBROWN 關鍵字的範例。

b|r|i|a|n
o|w|c|d|e
f|g|h|jk|l
m|p|q|s|t
u|v|x|y|z

然後,您獲取明文的前兩個字元,並想像這對字元位於矩形的角上。密文字元與明文字元位於矩形的對角。讓我們使用 HELLOWORLD 作為消息。

想像一個由 HE 形成的矩形作為角。我已經大寫了對角,LC。一組常見的規則是:

  1. 如果明文字母位於不同的列和行中,則選擇由明文字母在角落處定義的矩形。從與明文字母相同的 ROW 中選擇密文字母。
  2. 如果明文字母彼此位於同一行,請選擇緊鄰右側的字母(必要時換行到最左側的列。)
  3. 如果明文字母彼此位於同一列,請選擇每個字母正下方的字母(必要時從下到上環繞。)
  4. 如果明文字母相同,則將它們視為在同一行中。

從 HELLOWORLD, HE 的前兩個字母開始。

b|r|i|a|n
o|w|c|d|E
f|g|H|jk|l    HE=>LC
m|p|q|s|t
u|v|x|y|z

接下來,拿LL。它們是雙字母,因此請在該行中選擇以下字母。L 在最後一列,所以換到第一列。

b|r|i|a|n
o|w|c|d|e
f|g|h|jk|L    LL=>FF
m|p|q|s|t
u|v|x|y|z

接下來,採取OW。它們在同一行,因此請使用每個字母后面的字母。

b|r|i|a|n
O|W|c|d|e
f|g|h|jk|L    OW=>WC
m|p|q|s|t
u|v|x|y|z

等等。密文變成了LCFFWC……解密是相反的。

要解構明文/密文版本,請將密文對放在與其明文對應物對應的框中。這將讓您重建用於加密的表。

在您的範例中,我們知道密文 GY 用於對明文字母 HE 進行編碼。

a|b|c|d|e    | | | |y
f|g|h|i|jk   | |g| |
l|m|n|o|p    | | | |    gy==he
q|r|s|t|u    | | | |
v|w|x|y|z    | | | |

MM 用於編碼 LL。

a|b|c|d|e    | | | |y
f|g|h|i|jk   | |g| |
l|m|n|o|p   m| | | |    mm==ll
q|r|s|t|u    | | | |
v|w|x|y|z    | | | |

並且用 KO 來編碼 OW:

a|b|c|d|e    | | | |y
f|g|h|i|jk   | |g| |
l|m|n|o|p   m| | |k|    ko==ow
q|r|s|t|u    | | | |
v|w|x|y|z    |o| | |

一旦你用你知道的所有明文重新創建了表,你就破解了密碼。如果還需要查找“代號”,按照建表規則,在表的左上角即可找到。您可以查看它,看看您是否發現了用於創建表格的模式,但請記住重複的字母被抑制了。從您的範例中,我們可以看到 BRIANOW 是有效的程式碼片語;不管它最初是 BRIAN BROWN 還是 BRIAN NORWIN。

引用自:https://crypto.stackexchange.com/questions/35722