古典密码-波利比奥斯方阵密码Polybius
波利比奥斯方阵密码Polybius简介
公元前2世纪,一个叫Polybius的希腊人设计了一种将字母编码成符号对的方法,他使用了一个称为Polybius的校验表,这个表中包含许多后来在加密系统中非常常见的成分。Polybius校验表由一个5行5列的网格组成,网格中包含26个英文字母,其中I和J在同一格中。相应字母用数对表示。在古代,这种棋盘密码被广泛使用。Polybius校验表如下
(2,4)这个坐标既可以表示i 也可以表示 j因此破解的时候这里又会多两种情况
栗子
假设明文序列为 attack at once
,使用一套秘密混杂的字母表填满波利比奥斯方阵,如下
A | D | F | G | X | |
---|---|---|---|---|---|
A | b | t | a | l | p |
D | d | h | o | z | k |
F | q | f | v | s | n |
G | g | j | c | u | x |
X | m | r | e | w | y |
- i 和 j视为同一格
- 选择这五个字母,是因为它们译成摩斯密码时不容易混淆,可以降低传输错误的机率
根据上面的Polybius方阵将对应的明文进行加密。其中,A,D,F,G,X也可以用数字1,2,3,4,5来代替,这样密文就成了:
明文 | A | T | T | A | C | K | A | T | O | N | C | E |
---|---|---|---|---|---|---|---|---|---|---|---|---|
密文 | AF | AD | AD | AF | GF | DX | AF | AD | DF | FX | GF | XF |
13 | 12 | 12 | 13 | 43 | 25 | 13 | 12 | 23 | 35 | 43 | 53 |
相关题目
题目信息
密文:ouauuuoooeeaaiaeauieuooeeiea
hint: VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ=
题目分析
基本的解题方阵如下
base64解密后信息为The length of this plaintext: 14
,提示长度为14,再根据密文为14×2位,可以推测位波利比奥斯方阵密码
解密脚本
import itertools
ciper = 'ouauuuoooeeaaiaeauieuooeeiea'
head = 'aeoiu'
headlist = []
num_headlist = []
# 先列举处aeiou五种的不同排序
x = itertools.permutations(head,5)
for i in x:
temp = "".join(i)
headlist.append(temp)
print(headlist)
# 根据aeiou对应的12345修改ciper的对应值,便于后续的遍历得到结果
for i in headlist:
temp = ''
for j in ciper:
temp += str(i.index(j) + 1)
num_headlist.append(temp)
print(num_headlist)
# 将ciper对应的数字乘上比例加上96再转为ASCII码,即 可得到对应的字母
for i in num_headlist:
temp = ''
for j in range(0,len(i),2):
xx = (int(i[j]) - 1)*5 + int(i[j+1]) + 96 # 前一个为乘上5加上后一个就正好对应了表格中的字母
if xx>ord('i'):
xx+=1
temp += chr(xx)
print(temp)
参考: