Playfair
原理:多圖替代 polygraphic substitution
一、密鑰
密鑰是一個5*5的矩陣,但是英文中有26個字母,誰的多余的呢?
——j是多余的 (‘j’渴望擁有姓名!)
如果明文中有‘j’,當成‘i’處理。誰讓他倆長得這么像呢?
密鑰的生成過程有點類似於key word算法密鑰的生成過程
- 選定一個單詞
- 去掉重復的字母和字母'j'
- 每行五個,把2.的結果排好
- 對於未使用的,按照字母表順序每行五個排好
舉個栗子:
- 選定單詞"harpsichord"(一種樂器,大鍵琴)
- 去掉重復字母和字母'j':"harpsicod"
- 將2.的結果放到矩陣中
- 第一行:H A R P S
- 第二行:I C O D
- 未使用的字母:B E F GK L M N Q T U V W X Y Z接着3.填下去
- 第二行:I C O D B
- 第三行:E F G K L 注意,這里沒有字母'J'!
- 第四行:M N Q T U
- 第五行:V W X Y Z
最后結果:
二、加密過程
多圖加密算法是對明文進行按對加密的,
加密時,在密鑰矩陣中,
先找到該明文字符對中兩個字符的位置,
然后根據三個規則,確定好輸出的密文對
1、三個加密規則
對於每個明文對,在密鑰矩陣中的位置關系不過三種:
- 只同行
- 將會被它們右邊的字符分別替代
- 如果該字符在最右邊一列,將會被同行 最左邊一列的那個字符代替(其實就是“穿透”過去)
- 只同列
- 將會被它們下邊的字母分別替代
- 如果該字符在最下面一行,將會被同列 最上邊一行的那個字符代替(其實就是“穿透”過去)
- 既不同行也不同列
- 如果兩個明文對,既不同行也不同列,那么將它們連起來,記為明文鏈
- 明文鏈就可以確定一個矩陣,它們的連線是該矩陣的對角線
- 每個矩陣有兩條對角線,另外一條記為密文鏈
- 明文對將會被密文鏈上,和明文對同行的兩個字母替代
顯然,似乎應該有一個位置關系——同行同列,
如果明文對的兩個字符是同行同列,是什么情況?——這說明這兩個字符是相同的。
那么這三條規則則失效了,
其實,除了明文對為重復字母,這三條規則遇到一些情況也會失效:
- 明文中有字母'j'
- 如果明文是奇數個字母,那最后一個字母不就是單身狗了?
2、三個預處理
針對於上面的三個情況,“兵來將擋水來土掩”,我們需要對明文對進行三個預處理
在對明文正式進行加密之前,還需要對明文進行三個預處理:
- 將明文中的字母'j'替代成'i'
- j:為什么總是我???
- ——因為密鑰矩陣中就沒有‘j’啊!
- 將重復的字母中間加上特殊字母'q'
- 如果是重復字母對,則
- 如果明文是奇數個字母,需要在最后加上特殊字母'q'
3、舉個例子
使用我們剛剛生成的密鑰矩陣,對“speciallity”進行加密
首先,對明文進行預處理:
- 明文中沒有字母'j',無需處理
- 在兩個’L‘之間加上'Q'
- 加上’Q‘之后,明文變成了偶數個
- 注意,2.一定要在3.之前!
- 如果我們反過來,明文對中有重復字母且為奇數個,那我們:
- 現在最后加上無效字符'Q',明文變成了偶數個
- 在重復字母中間加上特殊字符'Q',明文變成了奇數個
- 再在最后加上特殊字符’Q‘,明文對變成了偶數個,但是最后兩個自身重復了,還能再加上特殊字符’Q‘嗎?——當然不行,那最后就有了三個’Q‘
經過預處理,明文變成了:SP EC IA LQ LI TY
-
(S,P)->(H,S)
- 它們的位置關系是同行
- S在最右側,所以變成了第一列的同行字母'H'
- P變成了右邊的字母'S'
-
(E,C)->(F,I)
- 它們既不同行也不同列
- 明文鏈(E,C)(紅色箭頭所示)確定了矩陣(紅色方框內):
- 矩陣中另一條對角線為密文鏈(F,I)(藍色箭頭所示)
-
(I,A)->(C,H)
-
(L,Q)->(G,U)
-
(L,I)->(E,B)
-
(T,Y)->(Y,P)
- 這個關系是同列
- 和(S,P)的變化過程很像
最后“speciallity”變成了“hsfichguebyp”