プログラムを組んで、制限時間内に与えられた問題を解く。 言語は何を使ってもよい。
並べ替えられた文字列を辞書から探す問題。一文字ずつ対応を取って比較すればいい。
与えられた文字列を、そのままscramble.txtにコピー&ペーストし、Rubyで解いた。
次は画像処理の問題。白い点の位置がASCII-codeをあらわしていて、さらに、 スペースで区切られたモールス信号に符号化されている。
"a test" => ".- / - . ... -"
RubyでPNG画像を扱うのは面倒なので、C#で解いた。
画像を(0,0)から調べる。白点が見つかったら、最後に見つかった位置から進んだ距離を計算し、文字に直す。 そして、最後に白点が見つかった位置を更新する。
モールス信号からの変換は、ハッシュテーブルに対応を書いただけ。
PHPで実装された暗号化アルゴリズムを参考に、与えられた数列を復号化する問題。
基本方針は総当り。ただ、何について総当りを試すのか、どこで枝刈りするかを考える。
まず、与えられたアルゴリズムから復号化を考える。
つまり、第i番目の文字を復号化するには、
が必要。
intMD5Totalの初期値はPasswordのハッシュで決まり、残りも順次決まっていくのでPasswordのMD5ハッシュが決まれば復号化できる。
けれども、32文字総当りでは15の32乗で、43143988327398919500410556793212890625通り。多いよ(´・ω・`)
crosstotalは、与えられたMD5ハッシュの各文字を16進数として評価して全て足したもの だから、0から480(0x0F*32=480)の値をとる。intMD5Totalの初期値はPasswordのMD5ハッ シュ値の和だから、この初期値を決めれば絞り込むことができる。
次に、平文について調べてみる。平文には、既に文字が決まっている位置がいくつかある。
決まっていない位置を * であらわす ***-***-OEM-***-1.1\n
という20文字が繰り返されている。
決まっていない部分は、サンプルに記号も小文字も含まれていないから、おそらく大文字と数字だけなのだろう。暗号文と平文の文字数と位置は対応があるから、復号化した文字をチェックすればさらに絞り込むことができる。
また、とりあえず始めの32文字分でPasswordのMD5を決め、復号化した結果を表示させる。 そうして表示させた結果を人が見て判断したほうが、おそらく早いだろう。
ということで、intMD5Totalの値を変化させて、順次PasswordのMD5ハッシュを決めていくことにする。
さらに、$intMD5Totalの初期値は、暗号文の一文字目の値で範囲を絞れる。暗号文の一文字目がE、PasswordのMD5の一文字目をP、もとの文字をCとすると、
$intMD5Total = C + P - E '0' = 48 <= C <= 'Z' = 90 0 <= P <= 15 だから、 48 - E <= $intMD5Total <= 105 - E
きっと他にも条件があるのだろうな。
今回は一度Rubyで組んで、速度の問題からC&C++に移した。
XMLファイルを解析して、絵を描く問題。
XMLの解析はRubyのREXMLで行い、絵はRubyからPostScriptを書き出した。
XMLには、線と円弧の情報が含まれている。線なら、色、始点のXY座標と終点のXY座標。 円弧なら、色、中心のXY座標、半径、描き始める角度と描く角度。単位はラジアンではなく、"度"。
壊れたbzip2ファイルを修復する問題。(未回答)
WindowsのFTPを使って、ASCII-modeでダウンロードしたために、LFがCRLFへ置き換わってしまったのだろう。
bz2ファイルに含まれるCRLFを総当りでLFに変換して、それぞれ正しいかどうか試せばよいはず。