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”