在经典加密算法中,最著名的多字母加密算法是Playfair加密算法,曾被英国陆军在第一次世界大战中作为第一流领域系统使用,并在第二次世界大战中仍被美国陆军和其他同盟军使用。那么我们今天就给大家来介绍一下这种Playfair加密算法。

Playfair的加密过程

Playfair加密算法根据下列规则一次对明文的两个字母进行加密,这两个字母构成一对。其加密规则如下:

(1)一对明文字母如果是重复的。则在这对明文字母种间插入一个填充字符。如X。因此,单词session将被分割成:se、sx、si、on。

(2)如果分割后的明文字母对在矩阵的同一行中都出现,则分别用矩阵中其右侧的字母代替,行的最后一个字母由行的第一个字母代替。例如,on被加密成qo,而st被加tn。

(3)如果分割后的明文字母对在矩阵的一列中都出现,则分别用矩阵中其下方的字母代替,列的最后一个字母由列的第一个字母代替。例如,en被加密成nu,而aw被加密成ba。

(4)如果分割后的明文字母对既不在矩阵的同一列中都出现也不在矩阵的同一行中都出现,密文是这两个字母所在的长方形的另两个顶点。例如,se被加密成nk,而cu被加密成ix(或jx)。

(5)如果明文有奇数个字母,末尾加一个无效字母。

Playfair加密算法与单字母替代密码相比有明显的优势

第一、双字母有26x26=676种组合方式,识别各种双字母组合比单字母困难得多;

第二、各种字母组的相对频率范围也更为广泛,使频率分析更加困难。

因此,Playfair加密算法曾被认为是不可破译的。

Playfair加密算法的实现

用vb模拟实现时,有设置密钥、加密、算法简介、重新输入、退出这五个按钮(图一)和三个文本框:分别用于输入明文、矩阵的关键字和输出密文。

根据密钥矩阵生成的原则,若取关键字为Playfair,则生成的密钥(图一)。以下的加密实现都是基于以Playfair为关键字生成的密钥矩阵。若设明文为plnuamdi。

因为pl在同一行,nu在同一列,am既不在同一列也不在同一行,di在同一行。依据加密规则其密文为laupflair。在本模拟系统中,我们对于两个一样的明文和奇数个明文采取增加大写字母Z的方式来实现。考虑到解密的可行性,我们只对奇数个明文进行了循环加密,对两个一样的明文只是增加了一个大写字母Z。

Playfair加密算法主要程序

Function Encode Char(char1 As String, char2 As String) As String
Dim x1,x2, y1, y2 As Integer
Dim flag1,flag2 As Boolean
If (Asc(char1)> asc_z_l) Then
flag1= True
char1 = Chr(Asc(charl)_asc_change)
End If
If (Asc(char2)> asc_z_l) Then
flag2 = True
char2 = Cbr(Asc(char2)_ asc_change)
End If
If (GetXYln ex(char1, x1, y1) And GetXYindex(char2. x2. y2) Then
"相同字符
If (x1 =x2/ id y1 = y2) then
EncodeChar Case Low(char1. flag1) + fillChar + CaseLow(char2, flag2)
"同行字符
EncodeChar Case Low(matrix(x1. (y1 + 1) Mod 5), flag1) + Case Low(matrix(x2, (y2 +1) Mod 5) flag2)
"同列字符
Else if (x1=x2) Then
Encode Char caseLow (matrix((x1 + 1) Mod 5, y1), flag1) + Case Low(matrix(x2 +1l) Mod 5, y2),flag2)
"对角字符
Else
Encode Char= caseLow(matrix(x1. y2), flag1) + CaseLow(matrix(x2. y1), flag2)
End If
Else
Encode Char= aseLow(char1.FLag1) + CaseLow(char2, flag2)
End If
End Function

小知识之矩阵:在数学上,矩阵是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。