1、 也称棋盘密码,是利用波利比奥斯方阵进行加密的密码方式,ADFGVX密码是德军在第一次世界大战中使用的栏块密码。事实上,它是早先一种密码 ADFGX 的增补版。1918年3月Fritz Nebel上校发明了这种密码,并提倡使用。它结合了改良过的Polybius方格替代密码与单行换位密码。这个密码以使用于密文当中六个字母 A, D, F, G, V, X命名。ADFGVX 是被法国陆军中尉 Georges Painvin 所破解的。以古典密码学的标准来说,此密码破解的工作是属于格外困难的,在这期间,Painvin 更因此健康蒙受了严重损伤。他破解的方法是依靠于找到多份开头相同的讯息,这表示说它们是被相同的分解钥匙和移位钥匙加密的。
2、用一套错综复杂的字母表填满波利比奥斯方阵图1 波利比奥斯方阵在方阵中,将i和j视为同一个字符,使字母数量符合5*5格
图1 波利比奥斯方阵
3、为何选择ADFGX?
|:他们译成摩斯码时不容易混淆,可以降低传输错的几率
||:使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母
4、示例:
加密时可以在表格中找到明文,然后使用明文所在的行字符和列字符代替,比如明文为g,则密文为GA,明文为a,则密文为 AF。解密时只需在密码表里边找到 行列所对应的字符就可以解密,比如密文为AFAD,则明文为AT,比如密文为XF,则明文为e
明文:A T T A C K A T O N C E
密文:AF AD AD AF GF DX AF AD DF FX GF XF
5、算法实现: 实现该方法加密有两种思路:
(1)完全使用替代法 可以将表格里边的25个字母使用replaceAll()函数进行代替操作,在解密时使用同样的操作即可
部分代码如下所示:
加密部分:
str_p=str_p.replace("b","AA:");str_p=str_p.replace("t","AD:"); str_p=str_p.replace("a","AF:");str_p=str_p.replace("l","AG:"); str_p=str_p.replace("p","AX:");str_p=str_p.replace("d","DA:"); str_p=str_p.replace("h","DD:");str_p=str_p.replace("o","DF:"); str_p=str_p.replace("z","DG:");str_p=str_p.replace("k","DX:");解密部分:
str_c=str_c.replace("AF:","a");str_c=str_c.replace("AG:","l"); str_c=str_c.replace("AX:","p");str_c=str_c.replace("DA:","d"); str_c=str_c.replace("DD:","h");str_c=str_c.replace("DF:","o"); str_c=str_c.replace("DG:","z");str_c=str_c.replace("DX:","k"); str_c=str_c.replace("FA:","q");str_c=str_c.replace("FD:","f");
(2)使用for循环判断 首先定义一个二维数组,用于实现密码表的保存,设为biao[6][6],然后将字符写入到表格里边,接着将用户输入的明文转化为字符数组str_p[], 对明文进行遍历,使用判断条件进行对字符进行判断,如果str_p[k]==biao[i][j],则str_c[n++]=biao[i][0]+biao[0][j],循环至加密完所有明文
在解密时,可以循环判断biao[i][0]==str_c[k]&&str_c[k+1]==biao[0][j],如果相等,则使得str_p[m++]=biao[i][j],这样就完成了加解密。
6、加解密演示:
图 1要加密的内容
图2 加密后的内容
图3 恢复后的内容
以上就是Polybius加解密的实现。