(57)【特許請求の範囲】
【請求項１】
プログラムメモリ内のソフトウェアの完全性を保証するためのプロセッサにより実施される方法において、前記ソフトウェアは複数の暗号化された命令を含み、１つの命令は命令値及び少なくとも１つの演算コードを含み、前記方法は初期化された命令キーを使用する方法であって、
現行の暗号化された命令を読み込むステップと、
前記現行の暗号化された命令の少なくとも一部を解読するために前記命令キーを使用するステップと、
前記命令キーの現行値のダイジェスト及び前記現行命令のダイジェストに基づいて算出を使用して前記命令キーを更新するステップであって、その結果、読み込まれた前記次の暗号化される命令は前記更新された命令キーで解読することができるステップと、
前記現行命令を実行するステップと、
を含む方法。
【請求項２】
前記プログラムメモリ内の第１の命令が暗号化されていない請求項１に記載の方法。
【請求項３】
前記現行命令が認証タグを更に含み、前記認証タグは実行の前に前記命令を認証するために用いる請求項１又は２に記載の方法。
【請求項４】
変更が前記命令キーに対して行われ、前記変更によって、実行可能な命令を与えるために前記変更された命令キーを使用して前記次の暗号化された命令の解読が可能になる請求項１〜３のいずれか１項に記載の方法。
【請求項５】
前記現行命令が前記変更を達成する際に使われる変更値を更に含み、前記変更値は前記命令値から抽出され、そして前記命令キーを更新するステップに作用する請求項４に記載の方法。
【請求項６】
暗号化された命令を解読すること、前記命令キーを更新すること、前記現行命令を認証すること、又は前記現行命令を実行するプロセスのいずれか又は全部が、セキュリティ・モジュール内で実行される請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記ダイジェストが前記現行命令の全部又は一部に適用された関数の結果であり、前記関数は、論理関数、数学関数、暗号関数、又は一方向性関数から選択される請求項１〜６のいずれか１項に記載の方法。
【請求項８】
前記命令キーの前記更新が変更値に更に基づき、前記変更値は前記命令キーを公知の値にするために用いる請求項１〜７のいずれか１項に記載の方法。
【請求項９】
マスターキーが前記命令キーを初期化するために用いられる請求項１〜８のいずれか１項に記載の方法。
【請求項１０】
プログラム・カウンタ（ＰＣ）と、暗号化されたプログラムを格納するためのプログラムメモリ（ＰＭＥＭ）とを備える装置であって、前記暗号化されたプログラムは複数の暗号化された命令（ＩＮＳＴ′）を含み、前記命令は少なくとも１つの演算コードを含み、前記装置は解読モジュール（ＤＥＣＲ）及びデータ処理ユニット（ＳＣＰＵ）を更に備え、前記装置は初期化された命令キー（ＫＩ）にアクセスする装置において、前記命令キーの全部又は一部及び少なくとも１つの前に実行された命令のダイジェストに基づいて、前記命令キー（ＫＩ）を再帰的に更新する手段を更に備えることを特徴とする装置。
【請求項１１】
前記命令キーを再帰的に更新するための前記手段がハードウェアにおいて実現される請求項１０に記載の装置。
【請求項１２】
前記命令キーの前記更新が変更値に更に基づき、前記変更値は前記命令キーを周知の値にするために用いる請求項１０又は１１に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア保護の領域、より詳細にはソフトウェアの改ざんを防止して、ソフトウェアの完全性を保証するための装置及び手段に関する。
【背景技術】
【０００２】
安全なデータ処理の領域において、処理が安全な方法で行われうる改ざんに抵抗力がある環境を提供することが必要である。アプリケーション・セキュリティの問題に取り組む第１の方法は、その中にソフトウェアが収納されたハードウェアをできるだけ安全に生成しようと努力することに集中した。その時改ざん防止の概念は、この種のハードウェアを開くのが困難であるか、又は一旦開くと、安全なソフトウェアが存在するチップを破壊することを意味した。しかしながら、今日では、アプリケーション・セキュリティを達成するためのソフトウェア技術がより多くの柔軟性及び低いコストを提供して、実際、良好なアプリケーション・セキュリティが、ソフトウェアが改ざんされなかったことを保証することを意味するほとんどの場合に、ソフトウェア及びハードウェア方法の組合せが使われることが、一般的に認識されている。
【０００３】
アプリケーションが動作する典型的システムは、一般に、処理ユニット、複数の周辺機器、及びメモリを含む。セキュリティが必要とされるほとんどの場合に、暗号化方式が用いられる。この種の方式において、安全に保たれることを必要とする情報、即ち作業データ又は実行コードは暗号化される。暗号化は、通常、システムの一部を形成するセキュリティ・モジュール内で行われる。セキュリティ・モジュールは、様々な方法で、例えば、マイクロプロセッサ・カード、スマートカード、あるいはバッジ又はキーの形のいかなる電子モジュールでも実施することができる。これらのモジュールは、通常、持ち歩けて、レシーバーから着脱可能であり、そして改ざんされないように設計されている。一般に用いられる形は電気接点を有するが、ＩＳＯ１４４４３タイプのコンタクトレスのバージョンも存在する。
【０００４】
セキュリティ・モジュールの別の実施態様は、それがレシーバー内で直接はんだ付けされる所に存在し、これの変形は、ＳＩＭモジュールのようなソケット又はコネクタ上の回路である。更に別の実施態様は、別の機能を有するチップに、例えば、デスクランブル・モジュールに、又はデコーダーのマイクロプロセッサ・モジュールに集積化されたセキュリティ・モジュールを備えていることである。セキュリティ・モジュールはソフトウェアでも実施することができる。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】理学修士の学位論文「ソフトウェア保護のための改ざんに対する抵抗」、Ping Wang、２００５年
【発明の概要】
【発明が解決しようとする課題】
【０００６】
最新の安全な処理システムにおけるセキュリティ・モジュール及び高度な暗号化技術の使用にもかかわらず、この種のシステムは、依然として、セキュリティを破る試みにとってかなりの魅力を示している。この種のシステムのセキュリティを破るために用いた技術は、例えば、関係するハードウェアのリバース・エンジニアリングあるいはそこで使用するソフトウェアの動的又は静的分析及びこの種のソフトウェアによる次の改ざんを含む。静的分析によって、それはある種の非実行コードの逆アセンブリ又は逆コンパイルを意味する。動的分析によって、それは、即ちソフトウェアが動作している間に特定の信号を観察することによって、コードが動作している間の分析を意味する。この種の分析は改ざんにつながり、それによって、ソフトウェアは、例えば、分岐・ジャミング・アタックを実行することにより変更され、そこでは、現在の条件がこの種の実行を定めないときに、無条件のジャンプが条件つきのジャンプの代わりに導入されて、分岐に実行を強制する。一般的に、この種のアタックは、例えば認識番号又はパスワードの照合のような認証ステップをバイパスすることをプログラムに強制する。
【０００７】
非特許文献１において、ピン・ワン（Ping Wang）はマルチブロック暗号化の技術を記述しており、そこにおいて、ソフトウェア・プログラムはプログラムの流れに従って多くの独立ブロックに分けられている。プログラムの各ブロックは次に暗号化されて、各ブロックは異なる暗号化キーを有する。各ブロックの暗号化キーは、プログラムの流れに従った前のブロックのハッシュ値である。この技術は木状構造を有するプログラムにおいて機能し、そこではブロックが、１つのブロックが別のブロックにつながる階層方式で配置される。この技術において、実行される第１のブロックは平文でなければならない。解読ルーチンを呼び出すコードは各ブロック内に置かれて、動的な完全性検査を実施するプログラム・コントローラはプログラムの末端部に加えられる。敵対者がプログラムの一部を変えようとする場合は、プログラムの変更部分を含むブロックのハッシュ値は異なり、それで次のブロックは適切に解読されず、そしてプログラムはクラッシュする。
【０００８】
この方式には、各ブロックが従って２回読み込まれることを必要とするという欠点がある。それには、暗号化が命令ベースによる命令よりはむしろブロックベースのブロックで行われて、１つの解読キーが全ブロックにあてはまるという点で更なる欠点がある。これは、１つのキーの発見がソフトウェアの完全なブロックを攻撃されやすいままにしておくことを意味する。この設計で、定義上は、１つのブロックは１つのループの全体を含まなければならないので、最小限のブロックのサイズは１つのループを完全に含んでいる最も小さいブロックにより決定される。ループがなかった場合には、プログラムが1ブロックにつき１つの命令に減らされることが可能であったとしても、その方法を実施する際の結果として生じるオーバーヘッドによって、最終結果が実行のサイズ及び速度に関して扱いにくくなる。更にまた、人はあり得るアタックを想像することがあり得て、そこでは、変更がブロックに対して行われ、そして対応する変化がプログラム・コントローラに対して行われて、それがブロックに対して行われる変更に関して適当なハッシュ値を算出するという方法で変更を補償し、このことによりプログラムの認められた完全性を保存できる。
【０００９】
本発明は、実行コードが暗号化されたフォーマットの中に存在することを可能にし、暗号化は命令ベースによる命令で行われて、命令が２回読み込まれることが必要ではない。この方式は、暗号化キーはそれらがインターセプトされやすいかもしれない所には決して現れないという固有の利点を有するハードウェアにおいて完全に実現されることができる。ソフトウェア・オーバーヘッドがなく、従って実行の速度は非常に増大する。従来技術においては、次のブロックの暗号化キーは前のブロックの内容だけに依存していた。本発明において、暗号化キーは多くの前の暗号化キーの値の累算に依存できる。例えば、次の命令を解読するキーは、２つの前の命令のキーの累算と組み合わせた現行命令に基づくことがあり得る。
【課題を解決するための手段】
【００１０】
本発明は、ソフトウェアの分析及び前記ソフトウェアのその後の改ざんによって生じるセキュリティの問題を解決し、その一方で、解決案を達成するためにオーバーヘッドを最小化して、それを柔軟性があるものとし、多くのいろいろな構造タイプのソフトウェアを使用するシステムに適用できるようにすることを目的とする。これは、プログラムメモリ内のソフトウェアの完全性を保証するためのプロセッサにより実施される方法を使用して達成され、前記ソフトウェアは複数の暗号化された命令を含み、１つの命令は命令値及び少なくとも１つの演算コードを含み、前記方法は初期化された命令キーを使用して次のステップを含む：
現行の暗号化された命令を読み込むステップ、
現行の暗号化された命令を解読するために命令キーを使用するステップ、
読み込まれる次の暗号化された命令が更新された命令キーで解読されることができるように、命令キーの現行値及び現行命令のダイジェストに基づいて算出を使用して命令キーを更新するステップ、
現行命令を実行するステップ。
【００１１】
本発明は、構造が事実上必ずしも木状であるというわけではなく、そしてソフトウェアで、又は完全にハードウェアで実現されて、このことにより、解読された命令又は解読キーをインターセプトする第三者の可能性を排除できるプログラムに適用されることができる。
【００１２】
本発明は、添付の図面と関連して読まれるとき、好ましい実施形態についての以下の詳細な説明を参照することによって最も良く理解される。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態の簡略ブロック図である。
【図２】本発明の実施形態のフロー図である。
【図３】ソフトウェア・ジャンプ又は分岐が、どのように本発明の実施形態により処理されることができるか示している簡略ブロック図である。
【発明を実施するための形態】
【００１４】
上記したように、本発明は、安全な方法でソフトウェアを実行するための手段を提供することを目的とし、それによって、ソフトウェアは暗号化された形でメモリに格納されて、モニタされる可能性を避けて、セキュア・プロセッサ内で命令ベースによる命令で解読され、実行される。現行命令の解読のキーは適切に復号化されていた少なくとも１つの前の命令に依存し、その一方で、次の命令の解読のキーは現行命令の正しい解読に依存する。このようにして、ソフトウェアの完全性を保証するための自己チェック手段は達成される。１つの命令になされる変更が次の命令を解読する能力を無効にして、プログラムの早い終了、又は少なくともプログラム実行トレースの破損になるので、単なる成功したソフトウェアの実行は、流れも内容も改ざんされなかったという保証である。本発明において使用する方式はソフトウェアで実現されることができるが、それがハードウェアで完全に実現され、それによって、平文の命令をインターセプトするか、又は関係する解読キーのいずれかをインターセプトする第三者の可能性を排除できる点に留意する必要がある。本発明は、最新技術の解決策と比較して、ほとんどオーバーヘッドをもたらさない。この方式は、ジャンプ及びブレークを有するそれらを含むさまざまな異なるアーキテクチャ又は構造のソフトウェアに適用されることができて、ツリー構造として公知の構造に限定されない。
【００１５】
本発明は従って、少なくとも、暗号化されたプログラム命令（ＩＮＳＴＰ′、ＩＮＳＴＣ′、ＩＮＳＴＦ′）を保持するプログラムメモリと、前記プログラム命令を解読する解読モジュール（ＤＥＣＲ）と、解読されたプログラム命令（ＩＮＳＴＰ、ＩＮＳＴＣ、ＩＮＳＴＦ）を実行するデータ処理ユニット（ＳＣＰＵ）と、暗号化されたプログラム命令を解読するための、命令キー（ＫＰ、ＫＣ、ＫＦ）として公知である、解読キーを構築する手段とを備えるシステムにおいて、改ざん防止ソフトウェア実行を保証する方法を提供する。命令キーを構築するための手段は、もちろんデータ処理ユニット内にあってもよい。解読モジュール及びデータ処理ユニットは、最新技術において周知であるタイプのいずれかのセキュリティ・モジュール内にあることが好ましい。
【００１６】
暗号化されたプログラムの実行中に、図１に示すように、現行の暗号化された命令（ＩＮＳＴＣ′）は、プログラム・メモリ（ＰＭＥＭ）から読み込まれ、そして解読（ＤＥＣＲ）されて、一方では前の解読キー（ＫＣ）のダイジェスト及び他方では前に実行された命令（ＤＩＧ（ＩＮＳＴＲＰ））のダイジェストの組合せ（Ｆｎ）から構築される現行の解読キー（ＫＣ）を使用して現行命令（ＩＮＳＴＣ）を与える。「ダイジェスト」によって、オペランドの全部又は一部に適用されて、出力を生じるいかなる動作も意味する。ダイジェストが、オペランドで実行されるときに、オペランド自体に等しい出力を生じることができる点に注目する価値がある。本発明の一実施形態によれば、ダイジェストはオペランドに一方向性関数を含む。これは、後戻りして、前のキー又は前の命令を演繹する第三者によるいかなる試みも更に妨げることを可能にする。ハッシュ関数は、この種の一方向性関数の例（例えばＳＨＡ２、ＭＤ５）である。「組合せ」によって、それが論理的であるか算術的であるか暗号かどうかにかかわらず、前述のオペランドの組合せのいかなる形も意味する。このように、現行の暗号化された命令がプログラムの作成者により意図された命令ではない場合は、現行の解読キー（ＫＣ）が、現行の暗号化された命令を解読するために用いるときに、ある他の意図されない値を生ずるので、プログラムの流れ及び内容は保証される。このようにして、我々は、ソフトウェアの完全性がその成功する実行だけによって保証されるので、それ自体を検査するソフトウェアを得る。ソフトウェアが改ざんされていた場合、それは実行するのに失敗する。
【００１７】
図２は、本発明の上記実施形態を表すフロー図を示す。この表示は、その現行の解読キーを有する現行命令及びその前のキーを有する前の命令などについて話をするよりはむしろ、本発明を時間におけるスナップショットの観点から記載し、それは、各命令が実行されるとき更新される命令キー（Ｋｌ）だけに関連する。いかなる処理ユニットにおいても正常であるように、実行される次の命令の位置を示すためにプログラム・カウンタ（ＰＣ）が用いられる。前記命令が単純な増加以外の更新の異なる形を指示する場合は、プログラム・カウンタは命令の実行の後に増加するか又は更新される。例えば、命令がレジスタから値をロードするコマンドを含む場合は、プログラム・カウンタは通常次の位置を示すために単に増加する。また一方、命令が特定の位置へのジャンプを含む場合は、プログラム・カウンタはジャンプにより示される位置の値により更新される。
【００１８】
プログラム・カウンタ（ＰＣ）及び命令キー（ＫＩ）は、最初に初期化される（ＩＮ  ＩＰＣ、ＩＮ  ＩＫｌ）。暗号化された命令は、プログラム・カウンタ（ＲＤＩＮＳＴ′ｃ．ｆ．ＰＣ）により示される位置でプログラムメモリから読み込まれ、そして命令キー（ＤＣＰＴＩＮＳＴ、Ｋｌ）を使用して解読される。命令は実行され（ＥＸ  ＩＮＳＴ）、そしてプログラム・カウンタは、命令により指図されるように、単純な増加によって、又は新しい値に置換することにより更新される（ＵＰＤ  ＰＣ）。命令キーは、実行された命令のダイジェストを使用して更新される（ＵＰＤ  Ｋｌ、ＩＮＳＴ）。従って、命令キーの更新では、ちょうど今実行された命令だけでなく、命令を解読するために用いたキーの値も考慮する。次に、前の命令を解読するために前に用いた命令キーは、前の命令及びそれの前に命令を解読するために用いた命令キーから構築された。このようにして、命令キーの値は、最後の実行された命令だけでなくて、組み合わさったすべての前に実行された命令にも依存する。実際に、本発明の実施形態において、命令キーの更新では、最後の実行された命令の値及び少なくとも２つの前の実行された命令の値を考慮する。例えば、命令４を解読するためのキーは、命令３のダイジェスト、命令２のダイジェスト、及び命令１のダイジェストの組み合わせであり得る。
【００１９】
図２に示すように、本発明の方法は、命令キーが前に実行された命令を使用して更新されるループを含む。これは、プログラムで第１の命令をどのようにして解読するかに関する質問につながる。前に実行された命令がない場合は、第１の命令キーはどのようにして算出されるか？  本発明の一実施形態では、他の全ての命令が暗号化されるのに対して、プログラムの第１の命令は平文のままである。第１の命令は従って直接実行され、それによりループを開始し、そして第２の命令は第１の命令その他に基づいて命令キーを使用して解読される。本発明の別の実施形態において、全プログラムは、第１の命令を含んで暗号化され、そして命令キーは第１の命令を解読する値を使用して初期化される。この値は、セキュリティ・モジュールに構築されるか、又は外部からセキュリティ・モジュールに伝えられるマスターキーであり得る。
【００２０】
プログラムの実行中に、現行のメモリ位置（Ｃ）にある現行命令（ＩＮＳＴＣ′）が、複数の前の命令（ＩＮＳＴＰ１、ＩＮＳＴＰ２）により参照されることができる状況が発生することがある。換言すれば、例えば、分岐タイプ命令（例えば、ジャンプ、分岐、又は呼び出しを含む）に出会うときに、現行命令又は呼ばれる側は複数の呼び出し側により参照されることができる。図３は、２つの呼び出し側（ｃ  ａｌｌｅｒ）（ＩＮＳＴＰ１、ＩＮＳＴＰ２）が１つの呼ばれる側（ｃaｌｌｅｅ）（ＩＮＳＴＣ）を参照するシナリオを例示する。この場合、命令キーのための２つの異なる値がいろいろな可能性がある履歴からみて可能であるので、これは、キーのうちどちらが暗号化された呼ばれる側を解読するために用いるかに依存して、２つの異なる結果を生じる。暗号化された呼ばれる側が１つのキーだけでしか暗号化されることができなかったので、これはもちろん望ましい状況ではない。この問題を回避するために、変更（ＣＯＲＲ１、ＣＯＲＲ２）が、呼ばれる側を正しく解読するために結果として生じる命令キーを必要な値にするよう強制するために、算出に対して行われる。例えば、位置Ｃにある呼ばれる側は、位置Ｐ１及びＰ２にある２つの異なる呼び出し側により参照される。位置Ｃ（ＩＮＳＴＣ′）にある暗号化された命令を適切に解読するために必要とする命令キーはＫＣＩＮである。しかしながら、Ｐ１（ＩＮＳＴＰ１）にある命令の実行に続く命令キーの値はＫＰ１ＯＵＴであり、そしてＰ２（ＩＮＳＴＰ２）にある命令の実行に続く命令キーの値はＫＰ２ＯＵＴである。更にまた、ＫＰ１ＯＵＴはＫＰ２ＯＵＴに等しくなくて、ＫＰ１ＯＵＴもＫＰ２ＯＵＴもＫＣＩＮに等しくないと仮定することが合理的である。従って、この方法は、分岐タイプの命令が実行されるときはいつでも、変更（ＣＯＲＲ１、ＣＯＲＲ２）がこのように行われて、命令キーの値を必要な値にすることができることを必要とする。呼ばれる側を解読するために必要であるキーの値が公知であり（即ちＫＣＩＮ）、そして呼び出し側の実行後のキーの値が公知であるので、各呼び出し側のための変更値を予測することは可能であり、そこにおいて、その変更値は、算出において使われるときに、命令キーを必要な値にする。適当な変更値は次に、このタイプの命令が使われるたびに命令キーに対して必要な変更を行うために、各分岐タイプで実施され、異なる変更が呼び出し側ごとになされる。本発明の実施形態によれば、変更値は、上記のように、前の解読キーと前の命令のダイジェストの組合せで更なるオペランドとして導入される。
【００２１】
上記の命令キーに対する変更がどのようになされるかの実施例として、我々はジャンプ命令を考慮する。本発明の好ましい実施形態において、ジャンプ命令は、通常のジャンプ命令の場合のように、宛先パラメータを含み、そして変更パラメータ、例えばＪＭＰ  Ｃ，＃ＣＯＲＲ１を更に含む。変更値（＃ＣＯＲＲ１）は、次に、前の命令キーと前の命令の全部又は一部との組合せで付加的なパラメータとして使われる。変更値を命令から抽出して、組合せステップにおいて、それをエクストラ・パラメータとして使用するよりはむしろ、ジャンプ命令のダイジェストが変更値をすでに考慮に入れることができる点に注意することは有用である。次の表１は、プログラムの実行が上記のタイプの変更されたジャンプ命令によって展開するときの、命令キーの状態を例示する。表は、命令を解読するために必要とするキーの値、並びに命令の実行及び新しいキーの算出の後のキーの値を含む。ラベル１で命令を解読するために必要とするキーの値が公知であるので、適当な訂正値ＣＯＲＲ１又はＣＯＲＲ２が、変更されない値Ｋ４又はＫ１４を必要な値Ｋ９１にするために算出されることができるという結果になる。
【００２２】
【表１】
0005616528.tif 000002
【００２３】
本発明の別の実施形態において、例えば、変更されたジャンプ命令を有する代わりに、標準ジャンプ命令が使われて、上記の命令キーに対する変更はパラメータとして変更値を有する専用「変更」命令により行われる。この種の変更命令の機能は、変更値に基づいて命令キーに直接作用することである。変更命令は分岐又はジャンプ・タイプの命令の直ぐ前に配置され、従って命令キーが呼ばれる側を適切に解読するために適切に更新されるのを可能にする。上記の通りの「変更」機能が、実際には、命令キーの値について所望の変更動作を実行するように設計されている複数の命令である点に注意することは有用である。例えば、呼ばれる側を適切に解読するために必要とされる命令キーの値が＃３９である場合は、ジャンプ命令を述べる直前に、変更値（ＣＯＲＲ１）を見つけるために＃３９を、そして新しい（訂正）ＫＩ値を与えるために次にＣＯＲＲ及びＫＩの追加を有する命令キー（ＫＩ）のＸＯＲがあり得る。
【００２４】
別の実施例として、呼ばれる側「ラベル１」の命令キーは値Ｋ９１を有する。プログラム・フローがいろいろな経路から届くことができるという事実のため、命令キーが予め定められた値Ｋ９０に更新されるように、訂正命令Ｉｎｓｔ＿ＣＯＲＲはジャンプの直前に加えられる。分岐タイプの命令（それはこの場合ジャンプである）の実行は、命令キーをＫ９０からＫ９１へ変更する。それが下記の表２において明らかであるように、訂正命令（Ｉｎｓｔ＿ＣＯＲＲ）と関連した訂正値（Ｃ１、Ｃ２）は、現行の命令キー（Ｋ３、Ｋ１３）を所定値Ｋ９０に変更することを意図する。結果として、ジャンプの実行は命令キーをＫ９０からＫ９１（呼ばれる側で命令を解読するために用いる値）（ラベル１）へ更新する。
【００２５】
例えば、命令が短い分岐ＢＲＡであるときに、分岐タイプの命令が異なる値を有する場合には、この命令によって生じるダイジェストはジャンプ命令によって生じるダイジェストとは異なる。結果として、分岐命令を実行することがジャンプ命令に関してと同じでない一方で、訂正命令Ｉｎｓｔ＿ＣＯＲＲにアタッチした訂正値Ｃ３は、違い及び命令キーを考慮する必要がある。しかしながら、訂正値Ｃ３により、短い分岐命令の実行の後の最終的な値はまだＫ９１である。
【００２６】
【表２】
0005616528.tif 000003
【００２７】
次の表３は、プログラムの実行が条件つきのジャンプ命令によって展開するときの、命令キーの状態を例示し、そこにおいて、２つの異なる宛先、ラベル１及びラベル２は、条件つきのジャンプの実行の後に可能である。この場合、両方の宛先で命令を解読するために必要とするキーは同じでなければならない。この表は、命令を解読するために必要とするキーの値並びに命令の実行及び新しいキーの算出の後のキーの値を含む。
【００２８】
【表３】
0005616528.tif 000004
【００２９】
１つの呼ばれる側が複数の呼び出し側により参照されることができる別の状況は、このように呼ばれる側を適切に解読するために命令キーになされる変更を必要として、関数呼出し又はサブルーチン呼び出しである。一般的に、この種の呼び出しの間、パラメータは呼び出しの間に渡され、このことにより関数又はサブルーチン内のいろいろな可能な流れの数、従って関数又はサブルーチンの実行後の可能な成果の数を増加させることができる。この種の呼び出しに出会うときに、その状態が関数又はサブルーチンの初めに公知であり得るように、変更が命令キーになされ、そして更なる変更は、呼び出しから戻ると、即ち関数又はサブルーチンから出てくる直前になされる。
【００３０】
本発明との関連で、上記の通りの変更はまた、１つのキーの別のキーによる置換えを伴うこともあり得る点に注意する価値がある。
【００３１】
データ処理技術に熟練した人々には公知のように、１つの命令は少なくとも１つの実行される演算を定める演算コードを含む。命令はこれのみを含んでもよいが、又は、その上で演算が実行されることになっている１つ又は複数のオペランドを更に含んでいてもよい。更に演算コード及び１つのオペランド又はそれらが存在する場合は複数のオペランドに関して、命令は、完全性指数としても知られる認証タグを含むことができ、それは命令の妥当性を点検する方法として使われる。従って、本発明の別の実施形態で、命令の実行の前に、命令は、上記の通りに認証タグを使用して最初に確認されることができる。認証タグは、チェックサムあるいは演算コード及びオペランドの全部又は一部のハッシュ値という形をとることができる。ほとんどの場合、認証タグは演算コードのシグネチャとみなされることができる。命令の全部又は一部を暗号化することにおいて、我々は、従って、演算コードだけ、又は認証タグを有する演算コードを暗号化するべきであるか、あるいはオペランドを同様に含むべきかどうかの選択に直面する。認証タグが潜在的アタッカーに演算コードがどんなものであるかの手掛かりを与えることができるので、上記のいかなる組合せも、しかしながら、プログラムの内容を第三者から隠すことが重要である場合に動作し、本発明は演算コード及び認証タグを暗号化する方を好む。本発明のこの実施形態において、使用する方法は、従って、現行の暗号化された命令を読み込むこと、命令キーを使用して、現行の暗号化された命令及び認証タグを解読すること、このようにして抽出した認証タグを確認すること、読み込まれる次の暗号化された命令が更新された命令キーで解読されることができるように、命令キー（又はそのダイジェスト）の現在の値及び現行命令のダイジェストに基づいた算出を使用して命令キーを更新すること、認証タグが有効であるとわかったという条件で現行命令を実行することを含む。認証タグが有効であるとわからない場合は、即ち適当な警報を発生させると共に、プログラムは優雅に終わるようにすることができる。
【００３２】
本発明が実施されうるいくつかの場合に、目的は、第三者がソフトウェアを複製できるのを防止することでは必ずしもなく、単にその第三者がこの種の変更が検出されずにソフトウェアを変更するのを防止するだけであるので、命令の演算コードが平文のままであり、そして認証タグだけが暗号化される本発明の一実施形態が存在する。これは、本発明によってもたらされるソフトウェア完全性を保証する目的を達成するのに十分である。同様に、別の実施形態で、オペランドが存在する場合には、それらだけを暗号化することが可能である。同じように、演算コード、オペランド、若しくは認証タグ、又は他のいかなるそれらの組み合わせのいずれかの暗号化は可能である。
【００３３】
同様に、本発明の実施形態で、演算コード及びオペランドを平文のままにしておいて、認証タグの部分だけを暗号化することは可能である。それからジャンプの場合、上記の通りに変更値を使用する代わりに、ジャンプ命令の後に認証タグのチェックを単に停止させることが可能である。この解決策の利点は、ジャンプ命令がその場合変更値を必要としないということである。
【００３４】
本発明は、従って、１つ又は複数の前の命令の全部又は一部に基づいてキーを使用してプログラムの各命令の全部又は一部を暗号化し、従って命令ごとに異なる暗号化キーをもたらすことによって、ソフトウェア・プログラムの完全性を保証する問題に対する解決策を提供する。本発明は、構造が事実上必ずしも木状ではないソフトウェア・プログラムに適用できて、プログラムがループ、ジャンプ、呼び出し、又はブレークなどを含むときにも適用できる。本発明では、暗号化された命令が誤って解読されるときに、例外が警告されることが可能である。命令キーが必要に応じて適切に初期化されることができるので、第１の命令は必ずしも平文である必要がない。本発明は、ソフトウェアで、又は完全にハードウェアにおいて実現されて、このことにより、解読された命令又は解読キーをインターセプトする第三者の可能性を排除できる。
【００３５】
命令の暗号化は、広範囲の暗号化アルゴリズムの１つ、例えば、ストリーム暗号、ブロック暗号、一度だけしか使わない暗号表、あるいはビット反転、ビットシフト、ビットスワッピング、パリティ・アルゴリズム、又は周期冗長コードのようなスクランブラを使用できる。
【図１】
0005616528.tif 000005
【図２】
0005616528.tif 000006
【図３】
0005616528.tif 000007