SECCON2016のVigenere暗号をGoogleスプレッドシートのHLOOKUPとMODで解く
タイトルまんまです。
今回のSECCONは3問しか解けず、うち2問(VoIP/Memory Analysis)はツールを正しく使うだけで解けてしまいました。
そのあたりのWriteupは他の人と大差ないと思うので、手を動かしたVigenereのWriteupだけ書いておきます。
解き方
問題文にヒントとしてWikipediaへのリンクがあり、そのとおりに解きました。
ヴィジュネル暗号 - Wikipedia
こんな表を作って先頭からi番目のiを求めます。
ざっくりとCiをHLOOKUPで算出しておきます。
分かっているpの一部からPiを求めます。
MOD関数でKiを求め、HLOOKUPで文字に直すことにより、kの一部が"VIGENER?????"であるとわかります。
おまけでEもつくので"VIGENERE????"と判明し、これで12文字のうち8文字が判明します。
判明した分のFlagをMOD関数で計算します。Pi=MOD(Ci-Ki+28,28)
あとはHLOOKUPで文字に戻します。これでFlagが SECCON{A????BCDEDEFG????KLMNOPQR????VWXYYZ} までわかります。
Flagの文字からA-Zのアルファベットが全て含まれているものと類推し、不明な4文字中2文字の"CO"まで推測した時点で"CODE"と確定し、"VIGENERECODE"でPを求めFlagゲットとなりました。
Flag = SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}
実際に使ったスプレッドシートはこんな感じです。
SECCON2016_Vigenere解 - Google スプレッドシート