(57)【要約】【課題】  プログラム実行の際にメモリの内容が不正に改ざんされていないことを保証可能なマイクロプロセッサ、そのマイクロプロセッサを備えプログラムの実行証明が可能なノード端末、コンピュータシステム及びプログラム実行証明方法を提供する。【解決手段】  サーバ２０から送出されたプログラムを記憶する内部メモリ４２と、当該内部メモリ４２に記憶されたプログラムを実行するＣＰＵ４１と、前記プログラムの実行が終了した時点で、ＣＰＵ４１により実行されたプログラムに所定のハッシュ関数を演算するハッシュ値算出部１０３と、ノード１０に固有であり、秘密鍵記憶部１０５に記憶されている秘密鍵を用いて、ハッシュ関数が演算されたプログラム及び前記プログラムの実行結果にデジタル署名を行うデジタル署名実行部１０４と、を備える。【選択図】      図２
2006203564.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出可能なノード端末に備えられ、外部から直接アクセスすることができない耐タンパ性を有するマイクロプロセッサであって、
前記サーバ端末から送出されたプログラムを記憶する第１の記憶手段と、
当該第１の記憶手段に記憶されたプログラムを実行する処理手段と、
前記プログラムの実行が終了した時点で、前記処理手段により実行されたプログラムに所定の第１の一方向性関数を演算する第１の一方向性関数演算手段と、
前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶手段と、
前記秘密鍵記憶手段に記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラムと、前記処理手段から得られるプログラムの実行結果とにデジタル署名を行う署名実行手段と、
前記署名実行手段によりデジタル署名が行われたプログラムとプログラムの実行結果とを前記結果情報としてサーバ端末に送出する送出手段と、
を備えることを特徴とするマイクロプロセッサ。
【請求項２】
少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出可能なノード端末に備えられ、外部から直接アクセスすることができない耐タンパ性を有するマイクロプロセッサであって、
前記サーバ端末から送出されたプログラムを記憶する第１の記憶手段と、
当該第１の記憶手段に記憶されたプログラムを実行する処理手段と、
前記プログラムの実行が終了した時点で、前記処理手段により実行されたプログラムと当該プログラムの実行結果とに所定の第１の一方向性関数を演算する第１の一方向性関数演算手段と、
前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶手段と、
前記秘密鍵記憶手段に記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラムとプログラムの実行結果とにデジタル署名を行う署名実行手段と、
前記処理手段から得られるプログラムの実行結果並びに前記署名実行手段によりデジタル署名が行われたプログラムとプログラムの実行結果とを前記結果情報としてサーバ端末に送出する送出手段と、
を備えることを特徴とするマイクロプロセッサ。
【請求項３】
請求項１又は２に記載のマイクロプロセッサであって、
前記マイクロプロセッサは、前記ノード端末に備えられた第２の記憶手段と接続可能に構成され、少なくとも当該第２の記憶手段の予め指定されたアドレス範囲である保証領域との間でデータのやり取りが可能に構成されており、
前記第２の記憶手段の保証領域との間でデータのやり取りが可能な第３の記憶手段と、
所定の第２の一方向性関数を演算する際に用いる鍵を生成する鍵生成手段と、
前記第３の記憶手段から送出されたデータを受け取り、前記鍵生成手段により生成された鍵を用いて、前記第２の一方向性関数を当該データに演算した結果である関数値を算出する関数値算出手段と、
前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とを１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するデータ列生成手段と、
前記保証領域の指定されたアドレスに、前記データ列生成手段により生成されたデータ列を書き出す書き出し手段と、
前記保証領域の指定されたアドレスからデータ列を読み込む読み込み手段と、
前記読み込み手段により読み込まれたデータ列を共通鍵暗号方式を用いて復号化する復号化手段と、
前記読み込み手段により読み込まれ前記復号化手段により復号化されたデータ列に含まれる関数値と、前記関数値算出手段により算出された、前記読み込み手段により読み込まれたデータ列に含まれるデータの関数値とを比較し、それらが一致している場合に当該読み込まれたデータ列は改ざんされていないと判定する検証手段と、
をさらに備えることを特徴とするマイクロプロセッサ。
【請求項４】
乱数を生成する乱数生成手段をさらに備え、
前記鍵生成手段は、前記第３の記憶手段から送出されたデータが書き出される前記保証領域のアドレスを前記第３の記憶手段から受け取り、当該アドレスと前記乱数生成手段により生成された乱数とに基づいて、鍵を生成することを特徴とする請求項３記載のマイクロプロセッサ。
【請求項５】
前記書き出し手段が前記保証領域に書き出しを行った回数を前記保証領域のアドレス毎に数える第１のカウント手段をさらに備え、
前記データ列生成手段は、前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とに加え、前記第１のカウント手段により数えられた回数を１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するものであり、
前記書き出し手段が前記第２の記憶手段に書き出しを行った回数の総和を数える第２のカウント手段と、
前記プログラムの実行が終了した際に、前記読み込み手段が前記保証領域から読み込み、前記復号化手段が復号化したデータ列に含まれる、前記書き出し手段が前記保証領域に書き出しを行った回数を前記保証領域内のすべてのアドレスについて加算し、当該回数の総和を算出する第１のカウンタ値加算手段と、
前記第１のカウンタ値加算手段により算出された回数の総和と、前記第２のカウント手段により数えられた回数の総和とを比較し、それらが一致している場合に当該読み込まれたデータは改ざんされていないと判定する第１のカウンタ値検証手段と、
をさらに備えることを特徴とする請求項３乃至４のいずれかに記載のマイクロプロセッサ。
【請求項６】
前記書き出し手段がデータ列を書き出す際、当該書き出しの前に前記読み込み手段によるデータ列の読み込みが行われる構成とされており、
前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域のアドレス毎に数える第３のカウント手段をさらに備え、
前記データ列生成手段は、前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とに加え、前記第３のカウント手段により数えられた回数を１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するものであり、
前記読み込み手段が前記第２の記憶手段から読み込みを行った回数の総和を数える第４のカウント手段と、
前記プログラムの実行が終了した際に、前記読み込み手段が前記保証領域から読み込み、前記復号化手段が復号化したデータ列に含まれる、前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域内のすべてのアドレスについて加算し、当該回数の総和を算出する第２のカウンタ値加算手段と、
前記第２のカウンタ値加算手段により算出された回数の総和と、前記第２のカウント手段により数えられた回数の総和とを比較し、それらが一致している場合に当該読み込まれたデータは改ざんされていないと判定する第２のカウンタ値検証手段と、
をさらに備えることを特徴とする請求項３乃至４のいずれかに記載のマイクロプロセッサ。
【請求項７】
請求項１又は２に記載のマイクロプロセッサであって、
前記マイクロプロセッサは、前記ノード端末に備えられた第２の記憶手段と接続可能に構成され、少なくとも当該第２の記憶手段の予め指定されたアドレス範囲である保証領域との間でデータのやり取りが可能に構成されており、
前記保証領域との間でデータのやり取りが可能な第３の記憶手段と、
前記保証領域へ書き出されるデータ列の履歴情報を記憶する書き出し履歴記憶手段と、
前記保証領域から読み込まれるデータ列の履歴情報を記憶する読み込み履歴記憶手段と、
前記保証領域の指定されたアドレスからデータ列を読み込む読み込み手段と、
前記読み込み手段により読み込まれたデータ列を共通鍵暗号方式を用いて復号化する復号化手段と、
前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域のアドレス毎に数える第３のカウント手段と、
前記読み込み手段が前記保証領域から読み込みを行った回数の総和を数える第４のカウント手段と、
乱数を発生する乱数発生手段と、
前記復号化手段から受け取ったデータ列に含まれるデータ及び回数、並びに当該データ列が記憶されていたアドレスとに、前記乱数発生手段から受け取った乱数を鍵として所定の暗号化処理を施した暗号化データを生成するスクランブル関数演算手段と、
前記スクランブル関数演算手段から受け取った暗号化データと、前記読み込み履歴記憶手段から受け取った履歴情報との排他的論理和を計算し、当該計算結果を前記読み込み履歴記憶手段に記憶させる排他的論理和演算手段と、
書き出し処理が指示された場合には前記第３の記憶手段から送出されたデータであり、読み込み処理が指示された場合には前記保証領域から読み込まれたデータであるいずれか一方のデータと、前記第３のカウント手段から受け取った回数とを１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するデータ列生成手段と、
前記保証領域の指定されたアドレスに、前記データ列生成手段により生成されたデータ列を書き出す書き出し手段と、
をさらに備え、
前記書き出し手段がデータ列を書き出す際、当該書き出しの前に前記読み込み手段によるデータ列の読み込みが行われる構成とされており、
前記排他的論理和演算手段は、さらに、書き出し処理が指示された場合には前記第３の記憶手段から送出されたデータであり、読み込み処理が指示された場合には前記保証領域から読み込まれたデータであるいずれか一方のデータと、前記第３のカウント手段から受け取った回数と、当該データが記憶されていたあるいは書き出されるアドレスとに、前記スクランブル関数演算手段において暗号化処理が施された暗号化データと、前記書き出し履歴記憶手段から受け取った履歴情報との排他的論理和を計算し、当該計算結果を前記書き出し履歴記憶手段に記憶させる処理も行う構成とされ、
前記プログラムの実行が終了した際に、前記読み込み手段により前記保証領域内のアドレスからデータ列が読み込まれ、前記復号化手段により当該データ列の復号化が行われた後、前記スクランブル関数演算手段により、当該データ列に含まれるデータ及び回数と当該データ列が記憶されていたアドレスとに暗号化処理が施され、引き続き前記排他的論理和演算手段により前記読み込み履歴記憶手段の更新が行われると共に、前記第４のカウント手段に記憶されている回数の総和から前記回数が減算される処理が、前記保証領域内のすべてのアドレスについて行われるものであり、
前記マイクロプロセッサは、
前記前記第４のカウント手段に記憶されている回数の総和がゼロか否かを判定するカウンタ値判定手段と、
前記読み込み履歴記憶手段と書き出し履歴記憶手段の記憶内容が一致するか否かを判定する履歴比較手段と、
前記カウンタ値判定手段により前記回数の総和がゼロであると判定され、かつ前記履歴比較手段により前記読み込み履歴記憶手段と書き出し履歴記憶手段の記憶内容が一致すると判定された場合に、プログラム実行時に前記保証領域内に記憶されたデータ列は改ざんされていないと判定する判定手段と、
をさらに備えることを特徴とするマイクロプロセッサ。
【請求項８】
少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から送出されたプログラムを受け取り、当該プログラムを請求項１乃至７のいずれかに記載のマイクロプロセッサにより実行することを特徴とするノード端末。
【請求項９】
プログラムを送出し、当該プログラムの実行を指示するサーバ端末と、
前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出する少なくとも１台の請求項８記載のノード端末と、をネットワーク接続したコンピュータシステムであって、
前記サーバ端末は、
前記ノード端末に固有の秘密鍵に対応する公開鍵を記憶する公開鍵記憶手段と、
前記公開鍵記憶手段に記憶された公開鍵を用いて、前記ノード端末から受け取ったデジタル署名を検証し、前記結果情報から前記第１の一方向性関数演算手段の演算結果を抽出する署名検証手段と、
前記サーバ端末から送出したプログラムに前記第１の一方向性関数を演算する第２の一方向性関数演算手段と、
前記第２の一方向性関数演算手段の演算結果と、前記署名検証手段により抽出された演算結果とを比較し、それらが一致している場合に前記プログラムはノード端末において正常に実行されたと判定する比較手段と、
を備えることを特徴とするコンピュータシステム。
【請求項１０】
プログラムを送出し、当該プログラムの実行を指示するサーバ端末と、
前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出する少なくとも１台のノード端末と、をネットワーク接続したコンピュータシステムにおけるプログラム実行証明方法であって、
前記ノード端末は、
前記サーバ端末から送出されたプログラムを記憶する第１の記憶工程と、
当該第１の記憶工程により記憶されたプログラムを実行する処理工程と、
前記プログラムの実行が終了した時点で、前記処理工程により実行されたプログラムに所定の第１の一方向性関数を演算する第１の一方向性関数演算工程と、
前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶工程と、
前記ノード端末に固有のデジタル署名として、前記秘密鍵記憶工程により記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラム及び前記プログラムの実行結果の暗号化を行う暗号化工程と、
を備え、
前記サーバ端末は、
前記ノード端末に固有の秘密鍵に対応する公開鍵を記憶する公開鍵記憶工程と、
前記公開鍵記憶工程により記憶された公開鍵を用いて、前記ノード端末から受け取ったデジタル署名を検証し、前記第１の一方向性関数演算工程による演算結果を抽出する署名検証工程と、
前記サーバ端末から送出したプログラムに所定の第１の一方向性関数を演算する第２の一方向性関数演算工程と、
前記第２の一方向性関数演算工程による演算結果と、前記署名検証工程により抽出された演算結果とを比較し、それらが一致している場合に前記プログラムはノード端末において正常に実行されたと判定する比較工程と、
を備えることを特徴とするプログラム実行証明方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリの内容が不正に改ざんされていないことを保証可能なマイクロプロセッサ、並びにそのマイクロプロセッサを備えプログラムの実行証明が可能なノード端末、コンピュータシステム及びプログラム実行証明方法に関するものである。
【背景技術】
【０００２】
近年、ネットワークの発達により、複数のコンピュータを結んで１台のコンピュータのように利用するグリッドコンピューティングや、プログラム及びそのプログラムの実行状態を保持してコンピュータを移動することで処理を行うモバイルエージェント等が実現している。
【０００３】
グリッドコンピューティングは、計算量の大きな問題を解くための一つの方法である。あるコンピュータ（ジョブディスパッチサーバ、又は単にサーバという。）が問題を分割し、当該サーバは分割した問題を解くためのプログラムとデータを当該サーバにネットワーク接続された多数のコンピュータ（ノード）に渡す。ノードは受け取ったプログラムを実行し、実行結果をサーバに返す。このようなグリッドコンピューティングを用いたプロジェクトとして、seti@home, United Devices, Distribute.netなど、特にボランティアの参加者によるものが知られている。これらのプロジェクトにおいては、計算量に伴い報酬が与えられることが多いため、ノードが与えられたプログラムを正確に実行したことを保証あるいは証明することが重要である。
【０００４】
また、モバイルエージェントシステムにおいては、あるコンピュータ（エージェント）から送出されたプログラムは、ネットワーク接続されたコンピュータ（ホスト）を移動しながら実行される。正しい実行結果を得るためには、経由したホストで正しくプログラムが実行されたことを保証する必要がある。モバイルエージェントでのセキュリティは、悪意のあるエージェントからホストへの攻撃と、逆に、悪意のあるホストからエージェントへの攻撃の二つを防ぐ必要がある。
【０００５】
さらに、最近では、上記のグリッドコンピューティングやモバイルエージェントシステム以外にも、電子商取引、ソフトウェアやデジタルコンテンツなどのＤＲＭ（Digital Right Management）などが普及してきており、より一層信頼性の高いコンピュータセキュリティが求められている。現在、ほとんどのコンピュータセキュリティはソフトウェアのみで信頼性を確保しているが、プログラマが異なるアプリケーション毎にセキュリティのためのコードを入れたり、難読化処理を行ったりすることで信頼性を確保するには限界がある。また、ソフトウェアはオペレーティングシステム（ＯＳ）や他のプロセスなど、同じコンピュータ上で同時に実行されている悪意のあるソフトウェアからの攻撃に弱い。そこで、コンピュータセキュリティをソフトウェアだけでなく、ハードウェアとソフトウェア両面からサポートするトラステッドコンピューティング（Trusted Computing）という仕組みが考えられている。
【０００６】
このようなトラステッドコンピューティングにおいて、リモートコンピュータが正確にプログラムを実行したことを証明するために、プログラムが改ざんされていないことを保証する方法として、例えば非特許文献１には、「ＡＥＧＩＳ」という名称のアーキテクチャが開示されている。このＡＥＧＩＳにおいては、悪意のある攻撃に対応するため、特殊なハッシュ関数を用いることで、メモリの内容が改ざんされていないことを保証する構成とされている。
【非特許文献１】G. E. Suh, D. Clarke, B. Gassend, M. van Dijk, and S. Devadas, "AEGIS: Architecture for tamper-evident and tamper-resistant processing", Proc. of the 17th Int. Conference on Supercomputing, June 2003.
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、非特許文献１に係る技術においては、特殊なハッシュ関数を用い、メモリの内容が改ざんされていないことを保証することの実現性を数学的に論じているだけであり、具体的な構成が示されていない。また、このような特殊なハッシュ関数をハードウェアに実装することは、クリティカルパスが伸び、時間的にも、空間的にもオーバヘッドが大きいと考えられる。
【０００８】
本発明は、上記課題に鑑みてなされたものであり、プログラム実行の際にメモリの内容が不正に改ざんされていないことを保証可能なマイクロプロセッサ、そのマイクロプロセッサを備えプログラムの実行証明が可能なノード端末、コンピュータシステム及びプログラム実行証明方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
請求項１記載の発明は、少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出可能なノード端末に備えられ、外部から直接アクセスすることができない耐タンパ性を有するマイクロプロセッサであって、前記サーバ端末から送出されたプログラムを記憶する第１の記憶手段と、当該第１の記憶手段に記憶されたプログラムを実行する処理手段と、前記プログラムの実行が終了した時点で、前記処理手段により実行されたプログラムに所定の第１の一方向性関数を演算する第１の一方向性関数演算手段と、前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶手段と、前記秘密鍵記憶手段に記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラムと、前記処理手段から得られるプログラムの実行結果とにデジタル署名を行う署名実行手段と、前記署名実行手段によりデジタル署名が行われたプログラムとプログラムの実行結果とを前記結果情報としてサーバ端末に送出する送出手段と、を備えることを特徴とする。
【００１０】
この構成によれば、サーバから送出されたプログラムは、ノード端末のマイクロプロセッサ内に備えられた第１の記憶手段に記憶され、処理手段により実行されていく。そして、当該プログラムの実行が終了すると、第１の一方向性関数演算手段により、当該プログラムに所定の一方向性関数が演算される。ここで、一方向性関数とは、入力値が１ビットでも違えば出力値が大きく異なり、出力値から入力値を求めることが事実上不可能であるような関数のことである。さらに、署名実行手段により、一方向性関数が演算されたプログラムと当該プログラムの実行結果とに公開鍵暗号方式によるデジタル署名が行われ、送出手段によりサーバ端末に送出される。
【００１１】
したがって、サーバ端末においても同様に、送出前のプログラムに同じ一方向性関数を演算すれば、ノード端末で実行されたプログラムが確かにサーバ端末から送出されたものなのか否かの検証を行い得る。また、このデジタル署名は、プログラムとプログラムの実行結果とをまとめた全体に対して行ってもよいし、プログラムとプログラムの実行結果とに個別に行う構成であってもよい。ここで、秘密鍵記憶手段が記憶している秘密鍵はマイクロプロセッサの耐タンパ性により保護されており、他人に知られることはない。また、この秘密鍵に対応する公開鍵は、公開することでプログラムを送出したサーバ端末が知得することが可能である。
【００１２】
請求項２記載の発明は、少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出可能なノード端末に備えられ、外部から直接アクセスすることができない耐タンパ性を有するマイクロプロセッサであって、前記サーバ端末から送出されたプログラムを記憶する第１の記憶手段と、当該第１の記憶手段に記憶されたプログラムを実行する処理手段と、前記プログラムの実行が終了した時点で、前記処理手段により実行されたプログラムと当該プログラムの実行結果とに所定の第１の一方向性関数を演算する第１の一方向性関数演算手段と、前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶手段と、前記秘密鍵記憶手段に記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラムとプログラムの実行結果とにデジタル署名を行う署名実行手段と、前記処理手段から得られるプログラムの実行結果並びに前記署名実行手段によりデジタル署名が行われたプログラムとプログラムの実行結果とを前記結果情報としてサーバ端末に送出する送出手段と、を備えることを特徴とする。
【００１３】
この構成によれば、サーバから送出されたプログラムは、ノード端末のマイクロプロセッサ内に備えられた第１の記憶手段に記憶され、処理手段により実行されていく。そして、当該プログラムの実行が終了すると、当該プログラム及び当該プログラムの実行結果に、第１の一方向性関数演算手段により所定の一方向性関数が演算される。ここで、一方向性関数とは、入力値が１ビットでも違えば出力値が大きく異なり、出力値から入力値を求めることが事実上不可能であるような関数のことである。さらに、署名実行手段により、一方向性関数が演算されたプログラムとプログラムの実行結果とに公開鍵暗号方式によるデジタル署名が行われ、送出手段によりサーバ端末に送出される。
【００１４】
したがって、サーバ端末においても同様に、送出前のプログラムとノード端末から受け取ったプログラムの実行結果とに同じ一方向性関数を演算すれば、ノード端末で実行されたプログラムと実行結果とが確かにサーバ端末から送出されたものなのか否かの検証を行い得る。また、このデジタル署名は、プログラムとプログラムの実行結果とをまとめた全体に対して行ってもよいし、プログラムとプログラムの実行結果とに個別に行う構成であってもよい。さらに、送出手段は、処理手段から得られた、デジタル署名が行われていないプログラムの実行結果もサーバ端末に送出する。ここで、秘密鍵記憶手段が記憶している秘密鍵はマイクロプロセッサの耐タンパ性により保護されており、他人に知られることはない。また、この秘密鍵に対応する公開鍵は、公開することでプログラムを送出したサーバ端末が知得することが可能である。
【００１５】
請求項３記載の発明は、請求項１又は２に記載のマイクロプロセッサであって、前記マイクロプロセッサは、前記ノード端末に備えられた第２の記憶手段と接続可能に構成され、少なくとも当該第２の記憶手段の予め指定されたアドレス範囲である保証領域との間でデータのやり取りが可能に構成されており、前記第２の記憶手段の保証領域との間でデータのやり取りが可能な第３の記憶手段と、所定の第２の一方向性関数を演算する際に用いる鍵を生成する鍵生成手段と、前記第３の記憶手段から送出されたデータを受け取り、前記鍵生成手段により生成された鍵を用いて、前記第２の一方向性関数を当該データに演算した結果である関数値を算出する関数値算出手段と、前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とを１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するデータ列生成手段と、前記保証領域の指定されたアドレスに、前記データ列生成手段により生成されたデータ列を書き出す書き出し手段と、前記保証領域の指定されたアドレスからデータ列を読み込む読み込み手段と、前記読み込み手段により読み込まれたデータ列を共通鍵暗号方式を用いて復号化する復号化手段と、前記読み込み手段により読み込まれ前記復号化手段により復号化されたデータ列に含まれる関数値と、前記関数値算出手段により算出された、前記読み込み手段により読み込まれたデータ列に含まれるデータの関数値とを比較し、それらが一致している場合に当該読み込まれたデータ列は改ざんされていないと判定する検証手段と、をさらに備えることを特徴とする。
【００１６】
この構成によれば、耐タンパ性を有するマイクロプロセッサは、第２の記憶手段内の保証領域と接続可能に構成されている。ここで保証領域とは、当該領域に記憶されたデータが改ざんされていないことを保証すべき領域のことである。マイクロプロセッサは、さらに、第２の記憶手段の保証領域との間でデータのやり取りが可能な第３の記憶手段を備える。この第３の記憶手段は、第１の記憶手段を指すものであってもよいし、第１の記憶手段の空いているメモリ領域であってもよい。さらには、第１の記憶手段とは別個に設けられていてもよい。そして、保証領域に記憶されたデータが改ざんされていないことを証明するために、当該保証領域にはデータだけでなく、所定の第２の一方向性関数を当該データに演算する関数値算出手段により算出された当該データの関数値も記憶される。このデータ及び当該データの関数値はデータ列生成手段により１つにまとめられ暗号化された後、書き出し手段により保証領域に記憶される。
【００１７】
したがって、データ列の改ざんが行われると、当該データ列に含まれるデータだけではなく、関数値も書き換えられることになる。保証領域からの読み込みを行う際には、読み込み手段によりデータ列が読み込まれると、復号化手段により復号化された後、当該データ列に含まれる関数値が検証手段に送出される。検証手段は、さらに当該データ列に含まれるデータに第２の一方向性関数を演算した関数値を関数値算出手段から受け取り、これら２つの関数値の比較を行うことで、データが改ざんされているか否かの判定を行う。
【００１８】
請求項４記載の発明は、請求項３記載のマイクロプロセッサであって、乱数を生成する乱数生成手段をさらに備え、前記鍵生成手段は、前記第３の記憶手段から送出されたデータが書き出される前記保証領域のアドレスを前記第３の記憶手段から受け取り、当該アドレスと前記乱数生成手段により生成された乱数とに基づいて、鍵を生成することを特徴とする。
【００１９】
この構成によれば、鍵生成手段は、第３の記憶手段から送出されたデータが記憶される保証領域内のアドレスに応じた鍵を生成し、関数値算出手段に送出する。つまり、保証領域のアドレス毎に異なった鍵を用いて、関数値算出手段により関数値が算出される。したがって、同じデータ列であってもアドレスが異なれば鍵も異なることになるので、保証領域に書き出されたデータ列が不正に異なるアドレスに上書きされた場合には当該データ列に対する正当な鍵が得られない。したがって、読み込まれたデータ列に含まれる関数値と、読み込まれたデータ列に含まれるデータに対して新しい鍵を用いて算出された関数値とは一致せず、検証手段はデータ列が改ざんされていると判定する。
【００２０】
請求項５記載の発明は、請求項３乃至４のいずれかに記載のマイクロプロセッサであって、前記書き出し手段が前記保証領域に書き出しを行った回数を前記保証領域のアドレス毎に数える第１のカウント手段をさらに備え、前記データ列生成手段は、前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とに加え、前記第１のカウント手段により数えられた回数を１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するものであり、前記書き出し手段が前記第２の記憶手段に書き出しを行った回数の総和を数える第２のカウント手段と、前記プログラムの実行が終了した際に、前記読み込み手段が前記保証領域から読み込み、前記復号化手段が復号化したデータ列に含まれる、前記書き出し手段が前記保証領域に書き出しを行った回数を前記保証領域内のすべてのアドレスについて加算し、当該回数の総和を算出する第１のカウンタ値加算手段と、前記第１のカウンタ値加算手段により算出された回数の総和と、前記第２のカウント手段により数えられた回数の総和とを比較し、それらが一致している場合に当該読み込まれたデータは改ざんされていないと判定する第１のカウンタ値検証手段と、をさらに備えることを特徴とする。
【００２１】
この構成によれば、書き出し手段が保証領域に書き出した回数が、アドレス毎に第１のカウント手段により数えられている。そして、当該回数は、書き出し手段によりデータが保証領域に書き出される際に、データ列生成手段により、データ及び当該データの関数値と共に１つにまとめられ暗号化された後に書き出される。したがって、保証領域に記憶されているデータ列を改ざんすると、この回数も本来の値とは異なる値となる。そして、プログラムの実行が終了すると、第１のカウンタ値加算手段は、保証領域に記憶されている回数を保証領域内のすべてのアドレスについて加算し、その総和を算出する。また、それとは別に、書き出し手段が保証領域に書き出した回数の、すべてのアドレスについての総和が、第２のカウント手段により数えられている。第１のカウンタ値検証手段は、第１のカウンタ値加算手段から受け取った回数の総和と、第２のカウント手段から受け取った回数の総和とを比較し、それらが一致している場合にデータは改ざんされていないと判定する。
【００２２】
請求項６記載の発明は、請求項３乃至４のいずれかに記載のマイクロプロセッサであって、前記書き出し手段がデータ列を書き出す際、当該書き出しの前に前記読み込み手段によるデータ列の読み込みが行われる構成とされており、前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域のアドレス毎に数える第３のカウント手段をさらに備え、前記データ列生成手段は、前記第３の記憶手段から送出されたデータと、前記関数値算出手段により算出された当該データの関数値とに加え、前記第３のカウント手段により数えられた回数を１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するものであり、前記読み込み手段が前記保証領域から読み込みを行った回数の総和を数える第４のカウント手段と、前記プログラムの実行が終了した際に、前記読み込み手段が前記保証領域から読み込み、前記復号化手段が復号化したデータ列に含まれる、前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域内のすべてのアドレスについて加算し、当該回数の総和を算出する第２のカウンタ値加算手段と、前記第２のカウンタ値加算手段により算出された回数の総和と、前記第２のカウント手段により数えられた回数の総和とを比較し、それらが一致している場合に当該読み込まれたデータは改ざんされていないと判定する第２のカウンタ値検証手段と、をさらに備えることを特徴とする。
【００２３】
この構成によれば、読み込み手段が保証領域から読み込んだ回数が、アドレス毎に第３のカウント手段により数えられている。そして、当該回数は、読み込み手段によりデータが保証領域から読み込まれる際に、データ列生成手段により、データ及び当該データの関数値と共に１つにまとめられ暗号化された後に書き出される。したがって、保証領域に記憶されているデータ列を改ざんすると、この回数も本来の値とは異なる値となる。そして、プログラムの実行が終了すると、第２のカウンタ値加算手段は、保証領域に記憶されている回数を保証領域内のすべてのアドレスについて加算し、その総和を算出する。また、それとは別に、読み込み手段が保証領域から読み込んだ回数の、すべてのアドレスについての総和が、第４のカウント手段により数えられている。第２のカウンタ値検証手段は、第２のカウンタ値加算手段から受け取った回数の総和と、第４のカウント手段から受け取った回数の総和とを比較し、それらが一致している場合にデータは改ざんされていないと判定する。
【００２４】
請求項７記載の発明は、前記ノード端末に備えられた第２の記憶手段と接続可能に構成され、少なくとも当該第２の記憶手段の予め指定されたアドレス範囲である保証領域との間でデータのやり取りが可能に構成された請求項１又は２に記載のマイクロプロセッサであって、前記保証領域との間でデータのやり取りが可能な第３の記憶手段と、前記保証領域へ書き出されるデータ列の履歴情報を記憶する書き出し履歴記憶手段と、前記保証領域から読み込まれるデータ列の履歴情報を記憶する読み込み履歴記憶手段と、前記保証領域の指定されたアドレスからデータ列を読み込む読み込み手段と、前記読み込み手段により読み込まれたデータ列を共通鍵暗号方式を用いて復号化する復号化手段と、前記読み込み手段が前記保証領域から読み込みを行った回数を前記保証領域のアドレス毎に数える第３のカウント手段と、前記読み込み手段が前記保証領域から読み込みを行った回数の総和を数える第４のカウント手段と、乱数を発生する乱数発生手段と、前記復号化手段から受け取ったデータ列に含まれるデータ及び回数、並びに当該データ列が記憶されていたアドレスとに、前記乱数発生手段から受け取った乱数を鍵として所定の暗号化処理を施した暗号化データを生成するスクランブル関数演算手段と、前記スクランブル関数演算手段から受け取った暗号化データと、前記読み込み履歴記憶手段から受け取った履歴情報との排他的論理和を計算し、当該計算結果を前記読み込み履歴記憶手段に記憶させる排他的論理和演算手段と、書き出し処理が指示された場合には前記第３の記憶手段から送出されたデータであり、読み込み処理が指示された場合には前記保証領域から読み込まれたデータであるいずれか一方のデータと、前記第３のカウント手段から受け取った回数とを１つにまとめ、共通鍵暗号方式を用いて暗号化したデータ列を生成するデータ列生成手段と、前記保証領域の指定されたアドレスに、前記データ列生成手段により生成されたデータ列を書き出す書き出し手段と、をさらに備え、前記書き出し手段がデータ列を書き出す際、当該書き出しの前に前記読み込み手段によるデータ列の読み込みが行われる構成とされており、前記排他的論理和演算手段は、さらに、書き出し処理が指示された場合には前記第３の記憶手段から送出されたデータであり、読み込み処理が指示された場合には前記保証領域から読み込まれたデータであるいずれか一方のデータと、前記第３のカウント手段から受け取った回数と、当該データが記憶されていたあるいは書き出されるアドレスとに、前記スクランブル関数演算手段において暗号化処理が施された暗号化データと、前記書き出し履歴記憶手段から受け取った履歴情報との排他的論理和を計算し、当該計算結果を前記書き出し履歴記憶手段に記憶させる処理も行う構成とされ、前記プログラムの実行が終了した際に、前記読み込み手段により前記保証領域内のアドレスからデータ列が読み込まれ、前記復号化手段により当該データ列の復号化が行われた後、前記スクランブル関数演算手段により、当該データ列に含まれるデータ及び回数と当該データ列が記憶されていたアドレスとに暗号化処理が施され、引き続き前記排他的論理和演算手段により前記読み込み履歴記憶手段の更新が行われると共に、前記第４のカウント手段に記憶されている回数の総和から前記回数が減算される処理が、前記保証領域内のすべてのアドレスについて行われるものであり、前記マイクロプロセッサは、前記前記第４のカウント手段に記憶されている回数の総和がゼロか否かを判定するカウンタ値判定手段と、前記読み込み履歴記憶手段と書き出し履歴記憶手段の記憶内容が一致するか否かを判定する履歴比較手段と、前記カウンタ値判定手段により前記回数の総和がゼロであると判定され、かつ前記履歴比較手段により前記読み込み履歴記憶手段と書き出し履歴記憶手段の記憶内容が一致すると判定された場合に、プログラム実行時に前記保証領域内に記憶されたデータ列は改ざんされていないと判定する判定手段と、をさらに備えることを特徴とする。
【００２５】
請求項８記載の発明は、少なくとも１台のサーバ端末とネットワーク接続可能に構成され、前記サーバ端末から送出されたプログラムを受け取り、当該プログラムを請求項１乃至７のいずれかに記載のマイクロプロセッサにより実行することを特徴とするノード端末である。
【００２６】
この構成によれば、プログラム実行の際にメモリの内容が不正に改ざんされていないことを保証可能なマイクロプロセッサを備えたノード端末を実現し得る。
【００２７】
請求項９記載の発明は、プログラムを送出し、当該プログラムの実行を指示するサーバ端末と、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出する少なくとも１台の請求項８記載のノード端末と、をネットワーク接続したコンピュータシステムであって、前記サーバ端末は、前記ノード端末に固有の秘密鍵に対応する公開鍵を記憶する公開鍵記憶手段と、前記公開鍵記憶手段に記憶された公開鍵を用いて、前記ノード端末から受け取ったデジタル署名を検証し、前記結果情報から前記第１の一方向性関数演算手段の演算結果を抽出する署名検証手段と、前記サーバ端末から送出したプログラムに前記第１の一方向性関数を演算する第２の一方向性関数演算手段と、前記第２の一方向性関数演算手段の演算結果と、前記署名検証手段により抽出された演算結果とを比較し、それらが一致している場合に前記プログラムはノード端末において正常に実行されたと判定する比較手段と、を備えることを特徴とする。
【００２８】
この構成によれば、ノード端末においてプログラムが実行された後、当該プログラムに第１の一方向性関数を演算した結果及び当該プログラムの実行結果にデジタル署名が行われた結果がサーバ端末に送出される。サーバ端末は、ノード端末から結果情報を受け取ると、署名検証手段によりノード端末から受け取ったデジタル署名を検証する。その結果、確かに指定したノード端末のデジタル署名であると検証された場合には、署名検証手段は受け取った結果情報から第１の一方向性関数演算手段の演算結果、つまりノード端末において実行されたプログラムに第１の一方向性関数を演算した結果を抽出する。続いて、比較手段は、サーバ端末から送出したプログラムに第１の一方向性関数が演算された結果を第２の一方向性関数演算手段から受け取り、当該演算された結果と署名検証手段により抽出された結果とを比較する。そして、それらの結果が一致した場合は、比較手段はプログラムがノード端末において正常に実行されたと判定する。
【００２９】
請求項１０記載の発明は、プログラムを送出し、当該プログラムの実行を指示するサーバ端末と、前記サーバ端末から受け取ったプログラムを実行した後、少なくとも当該プログラムの実行結果を含む結果情報を前記サーバ端末に送出する少なくとも１台のノード端末と、をネットワーク接続したコンピュータシステムにおけるプログラム実行証明方法であって、前記ノード端末は、前記サーバ端末から送出されたプログラムを記憶する第１の記憶工程と、当該第１の記憶工程により記憶されたプログラムを実行する処理工程と、前記プログラムの実行が終了した時点で、前記処理工程により実行されたプログラムに所定の第１の一方向性関数を演算する第１の一方向性関数演算工程と、前記ノード端末に固有であり、公開鍵暗号方式で用いられる秘密鍵を記憶する秘密鍵記憶工程と、前記ノード端末に固有のデジタル署名として、前記秘密鍵記憶工程により記憶されている秘密鍵を用いて、前記第１の一方向性関数が演算されたプログラム及び前記プログラムの実行結果の暗号化を行う暗号化工程と、を備え、前記サーバ端末は、前記ノード端末に固有の秘密鍵に対応する公開鍵を記憶する公開鍵記憶工程と、前記公開鍵記憶工程により記憶された公開鍵を用いて、前記ノード端末から受け取ったデジタル署名を検証し、前記結果情報から前記第１の一方向性関数演算工程による演算結果を抽出する署名検証工程と、前記サーバ端末から送出したプログラムに第１の一方向性関数を演算する第２の一方向性関数演算工程と、前記第２の一方向性関数演算工程による演算結果と、前記署名検証工程により抽出された演算結果とを比較し、それらが一致している場合に前記プログラムはノード端末において正常に実行されたと判定する比較工程と、を備えることを特徴とする。
【発明の効果】
【００３０】
請求項１記載の発明によれば、マイクロプロセッサにおいて実行されたプログラム自体ではなく、当該プログラムに一方向性関数を演算した結果をサーバ端末に送出可能である。一方向性関数では、僅かな入力値の差が大きな差として出力されるため、サーバ端末においても同様に、送出前のプログラムに同じ一方向性関数を演算すれば、ノード端末で実行されたプログラムが確かにサーバ端末から送出されたものなのか否かの検証を容易に行うことができる。さらに、公開鍵暗号方式を用い、ノード端末に固有の秘密鍵を用いたデジタル署名を行うので、サーバ端末に公開鍵を安全に配送することが可能となる上に、プログラムが確かに指定したノード端末で実行されたことを証明することができる。
【００３１】
請求項２記載の発明によれば、マイクロプロセッサにおいて実行されたプログラム自体ではなく、当該プログラムと当該プログラムの実行結果とに一方向性関数を演算した結果をサーバ端末に送出可能である。一方向性関数では、僅かな入力値の差が大きな差として出力されるため、サーバ端末においても同様に、送出前のプログラムとノード端末から受け取ったプログラムの実行結果とに同じ一方向性関数を演算すれば、ノード端末で実行されたプログラムと実行結果とが確かにサーバ端末から送出されたものなのか否かの検証を容易に行うことができる。さらに、公開鍵暗号方式を用い、ノード端末に固有の秘密鍵を用いたデジタル署名を行うので、サーバ端末に公開鍵を安全に配送することが可能となる上に、プログラムが確かに指定したノード端末で実行されたことを証明することができる。
【００３２】
請求項３記載の発明によれば、マイクロプロセッサの外部に備えられている第２の記憶手段は耐タンパ性により保護されていないが、データだけではなく、当該データに所定の一方向性関数を演算した結果である関数値を付加して第２の記憶手段に記憶するために、この関数値を用いた比較を行うことで、データに改ざんが行われたか否かの検証を有効かつ確実に行うことができる。
【００３３】
請求項４記載の発明によれば、第２の記憶手段のあるアドレスに記憶されているデータ列を、異なるアドレスにそのまま上書きするような改ざんが行われた場合には、上書きされたデータ列は本来のアドレスとは異なるアドレスに記憶されているため、正当ではない鍵が生成される。そのため、読み込まれた当該データ列に含まれる関数値と、新しい鍵を用いて算出された関数値とは一致しないので、データの改ざんが行われたことを有効かつ確実に検証することができる。
【００３４】
請求項５記載の発明によれば、第２の記憶手段のあるアドレスに記憶されているデータ列を、当該アドレスに以前記憶されていたデータ列で上書きするような改ざんが行われた場合であっても、正当なデータ列と上書きされたデータ列とでは書き出し手段が第２の記憶手段に書き出した回数が異なるため、それらデータ列に含まれる回数が異なり、データ列の改ざんが行われたことを有効かつ確実に検証することができる。
【００３５】
請求項６記載の発明によれば、第２の記憶手段のあるアドレスに記憶されているデータ列を、当該アドレスに以前記憶されていたデータ列で上書きし、さらにプログラムの実行が終了する前に、さらに当該アドレスに正当なデータを上書きするような改ざんが行われた場合であっても、正当なデータ列と上書きされたデータ列とでは読み込み手段が第２の記憶手段から読み込んだ回数が異なるため、それらデータ列に含まれる回数が異なり、データの改ざんが行われたことを有効かつ確実に検証することができる。
【００３６】
請求項７記載の発明によれば、ハッシュ関数のような一方向性関数を演算し、第２の記憶手段に書き出すのではなく、共通鍵暗号方式を用いているため、高速に処理が行える上に、メモリ容量が節約できる。
【００３７】
請求項８記載の発明によれば、プログラム実行の際にメモリの内容が不正に改ざんされていないことを保証可能なマイクロプロセッサを備えていることで、プログラムの実行証明が可能なノード端末を実現することができる。
【００３８】
請求項９記載の発明によれば、サーバ端末から受け取った正当なプログラムを、確かにサーバ端末が指定したノード端末が正常に実行したことを証明することが可能なコンピュータシステムを実現できる。
【００３９】
請求項１０記載の発明によれば、サーバ端末とノード端末とをネットワーク接続したコンピュータシステムにおいて、サーバ端末から受け取った正当なプログラムを、確かにサーバ端末が指定したノード端末が正常に実行したことを証明することが可能となる。
【発明を実施するための最良の形態】
【００４０】
以下、本発明に係るコンピュータシステムの一実施形態について図面を参照しながら説明する。尚、各図において同一の符号を付した構成又は処理は、同一の構成又は処理であることを示し、その詳しい説明を省略する。
【００４１】
図１は、本発明の一実施形態に係るコンピュータシステムの概略構成図である。本コンピュータシステムは、ｎ台（ｎは整数）のコンピュータ（ノード）１０及びコンピュータ（サーバ）２０から構成される。ノード１０及びサーバ２０間は、１０ＢＡＳＥ−Ｔ又は１００ＢＡＳＥ−ＴＸ等の通信ケーブル３０により相互に通信可能に接続されている。ノード１０及びサーバ２０は、ＣＰＵ（中央演算装置）と、ＣＰＵの作業領域として用いられ種々のデータを一時的に記憶するＲＡＭ（Random Access Memory）と、ＢＩＯＳ（Basic Input Output System）等の制御プログラムを記憶するＲＯＭ（Read Only Memory）と、ハードディスクドライブ（ＨＤＤ）等から構成されている。
【００４２】
さらに、ノード１０及びサーバ２０は、オペレーティングシステム（ＯＳ）等を記憶する外部記憶装置と、フレキシブルディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等の記録媒体からデータを読み取る記録媒体駆動装置と、通信ボード等から構成されデータの送受信制御を行う通信Ｉ／Ｆ（インターフェイス）と、キーボード及びマウス等から構成される入力装置と、ＣＲＴ（陰極線管）、液晶パネル又はプラズマディスプレイ等から構成される表示装置と、を備えている。
【００４３】
グリッドコンピューティングにおいては、サーバ２０は問題を分割し、分割した問題を解くためのプログラム（ｐｒｏｇｒａｍ）とデータをサーバ２０にネットワーク接続された多数のノード１０に渡す機能を有する。また、モバイルエージェントシステムにおいては、サーバ２０がプログラムを送出するエージェントに相当し、ノード１０がプログラムをサーバ２０から受け取り実行するホストに相当する。尚、上記コンピュータシステムは一例にすぎず、あるノード１０及びサーバ２０間を、他のケーブルを用いて接続してもよいし、上記以外に、ＵＳＢや無線によって接続してもよい。
【００４４】
［プログラム実行の証明手順］
次に、本発明に係るプログラム実行の証明手順について、図面を参照しながら説明する。図２は、本発明の一実施形態に係るコンピュータシステムの機能ブロック図である。本実施形態においては、サーバ２０から送出されたプログラムをノード１０が実行し、実行したプログラム及び当該プログラムの実行結果を含む結果情報を再度サーバ２０に送出するようなグリッドコンピューティングの例について説明する。また、本実施形態においては、暗号化と復号化とで異なる鍵を用いる「公開鍵暗号方式」について説明するが、鍵が他人に秘匿されることなく配送できるのであれば「共通鍵暗号方式」を用いてもよい。公開鍵暗号方式としては、例えば、ＲＳＡや楕円曲線暗号等が挙げられる。
【００４５】
また、本発明の実施形態に係るＣＰＵは、耐タンパ性を有しているとする。耐タンパ性とは、外部から直接アクセスすることができず、秘密情報やその処理機構などを不当に観測、又は改ざんすることが極めて困難な性質である。例えば、回路が誤動作するまでクロック周波数を上げる攻撃に対応するためにクロック周波数の異常を検知したり、出荷時に検査用ＬＳＩパッドを除去したり、消費電力や処理時間の変動から内部情報が漏洩することを防ぐため、それらの変動を抑える工夫等が施されているものとする。耐タンパ性は、既にＩＣカードやＰＫＩ（Public Key Infrastructure）などで利用されている。以下の実施形態で用いるＣＰＵにおいても、耐タンパ性を利用することにより、デジタル署名で用いる秘密鍵を保護したり、プログラム実行の証明処理に対する観測や改ざんなどの攻撃を防いだりすることができるものとする。
【００４６】
まず、ノード１０は、通信制御部（送出手段）１０１、プログラム記憶部１０２、ハッシュ値算出部（第１の一方向性関数演算手段）１０３、デジタル署名実行部（署名実行手段）１０４、秘密鍵記憶部（秘密鍵記憶手段）１０５、デジタル署名記憶部１０６、プログラム実行部４０、及び制御部１１０を備えて構成される。通信制御部１０１は、例えば通信Ｉ／Ｆ（インターフェイス）から構成され、ノード１０とサーバ２０とのデータ等の送受信を担うノード１０側の機能部である。例えば、通信制御部１０１は、サーバ２０からプログラムを受け取ったり、当該プログラムの実行結果等にデジタル署名を行ったデータや、デジタル署名記憶部１０６に記憶されているデジタル署名をサーバ２０に送出したりする。
【００４７】
プログラム記憶部１０２は、例えばＲＯＭやＲＡＭ等の記憶装置から構成され、サーバ２０から送出されたプログラムを記憶する。ハッシュ値算出部１０３は、例えばＣＰＵやＲＡＭ等から構成され、所定のハッシュ関数（Ｈ）を用いて、プログラム実行部４０において実行されたプログラムのハッシュ値を算出する。ここで、ハッシュ関数Ｈとは、不定長の入力ｍから固定長の文字列（以下、ハッシュ値ｈという）を返す関数のことである。すなわち、ハッシュ値ｈは、ｈ＝ Ｈ（ｍ）と表される。このハッシュ関数は、一方向性関数であり、入力値が１ビットでも違えば出力値が大きく異なるため、例えハッシュ値ｈが与えられても、ｈ＝ Ｈ（ｘ）となるような入力ｘを見つけるのは計算上ではほぼ不可能であるという特徴を有する。このハッシュ関数としては、例えば、ＭＤ５、ＳＨＡ−１あるいはＨＭＡＣ等といったものが挙げられる。
【００４８】
プログラム実行部４０は、例えばＣＰＵやＲＡＭ等から構成され、サーバ２０から送出されたプログラムを実行する。その際、プログラム実行部４０全体が耐タンパ性を有するか、又はプログラム実行部４０全体が耐タンパ性を有しない場合には、サーバ２０から送出されたプログラムが正確に実行されたか否かを監視する機能部を有するものとする。
【００４９】
秘密鍵記憶部１０５は、例えばＲＯＭ等の記憶装置から構成され、公開鍵暗号方式における秘密鍵（ＳＫｐ）を記憶する。デジタル署名実行部１０４は、例えばＣＰＵやＲＡＭ等から構成され、秘密鍵記憶部１０５に記憶されている秘密鍵を用いて公開鍵暗号方式により、プログラム実行部４０において実行されたプログラム及びプログラム実行部４０から受け取った実行結果にデジタル署名を行う（デジタル署名を行った結果を、以下、｛Ｈ（ｐｒｏｇｒａｍ），Ｏｕｔ｝）SKpと表す。）。デジタル署名記憶部１０６は、例えばＲＯＭ等の記憶装置から構成され、秘密鍵ＳＫｐに対応する公開鍵（ＰＫｐ）、及び当該公開鍵ＰＫｐにＣＰＵ製造者固有の秘密鍵（ＳＫｍ）を用いてデジタル署名を行った結果｛ＰＫｐ｝SKmを記憶する。制御部１１０は、ノード１０内の前記各種機能部を制御して、所望の処理を行わせる。
【００５０】
次に、サーバ２０は、通信制御部２０１、プログラム記憶部２０２、ハッシュ値算出部２０３、ハッシュ値比較部２０４、デジタル署名検証部２０５、公開鍵記憶部２０６、及び制御部２１０を備えて構成される。通信制御部２０１は、例えば通信Ｉ／Ｆ（インターフェイス）から構成され、ノード１０とサーバ２０とのデータ等の送受信を担うサーバ２０側の機能部である。例えば、通信制御部２０１は、ノード１０へプログラムを送出したり、当該プログラムの実行結果等にデジタル署名が行われたデータや、デジタル署名記憶部１０６に記憶されているデジタル署名をノード１０から受け取ったりする。
【００５１】
プログラム記憶部２０２は、例えばＲＯＭやＲＡＭ等の記憶装置から構成され、ノード１０に実行させるためのプログラムを記憶する。このプログラムは、元のままで分割されていないプログラムであってもよいし、ノード１０に分割した問題を解かせるために所定の機能部により分割されたプログラムであってもよい。
【００５２】
ハッシュ値算出部２０３は、例えばＣＰＵやＲＡＭ等から構成され、ノード１０のハッシュ値算出部１０３において用いられるものと同じハッシュ関数を用いて、プログラム記憶部２０２に記憶されているプログラムのハッシュ値を算出する。
【００５３】
公開鍵記憶部２０６は、例えばＲＯＭ等の記憶装置から構成され、ＣＰＵ製造者固有の秘密鍵ＳＫｍに対応する公開鍵（ＰＫｍ）を記憶する。この公開鍵ＰＫｍは、予め信頼できる通信経路等を用いてノード１０から受け取ったものとする。デジタル署名検証部２０５は、例えばＣＰＵやＲＡＭ等から構成され、特定のノード１０から送出された実行結果等に、確かに当該ノード１０のデジタル署名が行われているか否かを検証する。ハッシュ値比較部２０４は、ハッシュ値算出部２０３において算出されたプログラムのハッシュ値と、サーバ２０から送出された後、プログラム実行部４０において実行されたプログラムのハッシュ値とを比較する。
【００５４】
制御部２１０は、サーバ２０内の前記各種機能部を制御して、所望の処理を行わせる。この図２においては、制御部１１０及び制御部２１０との間で制御信号等を送受信するためのラインは、図が煩雑になるため省略している。
【００５５】
図３は、本発明の一実施形態に係るコンピュータシステムの動作について説明するためのフローチャートである。まず、制御部２１０は、プログラム記憶部２０２に記憶されているプログラムを通信制御部２０１を介して、ノード１０に送出する（ステップＳ１０１）。サーバ２０から送出されたプログラムを通信制御部１０１を介して受け取ったノード１０は、当該プログラムをプログラム記憶部１０２に記憶する。続いて、制御部１１０は、当該プログラムをプログラム記憶部１０２からプログラム実行部４０へと送出させ、そこで当該プログラムを実行させる（ステップＳ１０２）。
【００５６】
続いて、制御部１１０は、プログラム実行部４０におけるプログラムの実行処理が終了すると、サーバ２０から送出されたプログラムがプログラム実行部４０において正しく実行されたか否かを判定する（ステップＳ１０３）。その結果、サーバ２０から送出されたプログラムがプログラム実行部４０において正しく実行されなかったと判定された場合には（ステップＳ１０３でＮＯ）、制御部１１０は攻撃者によるデータの改ざんが行われたと判定し（ステップＳ１１１）、処理を終了する。
【００５７】
それと異なり、サーバ２０から送出されたプログラムがプログラム実行部４０において正しく実行されたと判定された場合には（ステップＳ１０３でＹＥＳ）、制御部１１０はプログラム実行部４０において実行されたプログラムをハッシュ値算出部１０３へと送出させ、そこで当該プログラムのハッシュ値を算出させる（ステップＳ１０４）。続いて、制御部１１０は、デジタル署名実行部１０４を制御し、ハッシュ値算出部１０３において算出されたプログラムのハッシュ値と、プログラム実行部４０において実行されたプログラムの実行結果とにデジタル署名を行わせる（ステップＳ１０５）。このとき、デジタル署名実行部１０４は、秘密鍵記憶部１０５に記憶されている秘密鍵ＳＫｐを用いてデジタル署名を行う。
【００５８】
続いて、制御部１１０は、デジタル署名実行部１０４においてデジタル署名されたプログラムのハッシュ値と実行結果に加え、デジタル署名記憶部１０６に記憶されている、秘密鍵ＳＫｐに対応する公開鍵ＰＫｐ、及び当該公開鍵ＰＫｐにＣＰＵ製造者固有の秘密鍵ＳＫｍを用いてデジタル署名を行った結果｛ＰＫｐ｝SKmを、通信制御部１０１を介してサーバ２０に送出させる（ステップＳ１０６）。
【００５９】
通信制御部２０１を介して上記のデータを受け取ると、制御部２１０は当該データをデジタル署名検証部２０５に送出させ、そこでデジタル署名の検証を行わせる（ステップＳ１０７）。このとき、デジタル署名検証部２０５は公開鍵記憶部２０６に記憶されている公開鍵ＰＫｍを用いて検証を行う。具体的には、まず、デジタル署名検証部２０５は、公開鍵ＰＫｍにより｛ＰＫｐ｝SKmを検証する。続いて、検証されたＰＫｐにより｛Ｈ（ｐｒｏｇｒａｍ），Ｏｕｔ｝｝SKpを検証する。いずれかの検証の結果、当該プログラムの実行を指示したノード１０のデジタル署名ではないと判定された場合には、制御部２１０は攻撃者によるデータの改ざんが行われたと判定し（ステップＳ１１１）、処理を終了する。
【００６０】
それと異なり、検証の結果、当該プログラムの実行を指示したノード１０のデジタル署名であると判定された場合には、制御部２１０はプログラム記憶部２０２に記憶されているプログラムをハッシュ値算出部２０３に送出させ、そこで当該プログラムのハッシュ値を算出させる（ステップＳ１０８）。そして、ハッシュ値算出部２０３において算出されたハッシュ値と、ノード１０から送出されデジタル署名検証部２０５において検証されたプログラムのハッシュ値Ｈ（ｐｒｏｇｒａｍ）とが比較される（ステップＳ１０９）。その結果、ハッシュ値比較部２０４において、２つのハッシュ値が一致しないと判定された場合には（ステップＳ１０９でＮＯ）、制御部２１０は攻撃者によるデータの改ざんが行われたと判定し（ステップＳ１１１）、処理を終了する。
【００６１】
ハッシュ値比較部２０４において、２つのハッシュ値が一致すると判定された場合には（ステップＳ１０９でＹＥＳ）、上記と異なり、制御部２１０は、ノード１０に送出したプログラムが正しく実行され、かつ攻撃者によるデータの改ざんが行われていないと判定するため、ノード１０から受け取った実行結果（Ｏｕｔ）を採用して（ステップＳ１１０）、処理を正常終了する。
【００６２】
以上のプログラム実行証明の手順においては、ハッシュ値算出部１０３において算出されたプログラムのハッシュ値と、プログラム実行部４０からの実行結果とをまとめてデジタル署名を行うとして説明したが、本発明の実施形態はそれに限られることなく、デジタル署名実行部１０４は、プログラム実行部４０において実行されたプログラムと、プログラム実行部４０からの実行結果とをまとめたハッシュ値がハッシュ値算出部１０３において算出された後、デジタル署名を行う構成であってもよい。
【００６３】
この場合、プログラム実行部４０から得られるプログラムの実行結果をそのままの形式で通信制御部１０１を介してサーバ２０に送出し、それとは別に、デジタル署名が行われたプログラムとプログラムの実行結果とをサーバ２０に送出すればよい。そして、プログラム記憶部２０２に記憶されているプログラムとノード１０から受け取ったプログラムの実行結果とをハッシュ値算出部２０３に送出し、そこでハッシュ値を算出させる。それとは別にノード１０から受け取った、デジタル署名が行われたプログラムとプログラムの実行結果はデジタル署名検証部２０５において検証され、確かにノード１０から送出された結果情報であることが検証されると、ハッシュ値比較部２０４に送出される。このデジタル署名検証部２０５から送出されたハッシュ値と、ハッシュ値算出部２０３から送出されたハッシュ値とがハッシュ値比較部２０４において比較され、それらが一致した場合には、ノード１０においてプログラムが正しく実行されたことが証明される。
【００６４】
また、ハッシュ値算出部１０３は、プログラムと当該プログラムの実行結果とをまとめてハッシュ値を算出する構成であってもよいし、プログラムと当該プログラムの実行結果とで、個別にハッシュ値を算出する構成であってもよい。
【００６５】
さらに、以上のプログラム実行証明の手順においては、デジタル署名記憶部１０６を設け、そこに秘密鍵ＳＫｐに対応する公開鍵ＰＫｐ、及び当該公開鍵ＰＫｐにＣＰＵ製造者固有の秘密鍵ＳＫｍを用いてデジタル署名を行った結果｛ＰＫｐ｝SKmを記憶させることで、サーバ２０において２段階の検証を行うとして説明した。しかしながら、本発明の実施形態はそれに限られず、公開鍵記憶部２０６を設けず、サーバ２０の公開鍵記憶部２０６にＰＫｍではなくＰＫｐを記憶させ、デジタル署名実行部１０４でＳＫｐを用いて署名されたデータをデジタル署名検証部２０５において直接検証する構成であってもよい。
【００６６】
以下、プログラム実行部４０が耐タンパ性を持つ１チップで構成されている場合、及びプログラム実行部４０を構成する耐タンパ性ＣＰＵとメモリとが別のチップで構成されている場合のそれぞれにおいて、具体的な構成を示しながらプログラムの実行証明について説明していく。
【００６７】
［実施形態１］
まず、プログラム実行部４０を構成するＣＰＵとメモリとが耐タンパ性を持つ１チップで構成されている場合の実施形態について説明する。この場合は、攻撃者がメモリバスラインを監視することが不可能なので、メモリに対して外部から攻撃することはできない。そのため、メモリの内容を信頼することができる。この場合について、プログラムの実行証明を行うためのＣＰＵ及びメモリを備えるマイクロプロセッサの処理について説明する。また、本実施形態においては、さしあたりシングルタスクＯＳを前提とする。
【００６８】
図４は、実施形態１に係るプログラム実行部４０を詳細に示した機能ブロック図である。プログラム実行部４０は、同一チップ上に載ったＣＰＵ（処理手段）４１、内部メモリ（第１の記憶手段、第３の記憶手段）４２及びデジタル署名部４３を備えて構成されたマイクロプロセッサであり、耐タンパ性を有するものとする。内部メモリ４２には、例えばＯＳにより、サーバ２０から送出された実行証明命令列が展開され、さらに実行を要求されたプログラムが命令領域及びデータ領域に展開される。そして、当該プログラムの実行結果は出力領域に書き出される。また、デジタル署名部４３は、例えば図２におけるハッシュ値算出部１０３、デジタル署名実行部１０４及び秘密鍵記憶部１０５を備えて構成される機能部である。
【００６９】
図５は、図４に示した実行証明命令列の一実施形態を示す模式図である。また、図６は、ＣＰＵが有するモードの一実施形態を示す模式図である。多くのＣＰＵには、ユーザモード及び特権モードが用意されているが、本発明に係る実施形態においては、さらにプログラムの実行が正常に行われていることを監視する“セキュアモード”を用意する。
【００７０】
図５に示したように、ＣＰＵ４１は、プログラム実行の証明を要求し、セキュアモードに移行させる特殊命令［ｃｅｒｔｉｆｙ］を有する。この特殊命令［ｃｅｒｔｉｆｙ］は、オペランドで実行証明したいプログラムを展開するメモリのアドレス及び範囲を指定する。命令領域は実行証明命令列のあるアドレスからコードサイズ分であり、データ領域はデータアドレスからデータサイズ分である。そして、実行結果は、データ領域の終点アドレスから出力サイズ分の領域である出力領域に書き出される。
【００７１】
図４の実行証明命令列に含まれる［ｃｅｒｔｉｆｙ］命令が実行されると、ＣＰＵはセキュアモードに切り替わる（図３のステップＳ１０１）。そして、図４に示したプログラム実行部４０は、図３に示したステップＳ１０２の処理、つまりプログラムカウンタやアドレスバスを監視しながら、内部メモリ４２の命令領域に展開された処理を実行する。このとき、プログラム実行部４０を構成するＣＰＵ４１、内部メモリ４２及びデジタル署名部４３とはすべて同一チップ上に載っており、耐タンパ性を有しているため、プログラム実行の途中で外部の攻撃者による内部メモリ４２の内容の改ざん等が行われることはない。そのため、ステップＳ１０３においては、正しいプログラムを実行していることが保証されている。
【００７２】
続いて、証明の要求された命令領域の実行が終了すると、命令領域とデータ領域のプログラムはデジタル署名部４３内のハッシュ値算出部１０３に送出され、そこでハッシュ値が算出される（ステップＳ１０４）。次に、実行結果を含めてデジタル署名部４３内のデジタル署名実行部１０４においてデジタル署名が生成され（ステップＳ１０５）、セキュアモードが終了する。
【００７３】
上記の実施形態においては、シングルタスクＯＳを想定して説明したが、マルチタスクＯＳ上でプログラムを実行させる場合には、ＯＳはプロセス切り替えの際にレジスタの値をプロセス情報として退避させることが行われる。そのため、例えば、ウィルス等によって書き換えられた悪意のあるＯＳや他のプロセスは、プログラム実行証明処理中のプロセスの観測や改ざんが可能である。
【００７４】
この悪意のあるＯＳからの攻撃に対応するためには、例えば、ＣＰＵがアドレスバスを監視することでメモリ空間を保護することが考えられる。それ以外にも、例えば、ＯＳではなくＣＰＵがプロセスを切り替え、その切り替えの際に、プロセス情報をＣＰＵでしか復号できないように暗号化して当該情報を退避させることが考えられる。さらに、プロセス切り替えの前後で、レジスタの内容（コンテキスト）が改ざんされていないことを保証するために、暗号化するだけではなく、タイマ割り込み時にコンテキストをコピーしてＣＰＵ内部に保持し、戻ってきたときにコンテキストが改ざんされていないかを検証することなども可能である。
【００７５】
また、実行の証明を行いたいプログラムにおいてダイナミックリンクライブラリ（ＤＬＬ）が利用されている場合、予めコンピュータ上に用意された共有オブジェクトファイルとリンクされる。そのため、当該共有オブジェクトファイルに悪意があった場合、不正な処理を行う可能性がある。これを防ぐためには、共有オブジェクトも含めてハッシュ値を算出し、サーバ２０側でも同じ共有オブジェクトを保持して同様にハッシュ値を算出すればよい。ただし、様々な共有オブジェクトのバージョン管理等を行わなければならないので、コストが高くなる。コストを抑えるためには、ダイナミックリンクライブラリではなくスタティックリンクで配布することにより、プログラムサイズは大きくなるが、検証作業を容易に行うことができる。
【００７６】
以上説明したように本実施形態によれば、プログラム実行部４０において実行されたプログラム自体ではなく、当該プログラムにハッシュ関数（一方向性関数）を演算した結果をサーバ２０に送出可能である。ハッシュ関数では、僅かな入力値の差が大きな差として出力されるため、サーバ２０においても同様に、送出前のプログラムに同じハッシュ関数を演算すれば、ノード１０で実行されたプログラムが確かにサーバ２０から送出されたものなのか否かの検証を容易に行うことができる。さらに、公開鍵暗号方式を用い、ノード１０に固有の秘密鍵を用いたデジタル署名を行うので、サーバ２０に公開鍵を安全に配送することが可能となる上に、プログラムが確かに指定したノード１０で実行されたことを証明することができる。
【００７７】
［実施形態２］
前述の実施形態１においては、ＣＰＵとメモリとが同一チップ上に載っている場合について説明したが、実際のグリッドコンピューティングに参加するような現在のコンピュータは、ＣＰＵとメモリとが別のチップで構成されていることが多い。その場合、メモリバスを監視されてソフトウェア的な攻撃をされたり、それとは別にハードウェア的な攻撃をされたりすることが想定される。ハードウェア的な攻撃とは、例えば、メモリバスにメモリではなくメモリエミュレータを接続し、ＣＰＵとは独立にメモリの任意のアドレスを任意のタイミングで観測し、任意の値に改ざんすることなどである。そこで、本実施形態２及び以下の実施形態３〜６においては、ＣＰＵとメモリとが別のチップで構成されている、つまり、メモリ（外部メモリ）が攻撃される可能性がありそこに記憶されたデータが信頼できない場合に、プログラムの実行証明を行う例について説明する。
【００７８】
図７は、spoofing attackと呼ばれる攻撃を説明するための模式図である。ある時刻ｔ０において、ＣＰＵ（マイクロプロセッサ）５０はキャッシュメモリ（第１の記憶手段）７０に記憶された正当なデータＡを外部メモリ（第２の記憶手段）６０に書き出す。そして、ある時刻ｔ１において、攻撃者は外部メモリ６０に記憶されたデータＡを、同じアドレス上で偽データＸに書き換える。その後、ＣＰＵ５０が外部メモリ６０上の当該アドレスからデータを読み込むと、読み込まれたデータは正当なデータＡではなく改ざんされた後の偽データＸとなる。そのため、以後ＣＰＵ５０は誤った処理を行うこととなり、実行されたプログラムの実行結果も誤ったものとなる。これが、spoofing attackと呼ばれる攻撃である。
【００７９】
図８は、spoofing attackを防ぐためのプログラム実行部４０を詳細に示した機能ブロック図である。プログラム実行部４０は、ＣＰＵ５０と当該ＣＰＵ５０とは別チップ上に構成された外部メモリ６０とを備える。そして、ＣＰＵ５０は、キャッシュメモリ７０とプログラムが正常に実行されているかを監視する機能部である認証部８０、さらに図略のデジタル署名部４３とを備える。そして、このＣＰＵ５０は、耐タンパ性を有しているものとする。また、外部メモリ６０の所定のアドレスは、データの改ざん等が行われないことを保証すべき領域（以下、保証領域という）である。
【００８０】
ＭＡＣ値算出部（関数値算出手段）５０４は、キャッシュメモリ７０及び外部メモリ６０から読み込んだデータのハッシュ値（ＭＡＣ値）を、ＭＡＣ（Message Authentication Code）と呼ばれるハッシュ関数（第２の一方向性関数）を用いて算出する。このＭＡＣを用いる際には鍵が必要になるが、それは鍵記憶部（鍵生成手段の一形態）６０１に記憶されている。
【００８１】
データ列生成部（データ列生成手段及び書き出し手段）６０３は、キャッシュメモリ７０から読み込んだデータと、ＭＡＣ値算出部５０４により算出されたＭＡＣ値とを１つのデータ列にまとめ、共通鍵暗号方式を用いて暗号化した後、外部メモリ６０の保証領域内の所定アドレスに書き出す。データ列読み込み部（読み込み手段及び復号化手段）６０２は、外部メモリ６０の所定のアドレスからデータ列を読み込み、共通鍵暗号方式を用いて復号化した後、当該データ列に含まれるデータをＭＡＣ値算出部５０４に送出し、当該データ列に含まれるＭＡＣ値をＭＡＣ値検証部５０５に送出する。また、共通鍵暗号方式による暗号化及び復号化に必要な鍵は、図略の記憶手段に記憶されている。
【００８２】
ＭＡＣ値検証部（検証手段）５０５は、ＭＡＣ値算出部５０４においてデータ列読み込み部６０２が読み込んだデータから算出されたＭＡＣ値と、データ列読み込み部６０２が読み込んだデータ列に含まれるＭＡＣ値とを比較し、それらが一致したときに外部メモリ６０においてデータ列は改ざんされていないと判定する。つまり、この判定においては、データと当該データのＭＡＣ値とは一対一に対応しており、ＭＡＣ値が異なればその元となっているデータも異なるという事実を用いている。
【００８３】
また、データ列読み込み部６０２は、ＭＡＣ値検証部５０５において、外部メモリ６０から読み込まれたデータが改ざんされていないと判定されると、外部メモリ６０から読み込んだデータ列に含まれるデータをキャッシュメモリ７０に送出する。制御部５０１は、認証部８０に含まれる上記各機能部を制御し、所定の処理を行わせる。また、制御部５０１と認証部８０に含まれる上記各機能部とを結ぶ制御ライン等は、図が煩雑になるために省略する。
【００８４】
図９は、spoofing attackを防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。この図及び以下の実施形態を説明する際に用いるフローチャートは、前述の図３におけるステップＳ１０２及びＳ１０３の処理を詳細に示すものである。
【００８５】
まず、ノード１０のＣＰＵ５０においてプログラムが実行されているとき、キャッシュメモリ７０が溢れないかがチェックされている（ステップＳ２０１）。その結果、データが大きいためにキャッシュメモリ７０が溢れる場合には、キャッシュメモリ７０から認証部８０へデータが送出される（ステップＳ２０２）。ＭＡＣ値算出部５０４は、キャッシュメモリ７０から送出されたデータを受け取り、鍵記憶部６０１に記憶されている鍵を用いて、当該データのＭＡＣ値を算出する（ステップＳ２０３）。そして、ＭＡＣ値算出部５０４において算出されたＭＡＣ値はデータ列生成部６０３に送出される。
【００８６】
データ列生成部６０３は、キャッシュメモリ７０から受け取ったデータと、ＭＡＣ値算出部５０４から受け取ったＭＡＣ値とを１つのデータ列にまとめ暗号化した後、外部メモリ６０の保証領域内の所定アドレスに書き出す（ステップＳ２０４）。これが、図７の時刻ｔ０における書き出し処理に相当する。
【００８７】
その後、ある時刻ｔ２において、データ列読み込み部６０２は時刻ｔ０において書き出されたデータ列を外部メモリ６０から読み込む（ステップＳ２０５）。データ列読み込み部６０２は、当該データ列に含まれるデータをＭＡＣ値算出部５０４へ送出し、当該データ列に含まれるＭＡＣ値をＭＡＣ値検証部５０５へ送出する。ＭＡＣ値算出部５０４は、鍵記憶部６０１に記憶されている鍵を用いて、データ列読み込み部６０２から受け取ったデータのＭＡＣ値を算出する（ステップＳ２０６）。
【００８８】
ＭＡＣ値検証部５０５は、データ列読み込み部６０２から受け取ったＭＡＣ値と、ＭＡＣ値算出部５０４から受け取ったＭＡＣ値とを比較する（ステップＳ２０７）。その結果、ＭＡＣ値が一致している（ステップＳ２０７でＹＥＳ）と、ＭＡＣ値検証部５０５は外部メモリ６０においてデータ列の改ざんが行われていないと判定し、制御部５０１に通知する。制御部５０１は、ＭＡＣ値検証部５０５からの通知に基づき、データ列読み込み部６０２からデータをキャッシュメモリ７０に送出させる（ステップＳ２０８）。それとは異なり、ＭＡＣ値が一致していない（ステップＳ２０７でＮＯ）と、ＭＡＣ値検証部５０５は外部メモリ６０においてデータ列の改ざんが行われていると判定する（ステップＳ２０９）。この場合、例えば、プログラムの実行を終了し、ノード１０からサーバ２０に対してその旨を通知するなどすることができる。
【００８９】
以上説明したように本実施形態によれば、ＣＰＵ５０の外部に備えられている外部メモリ６０は耐タンパ性により保護されていないが、データだけではなく、当該データに所定の一方向性関数（ハッシュ関数）を演算した結果であるＭＡＣ値を付加して外部メモリ６０に記憶するために、このＭＡＣ値の比較を行うことで、データに改ざんが行われたか否かの検証を有効かつ確実に行うことができる。
【００９０】
［実施形態３］
図１０は、splicing attackと呼ばれる攻撃を説明するための模式図である。ある時刻ｔ０において、ＣＰＵ５０はキャッシュメモリ７０に記憶された正当なデータＡを外部メモリ６０に書き出す。そして、ある時刻ｔ１において、攻撃者は外部メモリ６０に記憶されたデータＡを、別のアドレスに上書きする。その後、時刻ｔ２において、ＣＰＵ５０が外部メモリ６０上の攻撃者が書き込んだデータを読み込んだ場合、読み込まれたデータに例えデータのＭＡＣ値が付加されているとしても、当該ＭＡＣ値は正しいのでＣＰＵ５０はデータの改ざんが行われたことを検知することができない。そのため、以後ＣＰＵ５０は誤った処理を行うこととなり、実行されたプログラムの実行結果も誤ったものとなる。これが、splicing attackと呼ばれる攻撃である。
【００９１】
図１１は、splicing attackを防ぐためのプログラム実行部４０を詳細に示した機能ブロック図である。この図においては、前述の実施形態２における図８のブロック図に加え、さらに乱数生成部（乱数生成手段）５０２及び鍵生成部（鍵生成手段の一形態）５０３を備えている。鍵生成部５０３は、外部メモリ６０上の、データを書き出すアドレスをキャッシュメモリ７０から受け取り、当該アドレスと、乱数生成部５０２とから受け取った乱数とに基づいて、ＭＡＣ値算出部５０４がＭＡＣ値を算出する際に用いる鍵を生成する。
【００９２】
図１２は、splicing attackを防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。まず、ノード１０のＣＰＵ５０においてプログラムが実行されているとき、キャッシュメモリ７０が溢れないかがチェックされている（ステップＳ２０１）。その結果、データが大きいためにキャッシュメモリ７０が溢れる場合には、キャッシュメモリ７０から認証部８０へデータ、及び当該データが書き出されるとして割り当てられている外部メモリ６０上のアドレスが認証部８０内の鍵生成部５０３へ送出される（ステップＳ３０１）。鍵生成部５０３は、キャッシュメモリ７０から受け取ったアドレスと、乱数生成部５０２とから受け取った乱数とに基づいて鍵を生成する（ステップＳ３０２）。以降は、前述の実施形態２において図９を用いて説明した処理と同様であるために説明を省略する。
【００９３】
以上説明したように本実施形態によれば、外部メモリ６０のあるアドレスに記憶されているデータ列を、異なるアドレスにそのまま上書きするような改ざんが行われた場合には、上書きされたデータ列は本来のアドレスとは異なるアドレスに記憶されているため、正当ではない鍵が生成される。そのため、読み込まれた当該データ列に含まれるＭＡＣ値と、新しい鍵を用いて算出されたＭＡＣ値とは一致しないので、データの改ざんが行われたことを有効かつ確実に検証することができる。また、本実施形態によれば、図１０に示したsplicing attackのみならず、図７に示したspoofing attackをも有効に防ぐことができる。
【００９４】
［実施形態４］
図１３は、再生攻撃（replay attack）と呼ばれる攻撃の一形態を説明するための模式図である。時刻ｔ０において、ＣＰＵ５０はキャッシュメモリ７０に記憶された正当なデータＡを外部メモリ６０に書き出す。攻撃者は、外部メモリ６０を観測し、書き出されたデータＡを記憶する。そして、ある時刻ｔ１において、ＣＰＵ５０はキャッシュメモリ７０に記憶された正当なデータＢを外部メモリ６０上の同じアドレスに上書きする。その後、ある時刻ｔ２において、攻撃者は外部メモリ６０に記憶されたデータＢを、同じアドレス上でデータＡに書き換える。
【００９５】
その後の時刻ｔ３において、ＣＰＵ５０が外部メモリ６０上の当該アドレスからデータを読み込むと、読み込まれたデータは正当なデータＢではなく改ざんされた（書き換えられた）後のデータＡとなる。しかしながら、同じアドレスであるためＭＡＣ値を算出する際に用いる鍵は同じである。そのため、正当なＭＡＣ値が算出されてしまい、データが改ざんされたことに気づかない。そのため、以後ＣＰＵ５０は誤った処理を行うこととなり、実行されたプログラムの実行結果も誤ったものとなる。これが、replay attackと呼ばれる攻撃の一形態である。
【００９６】
この形態のreplay attackを防ぐために、本実施形態においては外部メモリ６０の保証領域の各アドレスに書き出した回数を数えるためのカウンタと、ＣＰＵ全体が外部メモリ６０に書き出した回数を数えるカウンタとを備える。図１４は、本実施形態に係るreplay attackの一形態を防ぐためのプログラム実行部４０を詳細に示した機能ブロック図である。この図においては、前述の実施形態３における図１１のブロック図に加え、さらにＷｒｉｔｅカウンタ（以下、Ｗカウンタという）５０６、Ｇｌｏｂａｌ  Ｗｒｉｔｅカウンタ（以下、ＧＷカウンタという）５０７、カウンタ値加算部５０８及びカウンタ値検証部５０９を備えている。
【００９７】
Ｗカウンタ（第１のカウント手段）５０６は、外部メモリ６０のアドレス毎にＣＰＵ５０がデータを書き出した回数をカウントアップするための機能部であり、制御部５０１の制御により、データ列読み込み部６０４から受け取ったカウンタ値（以下、ＷＣ値という）に１を加算（カウントアップ）しデータ列生成部６０５に送出する。ＧＷカウンタ（第２のカウント手段）５０７は、レジスタ等を備え、ＣＰＵ全体で外部メモリ６０にデータを書き出した回数を数えるための機能部であり、制御部５０１の制御により、カウンタ値（以下、ＧＷＣ値という）に１を加算して記憶する。
【００９８】
カウンタ値加算部（第１のカウンタ値加算手段）５０８は、プログラムの実行が終了した場合に、外部メモリ６０の保証領域すべてのアドレスにデータが書き出された回数の総和を求め、カウンタ値検証部５０９に送出する。カウンタ値検証部（第１のカウンタ値検証手段）５０９は、カウンタ値加算部５０８から受け取ったカウンタ値の総和と、ＧＷカウンタ５０７から受け取ったＧＷＣ値とを比較し、それらが一致した場合には、外部メモリ６０においてデータ列の改ざんは行われていないと判定する。
【００９９】
また、本実施形態においては、ＭＡＣ値算出部６２０は、前述の実施形態２及び３とは異なり、データだけからＭＡＣ値を算出するのではなく、データとＷＣ値とを合わせたものからＭＡＣ値を算出する。さらに、データ列読み込み部６０４は、ＭＡＣ値算出部６２０にデータだけではなく、ＷＣ値も共に送出する。このデータ列読み込み部６０４は、また、Ｗカウンタ５０６にＷＣ値を送出する。そして、データ列生成部６０５は、データとＭＡＣ値だけではなく、さらにＷＣ値も含めたデータ列を生成する。
【０１００】
図１５及び図１６は、本実施形態に係るreplay attackの一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。まず、ＣＰＵ５０は、図３のステップＳ１０１においてセキュアモードに切り替わると、外部メモリ６０の保証領域の（データフィールド及びカウンタフィールドに書き出されている）データ及びＷＣ値をすべて初期化する。そのため、ＷＣ値はすべてのアドレスにおいて「０」であるとする。また、ＣＰＵ５０は、同時にＧＷカウンタ５０７のカウンタ値も初期化し、初期値「０」とする（ステップＳ４００）。
【０１０１】
この状態において、ノード１０のＣＰＵ５０においてプログラムが実行されているとき、キャッシュメモリ７０が溢れないかがチェックされている（ステップＳ２０１）。その結果、データが大きいためにキャッシュメモリ７０が溢れる場合には、まず、データ列読み込み部６０４は、当該データが書き出されるとして割り当てられている外部メモリ６０上のアドレスから、すでに記憶されているデータ列を読み込む（ステップＳ４０１）。
【０１０２】
そして、データ列読み込み部６０４は読み込んだデータ列からＷＣ値を取り出し、Ｗカウンタ５０６に送出する。そのＷＣ値を受け取ったＷカウンタ５０６は、当該ＷＣ値に１を加算し（ステップＳ４０２）、データ列生成部６０５に送出する。このとき、ＧＷカウンタ５０７も、自らが記憶しているＧＷＣ値に１を加算する。例えば、この時点で外部メモリ６０の当該アドレスから読み込んだデータ列から取り出されたＷＣ値が初期値「０」のままだとする。この場合、Ｗカウンタ５０６はＷＣ値を「０」から「１」にカウントアップして、データ列生成部６０５に送出する。ＧＷカウンタ５０７も同様に、自身のカウンタ値を「０」から「１」へカウントアップして記憶する。
【０１０３】
続いて、データ、及び当該データが書き出されるとして割り当てられている外部メモリ６０上のアドレスが認証部８０へ送出される（ステップＳ３０１）。そして、鍵生成部５０３は、当該アドレス及び乱数生成部５０２において生成された乱数を用いて鍵を生成する（ステップＳ３０２）。ＭＡＣ値算出部６２０は、鍵生成部５０３から受け取った鍵を用いて、キャッシュメモリ７０から受け取ったデータ及びＷカウンタ５０６から受け取ったＷＣ値をまとめたＭＡＣ値を算出し（ステップＳ４０３）、当該ＭＡＣ値をデータ列生成部６０５に送出する。ＭＡＣ値を受け取ったデータ列生成部６０５は、データ、ＷＣ値及びＭＡＣ値を１つのデータ列にまとめ暗号化した後、外部メモリ６０に書き出す（ステップＳ２０４）。引き続き、外部メモリ６０に書き出すデータがある場合（ステップＳ４０４でＹＥＳ）には、ステップＳ２０１に戻り、以上と同様の処理を繰り返す。
【０１０４】
ここまでの書き出しの処理が、図１３の時刻ｔ０及びｔ１における処理に相当する。この２度目の書き出し処理のステップＳ４０２においては、Ｗカウンタ５０６はＷＣ値を「１」から「２」にカウントアップして、データ列生成部６０５に送出する。ＧＷカウンタ５０７も同様に、自身のカウンタ値を「１」から「２」へカウントアップして記憶する。つまり、図１３の時刻ｔ０の時点で外部メモリ６０に書き出されたデータＡのＷＣ値は「１」であり、時刻ｔ１の時点で外部メモリ６０に書き出されたデータＢのＷＣ値は「２」である。
【０１０５】
その後、ある時刻ｔ３において、データ列読み込み部６０４は時刻ｔ０及びｔ１において書き出されたデータ列と同じアドレスからデータ列を読み込む（ステップＳ２０５）。データ列読み込み部６０４は、復号化の後、当該データ列に含まれるデータ及びＷＣ値をＭＡＣ値算出部６２０へ送出し、当該データ列に含まれるＭＡＣ値をＭＡＣ値検証部５０５へ送出する。ＭＡＣ値算出部６２０は、鍵生成部５０３から受け取った鍵を用いて、データ列読み込み部６０４から受け取ったデータ及びＷＣ値をまとめたＭＡＣ値を算出する（ステップＳ４０５）。
【０１０６】
ＭＡＣ値検証部５０５は、データ列読み込み部６０４から受け取ったＭＡＣ値と、ＭＡＣ値算出部６２０から受け取ったＭＡＣ値とを比較する（ステップＳ２０７）。その結果、ＭＡＣ値が一致していない（ステップＳ２０７でＮＯ）と、ＭＡＣ値検証部５０５は外部メモリ６０においてデータ列の改ざんが行われたと判定する（ステップＳ４１１）。それとは異なり、ＭＡＣ値が一致している（ステップＳ２０７でＹＥＳ）と、ＭＡＣ値検証部５０５は外部メモリ６０においてデータ列の改ざんが行われていないと判定し、制御部５０１に通知する。制御部５０１は、ＭＡＣ値検証部５０５からの通知に基づき、データ列読み込み部６０４からデータをキャッシュメモリ７０に送出させる（ステップＳ４０６）。
【０１０７】
その後、プログラムの実行が終了する（ステップＳ４０７でＹＥＳ）と、カウンタ値加算部５０８は、外部メモリ６０の保証領域のすべてのアドレスのデータ列を読み込み、そこに含まれるＷＣ値の総和を算出する（ステップＳ４０８）。そして、カウンタ値加算部５０８により算出されたＷＣ値の総和、及びＧＷカウンタ５０７に記憶されているＧＷＣ値が共に、カウンタ値検証部５０９に送出される。この送出されるＷＣ値は、プログラムの実行に使用されたアドレスが図１３に示したアドレスのみであるとすると、図１３における時刻ｔ１とｔ３の間の任意の時刻ｔ２において攻撃者による書き換えが行われなかった場合にはデータＢに含まれている値「２」であり、データＡへの書き換えが行われた場合には「１」となる。また、ＧＷカウンタ５０７に記憶されているＧＷＣ値は、いずれの場合も「２」である。
【０１０８】
したがって、カウンタ値検証部５０９は、ＷＣ値の総和とＧＷＣ値とを比較し、それらが一致している場合（上記の例では両者共に「２」）には（ステップＳ４０９でＹＥＳ）、データが改ざんされることなくプログラムが正常に実行されたと判定し処理を終了する（ステップＳ４１０）。それと異なり、ＷＣ値の総和とＧＷＣ値とが一致していない場合（上記の例ではＷＣ値の総和が「１」でＧＷＣ値が「２」）には（ステップＳ４０９でＮＯ）、外部メモリ６０においてデータが改ざんされたと判定し処理を終了する（ステップＳ４１１）。
【０１０９】
以上説明したように、本実施形態によれば、外部メモリ６０のあるアドレスに記憶されているデータ列を、当該アドレスに以前記憶されていたデータ列で上書きするような改ざんが行われた場合であっても、正当なデータ列と上書きされたデータ列とでは書き出し手段が外部メモリ６０に書き出した回数が異なるため、それらデータ列に含まれる回数が異なり、データ列の改ざんが行われたことを有効かつ確実に検証することができる。また、本実施形態によれば、図１３に示した形態のreplay attackのみならず、図７に示したspoofing attack、図１０に示したsplicing attackをも有効に防ぐことができる。
【０１１０】
［実施形態５］
図１７は、再生攻撃（replay attack）と呼ばれる攻撃の他の一形態を説明するための模式図である。ある時刻ｔ０において、ＣＰＵ５０はキャッシュメモリ７０に記憶された正当なデータＡを外部メモリ６０に書き出す。攻撃者は、外部メモリ６０を観測し、書き出されたデータＡを記憶する。そして、その後の時刻ｔ１において、ＣＰＵ５０はキャッシュメモリ７０に記憶された正当なデータＢを外部メモリ６０上の同じアドレスに上書きする。攻撃者は、さらに、外部メモリ６０を観測し、書き出されたデータＢを記憶する。そして、その後の時刻ｔ２において、攻撃者は外部メモリ６０に記憶されたデータＢを、同じアドレス上でデータＡに書き換える。その後の時刻ｔ３において、ＣＰＵ５０が外部メモリ６０上の当該アドレスからデータを読み込むと、読み込まれたデータは正当なデータＢではなく改ざんされた後のデータＡとなる。
【０１１１】
しかしながら、その後の時刻ｔ４において、攻撃者が外部メモリ６０に記憶されたデータＡを、同じアドレス上でデータＢに書き換え、その後の時刻ｔ５において、ＣＰＵ５０が外部メモリ６０上の当該アドレスからデータを読み込むと、そのデータは本来読み込まれるべきデータであるデータＢであるために、ＣＰＵ５０はプログラムの実行途中においてデータが改ざんされたことに気づかない。このように、replay attackと呼ばれる攻撃の他の一形態においては、ＣＰＵ５０は誤った処理を行い、実行されたプログラムの実行結果も誤ったものとなるが、その検出は困難である。
【０１１２】
この形態のreplay attackを防ぐために、本実施形態においては、前述の実施形態４におけるＷカウンタ５０６及びＧＷカウンタ５０７のように、ＣＰＵ５０が外部メモリ６０に書き出した回数を数えるのではなく、ＣＰＵ５０が外部メモリ６０から読み込んだ回数を数えるカウンタを備えている。本実施形態においては、キャッシュメモリ７０から外部メモリ６０への書き出し処理の場合も、まず、書き出し先である外部メモリ６０のアドレスからの読み込みを行う。したがって、Ｗカウンタ５０６が数えている、ＣＰＵ５０が外部メモリ６０から読み込んだ回数は、書き出し処理及び読み込み処理が行われた回数を表している。
【０１１３】
図１８は、本実施形態に係るreplay attackの一形態を防ぐためのプログラム実行部４０を詳細に示した機能ブロック図である。この図においては、前述の実施形態４におけるＷカウンタ５０６に換えてＷｒｉｔｅ／Ｒｅａｄカウンタ（以下、ＷＲカウンタという）６０８を備え、さらにＧＷカウンタ５０７に換えてＧｌｏｂａｌ  Ｗｒｉｔｅ／Ｒｅａｄカウンタ（以下、ＧＷＲカウンタという）６０９を備えている。これらＷＲカウンタ（第３のカウント手段）６０８及びＧＷＲカウンタ（第４のカウント手段）６０９で数えられるカウンタ値をそれぞれ、ＷＲＣ値及びＧＷＲＣ値とする。
【０１１４】
また、カウンタ値加算部（第２のカウンタ値加算手段）６１０は、プログラム実行の終了時に、外部メモリ６０の保証領域におけるＷＲＣ値の総和を算出するものとする。さらに、カウンタ値検証部（第２のカウンタ値検証手段）６１１は、カウンタ値加算部６１０から受け取ったＷＲＣ値の総和と、ＧＷＲカウンタ６０９から受け取ったＧＷＲＣ値とを比較し、それらが一致した場合には、外部メモリ６０においてデータ列の改ざんは行われていないと判定する。また、ＭＡＣ値算出部６２１及びデータ列読み込み部６０６へ入力される、あるいはＭＡＣ値算出部６２１及びデータ列読み込み部６０６から送出されるのも同様に、ＷＣ値ではなくＷＲＣ値であるとする。
【０１１５】
図１９及び図２０は、本実施形態に係るreplay attackの一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。基本的な流れは前述の実施形態４と同様であるが、本実施形態においては書き出し及び読み込み処理の回数を数える、つまりＷＣ値及びＧＷＣ値ではなくＷＲＣ値及びＧＷＲＣ値を数える構成となっている。そのため、ステップＳ５０１において、ＷＲカウンタ６０８がＷＲＣ値をカウントアップし、ＧＷＲカウンタ６０９がＧＷＲＣ値をカウントアップして記憶する構成となっていること、さらにステップＳ５５１及びＳ５５２において、データ及びＷＲＣ値のＭＡＣ値を算出する構成となっていることが異なる。ただし、書き出しの時点では前述の実施形態４との差はないために、初期値を実施形態４と同じとすれば、図１７の時刻ｔ０で書き出されたデータＡに含まれるＷＲＣ値は「１」であり、時刻ｔ１で書き出されたデータＢに含まれるＷＲＣ値は「２」である。また、ＧＷＲカウンタ６０９に記憶されているＧＷＲＣ値は「２」である。
【０１１６】
そして、図１７の時刻ｔ３における読み込み処理において、時刻ｔ１とｔ３の間の任意の時刻ｔ２において攻撃者による書き換えが行われなかった場合には、ステップＳ２０５においてデータ列読み込み部６０６により読み込まれたデータＢに含まれるＷＲＣ値「２」がＷＲカウンタ６０８によりカウントアップされ「３」となる。また、それと同時に、ＧＷＲカウンタ６０９に記憶されているＧＷＲＣ値も「２」から「３」へとカウントアップされる（ステップＳ５０２）。続いて、ＭＡＣ値算出部６２１は、データ列読み込み部６０６から受け取ったデータ及びＷＲカウンタ６０８から受け取ったＷＲＣ値のＭＡＣ値を算出し、データ列生成部６０７に送出する。データ列生成部６０７は、データ列読み込み部６０６から受け取ったデータ、ＷＲカウンタ６０８から受け取ったＷＲＣ値（「３」）及びＭＡＣ値算出部６２１から受け取ったＭＡＣ値をまとめて、時刻ｔ３において読み込みが行われたアドレスに書き出す（ステップＳ５０３）。
【０１１７】
それと異なり、図１７の時刻ｔ２において、攻撃者によりデータＡへの書き換えが行われた場合には、ステップＳ２０５においてデータ列読み込み部６０６により読み込まれたデータＡに含まれるＷＲＣ値「１」がＷＲカウンタ６０８によりカウントアップされ「２」となるが、ＧＷＲＣ値はその時点で記憶されている値「２」から「３」へとカウントアップされる（ステップＳ５０２）。つまり、攻撃者によるデータの改ざんが行われた場合には、この読み込みの時点でのＷＲカウンタ６０８とＧＷＲカウンタ６０９とのカウンタ値に差が生じることとなる。
【０１１８】
続いて、図１７の時刻ｔ２において攻撃者によるデータＡへの書き換えが行われ、さらに、時刻ｔ３とｔ５の間の任意の時刻ｔ４において攻撃者によりデータＢへの書き換えが行われた場合には、時刻ｔ５の読み込み処理（ステップＳ５０４でＹＥＳ）において、データＢに含まれるＷＲＣ値「２」がＷＲカウンタ６０８によりカウントアップされ「３」となる。また、それと同時に、ＧＷＲＣ値はその時点でＧＷＲカウンタ６０９に記憶されている値「３」から「４」へとカウントアップされる（ステップＳ５０２）。
【０１１９】
それと異なり、時刻ｔ２及びｔ４のいずれにおいても攻撃者によるデータの改ざんが行われていない場合には、時刻ｔ３においてＷＲＣ値はデータＢに含まれている値「２」から「３」へとカウントアップされ、さらに時刻ｔ５においてＷＲＣ値はデータＢに含まれている値「３」から「４」へとカウントアップされる。また、ＧＷＲカウンタ６０９に記憶されているＧＷＲＣ値は、時刻ｔ２及びｔ４においてデータの改ざんが行われたか否かに関わらず「４」である。
【０１２０】
したがって、プログラム実行が終了すると、カウンタ値加算部６１０は、外部メモリ６０の保証領域すべてのアドレスのＷＲＣ値の総和を求め、カウンタ値検証部６１１に送出する。カウンタ値検証部６１１は、カウンタ値加算部６１０から受け取ったＷＲＣ値の総和と、ＧＷＲカウンタ６０９から受け取ったＧＷＲＣ値とを比較し、それらが一致した場合（上記の例では両者共に「４」）には（ステップＳ４０９でＹＥＳ）、データが改ざんされることなくプログラムが正常に実行されたと判定し処理を終了する（ステップＳ４１０）。それと異なり、ＷＲＣ値の総和とＧＷＲＣ値とが一致していない場合（上記の例ではＷＲＣ値の総和が「３」でＧＷＲＣ値が「４」）には（ステップＳ４０９でＮＯ）、外部メモリ６０においてデータが改ざんされたと判定し処理を終了する（ステップＳ４１１）。
【０１２１】
以上説明したように、本実施形態によれば、外部メモリ６０のあるアドレスに記憶されているデータ列を、当該アドレスに以前記憶されていたデータ列で上書きし、さらにプログラムの実行が終了する前に、さらに当該アドレスに正当なデータを上書きするような改ざんが行われた場合であっても、正当なデータ列と上書きされたデータ列とでは読み込み手段が外部メモリ６０から読み込んだ回数が異なるため、それらデータ列に含まれる回数が異なり、データの改ざんが行われたことを有効かつ確実に検証することができる。また、本実施形態によれば、図１７に示した形態のreplay attackのみならず、図７に示したspoofing attack、図１０に示したsplicing attack、及び図１３に示した形態のreplay attackをも有効に防ぐことができる。
【０１２２】
［実施形態６］
以上説明したように実施形態５によれば、データとカウンタ値（ＷＲＣ値）とのＭＡＣ値を算出し、その値も外部メモリ６０内に記憶させる構成とすることで、図１７に示した形態のreplay attackのみならず、図７に示したspoofing attack、図１０に示したsplicing attack、及び図１３に示した形態のreplay attackをも有効に防ぐことを可能とした。以下に、このＭＡＣ値を外部メモリ６０内に記憶させることなく、上記の攻撃を有効に防ぐことが可能な他の実施形態について説明する。
【０１２３】
図２１は、本実施形態に係るプログラム実行部４０を詳細に示した機能ブロック図である。データ列読み込み部６３２は、外部メモリ６０の所定のアドレスからデータ列を読み込み、当該データ列に含まれるデータをキャッシュメモリ７０及びデータ列生成部６３６に送出し、当該データ列に含まれるカウンタ値（ＣＮＴ値）をＣＮＴカウンタ６３３に送出する。また、データ列読み込み部６３２は、当該データ列に含まれるデータ及びＣＮＴ値をスクランブル関数演算部６３０に送出する。
【０１２４】
ＣＮＴカウンタ（第３のカウント手段）６３３は、アドレス毎のカウンタであり、データ列読み込み部６３２からＣＮＴ値を受け取ると、その値に１を加算してデータ列生成部６３６及びスクランブル関数演算部６３０に送出する。つまり、ＣＮＴ値は、書き出し処理あるいは読み込み処理が行われる度に、処理が行われたアドレス毎に１だけカウントアップされる。また、認証部８０は、外部メモリ６０内の保証領域のすべてのアドレスについて、書き出し及び読み込み処理が行われた回数を数えるＧｌｏｂａｌ  ＣＮＴカウンタ（以下、ＧＣＮＴカウンタという）（第４のカウント手段）６３８を備える。
【０１２５】
データ列生成部６３６は、書き出し処理の際には、キャッシュメモリ７０から読み込んだデータと、ＣＮＴカウンタ６３３から受け取ったＣＮＴ値とを１つのデータ列にまとめ、外部メモリ６０の保証領域内の所定アドレスに書き出す。また、データ列生成部６３６は、読み込み処理の際には、データ列読み込み部６３２から受け取ったデータと、ＣＮＴカウンタ６３３から受け取ったＣＮＴ値とを１つのデータ列にまとめ、外部メモリ６０の保証領域内の所定アドレスに書き出す。
【０１２６】
スクランブル関数演算部（スクランブル関数演算手段）６３０は、読み込み処理の際には、データ列読み込み部６３２から受け取ったデータ及びＣＮＴ値に加え当該データ及びＣＮＴ値が記憶されていたアドレスに、書き出し処理の際には、キャッシュメモリから受け取ったデータ７０及びＣＮＴカウンタ６３３から受け取ったＣＮＴ値に加え当該データ及びＣＮＴ値が記憶されるアドレスに、スクランブル関数を演算し暗号化処理を施す。このとき、乱数生成部５０２から受け取った乱数を鍵として用いる。したがって、入力の引数（データ、ＣＮＴ値及びアドレス）をどのように暗号化するかは鍵に依存するが、その値はＣＰＵ内で保持するため、外部の攻撃者は観測することができない。
【０１２７】
ここで、スクランブル関数とは、入力の引数がわかっていても、鍵がわからなければ関数の出力値（ＳＣＲ値とする）を知ることができない関数である。本実施形態においては、スクランブル関数の一例として、共通鍵暗号方式で用いられるＡＥＳ（Advanced Encryption Standard）を用いる場合について説明する。
【０１２８】
Ｒｅａｄレジスタ（以下、Ｒレジスタという）（読み込み履歴記憶手段）６３４及びＷｒｉｔｅレジスタ（以下、Ｗレジスタという）（書き出し履歴記憶手段）６３５は、キャッシュメモリ７０と外部メモリ６０の間の書き出し及び読み込みの履歴情報を保持する。これらレジスタには、１つ前のレジスタの値と、スクランブル関数演算部６３０から送出されたＳＣＲ値との排他的論理和の演算結果が保存される。
【０１２９】
排他的論理和演算部（排他的論理和演算手段）６３１は、スクランブル関数演算部６３０から受け取ったスクランブル関数の演算結果であるＳＣＲ値と、Ｒレジスタ６３４あるいはＷレジスタ６３５のレジスタ値との排他的論理和を演算し、Ｒレジスタ６３４あるいはＷレジスタ６３５をその演算結果に更新する。ここで、排他的論理和とは、例えば、２入力の場合、どちらか一方の入力のみが真（「１」）のときに出力が真（「１」）となり、両方真（「１」）あるいは両方偽（「０」）の場合に出力が偽（「０」）となるような演算である。
【０１３０】
レジスタ値比較部（履歴比較手段）６３７は、ノード１０でのプログラム実行が終了し、実行証明を行う際に、Ｒレジスタ６３４及びＷレジスタ６３５からレジスタ値を受け取り、それらが一致しているか否かを判定する。また、本実施形態においては、制御部部５０１が、カウンタ値判定手段及び判定手段としての機能を有する。
【０１３１】
図２２、図２３及び図２４は、それぞれ本実施形態に係るプログラム実行部４０が行う読み込み、書き出し及び検証処理の流れを示すフローチャートである。本実施形態においては、サーバ２０からプログラム実行証明が要求され、セキュアモードに切り替わった後に、まず、外部メモリ６０内の保証領域の初期化を行う。これは、ＣＰＵ５０が、保証領域内のデータ及びカウンタ値（ＣＮＴ値）を、例えばすべて「０」にすることである。また、同時に、Ｒレジスタ６３４、Ｗレジスタ６３５及びＧＣＮＴカウンタ６３８の値もすべて初期化される。
【０１３２】
まず、図２２に示した、外部メモリ６０からキャッシュメモリ７０へのデータの読み込み処理から説明する。データ列読み込み部６３２は、外部メモリ６０の所定のアドレスからデータ列を読み込む（ステップＳ６０１）と、当該データ列に含まれるデータをキャッシュメモリ７０に送出する（ステップＳ６１０）。これで、外部メモリ６０からキャッシュメモリ７０への読み込み処理は完了するが、本実施形態においては、その処理と並行して以下の処理も行うものとする。
【０１３３】
スクランブル関数演算部６３０は、データ列読み込み部６３２から受け取ったデータ及びＣＮＴ値、さらに当該データ及びＣＮＴ値が記憶されていたアドレスをまとめてそれらにスクランブル関数を演算し、出力結果であるＳＣＲ値を排他的論理和演算部６３１に送出する。排他的論理和演算部６３１は、Ｒレジスタ６３４から現在のレジスタ値を受け取り、当該レジスタ値と、スクランブル関数演算部６３０から受け取ったＳＣＲ値との排他的論理和を演算する。そして、排他的論理和演算部６３１は、得られた演算結果をＲレジスタ６３４に上書きすることで、Ｒレジスタ６３４のレジスタ値を更新する（ステップＳ６０２）。
【０１３４】
続いて、ＣＮＴカウンタ６３３は、データ列読み込み部６３２から受け取ったＣＮＴ値に１を加算し（ステップＳ６０３）、データ列生成部６３６に送出する。データ列生成部６３６は、データ列読み込み部６３２から受け取ったデータと、ＣＮＴカウンタ６３３から受け取ったＣＮＴ値とを１つにまとめ、データ列読み込み部６３２により読み込まれた際のデータ列が記憶されていたアドレスに書き出す（ステップＳ６０４）。
【０１３５】
次に、排他的論理和演算部６３１は、データ列読み込み部６３２から受け取ったデータ、ＣＮＴカウンタ６３３から受け取ったカウントアップされた後のＣＮＴ値、さらに当該データが記憶されていたアドレスをまとめてそれらにスクランブル関数を演算し、ＳＣＲ値を排他的論理和演算部６３１に送出する。排他的論理和演算部６３１は、Ｗレジスタ６３５から現在のレジスタ値を受け取り、当該レジスタ値と、スクランブル関数演算部６３０から受け取ったＳＣＲ値との排他的論理和を演算する。そして、排他的論理和演算部６３１は、得られた演算結果をＷレジスタ６３５に上書きすることで、Ｗレジスタ６３５のレジスタ値を更新する（ステップＳ６０５）。最後に、制御部５０１は、ＧＣＮＴカウンタ６３８のカウンタ値であるＧＣＮＴ値の値に１を加算し（ステップＳ６０６）、読み込み処理を終了する。
【０１３６】
次に、図２３に示した、キャッシュメモリ７０から外部メモリ６０へのデータの書き出し処理を説明する。まず、データ列読み込み部６３２は、外部メモリ６０内の新しいデータが記憶されるアドレスからデータ列を読み込む（ステップＳ７０１）と、当該データ列に含まれるデータ及びＣＮＴ値をスクランブル関数演算部６３０に送出する。以下、図２２のステップＳ６０２と同様にして、Ｒレジスタ６３４のレジスタ値が更新される（ステップＳ７０２）。
【０１３７】
続いて、ＣＮＴカウンタ６３３は、データ列読み込み部６３２から受け取ったＣＮＴ値に１を加算し（ステップＳ７０３）、データ列生成部６３６に送出する。データ列生成部６３６は、キャッシュメモリ７０から受け取った新しいデータと、ＣＮＴカウンタ６３３から受け取ったＣＮＴ値とを１つにまとめ、データ列読み込み部６３２により読み込まれた際のデータ列が記憶されていたアドレスに書き出す（ステップＳ７０４）。
【０１３８】
次に、排他的論理和演算部６３１は、キャッシュメモリ７０から受け取った新しいデータ、ＣＮＴカウンタ６３３から受け取ったカウントアップされた後のＣＮＴ値、さらに当該データが記憶されていたアドレスをまとめてそれらにスクランブル関数を演算し、ＳＣＲ値を排他的論理和演算部６３１に送出する。排他的論理和演算部６３１は、Ｗレジスタ６３５から現在のレジスタ値を受け取り、当該レジスタ値と、スクランブル関数演算部６３０から受け取ったＳＣＲ値との排他的論理和を演算する。そして、排他的論理和演算部６３１は、得られた演算結果をＷレジスタ６３５に上書きすることで、Ｗレジスタ６３５のレジスタ値を更新する（ステップＳ７０５）。最後に、制御部５０１は、ＧＣＮＴカウンタ６３８のカウンタ値であるＧＣＮＴ値の値に１を加算し（ステップＳ７０６）、書き出し処理を終了する。
【０１３９】
最後に、セキュアモードが終了する際に行われるプログラムの実行証明の流れを、図２４を用いて説明する。まず、データ列読み込み部６３２は、外部メモリ６０の、あるアドレスからデータ及びＣＮＴ値を読み込む（ステップＳ８０１）と、当該データ列に含まれるデータ及びＣＮＴ値をスクランブル関数演算部６３０に送出する。以下、図２０のステップＳ６０２及び図２３のステップＳ７０２と同様にして、Ｒレジスタ６３４のレジスタ値が更新される（ステップＳ８０２）。続いて、制御部５０１は、ＧＣＮＴカウンタ６３８に記憶されているＧＣＮＴ値から前記ＣＮＴ値を減算する（ステップＳ８０３）。以上のステップＳ８０１からＳ８０３までの処理は、すべてある特定のアドレスについて行われるが、それらの処理が保証領域のすべてのアドレスに関して行われると（ステップＳ８０４でＹＥＳ）、以降の検証処理に移行する。
【０１４０】
続いて、制御部５０１は、ＧＣＮＴカウンタ６３８を参照し、そこに記憶されているＧＣＮＴ値が「０」か否かを判定する（ステップＳ８０５）。前述したように、ＣＮＴ値はアドレス毎に数えられており、読み込み又は書き出し処理が行われる度にその値は１ずつ増えていく。そして、ＧＣＮＴカウンタ６３８が記憶しているＧＣＮＴ値は、保証領域のすべてのアドレスについて、読み込み又は書き出し処理が行われた回数の総和である。そのため、外部の攻撃者が外部メモリ６０にアクセスし、データ列の改ざんを行っていなければ、ステップＳ８０５においてＧＣＮＴ値は「０」になるはずである。したがって、ステップＳ８０５において、ＧＣＮＴ値が「０」でない場合には（ステップＳ８０５でＮＯ）、制御部５０１はデータの改ざんが行われたと判定し（ステップＳ８０８）、処理を終了する。
【０１４１】
それと異なり、ステップＳ８０５において、ＧＣＮＴ値が「０」の場合には（ステップＳ８０５でＹＥＳ）、レジスタ値比較部６３７においてＲレジスタ６３４及びＷレジスタ６３５のレジスタ値が一致しているか否かが判定される（ステップＳ８０６）。プログラム実行時の読み込み及び書き出し処理により、Ｗレジスタ６３５のレジスタ値は外部メモリ６０に記憶されている最新のデータ列に対応するところまで更新されている。しかしながら、Ｒレジスタ６３４のレジスタ値はその１つ前の読み込みあるいは書き出し処理の時点までしか更新されていない。
【０１４２】
そのため、ステップＳ８０２においてＲレジスタ６３４のレジスタ値を、外部メモリ６０に記憶されている最新のデータ列に対応するところまで更新した。これにより、外部の攻撃者が外部メモリ６０にアクセスし、データ列の改ざんを行っていなければ、ステップＳ８０６においてＲレジスタ６３４及びＷレジスタ６３５のレジスタ値は一致するはずである。したがって、ステップＳ８０６において、レジスタ値が一致しない場合には（ステップＳ８０６でＮＯ）、データの改ざんが行われたと判定し（ステップＳ８０８）、処理を終了する。それに対して、レジスタ値が一致した場合には（ステップＳ８０６でＹＥＳ）、制御部５０１はデータの改ざんは行われていないと判定し、正常終了する（ステップＳ８０７）。
【０１４３】
以上説明したように本実施形態においては、ステップＳ８０５においてＧＣＮＴ値が「０」になるか否かでデータ列の改ざんが行われたか否かを判定するとして説明したが、それに限られることなく、プログラムの実行が終了した時点で、保証領域のすべてのアドレスのＣＮＴ値を加算し、その値とＧＣＮＴ値とが一致するか否かでデータ列の改ざんが行われたか否かを判定する構成としてもよい。
【０１４４】
以上説明したように本実施形態によれば、ハッシュ関数のような一方向性関数を演算し、外部メモリ６０に書き出すのではなく、共通鍵暗号方式を用いているため、高速に処理が行える上に、メモリ容量が節約できる。
【０１４５】
［他の好ましい実施形態］
（Ａ）以上説明した実施形態４及び５においては、攻撃者はＣＰＵが備えられたチップから外部に出るデータバス、アドレスバス、メモリ制御信号等を観測することで、アドレス毎の書き出し及び読み込みのアクセス回数がわかる。その場合、ＷＲＣ値が桁溢れしてしまうと、攻撃者はＷＲＣ値が同じでデータとＭＡＣ値とは異なるデータを複数観測して記録することができる。したがって、ＷＲＣ値がある値のとき、事前に記録しておいた、データとＭＡＣ値は異なるが、ＷＲＣ値が同じであるデータと差し替えるというreplay attackが可能である。
【０１４６】
このようなreplay attackを防ぐためには、メモリアクセス毎にカウンタ値（ＷＣ値及びＧＷＣ値、あるいはＷＲＣ値及びＧＷＲＣ値）に１だけ加算するのではなく、メモリアクセス毎に乱数生成部５０２で生成した乱数をそれぞれ加算すればよい。各アドレスのカウンタ値（ＷＣ値及びＧＷＣ値、あるいはＷＲＣ値及びＧＷＲＣ値）を同じビット幅にすることで、桁溢れしても同じタイミングで同じ値だけ桁溢れするので、整合性を保つことができる。
【０１４７】
（Ｂ）以上説明した実施形態４及び５においては、外部メモリ６０への書き出しや読み込みの回数を、ＷＣ値あるいはＷＲＣ値として数える構成とした。その場合、例えば、キャッシュアルゴリズムが悪かったり、実行時間が長かったりすると、ＷＣ値あるいはＷＲＣ値は増え続けていくが、例えば、ＷＣ値あるいはＷＲＣ値に３２ｂｉｔを割り当てるとすれば、その値が桁溢れすることは考えにくい。しかしながら、桁溢れした場合に、鍵生成部５０３において鍵を新たに生成し、その鍵を用いて保証領域内のデータ列に含まれているＭＡＣ値を更新し、外部メモリ６０に再度記憶させることで、桁溢れした場合にも対応可能である。
【図面の簡単な説明】
【０１４８】
【図１】本発明の一実施形態に係るコンピュータシステムの概略構成図である。
【図２】本発明の一実施形態に係るコンピュータシステムの機能ブロック図である。
【図３】本発明の一実施形態に係るコンピュータシステムの動作について説明するためのフローチャートである。
【図４】実施形態１に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図５】図４に示した実行証明命令列の一実施形態を示す模式図である。
【図６】ＣＰＵが有するモードの一実施形態を示す模式図である。
【図７】spoofing attackと呼ばれる攻撃を説明するための模式図である。
【図８】実施形態２に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図９】spoofing attackを防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図１０】splicing attackと呼ばれる攻撃を説明するための模式図である。
【図１１】実施形態３に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図１２】splicing attackを防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図１３】再生攻撃（replay attack）と呼ばれる攻撃の一形態を説明するための模式図である。
【図１４】実施形態４に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図１５】replay attackの一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図１６】replay attackの一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図１７】再生攻撃（replay attack）と呼ばれる攻撃の他の一形態を説明するための模式図である。
【図１８】実施形態５に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図１９】replay attackの他の一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図２０】replay attackの他の一形態を防ぐためにプログラム実行部４０が行う処理の流れを示すフローチャートである。
【図２１】実施形態６に係るプログラム実行部４０を詳細に示した機能ブロック図である。
【図２２】実施形態６に係る外部メモリ６０からキャッシュメモリ７０へのデータの読み込み処理の流れを示すフローチャートである。
【図２３】実施形態６に係るキャッシュメモリ７０から外部メモリ６０へのデータの書き出し処理の流れを示すフローチャートである。
【図２４】実施形態６に係るプログラム実行証明処理の流れを示すフローチャートである。
【符号の説明】
【０１４９】
１０  ノード
１０１  通信制御部
１０２  プログラム記憶部
１０３  ハッシュ値算出部
１０４  デジタル署名実行部
１０５  秘密鍵記憶部
１０６  デジタル署名記憶部
２０  サーバ
２０１  通信制御部
２０２  プログラム記憶部
２０３  ハッシュ値算出部
２０４  ハッシュ値比較部
２０５  デジタル署名検証部
２０６  公開鍵記憶部
４０  プログラム実行部
【図１】
2006203564.tif 000003
【図２】
2006203564.tif 000004
【図３】
2006203564.tif 000005
【図４】
2006203564.tif 000006
【図５】
2006203564.tif 000007
【図６】
2006203564.tif 000008
【図７】
2006203564.tif 000009
【図８】
2006203564.tif 000010
【図９】
2006203564.tif 000011
【図１０】
2006203564.tif 000012
【図１１】
2006203564.tif 000013
【図１２】
2006203564.tif 000014
【図１３】
2006203564.tif 000015
【図１４】
2006203564.tif 000016
【図１５】
2006203564.tif 000017
【図１６】
2006203564.tif 000018
【図１７】
2006203564.tif 000019
【図１８】
2006203564.tif 000020
【図１９】
2006203564.tif 000021
【図２０】
2006203564.tif 000022
【図２１】
2006203564.tif 000023
【図２２】
2006203564.tif 000024
【図２３】
2006203564.tif 000025
【図２４】
2006203564.tif 000026