Closed tiwanari closed 7 years ago
Vigenere 暗号は単純だけど,わりと使える古典的な暗号 古典暗号 - Vigenere暗号とカシスキー・テスト - ₍₍ (ง ˘ω˘ )ว ⁾⁾ < 暗号楽しいです
今回は ABC... に {
と }
の2つがついてるのだけ注意.
とりあえず,最初の7文字が SECCON{
を暗号化したものだということは知ってるので,鍵の最初の7文字出す簡単なスクリプト かいたら
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
k: ["V", "I", "G", "E", "N", "E", "R"]
と key の先頭 7 文字が ["V", "I", "G", "E", "N", "E", "R"]
なので,もしやキーは…
あ,暗号文の最後の 1 文字 (43文字目) も {
が暗号化されたものだとわかって,これのキーが R
.
つまり,繰り返し使ったときに 43 番目が R
になるキー.
43 文字目が R
になるのだけど,VIGENER
がわかっていて,この 7 番目の R
が 43 番目に使われるようにするには,n
を適当な整数とすると,
size(k) * n + 7 = 43
となるから,size(k)
と n
が成り立つ整数の組み合わせは (36, 1), (18, 2), (12, 3), (9, 4)
の 4 通り (size(k)
が 7 より小さくなることはないから).
そんで,この推測にたって,8 文字目はまぁ E
だろうと踏んで,9 文字の場合,12文字の場合…と試せば…
解けた〜 🎉
https://github.com/tiwanari/seccon16/blob/master/vigenere/solve.rb で
ans: SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}
(key: ["V", "I", "G", "E", "N", "E", "R", "E", "C", "O", "D", "E"])