Sim's blog

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

ICFP2007 (18) 暗号解読

2007-09-05 22:58:57 | ICFPプログラミングコンテスト
ICFP2007 (17) help-palindromesの修復の続きです。

crackKeyAndPrintという関数にpurchase codeを渡してやると暗号解読して鍵を表示してくれます。purchase codeはint24の0(III・・・IIP)を暗号化したものなので、端から順に試していけば鍵が分かるという仕組みです。purchase codeは3つ分かっています。

一つ目はhelp-error-correcting-codes_purchase_codeを解読したものです。


やたら時間がかかります。たった2桁を解読するのに56122457回(5612万2457回)の繰り返しで157.562秒かかりました。

2つ目はvmu-code_purchase_codeです。これの鍵はICFP2007 (10) gene tableの修復で見つけたOPEです。答えは分かっていますが実行してみます。


これは恐ろしく時間がかかりました。繰り返しが1965822242回(19億6582万2242回)で実行時間は5379.296秒です。ほぼ1時間半です。

最後のhelp-beautiful-numbers_purchase_codeはICFP2007 (9) mainの逆アセンブルの結果からすると8桁なので調べるのは無謀っぽいのでやっていません。暗号アルゴリズムがRC4と分かっているのでgoodVibrationsを00-ffと変える方が速そうです。

ところで、crackKeyAndPrint関数の最初では背景と同じ黒い文字で「Harry Potter and the Orion Slave Girls. Out *now* on Arcturus III.」というメッセージを出力しています。これもまた新たな謎です。どこかに使う鍵なのかもしれません。ハリーポッターシリーズの最新作のタイトルでしょうか。Orion Slave Girlsというのはエンタープライズのオリオンシンジゲートと何か関係があったりするのでしょうか?

crackKeyAndPrintを動かすためのprefixです。
// パラメータをスタックに積む
// (!36f1c(!18)!6f5c6e)
IIPIPIICCCIIICCCCICCICCIIIIIPIIPIPIIICCPIICIPICCCICCIIICCCICICCCCICCPIICIIC
// #1#0
IPPCPIPPPIIC
// サブルーチンコール(init)
// !352f(!23ca0e(!a0e)!4ec185)
IPCCCCICIICICICCPIIPIPICCCIIIIICICIICCCCIIICPIIPIPICCCIIIIICICPIIC
IPCICIIIICCIIIIICCICCCIICPIICIIC
// #0#1
IPPPIPPCP
// CIICICCIIICICIICIICCICCP crackKeyAndPrint番地
// ICCICIIIICCICIIIIIIIIIIP 同サイズ
// CCCCIIIIICCCIICIICIIICIP terminate番地
// ICICIIICCIIIIIIIIIIIIIIP 同サイズ
FCCFCFFCCCFCFCCFCCFFCFFIC
CFFCFCCCCFFCFCCCCCCCCCCIC
FFFFCCCCCFFFCCFCCFCCCFCIC
CFCFCCCFFCCCCCCCCCCCCCCIC
IIC

スタックにパラメータを積んでからinitをcallしています。initの戻り番地としてcrackKeyAndPrint、crackKeyAndPrintの戻り番地としてterminateを積んでいます。戻り番地をどんどん積んでおくことでサブルーチンの連続callを一回のcallで済ませることができます。

最新の画像もっと見る

コメントを投稿