Aaron氏ページにFD1094の解析進捗状況が出ています:
みなさんもお気づきかもしれませんが、暗号化されたSegaゲームの残りのエミュレーションが進んできました。実際に解析に使うCPUが無くてもよいというものです。これは、ゲームで使われているキーの分析によるもので、MC8123ベースのゲームについては、ニコラ氏が既に解析を完了して、完全なキーを生成するのに成功しました。しかしFD1094については、これほど単純ではないにしても、進歩が見られています。
私自身は、前から何回も言っていますが、暗号のエキスパートではありません。ですが、Segaゲームで使われているFD1094 CPUが保持しているキーは、アルゴリズム的に生成してないとするには大きすぎると感じていました。ひと月ほど前、MAMEの開発者メーリングリストにこの考えを出してみて、これを進める価値があるか聞いてみたのですが、あまり反応はありませんでした。そこで、今現在得られているFD1094のキーを分析することにしました。
最初、目立つパターンを探すことから始めたところ、興味深いものが2つありました:
- キーのアドレス$0004~0FFFのバイトはすべて、$80セットになる
- キーのアドレス$1004~1FFFのバイトはすべて、$40セットになる
- 各キーの0~5のビットはきわめて均一な乱数値である(0と1の割合がほとんど50対50)
この事実を元に、今あるキーの下位6ビットについて、それぞれ反復している箇所を探すことにしました。私自身が考えていたのは、これらのビット生成を行ったのは、擬似的な乱数生成器か何かではないかということです。これらのデバイスが生産された当時、暗号技術用のセキュアな乱数生成は、さほど重要視されていませんでした。そこで、使われたのは単純な線形合同法(LCG)によるものではと考えたのです。もしそうだとすると、生成される数列には周期性があるはずです。
最初は生成器が一つとして、異なるキーからのビットをつなぎ合わせることで、これらを生成するアルゴリズムを再構成できないかと考えました。そこで、全てのキーを読み込み、あるキーの終端部の数列が、他のキーの開始部にダブらないかを探し出すプログラムをこしらえたところ、思った通り、ある長さのビット列が規則正しく反復しているのが見つかったのです。
さらに興味深いことに、ビット列の周期間隔は2の累乗になっていたので、最初は生成アルゴリズムはLCGではなく、ビット置換かもと思いましたが、OG氏が2の累乗の係数を使ったLCGでも、2の累乗のビット周期になると指摘してくれました。 …つらつらということで、エキサイトリーグの画面も出ました。