本題是我今天大部分時間的花費處。先百度學習了希爾密碼,而後嘗試手動計算逆矩陣和矩陣乘法,還求助於線性代數課本,可謂苦不堪言。
php
作題千萬條,數學第一條。線代學很差,老師兩行淚。
希爾密碼是以矩陣的線性方式爲加密方式。將26個字母分別對應0到25這26個數字(以前我還徘徊過A對應0仍是1,想到取餘數會有0,因此肯定從0開始),明文排成一個含n個m維列向量(即mn矩陣)的矩陣M的格式。密鑰K爲nn矩陣。加密方式爲:密文X=(明文M 乘 密鑰K)Mod 26。解密方式爲:明文M=(密鑰K的逆矩陣K^-1 乘 密文X)Mod 26。學習
一開始我也是手算的,然而徘徊於0和1如何抉擇,列和行如何計算,算出的分數如何取整,負數如何化正,可謂是心力交瘁。最終我決定怒佔室友電腦,使用MATLAB來進行計算問題,以把本身解放于思考更高層次的問題。
1.計算密鑰的逆矩陣。下圖中x爲原密鑰,xx爲x的逆矩陣。
加密
你們看圖裏那些小數哦,我手動算的時候是以3爲底的分數,是徹底匹配的。但是使用分數進行下面的計算會很傷腦筋啊。於!是!我找到了一篇深度好文,裏面介紹瞭如何處理分數問題,具體的與矩陣的計算原理有關,這裏我就採起了最小公倍數法,讓xx矩陣乘上數27,則不會影響結果。
3d
下一步呢,繼續處理xx,手動把每個數改爲0到25的值,該取模的取模,該加上n倍26的加。
code
2.逆矩陣與密文相乘。下圖中xx爲密鑰的逆矩陣,密文爲a。
htm
nia!這樣就算出來了,而後你們都取個模(這裏我是寫了個C程序而後手動一個個輸入算出的,別嫌笨||)blog
#include<stdio.h> int main() { int n; scanf("%d", &n); printf("%d\n", n%26); return 0; }
手動把這些數按格式記在紙上!
遊戲
而後!對照咱們的字母數字表,ding!flag出現辣!
md5
那麼flag就是flag{hillisflagxx},結束。get
那麼下面這一題就徹底是馬老師@李長興的功勞了。(爲了湊題因此我把他解的題放在我WP上了:p)
首先用音頻軟件(我使用的是AU)打開文件,直接就看到了一個flag有木有。
獲得flag:85a9d4517d4725_b9_8cbc9fd_554216
(讓我想到了b站上有段時間臭名昭著的圖像midi...)
然鵝啊,介並非最終的flag。並且嘗試了一些解碼後也解不開。下面我就跪服馬老師的想法了。他居然把這裏的下劃線全都換成0(此處應有驚歎),而後md5解密就結束了。
因此答案是flag{hsd132456},完成。
我和室友們又有新遊戲能夠玩了:)