古典密碼-波利比奧斯方陣密碼Polybius


波利比奧斯方陣密碼Polybius簡介

公元前2世紀,一個叫Polybius的希臘人設計了一種將字母編碼成符號對的方法,他使用了一個稱為Polybius的校驗表,這個表中包含許多后來在加密系統中非常常見的成分。Polybius校驗表由一個5行5列的網格組成,網格中包含26個英文字母,其中I和J在同一格中。相應字母用數對表示。在古代,這種棋盤密碼被廣泛使用。Polybius校驗表如下

0zF6aR.png

(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
  1. i 和 j視為同一格
  2. 選擇這五個字母,是因為它們譯成摩斯密碼時不容易混淆,可以降低傳輸錯誤的機率

根據上面的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=

題目分析

基本的解題方陣如下

0zAggK.jpg

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)

參考:

[BJDCTF2020]Polybius(波利比奧斯方陣密碼)

Polybius密碼(棋盤密碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM