(57)【特許請求の範囲】
【請求項１】
中間言語のプログラムを複数の部分に分割して管理すると共に、プログラム実行時に各部分の要否を判定する判定手段と、
上記判定手段によって必要と判断された部分を、上記プログラムの各部分を暗号化して記憶する記憶装置から読み出して復号する復号手段と、
上記復号手段が復号した上記プログラムの部分をメモリにロードするプログラムローダと、
当該ロードされたプログラムの部分を、その装置のプロセッサにネイティブな機械語に変換した後で実行するプログラム実行手段とを備える情報処理装置であって、
上記復号手段は、上記情報処理装置にネイティブな機械語で記述されており、
上記情報処理装置のプロセッサは、上記プログラム実行手段による、中間言語から機械語への変換処理を介することなく、上記復号手段の機械語を実行することによって、上記復号手段として動作し、
上記プログラムローダは、暗号化されていない中間言語のプログラムの部分もメモリにロード可能であり、
暗号化されているか否かに拘わらず、上記記憶装置の記憶領域のうち、上記プログラムの各部分を格納する領域には、プログラムを格納するための第１領域と、当該プログラムに関連するデータを格納するための第２領域とが含まれており、
暗号化されている場合は、上記第１領域には、ダミープログラムが格納され、上記暗号化されたプログラムの部分は、上記第２領域に格納されていると共に、
上記復号手段は、暗号化されたプログラムの部分を、上記記憶装置の第２領域から読み出して復号することを特徴とする情報処理装置。
【請求項２】
上記情報処理装置のメモリには、当該情報処理装置のオペレーティングシステム、デバイスドライバおよびデバイスの少なくとも一つからのみアクセス可能な特定領域と、上記オペレーティングシステム上で動作するアプリケーションプログラムからアクセス可能な通常領域とが設けられており、
上記復号手段は、上記部分の変換により生成したネイティブな機械語のプログラムを、上記特定領域に設けられた領域を介して、上記プログラムローダへ与えることを特徴とする請求項１記載の情報処理装置。
【請求項３】
上記情報処理装置のメモリの内容をダンプするダンププログラムが動作しているか否かを監視し、ダンププログラムの動作を検出すると、当該ダンププログラムおよび上記復号手段の少なくとも一方の動作を停止させる監視手段を備えていることを特徴とする請求項１または２記載の情報処理装置。
【請求項４】
０以上の任意の整数をｉ、
上記暗号化されたプログラムの部分を、０次の上記暗号化されたプログラムの部分、
ｉ次の暗号化されたプログラムの部分をダミープログラムに関連する特定データとして当該ダミープログラムに付加する処理によって生成されるデータを、（ｉ＋１）次の暗号化されたプログラムの部分、
（ｉ＋１）次の暗号化されたプログラムの部分から、上記特定データとしてのｉ次の暗号化されたプログラムの部分を抽出する処理を抽出処理、
ｎを予め１以上に定められた整数とするとき、
上記第２領域には、暗号化されている場合、ｎ次の暗号化されたプログラムの部分が記憶されており、
上記復号手段は、上記第２領域に格納されたデータに対して、ｎ回、上記抽出処理を繰り返すことによって、上記暗号化されたプログラムの部分を読み出して復号することを特徴とする請求項１、２または３記載の情報処理装置。
【請求項５】
請求項１〜４のいずれか１項に記載のプログラムの部分を生成するための情報処理装置であって、
中間言語のプログラムの部分を、上記復号手段が復号可能な形式で暗号化する暗号化手段を備えていることを特徴とする情報処理装置。
【請求項６】
請求項１〜４のいずれか１項に記載のプログラムの部分を生成するための情報処理装置と、
中間言語のプログラムの部分を、上記情報処理装置の復号手段が復号可能な形式で暗号化する暗号化手段とを備えていることを特徴とする情報処理システム。
【請求項７】
請求項１〜５のいずれか１項に記載の情報処理装置の各手段として、コンピュータを動作させるプログラム。
【請求項８】
請求項７記載のプログラムが記録されたコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、中間言語のプログラムを複数の部分に分割して管理すると共に、必要であれば、その部分をメモリにロードし、その装置のプロセッサにネイティブな機械語に変換した後で実行する情報処理装置、情報処理システム、プログラムおよび記録媒体に関するものである。
【背景技術】
【０００２】
従来から、多くのプラットフォームで動作させるために、例えば、Ｊａｖａ（登録商標）言語の処理系のように、プログラム開発装置にて、ソースコードを中間言語のコードにコンパイルして配布すると共に、プログラム実行装置に設けられた仮想マシンが当該中間言語のコードをネイティブコードに変換して実行する構成が広く使用されている。
【０００３】
当該構成では、各プラットフォームにおいて仮想マシンが提供されていれば、ソースコードの変更も、ソースコードをコンパイルする処理を各プラットフォーム毎に行うことも不要になる。
【０００４】
より詳細には、仮に、ソースコードをコンパイルする処理を各プラットフォーム毎に行って、各プラットフォームにネイティブな機械語を生成すると共に、いずれのプラットフォーム上でも実行できるように、それらを全て含んだ状態で配布すると、プログラムサイズが大きくなってしまう。また、各プラットフォーム用のプログラムを別個に配布したとしても、プラットフォームの差異は、例えば、Ｗｉｎｄｏｗｓ（登録商標）でさえ、ＣＰＵのメーカの相違、ＯＳ（Operating System）のバージョンの相違、あるいは、それらの組み合わせによっても発生するため、これらの差異全てに対応するソースコードを用意したり、これら差異のあるプラットフォームの全てにおいて、プログラムをテストして、当該プログラムが正常に動作するか否かを確認したりしようとすると、非常に手間がかかってしまう。
【０００５】
これに対して、上記中間言語のコードを配布する構成では、上記のように、ソースコードを変更したり、テストも含め、ソースコードをコンパイルする処理を各プラットフォーム毎に行ったりすることも不要になり、プログラム開発時の手間を軽減できる。また、複数のプラットフォームで動作できるにも拘わらず、プログラムサイズが大きくなるという不具合も発生しない。
【０００６】
これらの結果、プログラム開発時の生産性を向上でき、プログラム開発時の手間を大幅に削減できると共に、短納期でのソフトウェア開発や、大規模なプログラム開発が可能になる。
【０００７】
ただし、上記中間言語は、複数種類のプロセッサのネイティブコードに変換しやすいようにするために、型の情報などを含んでいる。したがって、ネイティブコードのプログラムと比較すると、逆コンパイルすることにより、比較的容易にプログラムの内容を把握できる。この結果、第三者は、比較的容易に、プログラムの内容の把握およびプログラムの改竄を試みることができる。したがって、技術情報が流出したり、プログラムがクラックされる虞れがある。
【０００８】
これに対して、例えば、後述の特許文献１では、プログラムを暗号化する構成が記載されている。具体的には、イニシャルプログラムにより、パスワードが合致すると、情報処理装置からＩＣカードへ暗号化された、暗／復号化処理プログラムが送信され、ＩＣカードは、このプログラムを正当使用者の復号化鍵にて復号化して送り返す。情報処理装置は、このプログラムを作業メモリ領域に配置して起動し、データの暗／復号化処理を行う。このように、当該構成では、プログラムは、通常暗号化されているので、第三者による解析および改竄を防止できる。
【特許文献１】特開平９−６２３２号公報（公開日：1997年１月１０日）
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記各従来の構成を組み合わせて、プログラムのクラスファイルを暗号化して記憶しておくと共に、プログラム実行装置で全てのクラスファイルを復号化して、メモリにロードし、仮想マシンに実行させようとすると、復号に要する時間が長くなる。また、必ず、各クラスファイルが復号されるため、第三者に暗号化／復号化処理の手順を解析する手がかりを与えやすい。
【００１０】
本発明は、上記の問題点に鑑みてなされたものであり、その目的は、よりプログラムの内容を第三者が取得しにくく、より安全な情報処理装置を実現することにある。
【課題を解決するための手段】
【００１１】
本発明に係る情報処理装置は、上記課題を解決するために、中間言語のプログラムを複数の部分に分割して管理すると共に、プログラム実行時に各部分の要否を判定する判定手段と、上記判定手段によって必要と判断された部分を、上記プログラムの各部分を暗号化して記憶する記憶装置から読み出して復号する復号手段と、上記復号手段が復号した上記プログラムの部分をメモリにロードするプログラムローダと、当該ロードされたプログラムの部分を、その装置のプロセッサにネイティブな機械語に変換した後で実行するプログラム実行手段とを備えていることを特徴としている。
【００１２】
上記構成において、判定手段は、例えば、ソースコードをコンパイルするなどして生成された中間言語のプログラムを、例えば、クラスやモジュールあるいはアセンブリなど、複数の部分に分割して管理すると共に、プログラム実行時に、例えば、当該プログラムの部分を実行する可能性があるか否かなどを判定して、各部分の要否、すなわち、当該部分をメモリにロードする必要があるか否かを判定している。一例として、部分がクラスの場合では、例えば、判定手段は、そのクラスのインスタンスの生成が必要になったか否かなどによって、当該部分の要否を判定できる。
【００１３】
上記判定手段が、ある部分を必要と判断すると、復号手段は、上記プログラムの各部分を暗号化して記憶する記憶装置から読み出して復号し、プログラムローダは、復号された上記プログラムの部分をメモリにロードする。さらに、プログラム実行手段は、当該ロードされたプログラムの部分を、その装置のプロセッサにネイティブな機械語に変換した後で実行する。
【００１４】
当該構成では、記憶装置に格納されている状態では、プログラムの部分が暗号化されているので、第三者による当該プログラムの部分の内容解読を妨害できる。また、上記構成では、判定手段がプログラム実行時に各部分の要否を動的に判定すると共に、上記復号手段は、上記判定手段によって必要と判断された部分を復号する。したがって、暗号化されたプログラムを全て復号してメモリにロードする構成と比較して、各部分が復号される回数と、復号される部分の数との双方を低減できる。したがって、第三者によるプログラムの内容解析をさらに困難にすることができる。これらの結果、よりプログラムの内容を第三者が取得しにくく、より安全な情報処理装置を実現できる。
【００１５】
さらに、上記構成に加えて、上記復号手段は、上記情報処理装置にネイティブな機械語で記述されており、上記情報処理装置のプロセッサは、上記プログラム実行手段による、中間言語から機械語への変換処理を介することなく、上記復号手段の機械語を実行することによって、上記復号手段として動作してもよい。
【００１６】
当該構成では、上記復号手段が上記中間言語よりも内容を把握しにくい機械語で記述されている。したがって、第三者によるプログラムの内容解析をさらに困難にすることができ、情報処理装置の安全性をさらに向上できる。
【００１７】
さらに、上記構成に加えて、上記情報処理装置のメモリには、当該情報処理装置のオペレーティングシステム、デバイスドライバおよびデバイスの少なくとも一つからのみアクセス可能な特定領域と、上記オペレーティングシステム上で動作するアプリケーションプログラムからアクセス可能な通常領域とが設けられており、上記復号手段は、上記部分の変換により生成したネイティブな機械語のプログラムを、上記特定領域に設けられた領域を介して、上記プログラムローダへ与えてもよい。
【００１８】
当該構成に係る復号手段は、上記部分の変換により生成したネイティブな機械語のプログラムを、上記特定領域に設けられた領域を介して、上記プログラムローダへ与えるので、アプリケーションプログラムが当該領域を監視して復号後のプログラムの部分を取得することを防止できる。この結果、第三者によるプログラムの内容解析をさらに困難にすることができ、情報処理装置の安全性をさらに向上できる。
【００１９】
また、上記構成に加えて、上記情報処理装置のメモリの内容をダンプするダンププログラムが動作しているか否かを監視し、ダンププログラムの動作を検出すると、当該ダンププログラムおよび上記復号手段の少なくとも一方の動作を停止させる監視手段を備えていてもよい。
【００２０】
当該構成に係る監視手段は、上記情報処理装置のメモリの内容をダンプするダンププログラムが動作していることを検出すると、当該ダンププログラムおよび上記復号手段の少なくとも一方の動作を停止させる。したがって、ダンププログラムがメモリの内容をダンプして復号後のプログラムの部分を取得することを防止できる。この結果、第三者によるプログラムの内容解析をさらに困難にすることができ、情報処理装置の安全性をさらに向上できる。
【００２１】
さらに、上記構成に加えて、上記プログラムローダは、暗号化されていない中間言語のプログラムの部分もメモリにロード可能であり、暗号化されているか否かに拘わらず、上記記憶装置の記憶領域のうち、上記プログラムの各部分を格納する領域には、プログラムを格納するための第１領域と、当該プログラムに関連するデータを格納するための第２領域とが含まれており、暗号化されている場合は、上記第１領域には、ダミープログラムが格納され、上記暗号化されたプログラムの部分は、上記第２領域に格納されていると共に、上記復号手段は、暗号化されたプログラムの部分を、上記記憶装置の第２領域から読み出して復号してもよい。
【００２２】
当該構成では、暗号化されている場合も、暗号化されていない場合と同様、第１領域および第２領域を含む領域に、プログラムの部分が格納される。ただし、暗号化されている場合、本来は、プログラムが格納されるべき第１領域には、ダミープログラムが格納されており、復号手段は、第２領域から暗号化されたプログラムの部分を読み出す。
【００２３】
上記構成では、暗号化されている場合も暗号化されていない場合も、記憶装置にプログラムの部分を格納する際の形式は、互いに同じ形式（第１および第２領域を含む形式）であり、暗号化されている場合、第１領域には、ダミープログラムが格納されている。したがって、暗号化されていることを第三者が気付き難くすることができ、情報処理装置の安全性をさらに向上できる。
【００２４】
なお、暗号化されたプログラムの部分が第２領域に格納されており、復号手段が暗号化されたプログラムの部分を、上記記憶装置の第２領域から読み出して復号するものであれば、情報処理装置は、第２領域内に、さらに、第１および第２領域を含ませて、入れ子にしてもよい。
【００２５】
具体的には、０以上の任意の整数をｉ、上記暗号化されたプログラムの部分を、０次の上記暗号化されたプログラムの部分、ｉ次の暗号化されたプログラムの部分をダミープログラムに関連する特定データとして当該ダミープログラムに付加する処理によって生成されるデータを、（ｉ＋１）次の暗号化されたプログラムの部分、（ｉ＋１）次の暗号化されたプログラムの部分から、上記特定データとしてのｉ次の暗号化されたプログラムの部分を抽出する処理を抽出処理、ｎを予め１以上に定められた整数とするとき、上記構成に加えて、上記第２領域には、暗号化されている場合、ｎ次の暗号化されたプログラムの部分が記憶されており、上記復号手段は、上記第２の領域に格納されたデータに対して、ｎ回、上記抽出処理を繰り返すことによって、上記暗号化されたプログラムの部分を読み出して復号してもよい。当該構成では、実際に使用するプログラムの部分を、より多くのダミープログラムによって隠蔽することができるので、情報処理装置の安全性をさらに向上できる。
【００２６】
また、本発明に係る情報処理装置は、上記構成のいずれかの情報処理装置により実行されるプログラムの部分を生成するための情報処理装置であって、中間言語のプログラムの部分を、上記復号手段が復号可能な形式で暗号化する暗号化手段を備えていることを特徴としている。また、本発明に係る情報処理システムは、上記復号する情報処理装置のいずれかと、中間言語のプログラムの部分を、上記情報処理装置の復号手段が復号可能な形式で暗号化する暗号化手段とを備えていることを特徴としている。
【００２７】
当該構成でも、上記暗号化手段によって暗号化されたプログラムの部分が必要と判断されると、当該暗号化されたプログラムの部分は、上記復号手段によって復号されて、プログラムローダによってロードされ、プログラム実行手段により実行される。したがって、上記情報処理装置と同様、よりプログラムの内容を第三者が取得しにくく、情報処理装置および情報処理システムの安全性を向上できる。
【００２８】
ところで、上記情報処理装置は、ハードウェアで実現してもよいし、プログラムをコンピュータに実行させることによって実現してもよい。具体的には、本発明に係るプログラムは、上記情報処理装置のいずれかの各手段として、コンピュータを動作させるプログラムであり、本発明に係る記録媒体には、当該プログラムが記録されている。
【００２９】
これらのプログラムがコンピュータによって実行されると、当該コンピュータは、上記情報処理装置として動作する。したがって、上記情報処理装置と同様に、よりプログラムの内容を第三者が取得しにくく、より安全な情報処理装置を実現できる。
【発明の効果】
【００３０】
本発明によれば、プログラム実行時にプログラムの各部分の要否が動的に判定され、必要と判断された部分が復号されるので、暗号化されたプログラムを全て復号してメモリにロードする構成と比較して、各部分が復号される回数と、復号される部分の数との双方を低減できる。したがって、第三者によるプログラムの内容解析をさらに困難にすることができる。これらの結果、よりプログラムの内容を第三者が取得しにくく、より安全な情報処理装置を実現できるという効果を奏する。
【発明を実施するための最良の形態】
【００３１】
本発明の一実施形態について図１ないし図３に基づいて説明すると以下の通りである。すなわち、本実施形態に係るプログラミングシステム１は、図１に示すように、ソースコードを編集・作成すると共に、当該ソースコードをコンパイルして中間言語のコード（中間コード）を生成するプログラム開発装置（情報処理装置）２と、当該中間言語のコードを、その装置にネイティブな機械語に変換して実行するプログラム実行装置（情報処理装置）３とを備えている。
【００３２】
なお、プログラム実行装置３は、プログラム開発装置２の生成した中間コードを実行できれば、プログラム実行装置３と同じ装置であってもよいし、別の装置であってもよい。別の装置の場合、プログラム開発装置２が中間コードをプログラム実行装置３へ送信したり、プログラム開発装置２の生成した中間コードが格納された記録媒体をプログラム実行装置３が読み取るなどして、プログラム開発装置２の生成した中間コードがプログラム実行装置３に格納される。
【００３３】
ここで、上記中間言語は、後述するように、その処理系が動的にプログラムの各部分（例えば、クラス）をロードできるものであれば、種々の言語を採用できるが、以下では、一例として、マイクロソフト社が規定したＭＳＩＬ（Microsoft（登録商標） Intermediate Language ）の場合について説明し、そのコードをＭＳＩＬコードと称する。
【００３４】
上記ＭＳＩＬは、ＣＰＵに依存しない一連の命令であって、効率的にネイティブ・コードに変換可能なように予め定められている。当該命令には、オブジェクトに対する読み込み、格納、初期化、および、呼び出し用の命令が含まれている。また、上記命令には、それ以外にも、算術演算および論理演算、制御フロー、ＤＭＡ（Direct Memory Access）、例外処理、並びに、その他の操作のための命令も含まれている。
【００３５】
一方、上記プログラム開発装置２には、ソースコードを編集・作成する編集処理部１１と、当該編集処理部１１の生成したソースコードをコンパイルしてＭＳＩＬコードを生成するコンパイラ１２と、当該コンパイラ１２の生成したＭＳＩＬコードを記憶する記憶部１３とが設けられている。
【００３６】
なお、これらの各部材１１〜１３、並びに、後述する各部材２１〜５１は、ＣＰＵが記憶装置に格納されたプログラムを実行し、図示しない入出力回路などの周辺回路を制御することによって実現される機能ブロックである。また、これらの部材のうち、記憶部１３・および３１は、ＲＯＭやＲＡＭなどの記憶装置自体であってもよい。したがって、これらの手段を有するコンピュータが、上記プログラムを記録した記録媒体（例えば、ＣＤ−ＲＯＭなど）から読み取ったり、他のコンピュータと通信したりして、プログラムを取得し、当該プログラムを実行するだけで、本実施形態に係るプログラム開発装置２およびプログラム実行装置３を実現できる。
【００３７】
上記編集処理部１１は、上記ソースコードを作成・編集可能であれば、テキストエディタであってもよいし、ソースコードの作成・編集やコンパイルなどを支援する機能を持った統合環境であってもよい。
【００３８】
また、上記コンパイラ１２としては、ＭＳＩＬコードにコンパイルできるものであれば、例えば、Ｃ＃、Ｍａｎａｇｅｄ  Ｃ＋＋、Ｖｉｓｕａｌ  Ｂａｓｉｃ（登録商標）．ＮＥＴ、、ＪＳｃｒｉｐｔ（登録商標）．ＮＥＴなど、種々の言語のコンパイラを好適に使用できる。
【００３９】
これらの言語では、上記ＭＳＩＬコードを実行するランタイム処理部３２（後述）がメモリーの取得・開放を管理しているため、プログラマがポインタを意識する必要がなくなっており、開発効率が向上されている。また、ランタイム処理部３２がＭＳＩＬコードからネイティブコードに変換する段階でセキュリティのチェックもできるため、プログラミングシステム１全体の安全性を向上できる。
【００４０】
さらに、上記コンパイラ１２は、ＭＳＩＬコードを生成する際、それに関連するメタデータも生成している。当該メタデータは、上記プログラム実行装置３がＭＳＩＬコードを実行する際に使用されるデータであって、例えば、コード内の型について、それぞれの型の定義、型のメンバのシグネチャ、コードが参照するメンバなどが含まれる。
【００４１】
上記コンパイラ１２が記憶部１３に中間コードとしてのＭＳＩＬコードおよびメタデータを格納する際の形式は、上記プログラム実行装置３で実行可能な形式として予め定められている。本実施形態では、コンパイラ１２は、ＭＳＩＬコードおよびメタデータを含む上記形式のデータシーケンス（バイトシーケンス）を、ファイルとして格納しており、当該ファイルには、ＭＳＩＬコードを格納する領域（コード領域）とメタデータを格納する領域（メタデータ領域）とが設けられている。なお、当該形式としては、例えば、ＣＯＦＦ（ Common Object File Format）形式のＤＬＬ（Dynamic Link Library）ファイルなどが挙げられる。また、本実施形態では、上記言語としてクラスを定義可能な言語が使用されており、以下では、上記ファイルのうち、クラスを定義したＭＳＩＬコードが含まれているファイルをクラスファイルと称する。
【００４２】
さらに、本実施形態に係るプログラム開発装置２には、上記コンパイラ１２が生成したデータシーケンスを暗号化する暗号化処理部（暗号化手段）２１が設けられている。当該暗号化処理部２１は、一例として、指定されたクラスファイル（クラスライブラリファイル）を暗号化して、元のクラスファイルを上書きするコマンドラインプログラムなどによって実現される。
【００４３】
本実施形態では、上記暗号化処理部２１は、以下の２つの暗号化処理を組み合わせて暗号化している。第１の暗号化処理は、上記データシーケンスのうち、予め定められた部分について、データ順序変更および条件付きのビット反転を行う処理である。
【００４４】
一例として、本実施形態に係る暗号化処理部２１は、上記部分のデータシーケンスを予め定められた単位（例えば、バイト毎）に分割し、分割されたデータの順序を逆順に並び替えている。より詳細には、上記部分のデータシーケンスは、最後のバイトが上記部分の最初のバイトになるように並び替えられる。また、本実施形態に係る暗号化処理部２１は、予め定められた単位毎（例えば、バイト毎）に、その単位のデータシーケンスが、予め定められたデータシーケンス（例えば、００ｈおよびＦＦｈ）でなければ、その単位のデータシーケンスをビット反転している。さらに、本実施形態では、上記暗号化する部分として上記データシーケンスの中にプログラムに拘わらず一定または類似のデータシーケンスとなるように定められた箇所、あるいは、上記データシーケンスの中にプログラムに拘わらず一定または類似のデータシーケンスとなる可能性が高いと推定される箇所を除いた部分が選択されている。なお、当該箇所としては、例えば、先頭から１１９バイト（”…This Program is cannot be DOS MODE.”までの部分）などが挙げられる。
【００４５】
また、第２の暗号化処理は、上記第１の暗号化処理で生成されたデータシーケンスに、偽のソースコード（ダミーのソースコード）をコンパイルして生成されたデータシーケンス（偽のデータシーケンス）を組み合わせることによって、組み合わせ後のデータシーケンスが通常のクラスファイル内のデータシーケンスと同じ形式になり、しかも、当該データシーケンスを逆コンパイルすると、偽のソースコードが得られるように整形する処理である。なお、上記ダミーのソースコードは、難読化しておく方が望ましい。
【００４６】
本実施形態では、図２に示すように、上記偽のデータシーケンスとして、ＭＳＩＬコードＣ１およびメタデータＭ１ａが用意されており、暗号化処理部２１は、当該ＭＳＩＬコードＣ１を、クラスファイルのコード領域Ｃに格納し、上記第１の暗号化処理によって生成したデータシーケンスＤ１（メタデータＭ１ｂ）および上記メタデータＭ１ａを、メタデータＭ１として、当該クラスファイルのメタデータ領域Ｍに格納する。
【００４７】
これにより生成されたクラスファイル（暗号化されたクラスファイル）には、通常のクラスファイルと同様に、コード領域Ｃとメタデータ領域Ｍとが含まれている。したがって、形式上は、通常のクラスファイルと同一であり、第三者は、当該クラスファイルが暗号化されていると第三者に気付かれ難い。
【００４８】
ただし、当該クラスファイルのコード領域Ｃには、上記ＭＳＩＬコードＣ１が格納されている。したがって、このクラスファイルを通常のクラスファイルと同様に逆コンパイルしても、ＭＳＩＬコードＣ１の示す偽のソースコードが得られるだけである。この結果、本来のクラスファイルの内容、すなわち、暗号化前のＭＳＩＬコードＣ０のソースコードを、第三者から隠蔽できる。
【００４９】
一方、図１に示すように、上記プログラム実行装置３は、上記クラスファイルが格納された記憶部（記憶装置）３１と、当該記憶部３１に格納されたクラスファイル内のＭＳＩＬコードを実行するランタイム処理部３２とを備えている。
【００５０】
上記構成では、ランタイム処理部３２がＭＳＩＬコードをプログラム実行装置３にネイティブな機械語のプログラムに変換して実行する。したがって、上述したように、ソースコードを変更したり、テストも含め、ソースコードをコンパイルする処理を各プラットフォーム毎に行ったりすることも不要になり、プログラム開発時の手間を軽減できる。また、複数のプラットフォームで動作できるにも拘わらず、プログラムサイズが大きくなるという不具合も発生しない。
【００５１】
これらの結果、プログラム開発時の生産性を向上でき、プログラム開発時の手間を大幅に削減できると共に、短納期でのソフトウェア開発や、大規模なプログラム開発が可能になる。
【００５２】
より詳細には、上記ランタイム処理部３２には、ＭＳＩＬコードの実行に必要なクラスがある場合に、そのクラスを定義するＭＳＩＬコードが含まれたデータシーケンスを、図示しないメモリにロードするクラスローダ（プログラムローダ）４１と、必要に応じてメタデータを参照しながら、上記ＭＳＩＬコードをコンパイルして、プログラム実行装置３にネイティブな機械語のプログラム（ネイティブプログラム）を生成する実行装置側コンパイラ（プログラム実行手段）４２と、当該ネイティブプログラムの実行を制御すると共に、クラスローダ４１および実行装置側コンパイラ４２を制御する制御部（判定手段）４３とが設けられている。
【００５３】
本実施形態に係るランタイム処理部３２は、あるプログラムを実行する際、実行される可能性のある全てのクラスのデータシーケンスをロードするのではなく、動的にクラスをロード可能であり、上記制御部４３は、上記ネイティブプログラムの実行中に、あるクラスのインスタンスの生成が必要になった場合、当該クラスのデータシーケンスのロードを上記クラスローダ４１へ指示できる。
【００５４】
さらに、本実施形態に係るクラスローダ４１は、記憶部３１に格納されたクラスファイルからだけではなく、指定されたメモリ領域からも上記データシーケンスをロードできるように構成されている。
【００５５】
また、本実施形態に係る実行装置側コンパイラ４２は、ＪＩＴ（Just-In-Time）でのコンパイルが可能である。具体的には、実行装置側コンパイラ４２は、ＭＳＩＬコードの示すプログラムを実行する際、個々のＭＳＩＬコードを１つずつに対して、「解釈、機械語への変換、その機械語の実行」という処理を繰り返すのではなく、実行前に、予め定めれた量（例えば、１メソッドなど）のＭＳＩＬコードを機械語に変換して実行している。さらに、実行装置側コンパイラ４２は、変換後の機械語を記憶しておき、各ＭＳＩＬコードの示すプログラムを実行する際、既に変換後の機械語が記憶されていれば、その機械語を実行できる。なお、変換の際、実行装置側コンパイラ４２は、必要に応じて、ＭＳＩＬコードに関連するメタデータも参照している。
【００５６】
一例として、メソッド単位で変換する場合について、さらに詳細に説明すると、クラスローダ４１は、例えば、メタデータから型を読み込んだ場合、上記制御部４３として、当該型に対応するスタブを生成し、その型の各メソッドに結び付ける。さらに、上記制御部４３としてのスタブは、メソッドが初めて呼び出されると、実行装置側コンパイラ４２へＪＩＴコンパイルを指示し、実行装置側コンパイラ４２は、そのメソッドのＭＳＩＬコードをネイティブな機械語（ネイティブコード）に変換すると共に、そのネイティブコードを直接実行するように上記スタブを変更する。これにより、それ以降は、このＪＩＴコンパイル済みのメソッドが呼び出されると、上記生成済みのネイティブコードが直接実行され、ＪＩＴコンパイルに必要な時間、および、コードの実行に必要な時間を短縮できる。
【００５７】
なお、本実施形態に係る実行装置側コンパイラ４２は、上記ＪＩＴコンパイル以外にも、インストール時コード生成が可能であり、ＪＩＴコンパイル時よりも大きなコード単位を一度に変換すると共に、生成したネイティブコードを後からクラス（アセンブリ）が読み込まれて実行されるときに使用できるように保存できる。
【００５８】
さらに、本実施形態に係るプログラム実行装置３には、暗号化されたクラスファイルを復号する暗号解除部（復号手段；監視手段）５１が設けられており、上記制御部４３は、データシーケンスのロードが必要になったクラスファイルが暗号化されている場合、クラスローダ４１によるデータシーケンスのロードの前に、上記暗号解除部５１に復号を指示できる。また、本実施形態に係る制御部４３は、暗号解除部５１へ復号を指示する際、復号時、および、クラスローダ４１呼び出し時に、メモリ領域として、ＯＳのメモリ領域、あるいは、デバイスドライバのメモリ領域またはデバイス領域を使用するように指示する。
【００５９】
一例として、本実施形態に係る制御部４３は、未だ読み込まれていないクラスを実行したいという処理に達したら、ランタイム処理部３２のポインタ（アプリケーションドメインのポインタ）と読み出すべきクラスライブラリのファイルパスとを引数にして、上記暗号解除部５１を呼び出すことによって、当該暗号解除部５１に復号を指示できる。なお、ランタイム処理部３２のポインタによって示される構造体には、クラスローダ４１が読み込む対象とするデータシーケンスを格納されたメモリ領域を示すデータが含まれている。
【００６０】
一方、上記暗号解除部５１は、プログラム実行装置３にネイティブな機械語からなるプログラムを、例えば、ファイルなどとして、記憶部３１格納しておき、当該プログラムを上記ＣＰＵが実行することによって実現されており、上記暗号化処理部２１が暗号化したクラスファイルを復号した後、復号されたデータシーケンスを、上記クラスローダ４１へ与えることができる。
【００６１】
当該構成では、クラスファイルが暗号化されている場合であっても、クラスローダ４１には、復号されたデータシーケンスが与えられるので、クラスローダ４１は、暗号化されていないクラスファイル（通常のクラスファイル）のデータシーケンスをロードする際と同じ動作で、データシーケンスをロードできる。したがって、通常のクラスファイルをロードするために、ロード処理などの処理を、そのプログラム実行装置３の環境に最適化したクラスローダ４１が既に存在していれば、暗号化されたクラスファイルのデータシーケンスをロードするためにも、そのクラスローダ４１を使用できる。したがって、暗号化されたクラスファイルをロードするためのクラスローダ４１を新たに作成するよりも、簡便かつ安全にプログラム実行装置３を実現できる。
【００６２】
暗号解除部５１が暗号化したクラスファイルを復号してクラスローダ４１へ与える処理について、さらに具体的に説明すると、暗号解除部５１は、暗号化されたクラスファイル（図２参照）のメタデータ領域Ｍから、例えば、予め定められた部分以外のデータを読み出したり、予め定められた形式以外のメタデータを読み出したりして、上記メタデータＭ１ａ以外のデータシーケンス（Ｄ１）を読み出す。
【００６３】
さらに、暗号解除部５１は、当該データシーケンスＤ１のうち、上記暗号化処理部２１が暗号化すると予め定められた箇所のデータの順番を元に戻し、さらに、暗号化処理部２１がビット反転すると定められた値のデータシーケンスをビット反転する。これにより、暗号解除部５１は、暗号化前のデータシーケンスＤ０を復号できる。
【００６４】
一例として、本実施形態に係る暗号化処理部２１は、上述したように、先頭から１２０バイト以降のデータシーケンスをバイト毎に分割し、逆順に並び替えると共に、当該分割されたデータが００ｈおよびＦＦｈ以外であれば、ビットを反転している。したがって、暗号解除部５１は、先頭から１２０バイト以降のデータシーケンスをバイト毎に分割し、分割されたデータの順序を逆順に並び替えると共に、当該分割されたデータが００ｈおよびＦＦｈ以外であれば、ビットを反転している。
【００６５】
ここで、制御部４３は、データシーケンスのロードが必要になったクラスファイルが暗号化されている場合、暗号解除部５１を呼び出した後にクラスローダ４１を呼び出してもよいが、本実施形態では、上記制御部４３は、クラスローダ４１を呼び出す代わりに、暗号解除部５１を呼び出しており、暗号解除部５１がクラスローダ４１に復号したデータシーケンスＤ１を渡して、クラスローダ４１に当該データシーケンスＤ１のロードを指示している。
【００６６】
より詳細には、暗号解除部５１は、復号したデータシーケンスＤ１を、ランタイム処理部３２のポインタによって特定されたメモリ領域に格納すると共に、当該メモリ領域からクラスファイルをロードするように、クラスローダ４１に指示している。なお、暗号解除部５１は、クラスローダ４１へ指示する際、例えば、当該クラスローダ４１をＯＬＥ（Object Linking and Embedding）として呼び出してもよい。具体的には、ランタイム処理部３２は、アプリケーションドメインのインスタンスとして動作しており、暗号解除部５１は、当該アプリケーションドメインのインスタンスのＬｏａｄメソッドに、例えば、復号化したデータシーケンスＤ１のバイナリデータへのポインタを渡すなどして、クラスローダ４１へ復号化したデータシーケンスＤ１のバイナリデータを渡している。さらに、ランタイム処理部３２は、クラスローダ４１へ指示して、自らのアプリケーションドメイン内に、データシーケンスＤ１の示すクラスを取り込ませる。
【００６７】
また、制御部４３は、クラスファイルが暗号化されているか否かを判定してもよいが、本実施形態では、制御部４３がクラスファイルが暗号化されているか否かに拘わらず暗号解除部５１に復号を指示しており、暗号解除部５１が復号の要否（暗号化されているか否か）を判定している。なお、復号が不要と判断した場合、暗号解除部５１は、例えば、クラスファイルから読み出したデータシーケンスをクラスローダ４１へ与えるなどして、クラスファイルのコード領域Ｃ１に格納されたＭＳＩＬコードのロードをクラスローダ４１へ指示している。
【００６８】
このように、本実施形態では、より低級な言語（ネイティブな機械語）で記述された暗号解除部５１が、クラスローダ４１へ指示することによって、より高級な言語（中間言語；ＭＳＩＬコード）のプログラム（ランタイム処理部３２により実行されるクラスファイルのコード）のプログラムのロード、あるいは、プログラムの実行などの機能を制御している。
【００６９】
これにより、上記暗号解除部５１が、上記ＭＳＩＬコードよりも内容を把握しにくい機械語で記述されており、第三者によるプログラムの内容解析をさらに困難にすることができるにも拘わらず、クラスファイルの暗号化前のプログラムをより高級な言語（中間言語；ＭＳＩＬコード）で記述でき、プログラム開発時の生産性を向上できる。
【００７０】
さらに、本実施形態に係る暗号解除部５１は、復号処理の際、メモリの内容をダンプするダンププログラムが動作しているか否かを監視し、ダンププログラムの動作を検出すると、動作を停止できる。
【００７１】
上記構成において、ＭＳＩＬコードのプログラムを実行する際の動作について説明すると以下の通りである。図３に示すＳ１において、プログラム実行装置３に設けられたランタイム処理部３２の制御部４３は、新たなクラスファイルのロードが必要であるか否かを監視している。
【００７２】
不要であると判断した場合（NOの場合）、制御部４３は、Ｓ２〜Ｓ４において、プログラムを実行している。より詳細には、Ｓ２において、制御部４３は、新たなＪＩＴコンパイルが必要であるか否かを判定し、必要であれば（YES の場合）、Ｓ３において、実行装置側コンパイラ４２にＪＩＴコンパイルを指示して、ＭＳＩＬコードをネイティブな機械語の変換させた後、当該ネイティブコードを実行する。一方、ＪＩＴコンパイルが不要であれば（上記Ｓ２にてNOの場合）、制御部４３は、Ｓ３を経由せず、既に変換されているネイティブコードを実行する（上記Ｓ４）。なお、ＪＩＴコンパイルの要否に拘わらず、上記Ｓ２〜Ｓ４の処理が終了すると、制御部４３は、Ｓ１以降の処理を繰り返す。
【００７３】
一方、例えば、未だロードされていないクラスのインスタンス生成が必要になったと判断した場合など、未だロードされていないクラスのプログラムの実行が必要になったと判断すると（上記Ｓ１にてYES の場合）、制御部４３は、Ｓ１１において、暗号解除部５１へ指示して、当該クラスのクラスファイルに格納されたデータシーケンスＤ１を復号させる。さらに、Ｓ１２において、暗号解除部５１は、上記データシーケンスＤ１を復号して生成したデータシーケンスＤ０を、クラスローダ４１へ与える。さらに、クラスローダ４１は、当該データシーケンスＤ０をメモリにロードする。その後は、Ｓ２以降の処理が行われ、データシーケンスＤ０に含まれるＭＳＩＬコードは、ＪＩＴコンパイルされた後、実行される。
【００７４】
なお、上記では、暗号化処理部２１が、メタデータ領域に、暗号化されたデータシーケンスを格納する場合について説明したが、これに限るものではない。例えば、リソース領域（ハッシュ文字列、画像データ、ＣＳＶ（ Comma Separated Value）データなどを格納する領域）に、暗号化されたデータシーケンスを格納し、暗号解除部５１が、当該リソース領域から、暗号化されたデータシーケンスを読み出してもよい。
【００７５】
いずれの場合であっても、記憶部１３および記憶部３１の記憶領域のうち、上記プログラムの各部分（クラスなど）を格納する領域には、プログラムを格納するための第１領域と、当該プログラムに関連するデータを格納するための第２領域とが含まれており、暗号化されている場合は、暗号化処理部２１が、上記第１領域にダミープログラムを格納し、上記暗号化されたデータシーケンスを上記第２領域に格納すれば、同様の効果が得られる。
【００７６】
さらに、暗号化処理部２１は、上記のように格納場所を変更する処理を複数回繰り返してもよい。例えば、リソース領域に格納される画像データが、ＪＰＥＧ（Joint Photographic Experts Group）ファイルの場合、暗号化処理部２１は、予め定められた手順で、当該ファイルの形式を保ち、しかも、画像に見た目上は影響しないデータ、あるいは、画像に全く影響しないデータとして、上記暗号化されたデータシーケンスを含む画像ファイルを生成してもよい。この場合、暗号解除部５１は、リソース領域の画像データから、予め定められた手順で、暗号化されたデータシーケンスを抽出できる。
【００７７】
より一般的に説明すると、暗号化処理部２１および暗号解除部５１は、以下のように動作してもよい。すなわち、０以上の任意の整数をｉ、上記暗号化されたデータシーケンスを、０次の上記暗号化されたデータシーケンス、ｉ次のデータシーケンスをダミープログラムに関連する特定データ（例えば、メタデータやリソース領域のデータなど）として当該ダミープログラムに付加する処理によって生成されるデータを、（ｉ＋１）次の暗号化されたデータシーケンスとする。また、上記のようにして、ｉ次のデータシーケンスから（ｉ＋１）次の暗号化されたデータシーケンスを生成する処理を、ステルス化処理とし、（ｉ＋１）次の暗号化されたデータシーケンスから、上記特定データとしてのｉ次の暗号化されたデータシーケンスを抽出する処理を抽出処理とする。
【００７８】
さらに、ｎを予め１以上に定められた整数とするとき、上記暗号化処理部２１は、上記暗号化されたデータシーケンス（０次の暗号化されたデータシーケンス）に対して、ｎ回ステルス化処理して、ｎ次の暗号化されたデータシーケンスを生成し、上記第２領域に格納する。一方、暗号解除部５１は、当該第２の領域に格納されたデータに対して、上記ｎ回、上記抽出処理を繰り返すことによって、上記暗号化されたデータシーケンスを読み出して復号する。
【００７９】
当該構成では、第２領域内には、さらに、第１および第２領域が含まれており、入れ子構造が形成されている。したがって、実際に使用するＭＳＩＬコードを、より多くのダミープログラムによって隠蔽することができる。この結果、プログラミングシステム１の安全性をさらに向上できる。
【００８０】
また、上記暗号化処理部２１が第１および第２の暗号化方法を組み合わせて暗号化する場合について説明したが、これに限るものではなく、可逆の暗号化方法であれば、例えば、共通鍵暗号方式、公開鍵方式、あるいは、置換方式など、種々の暗号化方法（あるいは、それらの組み合わせ）を使用できる。より具体的には、例えば、ＲＳＡ（Rivest Shamir Adleman ）、３ＤＥＳ（Triple Data Encryption Standard ）、楕円方式などの暗号化方式が挙げられる。
【００８１】
さらに、上記では、暗号化処理部２１が暗号化した情報を復号するための情報を暗号解除部５１が予め記憶している場合（実施形態では、復号アルゴリズムとして記憶）について説明したが、これに限るものではない。例えば、偽のソースコードを難読化しておき、その中の文字列などとして、あるいは、上記第２領域に格納するデータ（メタデータなど）などとして、復号するための情報（共通鍵暗号方式の場合は、共通鍵データ）を、クラスファイル内（データシーケンスＤ１中）に記憶していてもよい。
【００８２】
以上のように、本実施形態に係るプログラム実行装置３は、中間言語のプログラムを複数の部分（例えば、クラスやモジュールあるいはアセンブリなど）に分割して管理すると共に、プログラム実行時に各部分の要否を判定する制御部４３と、上記制御部４３によって必要と判断された部分を、上記プログラムの各部分を暗号化して記憶する記憶部３１から読み出して復号する暗号解除部５１と、上記暗号解除部５１が復号した上記プログラムの部分をプログラム実行装置３のメモリにロードするクラスローダ４１と、当該ロードされたプログラムの部分を、プログラム実行装置３のプロセッサ（ＣＰＵなど）にネイティブな機械語に変換した後で実行する実行装置側コンパイラ４２とを備えている。
【００８３】
上記構成において、制御部４３は、例えば、ソースコードをコンパイルするなどして生成された中間言語のプログラムを複数の部分に分割して管理すると共に、プログラム実行時に、例えば、当該プログラムの部分を実行する可能性があるか否かなどを判定して、各部分の要否（当該部分をメモリにロードする必要があるか否か）を判定している。
【００８４】
上記制御部４３が、ある部分を必要と判断すると、暗号解除部５１は、暗号化された上記プログラムの各部分を記憶部３１から読み出して復号し、クラスローダ４１は、復号された上記プログラムの部分をメモリにロードする。さらに、実行装置側コンパイラ４２は、当該ロードされたプログラムの部分を、プログラム実行装置３のプロセッサにネイティブな機械語に変換した後で実行する。
【００８５】
当該構成では、記憶部３１に格納されている状態（例えば、クラスファイルの状態）では、プログラムの部分が暗号化されているので、第三者による当該プログラムの部分の内容解読を妨害できる。また、上記構成では、制御部４３がプログラム実行時に各部分の要否を動的に判定すると共に、上記暗号解除部５１は、上記制御部４３によって必要と判断された部分を復号する。したがって、暗号化されたプログラムを全て復号してメモリにロードする構成と比較して、各部分が復号される回数と、復号される部分の数との双方を低減できる。したがって、第三者によるプログラムの内容解析をさらに困難にすることができる。これらの結果、よりプログラムの内容を第三者が取得しにくく、より安全なプログラム実行装置３を実現できる。
【００８６】
さらに、上記構成に加えて、上記暗号解除部５１は、上記プログラム実行装置３にネイティブな機械語で記述されており、上記プログラム実行装置３のプロセッサは、上記実行装置側コンパイラ４２による、中間言語から機械語への変換処理を介することなく、上記暗号解除部５１の機械語を実行することによって、上記暗号解除部５１として動作してもよい。
【００８７】
当該構成では、上記暗号解除部５１が上記中間言語よりも内容を把握しにくい機械語で記述されている。したがって、第三者によるプログラムの内容解析をさらに困難にすることができ、プログラム実行装置３の安全性をさらに向上できる。
【００８８】
さらに、上記構成に加えて、上記プログラム実行装置３のメモリには、当該プログラム実行装置３のオペレーティングシステム、デバイスドライバおよびデバイスの少なくとも一つからのみアクセス可能な特定領域（例えば、ＯＳのメモリ領域、デバイスドライバのメモリ領域またはデバイス領域など）と、上記オペレーティングシステム上で動作するアプリケーションプログラムからアクセス可能な通常領域とが設けられており、上記暗号解除部５１は、上記部分の変換により生成したネイティブな機械語のプログラムを、上記特定領域に設けられた領域を介して、上記クラスローダ４１へ与えてもよい。
【００８９】
当該構成に係る暗号解除部５１は、上記部分の変換により生成したネイティブな機械語のプログラムを、上記特定領域に設けられた領域を介して、上記クラスローダ４１へ与えるので、アプリケーションプログラムが当該領域を監視して復号後のプログラムの部分を取得することを防止できる。この結果、第三者によるプログラムの内容解析をさらに困難にすることができ、プログラム実行装置３の安全性をさらに向上できる。なお、上記ネイティブな機械語の部分は、プラットフォームに依存するが、暗号解除部５１を実現するためのプログラムの規模は、業務システムや開発アプリケーションなど、上記各クラスファイルによって実現されるプログラムの規模に比べて大幅に小さい。したがって、いずれのプラットフォーム上でも実行できるように、当該暗号解除部５１を実現するためのプログラムを、各プラットフォーム毎のネイティブコードへコンパイルし、それらを全て含んだ状態で配布しても、プログラムサイズの増大を抑えることができる。
【００９０】
なお、上記では、暗号解除部５１がダンププログラムの動作を検出すると、自らの動作を停止する構成について説明したが、これに限るものではなく、ダンププログラムへ停止信号を送るなどして、ダンププログラムを停止させてもよい。
【００９１】
すなわち、上記構成に加えて、暗号解除部５１は、上記プログラム実行装置３のメモリの内容をダンプするダンププログラムが動作しているか否かを監視し、ダンププログラムの動作を検出すると、当該ダンププログラムおよび上記暗号解除部５１の少なくとも一方の動作を停止させてもよい。
【００９２】
当該構成に係る暗号解除部５１は、上記ダンププログラムが動作していることを検出すると、当該ダンププログラムおよび上記暗号解除部５１の少なくとも一方の動作を停止させる。したがって、ダンププログラムがメモリの内容をダンプして復号後のプログラムの部分を取得することを防止できる。この結果、第三者によるプログラムの内容解析をさらに困難にすることができ、プログラム実行装置３の安全性をさらに向上できる。
【００９３】
さらに、上記構成に加えて、上記クラスローダ４１は、暗号化されていない中間言語のプログラムの部分もメモリにロード可能であり、暗号化されているか否かに拘わらず、上記記憶部３１の記憶領域のうち、上記プログラムの各部分を格納する領域（例えば、クラスファイルの記憶領域）には、プログラムを格納するための第１領域（コード領域）と、当該プログラムに関連するデータを格納するための第２領域（例えば、メタデータ領域やリソース領域など）とが含まれており、暗号化されている場合は、上記第１領域には、ダミープログラムが格納され、上記暗号化されたプログラムの部分は、上記第２領域に格納されていると共に、上記暗号解除部５１は、暗号化されたプログラムの部分を、上記記憶部３１の第２領域から読み出して復号してもよい。なお、上記では、当該ダミープログラムがＭＳＩＬコードから構成されている場合を例にして説明したが、これに限るものではなく、ネイティブコードで記述されていてもよい。
【００９４】
当該構成では、暗号化されている場合も、暗号化されていない場合と同様、第１領域および第２領域を含む領域に、プログラムの部分が格納される。ただし、暗号化されている場合、本来は、プログラムが格納されるべき第１領域には、ダミープログラムが格納されており、暗号解除部５１は、第２領域から暗号化されたプログラムの部分を読み出す。
【００９５】
上記構成では、暗号化されている場合も暗号化されていない場合も、記憶部３１にプログラムの部分を格納する際の形式は、互いに同じ形式（第１および第２領域を含む形式；例えば、クラスファイルの形式など）であり、暗号化されている場合、第１領域には、ダミープログラムが格納されている。したがって、暗号化されていることを第三者が気付き難くすることができ、プログラム実行装置３の安全性をさらに向上できる。
【００９６】
また、以上のように、本実施形態に係るプログラム開発装置２は、上記構成のプログラム実行装置３により実行されるプログラムの部分を生成するための情報処理装置であって、中間言語のプログラムの部分を、上記プログラム実行装置３の暗号解除部５１が復号可能な形式で暗号化する暗号化処理部２１を備えている。また、本実施形態に係るプログラミングシステム１は、上記復号するプログラム実行装置３のいずれかと、中間言語のプログラムの部分を、上記プログラム実行装置３の暗号解除部５１が復号可能な形式で暗号化する暗号化処理部２１とを備えていることを特徴としている。
【００９７】
当該構成でも、上記暗号化処理部２１によって暗号化されたプログラムの部分が必要と判断されると、当該暗号化されたプログラムの部分は、上記暗号解除部５１によって復号されて、クラスローダ４１によってロードされ、実行装置側コンパイラ４２により実行される。したがって、上述したように、よりプログラムの内容を第三者が取得しにくく、プログラム開発装置２およびプログラム実行装置３を含むプログラミングシステム１の安全性を向上できる。
【産業上の利用可能性】
【００９８】
本発明によれば、プログラム実行時にプログラムの各部分の要否が動的に判定され、必要と判断された部分が復号されるので、よりプログラムの内容を第三者が取得しにくく、より安全な情報処理装置が実現されるので、制御システムにおいてデバイスの状態を表示すると共にデバイスへの指示を受け付ける制御用表示装置をはじめとして、種々のプログラム実行装置、並びに、そのプログラムを生成するプログラム実行装置として広く好適に使用できる。
【図面の簡単な説明】
【００９９】
【図１】本発明の実施形態を示すものであり、プログラミングシステムの要部構成を示すブロック図である。
【図２】上記プログラミングシステムに設けられたプログラム開発装置およびプログラム実行装置に格納される、暗号化されたデータシーケンスのデータ構造の例を示す図面である。
【図３】上記プログラム実行装置の動作を示すフローチャートである。
【符号の説明】
【０１００】
１    プログラミングシステム（情報処理システム）
２    プログラム開発装置（情報処理装置）
３    プログラム実行装置（情報処理装置）
２１    暗号化処理部（暗号化手段）
３１    記憶部（記憶装置）
４１    クラスローダ（プログラムローダ）
４２    実行装置側コンパイラ（プログラム実行手段）
４３    制御部（判定手段）
５１    暗号解除部（復号手段；監視手段）
【図１】
0004727366.tif 000002
【図２】
0004727366.tif 000003
【図３】
0004727366.tif 000004