(57)【要約】【課題】従来のＪａｖａ（Ｒ）アプリケーション保護技術では、ネイティブコードに対する盗聴、改ざんに対抗できないため、Ｊａｖａ（Ｒ）アプリケーションを高速に実行し、かつ、アプリケーションを保護することができない。【解決手段】ＪＩＴコンパイルにより生成されたネイティブコードを、改ざんのできない安全な実行部で暗号化を行い、ネイティブコード実行時のみ必要な箇所を復号化し、メソッドの実行終了後に即座に暗号化を行う。【選択図】図１
2007233426.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述されたプログラムを暗号化した暗号化プログラムを実行するプログラム実行環境において
前記暗号化プログラムを格納する暗号化プログラム格納手段と、
前記暗号化プログラム格納手段に格納されている暗号化プログラムを復号する復号化手段と、
前記復号化手段により復号化されたプログラムを、プログラム実行中に前記プログラム実行環境を動作させている演算装置が解釈実行可能なネイティブコードに変換するプログラム変換手段と、
前記プログラム変換手段により変換したネイティブコードを格納するネイティブコード格納手段と、
前記プログラム変換手段により変換されたネイティブコードを暗号化するネイティブコード暗号化手段とを含むことを特徴とするプログラム変換方法。
【請求項２】
前記ネイティブコード暗号化手段は、前記ネイティブコードを所定の単位に分割し、分割した各々のコードに対して暗号化することを特徴とする請求項１に記載のプログラム変換方法。
【請求項３】
請求項２における所定の単位とは、オブジェクト指向言語でのメソッドであることを特徴とする請求項２に記載のプログラム変換方法。
【請求項４】
請求項２における所定の単位とは、分岐を含まない一連の命令群毎であることを特徴とする請求項２に記載のプログラム変換方法。
【請求項５】
請求項２における所定の単位とは、１命令毎であることを特徴とする請求項２に記載のプログラム変換方法。
【請求項６】
前記ネイティブコード暗号化手段は、暗号化を実行する度に暗号鍵を変更することを特徴とする請求項１または請求項２に記載のプログラム変換方法。
【請求項７】
前記ネイティブコード暗号化手段は、暗号化を実行する度に暗号アルゴリズムを変更することを特徴とする請求項１または請求項２に記載のプログラム変換方法。
【請求項８】
前記プログラム変換手段は、前記プログラムに付加された値により、プログラム変換を行うかどうかを判定することを特徴とする請求項１に記載のプログラム変換方法。
【請求項９】
前記ネイティブコード暗号化手段は、前記プログラムに付加された値により、暗号鍵または暗号化アルゴリズムを決定することを特徴とする請求項１に記載のプログラム変換方法。
【請求項１０】
前記プログラム変換手段は、前記ネイティブコードを生成した後、前記プログラムまたは前記暗号化プログラムを削除することを特徴とすることを特徴とする請求項１または請求項２に記載のプログラム変換方法。
【請求項１１】
暗号化ネイティブコードを復号化するネイティブコード復号化手段と、復号化されたネイティブコードを実行することネイティブコード実行手段を備えることを特徴とするプログラム実行装置。
【請求項１２】
前記ネイティブコード復号化手段は、前記暗号化ネイティブコードが分割された単位で復号化し、前記ネイティブコード実行手段は、前記ネイティブコード復号化手段で復号化された単位毎に、ネイティブコードを実行することを特徴とする請求項１１に記載のプログラム実行装置。
【請求項１３】
前記ネイティブコード実行手段は、実行済の前記ネイティブコードまたは前記ネイティブコードの部分を暗号化することを特徴とする請求項１１に記載のプログラム実行装置。
【請求項１４】
前記ネイティブコード実行手段は、実行済の前記ネイティブコードまたは前記ネイティブコードの部分を削除することを特徴とする請求項１１に記載のプログラム実行装置。
【請求項１５】
前記ネイティブコードを最適化し、最適化が施されたネイティブコードを暗号化するネイティブコード最適化手段をもつことを特徴とする請求項１に記載のプログラム変換方法。
【請求項１６】
前記ネイティブコード最適化手段は、前記プログラム変換手段によるプログラムの変換とは違うタイミングで最適化を行うことを特徴とする請求項１５に記載のプログラム変換方法。
【請求項１７】
前記ネイティブコード最適化手段は、最適化前のネイティブコードを削除することを特徴とする請求項１５に記載のプログラム変換方法。
【請求項１８】
暗号化プログラムを復号化し、復号化された前記プログラムに対し安全性を検査する、プログラムベリファイ方法。
【請求項１９】
前記プログラムベリファイ方法は、複数の検査項目をもち、各検査項目に必要な情報のみを復号化し、復号化された情報に対し安全性をチェックし、各検査項目が終了した後、復号化された情報を削除または暗号化する請求項１８に記載のプログラムベリファイ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想マシン方式（特にＪａｖａ（Ｒ）仮想マシン）によりプログラムを実行する機能を持つ端末装置において、インターネットやＤＶＤ等の端末外部のメディアからダウンロードしたプログラムを実行する時に、プログラムが盗聴、改竄されることを防止することに関する。
【背景技術】
【０００２】
従来のデジタルＴＶや携帯電話などの電子機器では、Ｊａｖａ（Ｒ）言語で記述されたプログラムをダウンロードし、実行する機能を搭載するものが増加している。例えば携帯電話では、ＮＴＴ  ＤｏＣｏＭｏがｉ−アプリと呼ばれるサービスを提供している。このサービスは、携帯電話端末がインターネット上にあるアプリケーション配信サーバからＪａｖａ（Ｒ）プログラムをダウンロードして、端末上で実行する。また、欧州では、ＤＶＢ−ＭＨＰ（Ｄｉｇｉｔａｌ  Ｖｉｄｅｏ  Ｂｒｏａｄｃａｓｔｉｎｇ−Ｍｕｌｔｉｍｅｄｉａ  Ｈｏｍｅ  Ｐｌａｔｆｏｒｍ）と呼ばれる仕様が策定され、既に仕様に準拠した運用が開始されている。ＤＶＢ−ＭＨＰ規格に基づくデジタル放送では、放送波に多重化されたＪａｖａ（Ｒ）プログラムをデジタルＴＶが受信し、それを実行する。
【０００３】
このようなプログラム配信サービスにおいて、配信されるプログラムはそのプログラムの開発者の知的財産権で保護されており、これを悪意のある攻撃者が盗聴することは防がなくてはならない。また、悪意のある攻撃者により改ざんされたプログラムが、利用者やアプリ製作者の意図しない動作をすることを防がなくてはならない。これらを実現するために、従来の電子機器は以下のような機能を備えている。
【０００４】
暗号化したプログラムをダウンロードし、端末内部で復号することにより、通信途中の盗聴、改ざんを防止する。
【０００５】
ハッシュ関数等を使い、ダウンロード時にプログラムが改ざんの有無を検証し、改ざんされたプログラムの実行を防止する。
【０００６】
従来のプログラムが盗聴、改竄されることを防止する方法の一例は、特開２００２−１３２３６４号公報に記載されている。図２に示すように、この従来のプログラムが盗聴、改竄されることを防止する方法は、主に暗号化されたプログラム２０１と復号化手段２０２と仮想機械２０３とＣＰＵ２０４から構成されている。
【０００７】
暗号化プログラム２０１は、仮想機械２０３が解釈実行可能な仮想オペレーションコードを暗号化して含んでいる。仮想機械２０３は暗号化プログラム２０１が含む仮想オペレーションコードを直接実行する。または仮想機械２０３は暗号化プログラム２０１実行する際、復号化手段２０２に暗号化プログラム２０１を復号化させて仮想オペレーションコードを取り出し、解釈実行をする。ＣＰＵ２０４は、仮想機械２０３を実行する。
【０００８】
従来技術では、以上の手段によりプログラムが盗聴、改竄されることを防止していた。
【特許文献１】特開２００２−１３２３６４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
近年の電子機器は、多数のソフトウェアモジュールから構成されている。専門的な知識を有する者であれば、これらのソフトウェアモジュールのバグを悪用することで端末内のソフトウェアを改ざんすることも可能である。また、デバッガやＩＣＥ（Ｉｎ−Ｃｉｒｃｕｉｔ  Ｅｍｕｌａｔｏｒ）等のツールを用いることでも同様のことは実現可能である。さらにデバッガやＩＣＥを使用する場合には、実行中のＪａｖａ（Ｒ）仮想マシンにブレークポイントを設定することにより、任意のタイミングでＪａｖａ（Ｒ）仮想マシンの動作を一時停止や、Ｊａｖａ（Ｒ）仮想マシンが使用しているメモリを盗聴、改ざんすることが可能になる。暗号化されて配信されるアプリケーションも、実行時には復号され平文となる。そのため、攻撃者がＪａｖａ（Ｒ）仮想マシンの処理のうち、クラスをロードする処理やメソッドを実行する処理にブレークポイントを設置すると、攻撃者は平文のアプリケーションにアクセスすることができる。
【００１０】
しかしながら、従来の技術においては、Ｊａｖａ（Ｒ）仮想マシンのインタプリタ実行中にＪａｖａ（Ｒ）バイトコードを盗聴、改ざんから保護することはできるが、プログラムをＪａｖａ（Ｒ）仮想マシン内部形式に変換するクラスロード処理中やプログラムの正当性を確認するベリファイ処理中に、バイトコードを保護することができない。また、実行速度を向上させるため、Ｊａｖａ（Ｒ）仮想マシンが、Ｊａｖａ（Ｒ）プログラム実行中にバイトコードをネイティブコードに変換するＪＩＴコンパイラを備え利用する場合、ＪＩＴコンパイル後のネイティブコードを保護することができないという問題がある。
【００１１】
そのため、ＪＩＴコンパイル後のネイティブコードをターゲットにして盗聴、改ざんを行うことができる。Ｊａｖａ（Ｒ）プログラムによるサービスは、年々肥大化・多様化しており、Ｊａｖａ（Ｒ）プログラムの実行速度を向上させるＪＩＴコンパイラの搭載はＪａｖａ（Ｒ）仮想マシンにとって必須の機能である。今後、インターネット等を利用したＪａｖａ（Ｒ）プログラムの配信ビジネスが本格化するに従い、ＪＩＴコンパイラにより生成されるネイティブコードの盗聴、改ざんの問題が深刻化すると予想される。
【００１２】
本発明は、前記従来の課題を解決するもので、実行中のＪａｖａ（Ｒ）プログラムを盗聴、改ざんから保護するＪａｖａ（Ｒ）プログラム実行環境を提供することを目的とする。
【課題を解決するための手段】
【００１３】
前記従来の課題を解決するために、本発明は、暗号化されたバイトコードを復号する復号処理部と、バイトコードをネイティブコードに変換するＪＩＴコンパイルと、ネイティブコードを暗号化する暗号処理部と、暗号化されたネイティブコードを復号化する復号処理部と、バイトコードとネイティブコードを解釈実行し、実行が終わったバイトコードとネイティブコードを再び暗号化させるＪａｖａ（Ｒ）実行環境を有し、ＪＩＴコンパイルにより生成されるネイティブコードを暗号化する。
【００１４】
本構成によってＪａｖａ（Ｒ）プログラムを盗聴・改ざんから保護することができる。
【発明の効果】
【００１５】
本発明によれば、プログラム実行中に復号化されるクラスファイル、バイトコード、ネイティブコードがメモリ上に配置される時間を大幅に短縮し、かつプログラムの実行速度を向上させることが可能となり、Ｊａｖａ（Ｒ）プログラムの盗聴、改ざんを極めて困難にさせることができる。
【００１６】
また、本発明を用いることで、暗号に用いる暗号鍵やアルゴリズムを実行中に切り替えるが可能となり、暗号強度の向上と、データの重要度や実行速度に応じた暗号鍵やアルゴリズムの選択を実現することができる。
【発明を実施するための最良の形態】
【００１７】
以下本発明の実施の形態について、図面を参照しながら説明する。
【００１８】
まず、図１を参考にして本実施の形態におけるＪａｖａ（Ｒ）アプリケーション実行装置の構成について説明をする。
【００１９】
ダウンロード可能なプログラム１００はＪａｖａ（Ｒ）アプリケーション実行装置１１０（アプリケーション実行装置１１０と称す）からダウンロード可能なプログラムである。具体的には、Ｊａｖａ（Ｒ）アプリケーションが該当する。
【００２０】
アプリケーション実行装置１１０は、実行部１２０と安全な実行部１３０から構成され、ダウンロード可能なプログラム１００をダウンロードし実行する装置である。アプリケーション実行装置１１０は、具体的にはデジタルテレビ、セットトップボックス、ＤＶＤレコーダー、ＢｌｕｅＲａｙＤｉｓｃ（ＢＤ）レコーダー、カーナビ端末、携帯電話、ＰＤＡなどの、Ｊａｖａ（Ｒ）仮想マシンを搭載する電子機器全般が該当する。
【００２１】
実行部１２０は、通常のパーソナルコンピュータやデジタル家電機器等に搭載されているプログラム実行手段と同様のものであり、アプリ取得プログラム１２１、Ｊａｖａ（Ｒ）仮想マシン１２２（仮想マシン１２２と称す）、ＯＳ１２３、第１ＣＰＵ１２４、第１ＲＡＭ１２５、第１ＲＯＭ１２６から構成される。実行部１２０は主に、ダウンロード可能なプログラム１１０の実行と、安全な実行部１３０への暗号化命令、復号化命令の送信を行う。後ほど、各構成要素の詳細を説明する。
【００２２】
安全な実行部１３０は、復号処理部１３１、暗号処理部１３２、第２ＣＰＵ１３３、第２ＲＡＭ１３４、第２ＲＯＭ１３５から構成され、悪意のある第３者からの攻撃を防御しつつ安全にプログラムを実行させることができるプログラム実行手段であり、主な機能は第１ＲＡＭ１３４に格納されているデータの暗号化・復号化を行う。後ほど、各構成要素の詳細を説明する。
【００２３】
本実施の形態では、Ｊａｖａ（Ｒ）アプリケーション実行装置１１０は２つのＣＰＵを備えているが、一つのＣＰＵが動作モードを切り替えるなどの方法で仮想的に二つのＣＰＵのように振舞ってもよい。また、安全な実行部１３０全体をハードウェアにより実現してもよい。
【００２４】
以上が、本実施の形態におけるアプリケーション実行装置１１０の構成である。
【００２５】
次に、図１を参考にして実行部１２０の構成要素について詳細を説明する。
【００２６】
アプリ取得プログラム１２１は、任意の手法でダウンロード可能なプログラム１００を、アプリケーション実行装置１１０の外から取得し、ダウンロード可能なプログラム１００が含むＪａｖａ（Ｒ）クラスファイルまたはＪａｒファイルを、第１ＲＡＭ１２５へ格納するプログラムである。
【００２７】
Ｊａｖａ（Ｒ）クラスファイルは、バイトコードなどの情報を含むファイルであり、図３にクラスファイルの構成を示す。クラスファイルについての詳細は書籍「Ｊａｖａ（Ｒ）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１―）」で定義されている。ここでは、各構成要素について簡潔に説明し、詳細な説明は省略する。ｍａｇｉｃ＿ｎｕｍｂｅｒ３０１は、Ｊａｖａ（Ｒ）クラスファイルはＣＡＦＥＢＡＢＥという固定値をもちＪａｖａ（Ｒ）クラスファイルは必ずこの値から始まる。ｍｉｎｏｒ＿ｖｅｒｓｉｏｎ３０２はこのクラスファイルのマイナーバージョンを示す。ｍａｊｏｒ＿ｖｅｒｓｉｏｎ３０３は、このクラスファイルのメジャーバージョンを示す。ｃｏｎｓｔａｎｔ＿ｐｏｏｌ＿ｃｏｕｎｔ３０４は、ｃｏｎｓｔａｎｔ＿ｐｏｏｌ３０５の要素数を示す。ｃｏｎｓｔａｎｔ＿ｐｏｏｌ３０５は、このクラスの名前やメソッド名などの情報の配列である。ａｃｃｅｓｓ＿ｆｌａｇｓ３０６は、このクラスへのアクセス権を示す。ｔｈｉｓ＿ｃｌａｓｓ３０７は、このクラス自身を示すｃｏｎｓｔａｎｔ＿ｐｏｏｌ３０５のインデックスを示す。ｓｕｐｅｒ＿ｃｌａｓｓ３０８は、このクラスの親クラスを示すｃｏｎｓｔａｎｔ＿ｐｏｏｌ３０５のインデックスを示す。ｉｎｔｅｒｆａｃｅｓ＿ｃｏｕｎｔ３０９は、ｉｎｔｅｒｆａｃｅｓ３１０の個数を示す。ｉｎｔｅｒｆａｃｅｓ３１０は、このクラスが持つインターフェースについて情報の配列である。ｆｉｅｌｄｓ＿ｃｏｕｎｔ３１１は、ｆｉｅｌｄｓ３１２の個数である。ｆｉｅｌｄｓ３１２は、このクラスがもつフィールドについての情報の配列である。ｍｅｔｈｏｄｓ＿ｃｏｕｎｔ３１３は、ｍｅｔｈｏｄｓ３１４の個数である。ｍｅｔｈｏｄｓ３１４は、このクラスが持つメソッドについての情報の配列である。ａｔｔｒｉｂｕｔｅｓ＿ｃｏｕｎｔ３１５は、ａｔｔｒｉｂｕｔｅｓ３１６の個数である。ａｔｔｒｉｂｕｔｅｓ３１６は、このクラスの属性情報の配列である。
【００２８】
また、Ｊａｒファイルは、複数のＪａｖａ（Ｒ）クラスファイルを１つの圧縮ファイルとして扱える形式のファイルである。
【００２９】
アプリ取得プログラム１２１は、例えば、インターネット上にあるサーバから、ＴＬＳ（Ｔｒａｎｓｐｏｒｔ  Ｌａｙｅｒ  Ｓｅｃｕｒｉｔｙ）、ＨＴＴＰ（Ｈｙｐｅｒｔｅｘｔ  Ｔｒａｎｓｆｅｒ  Ｐｒｏｔｏｃｏｌ）等のプロトコルに従いＪａｖａ（Ｒ）アプリケーションをダウンロードするＪａｖａ（Ｒ）プログラムが相当する。ＴＬＳは暗号化により通信時のデータの盗聴、改ざんを防ぐデータ転送方式である。ＴＬＳの詳細はＲＦＣ２２４６に記載されており、ここでは詳細な説明を省略する。ＨＴＴＰは、インターネット上のデータ通信で一般的に用いられているデータ転送方式である。ＨＴＴＰの詳細はＲＦＣ２６１６に記載されており、ここでは詳細な説明を省略する。
【００３０】
また、アプリ取得プログラム１２１は、デジタル放送のデータ放送として、ＭＰＥＧ２トランスポートストリーム内に埋め込まれたＪａｖａ（Ｒ）アプリケーションを端末内に読み出すＪａｖａ（Ｒ）プログラムであってもよい。ＭＰＥＧ２トランスポートストリームの詳細はＭＰＥＧ規格書  ＩＳＯ／ＩＥＣ１３８１８１−１に記載されており、本実施の形態では詳細は省略する。ＭＰＥＧ２トランスポートストリームにＪａｖａ（Ｒ）プログラムを埋め込む方法は、ＤＳＭＣＣ方式として、ＭＰＥＧ規格書ＩＳＯ／ＩＥＣ１３８１８１−６に記述されている。ここではＤＳＭＣＣの詳細な説明は省略する。ＤＳＭＣＣ方式は、ＭＰＥＧ２トランスポートストリームのパケットの中に、コンピュータで使用されているディレクトリやファイルで構成されるファイルシステムをエンコードする方法を規定している。
【００３１】
また、アプリ取得プログラム１２１は、ＳＤカード、ＣＤ−ＲＯＭ、ＤＶＤ、ＢｌｕｅＲａｙＤｉｓｃ等に記録されたＪａｖａ（Ｒ）アプリケーションを、第１ＲＡＭ１２５に出力するＪａｖａ（Ｒ）プログラムであってもよい。
【００３２】
また、アプリ取得プログラム１２１は、アプリケーション実行装置１１０内にある第１ＲＯＭ１２６内に記録されたＪａｖａ（Ｒ）アプリケーションを、第１ＲＡＭ１２５に出力するＪａｖａ（Ｒ）プログラムであってもよい。
【００３３】
また、アプリ取得プログラム１２１は、仮想マシン１２２に組み込まれたクラスライブラリであってもよい。
【００３４】
尚、本実施の形態ではアプリ取得プログラム１２１はＪａｖａ（Ｒ）言語で記述されたＪａｖａ（Ｒ）プログラムとするが、同等の機能を有するネイティブ言語で記述されたプログラムや、ハードウェアで実現されていても同様に本発明を実施できる。
【００３５】
仮想マシン１２２は、第１ＲＡＭ１２５に格納されるバイトコードやＪａｖａ（Ｒ）クラスを解釈し実行するＪａｖａ（Ｒ）バーチャルマシンである。Ｊａｖａ（Ｒ）言語で記述されたプログラムは、バイトコードと呼ばれるハードウエアに依存しない中間コードにコンパイルされる。Ｊａｖａ（Ｒ）バーチャルマシンは、このバイトコードを解釈し実行するソフトウェア、またはハードウェアである。
【００３６】
また、一部のＪａｖａ（Ｒ）バーチャルマシンは、バイトコードを第１ＣＰＵ１２４が理解可能な実行形式に翻訳するＪＩＴコンパイラ機能を持つ。また、Ｊａｖａ（Ｒ）バーチャルマシンは、一部もしくは全部のバイトコードを直接実行可能なプロセッサと、プロセッサでは直接実行できないバイトコードを実行するインタプリタから構成される。Ｊａｖａ（Ｒ）言語の詳細は、書籍「Ｊａｖａ（Ｒ）  Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１−１）」等の多くの書籍で解説されている。後ほど、本発明の実施の形態における仮想マシン１２２の構成について詳細を説明する。
【００３７】
ＯＳ１２３は、アプリケーション実行装置１１０にユーザが電源を投入した後、第１ＣＰＵ１２４が起動するＯＳである。ＯＳは、オペレーティングシステムの略であり、Ｌｉｎｕｘ等が一例である。ＯＳ１２３は、他のサブプログラムを平行して実行するカーネル及び、ライブラリで構成される公知の技術の総称であり、詳細な説明は省略する。ＯＳ１２３は仮想マシン１２２をサブプログラムとして実行する。
【００３８】
第１ＣＰＵ１２４は、第１ＲＡＭ１２５に格納されている命令を実行し、第１ＲＡＭ１２５に格納されているデータに対して演算を行う演算装置である。また、第１ＣＰＵ１２４は第２ＣＰＵ１３３との間でセキュアな通信によるデータ通信を行う。
【００３９】
また、第１ＣＰＵ１２４は第２ＣＰＵ１３３へ、暗号化命令、復号化命令、第１ＲＡＭ１２５に格納されているデータ、データのアドレスを第２ＣＰＵに送信する。また、第１ＣＰＵ１２４は、第２ＣＰＵ１３３へ暗号化命令を送信する際は、暗号の強度を示す暗号強度を送信し、さらに送信したデータを第１ＲＡＭ１２５から消去する。また、第１ＣＰＵ１２４は、第２ＣＰＵ１３３からデータを受信し、受信したデータを第１ＲＡＭ１２５に格納する。また、第１ＣＰＵ１２４は、ユーザがアプリケーション実行装置１１０の電源を投入すると、ＯＳ１２３を起動する。また第１ＣＰＵ１２４は第２ＣＰＵ１３３と、復号化命令、暗号化命令、第１ＲＡＭ１２５に格納されているデータ、データのアドレス、暗号強度以外の信号を送受信してもよい。
【００４０】
第１ＲＡＭ１２５は、具体的にはＳＲＡＭ、ＤＲＡＭ等の一次記憶メモリで構成され、第１ＣＰＵ１２４が処理を行う際、一時的にデータを保存するために使用される。本実施の形態では、第１ＲＡＭには、図３に示すクラスファイル３００、図４に示すクラスヘッダ４００、図５に示す暗号化クラスファイル５００、図６に示すクラスブロック６００、図８に示す暗号化クラスブロック８００が格納される。後ほど、クラスヘッダ４００、暗号化クラスファイル５００、クラスブロック６００、暗号化クラスブロック８００の構成について詳細を説明する。
【００４１】
尚、第１ＲＡＭ１２５は、クラスファイル４００、暗号化クラスファイル５００、クラスブロック６００、暗号化クラスブロック８００以外のデータを記憶していてもよい。
【００４２】
第１ＲＯＭ１２６は、具体的にはフラッシュメモリやハードディスク等の不揮発性メモリで構成され、第１ＣＰＵ１２４から指示されたデータやプログラムを記憶する。本実施の形態では、第１ＲＯＭ１２６には、仮想マシン１２２、アプリ取得プログラム１２１が格納されている。尚、第１ＲＯＭ１２６には、仮想マシン１２２、アプリ取得プログラム１２１以外のデータを記憶していてもよい。
【００４３】
以上が、本発明の実施の形態で用いる実行部１２０の構成の詳細である。
【００４４】
次に、図１を参考にして実行部１３０の構成要素についての詳細を説明する。
【００４５】
第２ＲＯＭ１３５は、読み出し専用の不揮発性メモリで、第２ＣＰＵ１３３以外からは第２ＲＯＭ１３５が記憶するデータを読みだすことが出来ないことを保証するものである。図１０に第２ＲＯＭ１３５が記憶するデータの一例を示す。第２ＲＯＭ１３５には、暗号鍵、復号鍵のペアと暗号アルゴリズムの組み合わせを鍵ＩＤで特定することができる鍵テーブル１０００が格納されている。
【００４６】
尚、第２ＲＯＭ１３５は図１０に示した以外のデータを記憶していてもよい。また、鍵テーブル１０００は、暗号鍵、復号鍵、暗号アルゴリズム以外の項目を持っても良い。また、暗号アルゴリズムによっては暗号鍵、復号鍵が同じであってもよい。また、暗号アルゴリズムが１つ場合は、鍵テーブル１０００に暗号アルゴリズムの項目は無くても良い。
【００４７】
第２ＲＡＭ１３４は、具体的にはＤＲＡＭやＳＲＡＭ等で構成され、第２ＣＰＵ１３３が処理を行う際、一時的にデータを保存するために使用され、第２ＣＰＵ１３３以外からは第２ＲＡＭ１３４が記憶するデータを読むことも書くことも出来ないことを保証するものである。第２ＲＡＭ１３４はＣＰＵ１３３に混載されていてもよい。
【００４８】
図１１に第２ＲＡＭ１３４が記憶するデータの一例を示す。第２ＲＡＭ１３４には、アドレスと鍵ＩＤの対応表１１０１が格納されている。アドレスと鍵ＩＤの対応表１１０１におけるアドレスは、第１ＲＡＭ１２５に格納されている各暗号データのアドレスであり、鍵ＩＤは対応するアドレスに格納されている暗号データを暗号化した際に用いた鍵テーブル１０００の鍵ＩＤである。また、第２ＲＡＭ１３４には、暗号化対象のデータ１１０２と、暗号化されたデータである暗号化データ１１０３が格納される。また、データ１１０２は、暗号化データ１１０３を復号化したデータでもあり得る。尚、第２ＲＡＭ１３４には、図１１に示した以外のデータを記憶していてもよい。
【００４９】
第２ＣＰＵ１３３は、第２ＲＡＭ１３４、第２ＲＯＭ１３５に格納されているデータを処理する演算装置である。また、第２ＣＰＵ１３３は第１ＣＰＵ１２４とセキュアな通信を行い、復号化命令、暗号化命令、第１ＲＡＭ１２５に格納されているデータ、データのアドレスを受信し、受信したデータを第２ＲＡＭ１３４に格納し、復号処理部１３１または暗号処理部１３２に受信したデータのアドレスと復号化命令または暗号化命令を送信する。
【００５０】
また、第２ＣＰＵ１３３は、第１ＣＰＵ１２４から暗号化命令を受信する際は、暗号強度を受信し、暗号処理部１３２に受信した暗号強度を送信する。  
【００５１】
また、第２ＣＰＵ１３３は、第２ＲＡＭ１３４に格納されているデータを第１ＣＰＵ１２４に送信し、第１ＲＡＭ１２５に格納させる。また第２ＣＰＵ１３３は第１ＣＰＵ１２４と、復号化命令、暗号化命令、第１ＲＡＭ１２５に格納されているデータ、データのアドレス、暗号強度以外の信号を送受信してもよい。
【００５２】
復号処理部１３１は、第２ＲＡＭ１３４に格納されている暗号化データ１１０３を復号化し、復号化したデータ１１０２を第２ＲＡＭ１３４に格納するモジュールである。復号処理部１３１は、第２ＣＰＵ１３３から復号化命令とアドレスを受信し、アドレスと鍵ＩＤの対応表１１０１から受信したアドレスに対応する鍵ＩＤを特定し、特定した鍵ＩＤと鍵テーブル１０００から復号化に用いる復号鍵を特定し、特定した復号鍵と暗号アルゴリズムを用いて暗号化データ１１０３の復号化を行い、復号化したデータ１１０２を第２ＲＡＭ１３４に格納する。尚、復号処理部１３１は、ソフトウェア、ハードウェアどちらであっても良い。
【００５３】
暗号処理部１３２は、第２ＣＰＵ１３３から暗号化命令とアドレスと暗号強度を受信し、鍵テーブル１０００から暗号化に用いる鍵ＩＤを選択し、データ１１０２の暗号化を行い、暗号化した暗号化データ１１０３を第２ＲＡＭ１３４へ格納する。また、暗号処理部１３２は、暗号化を完了した際、アドレスと鍵ＩＤの対応表１１０１に、受信したアドレスと暗号に用いた鍵ＩＤを追加する。尚、暗号処理部１３２は、ソフトウェア、ハードウェアどちらであっても良い。
【００５４】
以上が、本実施の形態で用いる安全な実行部１３０の構成についての詳細である。尚、安全な実行部１３０はスマートカードやＩＣカードのように、アプリケーション実行装置１１０から取り外し可能な装置であってもよい。スマートカード、ＩＣカードはカード内部にＣＰＵやメモリ、セキュリティ回路を含む公知の技術であり、詳細な説明を省略する。
【００５５】
次に、図４を参考にして、本実施の形態におけるクラスヘッダ４００の構成について詳細を説明する。
【００５６】
クラスヘッダ４００は、仮想マシン１２２の実行中に使われるクラスファイル３００毎に作成され、対応付けられるデータであって、暗号強度ヘッダ４０１と分割情報４０２から構成される。
【００５７】
暗号強度ヘッダ４０１は、クラスファイル３００を暗号化する際の、暗号強度を示す。
【００５８】
分割情報４０２は、クラスファイル３００を分割した際に、分割されたデータを元に戻すために必要なデータである。本実施の形態におけるクラスファイルの分割情報４０２は、３０１〜３１６の項目または３０１〜３１６をグループ化した項目と、３０１〜３１６のデータをさらに分割し、分割した後の各データの先頭アドレスを分割前の順番に並べた値を保持する。図４の例では、ｍａｇｉｃ＿ｎｕｍｂｅｒ３０１とｍｉｎｏｒ＿ｖｅｒｓｉｏｎ３０２とｍａｊｏｒ＿ｖｅｒｓｉｏｎ３０３はグループ化され、グループ化されたデータの先頭アドレスは０ｘ４３００１２ｄである。ｆｉｅｌｄｓ３１２は、他の項目とグループ化はされないが２つに分割され、分割された１つ目の先頭アドレスは０ｘ０５ｄ８ｃｂ３２１であり、２つ目の先頭アドレスは０ｘ０５ｅ０ａｂｃｄとなる。
【００５９】
尚、クラスファイルの分割情報４０２の形式は、後に述べるメソッドの分割情報７０２にも適用される。
【００６０】
本実施の形態に示すように、クラスファイルまたは第１ＲＡＭ１２５に格納される他のデータを分割し、分割したそれぞれのデータに異なる暗号鍵を用いて暗号化を施すことで、暗号強度を高めることができる。また、分割・暗号化されたデータを必要なときに必要な分だけ復号化することで、重要なデータが復号化された状態で第１ＲＡＭに格納される時間を削減することが可能になる。
【００６１】
以上が、本実施の形態におけるクラスヘッダ４００の構成の詳細説明である。
【００６２】
次に、図５を参考にして本実施の形態における暗号化クラスファイル５００の構成について説明をする。
【００６３】
暗号化クラスファイル５００は、クラスファイル３００を暗号化したデータあって、本実施の形態における暗号化クラスファイル５００は、クラスファイル３０１〜３１６をそれぞれ分割し、暗号化したデータ５０１〜５１５から構成される。尚、暗号化クラスファイル５００は、クラスファイル３００を任意の単位で分割し、暗号化したデータから構成されてもよい。また、クラスファイル３００を分割する単位は、Ｊａｖａ（Ｒ）仮想マシンが行うベリファイの各パスで使われる情報毎であってもよい。ベリファイについての詳細は書籍「Ｊａｖａ（Ｒ）  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ（ＩＳＢＮ  ０−２０１−６３４５１−Ｘ）」で定義されている。ここでは詳細な説明は省略する。以上が本実施の形態における暗号クラスファイル５００の構成である。
【００６４】
次に、図６と図７を参考にして本実施の形態におけるクラスブロック６００の構成について説明する。
【００６５】
クラスブロック６００は、クラスファイル３００を仮想マシン１２２の内部形式に変換したデータであり、クラスヘッダ４００、クラス情報６０１、メソッド６１０から構成される。
【００６６】
クラスヘッダ４００は、クラスブロック６００の元になったクラスに対応していたクラスヘッダと同じデータである。またクラスヘッダ６００がもつ分割情報４０２は、クラス情報６０１とメソッド６１０を分割した際の情報を保持する。
【００６７】
クラス情報６０１は、クラスファイル３００の構成要素３０１〜３１２、３１４、３１５、３１６を、仮想マシン１２２の内部形式に変換したデータである。
【００６８】
メソッド６１０は、ｍｅｔｈｏｄｓ３１４を仮想マシン１２２の内部形式に変換し、付加データを加えたデータであり、メソッドヘッダ６１１とコード６１２から構成される。また、メソッド６１０は、１つのクラスブロック６００に対し、ｍｅｔｈｏｄｓ＿ｃｏｕｎｔｓ３１３の数だけ存在する。
【００６９】
次にメソッドヘッダ６１１の構成を、図７を用いて説明する。メソッドヘッダ６１１は、暗号強度ヘッダ７０１、分割情報７０２、ＪＩＴヘッダ７０３、最適化ヘッダ７０４、メソッド情報７０５から構成される。暗号強度ヘッダ７０１には、コード６１２を暗号化する際の暗号強度が記されている。分割情報７０２は、コード６１２を分割した際の、分割後の各データの第１ＲＡＭ１２５におけるアドレスを保持している。分割情報７０２は、図４に示すクラスファイルの分割情報４０２と同様な形式で情報を保持している。分割情報７０２の場合、図４における項目は、メソッド名であったり、コード６１２を分岐の含まれない一連の命令群で分割した後の各部分に割り当てた番号であったり、コード６１２が含む命令に割り振った番号であっても良い。また、分割情報４０２は、その他の形式で分割情報を保持しても良い。
【００７０】
ＪＩＴヘッダ７０３は、コード６１２に対してＪＩＴコンパイラを行うか否か、コード６１２がＪＩＴコンパイル済かどうかを示すの情報を保持している。
【００７１】
最適化ヘッダ７０４には、コード６１２に対して最適化を行うか否か、現在の最適化のレベル、目標となる最適化レベルが記されている。また、最適化ヘッダには、実行速度やコードサイズなど、実施する最適化の種類または割合も記されている。
【００７２】
メソッド情報７０５は、ｍｅｔｈｏｄｓ３１４に含まれるバイトコード以外の情報を、仮想マシン１２２の内部形式に変換したデータである。
【００７３】
コード６１２は、ｍｅｔｈｏｄｓ３１４のＣｏｄｅ属性であるバイトコード、またはバイトコードを第１ＣＰＵ１２４が解釈実行できる形式に変換したネイティブコード、またはネイティブコードに最適化処理を施した最適化ネイティブコードの何れかを保持する。
【００７４】
以上が、本実施の形態におけるクラスブロック６００の構成である。
【００７５】
次に、図８を参考にして本実施の形態における暗号化クラスブロック８００の構成について説明をする。
【００７６】
暗号化クラスブロック８００は、クラスブロック６００を暗号化したデータであり、暗号化クラスヘッダ８０１、暗号化クラス情報８０２、暗号化メソッド８１０から構成される。暗号化クラスヘッダ８０１は、クラスヘッダ４００暗号化したデータある。暗号化クラス情報８０２は、クラス情報６０１を分割し、暗号化したデータである。暗号化メソッド８１０は、メソッド６１０を分割し、暗号化したデータで、暗号化メソッドヘッダ８１１と暗号化コード８１２から構成される。暗号化メソッドヘッダ８１１は、メソッドヘッダ６１１を分割し、暗号化したデータであり、暗号化コード８１２は、コードブロック６１２を分割し、分割後の各コードを暗号化したデータである。
【００７７】
以上が、本実施の形態における暗号化クラスファイル８００の構成の説明である。
【００７８】
次に、図９を参考にして、本実施の形態における仮想マシン１２２の構成の詳細を説明する。
【００７９】
仮想マシン１２２は、クラスローダ２０１、ベリファイヤ２０２、バイトコードインタプリタ２０３、Ｊａｖａ（Ｒ）ヒープ管理部２０４（ヒープ管理部２０４と称す）、Ｊａｖａ（Ｒ）ネイティブライブラリ２０５（ネイティブライブラリ２０５と称す）、ＪＩＴコンパイラ２０６で構成されている。
【００８０】
クラスローダ２０１は、バイトコードインタプリタ２０３からクラスロード命令を受信し、第１ＲＡＭ１２５に格納されているクラスファイル３００から仮想マシン１２２の内部形式であるクラスブロック６００を作成し、第１ＲＡＭ１２５に格納する。また、クラスブロック６００を分割し、クラスブロック６００の暗号化命令を第１ＣＰＵに送信する。また、クラスローダ２０１は、クラスアンロード処理も行う。クラスアンロード処理は、実行が終了し不要になったクラスを仮想マシン１２２から取り除く処理である。
【００８１】
ベリファイヤ２０２は、第１ＲＡＭ１２５にあるクラスブロック６００を入力とし、クラスのデータ形式の不備や、クラスに含まれるバイトコードの安全性を判定する。バイトコードの安全性の検査方法は、Ｊａｖａ（Ｒ）  Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎで定義されているため詳細な説明は省略する。
【００８２】
バイトコードインタプリタ２０３は、コード６１２解釈実行するモジュールである。バイトコードインタプリタ２０３は、暗号化メソッド８１０の復号化命令を出力し、復号化されたメソッド６１０のコード６１２の解釈実行や、第１ＣＰＵへのネイティブコードの実行命令出力を行う。また、バイトコードインタプリタ２０３は、バイトコードのＪＩＴコンパイル命令をＪＩＴコンパイラ２０６に出力したりし、ネイティブコードの最適化を最適化部２０７に出力したりする。
【００８３】
ヒープ管理部２０４は、Ｊａｖａ（Ｒ）アプリケーションが使用するワーキングメモリの確保を行う。ワーキングメモリは第１ＲＡＭ１２５内に確保される。また、ヒープ管理部２０４は、ガベージコレクションも行う。ガベージコレクションは、アプリケーション実行において不要になったワーキングメモリを開放し、他の用途に再利用できるようにする公知の技術であり、詳細な説明は省略する。
【００８４】
ネイティブライブラリ２０５は、Ｊａｖａ（Ｒ）アプリケーションから呼び出されるライブラリで、ＯＳ１２３や、アプリケーション実行装置２１０が備える図１には記載されていないハードウェア、サブプログラム等で提供される機能をＪａｖａ（Ｒ）アプリケーションへ提供する。
【００８５】
ＪＩＴコンパイラ２０６は、バイトコードから第１ＣＰＵが解釈実行可能なネイティブコードを生成するモジュールであり、バイトコードインタプリタ２０３からＪＩＴコンパイル命令を受信し、バイトコードからネイティブコードを作成し第１ＲＡＭ１２５に格納する。また、ＪＩＴコンパイラ２０６は、最適化ネイティブコードの暗号化命令を第１ＣＰＵ１２４に送信する。
【００８６】
最適化部２０７は、ネイティブコードの最適化処理を行うモジュールであって、バイトコードインタプリタ２０３から最適化命令を受信し、ネイティブコードを最適化し、第１ＲＡＭ１２５に格納する。また、最適化部２０７は、最適化されたネイティブコードの暗号化命令を第１ＣＰＵ１２４に送信する。
【００８７】
以上が、本実施の形態における仮想マシン１２２の構成の詳細である。
【００８８】
次に、図１２を参考にして本実施の形態におけるアプリケーション実行装置１１０の動作手順について説明する。
【００８９】
まず、ユーザによりアプリケーション実行装置１１０の電源が投入される（Ｓ１０１）。次に第１ＣＰＵ１２４が、ＯＳ１２３を起動する（Ｓ１０２）。
【００９０】
次に、第１ＣＰＵ１２４が仮想マシン１２２起動する（Ｓ１０３）。
【００９１】
次に、仮想マシン１２２が、アプリ取得プログラム１２１を起動し、アプリ取得処理を行う。アプリ取得処理では、ダウンロード可能なプログラム１００を入手し、クラスファイル３００を取り出して暗号化し、暗号化クラスファイル５００を第１ＲＡＭ１２５に作成する（Ｓ１０４）。アプリ取得処理については、後ほど詳細を説明する。
【００９２】
次に、クラスローダ２０１がクラスロード処理を実行する。クラスロード処理では、暗号化クラスファイル５００を復号化し、クラスファイル３００からクラスブロック６００を生成し、さらに暗号化を行い、暗号化クラスブロック８００を第１ＲＡＭに格納する。クラスロード処理については、後ほど詳細を説明する。
【００９３】
次に、ベリファイヤ２０２が、ベリファイ処理を実行する。ベリファイ処理では、暗号化クラスブロック８００を復号化して得たクラスブロック６００をもとにクラスの正当性を確認する。ベリファイ処理については、後ほど詳細を説明する。
【００９４】
次に、バイトコードインタプリタ２０３がコード６１２の実行をするインタプリタ処理を行う。インタプリタ処理では、暗号化コード８１２を復号化して得たコードを実行し、実行し終わったらコード６１２の暗号化命令を送信する。また必要ならばＪＩＴコンパイラ２０６へのＪＩＴコンパイル命令送信や最適化部２０７へ最適化命令の送信を行う。インタプリタ処理については、後ほど詳細を説明する。
【００９５】
尚、アプリ取得プログラム１２１が仮想マシン１２２へ組み込まれたクラスライブラリである場合は、ステップＳ１０４とステップＳ１０５の動作をまとめて、実行してもよい。またその際、暗号化、復号化の中間処理を省略してもよい。
【００９６】
以上が、本実施の形態におけるアプリケーション実行装置１１０の動作手順である。
【００９７】
次に、図１３を参考にして、本実施の形態におけるアプリ取得処理の動作手順について説明をする。
【００９８】
まず、アプリ取得プログラム１２１が、ダウンロード可能なプログラム１００を取得し、ダウンロード可能なプログラム１００のクラスファイル３００を第１ＲＡＭ１２５へ格納する（Ｓ２０１）。また、クラスヘッダ４００もダウンロードした場合は、クラスヘッダ４００を第１ＲＡＭ１２５に格納する。このときの第１ＲＡＭ１２５に格納されているデータの一例を図１４に示す。
【００９９】
次に、クラスファイル３００とクラスヘッダ４００が既に暗号化されている場合は、暗号化命令を送信せず、アプリ取得処理を終了する（Ｓ２０２）。
【０１００】
次に、アプリ取得プログラム１２１が、クラスファイル３００を分割する。分割した情報を分割情報４０２に記録する（Ｓ２０３）。ここで、分割するデータの単位は、クラスファイル３００の構成要素である３０１〜３１６を任意に組み合わせたもので良い。つまり３０１〜３１６をそれぞれ暗号化しても良いし、まとめて暗号化しても良い。
【０１０１】
次に、アプリ取得プログラム１２１がクラスファイル３００とクラスヘッダ４００のアドレスと暗号化強度と暗号化命令を第１ＣＰＵに送信し、暗号処理部１３２が、第１ＣＰＵ経由で第２ＣＰＵから暗号化命令を受信し、暗号処理を行い、暗号化クラスファイル５００と暗号化クラスヘッダ８０１の作成を行う。また、第１ＣＰＵは、クラスファイル３００とクラスヘッダ４００の削除を行う（Ｓ２０３）。暗号処理の詳細は、後で説明する。このときの第１ＲＡＭ１２５に格納されているデータの一例を図１５に示す。
【０１０２】
以上が、本実施の形態におけるアプリ取得処理の動作手順である。
【０１０３】
次に、図１８を参照にして本発明の実施の形態におけるクラスロード処理の動作手順を説明する。
【０１０４】
まず、クラスローダ２０１が、バイトコードインタプリタ２０３からクラスロード命令を受信する（Ｓ３０１）。
【０１０５】
次にクラスローダ２０１が暗号化クラスヘッダ８０１のアドレスと復号化命令を第１ＣＰＵ１２４に送信する（Ｓ３０２）。
【０１０６】
次に、復号処理部１３１が第１ＣＰＵ１２４経由で第２ＣＰＵ１３３から復号化命令を受信し、復号処理を行い、クラスヘッダ４００の作成を行う（Ｓ３０３）。復号処理については後に詳細を説明する。
【０１０７】
次に、クラスローダ２０１は、クラスヘッダ４００の情報を元に暗号化クラスファイル５００のアドレスのアドレスと復号化命令を第１ＣＰＵに送信する。（Ｓ３０４）。ここで、暗号化クラスファイル５００が分割されている場合は、分割された各データのアドレスも送信する。
【０１０８】
次に、復号処理部１３１は、受信したアドレスに格納されているデータの復号化を行い、クラスファイル３００を作成する（Ｓ３０５）。クラスファイル３００が分割されている場合は、クラスローダ２０１が分割されているデータを統合してクラスファイル３００を作成する。
【０１０９】
次に、クラスローダ２０１は、クラスファイル３００とクラスヘッダ４００からクラスブロック６００を作成し、クラスファイル３００を削除する（Ｓ３０６）。この時点での第１ＲＡＭ１２５に格納されているデータの一例を図１６に示す。
【０１１０】
次に、クラスローダ２０１が、クラスブロック６００を分割し、分割情報４０２に分割情報を書き込む（Ｓ３０７）。
【０１１１】
次に、クラスローダ２０１が、分割したクラスブロック６００の各アドレスと暗号化命令を第１ＣＰＵに送信し、暗号処理部１３２が、第１ＣＰＵ経由で第２ＣＰＵからアドレスと暗号化命令を受信し、暗号処理を行い、暗号化クラスブロック８００の作成を行う。また、第１ＣＰＵがクラスブロック６００の削除をする。（Ｓ３０８）。この時点での第１ＲＡＭ１２５に格納されているデータの一例を図１７に示す。
【０１１２】
以上が、本実施の形態におけるクラスロード処理の動作手順である。
【０１１３】
次に、図１９を参考にして、本実施の形態におけるベリファイ処理の動作手順について説明をする。
【０１１４】
まず、ベリファイヤ２０２が、バイトコードインタプリタ２０３からベリファイ命令を受信する（Ｓ４０１）。
【０１１５】
次に、ベリファイヤ２０２が、ベリファイに必要なクラスファイル３００の構成要素３０１〜３１６のすべて、または一部を特定する（Ｓ４０２）。
【０１１６】
次に、ベリファイヤ２０２は、暗号化クラスヘッダ８０１の復号化命令を第１ＣＰＵに送信し、復号処理部１３１がクラスヘッダ４００を作成する（Ｓ４０３）。
【０１１７】
次に、ベリファイヤ２０２は、ステップＳ４０２で特定したデータに対応する暗号化クラスブロック８００の構成要素のアドレスと復号化命令を第１ＣＰＵ１２４に送信し、復号処理部１３１が第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと復号化命令を受信し、復号処理を行い、ステップＳ４０２で特定されたベリファイに必要なデータの作成を行う（Ｓ４０４）。
【０１１８】
次に、ベリファイヤ２０２が、ステップＳ４０４で作成されたベリファイに必要な情報に対し、ベリファイを実行する（Ｓ４０５）。
【０１１９】
次に、ベリファイヤ２０２が、ベリファイを継続するためにさらにクラスファイル３００の構成要素または他のクラスの情報が必要かどうかを判定する。必要である場合はステップＳ４０４の処理を実行する。さらなる情報が必要ない場合は、ベリファイを継続しベリファイを完了させる（Ｓ４０６）。
【０１２０】
ここで、クラスファイル３００の構成要素または他のクラスの情報がさらに必要な場合の一例を説明する。例えば、ベリファイヤが確認する項目は２つあり、それぞれ項目Ａ、項目Ｂとする。項目Ａは、クラスファイル３００内の情報のみで確認できる項目であり、項目Ｂは確認のため他のクラスブロックの情報も必要とする項目であるとする。まず、ベリファイヤは項目Ａを確認するためにクラスファイル３００の構成要素を復号化して項目Ａを確認する。この時点では、他のクラスブロックの情報は必要ない。次に、ベリファイヤは項目Ｂを確認するが、その際は他のクラスブロックの情報が必要となる。このように、確認する項目によって必要な情報は異なるため、必要な情報を必要なときのみ復号化することで、復号化された情報がメモリ上に置かれる時間を削減することが可能となる。
【０１２１】
次に、ベリファイヤ２０２が、クラスブロック６００の分割を行い、分割情報４０２に分割情報を書き込む（Ｓ４０７）。
【０１２２】
次に、ベリファイヤ２０２が、クラスブロック６００とクラスヘッダ４００のアドレスと暗号化命令を第１ＣＰＵ１２４へ送信し、暗号処理部１３２が、第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと暗号化命令を受信し、暗号処理を行い、暗号化クラスブロック８００の作成をする。また、第１ＣＰＵがクラスブロック６００を消去する（Ｓ４０８）。
【０１２３】
以上が、本実施の形態におけるベリファイ処理の動作手順詳細である。
【０１２４】
次に、図２０を参考にして、本実施の形態におけるインタプリタ処理の動作手順について説明をする。
【０１２５】
まず、バイトコードインタプリタ２０３が実行するメソッドを特定する（Ｓ５０１）。
【０１２６】
次に、バイトコードインタプリタ２０３が、暗号化メソッドヘッダ８１１のアドレスと復号化命令を第１ＣＰＵ１２４に送信し、復号処理部が第２ＣＰＵ１３３経由で復号化命令とアドレスを受信し、メソッドヘッダ６１１の作成を行う（Ｓ５０２）。
【０１２７】
次に、バイトコードインタプリタ２０３は、コード６１２がＪＩＴコンパイル済であるかどうかをＪＩＴヘッダ７０３の値により判定する（Ｓ５０３）。ＪＩＴコンパイル済みである場合は、ステップＳ５０４へ進み、最適化処理を行う。最適化処理については、後ほど詳細を説明する。ＪＩＴコンパイル済でない場合は、ステップＳ５０５へ進む。
【０１２８】
次に、バイトコードインタプリタ２０３は、コード６１２に対してＪＩＴコンパイルを行うかどうかをＪＩＴヘッダ７０３の値により判定する（Ｓ５０５）。ＪＩＴコンパイルを行う場合は、ステップＳ５０６へ進みＪＩＴコンパイル処理を行う。ＪＩＴコンパイル処理については、後ほど詳細を説明する。ＪＩＴコンパイルを行わない場合は、ステップＳ５０７へ進む。
【０１２９】
次に、バイトコードインタプリタ２０３が、分割情報７０２をもとに、暗号化コード８１２を分割した各部分のアドレスの一部と、復号化命令を第１ＣＰＵ１２４へ送信する。また、復号処理部１３１が第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと復号化命令を受信し、復号処理を行い、コード６１２の一部を作成する（Ｓ５０７）。
【０１３０】
次に、バイトコードインタプリタ２０３が、ステップＳ５０７で復号化されたコード６１２の一部を解釈実行する。コード６１２がバイトコードならば、バイトコードインタプリタが解釈実行し、ＪＩＴコンパイルまたは最適化処理されたネイティブコードまたはネイティブライブラリ２０５であるならば、第１ＣＰＵに実行させる（Ｓ５０８）。
【０１３１】
次に、ステップＳ５０８の実行中、さらにコード６１２の復号化が必要である場合は、分割情報７０２から復号化が必要なデータのアドレスを読み取り、ステップＳ５０７に移る（Ｓ５０９）。ここで、さらにコード６１２の復号化が必要な場合とは、例えば、暗号化コード８１２の復号化された部分を実行し終わり、次に、残りの暗号化されている部分の実行が必要になる場合などである。
【０１３２】
次に、コード６１２の実行が終わると、バイトコードインタプリタ２０３は、コード６１２の分割または結合を行い、分割または結合後のデータのアドレスを分割情報７０２に書き込む（Ｓ５１０）。尚、ここでの分割または結合の度合は、暗号強度ヘッダやコード６１２の実行時間などに応じて決定してもよい。
【０１３３】
次に、バイトコードインタプリタ２０３は、分割したコード６１２の各部分のアドレスと暗号強度と暗号化命令を第１ＣＰＵ１２４へ送信する。また、暗号処理部１３２は、第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと暗号化命令を受信し、暗号処理を行い、暗号化コード８１２を作成する。また、第１ＣＰＵ１２４は、コード６１２を削除する（Ｓ５１１）。尚、このときにメソッドヘッダ６１１を暗号化し、暗号化メソッドヘッダ８１１を作成してもよい。
【０１３４】
以上が、本実施の形態におけるインタプリタ処理の動作手順である。
【０１３５】
次に、図２１を参考にして、本実施の形態におけるＪＩＴコンパイル処理の動作手順について説明をする。
【０１３６】
まず、ＪＩＴコンパイラ２０６が、バイトコードインタプリタ２０３から、ＪＩＴコンパイル対象となるコード６１２とメソッドヘッダ６１１とＪＩＴコンパイル命令を受信する（Ｓ６０１）。この時の、第１ＲＡＭ１２５に格納されているデータの一例を図２２に示す。この時のコード６１２は、バイトコードを暗号化した暗号化バイトコード２２０１である。
【０１３７】
次に、ＪＩＴコンパイラ２０６が、分割情報４０２を元に各暗号化バイトコード２２０１のアドレスと復号化命令を第１ＣＰＵへ送信する（Ｓ６０２）。
【０１３８】
次に、復号処理部１３１が、第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと復号化命令を受信し、復号処理を行い、コード６１２またはその一部の作成を行う（Ｓ６０３）。この時の、第１ＲＡＭ１２５に格納されているデータの一例を図２３に示す。この時のコード６１２は、バイトコードインタプリタ２０３が解釈可能なバイトコード２３０１である。
【０１３９】
次に、ＪＩＴコンパイラ２０６が、バイトコード２３０１を変換して中間コードを作成し、中間コードからネイティブコードを作成し、さらにバイトコード２３０１を削除する（Ｓ６０４）。また、暗号化バイトコード２２０１も削除しても良い。この時の、第１ＲＡＭ１２５に格納されているデータの一例を図２４に示す。このときのコード６１２は、ネイティブコード２４０２である。また、第１ＲＡＭ１２５には、中間コード２４０１も存在している。
【０１４０】
次に、ＪＩＴコンパイラ２０６が、ネイティブコード２４０２と中間コード２４０１を分割し、分割した情報を分割情報７０２に書き込む（Ｓ６０５）。
【０１４１】
次に、ＪＩＴコンパイラ２０６が、分割されたネイティブコード２４０２と中間コード２４０１の各部分のアドレスと暗号化命令と暗号強度を第１ＣＰＵ１２４へ送信し、暗号処理部１３２が暗号処理を行う。また、第１ＣＰＵ１２４が、ネイティブコード２４０２と中間コード２４０１を消去する（Ｓ６０６）。この時の、第１ＲＡＭ１２５に格納されているデータの一例を図２５に示す。この時の暗号化コード８１２は、ネイティブコードを暗号化した暗号化ネイティブコード２５０２である。また、中間コードを暗号化した暗号化中間コード２５０１も存在している。
【０１４２】
尚、ＪＩＴコンパイルを行うタイミングは、ＣＰＵの使用率が低いときなど、任意のタイミングでよい。また、ＪＩＴコンパイラ２０６は、中間コード２４０１を生成せず、直接ネイティブコード２４０２を生成してもよい。
【０１４３】
以上が、本実施の形態におけるＪＩＴコンパイル処理の動作手順について説明である。
【０１４４】
次に、図２６を参考にして、本実施の形態における最適化処理の動作手順について説明をする。
【０１４５】
まず、バイトコードインタプリタ２０３から、メソッドヘッダ６１１と最適化対象の暗号化コード８１２と最適化命令を受信する（Ｓ７０１）。このときの第１ＲＡＭ１２５に格納されているデータの一例を図２７に示す。このとき、暗号化コード８１２は、ネイティブコードを暗号化した暗号化ネイティブコード２５０２である。また、中間コードを暗号化した暗号中間コード２５０１も存在している。
【０１４６】
次に、最適化部２０７は、最適化ヘッダ７０４から、現在の最適化レベルと目標最適化レベルを読み込み、最適化を行う必要があるかどうかの判定を行う。また、実行する最適化のレベルを設定する。最適化を行う必要がなければ、最適化処理を終了する。最適化の必要があればステップＳ７０３へ進む（Ｓ７０２）。
【０１４７】
次に、最適化部２０７は、ステップＳ７０２で設定されたレベルの最適化を実行するに必要なネイティブコードまたは中間コードを特定し、分割情報７０２から分割されている暗号化ネイティブコード２５０２または暗号化中間コード２５０１の各部分のアドレスと復号化命令を第１ＣＰＵ１２４へ送信する。さらに、復号処理部１３１は、第１ＣＰＵ１２４経由で第２ＣＰＵ１３３からアドレスと復号化命令を受信し、復号処理を行い、ネイティブコードまたは中間コードを復号化する（Ｓ７０３）。このときの第１ＲＡＭ１２５に格納されているデータの一例を図２８に示す。このとき、ネイティブコード２８０２または中間コード２８０１が存在している。
【０１４８】
次に、最適化部２０７は、ネイティブコード２８０２または中間コード２８０１に対しステップＳ７０２で設定された最適化レベルでの最適化を行い、図２９に示す最適化ネイティブコード２９０２または最適化中間コード２９０１を作成し、中間コード２８０１またはネイティブコード２８０２を削除する（Ｓ７０４）。ここで行う最適化手法は、従来のコンパイラ技術を用いることで実現する。コンパイラ技術については公知技術であるため、ここでの説明は省略する。また、最適化には、実行速度の最適化、コードサイズの最適化などの種類があるが、どの最適化を行うかは最適化ヘッダに記されている種類を用いる。最適化のこのときの第１ＲＡＭ１２５に格納されているデータの一例を図２９に示す。このとき、コード６１２は、最適化ネイティブコード２９０２となる。また、最適化中間コード２９０１が存在している。
【０１４９】
次に、最適化部２０７は、最適化ネイティブコード２９０２または最適化中間コード２９０１を分割し、分割後のデータのアドレスを分割情報７０２に書き込む（Ｓ７０５）。
【０１５０】
次に、最適化部２０７は、分割した最適化ネイティブコード２９０２または最適化中間コード２９０１の各要素のアドレスと暗号化命令と暗号強度を第１ＣＰＵ１２４へ送信する。暗号処理部１３２は、第１ＣＰＵ１２４経由で第２ＣＰＵ１３３から分割された最適化ネイティブコード２９０２または最適化中間コード２９０１の各部分のアドレスと暗号化命令を受信し、暗号処理を行い、図３０に示す暗号化最適化ネイティブコード３００２または暗号化最適化中間コード３００１を作成する。また第１ＣＰＵ１２４は、最適化ネイティブコード２９０２または最適化中間コード２９０１の削除を行う（Ｓ７０６）。このときの第１ＲＡＭ１２５に格納されているデータの一例を図３０に示す。このとき、暗号化コード８１２は、暗号化最適化ネイティブコード３００２となる。また、最適化中間コードを暗号化した暗号化最適化中間コード３００１も存在している。
【０１５１】
尚、最適化を行うタイミングは、ＣＰＵの使用率が低いときや、メソッドの使用頻度が低い間や、任意のタイミングでよい。また、ＪＩＴコンパイラ２０６が中間コード２４０１を生成しない場合は、最適化中間コード２９０１、暗号化最適化中間コード３００１は第１ＲＡＭ１２５に存在しなくてもよい。
【０１５２】
以上が、本実施の形態における最適化処理の動作手順について説明である。
【０１５３】
次に、図３１を参考にして、本実施の形態における暗号化処理の動作手順の説明をする。
【０１５４】
まず、第２ＣＰＵ１３３が第１ＣＰＵ１２４から、暗号化命令または復号化命令と、第１ＲＡＭ１２５に格納されているデータとデータのアドレスを受信し、受信したデータを受け取る（Ｓ８０１）。
【０１５５】
次に、第２ＣＰＵ１３３は、受信したデータ第２ＲＡＭ１３４に格納し、暗号処理部１３２に受信したデータのアドレスと暗号強度と暗号化命令を送信する（Ｓ８０２）。ここで、第２ＣＰＵ１３３が第２ＲＡＭ１３４に格納したデータは、データ１１０２である。
【０１５６】
次に、第１ＣＰＵ１２４が、暗号対象となるデータを第１ＲＡＭ１２５から削除する（Ｓ８０３）。
【０１５７】
次に、暗号処理部１３２が、鍵テーブル５０１から鍵ＩＤを選択する（Ｓ８０４）。ここで鍵ＩＤを選択するアルゴリズムは、受信した暗号強度レベル、暗号対象のデータの重要度、使用頻度、暗号化命令発信プログラムが決定した暗号化レベル、暗号化命令発信プログラムの処理時間、実行時の時刻、ランダムな値などをもとに、鍵ＩＤを選択するなどの任意の方法で良い。また、暗号処理部１３２は、暗号鍵と復号鍵を新たに生成し、生成した鍵を鍵テーブルに登録し、生成した鍵に割り振られた鍵ＩＤを用いても良い。
【０１５８】
次に、Ｓ８０４で選択した鍵ＩＤに対応する暗号鍵を使い、データ１１０２暗号化し、暗号化データ１１０３を作成（Ｓ８０５）。
【０１５９】
次に、第２ＣＰＵ１３３が、第２ＲＡＭに格納されている暗号化データ１１０３を第１ＣＰＵへ送信し、第１ＣＰＵ１２４は受信した暗号化データ１１０３を第１ＲＡＭ１２５へ格納する。
【０１６０】
次に、暗号処理部１３２が、暗号化したデータを格納する第１ＲＡＭ１２５上のアドレスと暗号に用いた鍵ＩＤを、アドレスと鍵ＩＤの対応表１１０１に書きこむ（Ｓ８０７）。尚、暗号対象となるデータの削除ステップＳ８０３は任意のタイミングに実行してもよく、暗号処理部１３２以外のモジュールが行っても良い。
【０１６１】
以上が、本実施の形態における暗号化処理の動作手順の説明である。
【０１６２】
次に、図３２を参考にして、本実施の形態における復号化処理の動作手順の説明をする。
【０１６３】
まず、第２ＣＰＵ１３３が第１ＣＰＵ１２４から、復号化命令と復号化対象のデータとデータのアドレスを受信し、受信したデータを第２ＲＡＭ１３４に格納する。このとき格納されるデータが暗号化データ１１０３である。また、第２ＣＰＵ１３３が復号処理部１３１に、復号化命令とデータのアドレスを送信する（Ｓ９０１）。
【０１６４】
次に、復号処理部１３１が、ステップＳ９０１で受信したアドレスをもとに、アドレスと鍵ＩＤの対応表１１０１から暗号化に用いた鍵ＩＤを特定する。また、特定した鍵ＩＤをもとに、鍵テーブル１０００から復号鍵を特定する（Ｓ９０２）。
【０１６５】
次に、復号処理部１３１は、暗号化データ１１０３を復号化し、復号したデータ１１０２を第２ＲＡＭ１３４に格納する。また、復号処理部１３１は、アドレスと鍵ＩＤの対応表から、ステップＳ９０１で受信したアドレスの行を削除する。（Ｓ９０４）。
【０１６６】
以上が、本発明の実施の形態における復号化処理の動作手順の説明である。
【０１６７】
尚、本発明の実施の形態において実施される、第１ＲＡＭ１２５に格納されているデータの暗号化処理、復号化処理は、任意の組み合わせで省略してもよい。
【０１６８】
暗号化処理、復号化処理を省略することで、実行速度の向上や使用メモリの削減を実現することができる。例えば、アプリ取得処理Ｓ１０４とクラスロード処理Ｓ１０５の間で、クラスファイル３００の暗号化と復号化を省略してもよい。また、クラスロード処理Ｓ１０５とベリファイ処理Ｓ１０６の間でクラスブロック６００とその構成要素の暗号化、復号化を省略してもよい。また、ベリファイ処理Ｓ１０６とインタプリタ処理Ｓ１０７の間で、クラスブロック６００とその構成要素の暗号化、復号化を省略してもよい。また、ＪＩＴコンパイル処理Ｓ５０６と最適化処理Ｓ５０４の間で、クラスブロック６００とその構成要素の暗号化、復号化を省略してもよい。また、最適化処理Ｓ５０４と暗号コードの復号化Ｓ５０７の間で、クラスブロック６００とその構成要素の暗号化、復号化を省略してもよい。
【０１６９】
また、本実施の形態において、暗号強度ヘッダ７０１やＪＩＴヘッダ７０３や最適化ヘッダ７０４の内容を、プログラム実行中に計測したプロファイル情報を元に、実行中の任意のタイミングで書き換えても良い。
【０１７０】
以上が、本発明における実施の形態の説明である。本発明により、暗号化されていないデータがＲＡＭ上に置かれる時間を短縮することが可能となり、ソフトウェアの解析を極めて困難にする。
【産業上の利用可能性】
【０１７１】
本発明に係るアプリケーション実行装置は、クラスロード、ベリファイ、バイトコード実行、ＪＩＴコンパイル時においてメモリ上に置かれるクラス情報を暗号化する機能を有し、さらに実行時に復号化されたデータがメモリ上に置かれる時間を短縮する機能を有することで、ダウンロードされたアプリケーションを実行時の盗聴、改ざんから保護することができる。本発明を利用することで、今後本格展開が予想されるアプリケーションのダウンロード配信ビジネスにおいて、コンテンツ作成者の権利を保護することができる。
【図面の簡単な説明】
【０１７２】
【図１】本発明アプリケーション実行装置の実施の形態の構成図
【図２】従来のアプリケーション実行装置の実施の形態の構成図
【図３】本発明に係るクラスファイルの構成の一例の図
【図４】本発明に係るクラスヘッダの構成図
【図５】本発明における実施の形態の暗号化クラスファイルの構成図
【図６】本発明における実行の形態のクラスブロックの構成図
【図７】本発明における実行の形態のメソッドヘッダの構成図
【図８】本発明における実行の形態の暗号化クラスブロックの構成図
【図９】本発明に係る仮想マシンの構成の一例の構成図
【図１０】本発明に係るアプリケーション実行装置が備える第２のＲＯＭに記憶されている情報の一例の構成図
【図１１】本発明に係るアプリケーション実行装置が備える第２のＲＡＭに記憶されている情報の一例の構成図
【図１２】本発明に係るアプリケーション実行装置の動作手順を示すフローチャート
【図１３】本発明に係るアプリケーション実行装置のアプリ取得処理の手順を示す図
【図１４】本発明に係るアプリケーション実行装置のアプリ取得処理時のステップＳ２０１後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図１５】本発明に係るアプリケーション実行装置のアプリ取得処理後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図１６】本発明に係る仮想マシンのクラスロード処理におけるステップＳ３０６後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図１７】本発明に係る仮想マシンのクラスロード処理後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図１８】本発明に係る仮想マシンのクラスロード処理の動作手順を示すフローチャート
【図１９】本発明に係る仮想マシンのベリファイ処理の動作手順を示すフローチャート
【図２０】本発明に係る仮想マシンのインタプリタ処理の動作手順を示すフローチャート
【図２１】本発明に係る仮想マシンのＪＩＴコンパイル処理の動作手順を示すフローチャート
【図２２】本発明に係る仮想マシンのＪＩＴコンパイル処理のステップＳ６０１後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２３】本発明に係る仮想マシンのＪＩＴコンパイル処理のステップＳ６０３後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２４】本発明に係る仮想マシンのＪＩＴコンパイル処理のステップＳ６０４後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２５】本発明に係る仮想マシンのＪＩＴコンパイル処理のステップＳ６０６後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２６】本発明に係る仮想マシンの最適化処理の動作手順を示すフローチャート
【図２７】本発明に係る仮想マシンの最適化処理のステップＳ７０１後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２８】本発明に係る仮想マシンの最適化処理のステップＳ７０３後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図２９】本発明に係る仮想マシンの最適化処理のステップＳ７０４後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図３０】本発明に係る仮想マシンの最適化処理のステップＳ７０６後に、第１ＲＡＭに記憶されている情報の一例の構成図
【図３１】本発明に係るアプリケーション実行環境における暗号化処理の動作手順を示すフローチャート
【図３２】本発明に係るアプリケーション実行環境における復号化処理の動作手順を示すフローチャート
【符号の説明】
【０１７３】
１００    ダウンロード可能なプログラム
１１０    アプリケーション実行装置
１２０    実行部
１２１    アプリ取得プログラム
１２２    仮想マシン
１２３    ＯＳ
１２４    第１ＣＰＵ
１２５    第１ＲＡＭ
１２６    第１ＲＯＭ
１３０    安全な実行部
１３１    復号処理部
１３２    暗号処理部
１３３    第２ＣＰＵ
１３４    第２ＲＡＭ
１３５    第２ＲＯＭ
【図１】
2007233426.tif 000003
【図２】
2007233426.tif 000004
【図３】
2007233426.tif 000005
【図４】
2007233426.tif 000006
【図５】
2007233426.tif 000007
【図６】
2007233426.tif 000008
【図７】
2007233426.tif 000009
【図８】
2007233426.tif 000010
【図９】
2007233426.tif 000011
【図１０】
2007233426.tif 000012
【図１１】
2007233426.tif 000013
【図１２】
2007233426.tif 000014
【図１３】
2007233426.tif 000015
【図１４】
2007233426.tif 000016
【図１５】
2007233426.tif 000017
【図１６】
2007233426.tif 000018
【図１７】
2007233426.tif 000019
【図１８】
2007233426.tif 000020
【図１９】
2007233426.tif 000021
【図２０】
2007233426.tif 000022
【図２１】
2007233426.tif 000023
【図２２】
2007233426.tif 000024
【図２３】
2007233426.tif 000025
【図２４】
2007233426.tif 000026
【図２５】
2007233426.tif 000027
【図２６】
2007233426.tif 000028
【図２７】
2007233426.tif 000029
【図２８】
2007233426.tif 000030
【図２９】
2007233426.tif 000031
【図３０】
2007233426.tif 000032
【図３１】
2007233426.tif 000033
【図３２】
2007233426.tif 000034