(57)【要約】【課題】ソフトウェアの解析・改竄を防ぐことができる実行システムを提供する。【解決手段】実行システムは、プログラムが起動された場合に、そのプログラムに対して訂正符号によって訂正できる範囲を限度とした誤りを発生させて、メインメモリ上に配置するローダと、その誤りを訂正しながら実行するプロセッサを備える。【選択図】  図１
2004362077.tif 000002
【特許請求の範囲】
【請求項１】
データ変換システムであって、
秘匿を所望されるデータを取得するデータ取得手段と、
取得された前記データに対して、誤りを発生させるという変換を行う誤り発生手段と、
前記誤り発生手段による変換後のデータを出力するデータ出力手段とを備え、
前記誤り発生手段は、前記変換後のデータと誤り訂正符号とに基づいて訂正できる範囲を限度とした誤りを発生させる
ことを特徴とするデータ変換システム。
【請求項２】
前記データ取得手段は更に、少なくとも、データブロック長とデータブロックに発生させる誤りの許容上限となるビット数とを示す誤り発生情報を取得し、
前記誤り発生手段は、前記データブロック長の範囲毎のデータに対し、前記ビット数以下のビットの値を変化させることにより、前記変換を行う
ことを特徴とする請求項１記載のデータ変換システム。
【請求項３】
前記データは、実行可能プログラムであり、
前記データ取得手段は、記録媒体から実行可能プログラムと前記誤り発生情報とを読み出して取得し、
前記変換後のデータは、データブロック単位に誤りを発生させた実行可能プログラムであり、
前記データ出力手段の出力先は、前記実行可能プログラムを実行するＣＰＵがアクセスするメインメモリである
ことを特徴とする請求項２記載のデータ変換システム。
【請求項４】
前記データ取得手段による前記取得と、前記誤り発生手段による前記変換と、前記データ出力手段による前記出力とは、前記実行可能プログラムの起動指示を受けた際に行われ、
データ変換システムは更に、
誤りが発生しているメインメモリ上の実行可能プログラムの誤りを訂正する為の誤り訂正符号を取得する手段と、
前記誤り訂正符号を参照し前記実行可能プログラムの誤りを訂正する誤り訂正手段と、
前記誤り訂正手段によって誤りが訂正された実行可能プログラムを実行するプログラム実行手段とを備える
ことを特徴とする請求項３記載のデータ変換システム。
【請求項５】
前記誤り発生手段は、前記実行可能プログラムの起動指示を受ける毎に、値を変化させる対象のビットの選択を前回の選択と異なるものとすることにより、前記変換を行う
ことを特徴とする請求項４記載のデータ変換システム。
【請求項６】
前記誤り発生手段は、実行可能プログラム中の命令コードに誤りを発生させる
ことを特徴とする請求項３〜５いずれか１項に記載のデータ変換システム。
【請求項７】
前記データ変換システムは更に、
前記データ取得手段によって取得されたデータに基づいて、前記誤り訂正符号を作成する誤り訂正符号作成手段と、
前記誤り訂正符号を出力する誤り訂正符号出力手段と、
少なくとも、データブロック長とデータブロックに発生させる誤りの許容上限となるビット数とを示す誤り発生情報を記憶する誤り発生情報記憶手段とを備え、
前記誤り発生手段は、前記データブロック長の範囲毎のデータに対し、前記ビット数以下のビットの値を変化させることにより、前記変換を行う
ことを特徴とする請求項１記載のデータ変換システム。
【請求項８】
前記データ変換システムは更に、
所定の条件と前記誤り発生情報との対応関係を記憶する手段と、
所定の条件のいずれかの条件に合致する状況を検出する手段と、
前記誤り発生情報記憶手段に記憶されている誤り発生情報を、検出された状況に合致する所定の条件に対応する誤り発生情報に変更する手段とを備える
ことを特徴とする請求項７記載のデータ変換システム。
【請求項９】
前記誤り発生情報は、前記データ取得手段によって取得されたデータの先頭からの相対アドレスを特定する為の誤り位置情報を含み、
前記誤り発生手段は、前記誤り位置情報で特定される位置に誤りを発生させる
ことを特徴とする請求項２〜８いずれか１項に記載のデータ変換システム。
【請求項１０】
誤りが発生している実行可能プログラムの誤りを訂正する為の誤り訂正符号を取得する手段と、
前記誤り訂正符号を参照し、実行可能プログラムの誤りを訂正する誤り訂正手段と、
前記誤り訂正手段によって誤りが訂正された実行可能プログラムを実行するプログラム実行手段とを備える
ことを特徴とするプログラム実行システム。
【請求項１１】
プログラム実行システムは更に、
実行可能プログラムの誤りの位置を検出する誤り検出手段を備える
ことを特徴とする請求項１０記載のプログラム実行システム。
【請求項１２】
前記誤り訂正手段は更に、
誤りが発生しているビットの位置又は値の情報を収集し、
前記収集した誤りを所定の処理に使用する
ことを特徴とする請求項１０又は１１記載のプログラム実行システム。
【請求項１３】
前記データ変換システムは更に、
外部からソースプログラムを取得するソースプログラム取得手段と、
前記ソースプログラム取得手段によって取得されたソースプログラムを翻訳して機械語コードを作成するコンパイル手段を備え、
前記データは前記機械語コードであり、
前記誤り発生手段は、前記機械語コードに対して誤りを発生させる変換を行い、
前記変換後のデータは、誤りを発生させた機械語コードである
ことを特徴とする請求項１記載のデータ変換システム。
【請求項１４】
秘匿を所望されるデータを取得するステップと、
取得された前記データに対して、誤りを発生させるという変換を行うステップと、
前記誤りを発生させるステップによる変換後のデータを出力するステップからなり、
前記誤りを発生させるステップでは、前記変換後のデータと誤り訂正符号とに基づいて訂正できる範囲を限度とした誤りを発生させる
ことを特徴とするデータ変換方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、悪意ある解析から実行可能プログラムやデータを保護する技術に関する。
【０００２】
【従来の技術】
従来から、コンピュータ上で実行されるソフトウェアに対しての解析・改竄による不正使用が問題となっている。例えば、パスワードを入力しなければ動作しないように作られているソフトウェアがあった場合に、このソフトウェアを解析しパスワードのチェックを行うコード部分を特定し、このチェックを無効にするような改竄を行えば、パスワードを入力することなしにそのソフトウェアを実行させることができる。また、暗号化されたデジタルコンテンツを視聴するためのソフトウェアには暗号を解くための暗号鍵を含んでいる場合があり、このソフトウェアが解析され暗号鍵が特定されたならば、デジタルコンテンツの不正コピーが可能となる。
【０００３】
このように、ソフトウェアを解析されると、ソフトウェアやデジタルコンテンツによるビジネスが成り立たなくなるという不都合がある。
そこで、耐タンパソフトウェア技術が考えられてきた。例えば、プログラムの構造等を複雑にしたり、プログラムを冗長化したりして、逆アセンブラなどでの解析を困難にするなどである。（非特許文献１参照）
【０００４】
【非特許文献１】
井上智博著「ザ・プロテクトＩＩプログラム解読法入門」秀和システムトレーディング、１
９８７年３月
【０００５】
【発明が解決しようとする課題】
しかし、これらはいずれもプログラミング時の工夫として実現されるものである。すなわち、どのように難読化技術が施されたソフトウェアであっても、実行される段階ではＣＰＵが理解可能な命令コードの列として表現され、メインメモリ上に展開されている。従って、解析者は、デバッガ等を用いてメモリを参照したり、メモリの内容を書き換えてプログラムの動作を追ったりと、何度も実行と解析を繰り返すことで、ソフトウェアを解析することが可能である。
【０００６】
そこで、本発明はかかる問題点に鑑みてなされたものであり、解析者がデバッガ等を用いてソフトウェアの解析を試みても、解析行為に要する時間が長時間となり、結果としてソフトウェアの解析・改竄を防ぐことができるデータ変換システムを提供することを目的とする。
【０００７】
【発明を解決するための手段】
上記課題を解決する為に、本発明のデータ変換システムは、秘匿を所望されるデータを取得するデータ取得手段と、取得された前記データに対して、誤りを発生させるという変換を行う誤り発生手段と、前記誤り発生手段による変換後のデータを出力するデータ出力手段とを備え、前記誤り発生手段は、前記変換後のデータと誤り訂正符号とに基づいて訂正できる範囲を限度とした誤りを発生させることを特徴とする。
【０００８】
【発明の実施の形態】
＜概要＞
通常、実行可能プログラムが起動された場合、そのプログラムはローダによってメインメモリ上に配置され、プロセッサにより実行される。この場合、メインメモリ上の実行可能プログラムは、解析に対し何の防御手段も施されてはいない為、いわゆる悪意ある解析に対しては無防備な状態にある。従って、デバッガ等を使用することによりプログラムは解析され、改竄される危険性が大きい。
【０００９】
本発明は、実行可能プログラムが起動された場合、ローダによってメインメモリに配置される実行可能プログラムに人為的に誤りを発生させ、悪意ある解析から保護しようとするものである。その人為的に発生させる誤りは、データ送信によって生じる誤り、いわゆるノイズと基本的に同じものである。
しかし、このノイズと本発明の誤りとはその発生過程において相違する。ノイズは、発生しないことが最良の結果であり、データ送信の過程で発生してしまう無用のものである。一方、本発明の誤りは、予め誤りを訂正するための訂正符号を作成しておき、その訂正符号によって訂正することが出来る範囲内の誤りを人為的に発生させるものである。すなわち、本来無用であるノイズを、訂正できることを前提に利用するものである。
【００１０】
従って、訂正符号をどのように作成するかによって、様々な形の誤りを発生させることができ、保護しようとするプログラムの重要度によって、発生させる誤りの量と発生場所を自在に変化させることが出来るという利点がある。
また、一定の範囲内でランダムに誤りを発生させればよいことから、プログラムをメインメモリに展開する毎にその誤りを変化させることが容易であり、解析者のトライ＆エラーを無駄にし、解析を困難にすることが出来るという利点がある。
【００１１】
以下、本発明の実施形態に係るシステムの概要について図１及び図２を用いて説明する。
図１は、本発明の実施形態１に係るシステム及びその機能ブロックの概略図である。
各システム及びデータ等については、以下の実施形態１及び実施形態２において詳細に説明する。
【００１２】
まず、本発明の中核をなすシステムは、耐タンパ実行システム９０００である。
耐タンパ実行システム９０００は、ローディングシステム１０００と、プログラム実行システム４０００と、メインメモリ１９００とからなる。ローディングシステム１０００と、プログラム実行システム４０００とは、耐タンパ技術により保護されているが、メインメモリ１９００は、外部からのアクセスが可能となっている。
【００１３】
ローディングシステム１０００は、いわゆるローダであって、起動された実行可能プログラム、いわゆる機械語に翻訳されたプログラムをメインメモリに展開する機能を有する。しかし、一般のローダとの相違は、起動された実行可能プログラムをそのままメインメモリに展開するのではなく、誤りを発生させた実行可能プログラムを展開する点が相違する。
【００１４】
ここで、ローディングシステム１０００は、誤り発生部１２１０を構成要素とし、誤り発生部１２１０は、メモリ２３００上の誤り発生情報１８２０を基に、実行可能プログラム１８１０に誤りを発生させる機能を有する。誤りが発生した実行可能プログラムである変換後プログラム１９１０は、ローディングシステム１０００によってメインメモリ１９００に配置される。
【００１５】
また、プログラム実行システム４０００は、誤りが発生している変換後プログラム１９１０の誤りを訂正しながら実行する機能を有する。
プログラム実行システム４０００は、誤り検出部４６００と、誤り訂正部４１００と、ＣＰＵ４２００とからなる。
誤り検出部４６００は、メモリ２３００上の誤り発生情報１８２０を参照して、メインメモリ１９００上の変換後プログラムの誤り位置を検出し、誤り訂正部４１００に通知する機能を有する。
【００１６】
変換後プログラムの誤り位置の通知を受けた誤り訂正部４１００は、メモリ２３００上の誤り訂正符号１８３０を用いてその誤りを訂正し、訂正したプログラムをＣＰＵ４２００に渡す機能を有する。ＣＰＵ４２００は、メインメモリ上のプログラムを自らフェッチする代わりに、誤り訂正部４１００から渡されたプログラム、すなわち命令コードを実行する。
【００１７】
次に、コンパイラ２０００は、通常のコンパイラが有する機能、すなわちソースコードから機械語に翻訳する機能のほかに、誤り訂正符号を作成する機能を有する。
コンパイラ２０００は、コンパイル部２１００と、誤り訂正符号作成部２２００とからなる。
【００１８】
コンパイル部２１００は、メモリ２３００上のソースプログラムを読み込み機械語に翻訳し、その翻訳されたプログラムである実行可能プログラム１８１０をメモリ２３００上に書き出すとともに、誤り訂正符号作成部２２００に渡す機能を有する。
実行可能プログラムを渡された誤り訂正符号作成部２２００は、渡された実行可能プログラムとメモリ２３００上の誤り発生情報１８２０とから、誤り訂正符号１８３０を作成し、メモリ２３００に書き出す機能を有する。誤り発生情報１８２０とは、実行可能プログラムをブロック化する場合のデータブロック長や誤り訂正符号の長さ等を示す情報であり、詳細は後述する。
【００１９】
誤り訂正符号作成部２２００によって作成された誤り訂正符号１８３０は、プログラム実行システム４０００が変換後プログラム１９１０の誤りを訂正するときに参照されることになる。
また、誤り発生情報１８２０は、誤り訂正符号作成部２２００によって誤り訂正符号１８３０が作成される際に参照されるほか、ローディングシステム１０００によって実行可能プログラム１８１０に誤りを発生させる際や、プログラム実行システム４０００によって誤りを検出する際等にも用いられる。
【００２０】
図２は、耐タンパ実行システム９０００の処理を表すフローである。
以下、耐タンパ実行システム９０００の動作について、概略を説明する。動作の詳細については、以下の実施形態１で説明する。
耐タンパ実行システム９０００は、実行可能プログラムが起動された場合に実行される。
【００２１】
実行可能プログラム１８１０が起動されたら、ローディングシステム１０００は起動された実行可能プログラム１８１０をメモリ１８００からローディングシステム１０００内の作業領域に読み出す（ステップＳ６１）。
ローディングシステム１０００内の誤り発生部１２１０は、作業領域内の実行可能プログラムに誤りを発生させ（ステップＳ６２）、誤りが発生している実行可能プログラムである変換後プログラム１９１０をメインメモリ１９００に配置する（ステップＳ６３）。誤りを発生させる際、メモリ２３００上にある誤り発生情報１８２０が参照される。
【００２２】
メインメモリ１９００に配置された変換後プログラム１９１０は、プログラム実行システム４０００によって読み込まれ、誤り検出部４６００によって発生している誤りの位置が検出される（ステップＳ６４）。この際、メモリ２３００上の誤り発生情報１８２０が参照される。
誤り検出部４６００によって検出された誤り位置は、誤り訂正部４１００に通知され、誤り訂正部よって訂正される（ステップＳ６５）。この際、メモリ２３００上の誤り訂正符号１８３０が参照される。
【００２３】
誤りが訂正された変換後プログラムは、ＣＰＵ４２００に渡され、実行される（ステップＳ６６）。
変換後プログラム１９１０が終了するまで、変換プログラムに発生している誤りの訂正とＣＰＵによる実行が繰り返される（ステップＳ６７）。
ステップＳ６１〜ステップＳ６３までの処理がローディングシステム１０００によって行われる処理であり、ステップＳ６４〜ステップＳ６６までの処理がプログラム実行システムで行われる処理である。
【００２４】
ここで、コンパイラ２０００と耐タンパ実行システム９０００とは、別の機器上で実行されるのが一般的である。耐タンパ実行システム９０００は、実行可能プログラム１８１０、誤り訂正符号１８３０及び誤り発生情報１８２０を耐タンパ実行システム９０００内のＨＤＤやローカルメモリに格納しておき、実行する。
【００２５】
尚、本発明がメインメモリ上のプログラムの解析を防止することを目的としている為、図では、説明の便宜上、メモリ上の実行可能プログラムはそのままの形で配置している。しかし、実際には、メモリ上の実行可能プログラムは暗号化されており、ローディングシステム１０００は、暗号化されている実行可能プログラムを復号した後、誤り発生部１２１０の処理を行う。
＜実施形態１＞
以下、本発明の実施形態１に係るコンパイラ及び耐タンパシステムシステムについて図３〜図１９を用いて説明する。
【００２６】
＜構成＞
＜コンパイラの構成＞
図３は、誤り訂正符号を作成する為のコンパイラの機能ブロック図である。
コンパイラ２０００は、コンパイル部２１００と、誤り訂正符号作成部２２００とからなる。コンパイル部２１００は、高級言語で記述されたソースプログラム２０１０を機械語、すなわち実行可能プログラムに翻訳する機能を有するものとする。また、誤り訂正符号作成部２２００は誤り発生情報１８２０と、コンパイル部２１００が作成した実行可能プログラム１８１０とから誤り訂正符号１８３０を作成する機能を有する。
【００２７】
＜耐タンパシステムの構成＞
耐タンパ実行システム９０００は、ローディングシステム１０００と、プログラム実行システム４０００とからなる（図１参照）。
以下、ローディングシステム１０００と、プログラム実行システム４０００の構成について説明する。
【００２８】
＜ローディングシステムの構成＞
図４は、本発明の実施形態１に係るローディングシステム１０００の機能ブロック図である。
ローディングシステム１０００は、データ読込部１１００と、データ変換部１２００と、データ書出部１３００とからなる。
【００２９】
ここで、データ読込部１１００は、実行可能プログラム読込部１１１０と、誤り発生情報読込部１１２０からなり、ローディングシステム１０００で必要なデータをメモリ１８００から読み込む機能を有する。
実行可能プログラム読込部１１１０は、メモリ１８００上に存在する暗号化されている実行可能プログラム１８１０をローディングシステム１０００内の作業領域に読み込んだ後、読み込んだ暗号化された実行可能プログラムを復号する機能を有する。また、誤り発生情報読込部１１２０は、同様に、メモリ上の誤り発生情報１８２０をローディングシステム１０００内の作業領域に読み込む機能を有する。
【００３０】
尚、誤り発生情報１８２０については、図６で説明する。また、メモリ１８００上の誤り訂正符号１８３０は、ローディングシステム１０００では必要としないが、耐タンパ実行システム９０００で使用する情報である為、記載してある。
データ変換部１２００は、誤り発生部１２１０からなり、誤り発生部１２１０は誤り発生情報読込部１１２０によって読み込まれた誤り発生情報１８２０に基づいて、実行可能プログラム１８１０に誤りを発生させる機能を有する。この誤り発生部１２１０が発生させる誤りについては、図６で説明する。
【００３１】
データ書出部１３００は、変換後プログラム書出部１３１０からなり、変換後プログラム１９１０をメインメモリ１９００に書き出す機能を有する。変換後プログラム１９１０とは、誤り発生部１２１０によって誤りを発生させた実行可能プログラム１８１０をいう。
＜プログラム実行システムの構成＞
図５は、本発明の実施形態１に係るプログラム実行システムの機能ブロック図である。
【００３２】
プログラム実行システム４０００は、誤り検出部４６００と、誤り訂正部４１００と、ＣＰＵ４２００とからなる。
誤り検出部４６００は、メインメモリ１９００上の変換後プログラム１９１０に発生している誤り位置を、メモリ１８００上の誤り発生情報１８２０を参照し、検出する機能を有する。この際、誤り発生情報内の誤り位置情報を参照する。検出した誤り位置は、誤り訂正部４１００に通知される。誤り位置情報については、図７で説明する。
【００３３】
誤り検出部４６００から誤り位置を受け取った誤り訂正部４１００は、変換後プログラム１９１０に発生しているその誤りを、メモリ１８００上の誤り訂正符号１８３０を参照し訂正する機能を有する。また、誤りを訂正された変換後プログラムをＣＰＵに渡す機能を有する。
誤り訂正部４１００から、誤りが訂正された変換後プログラムを渡されたＣＰＵ４２００は、誤りが訂正された変換後プログラムを実行する機能を有する。
【００３４】
＜データ＞
以下、耐タンパ実行システム９０００が用いる主なデータについて図６〜図９を用いて説明する。
図６は、誤り発生情報の構成及び内容例を示す。
誤り発生情報１８２０は、データブロック長１８２１と、誤り訂正符号長１８２２と、誤りビット数１８２３と、誤り位置情報３８２０とにより構成される。
【００３５】
ここで、データブロック長１８２１とは、実行可能プログラム１８１０に誤りを発生させる単位である１データブロックのビット長であり、誤り訂正符号長１８２２とは、１データブロックのデータの誤りを訂正することができる誤り訂正符号のビット数である。また、誤りビット数１８２３とは、１データブロックのデータ内に発生させることができる誤りの最大ビット数を示す。
【００３６】
例でいうと、実行可能プログラムの３２ビットの１データブロック１８２４中に１ビットの誤りを発生させることができ、この１データブロックに発生させた誤りは６ビットの訂正符号１８２５で訂正できることを表す。誤りを発生させるとは、誤りを発生させようとするビットの値を反転させることを言う。
図７は、誤り位置情報の構成例及び内容例を示す。誤り位置情報３８２０は、誤り発生情報１８２０の一部を構成する情報である。
【００３７】
誤り位置情報３８２０は、誤りを発生させる領域の情報である。この誤り位置情報３８２０１つで、１つの領域を指定することとなる為、複数の連続していない領域に誤りを発生させる場合には、この誤り位置情報３８２０は誤りを発生させる領域の数分必要となる。
誤り位置情報３８２０は、開始アドレス３８２２と、領域サイズ３８２３とにより構成される。
【００３８】
ここで、開始アドレスとは誤りを発生させる領域の先頭アドレスをいい、領域サイズ３８２３とは、誤りを発生させる領域の大きさをいう。
例でいうと、開始アドレス「Ｃ」から、領域サイズ「Ｄ−Ｃ」（アドレスＤからアドレスＣを引いた値）の領域内を、３２ビットのデータブロックで分割し、各データブロック毎に１ビット以下の誤りを発生させることをいう（図６参照）。「Ｃ」、「Ｄ−Ｃ」については、図８で説明する。
【００３９】
図８は、耐タンパ実行システムの入力データの構成例である。
実行可能プログラム２５００は、ヘッダ部２０３１と、誤り発生情報部２０３５と、誤り訂正符号部２０３６と、実行コード部２０３２と、データ部２０３３と、リロケーション情報部２０３４とにより構成される。
これらのデータは、耐タンパ実行システムで必要なデータであり、ローディングシステム１０００によってメインメモリに配置される。
【００４０】
ここで、ヘッダ部２０３１は、当実行可能プログラムの全体に関する情報、例えばプログラムサイズ、各部の先頭アドレス、各部のサイズ等で構成されている。実行コード部２０３２は、プログラムの命令で構成されており、データ部２０３３は、プログラムで使用するデータで構成されている。
また、リロケーション情報部２０３４は、メインメモリに配置する場合の再配置情報で構成されている。
【００４１】
誤り発生情報部２０３５は、図６と図７の誤り発生情報で構成されている。また、誤り訂正符号部２０３６は、誤り訂正符号１８３０で構成されており、誤り訂正符号１８２５の集合である。
図左のＡ〜Ｅは、先頭からの相対アドレスを表す。図９のＢ、Ｃ、Ｄも同様である。
【００４２】
尚、本実施形態で誤りを発生させることが出来る領域である誤り発生可能領域２５９０は、実行コード部２０３２、データ部２０３３、リロケーション情報部２０３４とし、誤り訂正符号部２０３６は含まないものとする。従って、この誤り発生可能領域２５９０内にデータブロック１８２４が存在することになる。
ここで、図７の補足説明をする。開始アドレス３８２２「Ｃ」は、実行コード部２０３２の実行可能プログラム２５００の先頭からのオフセットアドレスである。また、「Ｄ」は実行コード部の後ろに位置するデータ部２０３３のオフセットアドレスであるから、領域サイズ３８２３「Ｄ−Ｃ」の値は、実行コード部の領域のサイズとなる。
【００４３】
図９は、実行コード部と誤り訂正符号部の関係を表す図である。
この例では、実行コード部２０３２は、３２ビットの命令で構成されており、１命令が１データブロックとなっている。また、誤り訂正符号部２０３６は、６ビットの訂正符号で構成されている。
この最初のデータブロック「命令（１）」の誤り訂正符号は、「符号（１）」であり、誤り訂正符号部２０３６の最初に配置されている。次のデータブロック「命令（２）」の誤り訂正符号「符号（２）」は、「符号（１）」の次に配置されている。このように、データブロックと誤り訂正符号は、それぞれ連続して各領域に配置されている。
【００４４】
＜動作＞
以下、上述した構成を備えるコンパイラ２０００及び耐タンパ実行システム９０００の動作について図１０から図１２を用いて説明する。
ソースプログラムが完成したら、そのプログラムの重要度、すなわち解析・改竄を防止したいレベルに応じて、誤り発生情報１８２０を作成する。例として、データブロック３２ビットと、ハミング符号による誤り訂正符号６ビットを使用する。この訂正符号で訂正できるビット数は１ビット以下である。従って、図６の誤り発生情報１８２０の例のように、データブロック長１８２１を３２ビット、誤り訂正符号長１８２２を６ビット、誤りビット数１８２３は１ビットとする。
【００４５】
また、誤り位置情報３８２０を指定し、実行コード部のみに誤りを発生させることとする。実行コード部のみに誤りを発生させる指定は、コンパイラに対して誤りを発生させる領域を指定することにより行うものとする。
まず、コンパイラ２０００の処理について、図１０を用いて説明する。
図１０は、コンパイラの処理を示すフローチャートである。
【００４６】
起動されたコンパイラは、メモリからソースプログラム２０１０を読み出し、コンパイル部２１００で機械語に翻訳し、実行可能プログラム１８１０を作成する（ステップＳ５０）。この実行可能プログラム１８１０は、誤り訂正符号作成部２２００に渡される。
この時、コンパイラは、指定されたコンパイルオプション、すなわち誤りを発生させる領域指定に従って、誤り位置情報３８２０を作成して誤り発生情報１８２０に追加する（ステップＳ５１）。具体的には、誤りを発生させる領域の先頭アドレスとその領域の大きさを求め、誤り位置情報３８２０の開始アドレス３８２２と領域サイズ３８２３とに設定する。
【００４７】
図７の例のように、開始アドレス３８２２「Ｃ」とその領域サイズ３８２３「Ｄ−Ｃ」の誤り位置情報が作成される。
次に、実行可能プログラム１８１０を渡された誤り訂正符号作成部２２００は、この実行可能プログラムと誤り発生情報１８２０を基に誤り訂正符号１８３０を作成する。
【００４８】
誤り訂正符号作成部２２００は、誤りを発生させる開始アドレス３８２２「Ｃ」から、３２ビットずつのデータブロック１８２４を取り出し（ステップＳ５３）、それぞれのデータブロックから６ビットの誤り訂正符号１８２５を作成する（ステップＳ５３）。誤り訂正符号作成部は、開始アドレスから領域サイズ３８２３すべてのデータに対し誤り訂正符号を作成する。
【００４９】
コンパイラは、ここで作成した誤り訂正符号１８２５を誤り訂正符号部２０３６に設定し、実行可能プログラム２５００として、出力する（ステップＳ５４）。
次に、実行可能プログラム２５００が起動された場合のローディングシステム１０００の処理について説明する。
【００５０】
実行可能プログラム２５００が起動された場合、ローディングシステム１０００のデータ読込部１１００は必要なデータを作業領域に読み込む。実行可能プログラム読込部１１１０によって、実行可能プログラムが読み込まれ、また、誤り発生情報読込部１１２０によって、誤り発生情報１８２０が読み込まれる。
実行可能プログラム２５００の場合は、このプログラムが１つ読み込まれればよい。誤り発生情報部２０３５を含んでいるからである。
【００５１】
データ読込部１１００は、実行可能プログラム２５００をローディングシステムの作業領域に読み込んだ後、暗号化されている実行可能プログラム２５００の復号を行う。
必要なデータが読み込まれたら、データ変換部１２００は、実行可能プログラムに誤りを発生させる。この誤り発生の処理については、図１１を用い説明する。
【００５２】
図１１は、誤り発生部の処理のフローチャートである。
誤り発生部１２１０は、誤り発生情報部２０３５の誤り位置情報３８２０から誤りを発生させるべき領域を知り、誤り発生情報１８２０を基に誤りを発生させる。
但し、誤り発生部１２１０は、実行可能プログラム２５００に存在するリロケーション情報部２０３４のリロケーション情報を参照し、リロケーションされるデータ部分には誤りを発生させない。
【００５３】
実行可能プログラム２５００のオフセットアドレス「Ｃ」から（ステップＳ１０）、３２ビットのデータを順に取り出し、そのデータ内の１ビットを反転させる（ステップＳ１１）。反転させる１ビットは、ランダムに選ぶものとする。この作業をアドレス「Ｃ」から領域サイズ「Ｄ−Ｃ」３８２３分の領域すべてに対して行う。
【００５４】
その後、データ書出部１３００の変換後プログラム書出部１３１０は、アドレス「Ｃ」から領域サイズ「Ｄ−Ｃ」、すなわち、実行コード部２０３２に誤りを発生させた変換後プログラム１９１０を、メインメモリ１９００に書き出す。
実行可能プログラムがメインメモリに配置された後、その実行可能プログラムは、プログラム実行システムによって実行される。
【００５５】
以下、プログラム実行システム４０００の処理について、図１２を用いて説明する。
図１２は、プログラム実行システムの処理のフローチャートである。
ローディングシステム１０００が実行可能プログラム２５００に誤りを発生させ、変換後プログラムをメインメモリ１９００に配置した後、プログラム実行システム４０００に制御が移される。
【００５６】
制御が移されたプログラム実行システム４０００は、メインメモリ上の変換後プログラムに発生している誤りを訂正しながら、その変換後プログラムを実行する。
まず誤り検出部４６００が、変換後プログラム１９１０と誤り発生情報１８２０とを基に、誤りが発生している可能性があるアドレスのデータかを判断する（ステップ２０）。
【００５７】
誤りが発生している可能性がないアドレスならば、そのままＣＰＵ４２００に渡し実行する（ステップＳ２３）。誤りが発生している可能性があるアドレスならば、実際に誤りが発生しているか検査する（ステップＳ２１）。
この検査によって、実際に誤りが発生していた場合は、誤り検出部４６００はその誤りの発生しているデータを誤り訂正部４１００に渡す。
【００５８】
データを受け取った誤り訂正部４１００は、誤り訂正符号１８３０を参照し、発生している誤りを訂正する（ステップＳ２２）。その後、訂正したデータをＣＰＵに渡す。データを受け取ったＣＰＵはデータを実行する（ステップＳ２３）。
実際には誤りが発生していなかった場合には、誤り検出部４６００は、データをそのままＣＰＵに渡す。データを受け取ったＣＰＵはデータを実行する（ステップＳ２３）。
【００５９】
例でいえば、誤り発生情報部２０３５の誤り発生情報１８２０を参照すると、誤りは、実行コード部２０３２に発生している為（ステップＳ２０）（図７、図８参照）、この実行コード部が参照された場合には、誤りが発生しているか否かの検査を行う（ステップＳ２１）。
誤りが発生しているか否かの検査は、誤り訂正符号部２０３６の対応する誤り訂正符号１８３０により行う。
【００６０】
この検査により誤りが発生していると判断された場合は、対応する誤り訂正符号により、誤りが訂正され（ステップＳ２２）、訂正後のデータがＣＰＵに渡され処理される（ステップＳ２３）。この検査により誤りが発生していないと判断された場合には、そのままＣＰＵに渡され処理される。
一方で、データ部が参照された場合には、誤りは発生していない為（図７、図８参照）、誤りが発生しているか否かの検査は行わずに、ＣＰＵに渡され処理される。
【００６１】
＜変形例１＞
実施形態１で、実行可能プログラムに発生させる誤りは、それ自体では意味を持たないものであるが、その発生している誤りに意味ある情報を含ませておくことも可能である。
例えば、ある実行可能プログラムを実行し、その際の誤りビットを集めたものが、別の暗号化されている実行可能プログラムを実行する際の復号鍵になる場合である。
【００６２】
図１３は、誤りに意味を持たせる場合のシステム及びその機能ブロック図の概略図である。
図１で示したシステムとの違いは、誤り発生部１２１０をローディングシステム７１００内に有するのではなく、コンパイラ７２００内に有することである。
各部の機能は、誤り訂正部７６００以外は、図１のものと同様である。誤り訂正部７６００の処理は、後で詳しく説明する。
【００６３】
以下、動作について説明する。
まず、ソースプログラム２０１０に含ませる意味ある情報を、誤り発生情報１８２０に設定する。この意味ある情報とは、本ソースプログラムを実行した後に実行する暗号化された実行可能プログラムの復号鍵とする。
コンパイラ７２００は、メモリ７３００からソースプログラム２０１０を読み込み、コンパイル部２１００で実行可能プログラムを作成する。コンパイル部２１００で作成された実行可能プログラムは、誤り発生部１２１０と誤り訂正符号作成部２２００とに渡される。
【００６４】
誤り発生部１２１０は、コンパイル部２１００から渡された実行可能プログラムに、意味を含んでいる誤りを発生させる。その際、誤り発生情報１８２０を参照する。その後、誤りが発生している実行可能プログラムである変換後プログラム１９１０をメモリ７３００に書き出す。
一方、誤り訂正符号作成部２２００は、コンパイル部２１００から渡された実行可能プログラムを基に、誤り訂正符号１８３０を作成する。その際、誤り発生情報１８２０を参照する。その後、作成した誤り訂正符号を、メモリ７３００に書き出す。
【００６５】
メモリ７３００に書き出された変換後プログラム１９１０は、暗号化され、実行するコンピュータのＨＤＤ等に配置される。誤り発生情報１８２０と、誤り訂正符号１８３０も同様に、配置される。
その後、変換後プログラム１９１０が起動された場合、耐タンパ実行システム７０００内のローディングシステム７１００は、暗号化された変換後プログラム１９１０を復号し、メインメモリ７４００上に配置する。
【００６６】
誤り検出部４６００は、メインメモリ上の変換後プログラム７４００を読み込み、変換後プログラムに発生している誤り位置を検出し、誤りの発生しているデータを誤り訂正部７６００に渡す。
誤りの発生しているデータを渡された誤り訂正部７６００は、誤りを訂正するとともに、誤りを収集し、意味ある情報である復号鍵を作成する。誤り訂正部は、この復号鍵をローディングシステムに渡す。誤り訂正部７６００の処理の詳細は、図１４で説明する。
【００６７】
図１４は、誤りを収集する場合の誤り訂正部の処理を示すフローチャートである。
誤り訂正部７６００は、訂正したデータをＣＰＵ４２００に渡す。データを受け取ったＣＰＵはデータを実行する。
本実行可能プログラムの実行が終了し、次の暗号化された実行可能プログラムが起動された場合に、ローディングシステム７１００は、次の暗号化された実行可能プログラムを誤り訂正部４１００から受け取った暗号鍵で復号し、メインメモリ７４００に配置する。
【００６８】
その後、メインメモリに配置された実行可能プログラムは、プログラム実行システムにより実行される。
図１４は、誤りを収集する場合の誤り訂正部の処理を表すフローチャートである。
まず、誤り訂正部７６００は、その内部の作業領域にデータブロック長１８２１（図６参照）と同じ大きさの誤り保存領域を持ち、０クリアしてあるものとする。
【００６９】
誤り検出部４６００から誤りの発生しているデータを受け取った誤り訂正部７６００は、受け取ったデータに対応する誤り訂正符号１８３０を参照し、その誤りを訂正する（ステップＳ４１）。
その訂正した誤りの位置に対応する誤り保存領域のビットをＯＮにする（ステップＳ４２）。
【００７０】
実行可能プログラムの誤りをすべて訂正した時点で（ステップＳ４３）、復号鍵は完成する。
その後、完成した復号鍵をローディングシステムに渡す。
＜変形例２＞
図３で、誤り訂正符号を作成する為のコンパイラの機能ブロック図を示した。図３のコンパイラは、ソースプログラムから実行可能プログラムに翻訳すると同時に、誤り訂正符号を作成するものである。
【００７１】
本変形例は、既存のコンパイラにより作成された実行可能プログラム対して、誤り訂正符号を作成する為のツールの例である。
本誤り訂正符号作成ツールを使用することにより、図３のコンパイラでサポートされていない高級言語で作成されているソースプログラムについても、従来のコンパイラで実行可能プログラムを作成しておくことにより、誤り訂正符号１８３０を作成することができるようになる。また、既にある実行可能プログラムについても、再コンパイルすることなしに誤り訂正符号１８３０を作成することができるようになる。
【００７２】
図１５は、誤り訂正符号作成ツールの機能ブロック図である。
誤り訂正符号作成ツール２８００は、誤り訂正符号作成部２２００のみからなる。図３のコンパイラ２０００が、ソースプログラムから実行可能プログラムを作成する機能と、誤り訂正符号を作成する機能を合わせ持つのに対し、誤り訂正符号作成ツール２８００は、誤り訂正符号を作成する機能のみを有する点が異なる。
【００７３】
また、誤り訂正符号作成ツール２８００は、従来のコンパイラを使って作成された実行可能プログラムを使用する点が異なる。
尚、誤り訂正符号作成部２２００の機能は、図３のものと同様の機能を有する。
＜変形例３＞
図５で、本発明の実施形態に係るプログラム実行システムの機能ブロック図を示した。図５で示したプログラム実行システムは、誤りが実行可能プログラムの特定の領域、すなわち誤り位置情報３８２０で指定した領域、に発生しているものを実行する為のシステムである。
【００７４】
本変形例は、誤り発生可能領域２５９０の全領域に誤りが発生している場合の、プログラム実行システムの例である（図８参照）。
図１６は、誤り発生可能領域の全領域に誤りを発生させた場合のプログラム実行システムの機能ブロック図である。
プログラム実行システム４５００は、図５のプログラム実行システム４０００が有する誤り検出部４６００を有しない。誤り発生可能領域の全領域に誤りが発生している変換後プログラムを実行する為のプログラム実行システムであることから、誤りの位置を検出する必要がないためである。すなわち、誤り発生可能領域の先頭から順に誤りを訂正しながら実行することになる。
【００７５】
尚、誤り訂正部４１００とＣＰＵ４２００は図５のものと同様の機能を有する。
また、誤り発生情報１８２０に誤り位置情報３８２０が含まれていない場合も、誤り発生可能領域２５９０のすべての領域に誤りを発生させることになる。
＜変形例４＞
図８で、耐タンパ実行システムの入力データの構成例を示した。図８は、本システムで必要とするデータを１つにまとめた例である。
【００７６】
しかし、耐タンパ実行システムで必要なデータの内、誤り発生情報と誤り訂正符号は、必ずしもメインメモリ上に配置されている必要はなく、キャッシュ等の外部メモリでもよい。
図１７は、耐タンパシステムで必要とするデータがそれぞれ別に存在する例である。
【００７７】
実行可能プログラム１８１０は、通常のコンパイラの出力結果であるところの実行可能プログラムの構成である。実行可能プログラム１８１０は、ヘッダ部２０３１と、実行コード部２０３２と、データ部２０３３と、リロケーション情報部２０３４とにより構成される。図左のＸ〜Ｚは、先頭からの相対アドレスを表す。
【００７８】
各部の内容は、図８のものと同様である。
＜変形例５＞
図９で、実行コード部と誤り訂正符号部の関係を示した。図９では、データブロックと誤り訂正符号は、それぞれ連続して実行コード部２０３２と誤り訂正符号部２０３６に配置されている。しかし、データブロックは連続している必要はなく、また、誤り訂正符号も連続している必要はない。
【００７９】
図１８は、データブロックと誤り訂正符号の配置例である。
データ２５８０は、データブロックとその誤り訂正符号を連続したアドレスに配置した例である。図８の実行可能プログラム２５００で考えると、誤り訂正符号部２０３６と実行コード部２０３２が分かれずに、アドレスＢからアドレスＤの間に、データブロック１８２４と誤り訂正符号１８２５が交互に配置されることになる。
【００８０】
この場合、データブロックとそれに対応する誤り訂正符号とを一度に読み込める利点がある。
＜変形例６＞
図１２で、プログラム実行システムの処理フローを示した。これは、データブロック中であれば、誤りが発生しているビットがどの位置のビットでもよい場合である。
【００８１】
しかし、誤りを発生させるビットの位置を、データブロック中の特定の位置に限定することもできる。
図１９は、データブロック中のＯＰコードに誤りを発生させた場合のプログラム実行システムの処理フローである。
これは、発生させる誤りのデータブロック内での位置をＯＰコード部分とし、その誤りの検出をＯＳ（オペレーティングシステム）にさせようというものである。
【００８２】
この場合は、３２ビット固定長の機械語命令のうち、先頭１バイトのＯＰコードに誤りを発生させる。その誤りの発生させ方は、あるＯＰコードが未定義命令、又は、特定の命令になるように誤りを発生させる。
プログラムの実行は、通常の実行システムと同様に行う。
ＯＰコード部分に誤りを発生させて未定義命令とした場合には、命令例外の時（ステップＳ３０）に制御が渡される割り込み処理の中で誤りを訂正し（ステップＳ３１）、ＣＰＵに訂正後の命令が渡され処理される（ステップＳ３２）。
【００８３】
ＯＰコード部分に誤りを発生させて特定の命令とした場合には、その命令の時は必ず割り込みが行われるようにしておき、割り込み処理の中で同様の誤り訂正を行う。
＜実施形態２＞
以下、本発明の実施形態２に係るコンパイラ及び耐タンパシステムについて図２０〜図２３を用いて説明する。
【００８４】
＜概要＞
図２０は、本発明の実施形態２に係るシステム及びその機能ブロックの概略図である。
実施形態１との違いは、２つある。
１つ目の相違点は、実施形態１では、実行可能プログラムを起動する前に、誤り訂正符号を作成しておく必要があったが、実施形態２では、誤り訂正符号をあらかじめ作成しておく必要がない点である。実施形態２では、誤り訂正符号をローディングシステム内で作成するからである。
【００８５】
２つ目の相違点は、実施形態１では、誤り発生情報をあらかじめ決定し、メモリ上に作成しておく必要があったが、実施形態２では、誤り発生情報はローディングシステムがコンピュータの性能、プログラムの重要度、実行の回数等に応じて、自動で決定する点である。
コンパイラについては、実施形態２では特別なものは必要ない。実行可能プログラムの実行に際し、実行する実行可能プログラムのみを必要とし、実行に際し前もって誤り訂正符号を作成しておく必要がないからである。従って、ソースプログラム２０１０は通常のコンパイラ２００１でコンパイルし、実行可能プログラム１８１０を作成しておけばよい。
【００８６】
プログラム実行システム６０００は、図１の実施形態１のプログラム実行システム４０００とほぼ同じである。異なるのは、メモリ１８００ではなく耐タンパ実行システム９５００内の誤り発生記憶部５４００にある誤り発生情報を参照することと、メモリではなくメインメモリ１９００上の誤り訂正符号を参照することである。ただし、誤り発生情報記憶部５４００と誤り訂正符号１８３０は、キャッシュ等のメモリ上に置いてもよいため、プログラム実行システム４０００との実質的な相違はない。
【００８７】
以下、実施形態２について実施形態１との相違点である、ローディングシステムについて説明する。
＜構成＞
図２１は、本発明の実施形態２に係るローディングシステム５０００の機能ブロック図である。
【００８８】
ローディングシステム５０００は、データ読込部５１００と、データ変換部５２００と、データ書出部５３００と、誤り発生情報記憶部５４００と、誤り発生情報決定部５５００と、誤り発生情報を決定する為の情報記憶部５６００とからなる。
図４の実施形態１との違いを以下に示す。
【００８９】
データ読込部５１００は、実行可能プログラム読込部１１１０のみで構成されており、誤り発生情報読込部１１２０を有していない点が異なる。これは、ローディングシステム内部に誤り発生情報記憶部５４００を有しているため読み込む必要がないからである。
データ変換部５２００は、誤り発生部１２１０のみではなく、誤り訂正符号作成部２２００とで構成されている点が異なる。これは、ローディングシステムで、誤り訂正符号を作成するからである。
【００９０】
データ書出部５３００は、変換後プログラム書出部１３１０のみではなく、誤り訂正符号書出部５３２０とで構成されている点が異なる。ローディングシステムで作成した誤り訂正符号を出力するためである。
それぞれの部の有する機能は、実施形態１と同様である。
次に、実施形態２にのみ存在する誤り発生情報記憶部５４００と、誤り発生情報決定部５５００と、誤り発生情報を決定する為の情報記憶部５６００について説明する。
【００９１】
誤り発生記憶部５４００には、誤り発生情報１８２０が記憶されている。
誤り発生情報決定部５５００は、実行システムの性能を基に、誤りを発生させる領域を示す誤り発生情報を決定する機能を有する。
誤り発生情報を決定する為の情報記憶部５６００は、誤り発生情報を決定する為の情報が記憶してある。誤り発生情報を決定する為の情報については、図２２で説明する。
【００９２】
＜データ＞
誤り発生記憶部５４００に記憶されている誤り発生情報１８２０は、実施形態１のデータである図６、図７と同様である。
図２２は、誤り発生情報を決定する為の情報の構成及び内容例を示す。
誤り発生情報を決定する為の情報５６１０は、ＣＰＵ性能５６１１と、誤り発生領域５６１２とで構成される。
【００９３】
ここで、ＣＰＵ性能５６１１とは、実行可能プログラム１８１０を実行するコンピュータのＣＰＵの性能である。また、誤り発生領域５６１２とは、誤りを発生させる領域を示す。
＜動作＞
実行可能プログラム１８１０が起動されると、実行可能プログラム読込部１１１０は、メモリ上の実行可能プログラムをローディングシステム５０００の作業領域に読み込む。
【００９４】
読み込んだ実行可能プログラムはデータ読込部５１００によって復号された後、誤り発生部１２１０と誤り訂正符号作成部２２００に渡される。
実行可能プログラムを受け取った誤り発生部１２１０は、誤り発生情報記憶部５４００上の誤り発生情報１８２０を参照し、誤りを発生させる。この処理は、実施形態１の誤り発生部の処理と同じである。
【００９５】
また、実行可能プログラムを受け取った誤り訂正符号作成部２２００は、誤り発生情報記憶部５４００上の誤り発生情報１８２０を参照し、誤り訂正符号を作成する。この処理は、実施形態１のコンパイラの行う処理と同じである。
誤り発生部１２１０によって誤りが発生している変換後プログラム１９１０は、変換後プログラム書出部１３１０によってメインメモリ１９００に書き出される。また、誤り訂正符号作成部２２００で作成された誤り訂正符号１８３０は、誤り訂正符号書出部５３２０によってメインメモリに書き出される。
【００９６】
メインメモリに変換後プログラムと誤り訂正符号が書き出された後、プログラム実行システム６０００によって変換後プログラムが実行される。
ここで、誤り発生情報決定部の処理である誤り発生情報記憶部５４００上の誤り発生情報１８２０の決定方法について説明する。この誤り発生情報１８２０は、誤り発生部１２１０と誤り訂正符号作成部２２００とによって参照される。
【００９７】
図２３は、誤り発生情報決定部の処理を示すフローチャートである。
耐タンパ実行システム９５００は、ＣＰＵ性能を切り替えることができる機器であるものとする。また、本誤り発生情報決定部の処理が行われるのは、ＣＰＵ性能の切り替え処理が行われた時である。
誤り発生情報決定部５５００は、実行環境のＣＰＵ性能を取得する（ステップＳ７０）。そのＣＰＵ性能値を基に、誤り発生情報を決定する為の情報５６１０を参照し、誤りを発生させる領域を確定し（ステップＳ７１）、誤り発生情報１８２０を書き換える。
【００９８】
例でいえば、ＣＰＵ性能が１．８ＧＨｚだった場合は、図７の誤り発生位置情報の開始アドレスは「Ｃ」で、領域サイズは「Ｄ−Ｃ」のままである。ＣＰＵ性能が２．６６ＧＨｚであった場合には、図７の誤り発生位置情報の開始アドレスは「Ｃ」で、領域サイズは「Ｅ−Ｃ」となる。
＜補足＞
以上、本発明に係るシステムについて実施形態に基づいて説明したが、このシステムを部分的に変形することもでき、本発明は上述の実施形態に限られないことは勿論である。即ち、
（１）図２２では、誤り発生情報を決定する為の情報５６１０は、ＣＰＵ性能と誤りを発生させる領域とを対応させているが、ＣＰＵ性能と単位データ長あたりの誤りの数等としてもよい。また、プログラムの重要度と単位データ長あたりの誤りの数等としてもよい。この場合、プログラムの重要度に応じた解析防止レベルを取得する手段が必要である。例えば、実行可能プログラムのヘッダ部にその情報を設定しておく等である。
（２）実施形態で示した各システムの各機能を実現させる為の各制御処理（図１等参照）をＣＰＵに実行させる為のプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体には、ＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ等がある。流通、頒布されたプログラムは、機器におけるＣＰＵで読み取り可能なメモリ等に格納されることにより利用に供され、そのＣＰＵがそのプログラムを実行することにより実施形態で示した各システムの各機能が実現される。
（３）実施形態のメモリ１８００は、キャッシュメモリ等のローカルメモリ、記憶媒体等でもよい。
（４）実施形態２の誤り発生情報記憶部５４００と誤り訂正符号１８３０は、キャッシュ等のメモリにあってもよい。
（５）実施形態２の誤り発生情報決定部５５００は、実行環境のＣＰＵ性能を基に誤り発生情報１８２０を決定しているが、実行可能プログラムの重要度等を基に誤り発生情報を決定してもよい。この場合、例えば、実行可能プログラムのヘッダ部に、プログラムの重要度を示す情報を含ませておく等して、誤り発生情報決定部５５００に通知する必要がある。
【００９９】
また、実施形態２では、誤り発生情報決定部の処理が行われるのは、ＣＰＵ性能の切り替え処理が行われた時としているが、実行可能プログラムの重要度等を基に誤り発生情報を決定する場合は、その実行可能プログラムの実行前に行うなど、適時に行う必要がある。
（６）図７では、誤りを発生させる領域を指定することとしているが、誤りを発生させるデータブロックの実行可能プログラム内での位置を示すアドレステーブルでもよく、また、アドレスを算出する計算式などでもよい。また、データブロック中の誤りを発生させる位置でもよく、例えば、機械語の命令コード部分を指定してもよい。
（７）実施形態において、誤り発生部１２１０は、データブロック内に誤りを発生させる際に、誤りを発生させるビットをランダムに選択することとしている（図１１の説明参照）。ここで言うランダムとは、実行可能プログラムが起動される場合、毎回異なるルールで誤りを発生させることをいう。また、同一の実行可能プログラムが起動される場合も、前回に起動された時と異なるルールで誤りを発生させることをいう。
【０１００】
しかし、実行可能プログラムが起動される場合に、毎回同じルールで誤りを発生させてもよく、また、同一の実行可能プログラムが起動される場合も、毎回同じルールで誤りを発生させてもよい。
さらに、誤りを発生させる場合に、マスクを利用して特定のビットを反転させることとしてもよい。
【０１０１】
また、誤りを発生させる場合に、誤りビット数１８２３に示されたビット数分のビットを必ず反転させる必要はなく、誤りビット数１８２３に示された数以下であれば、反転させるビットの数をランダムに決めることが出来る。
ここで言うランダムとは、データブロックによって反転させるビットの数を変えることや、実行可能プログラムによって反転させるビットの数を変えることをいう。また、同一の実行可能プログラムであっても、起動される毎に反転させるビットの数を変えてもよい。またさらに、同じビット数分反転させることとしてもよい。
【０１０２】
尚、誤りを発生させるデータブロックに対し、誤りは必ず発生させなければならないわけではなく、発生させなくてもよい。
（８）実施形態では、誤り発生情報を作成し、それに基づいて誤りを発生させる等しているが、予め固定ルールを定めておき、誤りを発生させる等してもよい。
（９）実施形態では、実行可能プログラムのみを暗号化することとしているが、誤り発生情報１８２０や誤り訂正符号１８３０等も暗号化することとしてもよい。
（１０）誤りを発生させる範囲のデータが、リンカやリロケーション情報部２０３４の情報によって、コンパイラの出力とは異なった状態でメインメモリ上に配置される場合には、ローディングシステム１０００や誤り検出部４６００では、メインメモリ上のアドレスと対応する誤り訂正符号が分かるようにしておく必要がある。
（１１）実施形態１では、誤り訂正符号１８３０は、コンパイル部２１００が作成した実行可能プログラム１８１０に対して作成されることとしているが、リンク後のプログラムに対して誤り訂正符号を作成することとしてもよい。
（１２）実施形態２では、ローディングシステムがメインメモリから読み込んだ実行可能プログラムに対して、誤り訂正符号を作成することとしているが、リロケーション情報部２０３４の情報によってリロケートされたプログラムに対して、誤り訂正符号を作成することとしてもよい。
【０１０３】
【発明の効果】
以上説明したように本発明に係るデータ変換システムは、秘匿を所望されるデータを取得するデータ取得手段と、取得された前記データに対して、誤りを発生させるという変換を行う誤り発生手段と、前記誤り発生手段による変換後のデータを出力するデータ出力手段とを備え、前記誤り発生手段は、前記変換後のデータと誤り訂正符号とに基づいて訂正できる範囲を限度とした誤りを発生させる
ことを特徴とする。
【０１０４】
ここで、前記データ取得手段は更に、少なくとも、データブロック長とデータブロックに発生させる誤りの許容上限となるビット数とを示す誤り発生情報を取得し、前記誤り発生手段は、前記データブロック長の範囲毎のデータに対し、前記ビット数以下のビットの値を変化させることにより、前記変換を行うこととしてもよい。
【０１０５】
これにより、訂正符号によって訂正できる範囲でデータに誤りを発生させることができ、データの解析・改竄を困難にすることができるようになる。また、訂正符号によって訂正できる範囲でならば、どのビットに誤りを生じさせてもよい為、データが同じでも変換後のデータは変換する毎に異なるものとすることができ、データの解析・改竄を困難にすることができる。
【０１０６】
ここで、前記データは、実行可能プログラムであり、前記データ取得手段は、記録媒体から実行可能プログラムと前記誤り発生情報とを読み出して取得し、前記変換後のデータは、データブロック単位に誤りを発生させた実行可能プログラムであり、前記データ出力手段の出力先は、前記実行可能プログラムを実行するＣＰＵがアクセスするメインメモリであることとしてもよい。
【０１０７】
これにより、メインメモリ上に配置された実行可能プログラムに人為的に誤りを発生させることができ、実行するプログラムの解析・改竄を困難にすることができるようになる。また、同じ実行可能プログラムでも、起動されてメインメモリ上に配置される毎に、異なった誤りを発生させることが出来る為、トライ・アンド・エラーによるプログラム解析が困難になる。
【０１０８】
さらに、前記データ取得手段による前記取得と、前記誤り発生手段による前記変換と、前記データ出力手段による前記出力とは、前記実行可能プログラムの起動指示を受けた際に行われ、データ変換システムは更に、誤りが発生しているメインメモリ上の実行可能プログラムの誤りを訂正する為の誤り訂正符号を取得する手段と、前記誤り訂正符号を参照し前記実行可能プログラムの誤りを訂正する誤り訂正手段と、前記誤り訂正手段によって誤りが訂正された実行可能プログラムを実行するプログラム実行手段とを備えることとしてもよい。
【０１０９】
これにより、メインメモリ上の実行可能プログラムに発生している誤りを訂正しながら、プログラムを実行することができる為、誤りが訂正された実行可能プログラムを解析者に参照されることがなく、プログラムの解析・改竄を困難にすることができるようになる。
また、前記誤り発生手段は、前記実行可能プログラムの起動指示を受ける毎に、値を変化させる対象のビットの選択を前回の選択と異なるものとすることにより、前記変換を行うこととしてもよい。
【０１１０】
これにより、同一の実行可能プログラムを複数回起動する場合に、メインメモリ上に配置される変換後プログラムは、前回に起動されて配置された変換後プログラムと異なるものとなる為、解析者によるトライ・アンド・エラーによるプログラム解析が困難になる。
また、前記誤り発生手段は、実行可能プログラム中の命令コードに誤りを発生させることとしてもよい。
【０１１１】
これにより、機械語のＯＰコードが、本来とは違った機能を持つＯＰコードや命令例外を起こすＯＰコードとなる為、デバッガ等でのプログラムの解析・改竄が困難となる。また、ＯＳの割り込み処理に機能を追加するだけで、誤りを発生させた実行可能プログラムの実行ができるようになり、開発工数が少なくてすむ。
【０１１２】
また、前記データ変換システムは更に、前記データ取得手段によって取得されたデータに基づいて、前記誤り訂正符号を作成する誤り訂正符号作成手段と、前記誤り訂正符号を出力する誤り訂正符号出力手段と、少なくとも、データブロック長とデータブロックに発生させる誤りの許容上限となるビット数とを示す誤り発生情報を記憶する誤り発生情報記憶手段とを備え、前記誤り発生手段は、前記データブロック長の範囲毎のデータに対し、前記ビット数以下のビットの値を変化させることにより、前記変換を行うこととしてもよい。
【０１１３】
これにより、プログラムの実行に際し、予め誤り訂正符号を作成して置く必要がない為、従来のコンパイラで作成した実行可能プログラムであっても、その解析・改竄を困難にすることができる。
また、前記データ変換システムは更に、所定の条件と前記誤り発生情報との対応関係を記憶する手段と、所定の条件のいずれかの条件に合致する状況を検出する手段と、前記誤り発生情報記憶手段に記憶されている誤り発生情報を、検出された状況に合致する所定の条件に対応する誤り発生情報に変更する手段とを備えることとしてもよい。
【０１１４】
これにより、プログラム実行時に、実行可能プログラムに発生させる誤りの量や誤りを発生させる位置等を変更することが出来る為、実行環境やプログラムの重要度に応じて、プログラム解析の困難性の度合いを変更できるようになる。
また、前記誤り発生情報は、前記データ取得手段によって取得されたデータの先頭からの相対アドレスを特定する為の誤り位置情報を含み、前記誤り発生手段は、前記誤り位置情報で特定される位置に誤りを発生させることとしてもよい。
【０１１５】
これにより、実行可能プログラムの任意の位置に対して誤りを発生させることができる為、実行可能プログラム内の特に秘匿性を高めたい場所に集中して誤りを発生させることできるようになる。
上記で説明したように本発明に係るプログラム実行システムは、誤りが発生している実行可能プログラムの誤りを訂正する為の誤り訂正符号を取得する手段と、前記誤り訂正符号を参照し、実行可能プログラムの誤りを訂正する誤り訂正手段と、前記誤り訂正手段によって誤りが訂正された実行可能プログラムを実行するプログラム実行手段とを備えることを特徴とする。
【０１１６】
ここで、プログラム実行システムは更に、実行可能プログラムの誤りの位置を検出する誤り検出手段を備えることとしてもよい。
これにより、誤りが発生している実行可能プログラムの誤りを、訂正しながら実行することができるようになる為、誤りを訂正した実行可能プログラムを解析者に参照されることがなくなり、プログラムの解析・改竄を困難にすることができるようになる。
【０１１７】
また、前記誤り訂正手段は更に、誤りが発生しているビットの位置又は値の情報を収集し、前記収集した誤りを所定の処理に使用することとしてもよい。
これにより、プログラムを実行するだけで、そのプログラムとは関連性のないデータをコンピュータに保存出来る為、解析者に対しそのデータの存在を秘密にできることから、そのデータを使用して行う処理の解析・改竄を困難にすることができるようになる。
【０１１８】
また、前記データ変換システムは更に、外部からソースプログラムを取得するソースプログラム取得手段と、前記ソースプログラム取得手段によって取得されたソースプログラムを翻訳して機械語コードを作成するコンパイル手段を備え、前記データは前記機械語コードであり、前記誤り発生手段は、前記機械語コードに対して誤りを発生させる変換を行い、前記変換後のデータは、誤りを発生させた機械語コードであることとしてもよい。
【０１１９】
これにより、ソースプログラムをコンパイルすると同時に実行可能プログラムに誤りを発生させることができる為、その誤りに意味ある情報を含ませて、耐タンパ実行システムにその情報を伝えることが出来るようになる。また、実行可能プログラムに誤りが発生しているため、本発明に係る耐タンパ実行システム以外の通常の実行システムでは実行できないという利点がある。
【図面の簡単な説明】
【図１】本発明の実施形態１に係るシステム及びその機能ブロックの概略図である。
【図２】耐タンパ実行システム９０００の処理を表すフローである。
【図３】誤り訂正符号を作成する為のコンパイラの機能ブロック図である。
【図４】本発明の実施形態１に係るローディングシステム１０００の機能ブロック図である。
【図５】本発明の実施形態１に係るプログラム実行システムの機能ブロック図である。
【図６】誤り発生情報の構成及び内容例を示す。
【図７】誤り位置情報の構成例及び内容例を示す。
【図８】耐タンパ実行システムの入力データの構成例である。
【図９】実行コード部と誤り訂正符号部の関係を表す図である。
【図１０】コンパイラの処理を示すフローチャートである。
【図１１】誤り発生部の処理のフローチャートである。
【図１２】プログラム実行システムの処理のフローチャートである。
【図１３】誤りに意味を持たせる場合のシステム及びその機能ブロック図の概略図である。
【図１４】誤りを収集する場合の誤り訂正部の処理を示すフローチャートである。
【図１５】誤り訂正符号作成ツールの機能ブロック図である。
【図１６】誤り発生可能領域の全領域に誤りを発生させた場合のプログラム実行システムの機能ブロック図である。
【図１７】耐タンパシステムで必要とするデータがそれぞれ別に存在する例である。
【図１８】データブロックと誤り訂正符号の配置例である。
【図１９】データブロック中のＯＰコードに誤りを発生させた場合のプログラム実行システムの処理フローである。
【図２０】本発明の実施形態２に係るシステム及びその機能ブロックの概略図である。
【図２１】本発明の実施形態２に係るローディングシステム５０００の機能ブロック図である。
【図２２】誤り発生情報を決定する為の情報の構成及び内容例を示す。
【図２３】誤り発生情報決定部の処理を示すフローチャートである。
【符号の説明】
１０００  ５０００  ７１００  ローディングシステム
１１００  ５１００    データ読込部
１１１０    実行可能プログラム読込部
１１２０    誤り発生情報読込部
１２００  ５２００    データ変換部
１２１０    誤り発生部
１３００  ５３００    データ書出部
１３１０    変換後プログラム書出部
１８００  ２３００  ７３００      メモリ
１８１０    実行可能プログラム
１８２０    誤り発生情報
１８２５  １８３０    誤り訂正符号
１９００  ７４００    メインメモリ
１９１０  ７４００    変換後プログラム
２０００  ２００１  ７２００    コンパイラ
２０１０    ソースプログラム
２１００    コンパイル部
２２００    誤り訂正符号作成部
２５００    実行可能プログラム
２５９０    誤り発生可能領域
２８００    誤り訂正符号作成ツール
３８２０    誤り位置情報
４０００  ４５００  ６０００    プログラム実行システム
４１００  ７６００    誤り訂正部
４２００    ＣＰＵ
４６００    誤り検出部
５３２０    誤り訂正符号書出部
５４００    誤り発生情報発生記憶部
５５００    誤り発生情報決定部
５６００    誤り発生情報を決定する為の情報記憶部
７０００  ９０００  ９５００    耐タンパ実行システム
【図１】
2004362077.tif 000003
【図２】
2004362077.tif 000004
【図３】
2004362077.tif 000005
【図４】
2004362077.tif 000006
【図５】
2004362077.tif 000007
【図６】
2004362077.tif 000008
【図７】
2004362077.tif 000009
【図８】
2004362077.tif 000010
【図９】
2004362077.tif 000011
【図１０】
2004362077.tif 000012
【図１１】
2004362077.tif 000013
【図１２】
2004362077.tif 000014
【図１３】
2004362077.tif 000015
【図１４】
2004362077.tif 000016
【図１５】
2004362077.tif 000017
【図１６】
2004362077.tif 000018
【図１７】
2004362077.tif 000019
【図１８】
2004362077.tif 000020
【図１９】
2004362077.tif 000021
【図２０】
2004362077.tif 000022
【図２１】
2004362077.tif 000023
【図２２】
2004362077.tif 000024
【図２３】
2004362077.tif 000025