希爾密碼(Hill Cipher)是運用基本矩陣論原理的替換密碼,由Lester S. Hill在1929年發(fā)明。每個字母當作26進制數(shù)字:A=0, B=1, C=2... 一串字母當成n維向量,跟一個n×n的矩陣相乘,再將得出的結果MOD26。
對于密碼體制的五元組(P, C, K, E, D)有 P=C=(Z26)m,m是一個不小于2的正整數(shù)
在線代的課本上出現(xiàn)了一堆神秘字母
dloguszijluswogany
而旁邊的矩陣是
1 2 0 1
快找出flag吧
key格式:simCTF{}
1.求矩陣M= 1 2 0 1 的逆矩陣 即 M^-1= 1 -2 0 1
求逆矩陣方法:
1、伴隨矩陣:伴隨矩陣是矩陣元素所對應的代數(shù)余子式,所構成的矩陣,轉置后得到的新矩陣。
2、初等變換:寫出增廣矩陣A|E,即矩陣M右側放置一個同階的單位矩陣,得到一個新矩陣。然后進行初等行變換,將增廣矩陣的左側變換為一個同階單位矩陣,這時右側為所求M的逆矩陣。
2、根據(jù)字母表順序將密文換成矩陣數(shù)值
d | l | o | g | u | s | z | i | j | l | u | s | w | o | g | a | n | y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 12 | 15 | 7 | 21 | 19 | 26 | 9 | 10 | 12 | 21 | 19 | 23 | 15 | 7 | 1 | 14 | 25 |
3、將密鑰的逆矩陣與密文變換成的矩陣做乘運算
4、將得到的矩陣mod26
5.可求明文:flagis hillissoeasy所以simCTF{hillissoeapy}
使用numpy庫的矩陣對象,可以十分方便地進行矩陣乘法,矩陣求逆和取模等運算。
import numpy as np
m = 'YOURPINNOISFOURONETWOSIX' #明文
a = np.matrix([[11,2,19],[5,23,25],[20,7,17]]) #密鑰LCTFXZUHR
num_m = []
temp = []
count = 1
for i in m: #將明文分為三個一組
temp.append(ord(i)-ord('A'))
if count % 3 == 0:
num_m.append(temp)
temp = []
count += 1
mat_m = [np.matrix(i).T for i in num_m] #將明文分組轉換為向量形式
mat_c = [a * i % 26 for i in mat_m] #得到密文分組的向量形式
num_c = []
temp = []
for i in mat_c: #將密文向量轉換為列表形式,且合并到一個列表
temp = i.tolist()
for j in range(3):
num_c.append(temp[j][0])
c = [chr(i+ord('A')) for i in num_c]
print(''.join(c)) #連接成字符串,輸出密文
更多建議: