(57)【要約】  【課題】  非保護環境で実行してもプログラムデータの不正コピーを不可能にする暗号プログラムを提供する。  【解決手段】  プログラムデータを不正コピーから保護するための暗号プログラム生成装置は、プログラムデータ１１２から分岐命令を抽出する分岐セパレータ１０２、該プログラムデータの該抽出された分岐命令及び残余部分を圧縮して圧縮データを作成する圧縮器１０４、該圧縮データを暗号化してプログラムメモリ３２に格納する暗号化器１０８を具備する。【選択図】図３
2005166070.tif 000002
【特許請求の範囲】
【請求項１】
プログラムデータを不正コピーから保護するための暗号プログラム生成装置であって、
プログラムデータから分岐命令を抽出する分岐セパレータ、
該プログラムデータの該抽出された分岐命令及び残余部分を圧縮して圧縮データを作成する圧縮器、
及び
該圧縮データを暗号化する暗号化器を具備する事を特徴とする暗号プログラム生成装置。
【請求項２】
請求項１記載の暗号プログラム生成装置において、該分岐セパレータは、プログラムデータのチェックサムを表すチェックサムデータを自動的に生成する手段、及び、プログラムデータ処理のタイミングを評価するために用いられるタイミング情報を自動的に生成する手段を有し、該チェックサムデータ及び該タイミング情報は該圧縮器により圧縮され、そして該暗号化器により暗号化されることを特徴とする暗号プログラム生成装置。
【請求項３】
請求項１記載の暗号プログラム生成装置において、該暗号化器は、キー値により決まる可逆的かつ決定論的パターンに従い該プログラムデータのデータエレメントを並べ替えるためのデータスクランブラーを有することを特徴とする暗号プログラム生成装置。
【請求項４】
請求項３記載の暗号プログラム生成装置において、該データスクランブラーは複数の先入れ先出しバッファからなることを特徴とする暗号プログラム生成装置。
【請求項５】
請求項３記載の暗号プログラム生成装置において、該可逆的かつ決定論的パターンは疑似乱数発生器の出力を参照することによって生成されることを特徴とする暗号プログラム生成装置。
【請求項６】
コンピュータにより、プログラムデータを不正コピーから保護するための暗号プログラムを生成する方法であって、該コンピュータは、
プログラムコードを非分岐命令の系列及び分岐命令の系列に分けるステップ、
該非分岐命令を圧縮して第１の圧縮データの集合を生成するステップ、
該分岐命令を圧縮して第２の圧縮データの集合を生成するステップ、
及び
該第１の圧縮データの集合及び該第２の圧縮データの集合を暗号化してプログラムメモリに格納するステップを実行することを特徴とする暗号プログラム生成方法。
【請求項７】
請求項６記載の暗号プログラム生成方法において、該暗号化では、キー値により決まる可逆的かつ決定論的パターンに従い該プログラムデータのデータエレメントを並べ替えるためのデータスクランブルを実施することを特徴とする暗号プログラム生成方法。
【請求項８】
請求項７記載の暗号プログラム生成方法において、該可逆的かつ決定論的パターンは疑似乱数発生器の出力を参照することによって生成されることを特徴とする暗号プログラム生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行可能プログラムをコピーから保護する分野に関する。より詳しく述べれば、本発明は一実施態様において、プログラムを実行するプロセッサ及びプログラムを保持するメモリをアクセスすることを前提とした開放ハードウエアシステムにおけるコピー保護手段のための暗号プログラム生成装置及び方法を提供する。
【背景技術】
【０００２】
ソフトウエアが単品商品として販売されるようになって以来、コンピュータプログラムを不正コピーから保護することがソフトウエア開発者の関心事である。その難しさは、ソフトウエアはコピーが容易であり、また、どんなコピー保護もしくは防止方式もソフトウエアを実行しようとするときには結局は一部のコピーを許可せざるを得ないという点にある。ソフトウエアを、それを実行するチップを含むチップ（集積回路）内に閉じこめない限り、モニター可能な回路配線を通じて頒布メディアからプロセッサへソフトウエアの実行部分を送らなければならない。したがって、プログラムが保護され、そのうえで正当なユーザに使用できるためには、プログラムは、その一般に入手可能な形態でも正当なユーザにより実行される形態でも簡単にコピーできてはいけない。
【０００３】
最近、プログラム開発者の技術サポートを求める要求が増加しているのに対し、説明書類の充実に対する要求、ウイルスの心配、ある種のソフトウエア特に重要な業務用ソフトウエアの不正コピーは減ってきている。しかしながら、ソフトウエアが技術サポートや説明資料を必要とせず、かつウイルスに感染し得ないシステム、例えばゲームソフトウエアがリードオンリーメモリ（ＲＯＭ）に格納されたビデオゲームカートリッジを使うビデオゲームシステムの上で利用される場合には、不正コピーがまだ広く行われている。それに必要とされるのは、ゲームカートリッジに使用されている回路を理解してゲームプログラムをコピーすることだけである。
【０００４】
ビデオゲームのメーカは一般にビデオゲーム機を作り、その利用をライセンスを供与したソフトウエア製作者が製作したゲームのみに限定したいと考えるが、このビデオゲームメーカのもう１つの関心事はソフトウエアのコピーのことではなく、ビデオゲーム機をコピーし、正規のゲームカートリッジ又は不正な互換ゲームカートリッジを実行するゲーム機を作ることである。
【０００５】
保護されていないシステムでは、模倣者（すなわち”ソフトウエア海賊”その他のソフトウエアを不正に解析又はコピーする者）は、プログラムにアクセスできれば簡単にプログラムをコピーすることができる。ここではプログラムを走らせるために必要なデータのことをプログラムデータと呼ぶが、これには命令（プログラムコード）、値のテーブル、スクリーン画像を生成するために用いられる画像データが含まれる。プログラムデータがその頒布時の形態では簡単にアクセスできなくとも、模倣者は、プログラムデータを保持する記憶メディアとプロセッサとの間のバスを観測しプログラムコードを調べることによって、プログラムデータを手に入れであろう。したがって、プログラムだけを暗号化しても、プログラムは結局はデコードされて利用されるので本当の保護にはならない。プログラムデータがビデオゲームカートリッジに格納され、プロセッサがビデオゲーム機上にある場合には、いかなる秘密通信によることなく記憶メディアとプロセッサとの間のインターフェースを容易に利用できるので、プログラムデータの解析は簡単になる。多くのビデオゲーム機で、ＣＰＵのバス全体が簡単に解析に利用できる。このような問題は、ビデオゲームカートリッジのみならず、どのようなの種類の取り外し可能なプログラム記憶メディアにも当てはまることは当然である。
【０００６】
多くのコピー保護方式は、気まぐれでコピーしようとする者に対する抑止手段であって、プログラムの大量の不正コピーを作成にすることを意図して、コピー保護の仕組みを打ち破るために大金と多くの時間を費やすことをいとわない確信犯的模倣者に対する抑止手段ではない。気まぐれの模倣者に対しては、ソフトウエアのみによるコピー保護を導入することで間に合う。例えば、気まぐれな模倣者には普通はアクセスされたり観測されたりしない秘密ファイル又はコードを利用すれば十分である。また、気まぐれの模倣者の多くは、コピーするのにカートリッジを作る必要があると、プラスチックのカバーと回路基板を作る能力を要するため、コピーすることをあきらめるであろう。しかし、非常に確信犯的なカートリッジの模倣者は、大量のカートリッジを作って売ることを企ており、したがってプログラムデータがコピーされたならカートリッジを作る能力を持っている者である。ソフトウエアのみによるコピー保護方式は、プログラムデータメディアの文書化されない部分を秘密コードの格納のために用いるであろうが、一般に、”不明であることによる保護”によって、コピー方法を知らない者だけは使用可能なコピーを作成できないようにする。したがって、大規模な、熟練した模倣者を阻止しようとする場合には、ソフトウエアのみによるコピー保護は利用できない。幸いなことに、ハードウエア要素を含むメディアによりプログラムデータが頒布される場合、例えばビデオゲームカートリッジの場合には、ハードウエアによるコピー保護をカートリッジに組み込むことができる。
【０００７】
ハードウエアによるコピー保護方式の多くは、プログラムの正規コピーがあることを知らせるハードウエア回路又はデバイス（許可デバイス）が存在することを前提にしている。プログラムは、実行時に、許可デバイスがあるかチェックするルーチンを走らせる。許可デバイスがなければ、プログラムは動作を続けることを拒絶するか、何か他の望ましくない動作をする。これらの防護方式は２つの攻撃方法に対しては無防備で、防御が無力化される恐れがある。
【０００８】
その一つの攻撃方法の場合、模倣者はハードウエアの許可デバイスの回路を解析してその必須エレメントを確定し、得られた情報に基づいて不正な許可デバイスを複製する。許可デバイスの細部がカスタム集積回路に埋め込まれていたとしても、化学的剥離プロセスを利用し集積回路を１層ずつ顕微鏡で観測して回路の構造を解明できる。また、１動作の詳細解析又はプログラムの多数のパスの高速解析を支援するために、許可デバイスの動作を、その回路及びプロセッサの動作速度を下げたり上げたりして観測することもできる。
【０００９】
もう一つの攻撃方法の場合、模倣者は、許可デバイスが存在するかチェックするソフトウエアルーチンを、許可デバイスが実際に適所にあろうとなかろうと、適所に存在するという報告を常に返すように変更しようとする。模倣者は、簡単に手に入るロジックアナライザーをプログラムを走らせるマイクロプロセッサに接続しておき、マイクロプロセッサを低速で走らせてマイクロプロセッサとの間のデータのやりとり全部をロジックアナライザーで記録させ、この情報を用いてプログラムのフローを確認する。許可デバイスが適所にある場合（正当使用の模擬）と適所にない場合（不正使用の模擬）の両方についてプログラムのフローが記録されれば、模倣者は、両フローを比較し、そして許可デバイスが適所にあるか否かの判定がプログラム内のどこでなされるか確認することができる。その位置が確認されたならば、ソフトウエアのその位置を、許可デバイスの存在判定のルーチンが存在を否定することがないように変更することができる。これは、一つの条件付き飛び越し命令を無条件飛び越し命令又はＮＯＰ（ノーオペレーション）に置き換えることにより行うことができることが多い。
【発明の開示】
【発明が解決しようとする課題】
【００１０】
したがって、必要とされるものは、必ずしも安全ではないバスを通じてプロセッサにプログラムコードを実行させる装置であって、模倣者の方で、それ以外の装置で用いるためのプログラムデータを複製しようとすると、あるいは当該装置を複製しようとすると、実現不可能なほどの膨大な作業が必要となるような装置である。よって、本発明の目的は、そのようなプログラムをコピーから保護するための暗号プログラム生成装置及びその方法を提供することである。
【課題を解決するための手段】
【００１１】
本発明は、プログラムコードを非保護環境で実行しても、プログラムコード又は関連データのコピー方法を確認できなくする保護システムを提供する。本発明による保護システムの一実施例においては、プログラムメモリに暗号化したプログラムデータ（プログラム命令、データテーブル、デジタイズド画像等々）を記憶し、また、そのプログラムデータをプロセッサが必要とする時に取り出すために一つの集積回路に収容されたセキュリティ回路が用意される。実施例によって、そのプロセッサは中央処理装置（ＣＰＵ）であり、ビデオ画素プロセッサであり、あるいはプログラムデータを必要とする他の低水準ＣＰＵである。非保護システムにおいてはプロセッサにより実行されるであろう処理ステップの一部は、当該保護システムにおいては、セキュリティ回路内で、暗号化プログラムデータの中のプロセッサには与えられない部分により実行される。プログラムデータは、プロセッサから出されるセキュリティチップ（security  chip）に対する適切な要求に基づき解析される。セキュリティチップは、どのプログラムコードが実行中であるかによって、プログラムメモリのどのセクションがプロセッサが要求を出し続けるために適当であるかを監視する。セキュリティチップはキーレジスタを含み、このキーレジスタにはプログラムコードを復号化するのに必要なキー値が格納される。セキュリティのため、異なるプログラム毎に別々のキー値を用いてよい。
【００１２】
チップ剥離の恐れがある場合、キーをバッテリ駆動の揮発性メモリに記憶させ、又はキャパシタ上の電荷として記憶させ、セキュリティチップを剥離すると揮発性メモリに達するかなり前に揮発性メモリに対する電源が破壊されるように、揮発性メモリをセキュリティチップ面に配置又は分布させるとよい。
【００１３】
ある実施例では、セキュリティチップはプログラム命令から分岐ステートメントを抽出し、それを、復号化した後、プロセッサへ供給する前に、内部の分岐テーブルに格納する。好適な実施例では、分岐ステートメントは暗号化される前に分離されプログラムメモリに格納される。プログラムの可能なフローは分岐テーブルから分かるので、分岐テーブルだけに可能な分岐のリストを記憶していれば良いので、メモリが節約される。
【００１４】
いくつかの実施例では、暗号化は一般的な複雑な暗号化であるが、別の実施例では、ハードウエアを削減するため、暗号化は疑似乱数発生器（ＰＲＮＧ）の出力との排他的論理和演算である。必要ならば、いくつかの補助的な保護方法が適用されてもよい。例えば、セキュリティチップがプロセッサバスを読むように配置されるならば、セキュリティチップがメモリからの命令フェッチ及びデータフェッチを全てモニタできるようにプロセッサバスのタップを設けてもよい。例えば、セキュリティチップは全ての分岐情報を提供するから、分岐と分岐の間のプログラムの流れは直線的かつ決定論的である。したがって、セキュリティモジュールは分岐間のバスアクティビティ全部のチェックサムをとり、それを予め求められているチェックサムと比較し、そしてチックサムが一致しないときには、プロセッサに与えられた命令が何か変更されているのであろうから、それ以上の分岐情報の提供を拒否する。
【００１５】
セキュリティチップは、プロセッサが所期の速度で命令を実行していることを確認するため、リアルタイムクロック、ＲＣ（抵抗−キャパシタ）時定数回路、又は他のダイナミック論理回路を持っても良い。こうすることで、不正な分岐テーブルの作成に必要な物を通じプログラムを走らせるプロセスをスピードアップするためにプロセッサが加速されたり、あるいは、ハードウエア解析を行うためにプロセッサの速度が下げられたりしないようにする。
【００１６】
また、セキュリティチップは分岐テーブルを保持しているため次の分岐が何であるか推測でき、したがって、プロセッサは条件付き分岐を起こすかどうかを判断するために必要な値を与えるだけでよい。リターン命令を処理するために、セキュリティチップはプロセッサのためのプログラムスタックも保持する。このセキュリティ機構はプロセッサが予期しない分岐情報を要求しないようにする。
【００１７】
暗号化されたプログラムデータに対する文字推定攻撃（chosen  text  attack）をやりにくくするため、プログラムデータを最初に圧縮することによりデータ中のパターンを除去してもよい。
【００１８】
暗号化と復号化は一般的な暗号化／復号化と同様に行ってよい。しかし、ハードウエアコストが小さいことが優先される場合には、暗号化器はＰＲＮＧの出力に従ってプログラムデータのビット又はバイトの順番を並べ替える単なるデータスクランブラーにしてもよい。このときには、データ復号化器は単にバッファ、マルチプレクサ及びデマルチプレクサの系列である。セキュリティチップが伸長器を含んでいる場合には、そのバッファは既に伸長器内にあるかもしれない。スクランブラーが他の暗号化と一緒に用いられると、データ中のどのワード又はビットの位置も推測できないので、文字推定攻撃は一層困難になる。ＰＲＮＧの種は、キー値又はキーの依存値に見合ったある値により設定される。ファイルが圧縮されるため、それほど強固でない暗号化を用いることができる。暗号化されたプログラムデータの多くの異なったセクションを対応した復号化データと比較することによりキー値を確定する分析法に対して、防御ほより強固にするため、セクション毎に変化する補助キー値を用いてもよい。この補助キー値は、プログラムデータと一緒に格納された値及びメインのキー値から生成される値としてよい。あるいは、補助キーのテーブルをプログラムデータと一緒に格納し又はセキュリティチップ内に格納し、メインのキー値を用いて、そのテーブルよりキーを選択してもよい。
【００１９】
用途によっては、不正ゲーム機上での不正ゲームカートリッジの動作を阻止することも望まれる。このような用途の場合、ゲームカートリッジにコピーしにくいエレメントが設けられ、ゲームカートリッジ上のセキュリティチップは作動前にそのエレメントが存在していることを要求する。
【発明の効果】
【００２０】
以上に詳細に述べたように、本発明によれば、プログラムを非保護環境で走らせる場合においても、プログラムの不正コピーを不可能あるいは事実上不可能になり、また、集積回路チップの隔離等の技術を持つ熟練した確信犯的模倣者に対しても対抗できるため、より確実にプログラムを不正コピーから保護することができるという効果を得られる。
【発明を実施するための最良の形態】
【００２１】
図１は、本発明のためのありふれた用途、すなわちビデオゲームを表している。開示内容を読めば明白になるように、本発明はビデオゲームあるいはカートリッジ上に格納されるプログラムに限定されるものではない。
【００２２】
図１において、ゲーム機１０にゲームカートリッジ１２がバス１４を介し今まさに接続されようとしている状態が示されている。ここでは、模倣者はゲームプログラム及びゲームデータをゲームカートリッジ１２に格納される時に読み取ることができ、または模倣者はゲーム機１０内で起こることを全て知っていると仮定する。また、セキュリティデバイスの好ましい設計プラクティスに従い、模倣者はキー又はパスワード以外は、どんなセキュリティ回路及びアルゴリズムも全て詳しく知っていると仮定する。システムの基本的な目的は正規ユーザがプログラムを走らせることができるようにすることであるので、模倣者が所与の入力データ・セットでプログラムを走らせてプログラムの結果と流れを観測することを妨げることは不可能である。したがって、このシステムの目標は、プログラムを通常速度で走らせること、そして、一つの入力データ・セットによりプログラムを１回実行することによって推測できるプログラムの情報量を制限することを要求することである。実際のプログラムコード及びデータを確認することが事実上不可能であるのは、システムに対して走らせなければならない入力データセットの数があまりに多いために、かかる解析を実施するのに必要な時間が、プログラムの適法な販売の大半が終わるまでの期間より長いか同等であるからである。
【００２３】
ゲーム機１０は図示のように、プロセッサ２０、ローカルメモリ２２、ビデオディスプレイ１６への出力インターフェイス、入力装置１８からの入力インターフェイス及び回路クロック２４を有する。ゲーム機１０は図示されないが他のエレメントを持っているかもしれない。入力装置１８は、本発明の主題ではないので包括的に示されているが、例えばキーボード、ジョイスティック、タッチパッド又はセンサーアレイである。ビデオディスプレイ１６は通常、プロセッサ２０又は中間ビデオメモリ（不図示）により指定された色の画素の２次元配列を表示する画素分割ディスプレイ（例えばラスターモニタ）である。ローカルメモリ２２は、プログラムの実行に用いられる変数並びにプログラムのカレントページの命令を格納する。プログラムは必要になった時にローカルメモリ２２にページングすることができるので、ローカルメモリ２２はプログラム全体を同時に格納する必要はない。この説明から明らなように、セキュリティシステムをプロセッサ２０すなわちゲームシステムのＣＰＵに関連して説明するが、本発明はシステム内にあるビデオプロセッサ、画像プロセッサ、その他のプロセッサに関しても利用し得る。
【００２４】
図示されたゲームカートリッジ１２は、セキュリティチップ３０とＲＯＭ（プログラムメモリ）３２を有する。ＲＯＭ３２の代わりに別種の記憶手段、例えばＣＤ−ＲＯＭ（コンパクトディスクＲＯＭ）、ディスケット、フラッシュメモリ、あるいはネットワーク経由でアクセスされるリモートプログラム等を用いてもよい。ＲＯＭ３２はゲームプログラムを暗号化された形で格納している。そのように格納されたプログラムは、プログラムの実行可能コード、データテーブル、グラフィック画像のほか、カートリッジにより実現されるゲームの動作に必要な又は関係した関連オブジェクトから構成される。好適な実施例では、セキュリティチップ３０は単一の集積回路であって、外部アクセス可能なピンに保護データストリームは全く流れない。
【００２５】
本発明は、あらゆる攻撃に対し保護できるわけではない。例えば、模倣者がゲームメーカの不心得な従業員から暗号化前のゲームプログラムを手に入れたならば、模倣者がそのプログラムをそのままの形で頒布することを本発明は阻止できないであろう。ここでは、不正な模倣者はゲーム機といくつかのゲームカートリッジを入手できるだけであると仮定する。このように入手方法が限定された場合、模倣者は図１にツール４０として示した様々な解析ツール及び制御ツールを利用し、ゲーム機及びカートリッジの動作解析を試みるであろう。解析ツールは信号を記録し、一方、制御ツールは信号を変化させるが、多くは同時に解析ツールで信号を記録する。このようなツールにはマイクロプロセッサ・トレースアナライザー、波形発生器、オシロスコープ等が含まれる。図１は、模倣者が信号の解析及び制御のためのタップを設ける可能性のあるゲーム機１０及びゲームカートリッジ１２内部のいくつかの箇所を表している。重要なことは、模倣者は、セキュリティチップ３０の化学的隔離や顕微鏡レベルの作業を行わないと、セキュリティチップ３０の内部信号線にタップを設けることができないことである。
【００２６】
回路クロック２４に対するタップ４１は、ゲーム機１０の動作速度を下げてゲーム機１０の動作解析を容易にするために、あるいは、回路クロック２４の速度を上げて、より迅速に多くの命令を実行することによりプログラムの様々な変化をテストするために、利用されるかもしれない。このタップを利用できなくするため、セキュリティチップ３０は内部的に速度が決定されるクロックも保有し、回路クロック２４が正しい速度で動作しないとＲＯＭ３２からのプログラムデータの復号化を拒否してもよい。
【００２７】
ＲＯＭ３２に対するタップ４２は模倣者にＲＯＭ３２の内容を提供するが、これらの内容はセキュリティチップ３０によって提供される復号化がなければ役に立たない。バス１４上を往来するデータに対するタップ４４又はプロセッサ２０とローカルメモリ２２の間を往来するデータに対するタップ４３は、復号化されたプログラム情報を提供するかもしれないが、しかし、ゲームの１実行に当てはまるプログラムシーケンスの例を提供するにすぎず、様々な入力セットに利用可能なシーケンスを提供するものではない。さらに、その情報は分岐命令を含まない。というのは、分岐命令はプロセッサへは送られず、セキュリティチップ３０内で実行されるからである。
【００２８】
ビデオディスプレイ１６に対するタップ４５についても同じことが言える。タップ４５は全てのビデオ信号を記録できるかもしれないが、ビデオ信号は単にゲームのある特定のプレイに対応するにすぎない。例えば、独特のグラフィックスを含むあるゲームレベルに決して到達しなければ、そのゲームレベルのグラフィックスはビデオディスプレイ１６に決して送られないからタップ４５により取得できない。
【００２９】
確信犯的な模倣者は、ゲームの様々な結果とイベントをシミュレートする信号を挿入するために入力装置１８とプロセッサ２０の間の信号に対するタップ４６を利用するかもしれない。様々な十分なパスによって、模倣者はあらゆる可能性を確認してゲームプログラムを再現できるかもしれないが、プロセッサの速度を上げることができないため、また、極めて多くの可能性があるために、ゲームが市販されてから模倣者の潜在市場を拡散させるに十分な量が売れてしまうまでの間に、模倣者がゲームを再現できるとは思われない。
【００３０】
このように、これらのタップを全て用いたとしても、ゲーム機１０とゲームカートリッジ１２しか入手できない模倣者は、ゲームプログラムの完全な使用可能な複製を作ることができない。確信犯的な模倣者はセキュリティチップ３０そのものに侵入するかもしれないが、それにはセキュリティチップ３０のケースを注意深く取り除いてセキュリティチップ３０を１層１層解析しなければならない。しかしながら、セキュリティチップ３０の内部回路全体が分かったとしても、層を除去するとキーを保持しているメモリは電源を断たれるように設計されているため、模倣者はＲＯＭ３２の復号化に必要な揮発性のキー設定を得られないであろう。そのメモリが電源のために必要な層より何層も下にある場合、メモリはその層が解析に利用できるようになる前に消去されてしまうであろう。模倣者は、セキュリティチップ３０を打破するには、ＲＯＭ３２の内容とセキュリティチップ３０の出力を解析してキーを引き出すことができなければならない。キーはゲーム毎に異なることに加え（必ずしも各ゲームカートリッジはそのゲームを格納しているとは限らない）、セキュリティチップ３０はその中身にアクセスせずに暗号を打破することをいっそう困難にする他の機構を含んでいる。
【００３１】
図２はセキュリティチップ３０をさらに詳しく表す。セキュリティチップ３０はバスユニット５０を有し、これはセキュリティチップ３０をバス１４と結合し、プログラムデータを求める要求をトランスレータ５２に渡す。トランスレータ５２は、アクセス要求のアドレスをＲＯＭ３２のアドレスロケーション又はロケーション範囲へ変換する。このアドレスはアドレスバス５４を介しＲＯＭ３２へ送られ、ＲＯＭ３２はデータをデータバス５６で返す。あるいは、ＲＯＭ３２のいくつかのロケーションがキャッシュ６０にキャッシュされてもよく、この場合にはトランスレータ５２はアドレス情報をキャッシュ６０へ送り、キャッシュ６０はキャッシュデータを供給する。
【００３２】
両方のデータソースが復号化器６２の入力に結合されるが、復号化器６２はキーレジスタ６４により与えられるキー値を使ってＲＯＭ３２からのデータを復号化する。後述のように、要求されるセキュリティの程度に応じて復号化器６２は様々な構成をとり得る。復号化器６２はほぼ、プログラムデータの暗号化に使用される暗号化器の逆装置でなければならないので、復号化器６２の様々な構成を暗号化器と関連させて後述する。
【００３３】
復号化器６２の出力はオプションの伸長器６８の入力に与えられ、伸長器６８はそのデータをルーター(router）７０へ送る。ルーター７０はクリア(clear）ＲＯＭデータ用出力と秘密データ用出力を持つ。クリアＲＯＭデータは暗号化されないプログラムコード及びデータオブジェクトであるが、分岐情報は持たない。秘密データは分岐情報並びに他の変数、例えばチェックサムと所期の実行時間を含む。
【００３４】
秘密データ出力は演算ユニット７２に結合され、演算ユニット７２はセキュリティチップ３０の全体的制御を司る。演算ユニット７２はプライベートテーブル７４の読み書き用ポート、リアルタイムクロック７６の読み込み用入力、バスユニット５０から分岐要求を受け取るための入力、バスユニット５０に結合される分岐応答用出力、プロセッサバスすなわちバス１４上で発生するアクティビィティに関する情報を提供するバスタップのためのバスユニット５０からの入力、プログラムデータの要求の妥当性に関するバスユニット５０からの問い合わせを受け取って回答するためのポートも有する。セキュリティチップ３０の詳細な動作については図４及び図５に関連して後述する。
【００３５】
図３は、ゲームカートリッジ１２に使用されることになる暗号化ＲＯＭ３２にゲームプログラム１１２を暗号化するために利用されるシステム１００のブロック図である。システム１００は分岐セパレータ１０２に結合されるゲームプログラム１１２用記憶装置を有し、分岐セパレータ１０２は保護プログラム１１４、分岐テーブル１１６、チッェックサムデータのファイル１１８、タイミングデータのファイル１２０を出力する。これらデータセットのための記憶装置が用意されており、この記憶装置は圧縮器１０４に結合される。この圧縮器１０４はあってもなくてもよいが、ある方が望ましい。圧縮器１０４の出力は暗号化器１０８の入力に結合され、暗号化器１０８はキーレジスタ１１０からキー値を受け取るための入力も持っている。この暗号化器１０８の出力がＲＯＭ３２の内容を形成する。
【００３６】
前述のように、ゲームプログラム１１２はプログラムの実行可能コード、データテーブル、グラフィック画像、その他の関連オブジェクトからなる。説明用でしかないが、プログラムの実行可能コードの簡単な一例を表１に示す。表１に示すプログラムは、当該プログラムを任意の入力に対し走らせるのに必要とされる全ての情報が当該プログラムだけから分かるという点で”クリアな”プログラムである。実際、このプログラムは任意の可能な入力値（例えばａ［］の値）に対し、配列  ａ［］の初めの１０エントリーを配列  ｂ［］の対応したロケーションに移すに過ぎないことは表１から明らかである。
【００３７】
【表１】
2005166070.tif 000003
【００３８】
表１のプログラムに相当するＣ言語プログラムは次の通りである。
main｛
for（i=0；i<10；i++）
move（ｉ）；
｝
void  move（int
ｉ）｛
b[i]=a[i]；
｝
【００３９】
表１のプログラムが分岐セパレータ１０２へ与えられれば、表２に示す保護プログラム及び表３に示す分岐テーブルが得られるであろう。
【００４０】
【表２】
2005166070.tif 000004
【００４１】
【表３】
2005166070.tif 000005
【００４２】
この保護プログラムを生成する際、命令の順番は維持できたであろうから、行番号は順序通りである。しかし、これら行番号が正しいとしたら、セキュリティチップ３０に渡されるアドレスを解析すれば、どこでジャンプするか又はしないかが分かるであろう。例えば、表２の保護プログラムにおいて行番号が正しいならば、ジャンプアドレスｎの要求の後にジャンプアドレスｎ＋１の要求が続けば、アドレスｎに関連したジャンプは起こらなかったことを意味する（さもなければｎ＋１以外のジャンプアドレスが次のジャンプアドレスであろう）。この種の解析を防止するために、保護プログラムにおける行の順番がスクランブルされる。条件分岐毎に真と偽のアドレスが格納されるので、発生しないジャンプに続くコードは、そのジャンプの後に順番に続く必要はない。
【００４３】
図９乃至図１３はクリアプログラムのより長い例のリスト（Ａ）であり、図１４乃至図２１は同プログラムに対応した保護プログラムのリスト（Ｂ）であり、図２２は同プログラムに対応した分岐テーブルである。図２３乃至図２５は分岐セパレータ（図３）をソフトウエアで実現するために用いられるプログラムのリスト（Ｄ）である。当該プログラムは、Ｕｎｉｘオペレーティングシステムの走るコンピュータ上で一般に利用可能な”ａｗｋ”言語で記述されている。一見して明らかなように、図１４乃至図２１のプログラムは図２２の分岐テーブルを時折参照しないと実行できない。
【００４４】
実施例によっては、分岐セパレータ１０２は分岐テーブルを参照する間に実行されるいくつかの命令についてチッェクサムの計算も行う。これらのいくつかの命令は、分岐を全く含まないから毎回同じ順番で実行されるはずであり、したがって、そのチェックサムは計算が容易である。これらのチェックサムはチッェクサムデータ１１８として格納される。同じように、実施例によっては、それらのいくつかの命令のための実行時間を計算し、タイミングデータ１２０として格納することができる。
【００４５】
解析に対しより強固なセキュリティが必要とされるときには、分岐をセキュリティチップ３０により実行させるのではなく、セキュリティチップ３０で発生した分岐を実現するための割り込みを発生してもよい。こうすれば、模倣者は発生しない分岐は発見できないであろう。
【００４６】
保護プログラム１１４、分岐テーブル１１６、チェックサムデータ１１８及びタイミングデータ１２０が生成された後、この情報は必要ならば圧縮器１０４によって圧縮される。圧縮器１０４は例えば、Ａllen，Ｂoliek及びＢchwarzに対し付与された米国特許第５，３８１，１４５号”Ｍethod  and  Ａpparatus  for  Ｐarallel  Ｅncoding  and  Ｄecoding  of  Ｄata”に示されているエントロピーコーダーである。圧縮は、一定サイズのＲＯＭにより多くのデータを格納できるようにするために利用されるだけではなく、データ中に現れるかもしれない何らかのパターンを除去することによって、キー無しでの復号をより一層困難にするためにも利用される。
【００４７】
暗号化器１０８はいくつかの形態をとり得る。ハードウエアコストを抑えることよりもセキュリティが優先される場合には、暗号化器１０８をデータセキュリティの分野で知られている標準暗号方式（ＤＥＳ）の暗号化器、トリプルＤＥＳ暗号化器、あるいはさらに安全な暗号化システムとしてよい。ゲームが販売される国及びゲームが使用されると考える国の法律、並びに、セキュリティのニーズと計算能力の制約とのバランスに応じて、各種の暗号化器１０８が用いられてよい。暗号化プロセスのセキュリティの優先度がハードウエアコストを抑えることより低い場合には、いくつかの単純な暗号化回路を用いてもよい。一実施例では、暗号化は単にクリア（clear）データと疑似乱数発生器（ＰＲＮＧ）の出力ビットストリームとの排他的論理和（ＸＯＲ）のプロセスである。別の実施例では、クリアデータの順番がＰＲＮＧの出力に基づき並べ替えられる。ハードウエアコストはその分増加するが、これら２つの方法を一緒に用いてもよい。
【００４８】
上記の単純な暗号化方法は、ＰＲＮＧをわずかなゲートで容易に作ることができるので低コストである。シフトレジスタにより構成されるＰＲＮＧについては、例えば図８を見られたい。図７は、データスクランブラー１０６の内部構成の詳細ブロック図を示す。データスクランブラー１０６はいくつかのバッファを使うが、これらバッファが圧縮器１０４の一部として既に存在する場合には、バッファに関するコスト増加はゼロである。
【００４９】
もう一つの低コストの変形例では、暗号化は圧縮と組み合わされる。この変形例では、圧縮はエントロピー圧縮であり、使用すべき最適コードを決定するために確率予測値のテーブルを用いる。これらのテーブルのためのメモリはいずれにしても圧縮のために必要であるから、これらテーブルを暗号化に利用してもハードウエアコストは全く増加しない。これらのテーブルは、最初に又は圧縮プロセス中にキー値又はキー値をベースにした数値に応じて種を設定することにより、暗号化のために利用される。この暗号化方式によって得られる利点は、確率テーブルが確立する機会を持つまでは圧縮プロセスは必ずしも圧縮しようとするデータ中のパターンを除去しないため、暗号化プロセスに対する公知の単純文字攻撃(plaintext  attack）を防ぐことである。キー値により確率テーブルを初期化すれば、圧縮プロセスをそれほど簡単には解析できない。
【００５０】
暗号化器１０８の出力は、暗号化され、そして恐らく圧縮された後に、暗号化ＲＯＭ３２に格納される。次に、ゲーム機１０と暗号化ＲＯＭ３２を使うゲームカートリッジ１２の動作を図１から図５を参照して説明する。図４及び図５は、その両方で、プロセッサ２０とセキュリティチップ３０がゲームプログラムの一部を安全に実行するために踏むステップを表しており、命令及び／又はデータの１つのページを要求することから始まる（ステップＳ１）。
【００５１】
実現の容易さのため、プログラムデータを個別的に圧縮されたデータセットに編成してよく、プロセッサ２０はある圧縮データセットを指すポインタを指定することによって、あるいは最後にデコードされたページに基づき限定されたページの組より１つのページを単に選択することによって、１つのページを要求する。セキュリティを高めるため、各データセットをプログラムの暗号化時に割り当てられたランダムＩＤにより確認してもよい。
【００５２】
あるページに対する要求はバス１４を介してバスユニット５０へ送られ、バスユニット５０はその要求が適切であるか演算ユニット７２に問い合わせる（ステップＳ２）。演算ユニット７２は、分岐テーブルを保持しているので、どの命令がプロセッサ２０により要求されるべきか否かを容易に判断できる。この機能によって、模倣者がプログラム全体をクリアプログラムとしてアセンブルできるようするため、プロセッサ２０を既知の順序でプログラムのそれぞれの、かつ、すべてのブロックを要求するように制御することができないようにする。要求が適切でないときには、演算ユニット７２はプロセッサ２０を停止させる（ステップＳ３）。また、演算ユニット７２が他にいくつかの働きをしてもよい。キー値を消去したり、ＲＯＭ３２を消去したり、データを時間とともに劣化させたり、あるいは、それ以上の解析を挫折させるための他のステップ等である。実施例によっては、演算ユニット７２は検出された攻撃に対し、模倣者がゲームプログラムのフローの推定に成功したならば、その推定したフローが制限されるようプログラムのフローを変更することで応酬する。例えば、演算ユニット７２はプログラムフローをゲームのほんの初めの数段階に制限してしまう。
【００５３】
要求が適切であるときには、該当ページがＲＯＭ３２から取り出される（ステップＳ４）。これを行うために、要求はバスユニット５０により処理されてトランスレータ５２へ送られる。プロセッサ２０により用いられるアドレスとＲＯＭ３２をアクセスするために用いられるアドレスが同一である場合には、トランスレータ５２は不要である。表１及び表２から分かるように、これらアドレスは必ずしも一致しない。暗号化によりデータのアドレスが変わるときにも、アドレスの変換が必要である。要求されたページが格納されているＲＯＭ３２のアドレスが決まったならば、そのアドレスはバス５４によりＲＯＭ３２又はキャッシュ６０へ出力される。どちらにアドレスが出力された場合でも、要求されたデータが復号化器６２に入力される。この返されたデータはプログラム命令かデータオブジェクトであろう。そのデータがプログラム命令ならば、分岐テーブルの対応したエントリーが、チッェックサム及びタイミング情報が使われるときにはそれとともに、該データに付加される。
【００５４】
復号化器６２は、キーレジスタ６４から与えられるキー値を用いてデータを復号化する。復号化器６２は暗号化器１０８の逆装置であり、そのキー値はキーレジスタ１１０に格納されているキー値と等しいか、またはその逆数であり、そのいずれであるかは採用される暗号化の種類による。復号化されたデータは次に伸長器６８により伸長される。これらのエレメントの目的とするところは、図３に示したデータブロック１１４，１１６，１１８，１２０のデータのセクションを復元することである。このデータは次に、保護プログラム（クリアＲＯＭデータ）と秘密データ（分岐テーブル、チェックサム、タイミングデータ）とに分けられる。この保護プログラムはバスユニット５０を経てプロセッサ２０へ戻され、秘密データは演算ユニット７２へ渡される。演算ユニット７２は、このデータをプライベートテーブル７４に格納する（ステップＳ５）。バスユニット５０はクリアプログラムである保護プログラムページをプロセッサ２０へ送る（ステップＳ６）。前述のように、この保護プログラムページだけでは模倣者はゲームプログラムの動作を複製できない。
【００５５】
プロセッサ２０はプログラムデータの１つのページを得たならば、当該ページ中の命令を取出す（ステップＳ７）。プロセッサ２０は、命令を実行する前に、それが分岐命令であるかチェックする（ステップＳ８）。分岐命令でなければ、プロセッサ２０はその命令を実行し（ステップＳ９）、ページ中にさらに命令があるかチェックする（ステップＳ１０）。ほかに命令があるならばプロセッサ２０は次の命令を取り出すが（ステップＳ７へ戻る）、ほかに命令がなければ、プロセッサ２０はＲＯＭ３２に次のページを要求する（ステップＳ１へ戻る）。
【００５６】
他方、命令が分岐命令であるときには、プロセッサ２０はそれを処理しないので、分岐要求がセキュリティチップ３０へ送られる（ステップＳ１１）。この分岐要求が不適切であるとステップＳ１２で判定されたときには、演算ユニット７２はプロセッサ２０を停止させる（ステップＳ１３）。要求が適切であるためには、その要求が予期されていなければならず、予期された時に発生しなければならず、またバスチェックサムが正しくなければならない。適切な分岐要求に対するセキュリティチップ３０の応答は、プロセッサ２０が分岐すべき先のアドレスである。勿論、条件付き分岐の場合、プロセッサ２０は１つ又は複数の引数をセキュリティチップ３０へ渡す必要があるであろうし、セキュリティチップ３０は真アドレスと偽アドレスのいずれかを計算して返すであろう（ステップＳ１４）。次に、セキュリティチップ３０はそのアドレスをプロセッサ２０へ渡し（ステップＳ１５）、プロセッサ２０はそのアドレスへジャンプし（ステップＳ１６）、そのアドレスから命令を取り出す（ステップＳ７へループバックする）。このように、プロセッサ２０にはどんな種類の分岐であるか、可能な分岐アドレスが何であるかは全く知らされずに、分岐のためのアドレスが与えられる。
【００５７】
演算ユニット７２は分岐要求の処理と、分岐要求が適切であるか否かの評価の両方に利用される。これをするために、演算ユニット７２はプライベートテーブル７４の一部として格納されるプライベート分岐テーブルを利用する。この分岐テーブルは分岐全部を格納する必要はなく、やがて発生する分岐を格納するだけでよい。この分岐テーブルの分岐エントリー毎に、次に述べるフィールドが保持される。
【００５８】
ＴＹＰＥ  −  分岐の種類で、次の中から選ばれる：
１）無条件ジャンプ
２）条件付きジャンプ
３）サブルーチンコール
４）サブルーチンリターン
ＣＯＮＤＩＴＩＯＮ  −  条件付きジャンプと共に用いられるだけであり、テストさ
れる条件を指示する。
ＡＤＤＲＥＳＳ  １  −  無条件ジャンプと真条件の無条件ジャンプの場合にはジャ
ンプ先のアドレスであり、コールの場合には呼び出されるアドレスであり
、リターンの場合には使用されない。
ＡＤＤＲＥＳＳ  ２  −  無条件ジャンプには使用されない。偽条件の条件付きジャ
ンプの場合にはジャンプ先アドリスである。コールの場合にはリターンア
ドレスであり、スタックにセーブされる。リターンの場合には利用されな
い。
【００５９】
実施例によっては、プロセッサ２０はやがて発生する分岐のための分岐テーブルのインデックスを指定もしないし、全く知らされもしない。そのような実施例においては、分岐テーブルは現在の分岐の後にどの分岐インデックスが続くべきかを記録している。勿論、次の分岐はどの分岐が起こっているかに応じて決まるので、そのような実施例においては、その情報が次に述べる２つのフィールドに格納される。
【００６０】
ＮＥＸＴ  ＢＲＡＮＣＨ  １  −  プログラムコード中のＡＤＤＲＥＳＳ  １の後の
最初の分岐のインデックスを示す。
ＮＥＸＴ  ＢＲＡＮＣＨ  ２  −  プログラムコード中のＡＤＤＲＥＳＳ  ２の後の
最初の分岐のインデックスを示す。
ＣＨＥＣＫＳＵＭ  −  分岐前の全てのプログラムコードに対し期待されるチェック
サムである。
ＥＸＥＣＵＴＩＯＮ  ＴＩＭＥ  −  前の分岐から次の分岐までの期待される実行時
間である。
ＰＡＳＳＷＯＲＤ  −  現在の分岐を実行するために必要とされるパスワードである
。
【００６１】
ＴＹＰＥフィールドは分岐の種類を指示し、したがって他のどのフィールドが利用されるかをも指示する。例えば、無条件分岐（例えば“goto５”）のためのエントリーは、条件も偽条件アドレスも含む必要がない。勿論、システムによっては、条件コールや条件付きリターンのような他の分岐も可能である。高度なセキュリティシステムでは、ＮＯＰ分岐もセキュアプログラムに含めてもよい。
【００６２】
ＣＯＮＤＩＴＩＯＮフィールドは、変数と定数の比較のためにオペランドと定数で表現してよく（例えば”branch  if(i>=10)”）、変数と変数の比較のためにオペランドだけで表現してよい（例えば”branch  if(x<y)”）。比較のために変数が必要な場合、その変数はプロセッサ２０により分岐要求の一部としてセキュリティチップ３０へ渡される。プロセッサ２０は、どの条件が適用されようとしているかについて通知される必要はなく、引数としてどの変数をいくつ渡すべきかを知らされるだけでよい。一実施例では、ＴＹＰＥフィールドはどの種類の条件フィールドが使用されるかを指示し、ＶＡＬＵＥフィールドは１が使用される場合に定数値を指示する。
【００６３】
ＡＤＤＲＥＳＳ１とＡＤＤＲＥＳＳ２のフィールドは、現在要求されている分岐のための次のアドレスを与える。条件付き分岐の場合、条件が真ならばＡＤＤＲＥＳＳ１が与えられ、さもなければＡＤＤＲＥＳＳ２が与えられる。無条件分岐の場合、ＡＤＤＲＥＳＳ２は使われない。コールの場合、ＡＤＤＲＥＳＳ１はコールされるアドレスでプロセッサ２０へ与えられ、一方、ＡＤＤＲＥＳＳ２はコールの次の命令のアドレス（すなわちリターンアドレス）である。そのＡＤＤＲＥＳＳ２の値はスタックに置かれ、後に対応したリターン分岐に用いられる。リターンの場合、どのアドレスフィールドも用いられない。リターンアドレスはスタックより与えられるからである。
【００６４】
表２は、プロセッサ２０のようなプロセッサにより実行されることを意図した保護プログラムを示す。プロセッサは、分岐要求（クリアプログラムの分岐に代わるもの）に到達すると、分岐要求を出し、分岐要求のインデックスを条件の評価のために必要な引数と一緒にセキュリティチップへ渡す。例えば、表２のアドレス４で、ある特定の分岐インデックスの分岐要求が出される。命令”br_req  1”は、分岐テーブルのエントリー１が用いられるべきであることを知らせる。しかし、確信犯的模倣者の中には、分岐要求のインデックスを分岐情報を抽出するために利用する者がいるかもしれない。例えば、そのような模倣者は、”br_req1”命令を十分追跡することにより、この命令がリターン命令に相当することを確認できるかもしれない。次々にインデックス付けされた分岐要求を解析することにより、各分岐の種類と条件を確認することができる。
【００６５】
この種の解析をさらに困難にするため、命令中のインデックスを除くことができる。命令”br_req1”と命令”br_req2”をプロセッサに利用できるようにするのではなく、これら命令は両方ともただ”br_req”として知らされる。索引情報はＮＥＸＴ  ＢＲＡＮＣＨ  １フィールドとＮＥＸＴ  ＢＲＡＮＣＨ  ２フィールドに格納される。全ての分岐が演算ユニット７２により制御されるから、現在の分岐のアドレスの次の分岐要求は分かっているため容易に格納される。ＮＥＸＴ  ＢＲＡＮＣＨ  1フィールドは、ＡＤＤＲＥＳＳ  ２が発生した分岐の時に次の分岐のためのインデックスを含む。コールの場合、ＡＤＤＲＥＳＳ  １はコールされるサブルーチンの先頭であり、ＡＤＤＲＥＳＳ  ２はコール命令の次の命令のアドレスである。したがって、ＮＥＸＴ  ＢＲＡＮＣＨ  １はサブルーチン中の最初の分岐のインデックスであり、ＮＥＸＴ  ＢＲＡＮＣＨ  ２はＡＤＤＲＥＳＳ  ２アドレスの次の最初の分岐のインデックスである。コールの場合、ＡＤＤＲＥＳＳ  ２とＮＥＸＴ  ＡＤＤＲＥＳＳ  ２は、演算ユニット７２内のスタックにプッシュされる。
【００６６】
ＣＨＥＣＫ  ＳＵＭ，ＥＸＥＣＵＴＩＯＮ  ＴＩＭＥ及びＰＡＳＳＷＡＲＤのフィールドは、それらが用いられる場合には、分岐要求が許可されるか否かを判断するために用いられる。分岐の後で、バスタップからのバス情報が演算ユニット７２へ送られ、演算ユニット７２は分岐が見つかるまでバスデータのチェックサムをとる。その結果得られたチッェクサムは、格納されているＣＨＥＣＫＳＵＭと比較される。これらチェックサムが相違する場合、演算ユニット７２はゲームをそれ以上進行させない処置をする。チェックサムを、プロセッサバス上の全てのトラフィック（当然、変数データは除く）に対して適用できる。
【００６７】
同様に、リアルタイムクロック７６を利用して分岐と分岐の間の時間が記録され、その時間はＥＸＥＣＵＴＩＯＮ  ＴＩＭＥ値と比較される。途中に入り込む分岐はなく、分岐と分岐の間の命令数は分かっているので、プロセッサのクロックレートが分かっていれば期待される時間の長さは容易に決まる。また、別のリアルタイムクロックは必要でない。ＰＲＮＧが復号化プロセスの一部として利用されるときには、ＰＲＮＧを、それが利用されるか否かにかかわらず、各命令サイクルをクロックするように設定してよい。そのようにすれば、余分な命令が入り込むと、ＰＲＮＧはデータと同期しなくなりデータを壊すことになろう。
【００６８】
格別に注意を要する分岐については、ＰＡＳＳＷＯＲＤ値を割り当ててよく、この場合にはプロセッサは、その分岐を発生させるためにはパスワードを与えなければならない。ＰＡＳＳＷＯＲＤ値は、プロセッサの状態とローカルメモリの記憶内容との既知の組合せから計算してもよい。
【００６９】
分岐処理をセキュリティチップに依存すると、プロセッサがクリアプログラムを処理する場合より時間がかかるかもしれない。コードの実行が時間的に厳しい場合、プログラムコードの選択したセクションに関する保護を働かなくさせてもよく、そうするとプロセッサ自体で分岐処理を行う。また、処理時間を減らすため、時間的に厳しいプログラムコードのために必要な処理の部分をセキュリティチップに実行させてもよい。
【００７０】
図６は上記ルールを実現するために用いられる、演算ユニット７２の一部たる分岐ユニット５００を示す。分岐ユニット５００は分岐テーブル５０２から一つのエントリーを、バスタップ５０４からデータを、ＤＡＴＡ
ＩＮバス５０６から引数を受け取り、これら入力に基づき、不適切な分岐が要求されたことを示すエラー信号又は適切に要求された分岐のアドレスを出力する。ある実施例では分岐アドレスはプロセッサ２０へ渡されるが、別の実施例では分岐アドレスはプロセッサ２０にどの命令が与えられるかを制御するために用いられ、それら命令のためのアドレスはプロセッサには全く知らせない。
【００７１】
分岐ユニット５００の動作は以下のとおりである。分岐テーブル５０２のあるエントリーが選択されると、ＶＡＬＵＥ，ＴＹＰＥ，ＣＨＥＣＫＳＵＭ，ＰＡＳＳＷＯＲＤ，ＴＩＭＩＮＧ，ＡＤＤＲＥＳＳ  １，ＡＤＤＲＥＳＳ  ２，ＮＥＸＴ  １，ＮＥＸＴ  ２のフィールドが出力される。ＶＡＬＵＥフィールドは定数と比較する条件付きジャンプに関する定数であり、減算器５０８の一方の入力となる。減算器５０８の他方の入力は、ＤＡＴＡ
ＩＮバスの最後の内容を保持するレジスタ５１０より与えられる。減算器５０８は可変引数と定数との比較の結果を出力し、場合によっては、一方の入力が他方の入力と比べ大きいか、等しいか、又は小さいかを示すだけである。減算器５１２は同様に、レジスタ５１２の出力と、それに接続されたもう一つのレジスタ５１４の出力とを比較する。これら両減算器の出力はコントロール部５１６へ与えられる。
【００７２】
コントロール部５１６は、エラー信号を出力すべきか否かを判断し、また２つのマルチプレクサ（ＭＵＸ）５１８，５２０を制御する。ＭＵＸ５１８の出力は分岐アドレスであり、これはＡＤＤＲＥＳＳ  １，ＡＤＤＲＥＳＳ  ２，スタック５２２より与えられるスタックトップ値のいずれか一つより選ばれる。ＭＵＸ５２０の出力は、ＮＥＸＴ  1，ＮＥＸＴ  ２，初期値，スタックトップ値の中の一つである。ＭＵＸ５２０の出力は、次の分岐のためのインデックスを示し、分岐テーブル５０２へインデックス入力としてフィードバックされる。初期値は、ＰＥＮＤＩＮＧ線を適切に初期化するために分岐連鎖中の最初の分岐を指すポインタである。
【００７３】
コントロール部５１６は、その入力に基づき、上に指摘したようにＭＵＸのどの出力が有効であるか決定する。すなわち、分岐ＴＹＰＥが無条件ジャンプ、コール、又は真条件の条件付きジャンプである時にはＡＤＤＲＥＳＳ  １が選択される。偽条件の条件付きジャンプの時にＡＤＤＲＥＳＳ  ２が選択され、リターン分岐の時にスタックトップが選択される。コールの場合、ＡＤＤＲＥＳＳ  ２はスタックにプッシュされ、次のリターンに用いられる。
【００７４】
コントロール部５１６はまた、ＭＵＸ５２０のどの出力が有効であるか決定する。すなわち、分岐ＴＹＰＥが無条件ジャンプ、コール、又は真条件の条件付きジャンプの時には、ＮＥＸＴ  １が選択されてＰＥＮＤＩＮＧ線に与えられる。偽条件の条件ジャンプの時にはＮＥＸＴ
２が選択され、リターン分岐の時にはスタックトップが選択される。
【００７５】
コントロール部５１６は、分岐テーブル５０２から与えられたＣＨＥＣＫＳＵＭ値が、チェックサムロジック５２４がバスタップ５０４より与えられた時に計算したものと一致しない場合、リアルタイムクロック７６をモニタすることによって得られた実行時間がＥＸＥＣＵＴＩＯＮ  ＴＩＭＥ（ＴＩＭＩＮＧ）フィールドにより指定された所期の実行時間と一致しない場合、又は、プロセッサ２０により与えられたパスワードがＰＡＳＳＷＯＲＤフィールドと一致しない場合に、エラー信号を出力する。
【００７６】
図７はスクランブラー１０６を詳しく示す。スクランブラー１０６はデマルチプレクサ（ＤＥＭＵＸ）６０２、ＭＵＸ６０４、疑似乱数発生器（ＰＲＮＧ）６０６、いくつかのバッファ６０８からなる。３つのバッファ６０８Ａ，６０８Ｂ，６０８Ｃが示されているが、バッファの数は３個に限らない。スクランブラー１０６の入力データストリームに対する働きは、入力データストリームのビット、バイト、ワード又はブロックの順序を決定論的かつ可逆的方法により並べ替えることである。
【００７７】
この並べ替えを行うために、ＤＥＭＵＸ６０２は、その入力のデータエレメント（ビット、バイト、ワード又はブロック）を、その出力中の現在の疑似乱数により決まる１つの出力に送る。現在の疑似乱数が変わると、エレメントが送られ出力が変わる。ＭＵＸ６０４はバッファにより出力された別々のエレメントストリームをまとめて１つのストリームにする。バッファ６０８の構成により、これらエレメントがＤＥＭＵＸ６０２とＭＵＸ６０４の間を移動するのに必要な時間が異なるため、これらエレメントは並べ替えられる。各バッファ６０８は、ヘッドとテールを交替する先入れ先出し（ＦＩＦＯ）バッファであるか、あるいは、後入れ先出し（ＬＩＦＯ）バッファとしてヘッドとテールを交替するＦＩＦＯバッファである。前者の場合には、あるバッファ６０８へ左から一つのエレメントがシフトインされる度に、そのバッファの右側から一つのエレメントがＭＵＸ６０４へ出力され、バッファへ右側から一つのエレメントがシフトインされる度に、左側から一つのエレメントが出力される。後者の場合には、エレメントはバッファに両側から入れられるが、それらエレメントが出力されるのは右端からである。エレメントがバッファ６０８のどちら側の端よりシフトインされるかは、ＰＲＮＧ６０６により出力される値によって制御される。
【００７８】
このように、疑似乱数シーケンスが分かれば、並べ替えのパターンの発見し、それをリバースすることが可能であろう。疑似乱数シーケンスを発見するためには、キー値（図２のキーレジスタ６４又は図３のキーレジスタ１１０に格納されている）が分からなければならない。なぜなら、そのキー値はＰＲＮＧ６０６の種として働くからである。勿論、ハードウエアが割高な場合には、スクランブラー１０６が伸長器の部分を利用してもよいし、あるいは内部の伸長テーブル、例えば確率予測テーブルやＲ−コードテーブルのスクランブル又は変更のためにキー値を用いてもよい。
【００７９】
ハードウエアロジックが特に割高な場合には、図８に示す疑似乱数発生器（ＰＲＮＧ）７００を用いるとよい。ＰＲＮＧ７００に必要なものは一つのキーシフトレジスタ７０２、一つの最大長シーケンス（ＭＬＳ）シフトレジスタ７０４、２つのＭＵＸ７０６，７０８、それに一つのＸＯＲゲート７１０だけである。ＰＲＮＧ７００に対する入力は、キークロック７１２、ＭＬＳクロック７１４、ＫＥＹ
ＩＮシリアル入力、ＫＥＹ ＬＯＡＤ信号及びＩＮＩＴ／ＲＵＮ信号により与えられる。キーシフトレジスタ７０２は、一旦ロードされればキーレジスタ６４又は１１０として利用でき、無停電電源７１６により給電される。
【００８０】
キーシフトレジスタ７０２の入力はＭＵＸ７０６の出力であるが、これはキーシフトレジスタ７０２のループバックされた出力であるかＫＥＹ  ＩＮ入力のいずれかであり、そのどちらであるかは、ＭＵＸ７０６のセレクト入力のＫＥＹ  ＬＯＡＤ信号が付勢されたか否かにより決まることが図８から分かる。ＭＬＳシフトレジスタ７０４の入力はＭＵＸ７０８の出力であるが、これはキーシフトレジスタ７０２の出力であるかＸＯＲゲート７１０の出力であり、そのいずれであるかは、ＭＵＸ７０８のセレクト入力のＩＮＩＴ／ＲＵＮ信号がＩＮＩＴであるかＲＵＮであるかにより決まることも図８から分かる。ＸＯＲゲート７１０の入力は、ＭＬＳシフトレジスタ７０４の出力とＭＬＳシフトレジスタ７０４の最終段以外の段からのタップである。使用されるタップとＭＬＳシフトレジスタの段数によって、得られる疑似乱数シーケンスの長さが決まる。シーケンス長とタップ点の例については、Ｋnuth，Ｄ．Ｅ.，Ｔhe  Ａrt  of  Ｃomputer  Ｐrogram，２ｄ．ｅｄ.，pp．２７−２９とそのＴable１を参照されたい。一実施例では、ＭＬＳシフトレジスタ７０４の段数は９８であり、キー値のビット数は９８である。ただし、これ以外の長さ及びタップでも同じように動作する。勿論、キー値のビット数は模倣者がその値を簡単には推測できないよう十分大きくすべきである。９８段のＭＬＳシフトレジスタが送出するビットシーケンスは、２98−１ビット毎に繰り返すだけである。このような多段数の場合、シフトレジスタは最大長である必要はない。レジスタを最大長にしないことの一つの利点は、最大長のシフトレジスタのためのタップのセットは当該分野で知られているので、非最大長のシフトレジスタの方がリバースエンジニアにとって面倒であろうという点である。
【００８１】
ＫＥＹ  ＬＯＡＤ信号を付勢し、ＫＥＹ  ＩＮ入力にキーを与え、キー値がロードされるまでキークロック７１２をクロッキングすることにより、キー値がキーシフトレジスタ７０２に初期ロードされる。キー値がロードされたならばＫＥＹ  ＬＯＡＤ信号は消勢されるため、キークロック７１２のクロッキングによりキーシフトレジスタ７０２内のキー値が循環させられるだけである。ＫＥＹ  ＬＯＡＤ信号は消勢したままにすべきであるが、これはリーディング”１”ビットをキーの前に置くことにより行ってもよい。この場合、当該ビットはキーシフトレジスタ７０２の出力に達した時にフリップフロップ（不図示）をセットするために使われる。このフリップフロップによって、ＫＥＹ  ＬＯＡＤ信号が付勢され、また無停電電源７１６により給電されてよいか否かが制御されるであろう。
【００８２】
キー値は、それを読み出すためにキーシフトレジスタ内で循環させられる。ＩＮＩＴ／ＲＵＮ信号がＩＮＩＴに設定された時に、キー値は、キークロック７１４と一緒に刻時するＭＬＳクロック７１４によってクロッキングされてＭＬＳシフトレジスタ７０４に入力される。ＭＬＳシフトレジスタ７０４は、ロードされると、その内容を循環させるが、同内容はＸＯＲゲート７１０により変更され、当該技術分野において知られているように疑似乱数の最大長シーケンスを生成する。このシーケンスの疑似乱数はＭＬＳシフトレジスタ７０４より並列に読み出すことができる。今述べたような低コストのＰＲＮＧによれば、多重キーの実現が容易になる。
【００８３】
要約すると、プログラムを走らせるために必要なハードウエア及び／又はソフトウエアのエンドユーザ部分にしかアクセスできない模倣者によるプログラムデータのコピーを防止するためのシステムについて以上に論じた。それら例は、ゲームカートリッジで提供されてゲーム機で利用されるゲームプログラムのプロテクトに関する特別な用途に関するものであったが、それ以外の用途についても述べた。さらに、プログラムが主としてソフトウエアとして与えられる場合でも、わずかなハードウエアコンポーネントが提供されさえすれば、本発明は利用可能である。しかし、本発明の従来技術より優れている点は、プログラムデータがセキュリティチップにより復号化されるまでは暗号化されたままであり、そしてまた、プロセッサに与えられるのはプログラムデータ全体の一部でしかない、すなわちユーザによって与えられた特定の入力セットに対しフローが決まるプログラムの具体的動作例を実行するためのプログラムコードしか利用可能にならない、ということである。プロセッサに与えられなかったデータは、そのプログラムデータをプロセッサが要求するのに適切なタイミングであると分かった時点でだけプロセッサに与えられるか、あるいは全く与えられない。後者の場合、セキュリティチップが、プログラムデータ全部を与えられたならばプロセッサによりなされるであろう動作を実行する。一実施例では、セキュリティタップに保有される情報は分岐情報である。したがって、プロセッサが分岐命令に出会った時には、セキュリティチップの支援がないとその命令を完了できない。
【００８４】
また以上の記述において、セキュリティチップの内部構造及び動作、暗号化プログラムデータを生成するためのシステム、通常動作中及び模倣者からの攻撃にさらされた動作中におけるセキュリティチップとプロセッサとの相互動作、並びに格納されたキー値に基づいた低コストの疑似乱数発生器について説明した。
【００８５】
しかし、以上に述べたことは説明のためのものであって、限定することを意図したものではない。ここに開示する内容を検討すれば、当業者には本発明の多くの変形が明らかになろう。一例にすぎないが、以上の説明において、ビデオゲームを違法な複製と使用から保護する本発明の実施例を述べたが、ここに開示したことから本発明のゲーム以外への応用は理解されよう。その他の変形を以下に述べる。
【００８６】
本発明によるビデオゲームのある実施例においては、プレーヤーが残した”生命”数と、プレーヤーが次の段階へ進むまでの残時間の長さをセキュリティチップが監視する。セキュリティチップは、プログラムデータを一度に１レベルずつ復号化するので、最初はゲームの第１レベルのためのプログラムデータしか復号化しない。プログラムデータは初期値を含んでいるが、これらの初期値はセキュリティチップの外部に明示されることは決してないもので、当該レベルのためのタイマーを設定するために用いられる。プレイヤーがゲームをプレイしている時に、プログラムは一定の事象が生じたことをセキュリティチップに知らせる。プロセッサからの情報が期待通りであれば、ゲームは正常にプレイされる。しかし、その情報が期待通りでない場合には、タイマーに時間が加算されるか、又は
”生命”が除かれる。タイマーの時間が増えると、プレイヤーは次のレベルへ達するために待たなければならない時間が増加する。この時間が、プログラムが意図したところと異なった動作をすることによりしばしば十分に増加すると、タイマーは決して時間切れにならないので、プレイヤーは第１レベルにいつづけることになる。この方法がセキュリティチップで単にプロセッサを遮断する方法に比べて有利な点は、プログラムのどこでセキュリティチップが最初に問題を検出したかはっきりしないことである。
【００８７】
前者の方法は、有利な点がないわけではない。プロセッサが誤り許容（fault-tolernat）システムの一部であるときには、それが模倣者の攻撃を受けやすいか否かにかかわらず、プロセッサが誤りを起こした後にそのプロセッサに動作を続けさせないための手段としてセキュリティチップを利用できる。同じセキュリティチップを、不適切な実行が検知された時にプロセッサを停止させあるいは警告を発生させるために用いることができるが、その予期しない動作がハードウエア又はソフトウエアにより引き起こされ、模倣者が故意に行ったことが原因ではないことが前提である。
【００８８】
ゲーム以外への利用例として、プロセッサは画像処理を行うかもしれない。画像処理では、たたみ込みが必要となろう。たたみ込みは多数の乗算と一つの加算の連続として行われる。セキュリティチップは、プロセッサのデータバスをモニターできるので、乗算結果がバス上に現れた時に加算を実行することができる。その和が必要な時には、プロセッサはそれをセキュリティチップに要求する。セキュリティチップなしでプロセッサを動作させると、たたみ込みを間違うか、あるいは、プロセッサ自体で累積を行わなければならないためプロセッサの動作が遅くなるであろう。
【００８９】
プログラムデータが圧縮される場合には、伸長器のエレメントを復号化処理に利用してもよい。例えば、図７は伸長器のバッファを用いて構成し得るデータスクランブラーを示す。また、伸長器がエントロピーエンコーダーの場合、セキュリティチップはキー値を伸長処理のための初期パラメータ、例えば初期確率値を生成するために利用してよい。こうすると、エントロピーコーダーのスタート時、ビットそのものから確率を推定できるだけのビットが得られる前に起きやすい１対１変換を防ぐというもう一つの利点が得られる。
【００９０】
セキュリティチップは、セキュリティ侵害を検出した時にプロセッサを停止させるにおよばない。他の選択肢は、ランダムな時間だけ遅延させた後にプロセッサをリセットすること、疑似乱数をデコードデータとして出力すること、あるいは、ＰＲＮＧが出力中のデータを徐々に低下させるようにコンプリメントイネーブリング（complement  enabling）または他の方法によりＰＲＮＧを調整することである。
【図面の簡単な説明】
【００９１】
【図１】プラグインバスによりプロセッサに接続された、セキュリティチップを含むカートリッジ上に、プログラムデータが格納される本発明のコンピュータシステムのブロック図である。
【図２】セキュリティチップの詳細ブロック図である。
【図３】カートリッジに用いられる暗号化メモリ上にプログラムを暗号化するためのシステムのブロック図である。
【図４】プロセッサによるプログラム実行のフローチャートである。
【図５】図４のフローチャートの続きを示すフローチャートである。
【図６】分岐ユニットのブロック図である。
【図７】データストリームスクランブラーのブロック図である。
【図８】疑似乱数発生器のブロック図である。
【図９】クリアプログラムの例のリスト（Ａ）を示す図である。
【図１０】図９のリスト（Ａ）の続きを示す図である。
【図１１】図１０のリスト（Ａ）の続きを示す図である。
【図１２】図１１のリスト（Ａ）の続きを示す図である。
【図１３】図１２のリスト（Ａ）の続きを示す図である。
【図１４】保護プログラムのリスト（Ｂ）を示す図である。
【図１５】図１４のリスト（Ｂ）の続きを示す図である。
【図１６】図１５のリスト（Ｂ）の続きを示す図である。
【図１７】図１６のリスト（Ｂ）の続きを示す図である。
【図１８】図１７のリスト（Ｂ）の続きを示す図である。
【図１９】図１８のリスト（Ｂ）の続きを示す図である。
【図２０】図１９のリスト（Ｂ）の続きを示す図である。
【図２１】図２０のリスト（Ｂ）の続きを示す図である。
【図２２】分岐テーブルを示す図である。
【図２３】分岐セパレータを実現するプログラムのリスト（Ｄ）を示す図である。
【図２４】図２３のリスト（Ｄ）の続きを示す図である。
【図２５】図２４のリスト（Ｄ）の続きを示す図である。
【図２６】疑似乱数発生器をテストするプログラムのリストを示す図である。
【符号の説明】
【００９２】
１０      ゲーム機
１２      ゲームカートリッジ
１４      バス
１６      ビデオディスプレイ
１８      入力装置
２０      プロセッサ
２２      ローカルメモリ
２４      回路クロック
３０      セキュリティチップ
３２      ＲＯＭ
４０      解析・制御ツール
４１      タップ
４２      タップ
４３      タップ
４４      タップ
４５      タップ
４６      タップ
５０      バスユニット
５２      トランスレータ
５４      アドレスバス
５６      データバス
６０      キャッシュ
６２      復号化器
６４      キーレジスタ
６８      伸長器
７０      ルーター
７２      演算ユニット
７４      セキュリティテーブル
７６      リアルタイムクロック
１０２    分岐セパレータ
１０４    圧縮器
１０８    暗号化器
１１０    キーレジスタ
１１２    ゲームプログラム
１１４    保護プログラム
１１６    分岐テーブル
１１８    チェックサムデータ
１２０    タイミングデータ
５００    分岐ユニット
５０２    分岐テーブル
５０４    バスタップ
５０６    ＤＡＴＡ  ＩＮバス
５０８    減算器
５１０    レジスタ
５１２    減算器
５１４    レジスタ
５１６    コントロール部
５１８    マルチプレクサ（ＭＵＸ）
５２０    マルチプレクサ（ＭＵＸ）
５２２    スタック
５２４    チェックサムロジック
６０２    デマルチプレクサ（ＤＥＭＵＸ）
６０４    マルチプレクサ（ＭＵＸ）
６０６    疑似乱数発生器（ＰＲＮＧ）
６０８Ａ，Ｂ，Ｃ  バッファ
７００    疑似乱数発生器（ＰＲＮＧ）
７０２    キーシフトレジスタ
７０４    最大長シーケンス（ＭＬＳ）シフトレジスタ
７０６    マルチプレクサ（ＭＵＸ）
７０８    マルチプレクサ（ＭＵＸ）
７１０    ＸＯＲゲート
７１２    キークロック
７１４    ＭＳＬクロック
７１６    無停電電源
【図１】
2005166070.tif 000006
【図２】
2005166070.tif 000007
【図３】
2005166070.tif 000008
【図４】
2005166070.tif 000009
【図５】
2005166070.tif 000010
【図６】
2005166070.tif 000011
【図７】
2005166070.tif 000012
【図８】
2005166070.tif 000013
【図９】
2005166070.tif 000014
【図１０】
2005166070.tif 000015
【図１１】
2005166070.tif 000016
【図１２】
2005166070.tif 000017
【図１３】
2005166070.tif 000018
【図１４】
2005166070.tif 000019
【図１５】
2005166070.tif 000020
【図１６】
2005166070.tif 000021
【図１７】
2005166070.tif 000022
【図１８】
2005166070.tif 000023
【図１９】
2005166070.tif 000024
【図２０】
2005166070.tif 000025
【図２１】
2005166070.tif 000026
【図２２】
2005166070.tif 000027
【図２３】
2005166070.tif 000028
【図２４】
2005166070.tif 000029
【図２５】
2005166070.tif 000030
【図２６】
2005166070.tif 000031