希爾密碼在CTF中應用 記一道題

2021-09-27 18:13:44 字數 1862 閱讀 8459

解題思路來自:i春秋的大佬們

希爾密碼是一種與矩陣相關的替換密碼,只涉及基本的矩陣原理。

說起來還是挺簡單的。

a-z對應0-25,用作加密的矩陣(即金鑰)必須是可逆的,否則就不可能解碼。只有矩陣的行列式和26互質,才是可逆的。將數字寫成與金鑰相同或者是題目提示的形式,與金鑰相乘得到密文,等於密文與26取模運算

金鑰 x 明文 = 密文 (mod 26)

根據線性代數的知識:金鑰 = 明文的逆矩陣 x 密文 (mod 26)

接下來求逆矩陣:逆矩陣 = 伴隨矩陣 / 行列式

伴隨矩陣是除該位元素外其他元素的代數余子式

下面是實驗吧的乙個題目,hillissoeasy

#conding:utf-8

from numpy import *

key=mat([[1,2],[0,1]])

key1=key.i.t

#金鑰經過一次逆運算再做一次轉置

finalans=''

#print key1

str='dloguszijluswogaqy'

#密文

str2=[0 for i in range(len(str))]

for i in range(len(str)):

str2[i]=ord(str[i])-ord('a')+1

#將字串轉換為hill密碼中的數字

num=len(str2)%4

for i in range(4-num):

#print str2

#給上面得到數字進行補位,保證可以四個為一組,方便後面的計算

count=0

for i in range(len(str2)/4):

crypto1=mat([[str2[count],str2[count+1]],[str2[count+2],str2[count+3]]])

#以4個為一組,分別取出每一組密文

ans=(crypto1*key1)%26

#計算明文

ans2=array(ans)

#這裡的array是將ans轉化為矩陣的標準形式,從而可以去出每乙個數字

count+=4

for m in range(2):

for n in range(2):

finalans+=chr(int(ans2[m][n])+ord('a')-1)

#將明文轉化為字串

print finalans

2x2的示例:

關鍵字hill轉換成2x2金鑰矩陣,

明文矩陣:(明文:shortmessage)

依此對明文列向量使用矩陣乘法

最後講解一道例題:

密文: aujpsoaduiwaamyokqntrlky 明文中包含 babyhills

在mod 26的情況下

明文的逆矩陣等於明文的伴隨矩陣除以明文的行列式

已知密文和部分明文,不確定明文對應的密文,所以嘗試組合所有可能性,一共是16種可能性,由於很多可能性mod 26是不可逆的,就可以排除。

得到aujpsoadu 對應babyhills ,金鑰為zxyxuabxl

最後得到flag:bcns

記一道USB流量分析CTF題

拿到資料報使用wireshark開啟後看到protocol 為usb協議,搜到了一篇關於usb流量分析的文章 貼鏈結 從ctf中學usb流量捕獲與解析 鍵盤資料報的資料長度為8個位元組,擊鍵資訊集中在第3個位元組,每次key stroke都會產生乙個keyboard event usb packet...

一道CTF題 sql爆破

題目 開啟網頁 說明存在sql注入。嘗試了一些常見的繞過操作都不行,過濾了注釋 空格,and,select等。嘗試用 11 繞過 頁面正常 頁面正常 頁面正常 報錯 以上測試說明表有四列。測試回顯 union也可以大寫 返回3,說明在第3個位置可控。爆資料庫 得到資料庫test。爆表名 出現表名 c...

記某工控CTF比賽一道ICMP隧道題

某塔的線上比賽平台,最後一道一堆蜜罐,聽說沒flag,反正沒找到。然後看一下其中一道icmp隧道的題目。資料報如圖 當時的考量 響應包有的,請求包也有,並且都一樣,所以請求包的資料是最全的,可以不看響應包。考慮到填充不符合正常的icmp請求應答的填充方式,也嘗試了對資料進行解密,但都無果。兩個通訊i...