ksnctf 21問

ksnctf - 21 Perfect Cipher

zipファイルを解凍すると

  • encrypt.cpp
  • encrypt.enc
  • flag.enc
  • mt19937ar.cpp
  • mt19937ar.h

ができる。encrypt.cppを覗いてみると、名前の通り暗号化するプログラムだった。どうやらencrypt.encはencrypt.cppを暗号化したもの、flag.encはflag.jpgを暗号化したものらしい。

ふむふむ、このflag.encを解読しろってことね。

暗号化のアルゴリズムを詳しく見ていくと、mt19937ar.cppで定義されている擬似乱数発生器を未知の"seed"っていうファイルで初期化した後、生成される擬似乱数を使ってencrypt.cppとflag.jpgに対して続けてXOR暗号をかけているらしい。

XOR暗号は2度かけると元に戻るという性質があり、encrypt.encとencrypt.cppは与えられているので、encrypt.cppの暗号化時に生成された乱数列は求めることができる。

ここで、求めた乱数列からseedを逆算できないかと思いググってみると、seedは逆算できないものの、後続の乱数列を予測できるらしい。

inaz2.hatenablog.com

ふむふむ。メルセンヌツイスターって聞いたことはあったけど、こういう仕組みになってるのね。

このページを参考に、flag.encを解読。勉強になりました。