(57)【要約】  プログラム実行装置は、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行する装置であって、  それぞれメモリとプロセッサとを含む、第１実行デバイスと耐タンパ性を有する第２実行デバイスとを有し、ローダは、クラスを実行する際に、当該クラスの実行コードを第２実行デバイスのメモリにロードし、当該クラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を第１実行デバイス内のメモリにロードし、クラスを実行する。【特許請求の範囲】
【請求項１】
オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置であって、
それぞれメモリとプロセッサとを含む、第１実行デバイスと耐タンパ性を有する第２実行デバイスと、
前記クラスをロードする際に、当該クラスの実行コードを第２実行デバイスのメモリにロードし、当該クラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を第１実行デバイス内のメモリにロードするローダと
を備えることを特徴とするプログラム実行装置。
【請求項２】
前記クラスの実行コードは、暗号化されており、
前記プログラム実行装置は、更に、暗号化されている情報を復号化する復号化手段を備え、
前記ローダは、暗号化されている実行コードを、前記復号化手段に復号化させ、復号化された実行コードを第２実行デバイスのメモリにロードする
ことを特徴とする請求項１記載のプログラム実行装置。
【請求項３】
前記クラスは、暗号化されており、
前記第１実行デバイスは、更に、クラスが暗号化されているか否かを判断する判断する判断手段を備え、
前記第２実行デバイスは、更に、自デバイス内のメモリに記憶する暗号化されているクラスを復号化する復号化手段を備え、
前記ローダは、前記第１実行デバイスのプロセッサにより実行される第１ローダと、前記第２実行デバイスのプロセッサにより実行される第２ローダとで構成され、
前記第１ローダは、前記判断手段にクラスが暗号化されているか否かを判断させ、暗号化されていないと判断されたクラスは、第１デバイス内のメモリにロードし、暗号化されていると判断されたクラスは、第２実行デバイスのメモリに記憶させ、
前記第２ローダは、第２実行デバイスのメモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを第２実行デバイスのメモリにロードし、当該復号化されたクラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を、当該実行コードと対応付けて第１デバイス内のメモリにロードする
ことを特徴とする請求項１記載のプログラム実行装置。
【請求項４】
前記プログラム実行装置は、更に、クラスの実行を制御する制御手段を備え、
前記制御手段は、第１デバイスのメモリに記憶されているクラスを第１デバイスのプロセッサに実行させ、当該クラスの実行コードが第１デバイスのメモリに記録されていない場合には、第２デバイスのメモリに記憶されている対応する実行コードを第２デバイスのプロセッサに実行させる
ことを特徴とする請求項３記載のプログラム実行装置。
【請求項５】
オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する実行デバイスであって、
メモリと、プロセッサと、
前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、
前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダと
を備えることを特徴とする実行デバイス。
【請求項６】
オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた、メモリとプロセッサとを有する耐タンパ性を有する実行デバイスに、ロード処理を行わせるためのコンピュータプログラムであって、
前記メモリに記憶する暗号化されているクラスを復号化する復号化ステップと、
前記メモリに記憶された暗号化されているクラスを前記復号化ステップで復号化し、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするステップと
を備えることを特徴とするコンピュータプログラム。
【請求項７】
オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する集積回路であって、
メモリと、プロセッサと、
前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、
前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダと
を備えることを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの盗聴および改竄を防止する技術に関し、特に、プログラム実行時に、プログラムが解析、改竄等されることを防止する技術に関する。
【背景技術】
【０００２】
近年、様々なアプリケーション・プログラム（以下、「アプリケーション」という。）が、パソコンをはじめ、デジタルテレビや携帯電話機などの情報処理機能を有した装置で実行されており、これらのアプリケーションは、例えば、プログラム配信サービスによりインターネット上のサーバからダウンロードされる。
これらのアプリケーションには、著作権等の知的財産権の他、さまざまな権利が発生している。【０００３】
その一方で、アプリケーションが改竄されたり、データが盗まれたりという行為が起こっており、このような行為は、アプリケーションに発生している権利の観点から許されるべきものではない。
このような不正行為からアプリケーションを守るために、従来からさまざまな方法が取られており、その一つとして、アプリケーションのプログラム自体を複雑にする方法がある。【０００４】
通常、プログラムの改竄等を行う場合には、例えば、デバッガなどのツールを用いてメモリ上の実行中のプログラムを解析し、不正行為を行う。そこで、プログラムを複雑にして解析を困難にすることでプログラム自体を保護しようとするのである。
アプリケーションのプログラム自体を複雑にする方法として、実行時にメモリに配置されるプログラム内のデータと演算式とを、それぞれ複雑化してメモリに配置する方法が開示されている（特許文献１及び図２９参照）。【０００５】
具体的には、この方法を実現するＣＰＵ（Central Processing Unit）２００は、符号化プログラム内のデータのうちデータ決定部２０２が決定したデータを、符号化規則決定部２０１が決定した方法を用いてデータ符号化部２０３で符号化し、そのデータを使用する演算式を演算式変換部２０４で複雑化したものをメモリに配置する。復号化が必要なデータは、復号化処理部２０５が復号化を行う。【０００６】
この方法によれば、メモリ上のプログラム、すなわち、実行中のプログラムのデータやアルゴリズムを解読しにくくすることが可能となる。
【特許文献１】特開２００５−４９９２５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、プログラム自体の複雑化は、解析を困難にすることは可能ではあるが、時間さえかければ解析されてしまうという欠点がある。また、コピーが可能であれば、プログラム自体が複雑化されていても実行には問題がない。
解析やコピー等をさせないためには、アプリケーションをその実行環境と共に、耐タンパ性を有するデバイス内のメモリに置いて実行させることが望ましいが、サイズ面、コスト面などから現実的ではないことが多い。【０００８】
特に、実行環境が仮想マシンであれば、そのプログラムは、通常、巨大なプログラムであることから尚更である。
そこで、本発明は、アプリケーションのプログラム自体を複雑にすることなく、また、大きな耐タンパ性を有するデバイスを必要とせずとも、アプリケーションのプログラムの重要な部分を、解析等の不正行為から防ぐことを可能とする実行装置の提供を目的とする。
【課題を解決するための手段】
【０００９】
上記課題を解決する為に、本発明の実行装置は、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置であって、それぞれメモリとプロセッサとを含む、第１実行デバイスと耐タンパ性を有する第２実行デバイスと、前記クラスをロードする際に、当該クラスの実行コードを第２実行デバイスのメモリにロードし、当該クラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を第１実行デバイス内のメモリにロードするローダとを備えることを特徴とする。
【発明の効果】
【００１０】
本発明に係る実行装置は、上述の構成を備えることにより、アプリケーションのクラスを実行している間、実行コードは耐タンパ性を有する実行デバイスのメモリにのみロードされ、実行されるので、実行時にデバッガ等を用いて実行コード部分を解析、改竄することが困難になり、アプリケーションを不正行為から守ることができるようになる。
クラスのうち実行コード部分のみが、耐タンパ性を有する実行デバイスのメモリに記憶されるので、クラス全体を記憶する場合等に比べ、耐タンパ性を有する実行デバイスは小さくなる。【００１１】
また、前記クラスの実行コードは、暗号化されており、前記プログラム実行装置は、更に、暗号化されている情報を復号化する復号化手段を備え、前記ローダは、暗号化されている実行コードを、前記復号化手段に復号化させ、復号化された実行コードを第２実行デバイスのメモリにロードすることとしてもよい。
これにより、保護すべきクラスを暗号化できるので、アプリケーションをコピーしても実行することはできず、実行時以外でも保護することができ、且つ、実行時は耐タンパ性を有する実行部で実行してアプリケーションを保護することができるようになる。【００１２】
また、前記クラスは、暗号化されており、前記第１実行デバイスは、更に、クラスが暗号化されているか否かを判断する判断する判断手段を備え、前記第２実行デバイスは、更に、自デバイス内のメモリに記憶する暗号化されているクラスを復号化する復号化手段を備え、前記ローダは、前記第１実行デバイスのプロセッサにより実行される第１ローダと、前記第２実行デバイスのプロセッサにより実行される第２ローダとで構成され、前記第１ローダは、前記判断手段にクラスが暗号化されているか否かを判断させ、暗号化されていないと判断されたクラスは、第１デバイス内のメモリにロードし、暗号化されていると判断されたクラスは、第２実行デバイスのメモリに記憶させ、前記第２ローダは、第２実行デバイスのメモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを第２実行デバイスのメモリにロードし、当該復号化されたクラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を、当該実行コードと対応付けて第１デバイス内のメモリにロードすることとしてもよい。【００１３】
これにより、クラスが暗号化されているか否かを判断でき、暗号化されているクラスを実行する際に、復号化を耐タンパ性を有する実行デバイス内で行い、保護を要しない部分のみを耐タンパ性を有する実行デバイス外のメモリにロードすることができるので、保護すべき実行コードを実行する前も実行中も保護することができるようになる。クラスが暗号化されているか否かを判断する方法としては、例えば、暗号化されているクラスのクラス名リストを予め作成しておき、そのリストを元に判断する。【００１４】
また、前記プログラム実行装置は、更に、クラスの実行を制御する制御手段を備え、前記制御手段は、第１デバイスのメモリに記憶されているクラスを第１デバイスのプロセッサに実行させ、当該クラスの実行コードが第１デバイスのメモリに記録されていない場合には、第２デバイスのメモリに記憶されている対応する実行コードを第２デバイスのプロセッサに実行させることとしてもよい。【００１５】
これにより、１つのクラスを分割し、通常の実行デバイスのメモリと耐タンパ性を有する実行デバイスのメモリとに対応付けて記憶することができるので、１つのクラスを、通常の実行デバイスと耐タンパ性を有する実行デバイスとで分担して実行することができるようになる。従って、クラス内の保護すべき実行コードのみを、耐タンパ性を有する実行デバイスのメモリに記憶しておき、実行することができるようになる。【００１６】
本発明の実行デバイスは、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する実行デバイスであって、メモリと、プロセッサと、前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダとを備えることを特徴とする。【００１７】
また、本発明のコンピュータプログラムは、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた、メモリとプロセッサとを有する耐タンパ性を有する実行デバイスに、ロード処理を行わせるためのコンピュータプログラムであって、前記メモリに記憶する暗号化されているクラスを復号化する復号化ステップと、前記メモリに記憶された暗号化されているクラスを前記復号化ステップで復号化し、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするステップとを備えることを特徴とする。【００１８】
また、本発明の集積回路は、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する集積回路であって、メモリと、プロセッサと、前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダとを備えることを特徴とする集積回路。【００１９】
これにより、大きな耐タンパ性を有するデバイスを必要とせずとも、アプリケーションの改竄等の不正行為を防ぐことを可能とする実行装置を容易に提供することができるようになる。
【図面の簡単な説明】
【００２０】
【図１】本発明にかかる実行装置のハードウェア及びソフトウェアの構成を表す図である。
【図２】第１ＲＯＭ１９２０が記憶するプログラムの例を示す図である。
【図３】第２ＲＯＭ２９２０が記憶するデータ及びプログラムの例を示す図である。
【００２１】
【図４】本発明にかかる実行装置の構成を示す機能ブロック図である。
【図５】アプリケーションプログラム１２１０の構成例を示す図である。
【図６】保護対象クラス一覧１２２０の構成例及び内容例を示す図である。
【図７】クラスファイルの構成例を示す図である。
【図８】仮想マシン１１００のサブプログラムの構成を示す図である。
【図９】バイトコード処理部のサブプログラムの構成を示す図である。
【図１０】実行装置１００の起動処理を表すフローチャートである。
【図１１】実行装置１００のロード処理を表すフローチャートである。
【図１２】保護対象クラスのクラスファイルがロードされた状態を示す図である。
【図１３】実行装置１００のクラスの実行処理を表すフローチャートである。
【図１４】実行装置１００のバイトコードの実行処理を表すフローチャートを示す。
【図１５】Ｊａｖａ（登録商標）言語のメソッドの例を示す図である。
【図１６】メソッド４０００をコンパイルし、得られたバイトコード４１００を示す図である。
【図１７】Ｊａｖａ（登録商標）フレームを積み上げた時点での、ワーク領域１４００の状態の例を示す図である。
【図１８】ｉａｄｄ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図１９】ｎｅｗａｒｒａｙ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図２０】ａｒｅｔｕｒｎ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図２１】実施形態２の実行装置５００の構成例を示す機能ブロック図である。
【図２２】実行装置５００のロード処理を表すフローチャートである。
【図２３】保護対象クラスのクラスファイルがロードされた状態を示す図である。
【図２４】バイトコードの例を示す図である。
【図２５】分割したバイトコードの例を示す図である。
【図２６】実施形態２の実行装置５００のクラスの実行処理を表すフローチャートである。
【図２７】実施形態３の実行装置８００の構成例を示す図である。
【図２８】実施形態３の実行装置８００のクラスの実行処理を表すフローチャートである。
【図２９】従来技術の構成を表す図である。
【符号の説明】
【００２２】
１００  ５００    実行装置
１０００  ５０００    通常実行部
１０１０    アプリ取得プログラム
１２００    アプリケーションプログラム記憶部
１２１０    アプリケーションプログラム
１１００  ５１００    仮想マシン
１１１０  ５１１０    インタプリタ
１１２０  ５１２０    ローダ
１０２０  ８１００    ＯＳ
１３００    クラス記憶部
１３３０    メソッドのメタ情報
１３３１    バイトコード分割フラグ
１３３２  ２６１１    ＩＤ
１４００  ６７００    ワーク領域
１９００    第１ＣＰＵ
１９１０    第１ＲＡＭ
１９２０    第２ＲＯＭ
２０００  ６０００  ８０００    保護実行部
２１００  ６１００    復号処理部
２２００  ６２００    バイトコード処理部
２２１０  ６２１０    セキュアインタプリタ
２２２０  ６２２０    セキュアローダ
２６００    バイトコード記憶部
２６１０    バイトコード
２９００    第２ＣＰＵ
２９１０    第２ＲＡＭ
２９２０    第２ＲＯＭ
【発明を実施するための最良の形態】
【００２３】
＜概要＞
本発明に係る実行装置は、アプリケーションのプログラムのうち、一部のプログラムを不正行為から守ることで、アプリケーション自体を効率よく守ることができる場合が多いことに着目したものである。
アプリケーションはそれぞれ、その用途・目的が異なることから、アプリケーション毎に解析、改竄等されたくないプログラム、すなわち、秘匿性を有するプログラムが異なる。【００２４】
例えば、コピー回数を管理する等の著作権管理機能の処理や、課金機能の処理などを行うプログラムを解析、改竄から守り、これらの機能が無効とされることを防ぐことで、アプリケーションの著作権を守ることが可能となる。
本発明は、アプリケーションを不正行為から守る為の要となる処理のプログラムのみを、耐タンパ性を有する実行装置内で実行することで、アプリケーション自体を守ろうとするものである。もちろん、キーとなる処理はアプリケーション全てであってもかまわない。【００２５】
本発明は、このキーとなる処理のプログラムのうち、実行コードのみを耐タンパ性を有する実行装置内で実行することで、プログラムの解析を困難にするものである。
また、アプリケーションのうちのキーとなる処理は、作成者またはそのユーザのみが知り得るものであるので、本発明に係る実行装置は、アプリケーション実行中にキーとなる処理のプログラムを判別できる機能を有する。【００２６】
以下、本発明の実施形態に係る実行装置について説明する。
本実施形態では、Ｊａｖａ（登録商標）仮想マシン上で動くＪａｖａ（登録商標）アプリケーションについて説明する。
尚、本発明に係る実行装置とは、具体的にはデジタルテレビ、セットトップボックス、カーナビ端末、携帯電話機、ＰＤＡ（Personal Digital Assistants）などの、Ｊａｖａ（登録商標）仮想マシンを搭載する電子機器全般が該当するものである。
＜実施形態１＞
＜構成＞
まず、図１〜図３を用いて、本発明の実行装置の、ハードウェア及びソフトウェアの構成について簡単に説明し、機能ブロックの構成について説明する。【００２７】
＜ハードウェア及びソフトウェアの構成＞
図１は、本発明にかかる実行装置のハードウェア及びソフトウェアの構成を表す図である。
実行装置１００は、通常実行部１０００と保護実行部２０００で構成される。
通常実行部１０００は、特別な保護がなされていない実行部であり、通常のパーソナルコンピュータやデジタル家電機器等に搭載されているプログラム実行手段と同様のものである。一方、保護実行部２０００は、耐タンパ性を有する実行部であり、不正なユーザによる盗聴、改竄等を防止し、安全にプログラムを実行させることができるものである。【００２８】
ハードウェア構成１１０として、通常実行部１０００と保護実行部２０００とは、それぞれＣＰＵとメモリを備える。具体的には、通常実行部１０００は、第１ＣＰＵ１９００、第１ＲＡＭ（Random Access Memory）１９１０及び第１ＲＯＭ（Read Only Memory）１９２０を備え、保護実行部２０００は、第２ＣＰＵ２９００、第２ＲＡＭ２９１０及び第２ＲＯＭ２９２０を備える。【００２９】
本実施形態では、第１ＲＡＭは、第２ＣＰＵ２９００からもアクセスが可能であるとする。
各ＲＡＭ（１９１０、２９１０）は、具体的にはＳＲＡＭ、ＤＲＡＭ等の一次記憶メモリで構成され、各ＣＰＵ（１９００、２９００）が処理を行う際、一時的にデータを保存するために使用される。【００３０】
また、各ＲＯＭ（１９２０、２９２０）は、具体的にはフラッシュメモリやハードディスク等の読み出し専用の不揮発性メモリで構成される。第１ＲＯＭ１９２０及び第２ＲＯＭ２９２０には、それぞれ通常実行部１０００と保護実行部２０００で起動される各処理部のプログラム等が記憶されている。
次に、ソフトウェア構成として、通常実行部１０００は、基本ソフトウェアであるＯＳ（Operating System）１０２０、Ｊａｖａ（登録商標）仮想マシン１１００、本実行装置１００で実行するアプリケーションプログラム１２１０及び実行装置１００の外部からアプリケーションプログラム１２１０をダウンロードする機能を有するアプリ取得プログラム１０１０とで構成される。【００３１】
Ｊａｖａ（登録商標）仮想マシン１１００（以下、「仮想マシン」という。）は、Ｊａｖａ（登録商標）言語で記述されたプログラムを逐次解析し実行するＪａｖａ（登録商標）バーチャルマシンである。言い換えれば、ソフトウェアプログラムである仮想マシン１１００が、仮想のＣＰＵをシミュレートして、Ｊａｖａ（登録商標）の命令コードを解析実行する。
ＯＳ１０２０は、他のサブプログラムを平行して実行するカーネル及び、ライブラリで構成される技術の総称であり、Ｌｉｎｕｘ等があげられる。ＯＳ１０２０は、Ｊａｖａ（登録商標）仮想マシン１１００をサブプログラムとして実行する。【００３２】
保護実行部２０００は、保護実行部２０００でのアプリケーションの実行を制御するバイトコード処理部２２００と、暗号化されたプログラムを復号化する機能を有する復号処理部２１００とで構成される。
図２は、第１ＲＯＭ１９２０が記憶するプログラムの例を示す図である。
第１ＲＯＭ１９２０には、通常実行部１０００のメモリにロードされるプログラムであるＯＳ１９２１、仮想マシン１９２２及びアプリ取得プログラム１９２３の各プログラムが記憶されている。【００３３】
また、図３は、第２ＲＯＭ２９２０が記憶するデータ及びプログラムの例を示す図である。
第２ＲＯＭ２９２０には、保護実行部２０００のメモリにロードされるプログラムであるバイトコード処理部２９２１と復号処理部２９２２の各プログラム、及び復号化鍵２９２３が記憶されている。復号化鍵２９２３は、復号処理部２１００が、暗号化されているアプリケーションプログラム１２１０を復号するために用いるものである。【００３４】
尚、実行装置１００は、本発明にかかる構成の他、本来の機能を実行するためのハードウェアやソフトウェア、例えば、テレビであれば放送の受信装置など、で構成されている。
＜機能ブロックの構成＞
図４は、本発明にかかる実行装置の構成を示す機能ブロック図である。【００３５】
本図において、実線矢印はデータの流れを表し、点線矢印は制御の遷移を表す。また、細線はクラスをロードするときのデータの流れ等を表し、太線はクラスを実行するときのデータの流れ等を表す。尚、本図では、暗号化されているクラスファイルの実行の際のデータの流れ等のみを表している。図２１も同様である。
実行装置１００は、図１で示したように、通常実行部１０００と保護実行部２０００とで構成される。ここでは、実施形態の説明に直接関係する機能部のみを記載している。【００３６】
まず、通常実行部１０００から説明する。
＜通常実行部＞
通常実行部１０００は、アプリケーション記憶部１２００、仮想マシン１１００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵとを備える。
＜アプリケーション記憶部＞
アプリケーション記憶部１２００は、アプリケーションプログラム１２１０を記憶する機能を有し、本実施形態では、アプリ取得プログラム１０１０（図１参照）がアプリケーションプログラム１２１０を読み込んだ状態から説明する。【００３７】
このアプリケーション記憶部１２００は、第１ＲＡＭ１０１０に確保される。
ここで、アプリケーションプログラムの構成について説明する。
図５は、アプリケーションプログラム１２１０の構成例を示す図である。
アプリケーションプログラム１２１０は、複数のクラスファイル（１２１１等）及び保護対象クラス一覧１２２０から構成される。【００３８】
クラスファイルには、暗号化されたクラスファイルと暗号化されていない平文のクラスファイルとが含まれる。暗号化されているクラスは、秘匿性を有する処理を行うクラスである。
クラスファイルが暗号化されているか否かは、保護対象クラス一覧１２２０を参照して判断する。【００３９】
図６は、保護対象クラス一覧１２２０の構成例及び内容例を示す図である。
保護対象クラス一覧１２２０は、暗号化されたクラスファイルの識別子の一覧であり、本実施形態では、クラス名を識別子とする。このクラス名は、後述するクラス毎のコンスタントプールに記憶されている。
例えば、アプリケーションプログラム１２１０を構成する「クラスファイル００１」、「クラスファイル００２」等のうち、「クラスファイル００１」、「クラスファイル００３」、「クラスファイル０２１」が、暗号化されていることになる。【００４０】
次に、クラスファイルの構成を、図７を用いて説明する。
図７は、クラスファイルの構成例を示す図である。
クラスファイル３０００は、クラス構造情報３１００、コンスタントプール３２００、０個以上のメソッドのメタ情報３３００及び０個以上のバイトコード３４００で構成される。クラスファイルには、他の情報が含まれていても良いが、ここでは本発明に関連のある項目のみ説明する。【００４１】
クラス構造情報３１００は、このクラスが保持するフィールドやメソッド、どのクラスを継承するかなど、クラスの構造に関する情報である。
コンスタントプール３２００は、このクラスで定義している、またはこのクラスから参照している他クラスのフィールド、メソッドの名前などの情報である。
メソッドのメタ情報３３００は、各メソッドのアクセスフラグや、引数のサイズなどメソッドに関する情報である。【００４２】
バイトコード３４００は、そのクラスにおいて実行される処理を記述している。
Ｊａｖａ（登録商標）言語で記述されたソースプログラムは、バイトコードコンパイラによってバイトコードに変換される。このバイトコードとは、ハードウェアに依存しない中間コードである。
メソッドのメタ情報３３００とバイトコード３４００は、クラスに属するメソッドに１対１に対応して存在している。すなわち、メソッドの数と同数の、メソッドのメタ情報３３００及びバイトコード３４００がクラスファイルに含まれている。【００４３】
以下では、クラス構造情報３１００、コンスタントプール３２００及びメソッドのメタ情報３３００を総称して「メタ情報」というものとする。
＜仮想マシン＞
仮想マシン１１００は、複数のサブプログラムで構成されるが、本図では、本発明に特有の機能を有するローダ１１２０とインタプリタ１１１０のみを記載してある。【００４４】
まず、図８を用いて、仮想マシン１１００について説明する。
図８は、仮想マシン１１００のサブプログラムの構成を示す図である。
仮想マシン１１００は、インタプリタ１１１０、ローダ１１２０、ベリファイヤ１１３０、Ｊａｖａ（登録商標）ヒープ管理部１１４０、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０、ＪＩＴコンパイラ１１６０及びクラスライブラリ１１７０で構成される。【００４５】
インタプリタ１１１０は、クラスファイルに含まれるバイトコードを解釈、実行する機能を有するサブプログラムで、仮想マシン１１００において中核な処理を行うサブプログラムである。
本発明のインタプリタ１１１０は、加えて、クラスの実行時に、実行すべきバイトコードが、保護実行部に記憶されていることを検出し、制御を渡す機能を有する。【００４６】
ローダ１１２０は、実行するクラスのクラスファイルをアプリケーションプログラム１２１０から探し出し、見つけたクラスファイルを仮想マシン１１００内部へロードする機能を有する。この際、クラスを実行可能な状態にしてロードする。
本発明のローダ１１２０は、加えて、ロードしようとするクラスが、暗号化されているか否かを判定し、暗号化されている場合には、ロードを保護実行部２０００に依頼する機能を有する。  【００４７】
また、クラスローダ１１２０は、クラスアンロード処理を行う機能を有する。クラスアンロード処理とは、実行が終了し不要になったクラスを仮想マシン１１００から取り除く処理である。
次に、ベリファイヤ１１３０は、クラスのデータ形式の不備や、クラスに含まれるバイトコードの安全性を検査する機能を有する（Java（登録商標）Virtual Machine Specification参照）。クラスローダ１１２０は、ベリファイヤ１１３０において妥当ではないと判定されたクラスはロードを行わない。【００４８】
Ｊａｖａ（登録商標）ヒープ管理部１１４０は、Ｊａｖａ（登録商標）ヒープと呼ばれる、Ｊａｖａ（登録商標）アプリケーションが使用するワーキングメモリの管理を行う機能を有する。このワーキングメモリは第１ＲＡＭ１９１０に確保される。
また、Ｊａｖａ（登録商標）ヒープ管理部１１４０は、ガベージコレクションも行う機能を有する。ガベージコレクションとは、アプリケーション実行において不要になったワーキングメモリを開放し、他の用途に再利用できるようにする処理である。【００４９】
Ｊａｖａ（登録商標）ネイティブライブラリ１１５０は、Ｊａｖａ（登録商標）アプリケーションから呼出されるライブラリで、ＯＳ１０２０や、実行装置１００が備える図１には記載されていないハードウエア、サブプログラム等で提供される機能をアプリケーションへ提供する。
ＪＩＴコンパイラ１１６０は、バイトコードを第１ＣＰＵ１９００もしくは第２ＣＰＵ２９００が理解可能な実行形式に翻訳する機能を有する。【００５０】
クラスライブラリ１１７０は、仮想マシン１１００の実行に必要なクラスで構成され、仮想マシン１１００が実行時に最初にロードするクラスである。クラスライブラリ１１７０は仮想マシン１１００の一部であり、一般に公開されている、クラスの集合である。
＜クラス記憶部＞
クラス記憶部１３００は、実行するアプリケーションプログラムのクラスを記憶する機能を有する。【００５１】
このクラス記憶部１３００は、いわゆるメソッド領域であり、実際には、仮想マシン１１００内の領域であり、ローダ１１２０が実行可能な状態にしたクラスをロードする。
このクラス記憶部１３００には、仮想マシン１１００のローダ１１２０又はバイトコード部２２００の後述するセキュアローダ２２２０から、クラスがロードされる。
尚、このクラス記憶部１３００は、第１ＲＡＭ１９１０に確保され、保護実行部２０００から参照等が可能である。【００５２】
＜ワーク領域＞
ワーク領域１４００は、クラスの実行に際し、使用される作業領域である。具体的には、スタックやヒープ等をいい、実際には、仮想マシン１１００内の領域である。
尚、このワーク領域１４００は、第１ＲＡＭ１９１０に確保され、保護実行部２０００から参照等が可能である。【００５３】
＜保護実行部＞
次に、保護実行部２０００について説明する。
保護実行部２０００は、復号処理部２１００、復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード処理部２２００、バイトコード記憶部２６００及び第２ＣＰＵ２９００を備える。【００５４】
＜復号処理部＞
復号処理部２１００は、ローダ１１２０からの依頼によって、アプリケーション記憶部１２００内の暗号化されたクラスを読み込み、暗号鍵記憶部２５００に記憶されている暗号化鍵２９２３（図３参照）を用いて復号化し、復号化されたクラスを復号化クラス記憶部２４００に記憶させる機能を有する。【００５５】
復号化するクラスのアプリケーション記憶部１２００内のアドレスとサイズは、ローダ１１２０からの依頼と共に渡される。
尚、暗号化のためのアルゴリズムは任意の暗号アルゴリズムを用いることが可能であり、代表的な暗号アルゴリズムとしては、ＡＥＳ（Advanced Encryption Standard）、ＤＥＳ（Data Encryption Standard）等があげられる。【００５６】
＜バイトコード処理部＞
次に、バイトコード処理部について説明する。
バイトコード処理部２２００は、仮想マシン１１００の機能のうち、バイトコードの実行に必要な機能のみを備えたものであり、複数のサブプログラムを備えるが、ここでは、本図では、本発明に特有の機能を有するセキュアインタプリタ２２１０とセキュアローダ２２２０のみを記載する。【００５７】
図９は、バイトコード処理部のサブプログラムの構成を示す図である。
バイトコード処理部２２００は、セキュアインタプリタ２２１０、セキュアローダ２２２０、セキュアベリファイヤ２２３０、セキュアＪａｖａ（登録商標）ヒープ管理部２２４０、バイトコード管理部２２５０で構成される。
セキュアインタプリタ２２１０は、仮想マシン１１００のインタプリタ１１１０と同様の機能を有し、仮想マシン１１００のインタプリタ１１１０から依頼を受けてバイトコードを実行し、実行が終了すればインタプリタ１１１０に通知する機能を有する。【００５８】
また、セキュアローダ１１１０は、暗号化クラス記憶部２４００のクラスファイルをロードする機能を有する。自実行部のバイトコード記憶部２６００と、通常実行部１０００のクラス記憶部１３００とに、ひとつのクラスを分割してロードする。
この際、自実行部のバイトコード記憶部２６００に記憶した部分と、通常実行部１０００のクラス記憶部１３００に記憶した部分とを対応付けて記憶する。対応付けの方法は、図１２を用いて後で説明する。【００５９】
セキュアベリファイヤ２２３０は、仮想マシン１１００のベリファイヤ１１３０と同様の機能を有する。
セキュアＪａｖａ（登録商標）ヒープ管理部２２４０は、仮想マシン１１００Ｊａｖａ（登録商標）ヒープ管理部１１４０の機能のうち、クラスアンロード時にバイトコードをアンロードする機能のみを有する。バイトコード以外は、通常実行部１０００のメモリに存在し、それらの管理は仮想マシン１１００が行うからである。【００６０】
バイトコード管理部２２５０は、保護実行部２０００におけるクラスの実行の際に、通常実行部１０００内に記憶されている実行に必要なメタ情報とを関連付けて管理しておく機能を有する。具体的には、バイトコード記憶部２６００に記憶されるバイトコードとクラス記憶部１３００に記憶されるメソッドのメタ情報とに、同じ識別子をつけて、１対１に対応付けて管理する（図１２参照）。【００６１】
＜バイトコード記憶部＞
バイトコード記憶部２６００は、実行するアプリケーションプログラムのクラスのうち、バイトコード（図７参照）のみを記憶する機能を有する。
このバイトコード記憶部２６００は、いわゆるメソッド領域であり、実際には、バイトコード処理部２２００内の領域であり、セキュアローダ２２２０がロードし、実行可能な状態にしたクラスのバイトコードを記憶する。【００６２】
尚、このバイトコード記憶部２６００は、第２ＲＡＭ２９１０に確保される。従って、このバイトコード記憶部２６００は、通常実行部１０００から参照されることはない。
＜動作＞
次に、アプリケーションを実行する実行装置１００の動作を説明する。
実行装置の動作の説明として、アプリケーションのロードと実行の２つのフェーズに分けて説明する。【００６３】
以下、本発明に係る実行装置１００のクラスのロード処理について図１０〜図１２を用いて、クラスの実行処理について図１３〜図２０を用いて説明する。
＜クラスのロード処理＞
まず、図１０を用いて、クラスのロード処理、具体的には、電源投入から実行装置１００がアプリケーションプログラム１２１０を起動するまでの処理を説明し、その後、図１１と図１２とを用いてクラスをロードする処理について説明する。【００６４】
本実施形態では、実行装置の電源を入れた場合、予め定められているアプリケーションが実行されるものとする。
図１０は、実行装置１００の起動処理を表すフローチャートである。
ユーザが実行装置１００の電源を投入する（ステップＳ１００）と、第１ＣＰＵ１９００が、第１ＲＯＭ１９２０に保存されているＯＳ１９２１（図２参照）を第１ＲＡＭ１９１０にロードし、ＯＳ１０２０を起動する（ステップＳ１１０）。  【００６５】
次に、ＯＳ１０２０が、第１ＲＯＭ１９２０に保存されているＪａｖａ（登録商標）仮想マシン１９２２を第１ＲＡＭ１９１０にロードし、仮想マシン１１００を起動する（ステップＳ１２０）。
続いて、ＯＳ１０２０は、第１ＣＰＵ１９００を介して、第２ＣＰＵ２９００にロード依頼を通知し、第２ＣＰＵ２９００は、第２ＲＯＭ２９００上に保存されているバイトコード処理部２９２１を第２ＲＡＭ２９１０にロードし、バイトコード処理部２２００を起動する（ステップＳ１３０）。【００６６】
次に、第２ＣＰＵ２９００は、第２ＲＯＭ２９００上に保存されている復号処理部２９２２（図３参照）を第２ＲＡＭ２９１０にロードし、復号処理部２１００を起動する（ステップＳ１４０）。
上記の処理により、実行装置１００がアプリケーション実行可能な状態になる。尚、仮想マシン１１００の起動（ステップＳ１２０）と復号処理部２１００及びバイトコード処理部２２００の起動（ステップＳ１３０、Ｓ１４０）の順番は逆になっていてもかまわない。【００６７】
実行装置１００が、アプリケーションプログラム１２１０を実行可能な状態になった後、仮想マシン１１００は、アプリケーションプログラム１２１０の実行を開始する。
アプリケーションプログラム１２１０の開始は、アプリケーションプログラム１２１０の特定のクラスファイルを実行することで行う。この特定のクラスファイル名は、予め、仮想マシン１１００が記憶しているものとする。【００６８】
この最初のクラスがローダ１１２０によってロードされ、インタプリタ１１１０によって実行が開始され、その後、適時必要なクラスファイルがアプリケーション記憶部１２００からロードされ、実行されることで、アプリケーションが実行されていくことになる。
仮想マシン１１００は、最初に特定のクラスファイルをロード（ステップＳ１６０）する前に、この特定のクラスファイルと共にアプリケーションプログラム１２１０の中含まれている保護対象クラス一覧１２２０をクラス記憶部１３００に記憶させる（ステップＳ１５０）。【００６９】
次に、各クラスをロードする処理、すなわち、アプリケーションプログラム１２１０のクラスファイルを仮想マシン１１００が実行可能な内部形式に変換し、ロードする手順について説明する。
図１１は、実行装置１００のロード処理を表すフローチャートである。この  ロード処理は、通常実行部１０００のローダ１１２０と保護実行部２０００のセキュアローダ２２２０が行う処理である。【００７０】
また、図１２は、保護対象クラスのクラスファイルがロードされた状態を示す図である。
まず、インタプリタ１１１０がローダ１１２０に、クラスファイル名を渡してロードを依頼する。
依頼を受けたローダ１１２０は、渡されたクラスファイル名のクラスが、保護対象のクラスか、すなわち、暗号化されたクラスか否かを判断する（ステップＳ２００）。【００７１】
判断の方法は、クラス記憶部１３００の保護対象クラス一覧１２２０のリストに渡されたクラスファイル名が載っているかをチェックし、載っていれば保護対象のクラスであると判断する。
ローダ１１２０は、ロードの依頼を受けたクラスが、保護対象クラスでないと判断した場合は（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードする（ステップＳ２６０）。【００７２】
一方、ロードの依頼を受けたクラスが、保護対象クラスであると判断した場合は（ステップＳ２００：ＹＥＳ）、ロードするクラスのアプリケーション記憶部１２００でのアドレスとサイズとを、保護実行部２０００の復号処理部２１００に通知し、ロードを依頼する（ステップＳ２１０）。
通知を受けた復号処理部２１００は、クラスファイルをアプリケーション記憶部１２００から読み込み、暗号鍵記憶部２５００に記憶されている復号化鍵２９２３を用いて復号化し、復号化クラス記憶部２４００に記憶する（ステップＳ２２０）。以下、復号化クラス記憶部２４００に記憶されたクラスを、「復号化クラスファイル」というものとする。【００７３】
復号化クラスファイルを作成した復号処理部２１００は、その旨バイトコード処理部２２００に通知する。
通知を受けたバイトコード処理部２２００は、セキュアベリファイヤ２２３０に復号化クラスファイルを検査させ、セキュアローダ２２２０にロードを依頼する。
ロードの依頼を受けたセキュアローダ２２２０は、復号化クラスファイルの構文を分析し、復号化クラスファイルのタグから、バイトコードの部分とメタ情報の部分の判別を行い、バイトコードの部分とメタ情報の部分とに分割する（ステップＳ２３０）。この分割の際、セキュアローダ２２２０は、２つの情報を付加する。１つ目は、バイトコードが分割された旨の情報であり、２つ目は、バイトコードの部分とメタ情報の部分とを対応付けるための情報である。これら付加する情報については、図１２を用いて後で説明する。【００７４】
分割後、セキュアローダ２２２０は、バイトコードの部分をバイトコード記憶部２６００にロードし（ステップＳ２４０）、メタ情報の部分を通常実行部１０００のクラス記憶部１３００にロードする（ステップＳ２５０）。この際、それぞれの部分は、仮想マシン１１００が実行可能な形式となっている。
それぞれ記憶部にロードされた状態を図１２に示す。保護実行部２０００のバイトコード記憶部２６００には、バイトコード２６１０がロードされ、通常実行部１０００のクラス記憶部１３００には、クラス構造情報１３１０、コンスタントプール１３２０及びメソッドのメタ情報１３３０がロードされている。【００７５】
クラスファイルのフォーマット（Java（登録商標）Virtual Machine Specification参照）において、メソッドのメタ情報３３００の次に必ずバイトコード３４００があることが保証されているため（図７参照）、各部分の判別は容易に行うことが可能であり、バイトコード３４００の部分とメタ情報（図７参照：３１００、３２００、３３００）の部分とを分割することができる。【００７６】
この分割の際（図１１：ステップＳ２３０参照）、セキュアローダ２２２０は、バイトコードが分割された旨の情報と、バイトコードの部分とメタ情報の部分とを対応付けるための情報とを付加する。
バイトコードが分割された旨の情報として、分割されたことを示すフラグであるバイトコード分割フラグ１３３１をメソッドのメタ情報１３３０に付加する。本実施形態では、バイトコード分割フラグ１３３１が「１」の場合は、分割してあり、「０」の場合は、分割していないことを表すものとする。【００７７】
すなわち、バイトコード分割フラグ１３３１が「０」の場合は、バイトコードがクラス記憶部１３００に記憶されていることを示し、バイトコード分割フラグ１３３１が「１」の場合には、バイトコードがバイトコード記憶部２６００に記憶されていることを示す。
次に、セキュアローダ２２２０は、バイトコードの部分とメタ情報の部分とを対応付けるための情報を付加する。この情報は、バイトコード管理部２２５０に指示して付加する。【００７８】
バイトコード管理部２２５０は、バイトコード２６１０とメソッドのメタ情報１３３０の関係を特定できるように、バイトコード２６１０にＩＤ２６１１を、メソッドのメタ情報１３３０にＩＤ１３３２を付加し、同じ値にＩＤをつけて管理する。同一のメソッドから内部形式に変換されたメソッドのメタ情報１３３０のＩＤ１３３２とバイトコード２６１０のＩＤ２６１１には同じ値がついている必要がある。【００７９】
例えば、バイトコード２６１０のＩＤ２６１１として「１２３４」を、メソッドのメタ情報１３３０のＩＤ１３３２ＩＤとして「１２３４」を設定することで、バイトコードを実行する際には、同じＩＤを持つとメソッドのメタ情報１３３０を参照すればよいことが分かる。従って、ＩＤの値は、メソッドのメタ情報１３３０毎に異なる必要がある。
一方、保護対象クラスではないと判断され（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードされたクラスでは、ローダ１１２０は、メソッドのメタ情報のバイトコード分割フラグ１３３１には、「０」を設定する。なお、メソッドのメタ情報１３３０のＩＤ１３３２には、何も設定しない。【００８０】
セキュアベリファイヤ２２３０が、復号化クラスファイルを検査し、検査の結果がエラーの場合には、ローダ１１２０にその旨を通知し、ロードの処理を終了する。  
＜クラスの実行処理＞
次に、図１３〜図２０を用いて、クラスの実行の処理について説明する。
図１３は、クラスの実行の処理を表すフローチャートである。【００８１】
まず、クラスを実行するにあたり、インタプリタ１１１０はメソッドを呼出す（ステップＳ３００）。
インタプリタ１１１０は、該当するメソッドのバイトコードが分割されているか、すなわち、バイトコードがクラス記憶部１３００に記憶されており通常実行部１０００で実行可能か否かを判断する（ステップＳ３１０）。【００８２】
この判断は、メソッドのメタ情報１３３０のバイトコード分割フラグ１３３１をチェックすることで行う。
バイトコード分割フラグ１３３１が「０」になっている場合（ステップＳ３１０：ＮＯ）には、分割がなされていないため、インタプリタ１１１０がメソッドを実行する（ステップＳ３５０）。インタプリタ１１１０がメソッドを実行する処理は従来のＪａｖａ（登録商標）仮想マシンの動作と同じである（Java（登録商標）Virtual Machine Specification参照）。【００８３】
次にバイトコード分割フラグ１３３１が「１」になっている場合（ステップＳ３１０：ＹＥＳ）には、インタプリタ１１１０はＯＳ１０２０に用意された、保護実行部２０００のバイトコード処理部２２００を呼出す実行環境遷移関数を呼び出し、バイトコードの実行を依頼する。例えば、バイトコード処理部２２００が定期的に第１ＲＡＭ１９１０上の特定ビットを監視しており、実行環境遷移関数がこの特定ビットを「１」とすると、バイトコード処理部２２００が処理を開始するような仕組みである。【００８４】
この依頼の際、実行環境遷移関数の引数として、ＩＤ１３３２（図１２参照）の値を渡して依頼する（ステップＳ３２０）。
依頼を受けたバイトコード処理部２２００のセキュアインタプリタ２２１０は、バイトコード管理部２２５０に、受け取ったＩＤ１３３２の値を渡して、同じ値のＩＤを持つバイトコードの検索を依頼する。【００８５】
依頼をうけたバイトコード管理部２２５０は、バイトコード記憶部２６００から、同じ値のＩＤ２６１１を持つバイトコード２６１０を検索し、バイトコードのアドレスをセキュアインタプリタ２２１０に返す（ステップＳ３３０）。
バイトコードのアドレスを受け取ったセキュアインタプリタ２２１０は、バイトコードの実行を行う（ステップＳ３４０）。【００８６】
この実行においては、セキュアインタプリタ２２１０は、実行に必要なメタ情報はクラス記憶部１３００を参照し、スタックの領域やヒープの領域は、ワーク領域１４００を使用する。
次に、保護対象クラスのバイトコードが実行される場合を、具体例を用いて説明する。
図１４に、バイトコードの実行処理を表すフローチャートを示す。このフローチャートは、図１５に示す、Ｊａｖａ（登録商標）言語のメソッド４０００を実行する場合のフローチャートであり、以下、このメソッド４０００を実行する例を説明する。【００８７】
このメソッド４０００は、保護対象クラス１２２０のクラスファイルのメソッドであるとする。従って、このメソッドのバイトコードは、バイトコード記憶部２６００に記憶されている。図１６に、メソッド４０００をコンパイルし、得られたバイトコード４１００を示す。
メソッド４０００のプログラムは、引数にint型の２つの値をとり、２つの値を足し算したサイズのint型の配列を作成して、int型の配列を返り値とするプログラムである。【００８８】
このバイトコード４１００を実行する際の動作を図１４のフローチャートと、フレームの領域とヒープの領域との遷移図、図１７〜図２０とを用いて説明する。
セキュアインタプリタ２２１０はまず、通常実行部１０００のワーク領域１４００のフレーム領域１４２０にフレーム１４３０を作成する。具体的には、呼出元のＪａｖａ（登録商標）フレーム１４４０の上に、いまから実行するメソッド４０００のＪａｖａ（登録商標）フレーム１４３０を積み上げる（ステップＳ７００）。【００８９】
呼出元のＪａｖａ（登録商標）フレーム１４４０とは、いまから実行するメソッド４０００を呼出したメソッドのＪａｖａ（登録商標）フレームであり、各フレームは、同様の構成を有している。
図１７は、セキュアインタプリタ２２１０がいまから実行するＪａｖａ（登録商標）フレームを積み上げた時点での、ワーク領域１４００の状態である。【００９０】
ワーク領域１４００には、Ｊａｖａ（登録商標）ヒープ１４１０、Ｊａｖａ（登録商標）フレーム１４３０、呼出元Ｊａｖａ（登録商標）フレーム１４４０が生成される。
Ｊａｖａ（登録商標）ヒープ１４１０は、仮想マシン１１００が利用するワーキングメモリであり、Ｊａｖａ（登録商標）ヒープ管理部１１４０（図８参照）が管理している。
Ｊａｖａ（登録商標）フレーム１４３０は、セキュアインタプリタ２２１０がいまから実行するメソッドのワーキングメモリであり、ローカル変数領域１４５０とオペランドスタック１４６０とから構成される。【００９１】
ローカル変数領域１４５０とは、メソッドが持つローカル変数を保存する領域である。セキュアインタプリタ２２１０がＪａｖａ（登録商標）フレーム１４３０を作成したときに、引数で与えられているint型の２つの値「ｉ」と「ｊ」とが、ローカル変数領域の１番目（１４５２）と２番目（１４５１）にそれぞれロードされる。
オペランドスタック１４６０とは、メソッドが実行する演算を行うスタックであり、例えば、メソッドの中にローカル変数の足し算をするコードがあった場合、ローカル変数領域１４５０からデータをオペランドスタック１４６０にロードし、足し算をオペランドスタック１４６０上で行い、ローカル変数領域１４５０にストアする、といった使われ方をする。【００９２】
引数をフレームに積んだ、セキュアインタプリタ２２１０は、バイトコード４１００の処理を開始する。
バイトコード４１００の１〜３行のコード４１０１は、スタック演算であり、次のように処理が進められる（ステップＳ７１０）。
ｉｌｏａｄ命令は、ローカル変数領域にある変数の値をオペランドスタックにロードする命令である。また、ｉａｄｄ命令はオペランドスタックに積まれた上から２つの値を足し合わせる命令である。【００９３】
「ｉｌｏａｄ＿１」及び「ｉｌｏａｄ＿２」で、オペランドスタック１４６０に引数で渡された「ｉ」１４５２の値と「ｊ」１４５１の値を積み、オペランドスタックに積まれたiの値とｊの値の足し算を行う。
足し算の結果「ｉ＋ｊ」１４６１をオペランドスタック１４６０に置く。このとき、積まれていた引数「ｉ」と「ｊ」は、削除される。【００９４】
その結果のワーク領域１４００の状態を、図１８に示す。
次に、セキュアインタプリタ２２１０は、バイトコード４１００のコード「ｎｅｗａｒｒａｙ」４１０２を実行する。
ｎｅｗａｒｒａｙ命令は、Ｊａｖａ（登録商標）ヒープ１４１０に、オペランドスタックの一番上にある値の数の要素数を持つ配列の領域を確保する命令である。領域を確保した状態のワーク領域１４００の状態を、図１９に示す。【００９５】
ｎｅｗａｒｒａｙ命令では、Ｊａｖａ（登録商標）ヒープに他のスレッドからも同時のタイミングで書き込みを行われることを防ぐために、通常実行部１０００のＯＳ１０２０が提供するロック機能を利用して、領域を確保する前に、Ｊａｖａ（登録商標）ヒープのロックを獲得する必要がある。
そこで、セキュアインタプリタ２２１０は、直接には、通常実行部１０００のＯＳ１０２０が提供するロック機能は利用することができないので、「ｎｅｗａｒｒａｙ」４１０２をフェッチした時点で、オペランドスタック１４６０の一番上の値「ｉ＋ｊ」１４６１をオペランドスタック１４６０から取り出し（図１８参照）、この値を引数として、仮想マシン１１００のＪａｖａ（登録商標）ヒープ管理部１１４０を呼出す（ステップＳ７２０）。【００９６】
Ｊａｖａ（登録商標）ヒープ管理部１１４０は、ＯＳ１０２０が提供するロック機能を利用して、Ｊａｖａ（登録商標）ヒープ１４１０のロックを獲得する。
ロックが獲得できたことを確認した後で、Ｊａｖａ（登録商標）ヒープ管理部１１４０は、Ｊａｖａ（登録商標）ヒープ１４１０に、引数として受け取った「ｉ＋ｊ」のサイズを持つオブジェクト１（１４１１）を確保し（ステップＳ７３０）、オブジェクト１への参照１４６２をオペランドスタックに積む（ステップＳ７４０、図１９参照）。【００９７】
この時点でのワーク領域１４００の状態が、図１９に示す図である。
領域の確保が終わると、処理をセキュアインタプリタ２２１０に復帰させ、セキュアインタプリタ２２１０は、「ｎｅｗａｒｒａｙ」４１０２の次の処理を開始する。
セキュアインタプリタ２２１０は、バイトコード４０００の「ａｒｅｔｕｒｎ」４１０３の処理を行う。【００９８】
セキュアインタプリタ２２１０は、「ａｒｅｔｕｒｎ」４１０３をフェッチした時点で、現在のメソッドの処理が終了したことを知り、メソッド４０００のワーキングメモリであるＪａｖａ（登録商標）フレーム１４３０を破棄し、呼出元のＪａｖａ（登録商標）フレーム１４４０上に、オペランドスタック１４６０の一番上の値、オブジェクト１への参照１４４２を積む（ステップＳ７５０）。【００９９】
その時点でのワーク領域１４００の状態を図２０に示す。
最後に、セキュアインタプリタ２２１０は、処理をインタプリタ１１１０に戻す。
これで、バイトコード４１００の実行が終了し、その次の処理を通常実行部１０００が続けることになる。
この例のように、バイトコードの実行に際して、保護実行部２０００内では処理部できない処理がある場合には、通常実行部１０００に処理を依頼する。この場合でも、バイトコード自体は、保護されている。【０１００】
以上の説明ではｎｅｗａｒｒａｙ命令を例にとり、ＯＳ１０２０が提供するロック機能を利用する際に、セキュアインタプリタ２２１０から通常実行部１２０に処理を移していたが、上記以外の場合にも、通常実行部１０００への遷移が必要になる場合がある。
例えば、セキュアインタプリタ２２１０が、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０を呼出した場合には、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０は通常実行部１０００にしか存在しないため、通常実行部１０００に処理を移す必要がある。【０１０１】
以上、説明したように、バイトコードを保護実行部２０００のバイトコード記憶部２６００のみに記憶するため、不正なユーザがデバッガ等を利用して、Ｊａｖａ（登録商標）アプリケーションを盗聴、改竄を試みても、バイトコードにアクセスができないため、盗聴、改竄は不可能になる。
＜実施形態２＞
実施形態１では、メソッドのバイトコードのすべてを保護実行部２０００内に記憶して実行しているが、実施形態２では、バイトコードの一部のみを保護実行部２０００内に記憶して実行する点が異なる。【０１０２】
本実施形態の実行装置は、保護実行部から通常実行部のメモリへのアクセスが制限される場合に、特に有効である。
というのは、実施形態１では、第２ＣＰＵ２９００から第１ＲＡＭ１９１０へのアクセスが可能という前提があるので、保護実行部がバイトコードを実行する際に、通常実行部のメモリにあるメタ情報へのアクセスは容易であった。【０１０３】
しかし、第２ＣＰＵ２９００が第１ＲＡＭ１９１０にアクセスできない場合には、メタ情報が必要となるたびに、通常実行部１０００に遷移する必要があり、また、Ｊａｖａ（登録商標）ヒープ上のデータの読込み、書込みを行う場合にも、通常実行部１２０に遷移する必要があることから、実行速度の観点で実用的ではない場合がある。
そこで、本実施形態では、第２ＣＰＵ２９００が、第１ＲＡＭ１９１０にアクセスできない場合でも、不正なユーザからバイトコードを保護しながら、実行速度も保持できる実行装置を説明する。【０１０４】
以下、実施形態１と相違する点について説明する。
＜構成＞
図２１は、実施形態２の実行装置の構成を示す機能ブロック図である。
構成は、実施形態１の実行装置とほぼ同様である（図４参照）。但し、保護実行部２０００から通常実行部１０００のメモリを直接アクセスできないことに伴って、一部の機能部の機能が異なる。【０１０５】
以下、実施形態１の実行装置との相違点を説明する。
実行装置５００は、通常実行部５０００と保護実行部６０００とで構成される。
通常実行部５０００は、アプリケーション記憶部１２００、仮想マシン５１００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵ１９００とを備える。
アプリケーション記憶部１２００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵ１９００は、実施形態１と同様である。【０１０６】
仮想マシン５１００は、ローダ５１２０とインタプリタ５１１０とを備え、基本的には、それぞれ実施形態１のローダ１１２０とインタプリタ１１１０と同様の機能を有する。
実施形態１のインタプリタ１１１０は、クラスの実行時に、バイトコードが通常実行部１０００にあるか保護実行部２０００にあるかを、メタ情報内のバイトコード分割フラグを参照して判断していたが（図１２、図１３参照）、本実施形態のインタプリタ５１１０は、バイトコード内の分割フラグを参照する点が異なる。バイトコード内に分割フラグを設定する方法は、後述する＜メタ情報等が必要でないコードの部分を選び出す方法＞で説明する。【０１０７】
また、実施形態１のローダ１１２０は、ロードしようとするクラスが暗号化されている場合には、クラスファイルのアドレスとサイズを渡して、保護実行部２０００にクラスファイルの読み込みを依頼したが、本実施形態のローダ５１２０は、読み込んだ暗号化クラスファイルを渡す点が異なる。保護実行部６０００は、クラスファイルが記憶されているアプリケーション記憶部１２００にアクセスできないからである。【０１０８】
保護実行部６０００は、復号処理部６１００、復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード処理部６２００、バイトコード記憶部２６００、ワーク領域６７００及び第２ＣＰＵ２９００を備える。
復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード記憶部２６００及び第２ＣＰＵ２９００は、実施形態１と同様である。【０１０９】
復号処理部６１００は、基本的に実施形態１の復号処理部２１００と同様にクラスファイルの復号化を行うが、復号処理部２１００がアプリケーション記憶部１２００からクラスファイルを読み込んで復号化したのに対し、復号処理部６１００は、通常実行部５０００から渡されるクラスファイルを復号化する点が異なる。
バイトコード処理部６２００は、セキュアインタプリタ６２１０とセキュアローダ６２２０を備える。【０１１０】
セキュアインタプリタ２２１０は、実行中に、通常実行部１０００のメモリに記憶されているメタ情報やピープにアクセスしていたが、セキュアインタプリタ６２１０は、実行時にメタ情報等をアクセスしない点が異なる。
また、セキュアローダ２２２０は、メタ情報を直接クラス記憶部１３００に書き込んだが、セキュアローダ５２２０は、第２ＣＰＵ２９００を介して一旦通常実行部５０００に出力し、第１ＣＰＵ１９００によって書き込む必要がある点が異なる。【０１１１】
ワーク領域６７００は、通常実行部５０００のワーク領域１４００と同様の機能を有する。
実施形態１では、バイトコードを実行する際に必要なフレームの領域を第１ＲＡＭ１９１０に確保されたワーク領域１４００に作成していたが、本実施形態では、第１ＲＡＭ１９１０にアクセスできないので保護実行部６０００内の第２ＲＡＭ２９１０に確保することとする。尚、ヒープの領域は、実施形態１と同様に通常実行部５０００のワーク領域１４００に確保する。【０１１２】
＜動作＞
本実施形態の実行装置の動作の説明として、アプリケーションのロードと実行の２つのフェーズに分けて説明する。
＜クラスのロード処理＞
まず、各クラスをロードする処理、すなわち、アプリケーションプログラム１２１０のクラスファイルを仮想マシン５１００が実行可能な内部形式に変換し、ロードする手順について説明する。【０１１３】
図２２は、実行装置５００のロード処理を表すフローチャートである。この  ロード処理は、通常実行部５０００のローダ５１２０と保護実行部６０００のセキュアローダ６２２０が行う処理である。
また、図２３は、保護対象クラスのクラスファイルがロードされた、クラス記憶部１３００とバイトコード記憶部２６００の状態を示す図である。【０１１４】
まず、インタプリタ５１１０がローダ５１２０に、クラスファイル名を渡してロードを依頼し、依頼を受けたローダ５１２０は、渡されたクラスファイル名のクラスが、暗号化されたクラスか否かを判断し（ステップＳ２００）、保護対象クラスでないと判断した場合は（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードする（ステップＳ２６０）。【０１１５】
一方、ロードの依頼を受けたクラスが、保護対象クラスであると判断した場合は（ステップＳ２００：ＹＥＳ）、ロードするクラスをアプリケーション記憶部１２００から読み出し、読み出したクラスファイルを復号処理部６１００に渡す（ステップＳ４１０）。
クラスファイルを受け取った復号処理部６１００は、受け取ったクラスファイルを暗号鍵記憶部２５００に記憶されている復号化鍵２９２３を用いて復号化し、復号化クラス記憶部２４００に記憶する（ステップＳ４２０）。【０１１６】
復号化クラスファイルを作成した復号処理部６１００は、その旨バイトコード処理部６２００に通知し、通知を受けたバイトコード処理部６２００は、セキュアベリファイヤ２２３０に復号化クラスファイルを検査させ、セキュアローダ６２２０にロードを依頼する。
ロードの依頼を受けたセキュアローダ６２２０は、復号化クラスファイルの構文を分析し、仮想マシン５１００が実行可能な内部形式に変換する。このときに、セキュアローダ６２２０は、復号化クラスファイルのタグから、バイトコードの部分とメタ情報の部分の判別を行い、分割する（ステップＳ４３０）。【０１１７】
次に、セキュアローダ６２２０は、バイトコードから、実行時にメタ情報、およびＪａｖａ（登録商標）ヒープにアクセスが必要でないバイトコードの部分を選び出す。メタ情報等が必要でないコードの部分を選び出す方法は、図２４を用いて後で説明する。
セキュアローダ６２２０は、メタ情報が必要でないバイトコードと、メタ情報が必要なバイトコードに分割する（ステップＳ４４０）。【０１１８】
セキュアローダ６２２０は、メタ情報が必要でないバイトコードと、メタ情報が必要なバイトコードに分割したら、バイトコード管理部２２５０に依頼し、メソッドのメタ情報と、メタ情報が必要でないバイトコードとを関連付けるためのＩＤをそれぞれに付加する（図２３参照：ＩＤ５３３１とＩＤ６６１１）。
次に、セキュアローダ６２２０は、メタ情報とメタ情報等が必要なバイトコードを、第２ＣＰＵ２９００を介して第１ＣＰＵ１９００に転送する。第１ＣＰＵ１９００は、受け取ったメタ情報（図２３参照：クラス構造情報１３１０、コンスタントプール１３２０、メソッドのメタ情報５３３０）とメタ情報等が必要なバイトコード５３４０（図２３参照）をクラス記憶部１３００にロードする（ステップＳ４５０）。【０１１９】
また、セキュアローダ５２２０は、メタ情報が必要でないバイトコード６６１０（図２３参照）を、バイトコード記憶部２６００にロードする（ステップＳ４６０）。
＜メタ情報等が必要でないコードの部分を選び出す方法＞
メタ情報等が必要でないコードの部分を選び出す方法を説明するとともに、分割フラグの設定を、図２４に示すバイトコード７０００を参照しながら説明する。【０１２０】
１行目の「ｉｌｏａｄ＿１」と２行目の「ｉｌｏａｄ＿２」とは、ローカル変数領域の１番目の値をオペランドスタックに積む命令であり、メタ情報が必要でない命令である。オペランドスタックはワーク領域６７００のフレーム領域にある領域である。
また、３行目の「ｉａｄｄ」は、オペランドスタック上の値の足し算を行う命令であり、メタ情報が必要でない命令である。【０１２１】
従って、１行目から３行目までもバイトコード７００１は、メタ情報が必要でない命令である。
４行目の「ｎｅｗａｒｒａｙ」は、ワーク領域１４００上のＪａｖａ（登録商標）ヒープに領域を確保するため、Ｊａｖａ（登録商標）ヒープが必要となる命令である。
最後に「ａｒｅｔｕｒｎ」は、メソッドの後処理をするため、メタ情報が必要となる命令である。【０１２２】
従って、４行目と５行目のバイトコード７００２は、メタ情報およびＪａｖａ（登録商標）ヒープにアクセスが必要な命令である。
分割したバイトコードの例を、図２５に示す。
バイトコード７０００の１行目〜３行目のバイトコード７００１を、メタ情報が必要でないバイトコード７２００として作成する。連続した行のバイトコードを１つの塊として切り出す。本実施形態では、メソッドに１つの例で説明する。【０１２３】
また、バイトコード７０００の中で、メタ情報が必要でないバイトコード７２００とし手分割したコードの部分を書き換えたものを、メタ情報が必要なバイトコード７１００とする。
メタ情報が必要なバイトコード７１００は、分割された先頭の部分に分割されたことを示す分割フラグ７１０１を埋め込んでおく。具体的には、予め決めた、分割フラグである旨を示す命令コードを記載する。【０１２４】
分割された先頭以外の部分、すなわちバイトコード記憶部２６００に記憶されているコードの部分にはｎｏｐ命令等の意味のないコード７１０２を埋め込んでおく。
以上のように構成することにより、クラスファイルのバイトコードの一部がデバッガ等により、解析できない領域にロードすることが可能となる。
尚、メソッドに複数の、メタ情報が必要でないバイトコードの塊がある場合は、分割フラグ７１０１と該当するバイトコードを対応付けておくことで、実行が可能となる。例えば、分割フラグと対応するバイトコードとに共通のＩＤを振るなどである。【０１２５】
＜クラスの実行処理＞
次に、実行装置５００が、バイトコード７０００を実行する処理について図２６を用いて説明する。
図２６は、クラスの実行の処理を表すフローチャートである。
まず、クラスを実行するにあたり、インタプリタ５１１０はメソッドを呼出す（ステップＳ５００）。【０１２６】
インタプリタ５１１０は、いまから実行するメソッドのＪａｖａ（登録商標）フレームを、ワーク領域１４００に作成し、メタ情報が必要なバイトコード７１００の実行を開始する（ステップＳ５１０）。
まず、インタプリタ５１１０は、命令をフェッチすると、その命令が分割フラグ７１０１であるか否かを判別する（ステップＳ５２０）。【０１２７】
分割フラグ７１０１でない場合（ステップＳ５２０：ＮＯ）、すなわち、他の命令コードであった場合は、メソッド終了以外（ステップＳ５７０：ＮＯ）は、通常実行部５０００でその命令の実行を行う（ステップＳ５１０）。
分割フラグ７１０１である場合（ステップＳ５２０：ＹＥＳ）は、インタプリタ５１１０は、処理を保護実行部内６０００内のバイトコード処理部６２００に処理を依頼する（ステップＳ５３０）。この依頼の際、実行中のメソッドのＪａｖａ（登録商標）フレーム内のローカル変数領域とオペランドスタック、およびメソッドのメタ情報５３３０内のＩＤ５３３１の値を引数として渡す。【０１２８】
依頼を受けたバイトコード処理部６２００のセキュアインタプリタ６２１０は、バイトコード管理部２２５０に、受け取ったＩＤ５３３１の値を渡して、同じ値のＩＤを持つバイトコードの検索を依頼する。
バイトコード管理部２２５０は、バイトコード記憶部２６００から、受け取ったＩＤ５３３１の値と一致するＩＤ６６１１を有するメタ情報が必要でないバイトコード６６１０を検索する（ステップＳ５４０）。【０１２９】
ＩＤの値が一致するメタ情報が必要でないバイトコード６６１０を見つけたバイトコード管理部２２５０は、バイトコードのアドレスをセキュアインタプリタ６２１０に返す。例えば、図２５のメタ情報が必要でないバイトコード７２００のアドレスである。
セキュアインタプリタ６２１０は、引数として受け取ったローカル変数領域とオペランドスタックを利用して、メタ情報が必要でないバイトコード６６１０の処理を行う（ステップＳ５５０）。【０１３０】
メタ情報が必要でないバイトコード６６１０が実行中には、通常実行部５０００のメモリ上のデータの読み込み、書き込みをすることは不要なので、バイトコード処理部６２００ですべての処理が可能である。
メタ情報が必要でないバイトコード６６１０の実行が完了すると、ローカル変数領域、オペランドスタック、および、通常実行部５０００のインタプリタ５１１０が次に実行する命令を指すプログラムカウンタを返り値として、処理をインタプリタ５１１０に復帰させる（ステップＳ５６０）。【０１３１】
インタプリタ５１１０は、メタ情報が必要なバイトコード６６１０の返り値として受け取ったプログラムカウンタから続きを実行する（ステップＳ５７０、ステップＳ５１０）。
以降の処理は従来のＪａｖａ（登録商標）仮想マシンと同じである。
＜実施形態３＞
実施形態３の実行装置は、通常実行部と保護実行部とがそれぞれマルチタスクで動作可能なものである。【０１３２】
実施形態１と実施形態２では、第１ＣＰＵと第２ＣＰＵが交互に動作することを前提としていた。
本実施形態では、第１ＣＰＵと第２ＣＰＵが同時に動作するときに、実行装置がアプリケーションを保護しながら実行する方式を説明する。
＜構成＞
図２７は、本実施形態を実行するための、実行装置８００の構成例を示す図である。【０１３３】
セキュアＯＳ８１００以外は、実施形態１と同様の構成である（図１参照）。
第２ＣＰＵ２９００は、通常実行部１０００内の第１ＲＡＭ１９１０に対して読み込み、書き込みが可能である点も、実施形態１と同様である。
また、第２ＣＰＵ２９００は、第１ＣＰＵ１９００とは、物理的に異なるＣＰＵである。【０１３４】
ここでは、セキュアＯＳ８１００のみ説明する。
セキュアＯＳ８１００は、保護実行部８０００内の第２ＣＰＵ２９００上で動作する、Ｌｉｎｕｘ等のマルチタスクをサポートしているＯＳである。
同一のスレッドの処理が、同じ時間に、保護実行部８０００と通常実行部１０００内とで動作していることはないものとする。【０１３５】
＜動作＞
次に、実行装置８００が、アプリケーションを実行する方法を説明する。
実行に先立って行われるクラスファイルのロード処理は、実施形態１と同様である（図１１等参照）。また、機能ブロックは、実施形態１と同様であるため、図４を参照して、本実施形態の実行装置の動作を説明する。【０１３６】
図２８は、実施形態３のクラス実行の処理を表すフローチャートである。
点線で示したステップは、ターゲットとなるクラスの実行に関する処理を表している。
通常実行部１０００のインタプリタ１１１０が、スレッドの実行開始し（ステップＳ６００）、スレッドが保護対象クラスのメソッドのものであった場合、  保護実行部８０００に処理を依頼する。以下、この依頼された処理を、「当該処理」という。【０１３７】
インタプリタ１１１０は、ＯＳ１０２０を介して、保護実行部８０００のセキュアＯＳ８１００に当該処理を依頼する（ステップＳ６１０）。
セキュアＯＳ８１００は、保護実行部８０００が行っている処理を一時停止し、依頼を受けたスレッドの当該処理を受け取り（ステップＳ７００）、当該処理を受け取ったことをＯＳ１０２０に通知する。【０１３８】
このときに、通常実行部１０００のインタプリタ１１１０は、当該処理を依頼したスレッドを、保護実行部８０００からの処理完了通知待ち状態にする（ステップＳ６２０）。
以降の処理は、通常実行部１０００と保護実行部８０００とが並行に動作を開始する。
セキュアＯＳ８１００は、当該処理をセキュアＯＳ８１００のスケジューラに渡して登録する（ステップＳ７１０）。当該処理の開始は、セキュアＯＳ８１００内のスケジューラが管理する。【０１３９】
通常実行部１０００のインタプリタ１１１０は、他のスレッドの処理を実行する（ステップＳ６３０）。
一方、保護実行部８０００のバイトコード管理部２２００も、スケジューラに処理を渡した後は、当該処理を渡される前に実行していたバイトコード処理部２２００の処理を継続する（ステップＳ７２０）。【０１４０】
その後、保護実行部８０００では、スケジューラにより当該処理の開始通知をバイトコード管理部２２００が受け取り、当該処理を開始する（ステップＳ７３０）。
バイトコード管理部２２００が当該処理の実行を完了すると、完了を検出したセキュアＯＳ８１００が、通常実行部１０００のＯＳ１０２０に処理の完了を通知する（ステップＳ７４０）。【０１４１】
保護実行部８０００より完了通知を受け、通常実行部１０００のインタプリタ１１１０は待ち状態になっていた処理を再び開始する。（ステップＳ６４０）。
その後、通常実行部１０００と保護実行部８０００では、それぞれスケジューラの指示に従い、他の処理を実行していく（ステップＳ６５０、ステップＳ７５０）。
以上説明したように、バイトコードを保護実行部８０００にのみ記憶し、不正行為を防ぐことができることに加え、２つのＣＰＵが並列で動作することにより、実行速度が向上する。【０１４２】
なお、実施形態３では、バイトコードのすべてを第２ＲＡＭに記憶し、保護実行部内で処理をしていたが、実施形態２のようにバイトコードの一部を第２ＲＡＭに記憶しても本発明は実施可能である。
＜補足＞
以上、本発明に係る実行装置について実施形態に基づいて説明したが、この実行装置を部分的に変形することもでき、本発明は上述の実施形態に限られないことは勿論である。即ち、
（１）実施形態では、クラスファイルが暗号化されているか否かを判別する場合に、保護対象クラス一覧を参照することとしているが、他の方法であっても良い。  【０１４３】
例えば、保護対象クラス一覧を使用せずに、クラスファイルの特定箇所に特定のコードが入っていないなど、通常のクラスファイルと異なることを判別できればよい。また、復号化の過程で、正当性を検証することとしてもよい。実行中にエラーとなることを防ぎ、実行自体を停止することができるという利点がある。
また、アプリケーションをダウンロードする場合は、ダウンロードする別のファイルに判別するための情報がはいっていてもよい。アプリケーションが放送波によって送られてくるものである場合には、多重化されて送られてくるファイルを利用して判別してもよい。【０１４４】
またさらに、アプリケーションプログラムの開発者が、クラスファイルの名前に保護が必要なクラスに特定の文字列を付加し、実行時に、クラスファイルの名前から実行時の保護が必要かを判断をしてもよい。
さらに、実施形態では、保護対象クラス一覧に載っているクラスは、保護が必要で暗号化されているものとしているが、暗号化されているすべてのクラスを載せる必要はなく、作成者が保護したいと希望するクラスのみでもよい。【０１４５】
この場合、例えば、通常実行部でも復号化する機能部を備え、保護対象クラス一覧に乗っていない暗号化されたクラスを復号化して実行する。
また、実施形態では、アプリケーションのクラスファイル名を載せることとしているが、その他、Ｊａｖａ（登録商標）仮想マシン内のクラスライブラリに含まれるクラス名などを記載していてもよい。【０１４６】
また、実施形態では、クラス全体を暗号化しているが、クラス内のバイトコードのみを暗号化しておいても良い。この場合、バイトコードのみを保護実行部に送ることとしてもよい。
また、実施形態では、暗号鍵は１つとして説明しているが、複数を使い分けても良い。例えば、保護対象クラス一覧に、使用する暗号鍵を特定できる情報を入れておき、その情報によって特定される暗号鍵でクラスを復号化するなどである。
（２）実施形態１では、バイトコード分割フラグをメソッドのメタ情報内に用意したが、他の場所に作成しても良い。【０１４７】
たとえば、クラス情報構造情報にフラグを用意してもよい（図１２等参照）。
（３）実施形態１、実施形態２及び実施形態３では、保護実行部で処理が必要なときだけに保護実行部に処理を依頼していたが、保護実行部で処理が必要でないときであっても保護実行部に処理を依頼し、保護実行部は何も処理を行わずに処理を通常実行部に返してもよい。【０１４８】
クラスの実行時に、必ず保護実行部に制御が移ることで、本当に保護したいクラスの特定を困難にする効果がある。
なお、実施の形態では、実行するＪａｖａ（登録商標）アプリケーションや仮想マシンを通常実行部のメモリにおいておき、そのクラスファイルをロードするときに、保護実行部で実行すべきバイトコードであるか否かを判別していたが、予め、第２ＲＯＭに、保護すべきバイトコードを記憶しておき、実行時に第２ＲＡＭにロードしてもよい。この場合、メタ情報とバイトコードを対応付ける情報、例えば、ＩＤは、予め設定しておく必要がある。
（４）実施形態１及び実施形態２では、実行装置１００の第１ＣＰＵ１９００と、保護実行部２０００の第２ＣＰＵ２９００とは、物理的に異なるＣＰＵであるとしているが、物理的に１つのＣＰＵが、動作モードを切り替えるなどの方法で仮想的に２つのＣＰＵのように振舞うこととしてもよい。また、マルチコアＣＰＵのように、１つのＣＰＵパッケージのなかに複数のＣＰＵコアを持つＣＰＵでは、そのうちの特定のコアを第２ＣＰＵとして動作させてもよい。【０１４９】
また、実施形態では、通常実行部１０００と保護実行部２０００とにそれぞれ、ＲＡＭおよびＲＯＭを持つこととしているが、１つのＲＡＭを仮想的に２つのＲＡＭとして扱ってもよい。同様に、１つのＲＯＭを仮想的に２つのＲＯＭとして扱ってもよい。さらに、保護実行部２０００内のＲＯＭは第２ＣＰＵ２９００に混載されていてもよい。
（５）実施形態では、実行装置１００で実行するアプリケーションは、アプリ取得プログラム１０１０が、インターネット上にあるサーバから、ダウンロードしたものであるが、ほかの方法で取得したアプリケーションであってもよい。【０１５０】
例えば、デジタル放送のデータ放送として、ＭＰＥＧ（Moving Picture Coding Experts Group）２トランスポートストリーム内に埋め込まれたＪａｖａ（登録商標）アプリケーションであってもよい。
この場合、アプリ取得プログラム１０１０は、トランスポートストリーム内に埋め込まれたＪａｖａ（登録商標）アプリケーションを実行装置１００内に読み出すプログラムとなる。【０１５１】
ＭＰＥＧ２トランスポートストリームにＪａｖａ（登録商標）プログラムを埋め込む方法としては、例えば、ＤＳＭＣＣ方式がある。ＤＳＭＣＣ方式とは、ＭＰＥＧ２トランスポートストリームのパケットの中に、コンピュータで使用されているディレクトリやファイルで構成されるファイルシステムをエンコードする方法である（ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−１、ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−６参照）。【０１５２】
またさらに、実行装置１００で実行するアプリケーションは、ＳＤカード（Secure Digital memory card）、ＣＤ−ＲＯＭ（Compact Disk Read Only Memory）、ＤＶＤ（Digital Versatile Disk）、Ｂｌｕ−ＲａｙＤｉｓｃ等に記録されたＪａｖａ（登録商標）アプリケーションであってもよい。
この場合、アプリ取得プログラム１０１０は、これらの記録媒体からアプリケーションを読み出すプログラムとなる。【０１５３】
また、実行装置１００で実行するアプリケーションは、実行装置１００内にあるＲＯＭなどに記録されたＪａｖａ（登録商標）アプリケーションであってもよい。
この場合、アプリ取得プログラム１４００は、ＲＯＭから作業メモリに、Ｊａｖａ（登録商標）アプリケーションを読み出すプログラムとなる。
さらに、近年、デジタルＴＶや携帯電話などの電子機器では、Ｊａｖａ（登録商標）言語で記述されたプログラムをダウンロードし、実行する機能を搭載するものが増加している。例えば携帯電話では、ＮＴＴ  ＤｏＣｏＭｏがｉ−アプリと呼ばれるサービスを提供している。このサービスは、携帯電話端末がインターネット上にあるアプリケーション配信サーバからＪａｖａ（登録商標）プログラムをダウンロードして、端末上で実行する。また、欧州では、ＤＶＢ−ＭＨＰ（Ｄｉｇｉｔａｌ  Ｖｉｄｅｏ  Ｂｒｏａｄｃａｓｔｉｎｇ−Ｍｕｌｔｉｍｅｄｉａ  Ｈｏｍｅ  Ｐｌａｔｆｏｒｍ）と呼ばれる仕様が策定され、既に仕様に準拠した運用が開始されている。ＤＶＢ−ＭＨＰ規格に基づくデジタル放送では、放送波に多重化されたＪａｖａ（登録商標）プログラムをデジタルＴＶが受信し、それを実行する。【０１５４】
この場合、アプリ取得プログラム１０１０は、ＴＬＳ（Transport Layer Security）、ＨＴＴＰ（Hypertext Transfer Protocol）等のプロトコルに従いＪａｖａ（登録商標）アプリケーションをダウンロードする機能を有するプログラムとなる。
ここで、ＴＬＳは暗号化により通信時のデータの盗聴、改竄を防ぐデータ転送方式である（ＲＦＣ２２４６参照）。また、ＨＴＴＰは、インターネット上のデータ通信で一般的に用いられているデータ転送方式である（ＲＦＣ２６１６参照）。【０１５５】
尚、ＲＦＣ（Request For Comments）とは、インターネット上の技術を規格化するＩＥＴＦ（Internet Engineering Task Force）の公式文書であり、プロトコルなど様々な技術の使用がまとめられているものである。
（６）本実施形態では、アプリ取得プログラム１０１０などはＪａｖａ（登録商標）言語で記述されたＪａｖａ（登録商標）プログラムなどの他、ネイティブ言語で記述されたプログラムや、ハードウェアで実現されていてもよい。【０１５６】
また、仮想マシンで実行するアプリケーションは、Ｊａｖａ（登録商標）言語で記述されたものに限らず、Ｃ＋＋などの他のオブジェクト指向言語で記述されたものであってもよい。また、Ｊａｖａ（登録商標）仮想マシン自体も、オブジェクト指向言語で記述されても、非オブジェクト指向言語で記述されてもよい。
（７）実施形態の保護実行部２０００は、例えば、ＡＲＭ社のＴｒｕｓｔＺｏｎｅ（登録商標）技術を使うことで実現することができる。【０１５７】
ＴｒｕｓｔＺｏｎｅ（登録商標）技術では、ＲＡＭやＲＯＭなどのハードウェア資源の一部をセキュアドメインと呼ばれる仮想的に実行環境に割り当てることができる。セキュアドメインに割り当てられたＲＡＭやＲＯＭは、セキュアドメインで動作するプログラムのみが利用可能であり、セキュアドメイン以外で動作するプログラムからは一切利用することができない。【０１５８】
従来のＣＰＵでは、アプリケーションが動作する通常モードとＯＳなどが動作する特権モードの２種類のモードを持ち、通常モードで動作するプログラムからは特権モードで動作するプログラムを改ざんすることができないようになっている。
ＴｒｕｓｔＺｏｎｅ（登録商標）技術では、さらに、モニターモードと呼ばれる特殊なモードが新しく用意される。モニターモードへは、ＣＰＵが用意する特殊な命令を実行することで遷移することができる。モニターモードでＣＰＵが動作するときには、Ｓ−ｂｉｔと呼ばれるセキュリティ情報がＲＡＭやＲＯＭなどの周辺ハードに通知される。ＴｒｕｓｔＺｏｎｅ（登録商標）技術に対応したＲＡＭやＲＯＭは、Ｓ−ｂｉｔが通知された場合に限り、セキュアドメインに割り当てられた領域へのデータの読み書きを許可するように構成されている。またセキュアドメインに割り当てられていない領域へのデータへの読み書きはＳ−ｂｉｔが通知されているか否かに関わらず読み書きを許可する。このように、安全な実行部はセキュアドメインにより実現することができる。【０１５９】
また、Ｉｎｔｅｌ社のＬａＧｒａｎｄｅ技術でも、通常のアプリケーションやＯＳが動作するドメインと保護が必要なアプリケーションが動作するドメインを仮想的に分離するなど、ＴｒｕｓｔＺｏｎｅ（登録商標）技術と同様の機能を提供している。このような技術を使うことで安全な実行部を実現することができる。
（８）実施形態では、保護実行部２０００は、実行装置１００に内蔵されているものとしているが、実行装置１００から着脱可能なスマートカードやＩＣカードなどであることとしてもよい。このスマートカード、ＩＣカードはカード内部にＣＰＵやメモリ、セキュリティ回路を含むものである。【０１６０】
保護実行部２０００は、その全体をハードウエアにより実現してもよい。
この場合、第１ＣＰＵと第２ＣＰＵ間のデータ通信は暗号化して行い、第３者による盗聴を防ぐことが必要となる。具体的には、両ＣＰＵを結ぶデータバスを介してデータを送信する際に、送信するデータを暗号化し、データを受信後に復号することで行われる。
（９）実施形態では、アプリケーションの実行環境プログラムとして、Ｊａｖａ（登録商標）仮想マシンを例に説明しているが、他の実行環境であってもよく、ＯＳであってもよい。【０１６１】
また、更に、アプリケーションが実行環境プログラムに該当する場合には、そのアプリケーション自体を秘匿するバイトコードの対象としてもよい。
（１０）実施形態で示した実行装置の各機能を実現させる為の各制御処理（図４等参照）をＣＰＵに実行させる為のプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体には、ＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ、フラッシュメモリ等がある。流通、頒布されたプログラムは、機器におけるＣＰＵで読み取り可能なメモリ等に格納されることにより利用に供され、そのＣＰＵがそのプログラムを実行することにより実施形態で示した実行装置の各機能が実現される。
（１１）実行装置における保護実行部（２０００、６０００、８０００）は典型的には集積回路であるＬＳＩとして実現される。これらは個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されても良い。【０１６２】
ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Field Programmable Gate Array）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサー を利用しても良い。【０１６３】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
【産業上の利用可能性】
【０１６４】
本発明に係るアプリケーションの実行装置は、アプリケーションの実行、解析に不可欠なバイトコードを、ハードウエアなどで実現された、盗聴、改竄が困難な保護実行部へと隠蔽することで、アプリケーションを実行時の盗聴、改竄から保護することができ、今後本格展開が予想されるアプリケーションのダウンロード配信ビジネスにおいて、コンテンツに発生する作成者の権利などを保護することができる。
【図１】
2007011001.tif 000002
【図２】
2007011001.tif 000003
【図３】
2007011001.tif 000004
【図４】
2007011001.tif 000005
【図５】
2007011001.tif 000006
【図６】
2007011001.tif 000007
【図７】
2007011001.tif 000008
【図８】
2007011001.tif 000009
【図９】
2007011001.tif 000010
【図１０】
2007011001.tif 000011
【図１１】
2007011001.tif 000012
【図１２】
2007011001.tif 000013
【図１３】
2007011001.tif 000014
【図１４】
2007011001.tif 000015
【図１５】
2007011001.tif 000016
【図１６】
2007011001.tif 000017
【図１７】
2007011001.tif 000018
【図１８】
2007011001.tif 000019
【図１９】
2007011001.tif 000020
【図２０】
2007011001.tif 000021
【図２１】
2007011001.tif 000022
【図２２】
2007011001.tif 000023
【図２３】
2007011001.tif 000024
【図２４】
2007011001.tif 000025
【図２５】
2007011001.tif 000026
【図２６】
2007011001.tif 000027
【図２７】
2007011001.tif 000028
【図２８】
2007011001.tif 000029
【図２９】
2007011001.tif 000030
【手続補正書】
【提出日】平成20年1月23日(2008.1.23)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
オブジェクト指向言語で作成された、実行コードとメタ情報とを含む平文のクラスと暗号化されたクラスとを有するアプリケーションプログラムを実行するプログラム実行装置であって、
第１メモリと、第１プロセッサと、当該プロセッサにより実行される第１ローダとを含む第１実行デバイスと、
第２メモリと、第２プロセッサと、当該プロセッサにより実行される第２ローダと、当該第２メモリに記憶する暗号化されたクラスを復号化する復号化手段とを含む耐タンパ性を有する第２実行デバイスと、
クラスが平文のクラスか暗号化されたクラスかを判断する判断手段とを備え、
前記第１ローダは、前記判断手段にクラスが暗号化されたクラスか平文のクラスかを判断させ、平文のクラスと判断された場合は、当該クラスの実行コードと実行コードが第１メモリにロードされていることを示す管理情報を含むメタ情報とを第１メモリにロードし、暗号化されたクラスと判断された場合は、当該クラスを第２メモリに記憶させ、
前記第２ローダは、第２メモリに記憶された暗号化されたクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを第２メモリにロードし、当該復号化されたクラスに含まれる実行コードが前記第２メモリにロードされていることを示す管理情報を含むメタ情報を第１メモリにロードし、
前記第１プロセッサは、クラスを実行する際に、第１メモリにロードされた当該クラスのメタ情報に含まれる管理情報を参照し、前記管理情報が実行コードは第２メモリにロードされていることを示す場合は、前記第２プロセッサに第２メモリにロードされている当該実行コードの実行を依頼し、前記管理情報が実行コードは第１メモリにロードされていることを示す場合は、第１メモリにロードされている当該実行コードを実行する
ことを特徴とするプログラム実行装置。
【請求項２】
前記実行コードは、メソッドである
ことを特徴とする請求項１記載のプログラム実行装置。
【請求項３】
オブジェクト指向言語で作成された、実行コードとメタ情報とを含む暗号化されたクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する実行デバイスであって、
メモリと、プロセッサと、当該メモリに記憶する暗号化されたクラスを復号化する復号化手段と、
前記メモリに記憶されている暗号化されたクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスに含まれる実行コードが前記メモリにロードされていることを示す管理情報を含むメタ情報を当該実行コードと対応付けて、自デバイス外のメモリにロードするローダと
を備えることを特徴とする実行デバイス。
【請求項４】
オブジェクト指向言語で作成された、実行コードとメタ情報とを含む暗号化されたクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた、メモリとプロセッサとを有する耐タンパ性を有する実行デバイスに、ロード処理を行わせるコンピュータプログラムであって、
前記メモリに記憶する暗号化されたクラスを復号化する復号化ステップと、
前記メモリに記憶されている暗号化されたクラスを前記復号化ステップで復号化し、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスに含まれる実行コードが前記メモリにロードされていることを示す管理情報を含むメタ情報を当該実行コードと対応付けて、自デバイス外のメモリにロードするステップと
を備えることを特徴とするコンピュータプログラム。
【請求項５】
オブジェクト指向言語で作成された、実行コードとメタ情報とを含む暗号化されたクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する集積回路であって、
メモリと、プロセッサと、当該メモリに記憶する暗号化されたクラスを復号化する復号化手段と、
前記メモリに記憶されている暗号化されたクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスに含まれる実行コードが前記メモリにロードされていることを示す管理情報を含むメタ情報を当該実行コードと対応付けて、自デバイス外のメモリにロードするローダと
を備えることを特徴とする集積回路。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの盗聴および改竄を防止する技術に関し、特に、プログラム実行時に、プログラムが解析、改竄等されることを防止する技術に関する。
【背景技術】
【０００２】
近年、様々なアプリケーション・プログラム（以下、「アプリケーション」という。）が、パソコンをはじめ、デジタルテレビや携帯電話機などの情報処理機能を有した装置で実行されており、これらのアプリケーションは、例えば、プログラム配信サービスによりインターネット上のサーバからダウンロードされる。
これらのアプリケーションには、著作権等の知的財産権の他、さまざまな権利が発生している。
【０００３】
その一方で、アプリケーションが改竄されたり、データが盗まれたりという行為が起こっており、このような行為は、アプリケーションに発生している権利の観点から許されるべきものではない。
このような不正行為からアプリケーションを守るために、従来からさまざまな方法が取られており、その一つとして、アプリケーションのプログラム自体を複雑にする方法がある。
【０００４】
通常、プログラムの改竄等を行う場合には、例えば、デバッガなどのツールを用いてメモリ上の実行中のプログラムを解析し、不正行為を行う。そこで、プログラムを複雑にして解析を困難にすることでプログラム自体を保護しようとするのである。
アプリケーションのプログラム自体を複雑にする方法として、実行時にメモリに配置されるプログラム内のデータと演算式とを、それぞれ複雑化してメモリに配置する方法が開示されている（特許文献１及び図２９参照）。
【０００５】
具体的には、この方法を実現するＣＰＵ（Central Processing Unit）２００は、符号化プログラム内のデータのうちデータ決定部２０２が決定したデータを、符号化規則決定部２０１が決定した方法を用いてデータ符号化部２０３で符号化し、そのデータを使用する演算式を演算式変換部２０４で複雑化したものをメモリに配置する。復号化が必要なデータは、復号化処理部２０５が復号化を行う。
【０００６】
この方法によれば、メモリ上のプログラム、すなわち、実行中のプログラムのデータやアルゴリズムを解読しにくくすることが可能となる。
【特許文献１】特開２００５−４９９２５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかし、プログラム自体の複雑化は、解析を困難にすることは可能ではあるが、時間さえかければ解析されてしまうという欠点がある。また、コピーが可能であれば、プログラム自体が複雑化されていても実行には問題がない。
解析やコピー等をさせないためには、アプリケーションをその実行環境と共に、耐タンパ性を有するデバイス内のメモリに置いて実行させることが望ましいが、サイズ面、コスト面などから現実的ではないことが多い。
【０００８】
特に、実行環境が仮想マシンであれば、そのプログラムは、通常、巨大なプログラムであることから尚更である。
そこで、本発明は、アプリケーションのプログラム自体を複雑にすることなく、また、大きな耐タンパ性を有するデバイスを必要とせずとも、アプリケーションのプログラムの重要な部分を、解析等の不正行為から防ぐことを可能とする実行装置の提供を目的とする。
【課題を解決するための手段】
【０００９】
上記課題を解決する為に、本発明の実行装置は、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置であって、それぞれメモリとプロセッサとを含む、第１実行デバイスと耐タンパ性を有する第２実行デバイスと、前記クラスをロードする際に、当該クラスの実行コードを第２実行デバイスのメモリにロードし、当該クラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を第１実行デバイス内のメモリにロードするローダとを備えることを特徴とする。
【発明の効果】
【００１０】
本発明に係る実行装置は、上述の構成を備えることにより、アプリケーションのクラスを実行している間、実行コードは耐タンパ性を有する実行デバイスのメモリにのみロードされ、実行されるので、実行時にデバッガ等を用いて実行コード部分を解析、改竄することが困難になり、アプリケーションを不正行為から守ることができるようになる。
クラスのうち実行コード部分のみが、耐タンパ性を有する実行デバイスのメモリに記憶されるので、クラス全体を記憶する場合等に比べ、耐タンパ性を有する実行デバイスは小さくなる。
【００１１】
また、前記クラスの実行コードは、暗号化されており、前記プログラム実行装置は、更に、暗号化されている情報を復号化する復号化手段を備え、前記ローダは、暗号化されている実行コードを、前記復号化手段に復号化させ、復号化された実行コードを第２実行デバイスのメモリにロードすることとしてもよい。
これにより、保護すべきクラスを暗号化できるので、アプリケーションをコピーしても実行することはできず、実行時以外でも保護することができ、且つ、実行時は耐タンパ性を有する実行部で実行してアプリケーションを保護することができるようになる。
【００１２】
また、前記クラスは、暗号化されており、前記第１実行デバイスは、更に、クラスが暗号化されているか否かを判断する判断する判断手段を備え、前記第２実行デバイスは、更に、自デバイス内のメモリに記憶する暗号化されているクラスを復号化する復号化手段を備え、前記ローダは、前記第１実行デバイスのプロセッサにより実行される第１ローダと、前記第２実行デバイスのプロセッサにより実行される第２ローダとで構成され、前記第１ローダは、前記判断手段にクラスが暗号化されているか否かを判断させ、暗号化されていないと判断されたクラスは、第１デバイス内のメモリにロードし、暗号化されていると判断されたクラスは、第２実行デバイスのメモリに記憶させ、前記第２ローダは、第２実行デバイスのメモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを第２実行デバイスのメモリにロードし、当該復号化されたクラスの、第２実行デバイスのメモリにロードした実行コード以外の部分を、当該実行コードと対応付けて第１デバイス内のメモリにロードすることとしてもよい。
【００１３】
これにより、クラスが暗号化されているか否かを判断でき、暗号化されているクラスを実行する際に、復号化を耐タンパ性を有する実行デバイス内で行い、保護を要しない部分のみを耐タンパ性を有する実行デバイス外のメモリにロードすることができるので、保護すべき実行コードを実行する前も実行中も保護することができるようになる。クラスが暗号化されているか否かを判断する方法としては、例えば、暗号化されているクラスのクラス名リストを予め作成しておき、そのリストを元に判断する。
【００１４】
また、前記プログラム実行装置は、更に、クラスの実行を制御する制御手段を備え、前記制御手段は、第１デバイスのメモリに記憶されているクラスを第１デバイスのプロセッサに実行させ、当該クラスの実行コードが第１デバイスのメモリに記録されていない場合には、第２デバイスのメモリに記憶されている対応する実行コードを第２デバイスのプロセッサに実行させることとしてもよい。
【００１５】
これにより、１つのクラスを分割し、通常の実行デバイスのメモリと耐タンパ性を有する実行デバイスのメモリとに対応付けて記憶することができるので、１つのクラスを、通常の実行デバイスと耐タンパ性を有する実行デバイスとで分担して実行することができるようになる。従って、クラス内の保護すべき実行コードのみを、耐タンパ性を有する実行デバイスのメモリに記憶しておき、実行することができるようになる。
【００１６】
本発明の実行デバイスは、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する実行デバイスであって、メモリと、プロセッサと、前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダとを備えることを特徴とする。
【００１７】
また、本発明のコンピュータプログラムは、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた、メモリとプロセッサとを有する耐タンパ性を有する実行デバイスに、ロード処理を行わせるためのコンピュータプログラムであって、前記メモリに記憶する暗号化されているクラスを復号化する復号化ステップと、前記メモリに記憶された暗号化されているクラスを前記復号化ステップで復号化し、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするステップとを備えることを特徴とする。
【００１８】
また、本発明の集積回路は、オブジェクト指向言語で作成された、実行コードを含む1以上のクラスを有するアプリケーションプログラムを実行するプログラム実行装置に備えられた耐タンパ性を有する集積回路であって、メモリと、プロセッサと、前記メモリに記憶する暗号化されているクラスを復号化する復号化手段と、前記メモリに記憶された暗号化されているクラスを前記復号化手段に復号化させ、得られた復号化されたクラスの実行コードを前記メモリにロードし、当該復号化されたクラスの、前記メモリにロードした実行コード以外の部分を、当該実行コードと対応付けて自デバイス外のメモリにロードするローダとを備えることを特徴とする集積回路。
【００１９】
これにより、大きな耐タンパ性を有するデバイスを必要とせずとも、アプリケーションの改竄等の不正行為を防ぐことを可能とする実行装置を容易に提供することができるようになる。
【発明を実施するための最良の形態】
【００２０】
＜概要＞
本発明に係る実行装置は、アプリケーションのプログラムのうち、一部のプログラムを不正行為から守ることで、アプリケーション自体を効率よく守ることができる場合が多いことに着目したものである。
アプリケーションはそれぞれ、その用途・目的が異なることから、アプリケーション毎に解析、改竄等されたくないプログラム、すなわち、秘匿性を有するプログラムが異なる。
【００２１】
例えば、コピー回数を管理する等の著作権管理機能の処理や、課金機能の処理などを行うプログラムを解析、改竄から守り、これらの機能が無効とされることを防ぐことで、アプリケーションの著作権を守ることが可能となる。
本発明は、アプリケーションを不正行為から守る為の要となる処理のプログラムのみを、耐タンパ性を有する実行装置内で実行することで、アプリケーション自体を守ろうとするものである。もちろん、キーとなる処理はアプリケーション全てであってもかまわない。
【００２２】
本発明は、このキーとなる処理のプログラムのうち、実行コードのみを耐タンパ性を有する実行装置内で実行することで、プログラムの解析を困難にするものである。
また、アプリケーションのうちのキーとなる処理は、作成者またはそのユーザのみが知り得るものであるので、本発明に係る実行装置は、アプリケーション実行中にキーとなる処理のプログラムを判別できる機能を有する。
【００２３】
以下、本発明の実施形態に係る実行装置について説明する。
本実施形態では、Ｊａｖａ（登録商標）仮想マシン上で動くＪａｖａ（登録商標）アプリケーションについて説明する。
尚、本発明に係る実行装置とは、具体的にはデジタルテレビ、セットトップボックス、カーナビ端末、携帯電話機、ＰＤＡ（Personal Digital Assistants）などの、Ｊａｖａ（登録商標）仮想マシンを搭載する電子機器全般が該当するものである。
＜実施形態１＞
＜構成＞
まず、図１〜図３を用いて、本発明の実行装置の、ハードウェア及びソフトウェアの構成について簡単に説明し、機能ブロックの構成について説明する。
【００２４】
＜ハードウェア及びソフトウェアの構成＞
図１は、本発明にかかる実行装置のハードウェア及びソフトウェアの構成を表す図である。
実行装置１００は、通常実行部１０００と保護実行部２０００で構成される。
通常実行部１０００は、特別な保護がなされていない実行部であり、通常のパーソナルコンピュータやデジタル家電機器等に搭載されているプログラム実行手段と同様のものである。一方、保護実行部２０００は、耐タンパ性を有する実行部であり、不正なユーザによる盗聴、改竄等を防止し、安全にプログラムを実行させることができるものである。
【００２５】
ハードウェア構成１１０として、通常実行部１０００と保護実行部２０００とは、それぞれＣＰＵとメモリを備える。具体的には、通常実行部１０００は、第１ＣＰＵ１９００、第１ＲＡＭ（Random Access Memory）１９１０及び第１ＲＯＭ（Read Only Memory）１９２０を備え、保護実行部２０００は、第２ＣＰＵ２９００、第２ＲＡＭ２９１０及び第２ＲＯＭ２９２０を備える。
【００２６】
本実施形態では、第１ＲＡＭは、第２ＣＰＵ２９００からもアクセスが可能であるとする。
各ＲＡＭ（１９１０、２９１０）は、具体的にはＳＲＡＭ、ＤＲＡＭ等の一次記憶メモリで構成され、各ＣＰＵ（１９００、２９００）が処理を行う際、一時的にデータを保存するために使用される。
【００２７】
また、各ＲＯＭ（１９２０、２９２０）は、具体的にはフラッシュメモリやハードディスク等の読み出し専用の不揮発性メモリで構成される。第１ＲＯＭ１９２０及び第２ＲＯＭ２９２０には、それぞれ通常実行部１０００と保護実行部２０００で起動される各処理部のプログラム等が記憶されている。
次に、ソフトウェア構成として、通常実行部１０００は、基本ソフトウェアであるＯＳ（Operating System）１０２０、Ｊａｖａ（登録商標）仮想マシン１１００、本実行装置１００で実行するアプリケーションプログラム１２１０及び実行装置１００の外部からアプリケーションプログラム１２１０をダウンロードする機能を有するアプリ取得プログラム１０１０とで構成される。
【００２８】
Ｊａｖａ（登録商標）仮想マシン１１００（以下、「仮想マシン」という。）は、Ｊａｖａ(登録商標)言語で記述されたプログラムを逐次解析し実行するＪａｖａ(登録商標)バーチャルマシンである。言い換えれば、ソフトウェアプログラムである仮想マシン１１００が、仮想のＣＰＵをシミュレートして、Ｊａｖａ(登録商標)の命令コードを解析実行する。
ＯＳ１０２０は、他のサブプログラムを平行して実行するカーネル及び、ライブラリで構成される技術の総称であり、Ｌｉｎｕｘ等があげられる。ＯＳ１０２０は、Ｊａｖａ（登録商標）仮想マシン１１００をサブプログラムとして実行する。
【００２９】
保護実行部２０００は、保護実行部２０００でのアプリケーションの実行を制御するバイトコード処理部２２００と、暗号化されたプログラムを復号化する機能を有する復号処理部２１００とで構成される。
図２は、第１ＲＯＭ１９２０が記憶するプログラムの例を示す図である。
第１ＲＯＭ１９２０には、通常実行部１０００のメモリにロードされるプログラムであるＯＳ１９２１、仮想マシン１９２２及びアプリ取得プログラム１９２３の各プログラムが記憶されている。
【００３０】
また、図３は、第２ＲＯＭ２９２０が記憶するデータ及びプログラムの例を示す図である。
第２ＲＯＭ２９２０には、保護実行部２０００のメモリにロードされるプログラムであるバイトコード処理部２９２１と復号処理部２９２２の各プログラム、及び復号化鍵２９２３が記憶されている。復号化鍵２９２３は、復号処理部２１００が、暗号化されているアプリケーションプログラム１２１０を復号するために用いるものである。
【００３１】
尚、実行装置１００は、本発明にかかる構成の他、本来の機能を実行するためのハードウェアやソフトウェア、例えば、テレビであれば放送の受信装置など、で構成されている。
＜機能ブロックの構成＞
図４は、本発明にかかる実行装置の構成を示す機能ブロック図である。
【００３２】
本図において、実線矢印はデータの流れを表し、点線矢印は制御の遷移を表す。また、細線はクラスをロードするときのデータの流れ等を表し、太線はクラスを実行するときのデータの流れ等を表す。尚、本図では、暗号化されているクラスファイルの実行の際のデータの流れ等のみを表している。図２１も同様である。
実行装置１００は、図１で示したように、通常実行部１０００と保護実行部２０００とで構成される。ここでは、実施形態の説明に直接関係する機能部のみを記載している。
【００３３】
まず、通常実行部１０００から説明する。
＜通常実行部＞
通常実行部１０００は、アプリケーション記憶部１２００、仮想マシン１１００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵとを備える。
＜アプリケーション記憶部＞
アプリケーション記憶部１２００は、アプリケーションプログラム１２１０を記憶する機能を有し、本実施形態では、アプリ取得プログラム１０１０（図１参照）がアプリケーションプログラム１２１０を読み込んだ状態から説明する。
【００３４】
このアプリケーション記憶部１２００は、第１ＲＡＭ１０１０に確保される。
ここで、アプリケーションプログラムの構成について説明する。
図５は、アプリケーションプログラム１２１０の構成例を示す図である。
アプリケーションプログラム１２１０は、複数のクラスファイル（１２１１等）及び保護対象クラス一覧１２２０から構成される。
【００３５】
クラスファイルには、暗号化されたクラスファイルと暗号化されていない平文のクラスファイルとが含まれる。暗号化されているクラスは、秘匿性を有する処理を行うクラスである。
クラスファイルが暗号化されているか否かは、保護対象クラス一覧１２２０を参照して判断する。
【００３６】
図６は、保護対象クラス一覧１２２０の構成例及び内容例を示す図である。
保護対象クラス一覧１２２０は、暗号化されたクラスファイルの識別子の一覧であり、本実施形態では、クラス名を識別子とする。このクラス名は、後述するクラス毎のコンスタントプールに記憶されている。
例えば、アプリケーションプログラム１２１０を構成する「クラスファイル００１」、「クラスファイル００２」等のうち、「クラスファイル００１」、「クラスファイル００３」、「クラスファイル０２１」が、暗号化されていることになる。
【００３７】
次に、クラスファイルの構成を、図７を用いて説明する。
図７は、クラスファイルの構成例を示す図である。
クラスファイル３０００は、クラス構造情報３１００、コンスタントプール３２００、０個以上のメソッドのメタ情報３３００及び０個以上のバイトコード３４００で構成される。クラスファイルには、他の情報が含まれていても良いが、ここでは本発明に関連のある項目のみ説明する。
【００３８】
クラス構造情報３１００は、このクラスが保持するフィールドやメソッド、どのクラスを継承するかなど、クラスの構造に関する情報である。
コンスタントプール３２００は、このクラスで定義している、またはこのクラスから参照している他クラスのフィールド、メソッドの名前などの情報である。
メソッドのメタ情報３３００は、各メソッドのアクセスフラグや、引数のサイズなどメソッドに関する情報である。
【００３９】
バイトコード３４００は、そのクラスにおいて実行される処理を記述している。
Ｊａｖａ(登録商標)言語で記述されたソースプログラムは、バイトコードコンパイラによってバイトコードに変換される。このバイトコードとは、ハードウェアに依存しない中間コードである。
メソッドのメタ情報３３００とバイトコード３４００は、クラスに属するメソッドに１対１に対応して存在している。すなわち、メソッドの数と同数の、メソッドのメタ情報３３００及びバイトコード３４００がクラスファイルに含まれている。
【００４０】
以下では、クラス構造情報３１００、コンスタントプール３２００及びメソッドのメタ情報３３００を総称して「メタ情報」というものとする。
＜仮想マシン＞
仮想マシン１１００は、複数のサブプログラムで構成されるが、本図では、本発明に特有の機能を有するローダ１１２０とインタプリタ１１１０のみを記載してある。
【００４１】
まず、図８を用いて、仮想マシン１１００について説明する。
図８は、仮想マシン１１００のサブプログラムの構成を示す図である。
仮想マシン１１００は、インタプリタ１１１０、ローダ１１２０、ベリファイヤ１１３０、Ｊａｖａ（登録商標）ヒープ管理部１１４０、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０、ＪＩＴコンパイラ１１６０及びクラスライブラリ１１７０で構成される。
【００４２】
インタプリタ１１１０は、クラスファイルに含まれるバイトコードを解釈、実行する機能を有するサブプログラムで、仮想マシン１１００において中核な処理を行うサブプログラムである。
本発明のインタプリタ１１１０は、加えて、クラスの実行時に、実行すべきバイトコードが、保護実行部に記憶されていることを検出し、制御を渡す機能を有する。
【００４３】
ローダ１１２０は、実行するクラスのクラスファイルをアプリケーションプログラム１２１０から探し出し、見つけたクラスファイルを仮想マシン１１００内部へロードする機能を有する。この際、クラスを実行可能な状態にしてロードする。
本発明のローダ１１２０は、加えて、ロードしようとするクラスが、暗号化されているか否かを判定し、暗号化されている場合には、ロードを保護実行部２０００に依頼する機能を有する。  
【００４４】
また、クラスローダ１１２０は、クラスアンロード処理を行う機能を有する。クラスアンロード処理とは、実行が終了し不要になったクラスを仮想マシン１１００から取り除く処理である。
次に、ベリファイヤ１１３０は、クラスのデータ形式の不備や、クラスに含まれるバイトコードの安全性を検査する機能を有する（Java（登録商標）Virtual Machine Specification参照）。クラスローダ１１２０は、ベリファイヤ１１３０において妥当ではないと判定されたクラスはロードを行わない。
【００４５】
Ｊａｖａ（登録商標）ヒープ管理部１１４０は、Ｊａｖａ（登録商標）ヒープと呼ばれる、Ｊａｖａ（登録商標）アプリケーションが使用するワーキングメモリの管理を行う機能を有する。このワーキングメモリは第１ＲＡＭ１９１０に確保される。
また、Ｊａｖａ（登録商標）ヒープ管理部１１４０は、ガベージコレクションも行う機能を有する。ガベージコレクションとは、アプリケーション実行において不要になったワーキングメモリを開放し、他の用途に再利用できるようにする処理である。
【００４６】
Ｊａｖａ（登録商標）ネイティブライブラリ１１５０は、Ｊａｖａ（登録商標）アプリケーションから呼出されるライブラリで、ＯＳ１０２０や、実行装置１００が備える図１には記載されていないハードウエア、サブプログラム等で提供される機能をアプリケーションへ提供する。
ＪＩＴコンパイラ１１６０は、バイトコードを第１ＣＰＵ１９００もしくは第２ＣＰＵ２９００が理解可能な実行形式に翻訳する機能を有する。
【００４７】
クラスライブラリ１１７０は、仮想マシン１１００の実行に必要なクラスで構成され、仮想マシン１１００が実行時に最初にロードするクラスである。クラスライブラリ１１７０は仮想マシン１１００の一部であり、一般に公開されている、クラスの集合である。
＜クラス記憶部＞
クラス記憶部１３００は、実行するアプリケーションプログラムのクラスを記憶する機能を有する。
【００４８】
このクラス記憶部１３００は、いわゆるメソッド領域であり、実際には、仮想マシン１１００内の領域であり、ローダ１１２０が実行可能な状態にしたクラスをロードする。
このクラス記憶部１３００には、仮想マシン１１００のローダ１１２０又はバイトコード部２２００の後述するセキュアローダ２２２０から、クラスがロードされる。
尚、このクラス記憶部１３００は、第１ＲＡＭ１９１０に確保され、保護実行部２０００から参照等が可能である。
【００４９】
＜ワーク領域＞
ワーク領域１４００は、クラスの実行に際し、使用される作業領域である。具体的には、スタックやヒープ等をいい、実際には、仮想マシン１１００内の領域である。
尚、このワーク領域１４００は、第１ＲＡＭ１９１０に確保され、保護実行部２０００から参照等が可能である。
【００５０】
＜保護実行部＞
次に、保護実行部２０００について説明する。
保護実行部２０００は、復号処理部２１００、復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード処理部２２００、バイトコード記憶部２６００及び第２ＣＰＵ２９００を備える。
【００５１】
＜復号処理部＞
復号処理部２１００は、ローダ１１２０からの依頼によって、アプリケーション記憶部１２００内の暗号化されたクラスを読み込み、暗号鍵記憶部２５００に記憶されている暗号化鍵２９２３（図３参照）を用いて復号化し、復号化されたクラスを復号化クラス記憶部２４００に記憶させる機能を有する。
【００５２】
復号化するクラスのアプリケーション記憶部１２００内のアドレスとサイズは、ローダ１１２０からの依頼と共に渡される。
尚、暗号化のためのアルゴリズムは任意の暗号アルゴリズムを用いることが可能であり、代表的な暗号アルゴリズムとしては、ＡＥＳ（Advanced Encryption Standard）、ＤＥＳ（Data Encryption Standard）等があげられる。
【００５３】
＜バイトコード処理部＞
次に、バイトコード処理部について説明する。
バイトコード処理部２２００は、仮想マシン１１００の機能のうち、バイトコードの実行に必要な機能のみを備えたものであり、複数のサブプログラムを備えるが、ここでは、本図では、本発明に特有の機能を有するセキュアインタプリタ２２１０とセキュアローダ２２２０のみを記載する。
【００５４】
図９は、バイトコード処理部のサブプログラムの構成を示す図である。
バイトコード処理部２２００は、セキュアインタプリタ２２１０、セキュアローダ２２２０、セキュアベリファイヤ２２３０、セキュアＪａｖａ（登録商標）ヒープ管理部２２４０、バイトコード管理部２２５０で構成される。
セキュアインタプリタ２２１０は、仮想マシン１１００のインタプリタ１１１０と同様の機能を有し、仮想マシン１１００のインタプリタ１１１０から依頼を受けてバイトコードを実行し、実行が終了すればインタプリタ１１１０に通知する機能を有する。
【００５５】
また、セキュアローダ１１１０は、暗号化クラス記憶部２４００のクラスファイルをロードする機能を有する。自実行部のバイトコード記憶部２６００と、通常実行部１０００のクラス記憶部１３００とに、ひとつのクラスを分割してロードする。
この際、自実行部のバイトコード記憶部２６００に記憶した部分と、通常実行部１０００のクラス記憶部１３００に記憶した部分とを対応付けて記憶する。対応付けの方法は、図１２を用いて後で説明する。
【００５６】
セキュアベリファイヤ２２３０は、仮想マシン１１００のベリファイヤ１１３０と同様の機能を有する。
セキュアＪａｖａ（登録商標）ヒープ管理部２２４０は、仮想マシン１１００Ｊａｖａ（登録商標）ヒープ管理部１１４０の機能のうち、クラスアンロード時にバイトコードをアンロードする機能のみを有する。バイトコード以外は、通常実行部１０００のメモリに存在し、それらの管理は仮想マシン１１００が行うからである。
【００５７】
バイトコード管理部２２５０は、保護実行部２０００におけるクラスの実行の際に、通常実行部１０００内に記憶されている実行に必要なメタ情報とを関連付けて管理しておく機能を有する。具体的には、バイトコード記憶部２６００に記憶されるバイトコードとクラス記憶部１３００に記憶されるメソッドのメタ情報とに、同じ識別子をつけて、１対１に対応付けて管理する（図１２参照）。
【００５８】
＜バイトコード記憶部＞
バイトコード記憶部２６００は、実行するアプリケーションプログラムのクラスのうち、バイトコード（図７参照）のみを記憶する機能を有する。
このバイトコード記憶部２６００は、いわゆるメソッド領域であり、実際には、バイトコード処理部２２００内の領域であり、セキュアローダ２２２０がロードし、実行可能な状態にしたクラスのバイトコードを記憶する。
【００５９】
尚、このバイトコード記憶部２６００は、第２ＲＡＭ２９１０に確保される。従って、このバイトコード記憶部２６００は、通常実行部１０００から参照されることはない。
＜動作＞
次に、アプリケーションを実行する実行装置１００の動作を説明する。
実行装置の動作の説明として、アプリケーションのロードと実行の２つのフェーズに分けて説明する。
【００６０】
以下、本発明に係る実行装置１００のクラスのロード処理について図１０〜図１２を用いて、クラスの実行処理について図１３〜図２０を用いて説明する。
＜クラスのロード処理＞
まず、図１０を用いて、クラスのロード処理、具体的には、電源投入から実行装置１００がアプリケーションプログラム１２１０を起動するまでの処理を説明し、その後、図１１と図１２とを用いてクラスをロードする処理について説明する。
【００６１】
本実施形態では、実行装置の電源を入れた場合、予め定められているアプリケーションが実行されるものとする。
図１０は、実行装置１００の起動処理を表すフローチャートである。
ユーザが実行装置１００の電源を投入する（ステップＳ１００）と、第１ＣＰＵ１９００が、第１ＲＯＭ１９２０に保存されているＯＳ１９２１（図２参照）を第１ＲＡＭ１９１０にロードし、ＯＳ１０２０を起動する（ステップＳ１１０）。  
【００６２】
次に、ＯＳ１０２０が、第１ＲＯＭ１９２０に保存されているＪａｖａ（登録商標）仮想マシン１９２２を第１ＲＡＭ１９１０にロードし、仮想マシン１１００を起動する（ステップＳ１２０）。
続いて、ＯＳ１０２０は、第１ＣＰＵ１９００を介して、第２ＣＰＵ２９００にロード依頼を通知し、第２ＣＰＵ２９００は、第２ＲＯＭ２９００上に保存されているバイトコード処理部２９２１を第２ＲＡＭ２９１０にロードし、バイトコード処理部２２００を起動する（ステップＳ１３０）。
【００６３】
次に、第２ＣＰＵ２９００は、第２ＲＯＭ２９００上に保存されている復号処理部２９２２（図３参照）を第２ＲＡＭ２９１０にロードし、復号処理部２１００を起動する（ステップＳ１４０）。
上記の処理により、実行装置１００がアプリケーション実行可能な状態になる。尚、仮想マシン１１００の起動（ステップＳ１２０）と復号処理部２１００及びバイトコード処理部２２００の起動（ステップＳ１３０、Ｓ１４０）の順番は逆になっていてもかまわない。
【００６４】
実行装置１００が、アプリケーションプログラム１２１０を実行可能な状態になった後、仮想マシン１１００は、アプリケーションプログラム１２１０の実行を開始する。
アプリケーションプログラム１２１０の開始は、アプリケーションプログラム１２１０の特定のクラスファイルを実行することで行う。この特定のクラスファイル名は、予め、仮想マシン１１００が記憶しているものとする。
【００６５】
この最初のクラスがローダ１１２０によってロードされ、インタプリタ１１１０によって実行が開始され、その後、適時必要なクラスファイルがアプリケーション記憶部１２００からロードされ、実行されることで、アプリケーションが実行されていくことになる。
仮想マシン１１００は、最初に特定のクラスファイルをロード（ステップＳ１６０）する前に、この特定のクラスファイルと共にアプリケーションプログラム１２１０の中含まれている保護対象クラス一覧１２２０をクラス記憶部１３００に記憶させる（ステップＳ１５０）。
【００６６】
次に、各クラスをロードする処理、すなわち、アプリケーションプログラム１２１０のクラスファイルを仮想マシン１１００が実行可能な内部形式に変換し、ロードする手順について説明する。
図１１は、実行装置１００のロード処理を表すフローチャートである。この  ロード処理は、通常実行部１０００のローダ１１２０と保護実行部２０００のセキュアローダ２２２０が行う処理である。
【００６７】
また、図１２は、保護対象クラスのクラスファイルがロードされた状態を示す図である。
まず、インタプリタ１１１０がローダ１１２０に、クラスファイル名を渡してロードを依頼する。
依頼を受けたローダ１１２０は、渡されたクラスファイル名のクラスが、保護対象のクラスか、すなわち、暗号化されたクラスか否かを判断する（ステップＳ２００）。
【００６８】
判断の方法は、クラス記憶部１３００の保護対象クラス一覧１２２０のリストに渡されたクラスファイル名が載っているかをチェックし、載っていれば保護対象のクラスであると判断する。
ローダ１１２０は、ロードの依頼を受けたクラスが、保護対象クラスでないと判断した場合は（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードする（ステップＳ２６０）。
【００６９】
一方、ロードの依頼を受けたクラスが、保護対象クラスであると判断した場合は（ステップＳ２００：ＹＥＳ）、ロードするクラスのアプリケーション記憶部１２００でのアドレスとサイズとを、保護実行部２０００の復号処理部２１００に通知し、ロードを依頼する（ステップＳ２１０）。
通知を受けた復号処理部２１００は、クラスファイルをアプリケーション記憶部１２００から読み込み、暗号鍵記憶部２５００に記憶されている復号化鍵２９２３を用いて復号化し、復号化クラス記憶部２４００に記憶する（ステップＳ２２０）。以下、復号化クラス記憶部２４００に記憶されたクラスを、「復号化クラスファイル」というものとする。
【００７０】
復号化クラスファイルを作成した復号処理部２１００は、その旨バイトコード処理部２２００に通知する。
通知を受けたバイトコード処理部２２００は、セキュアベリファイヤ２２３０に復号化クラスファイルを検査させ、セキュアローダ２２２０にロードを依頼する。
ロードの依頼を受けたセキュアローダ２２２０は、復号化クラスファイルの構文を分析し、復号化クラスファイルのタグから、バイトコードの部分とメタ情報の部分の判別を行い、バイトコードの部分とメタ情報の部分とに分割する（ステップＳ２３０）。この分割の際、セキュアローダ２２２０は、２つの情報を付加する。１つ目は、バイトコードが分割された旨の情報であり、２つ目は、バイトコードの部分とメタ情報の部分とを対応付けるための情報である。これら付加する情報については、図１２を用いて後で説明する。
【００７１】
分割後、セキュアローダ２２２０は、バイトコードの部分をバイトコード記憶部２６００にロードし（ステップＳ２４０）、メタ情報の部分を通常実行部１０００のクラス記憶部１３００にロードする（ステップＳ２５０）。この際、それぞれの部分は、仮想マシン１１００が実行可能な形式となっている。
それぞれ記憶部にロードされた状態を図１２に示す。保護実行部２０００のバイトコード記憶部２６００には、バイトコード２６１０がロードされ、通常実行部１０００のクラス記憶部１３００には、クラス構造情報１３１０、コンスタントプール１３２０及びメソッドのメタ情報１３３０がロードされている。
【００７２】
クラスファイルのフォーマット（Java（登録商標）Virtual Machine Specification参照）において、メソッドのメタ情報３３００の次に必ずバイトコード３４００があることが保証されているため（図７参照）、各部分の判別は容易に行うことが可能であり、バイトコード３４００の部分とメタ情報（図７参照：３１００、３２００、３３００）の部分とを分割することができる。
【００７３】
この分割の際（図１１：ステップＳ２３０参照）、セキュアローダ２２２０は、バイトコードが分割された旨の情報と、バイトコードの部分とメタ情報の部分とを対応付けるための情報とを付加する。
バイトコードが分割された旨の情報として、分割されたことを示すフラグであるバイトコード分割フラグ１３３１をメソッドのメタ情報１３３０に付加する。本実施形態では、バイトコード分割フラグ１３３１が「１」の場合は、分割してあり、「０」の場合は、分割していないことを表すものとする。
【００７４】
すなわち、バイトコード分割フラグ１３３１が「０」の場合は、バイトコードがクラス記憶部１３００に記憶されていることを示し、バイトコード分割フラグ１３３１が「１」の場合には、バイトコードがバイトコード記憶部２６００に記憶されていることを示す。
次に、セキュアローダ２２２０は、バイトコードの部分とメタ情報の部分とを対応付けるための情報を付加する。この情報は、バイトコード管理部２２５０に指示して付加する。
【００７５】
バイトコード管理部２２５０は、バイトコード２６１０とメソッドのメタ情報１３３０の関係を特定できるように、バイトコード２６１０にＩＤ２６１１を、メソッドのメタ情報１３３０にＩＤ１３３２を付加し、同じ値にＩＤをつけて管理する。同一のメソッドから内部形式に変換されたメソッドのメタ情報１３３０のＩＤ１３３２とバイトコード２６１０のＩＤ２６１１には同じ値がついている必要がある。
【００７６】
例えば、バイトコード２６１０のＩＤ２６１１として「１２３４」を、メソッドのメタ情報１３３０のＩＤ１３３２ＩＤとして「１２３４」を設定することで、バイトコードを実行する際には、同じＩＤを持つとメソッドのメタ情報１３３０を参照すればよいことが分かる。従って、ＩＤの値は、メソッドのメタ情報１３３０毎に異なる必要がある。
一方、保護対象クラスではないと判断され（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードされたクラスでは、ローダ１１２０は、メソッドのメタ情報のバイトコード分割フラグ１３３１には、「０」を設定する。なお、メソッドのメタ情報１３３０のＩＤ１３３２には、何も設定しない。
【００７７】
セキュアベリファイヤ２２３０が、復号化クラスファイルを検査し、検査の結果がエラーの場合には、ローダ１１２０にその旨を通知し、ロードの処理を終了する。  
＜クラスの実行処理＞
次に、図１３〜図２０を用いて、クラスの実行の処理について説明する。
図１３は、クラスの実行の処理を表すフローチャートである。
【００７８】
まず、クラスを実行するにあたり、インタプリタ１１１０はメソッドを呼出す（ステップＳ３００）。
インタプリタ１１１０は、該当するメソッドのバイトコードが分割されているか、すなわち、バイトコードがクラス記憶部１３００に記憶されており通常実行部１０００で実行可能か否かを判断する（ステップＳ３１０）。
【００７９】
この判断は、メソッドのメタ情報１３３０のバイトコード分割フラグ１３３１をチェックすることで行う。
バイトコード分割フラグ１３３１が「０」になっている場合（ステップＳ３１０：ＮＯ）には、分割がなされていないため、インタプリタ１１１０がメソッドを実行する（ステップＳ３５０）。インタプリタ１１１０がメソッドを実行する処理は従来のＪａｖａ（登録商標）仮想マシンの動作と同じである（Java（登録商標）Virtual Machine Specification参照）。
【００８０】
次にバイトコード分割フラグ１３３１が「１」になっている場合（ステップＳ３１０：ＹＥＳ）には、インタプリタ１１１０はＯＳ１０２０に用意された、保護実行部２０００のバイトコード処理部２２００を呼出す実行環境遷移関数を呼び出し、バイトコードの実行を依頼する。例えば、バイトコード処理部２２００が定期的に第１ＲＡＭ１９１０上の特定ビットを監視しており、実行環境遷移関数がこの特定ビットを「１」とすると、バイトコード処理部２２００が処理を開始するような仕組みである。
【００８１】
この依頼の際、実行環境遷移関数の引数として、ＩＤ１３３２（図１２参照）の値を渡して依頼する（ステップＳ３２０）。
依頼を受けたバイトコード処理部２２００のセキュアインタプリタ２２１０は、バイトコード管理部２２５０に、受け取ったＩＤ１３３２の値を渡して、同じ値のＩＤを持つバイトコードの検索を依頼する。
【００８２】
依頼をうけたバイトコード管理部２２５０は、バイトコード記憶部２６００から、同じ値のＩＤ２６１１を持つバイトコード２６１０を検索し、バイトコードのアドレスをセキュアインタプリタ２２１０に返す（ステップＳ３３０）。
バイトコードのアドレスを受け取ったセキュアインタプリタ２２１０は、バイトコードの実行を行う（ステップＳ３４０）。
【００８３】
この実行においては、セキュアインタプリタ２２１０は、実行に必要なメタ情報はクラス記憶部１３００を参照し、スタックの領域やヒープの領域は、ワーク領域１４００を使用する。
次に、保護対象クラスのバイトコードが実行される場合を、具体例を用いて説明する。
図１４に、バイトコードの実行処理を表すフローチャートを示す。このフローチャートは、図１５に示す、Ｊａｖａ（登録商標）言語のメソッド４０００を実行する場合のフローチャートであり、以下、このメソッド４０００を実行する例を説明する。
【００８４】
このメソッド４０００は、保護対象クラス１２２０のクラスファイルのメソッドであるとする。従って、このメソッドのバイトコードは、バイトコード記憶部２６００に記憶されている。図１６に、メソッド４０００をコンパイルし、得られたバイトコード４１００を示す。
メソッド４０００のプログラムは、引数にint型の２つの値をとり、２つの値を足し算したサイズのint型の配列を作成して、int型の配列を返り値とするプログラムである。
【００８５】
このバイトコード４１００を実行する際の動作を図１４のフローチャートと、フレームの領域とヒープの領域との遷移図、図１７〜図２０とを用いて説明する。
セキュアインタプリタ２２１０はまず、通常実行部１０００のワーク領域１４００のフレーム領域１４２０にフレーム１４３０を作成する。具体的には、呼出元のＪａｖａ（登録商標）フレーム１４４０の上に、いまから実行するメソッド４０００のＪａｖａ（登録商標）フレーム１４３０を積み上げる（ステップＳ７００）。
【００８６】
呼出元のＪａｖａ（登録商標）フレーム１４４０とは、いまから実行するメソッド４０００を呼出したメソッドのＪａｖａ（登録商標）フレームであり、各フレームは、同様の構成を有している。
図１７は、セキュアインタプリタ２２１０がいまから実行するＪａｖａ（登録商標）フレームを積み上げた時点での、ワーク領域１４００の状態である。
【００８７】
ワーク領域１４００には、Ｊａｖａ（登録商標）ヒープ１４１０、Ｊａｖａ（登録商標）フレーム１４３０、呼出元Ｊａｖａ（登録商標）フレーム１４４０が生成される。
Ｊａｖａ（登録商標）ヒープ１４１０は、仮想マシン１１００が利用するワーキングメモリであり、Ｊａｖａ（登録商標）ヒープ管理部１１４０（図８参照）が管理している。
Ｊａｖａ（登録商標）フレーム１４３０は、セキュアインタプリタ２２１０がいまから実行するメソッドのワーキングメモリであり、ローカル変数領域１４５０とオペランドスタック１４６０とから構成される。
【００８８】
ローカル変数領域１４５０とは、メソッドが持つローカル変数を保存する領域である。セキュアインタプリタ２２１０がＪａｖａ（登録商標）フレーム１４３０を作成したときに、引数で与えられているint型の２つの値「ｉ」と「ｊ」とが、ローカル変数領域の１番目（１４５２）と２番目（１４５１）にそれぞれロードされる。
オペランドスタック１４６０とは、メソッドが実行する演算を行うスタックであり、例えば、メソッドの中にローカル変数の足し算をするコードがあった場合、ローカル変数領域１４５０からデータをオペランドスタック１４６０にロードし、足し算をオペランドスタック１４６０上で行い、ローカル変数領域１４５０にストアする、といった使われ方をする。
【００８９】
引数をフレームに積んだ、セキュアインタプリタ２２１０は、バイトコード４１００の処理を開始する。
バイトコード４１００の１〜３行のコード４１０１は、スタック演算であり、次のように処理が進められる（ステップＳ７１０）。
ｉｌｏａｄ命令は、ローカル変数領域にある変数の値をオペランドスタックにロードする命令である。また、ｉａｄｄ命令はオペランドスタックに積まれた上から２つの値を足し合わせる命令である。
【００９０】
「ｉｌｏａｄ＿１」及び「ｉｌｏａｄ＿２」で、オペランドスタック１４６０に引数で渡された「ｉ」１４５２の値と「ｊ」１４５１の値を積み、オペランドスタックに積まれたiの値とｊの値の足し算を行う。
足し算の結果「ｉ＋ｊ」１４６１をオペランドスタック１４６０に置く。このとき、積まれていた引数「ｉ」と「ｊ」は、削除される。
【００９１】
その結果のワーク領域１４００の状態を、図１８に示す。
次に、セキュアインタプリタ２２１０は、バイトコード４１００のコード「ｎｅｗａｒｒａｙ」４１０２を実行する。
ｎｅｗａｒｒａｙ命令は、Ｊａｖａ（登録商標）ヒープ１４１０に、オペランドスタックの一番上にある値の数の要素数を持つ配列の領域を確保する命令である。領域を確保した状態のワーク領域１４００の状態を、図１９に示す。
【００９２】
ｎｅｗａｒｒａｙ命令では、Ｊａｖａ（登録商標）ヒープに他のスレッドからも同時のタイミングで書き込みを行われることを防ぐために、通常実行部１０００のＯＳ１０２０が提供するロック機能を利用して、領域を確保する前に、Ｊａｖａ（登録商標）ヒープのロックを獲得する必要がある。
そこで、セキュアインタプリタ２２１０は、直接には、通常実行部１０００のＯＳ１０２０が提供するロック機能は利用することができないので、「ｎｅｗａｒｒａｙ」４１０２をフェッチした時点で、オペランドスタック１４６０の一番上の値「ｉ＋ｊ」１４６１をオペランドスタック１４６０から取り出し（図１８参照）、この値を引数として、仮想マシン１１００のＪａｖａ（登録商標）ヒープ管理部１１４０を呼出す（ステップＳ７２０）。
【００９３】
Ｊａｖａ（登録商標）ヒープ管理部１１４０は、ＯＳ１０２０が提供するロック機能を利用して、Ｊａｖａ（登録商標）ヒープ１４１０のロックを獲得する。
ロックが獲得できたことを確認した後で、Ｊａｖａ（登録商標）ヒープ管理部１１４０は、Ｊａｖａ（登録商標）ヒープ１４１０に、引数として受け取った「ｉ＋ｊ」のサイズを持つオブジェクト１（１４１１）を確保し（ステップＳ７３０）、オブジェクト１への参照１４６２をオペランドスタックに積む（ステップＳ７４０、図１９参照）。
【００９４】
この時点でのワーク領域１４００の状態が、図１９に示す図である。
領域の確保が終わると、処理をセキュアインタプリタ２２１０に復帰させ、セキュアインタプリタ２２１０は、「ｎｅｗａｒｒａｙ」４１０２の次の処理を開始する。
セキュアインタプリタ２２１０は、バイトコード４０００の「ａｒｅｔｕｒｎ」４１０３の処理を行う。
【００９５】
セキュアインタプリタ２２１０は、「ａｒｅｔｕｒｎ」４１０３をフェッチした時点で、現在のメソッドの処理が終了したことを知り、メソッド４０００のワーキングメモリであるＪａｖａ（登録商標）フレーム１４３０を破棄し、呼出元のＪａｖａ（登録商標）フレーム１４４０上に、オペランドスタック１４６０の一番上の値、オブジェクト１への参照１４４２を積む（ステップＳ７５０）。
【００９６】
その時点でのワーク領域１４００の状態を図２０に示す。
最後に、セキュアインタプリタ２２１０は、処理をインタプリタ１１１０に戻す。
これで、バイトコード４１００の実行が終了し、その次の処理を通常実行部１０００が続けることになる。
この例のように、バイトコードの実行に際して、保護実行部２０００内では処理部できない処理がある場合には、通常実行部１０００に処理を依頼する。この場合でも、バイトコード自体は、保護されている。
【００９７】
以上の説明ではｎｅｗａｒｒａｙ命令を例にとり、ＯＳ１０２０が提供するロック機能を利用する際に、セキュアインタプリタ２２１０から通常実行部１０００に処理を移していたが、上記以外の場合にも、通常実行部１０００への遷移が必要になる場合がある。
例えば、セキュアインタプリタ２２１０が、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０を呼出した場合には、Ｊａｖａ（登録商標）ネイティブライブラリ１１５０は通常実行部１０００にしか存在しないため、通常実行部１０００に処理を移す必要がある。
【００９８】
以上、説明したように、バイトコードを保護実行部２０００のバイトコード記憶部２６００のみに記憶するため、不正なユーザがデバッガ等を利用して、Ｊａｖａ（登録商標）アプリケーションを盗聴、改竄を試みても、バイトコードにアクセスができないため、盗聴、改竄は不可能になる。
＜実施形態２＞
実施形態１では、メソッドのバイトコードのすべてを保護実行部２０００内に記憶して実行しているが、実施形態２では、バイトコードの一部のみを保護実行部２０００内に記憶して実行する点が異なる。
【００９９】
本実施形態の実行装置は、保護実行部から通常実行部のメモリへのアクセスが制限される場合に、特に有効である。
というのは、実施形態１では、第２ＣＰＵ２９００から第１ＲＡＭ１９１０へのアクセスが可能という前提があるので、保護実行部がバイトコードを実行する際に、通常実行部のメモリにあるメタ情報へのアクセスは容易であった。
【０１００】
しかし、第２ＣＰＵ２９００が第１ＲＡＭ１９１０にアクセスできない場合には、メタ情報が必要となるたびに、通常実行部１０００に遷移する必要があり、また、Ｊａｖａ（登録商標）ヒープ上のデータの読込み、書込みを行う場合にも、通常実行部１２０に遷移する必要があることから、実行速度の観点で実用的ではない場合がある。
そこで、本実施形態では、第２ＣＰＵ２９００が、第１ＲＡＭ１９１０にアクセスできない場合でも、不正なユーザからバイトコードを保護しながら、実行速度も保持できる実行装置を説明する。
【０１０１】
以下、実施形態１と相違する点について説明する。
＜構成＞
図２１は、実施形態２の実行装置の構成を示す機能ブロック図である。
構成は、実施形態１の実行装置とほぼ同様である（図４参照）。但し、保護実行部２０００から通常実行部１０００のメモリを直接アクセスできないことに伴って、一部の機能部の機能が異なる。
【０１０２】
以下、実施形態１の実行装置との相違点を説明する。
実行装置５００は、通常実行部５０００と保護実行部６０００とで構成される。
通常実行部５０００は、アプリケーション記憶部１２００、仮想マシン５１００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵ１９００とを備える。
アプリケーション記憶部１２００、クラス記憶部１３００、ワーク領域１４００及び第１ＣＰＵ１９００は、実施形態１と同様である。
【０１０３】
仮想マシン５１００は、ローダ５１２０とインタプリタ５１１０とを備え、基本的には、それぞれ実施形態１のローダ１１２０とインタプリタ１１１０と同様の機能を有する。
実施形態１のインタプリタ１１１０は、クラスの実行時に、バイトコードが通常実行部１０００にあるか保護実行部２０００にあるかを、メタ情報内のバイトコード分割フラグを参照して判断していたが（図１２、図１３参照）、本実施形態のインタプリタ５１１０は、バイトコード内の分割フラグを参照する点が異なる。バイトコード内に分割フラグを設定する方法は、後述する＜メタ情報等が必要でないコードの部分を選び出す方法＞で説明する。
【０１０４】
また、実施形態１のローダ１１２０は、ロードしようとするクラスが暗号化されている場合には、クラスファイルのアドレスとサイズを渡して、保護実行部２０００にクラスファイルの読み込みを依頼したが、本実施形態のローダ５１２０は、読み込んだ暗号化クラスファイルを渡す点が異なる。保護実行部６０００は、クラスファイルが記憶されているアプリケーション記憶部１２００にアクセスできないからである。
【０１０５】
保護実行部６０００は、復号処理部６１００、復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード処理部６２００、バイトコード記憶部２６００、ワーク領域６７００及び第２ＣＰＵ２９００を備える。
復号化クラス記憶部２４００、暗号鍵記憶部２５００、バイトコード記憶部２６００及び第２ＣＰＵ２９００は、実施形態１と同様である。
【０１０６】
復号処理部６１００は、基本的に実施形態１の復号処理部２１００と同様にクラスファイルの復号化を行うが、復号処理部２１００がアプリケーション記憶部１２００からクラスファイルを読み込んで復号化したのに対し、復号処理部６１００は、通常実行部５０００から渡されるクラスファイルを復号化する点が異なる。
バイトコード処理部６２００は、セキュアインタプリタ６２１０とセキュアローダ６２２０を備える。
【０１０７】
セキュアインタプリタ２２１０は、実行中に、通常実行部１０００のメモリに記憶されているメタ情報やピープにアクセスしていたが、セキュアインタプリタ６２１０は、実行時にメタ情報等をアクセスしない点が異なる。
また、セキュアローダ２２２０は、メタ情報を直接クラス記憶部１３００に書き込んだが、セキュアローダ５２２０は、第２ＣＰＵ２９００を介して一旦通常実行部５０００に出力し、第１ＣＰＵ１９００によって書き込む必要がある点が異なる。
【０１０８】
ワーク領域６７００は、通常実行部５０００のワーク領域１４００と同様の機能を有する。
実施形態１では、バイトコードを実行する際に必要なフレームの領域を第１ＲＡＭ１９１０に確保されたワーク領域１４００に作成していたが、本実施形態では、第１ＲＡＭ１９１０にアクセスできないので保護実行部６０００内の第２ＲＡＭ２９１０に確保することとする。尚、ヒープの領域は、実施形態１と同様に通常実行部５０００のワーク領域１４００に確保する。
【０１０９】
＜動作＞
本実施形態の実行装置の動作の説明として、アプリケーションのロードと実行の２つのフェーズに分けて説明する。
＜クラスのロード処理＞
まず、各クラスをロードする処理、すなわち、アプリケーションプログラム１２１０のクラスファイルを仮想マシン５１００が実行可能な内部形式に変換し、ロードする手順について説明する。
【０１１０】
図２２は、実行装置５００のロード処理を表すフローチャートである。この  ロード処理は、通常実行部５０００のローダ５１２０と保護実行部６０００のセキュアローダ６２２０が行う処理である。
また、図２３は、保護対象クラスのクラスファイルがロードされた、クラス記憶部１３００とバイトコード記憶部２６００の状態を示す図である。
【０１１１】
まず、インタプリタ５１１０がローダ５１２０に、クラスファイル名を渡してロードを依頼し、依頼を受けたローダ５１２０は、渡されたクラスファイル名のクラスが、暗号化されたクラスか否かを判断し（ステップＳ２００）、保護対象クラスでないと判断した場合は（ステップＳ２００：ＮＯ）、クラス記憶部１３００にロードする（ステップＳ２６０）。
【０１１２】
一方、ロードの依頼を受けたクラスが、保護対象クラスであると判断した場合は（ステップＳ２００：ＹＥＳ）、ロードするクラスをアプリケーション記憶部１２００から読み出し、読み出したクラスファイルを復号処理部６１００に渡す（ステップＳ４１０）。
クラスファイルを受け取った復号処理部６１００は、受け取ったクラスファイルを暗号鍵記憶部２５００に記憶されている復号化鍵２９２３を用いて復号化し、復号化クラス記憶部２４００に記憶する（ステップＳ４２０）。
【０１１３】
復号化クラスファイルを作成した復号処理部６１００は、その旨バイトコード処理部６２００に通知し、通知を受けたバイトコード処理部６２００は、セキュアベリファイヤ２２３０に復号化クラスファイルを検査させ、セキュアローダ６２２０にロードを依頼する。
ロードの依頼を受けたセキュアローダ６２２０は、復号化クラスファイルの構文を分析し、仮想マシン５１００が実行可能な内部形式に変換する。このときに、セキュアローダ６２２０は、復号化クラスファイルのタグから、バイトコードの部分とメタ情報の部分の判別を行い、分割する（ステップＳ４３０）。
【０１１４】
次に、セキュアローダ６２２０は、バイトコードから、実行時にメタ情報、およびＪａｖａ（登録商標）ヒープにアクセスが必要でないバイトコードの部分を選び出す。メタ情報等が必要でないコードの部分を選び出す方法は、図２４を用いて後で説明する。
セキュアローダ６２２０は、メタ情報が必要でないバイトコードと、メタ情報が必要なバイトコードに分割する（ステップＳ４４０）。
【０１１５】
セキュアローダ６２２０は、メタ情報が必要でないバイトコードと、メタ情報が必要なバイトコードに分割したら、バイトコード管理部２２５０に依頼し、メソッドのメタ情報と、メタ情報が必要でないバイトコードとを関連付けるためのＩＤをそれぞれに付加する（図２３参照：ＩＤ５３３１とＩＤ６６１１）。
次に、セキュアローダ６２２０は、メタ情報とメタ情報等が必要なバイトコードを、第２ＣＰＵ２９００を介して第１ＣＰＵ１９００に転送する。第１ＣＰＵ１９００は、受け取ったメタ情報（図２３参照：クラス構造情報１３１０、コンスタントプール１３２０、メソッドのメタ情報５３３０）とメタ情報等が必要なバイトコード５３４０（図２３参照）をクラス記憶部１３００にロードする（ステップＳ４５０）。
【０１１６】
また、セキュアローダ５２２０は、メタ情報が必要でないバイトコード６６１０（図２３参照）を、バイトコード記憶部２６００にロードする（ステップＳ４６０）。
＜メタ情報等が必要でないコードの部分を選び出す方法＞
メタ情報等が必要でないコードの部分を選び出す方法を説明するとともに、分割フラグの設定を、図２４に示すバイトコード７０００を参照しながら説明する。
【０１１７】
１行目の「ｉｌｏａｄ＿１」と２行目の「ｉｌｏａｄ＿２」とは、ローカル変数領域の１番目の値をオペランドスタックに積む命令であり、メタ情報が必要でない命令である。オペランドスタックはワーク領域６７００のフレーム領域にある領域である。
また、３行目の「ｉａｄｄ」は、オペランドスタック上の値の足し算を行う命令であり、メタ情報が必要でない命令である。
【０１１８】
従って、１行目から３行目までもバイトコード７００１は、メタ情報が必要でない命令である。
４行目の「ｎｅｗａｒｒａｙ」は、ワーク領域１４００上のＪａｖａ（登録商標）ヒープに領域を確保するため、Ｊａｖａ（登録商標）ヒープが必要となる命令である。
最後に「ａｒｅｔｕｒｎ」は、メソッドの後処理をするため、メタ情報が必要となる命令である。
【０１１９】
従って、４行目と５行目のバイトコード７００２は、メタ情報およびＪａｖａ（登録商標）ヒープにアクセスが必要な命令である。
分割したバイトコードの例を、図２５に示す。
バイトコード７０００の１行目〜３行目のバイトコード７００１を、メタ情報が必要でないバイトコード７２００として作成する。連続した行のバイトコードを１つの塊として切り出す。本実施形態では、メソッドに１つの例で説明する。
【０１２０】
また、バイトコード７０００の中で、メタ情報が必要でないバイトコード７２００とし手分割したコードの部分を書き換えたものを、メタ情報が必要なバイトコード７１００とする。
メタ情報が必要なバイトコード７１００は、分割された先頭の部分に分割されたことを示す分割フラグ７１０１を埋め込んでおく。具体的には、予め決めた、分割フラグである旨を示す命令コードを記載する。
【０１２１】
分割された先頭以外の部分、すなわちバイトコード記憶部２６００に記憶されているコードの部分にはｎｏｐ命令等の意味のないコード７１０２を埋め込んでおく。
以上のように構成することにより、クラスファイルのバイトコードの一部がデバッガ等により、解析できない領域にロードすることが可能となる。
尚、メソッドに複数の、メタ情報が必要でないバイトコードの塊がある場合は、分割フラグ７１０１と該当するバイトコードを対応付けておくことで、実行が可能となる。例えば、分割フラグと対応するバイトコードとに共通のＩＤを振るなどである。
【０１２２】
＜クラスの実行処理＞
次に、実行装置５００が、バイトコード７０００を実行する処理について図２６を用いて説明する。
図２６は、クラスの実行の処理を表すフローチャートである。
まず、クラスを実行するにあたり、インタプリタ５１１０はメソッドを呼出す（ステップＳ５００）。
【０１２３】
インタプリタ５１１０は、いまから実行するメソッドのＪａｖａ（登録商標）フレームを、ワーク領域１４００に作成し、メタ情報が必要なバイトコード７１００の実行を開始する（ステップＳ５１０）。
まず、インタプリタ５１１０は、命令をフェッチすると、その命令が分割フラグ７１０１であるか否かを判別する（ステップＳ５２０）。
【０１２４】
分割フラグ７１０１でない場合（ステップＳ５２０：ＮＯ）、すなわち、他の命令コードであった場合は、メソッド終了以外（ステップＳ５７０：ＮＯ）は、通常実行部５０００でその命令の実行を行う（ステップＳ５１０）。
分割フラグ７１０１である場合（ステップＳ５２０：ＹＥＳ）は、インタプリタ５１１０は、処理を保護実行部内６０００内のバイトコード処理部６２００に処理を依頼する（ステップＳ５３０）。この依頼の際、実行中のメソッドのＪａｖａ（登録商標）フレーム内のローカル変数領域とオペランドスタック、およびメソッドのメタ情報５３３０内のＩＤ５３３１の値を引数として渡す。
【０１２５】
依頼を受けたバイトコード処理部６２００のセキュアインタプリタ６２１０は、バイトコード管理部２２５０に、受け取ったＩＤ５３３１の値を渡して、同じ値のＩＤを持つバイトコードの検索を依頼する。
バイトコード管理部２２５０は、バイトコード記憶部２６００から、受け取ったＩＤ５３３１の値と一致するＩＤ６６１１を有するメタ情報が必要でないバイトコード６６１０を検索する（ステップＳ５４０）。
【０１２６】
ＩＤの値が一致するメタ情報が必要でないバイトコード６６１０を見つけたバイトコード管理部２２５０は、バイトコードのアドレスをセキュアインタプリタ６２１０に返す。例えば、図２５のメタ情報が必要でないバイトコード７２００のアドレスである。
セキュアインタプリタ６２１０は、引数として受け取ったローカル変数領域とオペランドスタックを利用して、メタ情報が必要でないバイトコード６６１０の処理を行う（ステップＳ５５０）。
【０１２７】
メタ情報が必要でないバイトコード６６１０が実行中には、通常実行部５０００のメモリ上のデータの読み込み、書き込みをすることは不要なので、バイトコード処理部６２００ですべての処理が可能である。
メタ情報が必要でないバイトコード６６１０の実行が完了すると、ローカル変数領域、オペランドスタック、および、通常実行部５０００のインタプリタ５１１０が次に実行する命令を指すプログラムカウンタを返り値として、処理をインタプリタ５１１０に復帰させる（ステップＳ５６０）。
【０１２８】
インタプリタ５１１０は、メタ情報が必要なバイトコード６６１０の返り値として受け取ったプログラムカウンタから続きを実行する（ステップＳ５７０、ステップＳ５１０）。
以降の処理は従来のＪａｖａ（登録商標）仮想マシンと同じである。
＜実施形態３＞
実施形態３の実行装置は、通常実行部と保護実行部とがそれぞれマルチタスクで動作可能なものである。
【０１２９】
実施形態１と実施形態２では、第１ＣＰＵと第２ＣＰＵが交互に動作することを前提としていた。
本実施形態では、第１ＣＰＵと第２ＣＰＵが同時に動作するときに、実行装置がアプリケーションを保護しながら実行する方式を説明する。
＜構成＞
図２７は、本実施形態を実行するための、実行装置８００の構成例を示す図である。
【０１３０】
セキュアＯＳ８１００以外は、実施形態１と同様の構成である（図１参照）。
第２ＣＰＵ２９００は、通常実行部１０００内の第１ＲＡＭ１９１０に対して読み込み、書き込みが可能である点も、実施形態１と同様である。
また、第２ＣＰＵ２９００は、第１ＣＰＵ１９００とは、物理的に異なるＣＰＵである。
【０１３１】
ここでは、セキュアＯＳ８１００のみ説明する。
セキュアＯＳ８１００は、保護実行部８０００内の第２ＣＰＵ２９００上で動作する、Ｌｉｎｕｘ等のマルチタスクをサポートしているＯＳである。
同一のスレッドの処理が、同じ時間に、保護実行部８０００と通常実行部１０００内とで動作していることはないものとする。
【０１３２】
＜動作＞
次に、実行装置８００が、アプリケーションを実行する方法を説明する。
実行に先立って行われるクラスファイルのロード処理は、実施形態１と同様である（図１１等参照）。また、機能ブロックは、実施形態１と同様であるため、図４を参照して、本実施形態の実行装置の動作を説明する。
【０１３３】
図２８は、実施形態３のクラス実行の処理を表すフローチャートである。
点線で示したステップは、ターゲットとなるクラスの実行に関する処理を表している。
通常実行部１０００のインタプリタ１１１０が、スレッドの実行開始し（ステップＳ６００）、スレッドが保護対象クラスのメソッドのものであった場合、  保護実行部８０００に処理を依頼する。以下、この依頼された処理を、「当該処理」という。
【０１３４】
インタプリタ１１１０は、ＯＳ１０２０を介して、保護実行部８０００のセキュアＯＳ８１００に当該処理を依頼する（ステップＳ６１０）。
セキュアＯＳ８１００は、保護実行部８０００が行っている処理を一時停止し、依頼を受けたスレッドの当該処理を受け取り（ステップＳ７００）、当該処理を受け取ったことをＯＳ１０２０に通知する。
【０１３５】
このときに、通常実行部１０００のインタプリタ１１１０は、当該処理を依頼したスレッドを、保護実行部８０００からの処理完了通知待ち状態にする（ステップＳ６２０）。
以降の処理は、通常実行部１０００と保護実行部８０００とが並行に動作を開始する。
セキュアＯＳ８１００は、当該処理をセキュアＯＳ８１００のスケジューラに渡して登録する（ステップＳ７１０）。当該処理の開始は、セキュアＯＳ８１００内のスケジューラが管理する。
【０１３６】
通常実行部１０００のインタプリタ１１１０は、他のスレッドの処理を実行する（ステップＳ６３０）。
一方、保護実行部８０００のバイトコード管理部２２００も、スケジューラに処理を渡した後は、当該処理を渡される前に実行していたバイトコード処理部２２００の処理を継続する（ステップＳ７２０）。
【０１３７】
その後、保護実行部８０００では、スケジューラにより当該処理の開始通知をバイトコード管理部２２００が受け取り、当該処理を開始する（ステップＳ７３０）。
バイトコード管理部２２００が当該処理の実行を完了すると、完了を検出したセキュアＯＳ８１００が、通常実行部１０００のＯＳ１０２０に処理の完了を通知する（ステップＳ７４０）。
【０１３８】
保護実行部８０００より完了通知を受け、通常実行部１０００のインタプリタ１１１０は待ち状態になっていた処理を再び開始する。（ステップＳ６４０）。
その後、通常実行部１０００と保護実行部８０００では、それぞれスケジューラの指示に従い、他の処理を実行していく（ステップＳ６５０、ステップＳ７５０）。
以上説明したように、バイトコードを保護実行部８０００にのみ記憶し、不正行為を防ぐことができることに加え、２つのＣＰＵが並列で動作することにより、実行速度が向上する。
【０１３９】
なお、実施形態３では、バイトコードのすべてを第２ＲＡＭに記憶し、保護実行部内で処理をしていたが、実施形態２のようにバイトコードの一部を第２ＲＡＭに記憶しても本発明は実施可能である。
＜補足＞
以上、本発明に係る実行装置について実施形態に基づいて説明したが、この実行装置を部分的に変形することもでき、本発明は上述の実施形態に限られないことは勿論である。即ち、
（１）実施形態では、クラスファイルが暗号化されているか否かを判別する場合に、保護対象クラス一覧を参照することとしているが、他の方法であっても良い。  
【０１４０】
例えば、保護対象クラス一覧を使用せずに、クラスファイルの特定箇所に特定のコードが入っていないなど、通常のクラスファイルと異なることを判別できればよい。また、復号化の過程で、正当性を検証することとしてもよい。実行中にエラーとなることを防ぎ、実行自体を停止することができるという利点がある。
また、アプリケーションをダウンロードする場合は、ダウンロードする別のファイルに判別するための情報がはいっていてもよい。アプリケーションが放送波によって送られてくるものである場合には、多重化されて送られてくるファイルを利用して判別してもよい。
【０１４１】
またさらに、アプリケーションプログラムの開発者が、クラスファイルの名前に保護が必要なクラスに特定の文字列を付加し、実行時に、クラスファイルの名前から実行時の保護が必要かを判断をしてもよい。
さらに、実施形態では、保護対象クラス一覧に載っているクラスは、保護が必要で暗号化されているものとしているが、暗号化されているすべてのクラスを載せる必要はなく、作成者が保護したいと希望するクラスのみでもよい。
【０１４２】
この場合、例えば、通常実行部でも復号化する機能部を備え、保護対象クラス一覧に乗っていない暗号化されたクラスを復号化して実行する。
また、実施形態では、アプリケーションのクラスファイル名を載せることとしているが、その他、Ｊａｖａ（登録商標）仮想マシン内のクラスライブラリに含まれるクラス名などを記載していてもよい。
【０１４３】
また、実施形態では、クラス全体を暗号化しているが、クラス内のバイトコードのみを暗号化しておいても良い。この場合、バイトコードのみを保護実行部に送ることとしてもよい。
また、実施形態では、暗号鍵は１つとして説明しているが、複数を使い分けても良い。例えば、保護対象クラス一覧に、使用する暗号鍵を特定できる情報を入れておき、その情報によって特定される暗号鍵でクラスを復号化するなどである。
（２）実施形態１では、バイトコード分割フラグをメソッドのメタ情報内に用意したが、他の場所に作成しても良い。
【０１４４】
たとえば、クラス情報構造情報にフラグを用意してもよい（図１２等参照）。
（３）実施形態１、実施形態２及び実施形態３では、保護実行部で処理が必要なときだけに保護実行部に処理を依頼していたが、保護実行部で処理が必要でないときであっても保護実行部に処理を依頼し、保護実行部は何も処理を行わずに処理を通常実行部に返してもよい。
【０１４５】
クラスの実行時に、必ず保護実行部に制御が移ることで、本当に保護したいクラスの特定を困難にする効果がある。
なお、実施の形態では、実行するＪａｖａ（登録商標）アプリケーションや仮想マシンを通常実行部のメモリにおいておき、そのクラスファイルをロードするときに、保護実行部で実行すべきバイトコードであるか否かを判別していたが、予め、第２ＲＯＭに、保護すべきバイトコードを記憶しておき、実行時に第２ＲＡＭにロードしてもよい。この場合、メタ情報とバイトコードを対応付ける情報、例えば、ＩＤは、予め設定しておく必要がある。
（４）実施形態１及び実施形態２では、実行装置１００の第１ＣＰＵ１９００と、保護実行部２０００の第２ＣＰＵ２９００とは、物理的に異なるＣＰＵであるとしているが、物理的に１つのＣＰＵが、動作モードを切り替えるなどの方法で仮想的に２つのＣＰＵのように振舞うこととしてもよい。また、マルチコアＣＰＵのように、１つのＣＰＵパッケージのなかに複数のＣＰＵコアを持つＣＰＵでは、そのうちの特定のコアを第２ＣＰＵとして動作させてもよい。
【０１４６】
また、実施形態では、通常実行部１０００と保護実行部２０００とにそれぞれ、ＲＡＭおよびＲＯＭを持つこととしているが、１つのＲＡＭを仮想的に２つのＲＡＭとして扱ってもよい。同様に、１つのＲＯＭを仮想的に２つのＲＯＭとして扱ってもよい。さらに、保護実行部２０００内のＲＯＭは第２ＣＰＵ２９００に混載されていてもよい。
（５）実施形態では、実行装置１００で実行するアプリケーションは、アプリ取得プログラム１０１０が、インターネット上にあるサーバから、ダウンロードしたものであるが、ほかの方法で取得したアプリケーションであってもよい。
【０１４７】
例えば、デジタル放送のデータ放送として、ＭＰＥＧ（Moving Picture Coding Experts Group）２トランスポートストリーム内に埋め込まれたＪａｖａ(登録商標)アプリケーションであってもよい。
この場合、アプリ取得プログラム１０１０は、トランスポートストリーム内に埋め込まれたＪａｖａ(登録商標)アプリケーションを実行装置１００内に読み出すプログラムとなる。
【０１４８】
ＭＰＥＧ２トランスポートストリームにＪａｖａ(登録商標)プログラムを埋め込む方法としては、例えば、ＤＳＭＣＣ方式がある。ＤＳＭＣＣ方式とは、ＭＰＥＧ２トランスポートストリームのパケットの中に、コンピュータで使用されているディレクトリやファイルで構成されるファイルシステムをエンコードする方法である（ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−１、ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−６参照）。
【０１４９】
またさらに、実行装置１００で実行するアプリケーションは、ＳＤカード（Secure Digital memory card）、ＣＤ−ＲＯＭ（Compact Disk Read Only Memory）、ＤＶＤ（Digital Versatile Disk）、Ｂｌｕ−ＲａｙＤｉｓｃ等に記録されたＪａｖａ(登録商標)アプリケーションであってもよい。
この場合、アプリ取得プログラム１０１０は、これらの記録媒体からアプリケーションを読み出すプログラムとなる。
【０１５０】
また、実行装置１００で実行するアプリケーションは、実行装置１００内にあるＲＯＭなどに記録されたＪａｖａ(登録商標)アプリケーションであってもよい。
この場合、アプリ取得プログラム１０１０は、ＲＯＭから作業メモリに、Ｊａｖａ（登録商標）アプリケーションを読み出すプログラムとなる。
さらに、近年、デジタルＴＶや携帯電話などの電子機器では、Ｊａｖａ（登録商標）言語で記述されたプログラムをダウンロードし、実行する機能を搭載するものが増加している。例えば携帯電話では、ＮＴＴ  ＤｏＣｏＭｏがｉ−アプリと呼ばれるサービスを提供している。このサービスは、携帯電話端末がインターネット上にあるアプリケーション配信サーバからＪａｖａ（登録商標）プログラムをダウンロードして、端末上で実行する。また、欧州では、ＤＶＢ−ＭＨＰ（Ｄｉｇｉｔａｌ  Ｖｉｄｅｏ  Ｂｒｏａｄｃａｓｔｉｎｇ−Ｍｕｌｔｉｍｅｄｉａ  Ｈｏｍｅ  Ｐｌａｔｆｏｒｍ）と呼ばれる仕様が策定され、既に仕様に準拠した運用が開始されている。ＤＶＢ−ＭＨＰ規格に基づくデジタル放送では、放送波に多重化されたＪａｖａ（登録商標）プログラムをデジタルＴＶが受信し、それを実行する。
【０１５１】
この場合、アプリ取得プログラム１０１０は、ＴＬＳ（Transport Layer Security）、ＨＴＴＰ（Hypertext Transfer Protocol）等のプロトコルに従いＪａｖａ（登録商標）アプリケーションをダウンロードする機能を有するプログラムとなる。
ここで、ＴＬＳは暗号化により通信時のデータの盗聴、改竄を防ぐデータ転送方式である（ＲＦＣ２２４６参照）。また、ＨＴＴＰは、インターネット上のデータ通信で一般的に用いられているデータ転送方式である（ＲＦＣ２６１６参照）。
【０１５２】
尚、ＲＦＣ（Request For Comments）とは、インターネット上の技術を規格化するＩＥＴＦ（Internet Engineering Task Force）の公式文書であり、プロトコルなど様々な技術の使用がまとめられているものである。
（６）本実施形態では、アプリ取得プログラム１０１０などはＪａｖａ(登録商標)言語で記述されたＪａｖａ(登録商標)プログラムなどの他、ネイティブ言語で記述されたプログラムや、ハードウェアで実現されていてもよい。
【０１５３】
また、仮想マシンで実行するアプリケーションは、Ｊａｖａ（登録商標）言語で記述されたものに限らず、Ｃ＋＋などの他のオブジェクト指向言語で記述されたものであってもよい。また、Ｊａｖａ（登録商標）仮想マシン自体も、オブジェクト指向言語で記述されても、非オブジェクト指向言語で記述されてもよい。
（７）実施形態の保護実行部２０００は、例えば、ＡＲＭ社のＴｒｕｓｔＺｏｎｅ（登録商標）技術を使うことで実現することができる。
【０１５４】
ＴｒｕｓｔＺｏｎｅ（登録商標）技術では、ＲＡＭやＲＯＭなどのハードウェア資源の一部をセキュアドメインと呼ばれる仮想的に実行環境に割り当てることができる。セキュアドメインに割り当てられたＲＡＭやＲＯＭは、セキュアドメインで動作するプログラムのみが利用可能であり、セキュアドメイン以外で動作するプログラムからは一切利用することができない。
【０１５５】
従来のＣＰＵでは、アプリケーションが動作する通常モードとＯＳなどが動作する特権モードの２種類のモードを持ち、通常モードで動作するプログラムからは特権モードで動作するプログラムを改ざんすることができないようになっている。
ＴｒｕｓｔＺｏｎｅ（登録商標）技術では、さらに、モニターモードと呼ばれる特殊なモードが新しく用意される。モニターモードへは、ＣＰＵが用意する特殊な命令を実行することで遷移することができる。モニターモードでＣＰＵが動作するときには、Ｓ−ｂｉｔと呼ばれるセキュリティ情報がＲＡＭやＲＯＭなどの周辺ハードに通知される。ＴｒｕｓｔＺｏｎｅ（登録商標）技術に対応したＲＡＭやＲＯＭは、Ｓ−ｂｉｔが通知された場合に限り、セキュアドメインに割り当てられた領域へのデータの読み書きを許可するように構成されている。またセキュアドメインに割り当てられていない領域へのデータへの読み書きはＳ−ｂｉｔが通知されているか否かに関わらず読み書きを許可する。このように、安全な実行部はセキュアドメインにより実現することができる。
【０１５６】
また、Ｉｎｔｅｌ社のＬａＧｒａｎｄｅ技術でも、通常のアプリケーションやＯＳが動作するドメインと保護が必要なアプリケーションが動作するドメインを仮想的に分離するなど、ＴｒｕｓｔＺｏｎｅ（登録商標）技術と同様の機能を提供している。このような技術を使うことで安全な実行部を実現することができる。
（８）実施形態では、保護実行部２０００は、実行装置１００に内蔵されているものとしているが、実行装置１００から着脱可能なスマートカードやＩＣカードなどであることとしてもよい。このスマートカード、ＩＣカードはカード内部にＣＰＵやメモリ、セキュリティ回路を含むものである。
【０１５７】
保護実行部２０００は、その全体をハードウエアにより実現してもよい。
この場合、第１ＣＰＵと第２ＣＰＵ間のデータ通信は暗号化して行い、第３者による盗聴を防ぐことが必要となる。具体的には、両ＣＰＵを結ぶデータバスを介してデータを送信する際に、送信するデータを暗号化し、データを受信後に復号することで行われる。
（９）実施形態では、アプリケーションの実行環境プログラムとして、Ｊａｖａ（登録商標）仮想マシンを例に説明しているが、他の実行環境であってもよく、ＯＳであってもよい。
【０１５８】
また、更に、アプリケーションが実行環境プログラムに該当する場合には、そのアプリケーション自体を秘匿するバイトコードの対象としてもよい。
（１０）実施形態で示した実行装置の各機能を実現させる為の各制御処理（図４等参照）をＣＰＵに実行させる為のプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体には、ＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ、フラッシュメモリ等がある。流通、頒布されたプログラムは、機器におけるＣＰＵで読み取り可能なメモリ等に格納されることにより利用に供され、そのＣＰＵがそのプログラムを実行することにより実施形態で示した実行装置の各機能が実現される。
（１１）実行装置における保護実行部（２０００、６０００、８０００）は典型的には集積回路であるＬＳＩとして実現される。これらは個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されても良い。
【０１５９】
ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Field Programmable Gate Array）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサー を利用しても良い。
【０１６０】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
【産業上の利用可能性】
【０１６１】
本発明に係るアプリケーションの実行装置は、アプリケーションの実行、解析に不可欠なバイトコードを、ハードウエアなどで実現された、盗聴、改竄が困難な保護実行部へと隠蔽することで、アプリケーションを実行時の盗聴、改竄から保護することができ、今後本格展開が予想されるアプリケーションのダウンロード配信ビジネスにおいて、コンテンツに発生する作成者の権利などを保護することができる。
【図面の簡単な説明】
【０１６２】
【図１】本発明にかかる実行装置のハードウェア及びソフトウェアの構成を表す図である。
【図２】第１ＲＯＭ１９２０が記憶するプログラムの例を示す図である。
【図３】第２ＲＯＭ２９２０が記憶するデータ及びプログラムの例を示す図である。
【図４】本発明にかかる実行装置の構成を示す機能ブロック図である。
【図５】アプリケーションプログラム１２１０の構成例を示す図である。
【図６】保護対象クラス一覧１２２０の構成例及び内容例を示す図である。
【図７】クラスファイルの構成例を示す図である。
【図８】仮想マシン１１００のサブプログラムの構成を示す図である。
【図９】バイトコード処理部のサブプログラムの構成を示す図である。
【図１０】実行装置１００の起動処理を表すフローチャートである。
【図１１】実行装置１００のロード処理を表すフローチャートである。
【図１２】保護対象クラスのクラスファイルがロードされた状態を示す図である。
【図１３】実行装置１００のクラスの実行処理を表すフローチャートである。
【図１４】実行装置１００のバイトコードの実行処理を表すフローチャートを示す。
【図１５】Ｊａｖａ（登録商標）言語のメソッドの例を示す図である。
【図１６】メソッド４０００をコンパイルし、得られたバイトコード４１００を示す図である。
【図１７】Ｊａｖａ（登録商標）フレームを積み上げた時点での、ワーク領域１４００の状態の例を示す図である。
【図１８】ｉａｄｄ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図１９】ｎｅｗａｒｒａｙ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図２０】ａｒｅｔｕｒｎ命令を実行後の、ワーク領域１４００の状態の例を示す図である。
【図２１】実施形態２の実行装置５００の構成例を示す機能ブロック図である。
【図２２】実行装置５００のロード処理を表すフローチャートである。
【図２３】保護対象クラスのクラスファイルがロードされた状態を示す図である。
【図２４】バイトコードの例を示す図である。
【図２５】分割したバイトコードの例を示す図である。
【図２６】実施形態２の実行装置５００のクラスの実行処理を表すフローチャートである。
【図２７】実施形態３の実行装置８００の構成例を示す図である。
【図２８】実施形態３の実行装置８００のクラスの実行処理を表すフローチャートである。
【図２９】従来技術の構成を表す図である。
【符号の説明】
【０１６３】
１００  ５００    実行装置
１０００  ５０００    通常実行部
１０１０    アプリ取得プログラム
１２００    アプリケーションプログラム記憶部
１２１０    アプリケーションプログラム
１１００  ５１００    仮想マシン
１１１０  ５１１０    インタプリタ
１１２０  ５１２０    ローダ
１０２０  ８１００    ＯＳ
１３００    クラス記憶部
１３３０    メソッドのメタ情報
１３３１    バイトコード分割フラグ
１３３２  ２６１１    ＩＤ
１４００  ６７００    ワーク領域
１９００    第１ＣＰＵ
１９１０    第１ＲＡＭ
１９２０    第１ＲＯＭ
２０００  ６０００  ８０００    保護実行部
２１００  ６１００    復号処理部
２２００  ６２００    バイトコード処理部
２２１０  ６２１０    セキュアインタプリタ
２２２０  ６２２０    セキュアローダ
２６００    バイトコード記憶部
２６１０    バイトコード
２９００    第２ＣＰＵ
２９１０    第２ＲＡＭ
２９２０    第２ＲＯＭ
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2007011001.tif 000031
【図２】
2007011001.tif 000032
【図３】
2007011001.tif 000033
【図４】
2007011001.tif 000034
【図５】
2007011001.tif 000035
【図６】
2007011001.tif 000036
【図７】
2007011001.tif 000037
【図８】
2007011001.tif 000038
【図９】
2007011001.tif 000039
【図１０】
2007011001.tif 000040
【図１１】
2007011001.tif 000041
【図１２】
2007011001.tif 000042
【図１３】
2007011001.tif 000043
【図１４】
2007011001.tif 000044
【図１５】
2007011001.tif 000045
【図１６】
2007011001.tif 000046
【図１７】
2007011001.tif 000047
【図１８】
2007011001.tif 000048
【図１９】
2007011001.tif 000049
【図２０】
2007011001.tif 000050
【図２１】
2007011001.tif 000051
【図２２】
2007011001.tif 000052
【図２３】
2007011001.tif 000053
【図２４】
2007011001.tif 000054
【図２５】
2007011001.tif 000055
【図２６】
2007011001.tif 000056
【図２７】
2007011001.tif 000057
【図２８】
2007011001.tif 000058
【図２９】
2007011001.tif 000059
【国際調査報告】
2007011001.tif 000060
2007011001.tif 000061