Sim's blog

電子工作はじめてみました

ICFP2007 (20) 暗号解読(2)

2007-09-10 20:38:20 | ICFPプログラミングコンテスト
ICFP2007 (19) 誤り訂正符号の続きです。

DNAの暗号解読は遅くてたまらないのでjavaでcrypt互換ルーチンを作っていました。
mainの中で配列に初期値として入っている値はhelp-beautiful-numbersを復号する本当の鍵とgoodVibrationsだけずれています。goodVibrationsを0から順に増やして鍵探索を行いました。正しく復号できれば、正解ですが、復号できたかどうかはcheckIntegrityを使って判定しています。

探索部分はこんな感じです。
void crackGoodVibrations(){
    int i, gb;
    byte[] ks = {
        (byte)0xd8, (byte)0xc6, (byte)0xee, (byte)0xce,
        (byte)0xda, (byte)0xca, (byte)0xe7, (byte)0xe7
   };
    boolean found = false;

    for(gb = 0; gb <256; gb++){
結果、123が出力されました(16進だと7b)。さっそくgoodVibrationsに123を入れて動かしてみるとhelp-beautiful-numbersが見れました。カタログのpage 8128になります。このページはページ番号を指定しなくてもgoodVibrationsに正しい値を入れておくだけで自動的に見れます。
本当の鍵はlazinessということになります。



完全数のことなんかが書いてあります。博士の愛した数式に出てきました。ラマヌジャンの名前もあります。1729は自然数の3乗の和として2通りに表せる最小の数だそうです(1729 = 12^3+1^3 = 10^3+9^3)。苦労したわりにはあまり役に立つ情報ではないような気もします。わざわざ赤字で書いてあるところはパスワード候補ということでチェックです。

暗号化されている関数で残っているのはcaravan、cow-tail、help-activating-genesです。今まで分かっている暗号化の鍵では復号できませんでした(含む今回の赤字)。関数の終わりはどれも同じパターンであることを利用すれば解読できそうです。もしくは先頭のパターンも分かっている(RNA出力)ので、そこを利用することもできます。とりあえず解読プログラムをのろのろ書き始めました。
関数以外にもデータの方にまだ暗号化されているものが残されているかもしれません。

javaのbyteは-128~127なのでcastしないと0xd6とかが代入できません。なんか面倒です。javaでもprintfが使えるようになったのは便利です。Eclipseには高級なデバッグ機能があるのに、あいかわらずprintfデバッグをしています。