(57)【特許請求の範囲】
【請求項１】
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成するプログラム変換装置であって、
コンピュータに対する複数の命令から構成されている原プログラムを記憶している記憶手段と、
前記原プログラムを難読化して難読プログラムを生成する難読化手段と、
セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成する生成手段と、
前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
前記生成手段は、前記難読プログラムの難読化を弱める変換を示す変換情報を生成する
ことを特徴とする請求項１に記載プログラム変換装置。
【請求項３】
前記生成手段は、難読化手段が難読化に用いた情報に基づいて、難読化を弱める変換を示す前記変換情報を生成する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項４】
前記記憶手段が記憶している原プログラムは、１個以上の命令から構成されるサブプログラムを含み、
前記難読化手段は、
前記原プログラムに含まれる前記サブプログラムを分割して複数の部分プログラムを生成する分割部と、
生成された前記複数の部分プログラムをそれぞれ難読化して、前記難読プログラムとして、複数の難読化部分プログラムを生成する難読化部とを含み、
前記生成手段は、前記変換情報として、複数の前記部分プログラムの統合を示す統合情報を暗号化して暗号化統合情報を生成し、
前記出力手段は、複数の前記難読化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項５】
前記難読化部は、生成された前記複数の部分プログラムをそれぞれ暗号化して、前記複数の難読化部分プログラムとして、複数の暗号化部分プログラムを生成し、
前記出力手段は、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力する
ことを特徴とする請求項４に記載のプログラム変換装置。
【請求項６】
前記生成手段は、変換情報鍵を用いて、前記統合情報を暗号化する
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項７】
前記暗号化部は、プログラム鍵を用いて、各部分プログラムを暗号化する
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項８】
前記記憶手段が記憶している原プログラムは、１個以上の命令から構成されるサブプログラムを含み、
前記難読化手段は、
前記原プログラムに含まれる前記サブプログラムを分割して複数の部分プログラムを生成する分割部と、
生成された前記複数の部分プログラムをそれぞれ暗号化して、前記難読プログラムとして、複数の暗号化部分プログラムを生成する暗号化部とを含み、
前記生成手段は、前記変換情報として、セキュリティレベルに対応するセキュリティレベル鍵を用いて、複数の前記部分プログラムの統合を示す統合情報をそれぞれ暗号化して暗号化統合情報を生成し、
前記出力手段は、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項９】
前記難読化手段は、前記原プログラムに、冗長な１個以上の命令から構成され冗長ブロックを挿入して、前記難読プログラムを生成し、
前記生成手段は、前記変換情報として、前記配布プログラムにおける前記冗長ブロックの挿入位置を示す位置情報を暗号化して暗号化位置情報を生成し、
前記出力手段は、冗長ブロックの挿入された難読プログラム及び前記暗号化位置情報を含む前記配布プログラムを出力する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項１０】
前記生成手段は、変換情報鍵を用いて、前記位置情報を暗号化する
ことを特徴とする請求項９に記載のプログラム変換装置。
【請求項１１】
前記難読化手段は、前記原プログラムに、当該原プログラムの一部分の改竄を検出する検査用プログラムを挿入して、前記難読プログラムを生成し、
前記生成手段は、前記変換情報として、前記原プログラムにおける前記検査用プログラムの挿入位置を示す位置情報及び前記検査用プログラムによる改竄の検出の動作を無効化した無効化プログラムからなる検査情報を暗号化して暗号化検査情報を生成し、
前記出力手段は、検査用プログラムの挿入された難読プログラム及び前記暗号化検査情報を含む前記配布プログラムを出力する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項１２】
前記生成手段は、変換情報鍵を用いて、前記検査情報を暗号化する
ことを特徴とする請求項１１に記載のプログラム変換装置。
【請求項１３】
配布プログラムに従って動作するプログラム実行装置であって、
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成するプログラム変換装置であって、コンピュータに対する複数の命令から構成されている原プログラムを記憶し、前記原プログラムを難読化して難読プログラムを生成し、セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成し、前記難読プログラムと前記変換情報とからなる配布プログラムを出力するプログラム変換装置により生成された前記配布プログラムを記憶している記憶手段と、
前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得手段と、
自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化強度を変更する変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成手段と、
生成された固有プログラムに従って動作するプロセッサと、
を備えることを特徴とするプログラム実行装置。
【請求項１４】
前記記憶手段は、前記難読プログラムの難読化を弱める変換を示す変換情報を生成する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記生成手段は、前記配布プログラムに含まれる難読プログラムに、難読化を弱める変換を施す
ことを特徴とする請求項１３に記載のプログラム実行装置。
【請求項１５】
前記記憶手段は、生成された前記複数の部分プログラムをそれぞれ暗号化して、前記複数の難読化部分プログラムとして、複数の暗号化部分プログラムを生成し、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、前記変換情報としての前記暗号化統合情報の復号を試み、
前記生成手段は、前記暗号化統合情報の復号ができた場合に、得られた統合情報により統合が示される複数の部分プログラムについて、対応する複数の暗号化部分プログラムを復号して、前記固有プログラムの一部として、複数の部分プログラムを生成し、
前記プロセッサは、生成した複数の前記部分プログラムを含む前記固有プログラムに従って動作する
ことを特徴とする請求項１４に記載のプログラム実行装置。
【請求項１６】
前記記憶手段は、変換情報鍵を用いて、前記統合情報を暗号化する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、変換情報鍵を用いて、前記暗号化統合情報を復号する
ことを特徴とする請求項１５に記載のプログラム実行装置。
【請求項１７】
前記記憶手段は、プログラム鍵を用いて、各部分プログラムを暗号化する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記生成手段は、プログラム鍵を用いて、前記暗号化プログラムを復号する
ことを特徴とする請求項１５に記載のプログラム実行装置。
【請求項１８】
前記記憶手段は、前記原プログラムは、１個以上の命令から構成されるサブプログラムを含み、前記原プログラムに含まれる前記サブプログラムを分割して複数の部分プログラムを生成し、生成された前記複数の部分プログラムをそれぞれ暗号化して、前記難読プログラムとして、複数の暗号化部分プログラムを生成し、前記変換情報として、セキュリティレベルに対応するセキュリティレベル鍵を用いて、複数の前記部分プログラムの統合を示す統合情報をそれぞれ暗号化して暗号化統合情報を生成し、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、自装置が保持するセキュリティレベル鍵を用いて、前記変換情報としての前記暗号化統合情報の復号を試み、
前記生成手段は、前記暗号化統合情報の復号ができた場合に、得られた統合情報により統合が示される複数の部分プログラムについて、対応する複数の暗号化部分プログラムを復号して、前記固有プログラムの一部として、複数の部分プログラムを生成し、
前記プロセッサは、生成した複数の前記部分プログラムを含む前記固有プログラムに従って動作する
ことを特徴とする請求項１４に記載のプログラム実行装置。
【請求項１９】
前記記憶手段は、前記原プログラムに、冗長な１個以上の命令から構成され冗長ブロックを挿入して、前記難読プログラムを生成し、前記変換情報として、前記配布プログラムにおける前記冗長ブロックの挿入位置を示す位置情報を暗号化して暗号化位置情報を生成し、冗長ブロックの挿入された難読プログラム及び前記暗号化位置情報を含む前記配布プログラムを出力する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、前記変換情報としての前記暗号化位置情報の復号を試み、
前記生成手段は、前記暗号化位置情報の復号ができた場合に、前記配布プログラムにおいて、得られた位置情報により示される位置に格納されている命令を無効化し、
前記プロセッサは、無効化された命令を含む前記固有プログラムに従って動作する
ことを特徴とする請求項１４に記載のプログラム実行装置。
【請求項２０】
前記記憶手段は、変換情報鍵を用いて、前記位置情報を暗号化する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、変換情報鍵を用いて、前記暗号化位置情報を復号する
ことを特徴とする請求項１９に記載のプログラム実行装置。
【請求項２１】
前記記憶手段は、前記原プログラムに、当該原プログラムの一部分の改竄を検出する検査用プログラムを挿入して、前記難読プログラムを生成し、前記変換情報として、前記原プログラムにおける前記検査用プログラムの挿入位置を示す位置情報及び前記検査用プログラムによる改竄の検出の動作を無効化した無効化プログラムからなる検査情報を暗号化して暗号化検査情報を生成し、検査用プログラムの挿入された難読プログラム及び前記暗号化検査情報を含む前記配布プログラムを出力する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、前記変換情報としての前記暗号化検査情報の復号を試み、
前記生成手段は、前記暗号化検査情報の復号ができた場合に、前記配布プログラムにおいて、生成された検査情報に含まれる位置情報により示される位置に格納されている命令を、生成された検査情報に含まれる無効化プログラムに置き換え、
前記プロセッサは、前記無効化プログラムを含む前記固有プログラムに従って動作する
ことを特徴とする請求項１４に記載のプログラム実行装置。
【請求項２２】
前記記憶手段は、変換情報鍵を用いて、前記検査情報を暗号化する前記プログラム変換装置により生成された前記配布プログラムを記憶しており、
前記取得手段は、変換情報鍵を用いて、前記暗号化検査情報を復号する
ことを特徴とする請求項２１に記載のプログラム実行装置。
【請求項２３】
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成し、コンピュータに対する複数の命令から構成されている原プログラムを記憶しているプログラム変換装置で用いられるプログラム変換方法であって、
難読化手段により、前記原プログラムを難読化して難読プログラムを生成する難読化ステップと、
生成手段により、セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成する生成ステップと、
出力手段により、前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力ステップと
を含むことを特徴とするプログラム変換方法。
【請求項２４】
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成し、コンピュータに対する複数の命令から構成されている原プログラムを記憶しているプログラム変換装置で用いられるプログラム変換プログラムであって、
前記コンピュータに、
難読化手段により、前記原プログラムを難読化して難読プログラムを生成する難読化ステップと、
生成手段により、セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成する生成ステップと、
出力手段により、前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力ステップと
を実行させるためのプログラム変換プログラム。
【請求項２５】
前記プログラム変換プログラムは、コンピュータ読み取り可能な記録媒体に記録されている
ことを特徴とする請求項２４に記載のプログラム変換プログラム。
【請求項２６】
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成する集積回路であって、
コンピュータに対する複数の命令から構成されている原プログラムを記憶している記憶手段と、
前記原プログラムを難読化して難読プログラムを生成する難読化手段と、
セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成する生成手段と、
前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力手段と
を備えることを特徴とする集積回路。
【請求項２７】
請求項１のプログラム変換装置により生成された配布プログラムに従って動作するプログラム実行装置で用いられるプログラム実行方法てあって、
取得手段により、前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得ステップと、
生成手段により、自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化強度を変更する変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成ステップと、
処理手段により、生成された固有プログラムに従って動作する処理ステップと
を含むことを特徴とするプログラム実行方法。
【請求項２８】
請求項１のプログラム変換装置により生成された配布プログラムに従って動作するプログラム実行装置で用いられるプログラム実行用プログラムてあって、
コンピュータである前記プログラム実行装置に、
取得手段により、前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得ステップと、
生成手段により、自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化強度を変更する変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成ステップと、
処理手段により、生成された固有プログラムに従って動作する処理ステップと
を実行させるためのプログラム実行用プログラム。
【請求項２９】
前記プログラム実行用プログラムは、コンピュータ読み取り可能な記録媒体に記録されている
ことを特徴とする請求項２８に記載のプログラム実行用プログラム。
【請求項３０】
配布プログラムに従って動作する集積回路であって、
請求項１のプログラム変換装置により生成された配布プログラムを記憶している記憶手段と、
前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得手段と、
自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化強度を変更する変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成手段と、
生成された固有プログラムに従って動作するプロセッサと、
を備えることを特徴とする集積回路。
【請求項３１】
１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成するプログラム変換装置と、前記配布プログラムに従って動作するプログラム実行装置とから構成されるシステムであって、
前記プログラム変換装置は、
コンピュータに対する複数の命令から構成されている原プログラムを記憶している記憶手段と、
前記原プログラムを難読化して難読プログラムを生成する難読化手段と、
セキュリティレベルに対応付けて前記難読プログラムの難読化強度を変更する変換を示す変換情報を生成する生成手段と、
前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力手段とを備え、
前記プログラム実行装置は、
請求項１のプログラム変換装置により生成された配布プログラムを記憶している記憶手段と、
前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得手段と、
自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化強度を変更する変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成手段と、
生成された固有プログラムに従って動作するプロセッサとを備える
ことを特徴とするシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの不正な解析、改ざんを防止するためプログラムを難読化する技術及び難読化されたプログラムを保護しながら実行する技術に関する。
【背景技術】
【０００２】
従来より、コンピュータプログラムの不正な解析、改ざんを防止するため、プログラムを難読化する様々な技術が開示されている。
特許文献１によると、ソフトウェアのセキュリティを増強するための混乱化技術を提供することを目的として、コンピュータが実施するコードを混乱化するための方法であって、混乱化すべきコードのサブセットを選択する段階、適用すべき混乱化変換を選択する段階、及び変換を適用する段階を含んで成り、変換されたコードは未変換コードに対する弱い等価性を提供する方法を開示している。
【０００３】
また、特許文献２によると、ライブラリに対する認証機能により正規のライブラリとのリンク機能を実現して、結果的にライブラリの偽造防止を図ることを目的として、ダイナミック・リンク・ライブラリ機能を有するコンピュータシステムにおいて、メインプログラムは認証用関数に含まれるデータ生成部から認証用データとキーデータをデータ加工部に入力すると共に、ＤＬＬの認証用関数に含まれるデータ加工部に同一の認証用データとキーデータを与え、メインプログラム側のデータ比較部は、各データ加工部から得られた第１と第２の加工処理データとを比較し、一致した場合にＤＬＬを正規のライブラリとして認証する技術を開示している。
【０００４】
また、特許文献３によると、プログラムが改竄されることなく暗号化・復号化を効率的に行うことができるシステムを提供することを目的として、イニシャルプログラムIPにより、パーワードが合致すると情報処理装置からICカードへ暗号化された暗／復号化処理プログラムPr1,Pr2,…が送信され、ICカードはこのプログラムを正当使用者の復号化鍵にて復号化し送り返し、情報処理装置はこのプログラムを作業メモリ領域PAに配置して起動しデータの暗／復号化処理を行う技術を開示している。この技術によると通常、プログラムは暗号化されているので第三者により解析されず改竄もできない。正当使用者がデータの処理を完了した後はその平文のプログラムは消去されるため、処理後も平文のプログラムは残っていず、プログラムの安全性が確保される。このため暗号化／復号化処理毎にプログラムの記憶媒体を保管場所から取り出して情報処理装置にセットする作業をしなくても良く効率的に暗号化作業ができる。
【０００５】
さらに、特許文献４によると、復号支援プログラムの改竄により、暗号でプロテクトしたデータが不正に流用されることを防止することを目的として、復号指示を受けた復号装置は、ＣＰＵの動作を一時停止させ、アドレス検出部は、ＣＰＵのメモリアクセスを監視し、復号指示発行の命令コードの格納アドレスＰｒを取得し、暗号認証部は、暗号鍵の認証を行い、復号支援プログラム認証部は、暗号鍵から検証範囲指定（ｐｒｅ、ｐｏｓｔ）を取得し、Ｐｒ−ｐｒｅからＰｒ＋ｐｏｓｔまでの領域について、一方向ハッシュ関数を用いたメッセージ要約数を算出し、この算出結果を、暗号鍵中のメッセージ要約数と比較し、復号支援プログラムの正当性を認証し、認証成功時、データ復号部が、暗号鍵から暗号の復号鍵を取得し、暗号化データを復号する技術を開示している。
【特許文献１】
特表２００２−５１４３３３号公報
【特許文献２】
特開平１１−１１０１９３号公報
【特許文献３】
特開平９−６２３２号公報
【特許文献４】
特開平１１−３９１５６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
上記のように、様々なプログラム保護のための技術が提案されているが、プログラムを実行する機器が備えるセキュリティ機能やその強度、例えば、メモリの覗き見を防ぐ機能や、デバッガ等の解析ツールが使えないように無効化する機能は、機器によってそれぞれ異なるので、プログラムの不正な解析や改竄を防止するために、プログラムを難読化する場合、セキュリティ機能の異なる機器毎に、機器のセキュリティ機能に応じて難読化の方法を変えて難読化プログラムを生成しなければならない。しかし、セキュリティ機能やその強度の異なる複数の装置に対して、それぞれ異なるプログラムを生成し、管理することは、非常にわずらわしいという問題がある。
【課題を解決するための手段】
【０００７】
上記の問題点を解決するために、本発明は、セキュリティ機能やその強度の異なる複数の装置において、それぞれ、適切なセキュリティを保ちながら、実行できるただ１個の配布プログラムを生成するプログラム生成装置、前記配布プログラムを実行するプログラム実行装置、方法、コンピュータプログラム及び記録媒体を提供することを目的とする。
上記目的を達成するために、本発明は、１個の原プログラムから、異なるセキュリティレベルを備える複数のプログラム実行装置において実行されるただ１個の配布プログラムを生成するプログラム変換装置であって、コンピュータに対する複数の命令から構成されている原プログラムを記憶している記憶手段と、前記原プログラムを難読化して難読プログラムを生成する難読化手段と、セキュリティレベルに対応付けて前記難読プログラムの難読化を弱める変換を示す変換情報を生成する生成手段と、前記難読プログラムと前記変換情報とからなる配布プログラムを出力する出力手段とを備えることを特徴とする。また、本発明は、配布プログラムに従って動作するプログラム実行装置であって、前記プログラム変換装置により生成された配布プログラムを記憶している記憶手段と、前記配布プログラムから、自装置のセキュリティレベルに対応する変換情報の取得を試みる取得手段と、自装置のセキュリティレベルに対応する変換情報が取得できた場合に、取得した前記変換情報を用いて、前記配布プログラムに含まれる難読プログラムに、難読化を弱める変換を施して、自装置のセキュリティレベルに対応する固有プログラムを生成する生成手段と、生成された固有プログラムに従って動作するプロセッサとを備えることを特徴とする。
【発明の効果】
【０００８】
この構成によると、配布プログラムは、難読プログラムと、セキュリティレベルに対応し前記難読プログラムの難読化を弱める変換情報とを含むので、プログラム生成装置により、ただ１個の配布プログラムを生成するだけで、プログラム実行装置において、難読プログラムを、変換情報を用いて、自装置のセキュリティレベルに対応する固有プログラムを生成して用いることができる。
【０００９】
ここで、前記記憶手段が記憶している原プログラムは、１個以上の命令から構成されるサブプログラムを含み、前記難読化手段は、前記原プログラムに含まれる前記サブプログラムを分割して複数の部分プログラムを生成する分割部と、生成された前記複数の部分プログラムをそれぞれ難読化して、前記難読プログラムとして、複数の難読化部分プログラムを生成する難読化部とを含み、前記生成手段は、前記変換情報として、複数の前記部分プログラムの統合を示す統合情報を暗号化して暗号化統合情報を生成し、前記出力手段は、複数の前記難読化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力するとしてもよい。前記難読化部は、生成された前記複数の部分プログラムをそれぞれ暗号化して、前記複数の難読化部分プログラムとして、複数の暗号化部分プログラムを生成し、前記出力手段は、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力するとしてもよい。
【００１０】
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、前記変換情報としての前記暗号化統合情報の復号を試み、前記生成手段は、前記暗号化統合情報の復号ができた場合に、得られた統合情報により統合が示される複数の部分プログラムについて、対応する複数の暗号化部分プログラムを復号して、前記固有プログラムの一部として、複数の部分プログラムを生成し、前記プロセッサは、生成した複数の前記部分プログラムを含む前記固有プログラムに従って動作するとしてもよい。
【００１１】
この構成によると、プログラム生成装置により、複数の部分プログラムの統合情報を暗号化して暗号化統合情報を生成し、プログラム実行装置により、暗号化統合情報を復号して統合情報の生成ができれば、生成した統合情報を用いて、複数の部分プログラムを統合して用いることができるので、プログラム実行装置における復号の回数を削減して、当該装置の負荷を軽減することができる。
【００１２】
ここで、前記生成手段は、変換情報鍵を用いて、前記統合情報を暗号化するとしてもよい。
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、変換情報鍵を用いて、前記暗号化統合情報を復号するとしてもよい。
【００１３】
この構成によると、プログラム生成装置により、変換情報鍵を用いて、統合情報を暗号化し、プログラム実行装置により、変換情報鍵を用いて、暗号化統合情報を復号するので、変換情報鍵を保持しているプログラム実行装置においてのみ、複数の部分プログラムを統合して用いることができるよう制御できる。
ここで、前記暗号化部は、プログラム鍵を用いて、各部分プログラムを暗号化するとしてもよい。
【００１４】
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記生成手段は、プログラム鍵を用いて、前記暗号化プログラムを復号するとしてもよい。
この構成によると、プログラム生成装置により、プログラム鍵を用いて、部分プログラムを暗号化し、プログラム実行装置により、プログラム鍵を用いて、暗号化部分プログラムを復号するので、プログラム鍵変換情報鍵を保持しているプログラム実行装置においてのみ、暗号化部分プログラムを復号できるように制御できる。
【００１５】
ここで、前記記憶手段が記憶している原プログラムは、１個以上の命令から構成されるサブプログラムを含み、前記難読化手段は、前記原プログラムに含まれる前記サブプログラムを分割して複数の部分プログラムを生成する分割部と、生成された前記複数の部分プログラムをそれぞれ暗号化して、前記難読プログラムとして、複数の暗号化部分プログラムを生成する暗号化部とを含み、前記生成手段は、前記変換情報として、セキュリティレベルに対応するセキュリティレベル鍵を用いて、複数の前記部分プログラムの統合を示す統合情報をそれぞれ暗号化して暗号化統合情報を生成し、前記出力手段は、複数の前記暗号化部分プログラム及び前記暗号化統合情報を含む前記配布プログラムを出力するとしてもよい。
【００１６】
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、自装置が保持するセキュリティレベル鍵を用いて、前記変換情報としての前記暗号化統合情報の復号を試み、前記生成手段は、前記暗号化統合情報の復号ができた場合に、得られた統合情報により統合が示される複数の部分プログラムについて、対応する複数の暗号化部分プログラムを復号して、前記固有プログラムの一部として、複数の部分プログラムを生成し、前記プロセッサは、生成した複数の前記部分プログラムを含む前記固有プログラムに従って動作するとしてもよい。
【００１７】
この構成によると、プログラム生成装置により、セキュリティレベルに対応するセキュリティレベル鍵を用いて、複数の部分プログラムの統合情報を暗号化して暗号化統合情報を生成し、プログラム実行装置により、保持するセキュリティレベル鍵を用いて、暗号化統合情報を復号して統合情報の生成ができれば、生成した統合情報を用いて、複数の部分プログラムを統合して用いることができるので、プログラム実行装置における復号の回数を削減して、当該装置の負荷を軽減することができる。
【００１８】
ここで、前記難読化手段は、前記原プログラムに、冗長な１個以上の命令から構成され冗長ブロックを挿入して、前記難読プログラムを生成し、前記生成手段は、前記変換情報として、前記配布プログラムにおける前記冗長ブロックの挿入位置を示す位置情報を暗号化して暗号化位置情報を生成し、前記出力手段は、冗長ブロックの挿入された難読プログラム及び前記暗号化位置情報を含む前記配布プログラムを出力するとしてもよい。
【００１９】
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、前記変換情報としての前記暗号化位置情報の復号を試み、前記生成手段は、前記暗号化位置情報の復号ができた場合に、前記配布プログラムにおいて、得られた位置情報により示される位置に格納されている命令を無効化し、前記プロセッサは、無効化された命令を含む前記固有プログラムに従って動作するとしてもよい。
【００２０】
この構成によると、プログラム生成装置により、冗長ブロックを挿入し、挿入位置を示す位置情報を暗号化して暗号化位置情報を生成し、プログラム実行装置により、暗号化位置情報を復号して位置情報の生成ができれば、生成した位置情報を用いて、冗長ブロックを無効化できるので、プログラム実行装置における負荷を軽減することができる。
ここで、前記生成手段は、変換情報鍵を用いて、前記位置情報を暗号化するとしてもよい。
【００２１】
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、変換情報鍵を用いて、前記暗号化位置情報を復号するとしてもよい。
この構成によると、プログラム生成装置により、変換情報鍵を用いて、位置情報を暗号化し、プログラム実行装置により、変換情報鍵を用いて、暗号化位置情報を復号するので、変換情報鍵を保持しているプログラム実行装置においてのみ、位置情報を知ることができるよう制御できる。
【００２２】
ここで、前記難読化手段は、前記原プログラムに、当該原プログラムの一部分の改竄を検出する検査用プログラムを挿入して、前記難読プログラムを生成し、前記生成手段は、前記変換情報として、前記原プログラムにおける前記検査用プログラムの挿入位置を示す位置情報及び前記検査用プログラムによる改竄の検出の動作を無効化した無効化プログラムからなる検査情報を暗号化して暗号化検査情報を生成し、前記出力手段は、検査用プログラムの挿入された難読プログラム及び前記暗号化検査情報を含む前記配布プログラムを出力するとしてもよい。
【００２３】
また、前記記憶手段は、前記のプログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、前記変換情報としての前記暗号化検査情報の復号を試み、前記生成手段は、前記暗号化検査情報の復号ができた場合に、前記配布プログラムにおいて、生成された検査情報に含まれる位置情報により示される位置に格納されている命令を、生成された検査情報に含まれる無効化プログラムに置き換え、前記プロセッサは、前記無効化プログラムを含む前記固有プログラムに従って動作するとしてもよい。
【００２４】
この構成によると、プログラム生成装置により、検査用プログラムを挿入し、挿入位置を示す位置情報及び無効化プログラムからなる検査情報を暗号化して暗号化検査情報を生成し、プログラム実行装置により、暗号化検査情報を復号して位置情報と無効化プログラムの生成ができれば、生成した位置情報と無効化プログラムを用いて、検査用プログラムを無効化プログラムに置き換えるので、プログラム実行装置における負荷を軽減することができる。
【００２５】
ここで、前記生成手段は、変換情報鍵を用いて、前記検査情報を暗号化するとしてもよい。
また、前記記憶手段は、前記プログラム変換装置により生成された前記配布プログラムを記憶しており、前記取得手段は、変換情報鍵を用いて、前記暗号化検査情報を復号するとしてもよい。
【００２６】
この構成によると、プログラム生成装置により、変換情報鍵を用いて、検査情報を暗号化し、プログラム実行装置により、変換情報鍵を用いて、暗号化検査情報を復号するので、変換情報鍵を保持しているプログラム実行装置においてのみ、検査情報を知ることができるよう制御できる。
以上説明したように、本発明のプログラム生成装置およびプログラム実行装置によれば、セキュリティ強度の異なる機器に対して同一のプログラムを配布することができる。また、配布先機器では、機器の有するセキュリティ強度に応じて、異なる変換情報を用いて、異なる難読化強度のプログラムを実行することができる。
【発明を実施するための最良の形態】
１．実施の形態
本発明に係る実施の形態としてのプログラム配布システム１０について説明する。
【００２７】
１．１  プログラム配布システム１０の構成
プログラム配布システム１０は、図１に示すように、プログラム変換装置１００、携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃから構成されている。
プログラム変換装置１００、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、それぞれ、インターネット２０に接続されており、携帯電話２００ａは、携帯電話網３０を介して、インターネット２０に接続されている。
【００２８】
プログラム変換装置１００は、例えば、音楽再生用のコンピュータプログラムである原プログラムに、難読化の変換処理を施して、配布プログラムを生成する。本実施の形態における難読化では、プログラム内の関数をサブモジュールに分割して暗号化する。プログラム変換装置１００は、生成した配布プログラムをインターネット２０及び携帯電話網３０を介して携帯電話２００ａへ送信し、生成した配布プログラムをインターネット２０を介してＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃへ送信する。
【００２９】
携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、それぞれ、受け取った配布プログラムに従って動作することにより、音楽を再生する。この場合にこれらの各装置は、実行時に必要な一部のサブモジュールのみを復号化して実行し、実行が終わった後は、これらのサブモジュールをメモリから消去することを繰り返す。
【００３０】
このような難読化を行うことにより生成した配布プログラムにおいて、平文プログラムの収集は困難であり、プログラムの解析が困難になる。
ここで、携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、セキュリティ強度がそれぞれ異なる。携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、それぞれの機器の有するセキュリティ強度に応じて異なる難読化強度で配布プログラムを実行する。なお、パーソナルコンピュータ２００ｃは、処理性能の高いＣＰＵを備えているが、セキュリティ強度が低い機器であると想定し、携帯電話２００ａ及びＤＶＤプレーヤ２００ｂは、処理性能の低いＣＰＵを備えているがセキュリティ強度が高い機器であると想定している。
【００３１】
１．２  プログラム変換装置１００の構成
プログラム変換装置１００は、図２に示すように、情報記憶部１０１、プログラム解析部１０２、難読化部１０３、制御部１０４、入力部１０５、表示部１０６、冗長処理生成部１０７、サブモジュール鍵保持部１０９、暗号化部１１０、変換情報鍵保持部１１１及び通信部１１２から構成されている。
【００３２】
プログラム変換装置１００は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、通信ユニット、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム変換装置１００を構成する各構成要素は、その機能の一部を達成する。
【００３３】
（１）サブモジュール鍵保持部１０９及び変換情報鍵保持部１１１
サブモジュール鍵保持部１０９は、予め、１個のサブモジュール鍵１２０を記憶している。ここで、サブモジュール鍵１２０は、暗号化の際に用いられる鍵情報であり、１２８ビット長である。ここで、暗号化の際に用いられるアルゴリズムは、一例として、秘密暗号方式であるＡＥＳ（Advanced Encryption Standard）である。
【００３４】
変換情報鍵保持部１１１は、予め、図３に一例として示す変換情報鍵テーブル１２１を有している。変換情報鍵テーブル１２１は、一例として、１００個の鍵情報を含んでいる。各鍵情報は、変換情報鍵ＩＤ及び変換情報鍵から構成される。
変換情報鍵ＩＤは、当該変換情報鍵ＩＤを含む鍵情報を一意に識別する識別情報である。
【００３５】
変換情報鍵は、暗号化の際に用いられる鍵情報であり、１２８ビット長である。ここで、暗号化の際に用いられるアルゴリズムは、一例として、ＡＥＳである。
図３に示すように、変換情報鍵テーブル１２１は、一例として、鍵情報１２２、１２３、１２４、・・・から構成されている。このうち、例えば、鍵情報１２２は、変換情報鍵ＩＤ１２５「００１」と、変換情報鍵１２６「０ｘ１２３４５４６・・・」である。
【００３６】
なお、本明細書及び図面において、「０ｘ１２３４５４６・・・」などは、「０ｘ」に続く「１２３４５６・・・」が１６進数による表現であることを示している。
（２）情報記憶部１０１
情報記憶部１０１は、図２に示すように、原プログラム１３０、配布プログラム５００、原関数情報テーブル１４０、冗長ブロック１６１、１６２、１６３、１６４、・・・、及びその他のコンピュータプログラム並びにその他のデータを記憶するための領域を備えており、情報記憶部１０１は、予め、原プログラム１３０及び冗長ブロック１６１、１６２、１６３、１６４、・・・を記憶している。
【００３７】
（ａ）原プログラム１３０
原プログラム１３０は、図４に示すように、所定の全体機能を達成するためのコンピュータプログラムであって、関数１３１及び１３５から構成されている。各関数は、前記全体機能のうちの部分機能を達成するためのひとまとまりのサブプログラムである。関数１３１は、処理ブロック１３２、処理ブロック１３３及び処理ブロック１３４から構成され、関数１３５は、処理ブロック１３６及び処理ブロック１３７から構成されている。各処理ブロックは、前記部分機能のうちのさらに、一部の機能を達成するためのプログラムであり、コンピュータに対する指令を示す命令コードが１個以上組み合わされて構成されたものである。
【００３８】
各関数には、当該関数を一意に識別する関数名が付されている。
（ｂ）冗長ブロック１６１、１６２、１６３、１６４、・・・
冗長ブロック１６１、１６２、１６３、１６４、・・・の一例を図５に示す。
各冗長ブロックは、原プログラム１３０を構成する各処理ブロック内に挿入されて用いられる。
【００３９】
冗長ブロック１６１、１６２、１６３、１６４、・・・は、命令コードが１個以上組み合わせされて構成されている。原プログラム１３０を構成する処理ブロック内に挿入されて用いられる場合に、冗長ブロックに含まれる命令コードによる演算が、挿入先の処理ブロック内の演算に、内容的に影響を及ぼすことはない。
冗長ブロックが挿入された原プログラム１３０内の処理ブロックは、当該処理ブロックの機能とは関係のない命令コードを含むことになるので、その結果、当該処理ブロックの解析は困難になる。
【００４０】
冗長ブロック１６１は、図５に示すように、整数型の変数を宣言する命令コードであり、具体的には、整数型の３個の変数「ｔｅｍｐ１」、変数「ｔｅｍｐ２」及び変数「ｔｅｍｐ３」を宣言している。このように、冗長ブロック１６１では、原プログラム１３０において使用されないと予想される特殊な変数名を宣言している。
冗長ブロック１６２は、変数「ｔｅｍｐ１」、変数「ｔｅｍｐ２」及び変数「ｔｅｍｐ３」を用いた演算を定義しており、３個の算術式から構成されている。冗長ブロック１６２においては、変数「ｔｅｍｐ１」、変数「ｔｅｍｐ２」及び変数「ｔｅｍｐ３」以外の変数は用いられていない。従って、冗長ブロック１６２において定義された演算が、挿入先の処理ブロックの演算に、内容的な影響を与えることはない。
【００４１】
冗長ブロック１６３は、冗長ブロック１６２と同様に、変数「ｔｅｍｐ１」、変数「ｔｅｍｐ２」、変数「ｔｅｍｐ３」を用いた演算を定義しており、３個の算術式から構成されている。冗長ブロック１６３において定義される演算は、冗長ブロック１６２において定義される演算とは、異なるものである。
冗長ブロック１６４は、冗長ブロック１６２と同様に、変数「ｔｅｍｐ１」、変数「ｔｅｍｐ２」、変数「ｔｅｍｐ３」を用いた演算を定義しており、３個の算術式から構成されている。冗長ブロック１６４において定義される演算は、冗長ブロック１６３及び１６４においてそれぞれ定義される演算とは、異なるものである。
【００４２】
冗長ブロック１６１は、変数の宣言文のみを含み、冗長ブロック１６２、１６３及び１６４は、それぞれ、変数の宣言文を含んでいない。このため、例えば、冗長ブロック１６１と１６２とが、組み合わされて、処理ブロックに挿入される。また、別の組合せは、冗長ブロック１６１と１６３とであり、さらに、別の組合せは、冗長ブロック１６１と１６４とである。これらの組合せが、処理ブロックに挿入される。
【００４３】
（ｃ）原関数情報テーブル１４０
原関数情報テーブル１４０は、プログラム解析部１０２による原プログラム１３０の解析により生成され、原プログラム１３０に含まれる関数に関する情報を含む。
原関数情報テーブル１４０は、図６に一例として示すように、原関数合計数１４１と、原関数合計数１４１により示される数の原関数情報１４２、１４３、・・・、１４４から構成される。
【００４４】
原関数合計数１４１は、原プログラム１３０に含まれる関数の合計数を示す。
原関数情報１４２、１４３、・・・、１４４は、それぞれ、原プログラム１３０に含まれる関数に対応している。
各原関数情報は、原関数名、開始位置、終了位置及び処理ブロック数から構成されている。
【００４５】
原関数名は、当該原関数名を含む原関数情報に対応する関数を識別する識別名である。
開始位置は、当該開始位置を含む原関数情報に対応する関数の先頭位置の、原プログラム１３０における存在位置を示す。
終了位置は、当該終了位置を含む原関数情報に対応する関数の最終位置の、原プログラム１３０における存在位置を示す。
【００４６】
処理ブロック数は、当該処理ブロック数を含む原関数情報に対応する関数内の処理ブロックの数を示す。
（ｄ）配布プログラム５００
配布プログラム５００は、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたコンピュータプログラムであり、原プログラム１３０に、後述する難読化の変換を施して生成されるコンピュータプログラムである。
【００４７】
配布プログラム５００は、図７に示すように、ヘッダ領域５０１、プログラム領域５０２及び変換情報領域５０３から構成されており、ヘッダ領域５０１には、一例として図８に示すヘッダ部５１０が格納され、プログラム領域５０２には、一例として図９に示す新プログラム５３０が格納され、変換情報領域５０３には、一例として図１１及び図１２に示す変換情報５５０が格納される。
【００４８】
なお、後述する難読化の変換が終了した後には、ヘッダ部５１０の内の一部の情報、新プログラム５３０内の全ての情報及び変換情報５５０の内の一部の情報については、暗号化されたものとなる。例えば、新プログラム５３０に含まれる全ての関数は、図１０に示すように、暗号化され、新プログラム５３０に代えて、複数の暗号化関数から構成される暗号化プログラム５４６が、プログラム領域５０２に格納される。ヘッダ部５１０の内で暗号化される一部の情報、及び変換情報５５０の内で暗号化される一部の情報の詳細については、後述する。
【００４９】
（ヘッダ部５１０のデータ構造）
ヘッダ部５１０は、図８に示すように、配布プログラムＩＤ５１１、バージョン情報５１２、関数情報５１３及び変換情報位置情報５２１から構成され、関数情報５１３は、関数の個数５１４、複数の関数位置情報５１５、５１６、・・・、５１７から構成される。また、各関数位置情報は、関数名、関数開始位置及び関数終了位置から構成される。
【００５０】
なお、図８において、括弧記号［  ］で囲まれた番号、例えば、「関数位置情報」の表記の直後に記載されている「＃１」は、複数の関数位置情報のうち、当該関数位置情報が何番目のものであるかを説明的に示すものであり、データ構造を構成するものではない。また、図８において、括弧記号（  ）で囲まれた記載事項は、当該項目の具体例を示すものである。例えば、配布プログラムＩＤ５１１の直後に記載されている（１）は、配布プログラムＩＤ５１１の具体例が、「１」であることを示している。また、例えば、バージョン情報５１２の直後に記載されている（１）は、バージョン情報５１２の具体例が、「１」であることを示している。これらの表現方法は、本願の他の図面において、他のデータ構造を示す場合においても採用している場合がある。
【００５１】
配布プログラムＩＤ５１１は、配布プログラム５００を一意に識別する識別情報であり、バージョン情報５１２は、配布プログラム５００が更新された場合における配布プログラムの世代を示す情報である。
関数の個数５１４は、配布プログラム５００内のプログラム領域５０２に格納されている新プログラム５３０が、いくつの関数を含むかを示す。
【００５２】
関数情報５１３は、関数の個数５１４により示される数の関数位置情報を含む。関数位置情報５１５、５１６、・・・、５１７は、それぞれ、新プログラム５３０に含まれる複数の関数に対応している。
関数位置情報に含まれる関数名は、当該関数位置情報に対応する関数を識別する識別名である。
【００５３】
関数位置情報に含まれる関数開始位置は、配布プログラム５００内における当該関数位置情報に対応する関数の先頭位置を示すアドレスである。配布プログラム５００内における位置は、配布プログラム５００の先頭位置を「０」として表現する。以下同様である。
関数位置情報に含まれる関数終了位置は、配布プログラム５００内における当該関数位置情報に対応する関数の最終位置を示すアドレスである。
【００５４】
図８に示すように、関数の個数５１４は、一例として、「７」の値を保持している。これは、配布プログラム５００内に、一例として、７個の関数が含まれていることを示している。
また、図８に示すように、関数位置情報５１５は、一例として、関数名５１８「Ｍｅｔｈｏｄ１」、関数開始位置５１９「２００」、関数終了位置５２０「２５０」を含む。これは、関数位置情報５１５に対応する関数を識別する関数名が「Ｍｅｔｈｏｄ１」であり、当該関数が、配布プログラム５００内において、アドレス「２００」により示される位置から、アドレス「２５０」により示される位置までの間に配置されているこを示している。
【００５５】
変換情報位置情報５２１は、配布プログラム５００内における変換情報領域５０３の先頭位置を示すアドレスである。
（新プログラム５３０のデータ構造）
新プログラム５３０は、一例として図９に示すように、関数５３０ａ、５３０ｂ、５３０ｃ、５３０ｄ、５３０ｅ、５３０ｆ及び５３０ｇから構成されている。
【００５６】
関数５３０ａは、図９に示すように、関数呼出命令５３１、冗長ブロック５３２、関数呼出命令５３３、冗長ブロック５３４、関数呼出命令５３５及び冗長ブロック５３６を含んでいる。
関数呼出命令は、当該関数呼出命令中に記載された関数名により識別される関数を実行することを示す命令コードである。
【００５７】
冗長ブロックは、上述したように、関数５３０ａの目的とする演算に影響を与えない演算を行う命令コード群を含む。
関数５３０ｂは、処理ブロック５３８を含む。処理ブロック５３８は、所定の機能を達成するための命令コード群を含む。
関数５３０ｃ及び関数５３０ｄは、それぞれ、処理ブロック５３９及び処理ブロック５４０を含む。処理ブロック５３９及び処理ブロック５４０は、それぞれ、所定の機能を達成するための命令コード群を含む。
【００５８】
関数５３０ｅは、関数呼出命令５４４及び５４５を含む。
関数５３０ｆ及び関数５３０ｇは、それぞれ、処理ブロック５４２及び処理ブロック５４３を含む。処理ブロック５４２及び処理ブロック５４３は、それぞれ、所定の機能を達成するための命令コード群を含む。
（暗号化プログラム５４６のデータ構造）
暗号化プログラム５４６は、一例として図１０に示すように、暗号化関数５４６ａ、５４６ｂ、５４６ｃ、５４６ｄ、５４６ｅ、５４６ｆ及び５４６ｇから構成されている。
【００５９】
暗号化関数５４６ａ、５４６ｂ、５４６ｃ、５４６ｄ、５４６ｅ、５４６ｆ及び５４６ｇは、それぞれ、図９に示す関数５３０ａ、５３０ｂ、５３０ｃ、５３０ｄ、５３０ｅ、５３０ｆ及び５３０ｇに対応しており、サブモジュール鍵保持部１０９に記憶されているサブモジュール鍵１２０を鍵として用いて、関数５３０ａ、５３０ｂ、５３０ｃ、５３０ｄ、５３０ｅ、５３０ｆ及び５３０ｇのそれぞれに、ＡＥＳを施して生成されたものである。
【００６０】
平文にＡＥＳを施して暗号文が生成される場合、平文のビット長と暗号文のビット長とは同一であるので、暗号化関数５４６ａ、５４６ｂ、５４６ｃ、５４６ｄ、５４６ｅ、５４６ｆ及び５４６ｇのそれぞれのビット長は、関数５３０ａ、５３０ｂ、５３０ｃ、５３０ｄ、５３０ｅ、５３０ｆ及び５３０ｇのそれぞれのビット長と等しくなる。
なお、ＡＥＳは、ブロック暗号であるので、暗号化の際には、各関数を所定長、
ここでは、１２８ビット長のブロックに分解し、ブロック毎に暗号化を施すことは言うまでもない。
【００６１】
（変換情報５５０のデータ構造）
変換情報５５０は、図１１及び図１２に示すように、変換情報ブロック数５５１、変換情報ブロック５５２、５５３、・・・、５５４、５５５及び５５６から構成されている。
変換情報ブロック数５５１は、変換情報５５０内に含まれる変換情報ブロックの数を示す。
【００６２】
変換情報ブロックには、２種類の種別がある。変換情報ブロック５５２及び５５３は、第１の種別であり、変換情報ブロック５５４、５５５及び５５６は、第２の種別である。第１の種別の変換情報ブロックは、原プログラム１３０に含まれる関数の分割に関する情報を含む。また、第２の種別の変換情報ブロックは、原プログラム１３０に対して、追加挿入された冗長ブロックに関する情報を含む。
【００６３】
＜第１の種別の変換情報ブロック＞
第１の種別の変換情報ブロックは、原プログラム１３０に含まれる関数であって、後述する難読化の変換処理により、複数の関数に分割されたものに対応している。
変換情報ブロック５５２は、変換情報サイズ５６１、変換情報種別５６２、変換情報鍵ＩＤ５６３及び統合情報５６４から構成されている。なお、変換情報ブロック５５３も、変換情報ブロック５５２と同様のデータ構造を有している。ここでは、変換情報ブロック５５３についての詳細な説明を省略する。
【００６４】
変換情報サイズ５６１は、当該変換情報サイズ５６１を含む変換情報ブロック５５２の長さを示す。
変換情報種別５６２は、当該変換情報種別５６２を含む変換情報ブロック５５２が第１の種別のものであることを示している。具体的には、図１１に示すように、その値は、「１」である。
【００６５】
変換情報鍵ＩＤ５６３は、当該変換情報鍵ＩＤ５６３を含む変換情報ブロック５５２内の統合情報が暗号化される際に、暗号化において用いられる変換情報鍵に対応する識別子である。
統合情報５６４は、当該統合情報５６４を含む変換情報ブロックに対応する関数であって、分割されるものについて、分割の対象となる追加元関数及び分割後に新たに生成される追加関数に関する情報を含む。
【００６６】
統合情報５６４は、追加元関数名５６５、追加元関数サイズ５６６、追加情報数５６７並びに追加情報５６８、５６９及び５７０を含む。ここで、追加情報５６８、５６９及び５７０は、それぞれ、追加元関数の分割により新たに生成された複数の追加関数に対応している。
追加元関数名５６５は、分割の対象となる追加元関数を識別する識別名である。
【００６７】
追加元関数サイズ５６６は、分割の対象となる追加元関数であって、分割の処理が施された後のもののサイズを示す。
追加情報数５６７は、統合情報５６４に含まれる追加情報の数を示す。つまり、分割により新たに生成された追加関数の数に等しい。
追加情報５６８は、追加関数名５７１及び追加関数サイズ５７２を含む。追加情報５６９及び５７０も同様に、それぞれ、追加関数名及び追加関数サイズを含む。
【００６８】
ここで、追加関数名は、当該追加関数名を含む追加情報に対応する追加関数を識別する識別名である。
追加関数サイズは、当該追加関数サイズを含む追加情報に対応する追加関数のサイズを示す。
＜第２の種別の変換情報ブロック＞
第２の種別の変換情報ブロックは、原プログラム１３０に対して、追加挿入された冗長ブロックに対応している。
【００６９】
変換情報ブロック５５４は、変換情報サイズ５８１、変換情報種別５８２、変換情報鍵ＩＤ５８３及び冗長情報５８４から構成されている。
なお、変換情報ブロック５５５及び５５６は、変換情報ブロック５５４と同様のデータ構造を有しているので、ここでは、変換情報ブロック５５５及び５５６についての詳細な説明を省略する。
【００７０】
変換情報サイズ５８１は、当該変換情報サイズ５８１を含む変換情報ブロック５５４の長さを示す。
変換情報種別５８２は、当該変換情報種別５８２を含む変換情報ブロック５５４が第２の種別のものであることを示している。具体的には、図１２に示すように、その値は、「２」である。
【００７１】
変換情報鍵ＩＤ５８３は、当該変換情報鍵ＩＤ５８３を含む変換情報ブロック５５４内の冗長情報が暗号化される際に、暗号化において用いられる変換情報鍵に対応する識別子である。
冗長情報５８４は、当該冗長情報５８４を含む変換情報ブロック５５４に対応する冗長ブロックであって、原プログラム１３０に対して、追加挿入された冗長ブロックに関する情報を含み、関数名５８５、開始位置５８６及び終了位置５８７から構成されている。
【００７２】
関数名５８５は、当該冗長ブロックの挿入先の関数を識別する識別名である。
開始位置５８６は、関数名５８５により識別される関数内に、当該冗長ブロックが挿入された場合に、当該関数内における当該冗長ブロックの先頭位置を示すアドレスである。
終了位置５８７は、関数名５８５により識別される関数内に、当該冗長ブロックが挿入された場合に、当該関数内における当該冗長ブロックの最終位置を示すアドレスである。
【００７３】
（３）プログラム解析部１０２
プログラム解析部１０２は、制御部１０４から原プログラム１３０の解析をする旨の解析指示を受け取る。
前記解析指示を受け取ると、プログラム解析部１０２は、情報記憶部１０１に原関数情報テーブル１４０のための領域を確保する。
【００７４】
次に、プログラム解析部１０２は、情報記憶部１０１に記憶されている原プログラム１３０を構成する命令コードを順に読み出し、読み出した命令コードを解析して、関数の開始位置と終了位置とを探し、これにより、関数を特定する。また、特定した関数の関数名を抽出する。さらに、特定した関数に含まれる処理ブロックを特定し、その数をカウントする。
【００７５】
プログラム解析部１０２は、こうして特定した関数について、当該関数を識別する識別名である原関数名と、当該関数の開始位置と、終了位置と、当該関数に含まれる処理ブロック数とから構成される原関数情報を生成し、生成した原関数情報を原関数情報テーブル１４０に書き込む
プログラム解析部１０２は、こうして特定した全ての関数について、原関数情報の生成と、生成した原関数情報の原関数情報テーブル１４０への書込みを繰り返す。
【００７６】
前記繰り返しが終了すると、プログラム解析部１０２は、生成した原関数情報の数をカウントし、原関数合計数として、原関数情報テーブル１４０へ書き込む。
次に、プログラム解析部１０２は、原プログラム１３０の解析が終了した旨の解析終了情報を制御部１０４へ出力する。
（４）難読化部１０３
難読化部１０３は、制御部１０４から難読化処理をする旨の難読化指示を受け取る。
【００７７】
（関数分割の終了判定）
前記難読化指示を受け取ると、難読化部１０３は、配布プログラム５００のプログラム領域５０２に格納されているプログラムに含まれている関数の合計が、所定の収束閾値より小さいか又は等しいかを判断する。
ここで、難読化部１０３は、プログラム解析部１０２による解析の直後であれば、つまり、原プログラム１３０と配布プログラム５００のプログラム領域５０２に格納されているプログラムが完全に一致しているならば、原関数情報テーブル１４０から原関数合計数を読み出して、前記関数の合計として用いる。後述するように、配布プログラム５００のプログラム領域５０２に格納されているプログラムに対して、更新がされているならば、配布プログラム５００のプログラム領域５０２に格納されているプログラムから、当該プログラムに含まれている関数の合計を算出して用いる。
【００７８】
また、難読化部１０３は、前記収束閾値を予め保持している。この収束閾値は、例えば、原プログラム１３０の大きさに依存していてもよい。一例として、分割後のそれぞれの関数の大きさの目安を１００命令コードとし、原プログラム１３０の大きさが１０００命令コードであるなら、収束閾値は、「１０」であるとする。
収束閾値は、次式により算出してもよい。
【００７９】
収束閾値＝原プログラムの大きさ／関数の大きさの目安
このような収束閾値を用いて、関数の分割の終了判定を行うことにより、分割後の複数の関数の大きさがそれぞれほぼ同一の１００命令コード程度となることが予想される。
分割後のそれぞれの関数の大きさの目安は、配布プログラムを実行するプログラム実行装置が有するプロセッサやメモリの大きさに依存して決定してもよい。
【００８０】
関数の合計が前記収束閾値以下であるなら、難読化部１０３は、次に示すように、配布プログラム５００のプログラム領域５０２に格納されているプログラムにおいて、当該プログラムに含まれる関数の分割の処理を行う。関数の合計が前記収束閾値より大きくなれば、難読化部１０３は、関数の分割の処理を終了する。
なお、関数の分割は、再帰的に行われるとしてもよい。前記収束閾値が大きいときには、再帰的な分割が発生するようにしてもよい。より具体的には、全ての関数について分割を終えた時点で、関数の総数がまだ収束閾値以下である場合には、分割によって新しく生成された関数をさらに分割することにより関数の総数を増やしていくとしてもよい。
【００８１】
（関数の分割の処理）
難読化部１０３は、配布プログラム５００のプログラム領域５０２に格納されているプログラムに含まれている複数の関数のそれぞれについて、以下の処理（ｉ）〜（vii）を行う。ここで、以下の処理の対象となる関数を追加元関数と呼ぶことにする。
（ｉ）難読化部１０３は、当該追加元関数に含まれる処理ブロック数を算出し、算出した処理ブロック数を変数Ｍに代入する。
【００８２】
（ii）難読化部１０３は、変数Ｍが「１」であるかを判定する。変数Ｍが「１」である場合には、当該追加元関数をこれ以上分割できないとみなして、当該関数に対する分割処理を終了する。
（iii ）変数Ｍが「１」でない場合には、難読化部１０３は、当該追加元関数内に含まれる命令コードの合計命令数を算出する。難読化部１０３は、予め命令数閾値を保持している。次に、合計命令数と命令数閾値とを比較し、合計命令数が命令数閾値より小さい場合には、当該追加元関数をこれ以上分割できないと判定し、当該関数に対する分割処理を終了する。合計命令数が命令数閾値より大きい又は等しい場合には、次の処理を行う。
【００８３】
（iv）難読化部１０３は、配布プログラム５００の変換情報領域５０３に、変換情報ブロックを確保し、変換情報ブロック内の統合情報の追加元関数名に、当該追加元関数の関数名を書き込む。
（ｖ）難読化部１０３は、当該追加元関数から抜き出す処理ブロックがなくなるまで、以下のステップ（ｖ−１）〜（ｖ−５）を繰り返す。
【００８４】
（ｖ−１）当該追加元関数から、１個以上の処理ブロックを抜き出す。
（ｖ−２）予め難読化部１０３が保持している関数名候補リストを用いて、追加関数名を生成する。関数名候補リストは、追加関数名を生成するための名称の候補を複数個含んでいる。ここで、ステップ（ｖ−１）で１個の処理ブロックが抜き出された場合には、１個の追加関数名を生成し、複数の処理ブロックが抜き出された場合には、同数の追加関数名を生成する。
【００８５】
（ｖ−３）抜き出した各処理ブロックを、生成した関数名を含む関数呼出命令と置き換える。ここで、ステップ（ｖ−１）で１個の処理ブロックが抜き出された場合には、抜き出した１個の処理ブロックを、生成した関数名を含む１個の関数呼出命令と置き換える。複数の処理ブロックが抜き出された場合には、処理ブロック毎に、当該処理ブロックを生成した関数名を含む１個の関数呼出命令と置き換える。
【００８６】
（ｖ−４）抜き出した処理ブロックを、追加元関数の末尾に、生成した関数名を持つ新しい１個の関数として追加して書き込む。
（ｖ−５）統合情報に、追加情報として、ステップ（ｖ−２）で生成した関数名とそのサイズを追加して書き込む。                                            ［終了］
（vi）難読化部１０３は、統合情報に追加した追加情報の数をカウントし、カウントして得られた値を、追加情報数として、統合情報に追加して書き込む。
【００８７】
（vii）難読化部１０３は、追加元関数のサイズをカウントし、カウントして得られた値を、追加元関数サイズとして、統合情報に書き込む。次に、変換情報種別「１」を変換情報に書き込む。                            ［終了］
（ヘッダ部５１０の生成）
難読化部１０３は、配布プログラムＩＤを生成し、生成した配布プログラムＩＤを配布プログラムＩＤ５１１として、ヘッダ部５１０へ書き込み、次に、バージョン情報を生成し、バージョン情報５１２としてヘッダ部５１０へ書き込む。
【００８８】
次に、難読化部１０３は、関数情報及び変換情報位置情報のための領域をヘッダ部５１０内に確保し、各関数情報に各関数名を書き込み、各関数位置情報の関数開始位置及び関数終了位置を「０」とし、変換情報位置情報を「０」とする。
（冗長ブロックの挿入の処理）
難読化部１０３は、冗長処理生成部１０７に対して、冗長処理を生成する旨を示す冗長処理指示を出力する。次に、難読化部１０３は、冗長処理生成部１０７から、冗長処理の生成の終了を示す冗長処理終了結果を受け取る。
【００８９】
（関数の再配置）
次に、難読化部１０３は、配布プログラム５００のプログラム領域５０２内に配置されている全ての関数について、再度、ランダムな順序で配置をし直す。
難読化部１０３は、配布プログラム５００のプログラム領域５０２内において再配置された各関数の関数開始位置及び関数終了位置を、ヘッダ領域５０１内の当該関数に対応する関数位置情報内へ書き込む。
【００９０】
（暗号化の処理）
次に、難読化部１０３は、サブモジュール鍵保持部１０９からサブモジュール鍵１２０を取得し、取得したサブモジュール鍵を用いて、ヘッダ領域５０１内の各関数位置情報を暗号化するように、暗号化部１１０に対して指示する。
また、難読化部１０３は、取得したサブモジュール鍵を用いて、プログラム領域５０２内の各関数を暗号化するように、暗号化部１１０に対して指示する。
【００９１】
（変換情報の更新）
次に、難読化部１０３は、変換情報領域５０３内の変換情報５５０に含まれる変換情報ブロックの合計数をカウントし、得られた合計数を、変換情報ブロック数として、変換情報５５０へ書き込む。
次に、難読化部１０３は、変換情報５５０内の全ての変換情報ブロックのそれぞれについて、以下の処理（ｉ）〜（iii）を行う。
【００９２】
（ｉ）変換情報鍵テーブル１２１において、ランダムに変換情報鍵ＩＤと対応する変換情報鍵とを選択する。
（ii）選択した変換情報鍵ＩＤを、当該変換情報ブロックへ書き込む。
（iii）選択した変換情報鍵を暗号化部１１０へ出力し、当該変換情報ブロックを暗号化部１１０に対して指定し、選択した変換情報鍵を用いて、当該変換情報ブロックを暗号化するように、暗号化部１１０に対して指示する。［終了］
次に、難読化部１０３は、変換情報の先頭位置を、変換情報位置情報として、ヘッダ領域５０１内のヘッダ部５１０へ書き込む。
【００９３】
次に、難読化部１０３は、配布プログラム５００の生成が完了したことを示す完了情報を制御部１０４へ出力する。
（５）冗長処理生成部１０７
冗長処理生成部１０７は、難読化部１０３から冗長処理を生成する旨を示す冗長処理指示を受け取る。前記冗長処理指示を受け取ると、配布プログラム５００のプログラム領域５０２に格納されているプログラム内の関数の合計を算出する。
【００９４】
次に、冗長処理生成部１０７は、前記プログラム内の全ての関数のそれぞれについて、以下の処理（ｉ）〜（iv）を繰り返す。
（ｉ）冗長処理生成部１０７は、当該関数に、冗長ブロックを挿入するか否かをランダムに判断する。具体的には、０＜乱数ｒ＜１を満たす乱数ｒを生成し、０＜乱数ｒ＜０．５か否かを判断する。０．５≦乱数ｒ＜１であるなら、冗長ブロックを挿入しないとすると決定し、当該関数についての処理を終了する。
【００９５】
（ii）０＜乱数ｒ＜０．５であるなら、当該関数においてこれまでに挿入した冗長ブロックの数を算出し、算出して得られた冗長ブロックの数が、所定の閾値、ここでは、一例として、「１０」より大きいか否かを判断し、「１０」より大きい場合には、これ以上冗長ブロックを挿入しないと決定し、当該関数についての処理を終了する。冗長ブロックの数が、「１０」より大きくない場合には、冗長ブロックを挿入すると決定し、冗長処理生成部１０７は、情報記憶部１０１から読み出す冗長ブロックをランダムに決定し、決定した冗長ブロックを読み出す。
【００９６】
（iii）冗長処理生成部１０７は、当該関数において、冗長ブロックを挿入する位置を決定し、読み出した冗長ブロックを、決定した位置から挿入する。
（iv）冗長処理生成部１０７は、変換情報５５０内に変換情報ブロックを確保し、確保した変換情報ブロック内に、当該関数の関数名を書き込み、変換情報種別「２」を書き込み、当該関数内において、前記冗長ブロックを挿入した挿入開始位置及び挿入終了位置を、変換情報ブロック内に、開始位置及び終了位置として書き込む。
【００９７】
［終了］
冗長処理生成部１０７は、前記プログラム内の全ての関数のそれぞれについて、上の処理（ｉ）〜（iv）を繰り返し、終了すると、難読化部１０３に対して、冗長処理の生成の終了を示す冗長処理終了結果を出力する。
以上説明したように、本実施の形態における難読化では、配布プログラムに、プログラムの出力結果に影響を与えない冗長ブロックを追加挿入する。プログラム実行装置において、冗長ブロックを含む配布プログラムが実行されるときに、プログラム本来の処理ブロックと冗長ブロックの双方が実行される。
【００９８】
このような難読化を施した配布プログラムを不正解析する場合、不正解析者が解析しなければならない解析対象が多くなり、解析が困難になる。
（６）暗号化部１１０
暗号化部１１０は、難読化部１０３からサブモジュール鍵１２０を受け取り、受け取ったサブモジュール鍵を用いて、ヘッダ領域５０１内の各関数位置情報を暗号化し、暗号化された関数位置情報を再度ヘッダ領域５０１内に書き込む。
【００９９】
暗号化部１１０は、サブモジュール鍵を用いて、プログラム領域５０２内の各関数を暗号化し、暗号化された関数を再度プログラム領域５０２内に書き込む。
暗号化部１１０は、難読化部１０３から変換情報鍵を受け取り、受け取った変換情報鍵を用いて、指定された変換情報ブロックを暗号化し、暗号化された変換情報ブロックを再度、変換情報５５０内に書き込む。
【０１００】
ここで、暗号化において、ＡＥＳが用いられる。
（７）制御部１０４
制御部１０４は、入力部１０５から、原プログラム１３０に難読化の変換を施して配布プログラム５００を生成する旨の生成指示を受け取る。前記生成指示を受け取ると、制御部１０４は、情報記憶部１０１に配布プログラム５００を格納するための領域を確保する。次に、情報記憶部１０１から原プログラム１３０を読み出し、読み出した原プログラムを、配布プログラム５００のプログラム領域５０２へ書き込む。
【０１０１】
次に、制御部１０４は、プログラム解析部１０２に対して、原プログラム１３０の解析をする旨の解析指示を出力する。次に、プログラム解析部１０２から、原プログラム１３０の解析が終了した旨の解析終了情報を受け取る。
次に、制御部１０４は、難読化部１０３に対して、難読化処理をする旨の難読化指示を出力する。次に、難読化部１０３から、配布プログラム５００の生成が完了したことを示す完了情報を受け取る。
【０１０２】
前記完了情報を受け取ると、制御部１０４は、通信部１１２に対して、配布プログラム５００を携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃへ送信するように指示する。
なお、制御部１０４は、携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃからの送信要求に応じて、配布プログラムをそれぞれの装置に送信するとしてもよい。
【０１０３】
（８）入力部１０５及び表示部１０６
入力部１０５は、プログラム変換装置１００の操作者から原プログラム１３０に難読化の変換を施して配布プログラム５００を生成する旨の生成指示を受け付ける。前記生成指示を受け付けると、受け付けた生成指示を制御部１０４へ出力する。
表示部１０６は、制御部１０４の指示により、様々な情報を表示する。
【０１０４】
（９）通信部１１２
通信部１１２は、制御部１０４から配布プログラム５００の送信の指示を受け取る。前記指示を受け取ると、通信部１１２は、情報記憶部１０１から配布プログラム５００を読み出し、読み出した配布プログラムを、インターネット２０及び携帯電話網３０を介して、携帯電話２００ａへ送信し、読み出した配布プログラムを、インターネット２０を介して、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃへ送信する。
【０１０５】
１．３  プログラム変換装置１００の動作
プログラム変換装置１００の動作について、図１３〜図１８に示すフローチャートを用いて説明する。
制御部１０４は、情報記憶部１０１に配布プログラム５００を格納するための領域を確保し（ステップＳ１０１）、原プログラム１３０を、配布プログラム５００のプログラム領域５０２へ書き込む（ステップＳ１０２）。
【０１０６】
プログラム解析部１０２は、原プログラム１３０を解析する（ステップＳ１０３）。
難読化部１０３は、配布プログラム５００のプログラム領域５０２に格納されているプログラムに含まれている関数の合計（関数の個数の総合計個数、以下同様）が、所定の収束閾値より小さいか又は等しいかを判断する。関数の合計が所定の収束閾値より大きくなれば（ステップＳ１０４でＮＯ）、ステップＳ１３１へ制御を移す。
【０１０７】
関数の合計が前記収束閾値以下であるなら（ステップＳ１０４でＹＥＳ）、難読化部１０３は、変数Ｎに「０」を代入し（ステップＳ１０５）、変数Ｎと関数の合計を比較し、変数Ｎが関数合計より大きければ（ステップＳ１０６でＮＯ）、分割後の関数の合計を再度算出し（ステップＳ１２５）、次にステップＳ１０４へ戻って処理を繰り返す。
変数Ｎが関数合計以下であれば（ステップＳ１０６でＹＥＳ）、難読化部１０３は、変数Ｎに「１」を加算し（ステップＳ１０７）、変数Ｍに、第Ｎの関数に含まれる処理ブロック数を代入する（ステップＳ１０８）。
【０１０８】
次に、（ii）難読化部１０３は、変数Ｍが「１」であるか否かを判定する。変数Ｍが「１」である場合には（ステップＳ１０９でＹＥＳ）、当該追加元関数をこれ以上分割できないとみなし、次にステップＳ１０６へ戻って処理を繰り返す。
変数Ｍが「１」でない場合には（ステップＳ１０９でＮＯ）、難読化部１０３は、第Ｎの関数である当該追加元関数内に含まれる命令コードの合計命令数を算出し（ステップＳ１１０）、合計命令数と命令数閾値とを比較し、合計命令数が命令数閾値より小さい場合には（ステップＳ１１１でＹＥＳ）、当該追加元関数をこれ以上分割できないとみなして、ステップＳ１０６へ戻って処理を繰り返す。
【０１０９】
合計命令数が命令数閾値より大きい又は等しい場合には（ステップＳ１１１でＮＯ）、難読化部１０３は、配布プログラム５００の変換情報領域５０３に、変換情報ブロックを確保し（ステップＳ１１２）、変換情報ブロック内の統合情報の追加元関数名に、第Ｎの関数の関数名を書き込む（ステップＳ１１３）。
次に、難読化部１０３は、第Ｎの関数から、１個以上の処理ブロックを抜き出し（ステップＳ１１４）、予め難読化部１０３が保持している関数名候補リストを用いて、追加関数名を生成し（ステップＳ１１５）、抜き出した各処理ブロックを、生成した関数名を含む関数呼出命令と置き換え（ステップＳ１１６）、抜き出した処理ブロックを、追加元関数の末尾に、生成した関数名を持つ新しい１個の関数として追加して書き込み（ステップＳ１１７）、難読化部１０３は、統合情報に、追加情報として、ステップ（ｖ−２）で生成した関数名とそのサイズを追加して書き込み（ステップＳ１１８）、変数Ｍ＝変数Ｍ−（抜き出した処理ブロック数）を算出する（ステップＳ１１９）。次に、難読化部１０３は、変数Ｍが０より大きいか否かを判断し、変数Ｍが０より大きい場合には（ステップＳ１２０でＹＥＳ）、ステップＳ１１４へ戻って処理を繰り返す。変数Ｍが０より大きくない場合には（ステップＳ１２０でＮＯ）、難読化部１０３は、統合情報に追加した追加情報の数をカウントし（ステップＳ１２１）、カウントして得られた値を、追加情報数として、統合情報に追加して書き込み（ステップＳ１２２）、追加元関数のサイズをカウントし（ステップＳ１２３）、カウントして得られた値を、追加元関数サイズとして、統合情報に書き込み（ステップＳ１２４）、次に、変換情報種別「１」を変換情報に書き込み（ステップＳ１２５）、次に、ステップＳ１０６へ戻って処理を繰り返す。
【０１１０】
次に、難読化部１０３は、配布プログラムＩＤを生成し、生成した配布プログラムＩＤを配布プログラムＩＤ５１１として、ヘッダ部５１０へ書き込み（ステップＳ１３１）、バージョン情報を生成し、バージョン情報５１２としてヘッダ部５１０へ書き込み（ステップＳ１３２）、関数情報及び変換情報位置情報のための領域をヘッダ部５１０内に確保し（ステップＳ１３３）、各関数位置情報に各関数名を書き込み（ステップＳ１３４）、各関数位置情報の関数開始位置及び関数終了位置を「０」とし（ステップＳ１３５）、変換情報位置情報を「０」とする（ステップＳ１３６）。
【０１１１】
冗長処理生成部１０７は、配布プログラム５００のプログラム領域５０２に格納されているプログラム内の関数の合計を算出し（ステップＳ１４１）、変数Ｎに「０」を代入する（ステップＳ１４２）。次に、変数Ｎと関数合計とを比較し、変数Ｎが関数合計より小さくない場合には（ステップＳ１４３でＮＯ）、ステップＳ１６１へ制御を移す。
変数Ｎが関数合計より小さい場合には（ステップＳ１４３でＹＥＳ）、冗長処理生成部１０７は、変数Ｎに「１」を加算する（ステップＳ１４４）。
【０１１２】
次に、冗長処理生成部１０７は、０＜乱数ｒ＜１を満たす乱数ｒを生成し（ステップＳ１４５）、０＜乱数ｒ＜０．５か否かを判断する。０．５≦乱数ｒ＜１であるなら（ステップＳ１４６でＮＯ）、冗長ブロックを挿入しないとすると決定し、当該関数についての処理を終了し、ステップＳ１４３へ戻る。
０＜乱数ｒ＜０．５であるなら（ステップＳ１４６でＹＥＳ）、冗長処理生成部１０７は、当該関数においてこれまでに挿入した冗長ブロックの数を算出し（ステップＳ１４７）、算出して得られた冗長ブロックの数が、「１０」より大きいか否かを判断し、「１０」より大きい場合には（ステップＳ１４８）、これ以上冗長ブロックを挿入しないと決定し、ステップＳ１４３へ戻る。
【０１１３】
冗長ブロックの数が、「１０」より大きくない場合には（ステップＳ１４８）、冗長ブロックを挿入すると決定し、冗長処理生成部１０７は、情報記憶部１０１から読み出す冗長ブロックをランダムに決定し、決定した冗長ブロックを読み出し（ステップＳ１４９）、第Ｎの関数において、冗長ブロックを挿入する位置を決定し（ステップＳ１５０）、第Ｎの関数において、読み出した冗長ブロックを、決定した位置から挿入し（ステップＳ１５１）、変換情報５５０内に変換情報ブロックを確保し（ステップＳ１５２）、確保した変換情報ブロック内に、第Ｎの関数の関数名を書き込み（ステップＳ１５３）、変換情報種別「２」を書き込み（ステップＳ１５４）、第Ｎの関数内において、前記冗長ブロックを挿入した挿入開始位置及び挿入終了位置を、変換情報ブロック内に、開始位置及び終了位置として書き込み（ステップＳ１５５）、次に、ステップＳ１４５へ戻って処理を繰り返す。
【０１１４】
次に、難読化部１０３は、配布プログラム５００のプログラム領域５０２内に配置されている全ての関数について、再度、ランダムな順序で配置をし直し（ステップＳ１６１）、配布プログラム５００のプログラム領域５０２内において再配置された各関数の関数開始位置及び関数終了位置を、ヘッダ領域５０１内の当該関数に対応する関数位置情報内へ書き込む（ステップＳ１６２）。
【０１１５】
次に、難読化部１０３は、サブモジュール鍵保持部１０９からサブモジュール鍵１２０を取得する（ステップＳ１６４）。次に、暗号化部１１０は、取得したサブモジュール鍵を用いて、ヘッダ領域５０１内の各関数位置情報を暗号化し（ステップＳ１６５）、取得したサブモジュール鍵を用いて、プログラム領域５０２内の各関数を暗号化する（ステップＳ１６６）。
【０１１６】
次に、難読化部１０３は、変換情報領域５０３内の変換情報５５０に含まれる変換情報ブロックの合計数をカウントし（ステップＳ１６７）、得られた合計数を、変換情報ブロック数として、変換情報５５０へ書き込む（ステップＳ１６８）。
次に、難読化部１０３は、変数Ｎに「０」を代入し（ステップＳ１６９）、変数Ｎと合計数とを比較し、変数Ｎが合計数より小さくない場合（ステップＳ１７０でＮＯ）、変換情報の先頭位置を、変換情報位置情報として、ヘッダ領域５０１内のヘッダ部５１０へ書き込み（ステップＳ１７５）、処理を終了する。
【０１１７】
変数Ｎが合計数より小さい場合（ステップＳ１７０でＹＥＳ）、難読化部１０３は、変数Ｎに「１」を加算し（ステップＳ１７１）、変換情報鍵テーブル１２１において、ランダムに変換情報鍵ＩＤと対応する変換情報鍵とを選択し（ステップＳ１７２）、選択した変換情報鍵ＩＤを、当該変換情報ブロックへ書き込む（ステップＳ１７３）。暗号化部１１０は、選択された変換情報鍵を用いて、当該変換情報ブロックを暗号化する（ステップＳ１７４）。次に、ステップＳ１７０へ戻って処理を繰り返す。
【０１１８】
１．４  携帯電話２００ａの構成
携帯電話２００ａは、図１９に示すように、サブモジュール鍵保持部２０１、変換情報鍵保持部２０２、関数保持部２０３、前処理部２０４、復号部２０５、展開部２０６、プログラム実行部２０７、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０、情報記憶部２１１、冗長処理部２１２、音声を出力するスピーカ２２１、音声を電気信号に変換するマイク２２２、様々な情報を表示する表示部２２３、テンキーなどから構成され利用者の入力を受け付ける入力部２２４、デジタル音声信号をアナログ音声信号に変換し、アナログ音声信号をデジタル音声信号に変換する変換部２２５、制御部２２６、通信制御部２２７、通信部２２８及びアンテナ２２９から構成されている。
【０１１９】
携帯電話２００ａは、具体的には、マイクロプロセッサ、デジタル信号プロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサ及び前記デジタル信号プロセッサが前記コンピュータプログラムに従って動作することにより、携帯電話２００ａを構成する各構成要素は、その機能の一部を達成する。
【０１２０】
ここで、変換情報鍵保持部２０２、関数保持部２０３、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０は、好ましくは、セキュリティ強度が高いメモリ、例えば、ＬＳＩ内部に存在し、ユーザによる直接のアクセスが困難な記憶領域に、確保される。
（１）サブモジュール鍵保持部２０１及び変換情報鍵保持部２０２
サブモジュール鍵保持部２０１は、予め、サブモジュール鍵２５１を保持している。ここで、サブモジュール鍵２５１は、復号の際に用いられる鍵情報であり、１２８ビット長である。サブモジュール鍵２５１は、プログラム変換装置１００が保持しているサブモジュール鍵１２０と同一である。
【０１２１】
変換情報鍵保持部２０２は、予め、図２０に一例として示す変換情報鍵テーブル２６１を有している。変換情報鍵テーブル２６１は、一例として、２個の鍵情報２６２及び２６３を含んでいる。各鍵情報は、変換情報鍵ＩＤ及び変換情報鍵から構成される。
変換情報鍵ＩＤは、当該変換情報鍵ＩＤを含む鍵情報を一意に識別する識別情報である。
【０１２２】
変換情報鍵は、復号の際に用いられる鍵情報であり、１２８ビット長である。
鍵情報２６２及び２６３は、それぞれ、プログラム変換装置１００が保持している鍵情報１２３及び１２４と同一である。
このように、変換情報鍵保持部２０２は、プログラム変換装置１００が保持している１００個の鍵情報のうちのいくつかを保持している。
【０１２３】
（２）情報記憶部２１１
情報記憶部２１１は、配布プログラム２５０を記憶している。
配布プログラム２５０は、プログラム変換装置１００により生成され、プログラム変換装置１００から、インターネット２０及び携帯電話網３０を介して受信したものである。
（３）関数情報保持部２０９
関数情報保持部２０９は、一例として図２１に示すように、関数情報２８１を記憶するための領域を備えている。
【０１２４】
関数情報２８１は、関数の個数２８２、関数位置情報２８３、２８４、・・・、２８５から構成されている。関数位置情報２８３は、関数名２８６、関数開始位置２８７及び関数終了位置２８８を含む。関数位置情報２８４、・・・、２８５も、関数位置情報２８３と同様に、関数名、関数開始位置及び関数終了位置を含む。
関数情報２８１は、図８に示す関数情報５１３と同一であるので、さらに詳細の説明を省略する。
【０１２５】
（４）統合情報保持部２０８
統合情報保持部２０８は、一例として図２２に示すように、統合情報３０１、統合情報３０２、・・・、冗長情報３０３、冗長情報３０４、・・・を記憶するための領域を備えている。
統合情報３０１は、追加元関数名３１１、追加元関数サイズ３１２、追加情報数３１３、追加情報３１４、追加情報３１５及び追加情報３１６から構成されている。追加情報３１４は、追加関数名３１７及び追加関数サイズ３１８を含む。追加情報３１５及び追加情報３１６は、追加情報３１４と同様に、それぞれ、追加関数名及び追加関数サイズを含む。
【０１２６】
統合情報３０２も、統合情報３０１と同様のデータ構造を有している。
統合情報３０１は、図１１に示す統合情報５６４と同一であり、統合情報３０２は、図１１に示す変換情報ブロック５５３に含まれている統合情報と同一であるので、これらについてのさらに詳細な説明を省略する。
冗長情報３０３は、関数名３２１、開始位置３２２及び終了位置３２３から構成されている。また、冗長情報３０４は、冗長情報３０３と同様に、関数名、開始位置及び終了位置から構成されている。
【０１２７】
冗長情報３０３は、図１２に示す変換情報ブロック５５４に含まれている冗長情報と同一であり、冗長情報３０４は、図１２に示す変換情報ブロック５５５に含まれている冗長情報と同一であるので、これらについてのさらに詳細な説明を省略する。
（５）関数保持部２０３
関数保持部２０３は、１個以上の関数を保持するための関数領域を備えている。
【０１２８】
関数保持部２０３が保持する関数の一例は、図２３に示すように、関数３４１、関数３４２、関数３４３及び関数３４４である。
関数３４１、関数３４２、関数３４３及び関数３４４は、それぞれ、図９に示す関数５３０ａ、関数５３０ｂ、関数５３０ｃ及び関数５３０ｄと同一である。
（６）復号状況管理部２１０
復号状況管理部２１０は、復号状況テーブル３６１を保持している。
【０１２９】
復号状況テーブル３６１は、関数保持部２０３に保持されている関数に関する情報を含む。
復号状況テーブル３６１は、図２４に示すように、１個以上の復号状況情報を含んで構成されている。これらの１個以上の復号状況情報は、それぞれ、関数保持部２０３に保持されている１個以上の関数と対応している。
【０１３０】
各復号状況情報は、関数名、開始アドレス及び終了アドレスを含む。
関数名は、当該関数名を含む復号状況情報に対応する関数を識別する識別名である。
開始アドレスは、関数保持部２０３が備える関数領域において、当該開始アドレスを含む復号状況情報に対応する関数の先頭位置を示すアドレスである。
終了アドレスは、関数保持部２０３が備える関数領域において、当該終了アドレスを含む復号状況情報に対応する関数の最終位置を示すアドレスである。
【０１３１】
図２４に一例として示すように、復号状況テーブル３６１は、復号状況情報３６２を含み、復号状況情報３６２は、関数名３６３「Ｍｅｔｈｏｄ１」、開始アドレス３６４「１０００」及び終了アドレス３６５「１０５０」を含む。
つまり、復号状況情報３６２は、関数名３６３「Ｍｅｔｈｏｄ１」により識別される関数が、関数保持部２０３に記憶されていることを示し、さらに、当該関数が、関数保持部２０３の関数領域において、開始アドレス３６４「１０００」及び終了アドレス３６５「１０５０」により示される範囲に存在することを示している。
【０１３２】
（７）前処理部２０４
前処理部２０４は、制御部２２６から配布プログラム２５０の処理を行う旨の指示を受け取る。この指示を受け取ると、前処理部２０４は、情報記憶部２１１に記憶されている配布プログラム２５０から、ヘッダ領域内のヘッダ部に含まれる関数情報を読み出し、読み出した関数情報を、図２１に示すように、関数情報２８１として、関数情報保持部２０９へ書き込む。
【０１３３】
次に、前処理部２０４は、サブモジュール鍵保持部２０１からサブモジュール鍵２５１を読み出し、読み出したサブモジュール鍵を復号部２０５へ出力し、復号部２０５に対して、関数情報保持部２０９に記憶されている関数情報内の全ての関数位置情報に含まれる暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置を復号するように指示する。
【０１３４】
次に、前処理部２０４は、配布プログラム２５０の変換情報に含まれる全ての変換情報ブロックについて、以下の処理（ｉ）〜（iii)を繰り返す。
（ｉ）前処理部２０４は、配布プログラム２５０の変換情報に含まれる１個の変換情報ブロックを読み出し、読み出した変換情報ブロックから変換情報鍵ＩＤを抽出する。
（ii）前処理部２０４は、変換情報鍵保持部２０２に保持されている変換情報鍵テーブル２６１から、抽出した変換情報鍵ＩＤと同一の変換情報鍵ＩＤを探す。
【０１３５】
（iii)同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在しなければ、読み出した前記変換情報ブロックについての処理を終了する。
同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在すれば、抽出した前記変換情報鍵ＩＤに対応する変換情報鍵を、変換情報鍵テーブル２６１から読み出し、読み出した変換情報鍵を復号部２０５へ出力し、読み出した変換情報ブロックに含まれる暗号化された統合情報を復号部２０５に対して指定し、前記変換情報ブロックに含まれる暗号化された統合情報を復号する旨の指示を復号部２０５へ出力する。
【０１３６】
［終了］
配布プログラム２５０の変換情報に含まれる全ての変換情報ブロックについて、上記の処理（ｉ）〜（iii)の繰り返しが終了すると、次に、前処理部２０４は、制御部２２６に対して、前処理の終了を示す終了情報を出力する。
（８）復号部２０５
復号部２０５は、前処理部２０４からサブモジュール鍵を受け取り、また、関数情報保持部２０９に記憶されている関数情報内の全ての関数位置情報に含まれる暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置を復号する指示を受け取る。サブモジュール鍵及び前記指示を受け取ると、復号部２０５は、関数情報保持部２０９に記憶されている全ての関数位置情報に含まれる暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置を、受け取ったサブモジュール鍵を鍵として用いて、復号し、それぞれ、関数名、関数開始位置及び関数終了位置を生成し、生成した関数名、関数開始位置及び関数終了位置を、元の暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置に上書きする。
【０１３７】
復号部２０５は、前処理部２０４から変換情報鍵を受け取り、変換情報ブロックに含まれる統合情報の指定と、変換情報ブロックに含まれる統合情報を復号する旨の指示とを受け取る。前記変換情報鍵、前記指定及び前記指示を受け取ると、復号部２０５は、受け取った変換情報鍵を用いて、指定された暗号化された統合情報を復号して、統合情報を生成し、生成した統合情報を、暗号化された統合情報に上書きする。
【０１３８】
復号部２０５は、展開部２０６から復号の指示と、サブモジュール鍵と、配布プログラム２５０における関数開始位置及び関数終了位置と、関数保持部２０３における格納位置とを受け取り、配布プログラム２５０において、抽出した前記関数開始位置及び前記関数終了位置までを、読み出したサブモジュール鍵により復号し、得られた関数を展開部２０６により指定された関数保持部２０３内の格納位置に書き込む。書き込みが完了すると、当該関数の格納位置の開始アドレスと終了アドレスとを展開部２０６へ出力する。
【０１３９】
（９）展開部２０６
展開部２０６は、プログラム実行部２０７から、指定された関数の展開をする旨の指示を、前記関数を識別する関数名とともに、受け取る。
前記指示を受け取ると、展開部２０６は、復号状況管理部２１０に保持されている復号状況テーブル３６１から、関数保持部２０３において最後に保持されている関数の終了アドレスを取得する。つまり、復号状況テーブル３６１内に記憶されている復号状況情報のうち、最大の終了アドレスを含む復号状況情報を抽出し、抽出した復号状況情報に含まれる終了アドレスを抽出する。
【０１４０】
次に、展開部２０６は、サブモジュール鍵保持部２０１からサブモジュール鍵２５１を読み出す。
次に、展開部２０６は、指定された関数名を含む関数位置情報を、関数情報保持部２０９に保持されている関数情報２８１から読み出し、読み出した関数位置情報から関数開始位置及び関数終了位置を抽出する。
【０１４１】
次に、展開部２０６は、復号部２０５に対して、復号の指示と、サブモジュール鍵と、配布プログラム２５０における関数開始位置及び関数終了位置と、関数保持部２０３における格納位置（つまり、抽出された前記終了アドレスにより示される位置）とを出力する。次に、復号部２０５から当該関数の格納位置の開始アドレスと終了アドレスとを受け取り、指定された関数名、並びに受け取った開始アドレス及び終了アドレスから構成される復号状況情報を、復号状況テーブル３６１へ書き込む。
【０１４２】
次に、展開部２０６は、指定された関数名を追加元関数名として含む統合情報を、統合情報保持部２０８から探し、存在しない場合には、展開部２０６は、展開の終了を示す終了情報をプログラム実行部２０７へ出力し、処理を終了する。
存在する場合には、存在する当該統合情報において、当該統合情報に含まれる全ての追加情報について、各追加情報から追加関数名を抽出し、抽出した追加関数名を指定して展開処理を行う。
【０１４３】
（１０）プログラム実行部２０７
プログラム実行部２０７は、命令コードが格納されている格納位置を示すプログラムカウンタＰＣを備えている。
プログラム実行部２０７は、プログラムカウンタＰＣにより示される格納位置から、命令コードを読み出し、読み出した命令コードを解読し、命令コードの種類が、（ｉ）外部関数の呼出しであるか、（ii）invoke命令又は関数の呼出しであるか、（iii)終了命令であるか、(iv）その他の命令コードであるかを判断する。
【０１４４】
（ｉ）外部関数の呼出しである場合には、プログラム実行部２０７は、外部関数の開始アドレスをプログラムカウンタＰＣに設定する。
（ii）invoke命令又は関数の呼出しである場合には、プログラム実行部２０７は、復号状況管理部２１０が保持する復号状況テーブル３６１から、invoke命令又は関数の呼出しにより指定された関数を識別する関数名の取得を試み、関数名が存在すれば、当該関数が格納されている位置を示す開始アドレスの取得を試みる。開始アドレスが、取得できれば、取得した開始アドレスをプログラムカウンタＰＣに設定する。
【０１４５】
開始アドレスが、取得できなければ、つまり、当該関数を識別する関数名を含む復号状況情報が復号状況テーブル３６１内に存在しなければ、プログラム実行部２０７は、関数保持部２０３内に記憶されている全ての関数を消去し、展開部２０６に対して指定された関数の展開をするように指示し、次に、プログラム実行部２０７は、展開部２０６から展開の終了を示す終了情報を受け取る。前記終了指示を受け取ると、冗長処理部２１２に対して、冗長ブロックの処理をするよう指示し、冗長処理部２１２から冗長ブロックの処理の終了を示す終了情報を受け取る。前記終了指示を受け取ると、指定された関数の開始アドレスをプログラムカウンタＰＣに設定する。
【０１４６】
（iii)終了命令である場合には、プログラム実行部２０７は、関数保持部２０３、統合情報保持部２０８、関数情報保持部２０９及び復号状況管理部２１０が保持している情報を全て消去し、他のプログラムの命令コードが格納されている位置をプログラムカウンタＰＣに設定する。
(iv）その他の命令コードである場合には、プログラム実行部２０７は、当該命令コードの解読結果に従って、処理を実行し、プログラムカウンタＰＣに「１」を加算する。
【０１４７】
次に、前述の命令コードの読み出しに戻って、処理を繰り返す。
（１１）冗長処理部２１２
冗長処理部２１２は、プログラム実行部２０７から冗長ブロックの処理をする旨の指示を受け取る。前記指示を受け取ると、冗長処理部２１２は、統合情報保持部２０８から冗長情報の読み出しを試みる。
【０１４８】
統合情報保持部２０８からの全ての冗長情報の読み出しが終了すると、又は統合情報保持部２０８に冗長情報が存在しない場合には、冗長ブロックの処理の終了を示す終了情報をプログラム実行部２０７へ出力し、冗長処理部２１２による処理を終了する。
統合情報保持部２０８からの１個の冗長情報を読み出すと、冗長処理部２１２は、読み出した冗長情報から関数名を抽出し、抽出した関数名を含む復号状況情報を、復号状況管理部２１０の復号状況テーブル３６１から探す。抽出した関数名を含む復号状況情報が復号状況テーブル３６１内に存在しない場合には、次に、冗長処理部２１２は、統合情報保持部２０８からの冗長情報の読み出しに戻り、処理を繰り返す。
【０１４９】
抽出した関数名を含む復号状況情報が復号状況テーブル３６１内に存在する場合には、冗長処理部２１２は、当該復号状況情報から、前記関数名に対応する開始アドレス及び終了アドレスを取得し、読み出した冗長情報から開始位置及び終了位置を抽出し、関数保持部２０３内において、取得した開始アドレス及び終了アドレスにより特定される関数について、抽出した開始位置から抽出した終了位置までに存在する命令コードを、全てＮＯＰ命令に置き換える。
【０１５０】
ここで、ＮＯＰ命令は、何の処理も行わないことを指示する命令である。ＮＯＰ命令が実行される場合には、その処理時間はほどんど取られない。
次に、冗長処理部２１２は、統合情報保持部２０８からの冗長情報の読み出しに戻り、処理を繰り返す。
こうして、ＮＯＰ命令に置き換えることにより、冗長な処理の実行に取られていた処理時間をほどんどなくすことができるので、プログラムをより高速に実行することができるようになる。
【０１５１】
（１２）アンテナ２２９、通信部２２８及び通信制御部２２７
通信部２２８は、アンテナ２２９により受信した無線周波数信号を増幅し、出力信号をＩＦ信号に変換し、ＩＦ信号を増幅し、増幅されたＩＦ信号をベースバンド信号に復調する。また、ベースバンド信号により高周波数信号を変調し、その出力を無線周波数に変換し、無線周波数を増幅しアンテナ２２９へ出力する。通信制御部２２７は、ベースバンド信号を生成して通信部２２８へ出力し、また、通信部２２８からベースバンド信号を受け取る。
【０１５２】
こうして、通信制御部２２７、通信部２２８及びアンテナ２２９は、携帯電話網３０、インターネット２０を介して接続されているプログラム変換装置１００との間で、情報の送受信を行う。
具体的には、通信制御部２２７、通信部２２８及びアンテナ２２９は、携帯電話網３０、インターネット２０を介して接続されているプログラム変換装置１００から、配布プログラムを受信し、受信した配布プログラムを、配布プログラム２５０として、情報記憶部２１１へ書き込む。
【０１５３】
（１３）制御部２２６
制御部２２６は、入力部２２４を介して、携帯電話２００ａの利用者から配布プログラム２５０の実行の指示を受け付ける。前記指示を受け付けると、前処理部２０４に対して、配布プログラム２５０の処理を行う旨の指示を出力する。
制御部２２６は、前処理部２０４から前処理の終了を示す終了情報を受け取る。終了情報を受け取ると、配布プログラム２５０の主たる関数である「Ｍｅｔｈｏｄ１」を呼び出す呼出命令が存在する位置を示すアドレスを、プログラム実行部２０７が備えるプログラムカウンタＰＣに設定する。これにより、プログラム実行部２０７による配布プログラム２５０に従った処理が開始される。
【０１５４】
なお、配布プログラム２５０の主たる関数である「Ｍｅｔｈｏｄ１」を呼び出す呼出命令は、配布プログラムを呼び出す呼出プログラム内に含まれており、前記呼出プログラムは、情報記憶部２１１内に予め記憶されている。
１．５  携帯電話２００ａによる配布プログラムの実行の動作
携帯電話２００ａによる配布プログラムの実行の動作について説明する。
【０１５５】
（１）携帯電話２００ａによる配布プログラムの実行の動作
携帯電話２００ａによる配布プログラムの実行の動作について、図２５に示すフローチャートを用いて説明する。
制御部２２６は、入力部２２４を介して、携帯電話２００ａの利用者から配布プログラム２５０の実行の指示を受け付け（ステップＳ２００）、前処理部２０４は、配布プログラム２５０について、暗号化された関数位置情報と暗号化された統合情報の復号を行う（ステップＳ２０１）。
【０１５６】
プログラム実行部２０７は、プログラムカウンタＰＣにより示される格納位置から、命令コードを読み出し（ステップＳ２０２）、読み出した命令コードを解読し（ステップＳ２０３）、命令コードの種類が、外部関数の呼出しであるか、invoke命令又は関数の呼出しであるか、終了命令であるか、又はその他の命令コードであるかを判断する（ステップＳ２０４）。
【０１５７】
外部関数の呼出しである場合には（ステップＳ２０４）、プログラム実行部２０７は、外部関数の開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１４）、次に、ステップＳ２０２へ戻って処理を繰り返す。
invoke命令又は関数の呼出しである場合には（ステップＳ２０４）、プログラム実行部２０７は、復号状況管理部２１０が保持する復号状況テーブル３６１から、invoke命令又は関数の呼出しにより指定された関数を識別する関数名の取得を試み、関数名が存在すれば、当該関数が格納されている位置を示す開始アドレスの取得を試みる（ステップＳ２０８）。開始アドレスが、取得できれば（ステップＳ２０９）、取得した開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１３）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１５８】
開始アドレスが、取得できなければ（ステップＳ２０９）、プログラム実行部２０７は、関数保持部２０３内に記憶されている全ての関数を消去し（ステップＳ２１０）、展開部２０６は、指定された関数の展開をし（ステップＳ２１１）、冗長処理部２１２は、冗長ブロックの処理をし（ステップＳ２１２）、指定された関数の開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１３）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１５９】
終了命令である場合には（ステップＳ２０４）、プログラム実行部２０７は、関数保持部２０３、統合情報保持部２０８、関数情報保持部２０９及び復号状況管理部２１０が保持している情報を全て消去し（ステップＳ２０６）、他のプログラムの命令コードが格納されている位置をプログラムカウンタＰＣに設定し（ステップＳ２０７）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１６０】
その他の命令コードである場合には（ステップＳ２０４）、プログラム実行部２０７は、当該命令コードの解読結果に従って、処理を実行し（ステップＳ２０５）、プログラムカウンタＰＣに「１」を加算し（ステップＳ２１５）、次に、ステップＳ２０２へ戻って処理を繰り返す。
（２）前処理部２０４及び復号部２０５による動作
前処理部２０４及び復号部２０５による暗号化された関数位置情報と暗号化された統合情報の復号の動作について、図２６に示すフローチャートを用いて説明する。
【０１６１】
前処理部２０４は、制御部２２６から配布プログラム２５０の処理を行う旨の指示を受け取ると、情報記憶部２１１に記憶されている配布プログラム２５０から、ヘッダ領域内のヘッダ部に含まれる関数情報を読み出し、読み出した関数情報を、関数情報２８１として、関数情報保持部２０９へ書き込む（ステップＳ２３１）。
次に、前処理部２０４は、サブモジュール鍵保持部２０１からサブモジュール鍵２５１を読み出し（ステップＳ２３２）、復号部２０５は、関数情報保持部２０９に記憶されている全ての関数位置情報に含まれる暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置を、受け取ったサブモジュール鍵を鍵として用いて、復号し、それぞれ、関数名、関数開始位置及び関数終了位置を生成し、生成した関数名、関数開始位置及び関数終了位置を、元の暗号化された関数名、暗号化された関数開始位置及び暗号化された関数終了位置に上書きする（ステップＳ２３３）。
【０１６２】
次に、前処理部２０４は、配布プログラム２５０の変換情報から、変換情報ブロック数を読み出し（ステップＳ２３４）、変数Ｎに「０」を代入する（ステップＳ２３５）。
次に、前処理部２０４は、変数Ｎと変換情報ブロック数とを比較し、変数Ｎが変換情報ブロック数より小さくない場合には（ステップＳ２３６でＮＯ）、処理を終了する。
変数Ｎが変換情報ブロック数より小さい場合には（ステップＳ２３６でＹＥＳ）、前処理部２０４は、変数Ｎに「１」を加算し（ステップＳ２３７）、配布プログラム２５０の変換情報に含まれる第Ｎの変換情報ブロックを読み出し、読み出した変換情報ブロックから変換情報鍵ＩＤを抽出し（ステップＳ２３８）、次に、変換情報鍵保持部２０２に保持されている変換情報鍵テーブル２６１から、抽出した変換情報鍵ＩＤと同一の変換情報鍵ＩＤを探す（ステップＳ２３９）。
【０１６３】
同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在しなければ（ステップＳ２４０）、ステップＳ２３６へ戻って処理を繰り返す。
同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在すれば（ステップＳ２４０）、抽出した前記変換情報鍵ＩＤに対応する変換情報鍵を、変換情報鍵テーブル２６１から読み出し（ステップＳ２４１）、読み出した第Ｎの変換情報鍵を復号部２０５へ出力し、復号部２０５は、受け取った変換情報鍵を用いて、指定された暗号化された統合情報を復号して、統合情報を生成し、生成した統合情報を、暗号化された統合情報に上書きする（ステップＳ２４２）。次に、ステップＳ２３６へ戻って処理を繰り返す。
【０１６４】
（３）冗長処理部２１２による動作
冗長処理部２１２による動作について、図２７に示すフローチャートを用いて説明する。
プログラム実行部２０７から冗長ブロックの処理をする旨の指示を受け取ると、冗長処理部２１２は、統合情報保持部２０８から冗長情報の読み出しを試みる（ステップＳ２６１）。
【０１６５】
統合情報保持部２０８からの全ての冗長情報の読み出しが終了すると、又は統合情報保持部２０８に冗長情報が存在しない場合には（ステップＳ２６２でＹＥＳ）、冗長ブロックの処理の終了を示す終了情報をプログラム実行部２０７へ出力し、冗長処理部２１２による処理を終了する。
統合情報保持部２０８からの１個の冗長情報を読み出すと（ステップＳ２６２でＮＯ）、冗長処理部２１２は、読み出した冗長情報から関数名を抽出し（ステップＳ２６３）、抽出した関数名を含む復号状況情報を、復号状況管理部２１０の復号状況テーブル３６１から探す（ステップＳ２６４）。抽出した関数名を含む復号状況情報が復号状況テーブル３６１内に存在しない場合には（ステップＳ２６５）、ステップＳ２６２へ戻って処理を繰り返す。
【０１６６】
抽出した関数名を含む復号状況情報が復号状況テーブル３６１内に存在する場合には（ステップＳ２６５）、冗長処理部２１２は、復号状況情報から前記関数名に対応する開始アドレス及び終了アドレスを取得し（ステップＳ２６６）、読み出した冗長情報から開始位置及び終了位置を抽出し（ステップＳ２６７）、関数保持部２０３内において、取得した開始アドレス及び終了アドレスにより特定される関数について、抽出した開始位置から抽出した終了位置までに存在する命令コードを、全てＮＯＰ命令に置き換える（ステップＳ２６８）。次に、ステップＳ２６２へ戻って処理を繰り返す。
【０１６７】
なお、上記において、冗長ブロックに含まれる命令コードをＮＯＰ命令に置き換えるとしているが、冗長ブロックに含まれる命令コードを全て削除するとしてもよい。
以上説明したように、冗長ブロックを無効化することにより、セキュリティ強度が高いがＣＰＵが低速であるプログラム変換装置において、配布プログラムが変換された結果、冗長ブロックの実行がされないので、処理時間が軽減されることになり、機器に適した処理がなされることとなる。
【０１６８】
（４）展開部２０６による動作
展開部２０６による動作について、図２８〜図２９に示すフローチャートを用いて説明する。
プログラム実行部２０７から、指定された関数の展開をする旨の指示を、前記関数を識別する関数名とともに、受け取ると、展開部２０６は、復号状況管理部２１０に保持されている復号状況テーブル３６１から、関数保持部２０３において最後に保持されている関数の終了アドレスを取得し（ステップＳ２８１）、サブモジュール鍵保持部２０１からサブモジュール鍵２５１を読み出し（ステップＳ２８２）、指定された関数名を含む関数位置情報を、関数情報保持部２０９に保持されている関数情報２８１から読み出し、読み出した関数位置情報から関数開始位置及び関数終了位置を抽出する（ステップＳ２８３）。
【０１６９】
次に、復号部２０５は、配布プログラム２５０において、関数開始位置及び関数終了位置までを、読み出したサブモジュール鍵により復号し（ステップＳ２８４）、得られた関数を展開部２０６により指定された関数保持部２０３内の格納位置に書き込む（ステップＳ２８５）。
次に、展開部２０６は、指定された関数名、並びに受け取った開始アドレス及び終了アドレスから構成される復号状況情報を、復号状況テーブル３６１へ書き込む（ステップＳ２８６）。
【０１７０】
次に、展開部２０６は、指定された関数名を追加元関数名として含む統合情報を、統合情報保持部２０８から探し、存在しない場合には（ステップＳ２８７でＮＯ）、展開部２０６は、処理を終了する。
存在する場合には（ステップＳ２８７でＹＥＳ）、変数Ｎに「０」を代入し（ステップＳ２８８）、変数Ｎと、前記統合情報に含まれている追加情報数とを比較し、変数Ｎが追加情報数より小さくない場合には（ステップＳ２８９でＮＯ）、展開部２０６は、処理を終了する。
【０１７１】
変数Ｎが追加情報数より小さい場合には（ステップＳ２８９でＹＥＳ）、展開部２０６は、変数Ｎに「１」を加算し（ステップＳ２９０）、存在する当該統合情報において、第Ｎの追加情報から追加関数名を抽出し、抽出した追加関数名を指定して、再帰的に、本展開処理を行う（ステップＳ２９１）。次に、ステップＳ２８９へ戻って処理を繰り返す。
以上説明したように、ステップＳ２８４において得られた関数、及びステップＳ２８８〜Ｓ２９１において得られた１個以上の関数が、関数保持部２０３に記憶される。これらの関数は、呼び出し関係のあるものであり、一時的に、同時に関数保持部２０３に保持されているので、いずれかの関数の呼び出しが行われると、続いてこれらの関数のうちの他の関数の呼び出しが行われる可能性が高い。これらの関数の復号を一度に行うことにより、関数の復号の頻度が少なくなり、処理性能の面で有利である。
【０１７２】
１．６  ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃ
（１）ＤＶＤプレーヤ２００ｂ
ＤＶＤプレーヤ２００ｂは、図３０に示すように、サブモジュール鍵保持部２０１、変換情報鍵保持部２０２、関数保持部２０３、前処理部２０４、復号部２０５、展開部２０６、プログラム実行部２０７、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０、情報記憶部２１１、冗長処理部２１２、ＤＶＤから映像音声情報を読み出す入出力部２３１、読み出した映像音声情報を映像情報及び音声情報に分離する分離部２３２、映像情報から映像信号を生成し、モニタへ出力する映像生成部２３３、音声情報から音声信号を生成し、スピーカへ出力する音声生成部２３４、リモコンからの操作指示を受け付ける入力部２３６、制御部２２６、プログラム変換装置１００からインターネット２０を介して配布プログラムを受信し、受信した配布プログラムを情報記憶部２１１へ書き込む通信部２２８ｂから構成されている。
【０１７３】
ＤＶＤプレーヤ２００ｂは、具体的には、携帯電話２００ａと同様に、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが前記コンピュータプログラムに従って動作することにより、ＤＶＤプレーヤ２００ｂを構成する各構成要素は、その機能の一部を達成する。
【０１７４】
ＤＶＤプレーヤ２００ｂを構成するサブモジュール鍵保持部２０１、変換情報鍵保持部２０２、関数保持部２０３、前処理部２０４、復号部２０５、展開部２０６、プログラム実行部２０７、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０、情報記憶部２１１、冗長処理部２１２は、以下に示す相違点を除いて、それぞれ、携帯電話２００ａにおいて同一の参照符号が付された構成要素と同一である。
【０１７５】
変換情報鍵保持部２０２は、携帯電話２００ａが保持する変換情報鍵テーブル２６１に代えて、変換情報鍵テーブル２６１ｂを有している。変換情報鍵テーブル２６１ｂは、３個の鍵情報を有しており、これらの３個の鍵情報は、それぞれ、図３に示す鍵情報１２２、１２３及び１２４と同一のものである。
このように、携帯電話２００ａが保持する変換情報鍵テーブル２６１と、ＤＶＤプレーヤ２００ｂが保持する変換情報鍵テーブル２６１ｂとを比較すると、それぞれのテーブル内部に保持する鍵情報が異なり、また保持する鍵情報の数が異なっている。
【０１７６】
（２）パーソナルコンピュータ２００ｃ
パーソナルコンピュータ２００ｃは、図３１に示すように、サブモジュール鍵保持部２０１、変換情報鍵保持部２０２、関数保持部２０３、前処理部２０４、復号部２０５、展開部２０６、プログラム実行部２０７、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０、情報記憶部２１１、冗長処理部２１２、モニタ及びキーボードとの間の情報の入出力を制御する入出力制御部２３７、制御部２２６、プログラム変換装置１００からインターネット２０を介して配布プログラムを受信し、受信した配布プログラムを情報記憶部２１１へ書き込む通信部２２８ｃから構成されている。
【０１７７】
パーソナルコンピュータ２００ｃは、具体的には、携帯電話２００ａと同様に、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが前記コンピュータプログラムに従って動作することにより、パーソナルコンピュータ２００ｃを構成する各構成要素は、その機能の一部を達成する。
【０１７８】
パーソナルコンピュータ２００ｃを構成するサブモジュール鍵保持部２０１、変換情報鍵保持部２０２、関数保持部２０３、前処理部２０４、復号部２０５、展開部２０６、プログラム実行部２０７、統合情報保持部２０８、関数情報保持部２０９、復号状況管理部２１０、情報記憶部２１１、冗長処理部２１２は、以下に示す相違点を除いて、それぞれ、携帯電話２００ａにおいて同一の参照符号が付された構成要素と同一である。
【０１７９】
変換情報鍵保持部２０２は、携帯電話２００ａが保持する変換情報鍵テーブル２６１に代えて、変換情報鍵テーブル２６１ｃを有している。変換情報鍵テーブル２６１ｃは、１個の鍵情報を有しており、この１個の鍵情報は、図３に示す鍵情報１２２と同一のものである。
このように、携帯電話２００ａが保持する変換情報鍵テーブル２６１と、パーソナルコンピュータ２００ｃが保持する変換情報鍵テーブル２６１ｃとを比較すると、それぞれのテーブル内部に保持する鍵情報が異なり、また保持する鍵情報の数が異なっている。
【０１８０】
（３）まとめ
携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、上述したように、プログラム変換装置１００が保持している複数の鍵情報のうちの一部の鍵情報を予め保持している。また、例えば、パーソナルコンピュータ２００ｃは、プログラム変換装置１００が保持している複数の鍵情報のいずれも保持していないとしてもよい。
【０１８１】
内蔵するＣＰＵの処理性能が高く、また内部に記憶しているプログラムなどの情報の不正な改竄が容易な装置、例えば、パーソナルコンピュータ２００ｃは、携帯電話２００ａやＤＶＤプレーヤ２００ｂが保持する鍵情報の数より少ない数の鍵情報を保持している。
一方、内蔵するＣＰＵの処理性能が低く、また内部に記憶しているプログラムなどの情報の不正な改竄が容易でない装置、例えば、携帯電話２００ａ及びＤＶＤプレーヤ２００ｂは、それぞれ、パーソナルコンピュータ２００ｃが保持する鍵情報の数より多い数の鍵情報を保持している。
【０１８２】
このように、各装置が保持する鍵情報の数は異なる。配布プログラムに格納されている各統合情報は、鍵情報に含まれる変換情報鍵を用いて暗号化されているので、各装置において、復号することができる統合情報の数は異なる。このため、各装置において、まとめて復号される関数群が異なる。
例えば、携帯電話２００ａ及びＤＶＤプレーヤ２００ｂでは、まとめて復号される関数群が多く、パーソナルコンピュータ２００ｃでは、まとめて復号される関数群が少ない。
【０１８３】
このように、ＣＰＵの能力の低い携帯電話２００ａ及びＤＶＤプレーヤ２００ｂでは、まとめて復号される関数群が多いので、これらの関数群の復号及び消去の発生の頻度が少なくなり、これらの関数群の復号及び消去の時のＣＰＵへの負荷が軽減できる。
一方、ＣＰＵの能力の高いパーソナルコンピュータ２００ｃでは、まとめて復号される関数群が少なく、これらの関数群の復号及び消去の発生の頻度が多くなるが、処理性能の面で問題とはなりにくい。
【０１８４】
このように、上記に説明した実施の形態によると、各処理装置が備えるＣＰＵの処理能力及び内部に保持しているプログラムなどの情報に対するセキュリティ機能の程度に合わせて、処理方法の選択ができるという優れた効果を奏する。
２．変形例（１）
実施の形態のプログラム配布システム１０の変形例としてのプログラム配布システム１０ｂについて、説明する。プログラム配布システム１０ｂは、プログラム配布システム１０と同様に、プログラム変換装置１００ｂ、携帯電話２００ａｂ、ＤＶＤプレーヤ２００ｂｂ及びパーソナルコンピュータ２００ｃｂから構成されている。
【０１８５】
プログラム変換装置１００ｂは、実施の形態のプログラム配布システム１０のプログラム変換装置１００と同一である。また、携帯電話２００ａｂ、ＤＶＤプレーヤ２００ｂｂ及びパーソナルコンピュータ２００ｃｂは、それぞれ、実施の形態のプログラム配布システム１０の携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃと同様の構成を有している。
【０１８６】
ここでは、携帯電話２００ａとの相違点を中心として、携帯電話２００ａｂについて説明する。なお、ＤＶＤプレーヤ２００ｂｂ及びパーソナルコンピュータ２００ｃｂについては、携帯電話２００ａｂと同様であるので、説明を省略する。
（１）配布プログラムの受信時の動作
ここでは、配布プログラムの受信時の携帯電話２００ａｂの動作について、図３２〜図３３に示すフローチャートを用いて説明する。
【０１８７】
通信制御部２２７、通信部２２８及びアンテナ２２９は、携帯電話網３０、インターネット２０を介して接続されているプログラム変換装置１００ｂから、配布プログラムを受信し（ステップＳ３０１）、受信した配布プログラムを、配布プログラム２５０として、情報記憶部２１１へ書き込む（ステップＳ３０２）。
次に、図２５のステップＳ２０１に示すようにして、前処理部２０４は、配布プログラム２５０について、暗号化された関数位置情報と暗号化された統合情報の復号を行う（ステップＳ３０３）。
【０１８８】
次に、ステップＳ３０４〜Ｓ３１６において、前処理部２０４は、統合情報保持部２０８に記憶されている全ての統合情報の各々について、以下に示すステップＳ３０５〜Ｓ３１５を繰り返す。
前処理部２０４は、サブモジュール鍵保持部２０１からサブモジュール鍵２５１を読み出す（ステップＳ３０５）。次に、前処理部２０４は、処理対象となっている統合情報から追加元関数名を抽出し、抽出した追加元関数名を含む関数位置情報を関数情報保持部２０９から読み出し（ステップＳ３０６）、前処理部２０４は、読み出した関数位置情報から関数開始位置及び関数終了位置を抽出し、読み出したサブモジュール鍵を復号部２０５へ出力し、復号部２０５に対して、情報記憶部２１１に記憶されている配布プログラム２５０において、抽出した関数開始位置から関数終了位置までに格納されている暗号化された関数を復号するように指示し、復号部２０５は、指示に従って復号し（ステップＳ３０７）、復号部２０５は、生成された関数を、関数保持部２０３へ書き込む（ステップＳ３０８）。
【０１８９】
次に、ステップＳ３０９〜Ｓ３１３において、前処理部２０４は、処理対象の統合情報に含まれる全ての追加情報の各々について、以下に示すステップＳ３１０〜Ｓ３１２を繰り返す。
前処理部２０４は、処理対象となっている追加情報から追加関数名を抽出し、抽出した追加関数名を含む関数位置情報を関数情報保持部２０９から読み出し（ステップＳ３１０）、前処理部２０４は、読み出した関数位置情報から関数開始位置及び関数終了位置を抽出し、読み出したサブモジュール鍵を復号部２０５へ出力し、復号部２０５に対して、情報記憶部２１１に記憶されている配布プログラム２５０において、抽出した関数開始位置から関数終了位置までに格納されている暗号化された関数を復号するように指示し、復号部２０５は、指示に従って復号し（ステップＳ３１１）、復号部２０５は、生成された関数を、関数保持部２０３へ書き込む（ステップＳ３１２）。
【０１９０】
次に、冗長処理部２１２は、図２７に示す冗長ブロックの処理を行い（ステップＳ３１４）、前処理部２０４は、関数の統合を行う（ステップＳ３１５）。
次に、前処理部２０４は、関数保持部２０３、統合情報保持部２０８、関数情報保持部２０９に記憶されている全ての内容を消去する（ステップＳ３１７）。
こうして、復号された統合情報に含まれている複数の関数が、１個の関数として統合される。
【０１９１】
次に、ステップＳ３１５に示す前処理部２０４による関数の統合の詳細について、図３４に示すフローチャートを用いて説明する。
前処理部２０４は、関数保持部２０３に記憶されている複数の関数を１個の関数に統合し、新たに生成した関数を配布プログラム２５０のプログラム領域内に書き込み（ステップＳ３３１）、関数保持部２０３に記憶されている全ての関数を消去する（ステップＳ３３２）。
【０１９２】
次に、前処理部２０４は、配布プログラム２５０のヘッダ部内の各関数位置情報を、プログラム領域内に格納されている関数に合わせて更新する（ステップＳ３３３）。
次に、前処理部２０４は、配布プログラム２５０のプログラム領域内の関数を暗号化するように復号部２０５に指示をし、復号部２０５は、サブモジュール鍵を用いて、プログラム領域内の関数を暗号する（ステップＳ３３４）。
【０１９３】
次に、前処理部２０４は、配布プログラム２５０のヘッダ部内の関数位置情報を暗号化するように復号部２０５に指示をし、復号部２０５は、サブモジュール鍵を用いて、ヘッダ部内の関数位置情報を暗号する（ステップＳ３３５）。
次に、前処理部２０４は、配布プログラム２５０において、処理の対象となっている変換情報ブロックを削除し（ステップＳ３３６）、配布プログラム２５０において、変換情報ブロック数と変換情報位置情報を更新する（ステップＳ３３７）。
【０１９４】
（２）携帯電話２００ａｂによる配布プログラムの実行の動作
携帯電話２００ａｂによる配布プログラムの実行の動作について、図３５に示すフローチャートを用いて説明する。
制御部２２６は、入力部２２４を介して、携帯電話２００ａｂの利用者から配布プログラム２５０の実行の指示を受け付け（ステップＳ２００）、前処理部２０４は、配布プログラム２５０について、図２６に示すステップＳ２３１〜Ｓ２３３の処理をすることにより、暗号化された関数位置情報の復号を行う（ステップＳ２０１ａ）。
【０１９５】
プログラム実行部２０７は、プログラムカウンタＰＣにより示される格納位置から、命令コードを読み出し（ステップＳ２０２）、読み出した命令コードを解読し（ステップＳ２０３）、命令コードの種類が、外部関数の呼出しであるか、invoke命令又は関数の呼出しであるか、終了命令であるか、又はその他の命令コードであるかを判断する（ステップＳ２０４）。
【０１９６】
外部関数の呼出しである場合には（ステップＳ２０４）、プログラム実行部２０７は、外部関数の開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１４）、次に、ステップＳ２０２へ戻って処理を繰り返す。
invoke命令又は関数の呼出しである場合には（ステップＳ２０４）、プログラム実行部２０７は、復号状況管理部２１０が保持する復号状況テーブル３６１から、invoke命令又は関数の呼出しにより指定された関数を識別する関数名の取得を試み、関数名が存在すれば、当該関数が格納されている位置を示す開始アドレスの取得を試みる（ステップＳ２０８）。開始アドレスが、取得できれば（ステップＳ２０９）、取得した開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１３）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１９７】
開始アドレスが、取得できなければ（ステップＳ２０９）、プログラム実行部２０７は、関数保持部２０３内に記憶されている全ての関数を消去し（ステップＳ２１０）、展開部２０６は、図２８に示すステップＳ２８１〜Ｓ２８６の処理をすることにより、指定された関数の展開をし（ステップＳ２１１ａ）、指定された関数の開始アドレスをプログラムカウンタＰＣに設定し（ステップＳ２１３）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１９８】
終了命令である場合には（ステップＳ２０４）、プログラム実行部２０７は、関数保持部２０３、関数情報保持部２０９及び復号状況管理部２１０が保持している情報を全て消去し（ステップＳ２０６ａ）、他のプログラムの命令コードが格納されている位置をプログラムカウンタＰＣに設定し（ステップＳ２０７）、次に、ステップＳ２０２へ戻って処理を繰り返す。
【０１９９】
その他の命令コードである場合には（ステップＳ２０４）、プログラム実行部２０７は、当該命令コードの解読結果に従って、処理を実行し（ステップＳ２０５）、プログラムカウンタＰＣに「１」を加算し（ステップＳ２１５）、次に、ステップＳ２０２へ戻って処理を繰り返す。
（３）まとめ
上記に説明した変形例では、配布プログラムを最初に受信した時に、復号が可能な統合情報に従って、この統合情報により示される複数の関数を１個の関数に統合し、新たに生成した関数を暗号化して配布プログラムに書き込んでおく。
【０２００】
配布プログラムの実行時には、統合情報に基づく複数の関数の復号をすることなく、関数が呼び出される都度、暗号化関数を復号して実行する。これにより、配布プログラム実行時のＣＰＵの負荷を軽減することができるという優れた効果を奏する。
３．変形例（２）
実施の形態のプログラム配布システム１０の変形例としてのプログラム配布システム１０ｃについて、説明する。プログラム配布システム１０ｃは、プログラム配布システム１０と同様に、プログラム変換装置１００ｃ、携帯電話２００ａｃ、ＤＶＤプレーヤ２００ｂｃ及びパーソナルコンピュータ２００ｃｃから構成されている。
【０２０１】
プログラム変換装置１００ｃは、実施の形態のプログラム配布システム１０のプログラム変換装置１００と同様の構成を有している。また、携帯電話２００ａｃ、ＤＶＤプレーヤ２００ｂｃ及びパーソナルコンピュータ２００ｃｃは、それぞれ、実施の形態のプログラム配布システム１０の携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃと同様の構成を有している。
【０２０２】
ここでは、プログラム変換装置１００との相違点を中心として、プログラム変換装置１００ｃについて説明し。また、携帯電話２００ａとの相違点を中心として、携帯電話２００ａｃについて説明する。なお、ＤＶＤプレーヤ２００ｂｃ及びパーソナルコンピュータ２００ｃｃについては、携帯電話２００ａｃと同様であるので、説明を省略する。
３．１  プログラム変換装置１００ｃの構成
（１）情報記憶部１０１
プログラム変換装置１００ｃの情報記憶部１０１は、図３６に示す原プログラム６０１、図３７に示す検査用プログラム６１１及び図３９に示す変換情報ブロック６４１を予め記憶している。
【０２０３】
（原プログラム６０１）
原プログラム６０１は、図３６に示すように、処理ブロック６０２、６０３、６０４、６０５及び６０６を含んで構成されている。ここで、処理ブロック６０６に格納されている全ての命令コードを、数値とみなして、加算すると「３００」となるとする。
（検査用プログラム６１１）
検査用プログラム６１１は、図３７に示すように、命令コード６１２、６１３、６１４、６１５、６１６及び６１７を含んでいる。
【０２０４】
命令コード６１２は、変数ｓｕｍに「０」を代入することを示す命令コードである。
命令コード６１３は、アドレスを示す変数ａについて、変数ａ＝４００から始めて、変数ａに「１」を加算しながら、変数ａ＝４００となるまで、命令コード６１３と、命令コード６１５との間に記載されている命令コードを繰り返し実行することを示す命令コードである。
【０２０５】
命令コード６１４は、変数ａにより示される格納位置に格納されているデータを、変数ｓｕｍに加算することを示す命令コードである。
命令コード６１５は、命令コード６１３の繰り返しの終了位置を示す命令コードである。
命令コード６１６は、変数ｓｕｍが、「３００」であるか否かを判断する命令コードである。この判断結果が真である場合に限り、命令コード６１７を実行する。
【０２０６】
命令コード６１７は、プログラムの終了を示す命令コードである。プログラムの実行装置が、この命令を検出すると、当該プログラムの実行を終了する。
なお、検査用プログラム６１１は、必ずしも配布プログラムの構成要素である必要はない。例えば、実行環境が、検査用プログラムの機能を有する構成であって、配布プログラムには、その機能を使用するためのプログラム命令が記載されているとしてもよい。
【０２０７】
（変換情報ブロック６４１）
変換情報ブロック６４１は、図３９に示すように、変換情報サイズ６４２、変換情報種別６４３、変換情報鍵ＩＤ６４４、及び変換内容６４５から構成されている。
変換情報サイズ６４２は、当該変換情報サイズ６４２を含む変換情報ブロック６４１の長さを示す。
【０２０８】
変換情報種別６４３は、当該変換情報種別６４３を含む変換情報ブロック６４１が第３の種別のものであることを示している。具体的には、図３９に示すように、その値は、「３」である。第３の種別の変換情報ブロックは、配布プログラムに含まれる命令コードの内容を変換する変換命令を含む。
変換情報鍵ＩＤ６４４は、当該変換情報鍵ＩＤ６４４を含む変換情報ブロック６４１内の変換内容が暗号化される際に、暗号化において用いられる変換情報鍵に対応する識別子である。
【０２０９】
変換内容６４５は、開始アドレス６４６、終了アドレス６４７及び変換命令６４８から構成され、検査用プログラムを無効化するための情報である。
開始アドレス６４６及び終了アドレス６４７は、それぞれ、配布プログラムにおける位置を示している。
変換命令６４８は、変換後の命令コードを含む。
【０２１０】
こうして、変換内容６４５は、配布プログラムにおいて、開始アドレス６４６により示される位置から、終了アドレス６４７により示される位置までを、変換命令６４８に含まれる命令コードに変換することを示している。
（２）制御部１０４
制御部１０４は、入力部１０５から、原プログラム６０１に変換を施して配布プログラム５００を生成する旨の生成指示を受け取る。前記生成指示を受け取ると、制御部１０４は、情報記憶部１０１に配布プログラム５００を格納するための領域を確保する。次に、情報記憶部１０１から原プログラム６０１を読み出し、読み出した原プログラム６０１を、配布プログラム５００のプログラム領域５０２へ書き込む。
【０２１１】
（３）難読化部１０３
難読化部１０３は、情報記憶部１０１から検査用プログラム６１１を読み出し、プログラム領域５０２に書き込まれた原プログラムにおいて、処理ブロック６０４と処理ブロック６０５との間に、読み出した検査用プログラムを挿入して書き込む。
こうして、プログラム領域５０２には、図３８に示すプログラム６２１が格納される。プログラム６２１は、処理ブロック６２２、６２３、６２４、６２５、６２６及び６２７を含んで構成されている。
【０２１２】
処理ブロック６２２、６２３、６２４、６２６及び６２７は、それぞれ、原プログラム６０１の処理ブロック６０２、６０３、６０４、６０５及び６０６と同一であり、処理ブロック６２５は、検査用プログラム６１１と同一である。処理ブロック６２５は、命令コード６３０〜６３５を含み、命令コード６３０〜６３５は、それぞれ、検査用プログラム６１１の命令コード６１２〜６１７と同一である。
【０２１３】
ここで、配布プログラム５００において、命令コード６２５及び６３３が格納されている格納位置は、アドレス「２８０」及び「２８２」であり、処理ブロック６２７の先頭位置は、アドレス「４００」であり、最終位置は、アドレス「５００」である。
このようにして生成された配布プログラム５００が、配布され、不正者により、処理ブロック６２７の内部の命令コードが改竄された場合には、処理ブロック６２７内の全ての命令コードの加算値が、「３００」とならない可能性が高く、このとき、処理ブロック６２５の命令コード６３４により、処理ブロック６２７の改竄が検出され、改竄が検出されると、直ちに、命令コード６３５により、配布プログラム５００の実行が終了する。
【０２１４】
プログラム６２１に含まれる処理ブロック６２２〜６２７は、それぞれ、サブモジュール鍵により暗号化されて配布プログラム５００内に格納される。
次に、難読化部１０３は、情報記憶部１０１から変換情報ブロック６４１を読み出し、配布プログラム５００の変換情報領域５０３内の変換情報５５０に、読み出した変換情報ブロックを、追加して書き込む。この変換情報ブロックは、変換情報鍵を用いて、暗号化され、変換情報５５０内に格納される。
【０２１５】
（４）通信部１１２
通信部１１２は、少なくとも、図３８に示すプログラム６２１が暗号化されて生成された暗号化プログラムと、図３９に示す変換情報ブロック６４１が暗号化されて生成された暗号化変数情報ブロックとを含む配布プログラム５００を、携帯電話２００ａｃ、ＤＶＤプレーヤ２００ｂｃ及びパーソナルコンピュータ２００ｃｃへ送信する。
【０２１６】
３．２  携帯電話２００ａｃの構成
携帯電話２００ａｃは、プログラム変換装置１００ｃから、少なくとも、プログラム６２１が暗号化されて生成された暗号化プログラムと、変換情報ブロック６４１が暗号化されて生成された暗号化変数情報ブロックとを含む配布プログラム５００を、受信し、情報記憶部２１１に、配布プログラム２５０として記憶する。
【０２１７】
次に、携帯電話２００ａｃにおける配布プログラム２５０の実行の際の動作について、図４１に示すフローチャートを用いて説明する。
配布プログラム２５０の実行の操作指示を受け付けると、前処理部２０４は、配布プログラム２５０の変換情報に含まれる１個の変換情報ブロックを読み出し、読み出した変換情報ブロックから変換情報鍵ＩＤを抽出し（ステップＳ４０１）、次に、変換情報鍵保持部２０２に保持されている変換情報鍵テーブル２６１から、抽出した変換情報鍵ＩＤと同一の変換情報鍵ＩＤを探す（ステップＳ４０２）。
【０２１８】
同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在しなければ（ステップＳ４０３）、ステップＳ４０９へ進む。
同一の変換情報鍵ＩＤが、変換情報鍵テーブル２６１内に存在すれば（ステップＳ４０３）、抽出した前記変換情報鍵ＩＤに対応する変換情報鍵を、変換情報鍵テーブル２６１から読み出し（ステップＳ４０４）、読み出した変換情報鍵を復号部２０５へ出力し、復号部２０５は、受け取った変換情報鍵を用いて、変換情報ブロック内の暗号化された部分を復号する（ステップＳ４０５）。次に、変換情報ブロックに含まれる変換情報種別が、「３」であるか否かを判断し、「３」でない場合には（ステップＳ４０６）、他の処理がされる。
【０２１９】
変換情報種別が、「３」であると判断される場合には（ステップＳ４０６）、前処理部２０４は、変換情報ブロックから変換内容を読み出し（ステップＳ４０７）、読み出した変換内容から、開始アドレス、終了アドレス及び変換命令を抽出し、配布プログラム２５０において、抽出した開始アドレスにより示される位置から抽出した終了アドレスにより示される位置までを、抽出した変換命令に置き換える（ステップＳ４０８）。こうして、図４０に示すプログラム６５１が生成される。プログラム６５１は、処理ブロック６５２、６５３、６５４、６５５、６５６及び６５７から構成されている。また、処理ブロック６５５は、命令コード６５８、６５９、６６０及び６６１を含む。ここで、命令コード６５９により、変数ｓｕｍに「３００」が代入されるので、命令コード６６０では、常に、偽と判断され、命令コード６６１は、実行されることはない。
【０２２０】
その後、プログラム実行部２０７は、プログラムカウンタＰＣにより示される格納位置から、命令コードを読み出し（ステップＳ４０９）、読み出した命令コードを解読し（ステップＳ４１０）、解読結果に従って、処理を実行し、プログラムカウンタＰＣに「１」を加算し（ステップＳ４１１）、次に、ステップＳ４０９へ戻って処理を繰り返す。
３．３  まとめ
以上説明したように、第３の種別の変換情報ブロック内の暗号化された変換内容が復号された場合に、図４０に示すように、変換内容により、配布プログラム内の検査用プログラムが変換されるので、検査用プログラムの動作が省略される。一方、第３の種別の変換情報ブロック内の暗号化された変換内容が復号されなかった場合に、検査用プログラムは、変換されず元のままであり、不正者により、検査用プログラムの検査対象となる部分が改竄された場合には、検査用プログラムによりその改竄が検出され、配布プログラムの動作が終了する。
【０２２１】
第３の種別の変換情報ブロック内の暗号化された変換内容が復号されるか否かは、変換情報ブロックに含まれる変換情報鍵ＩＤに対応する変換情報鍵を、携帯電話２００ａｃが保持しているか否かに依存する。携帯電話２００ａｃが変換情報ブロックに含まれる変換情報鍵ＩＤに対応する変換情報鍵を保持している場合には、変換内容が復号され、当該変換情報鍵を保持していない場合には、変換内容は復号されない。
【０２２２】
このように、検査用プログラムが動作するか否かを、携帯電話２００ａｃが変換情報鍵を保持しているか否かに依存させることができる。
携帯電話２００ａｃが有する情報記憶部２１１が、その記憶内容を不正者からの不正な利用から保護する機構を備えている場合には、携帯電話２００ａｃに変換情報鍵を保持させておけばよい。
【０２２３】
パーソナルコンピュータ２００ｃｃのように、機器が有する情報記憶部が、外部の者から簡単にアクセスできるように構成されている場合には、パーソナルコンピュータ２００ｃｃに変換情報鍵を保持させなければよい。
４．変形例（３）
実施の形態のプログラム配布システム１０の変形例としてのプログラム配布システム１０ｄについて、説明する。プログラム配布システム１０ｄは、プログラム配布システム１０と同様に、プログラム変換装置１００ｄ、携帯電話２００ａｄ、ＤＶＤプレーヤ２００ｂｄ及びパーソナルコンピュータ２００ｃｄから構成されている。
【０２２４】
プログラム変換装置１００ｄは、実施の形態のプログラム配布システム１０のプログラム変換装置１００と同様の構成を有している。また、携帯電話２００ａｄ、ＤＶＤプレーヤ２００ｂｄ及びパーソナルコンピュータ２００ｃｄは、それぞれ、実施の形態のプログラム配布システム１０の携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃと同様の構成を有している。
【０２２５】
ここでは、プログラム変換装置１００との相違点を中心として、プログラム変換装置１００ｄについて説明し。また、携帯電話２００ａとの相違点を中心として、携帯電話２００ａｄについて説明する。なお、ＤＶＤプレーヤ２００ｂｄ及びパーソナルコンピュータ２００ｃｄについては、携帯電話２００ａｄと同様であるので、説明を省略する。
プログラム変換装置１００ｄにおいて、初期状態では、サブモジュール鍵保持部１０９には、サブモジュール鍵は保持されておらず、また、変換情報鍵保持部１１１の変換情報鍵テーブル１２１は、変換情報鍵を保持していない。
【０２２６】
プログラム変換装置１００ｄは、さらに、後述する鍵生成部を含む。
４．１  プログラム変換装置１００ｄの構成
（１）鍵生成部
鍵生成部は、乱数を生成し、生成した乱数をサブモジュール鍵として、サブモジュール鍵保持部１０９へ書き込む。
【０２２７】
また、鍵生成部は、変換情報鍵ＩＤを生成し、乱数を生成し、生成した乱数を変換情報鍵として、変換情報鍵ＩＤと変換情報鍵とからなる鍵情報を変換情報鍵テーブル１２１へ書き込む。鍵生成部は、上記の変換情報鍵ＩＤの生成、乱数の生成、変換情報鍵ＩＤと変換情報鍵としての前記生成した乱数とからなる鍵情報の書き込みとを繰り返す。
（２）情報記憶部１０１
プログラム変換装置１００ｄの情報記憶部１０１は、図４２に示すデバイス鍵テーブル７０１及び図４３に示すデバイス鍵対応テーブル７１１を予め有している。
【０２２８】
（デバイス鍵テーブル７０１）
デバイス鍵テーブル７０１は、一例として図４２に示すように、複数個のデバイス鍵情報から構成されている。その個数は、プログラム変換装置によるプログラムの配布の対象である機器の台数に等しい。各デバイス鍵情報は、各機器に対応している。
各デバイス鍵情報は、デバイス鍵ＩＤ及びデバイス鍵を含む。デバイス鍵ＩＤは、当該デバイス鍵情報に対応する機器を一意に識別する識別情報である。デバイス鍵は、当該デバイス鍵情報に対応する機器に割り当てられた鍵情報である。
【０２２９】
（デバイス鍵対応テーブル７１１）
デバイス鍵対応テーブル７１１は、図４３に示すように、複数個のデバイス鍵対応情報から構成されており、各デバイス鍵対応情報は、デバイス鍵ＩＤと変換情報鍵ＩＤとから構成されている。デバイス鍵ＩＤは、上述したように、機器を識別する識別情報であり、また、変換情報鍵ＩＤは、上述したように、変換情報鍵を識別する識別情報である。
【０２３０】
各デバイス鍵情報は、各機器に対してどの変換情報鍵が割り当てられているかを示している。つまり、各デバイス鍵情報に含まれるデバイス鍵ＩＤと変換情報鍵ＩＤとの対応は、当該デバイス鍵ＩＤにより識別される機器に対して、当該変換情報鍵ＩＤにより識別される変換情報鍵が割り当てられていることを示している。
（配布プログラム）
配布プログラムは、さらに、図４４に示す暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２を含む。
【０２３１】
暗号化サブモジュール鍵ブロック７２１は、複数個の暗号化サブモジュール鍵を含み、各暗号化サブモジュール鍵は、サブモジュール鍵が、デバイス鍵を用いて暗号化されて生成されたものである。
暗号化変換情報鍵ブロック７２２は、複数の変換情報鍵ブロックを含む。各変換情報鍵ブロックは、変換情報鍵ＩＤ、デバイス鍵ＩＤ及び暗号化変換鍵情報から構成されている。ここで、変換情報鍵ＩＤ及びデバイス鍵ＩＤは、上述した通りである。暗号化変換鍵情報は、変換情報鍵が、デバイス鍵を用いて暗号化されて生成されたものである。
【０２３２】
（３）難読化部１０３
難読化部１０３の動作について、図４５〜図４６に示すフローチャートを用いて説明する。
難読化部１０３は、さらに、サブモジュール鍵保持部１０９からサブモジュール鍵Ｓ＿Ｋｅｙを読み出す（ステップＳ５０１）。
【０２３３】
次に、難読化部１０３は、ステップＳ５０２からＳ５０６において、デバイス鍵テーブル７０１に含まれている各デバイス鍵情報について、ステップＳ５０３〜Ｓ５０５を繰り返す。
難読化部１０３は、デバイス鍵テーブル７０１から１個のデバイス鍵情報を読み出し、読み出したデバイス鍵情報からデバイス鍵ＤＫを抽出する（ステップＳ５０３）。次に、抽出したデバイス鍵ＤＫを用いて、サブモジュール鍵Ｓ＿Ｋｅｙを暗号化して暗号化サブモジュール鍵Ｅｎｃ（ＤＫ、Ｓ＿Ｋｅｙ）を生成する（ステップＳ５０４）。次に、生成した暗号化サブモジュール鍵を、暗号化サブモジュール鍵ブロック７２１へ書き込む（ステップＳ５０５）。
【０２３４】
各デバイス鍵情報について、上記の繰り返しが終了すると、難読化部１０３は、
次に、ステップＳ５０７からＳ５１３において、デバイス鍵対応テーブル７１１に含まれている各デバイス鍵対応情報について、ステップＳ５０８〜Ｓ５１２を繰り返す。
難読化部１０３は、デバイス鍵対応テーブル７１１から１個のデバイス鍵対応情報を読み出し、読み出したデバイス鍵対応情報からデバイス鍵ＩＤと変換情報鍵ＩＤとを抽出する（ステップＳ５０８）。次に、抽出したデバイス鍵ＩＤに対応するデバイス鍵ＤＫをデバイス鍵テーブル７０１から読み出し（ステップＳ５０９）、抽出した変換情報鍵ＩＤに対応する変換情報鍵Ｃ＿Ｋｅｙを変換情報鍵テーブル１２１から読み出し（ステップＳ５１０）、次に、読み出したデバイス鍵ＤＫを用いて、読み出した変換情報鍵Ｃ＿Ｋｅｙを暗号化して暗号化変換情報鍵Ｅｎｃ（ＤＫ、Ｃ＿Ｋｅｙ）を生成し（ステップＳ５１１）、変換情報鍵ＩＤ、デバイス鍵ＩＤ及び暗号化変換情報鍵を変換情報鍵ブロックへ書き込む（ステップＳ５１２）。
【０２３５】
このようにして、図４４に示す暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２を含む配布プログラムが生成される。
（４）通信部１１２
通信部１１２は、暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２を含む配布プログラムを、携帯電話２００ａｄ、ＤＶＤプレーヤ２００ｂｄ及びパーソナルコンピュータ２００ｃｄへ送信する。
【０２３６】
４．２  携帯電話２００ａｄの構成
携帯電話２００ａｄは、予め、自身のデバイス鍵ＤＫ及びデバイス鍵ＩＤを保持している。また、初期状態では、サブモジュール鍵保持部２０１には、サブモジュール鍵は、保持されておらず、変換情報鍵保持部２０２が有する変換情報鍵テーブル２６１は、鍵情報を保持していない。
【０２３７】
情報記憶部２１１は、暗号化サブモジュール鍵ブロック及び暗号化変換情報鍵ブロックを含む配布プログラムを記憶している。
ここで、図４７に示すフローチャートを用いて、携帯電話２００ａｄにおける暗号化サブモジュール鍵及び暗号化変換情報鍵の復号の動作について説明する。
携帯電話２００ａｄの前処理部２０４は、自身のデバイス鍵ＤＫとデバイス鍵ＩＤとを読み出し（ステップＳ５２１）、次に、配布プログラム２５０内の暗号化サブモジュール鍵ブロックにおいて、読み出したデバイス鍵ＩＤに対応する暗号化サブモジュール鍵を特定する。具体的には、デバイス鍵ＩＤに対応するフィールドに格納されている暗号化サブモジュール鍵を特定する（ステップＳ５２２）。次に、前処理部２０４は、デバイス鍵を用いて、特定した暗号化サブモジュール鍵を復号して、サブモジュール鍵を生成し（ステップＳ５２３）、生成したサブモジュール鍵をサブモジュール鍵保持部２０１へ書き込む（ステップＳ５２４）。
【０２３８】
次に、前処理部２０４は、ステップＳ５２５からＳ５３１において、配布プログラム内の暗号化変換情報鍵ブロックに含まれる各変換情報鍵ブロックについて、ステップＳ５２６〜Ｓ５３０を繰り返す。
前処理部２０４は、配布プログラム内の暗号化変換情報鍵ブロックから１個の変換情報鍵ブロックを読み出し（ステップＳ５２６）、変換情報鍵ブロック内のデバイス鍵ＩＤと、自身が保持しているデバイス鍵ＩＤとを比較する（ステップＳ５２７）。一致していなければ（ステップＳ５２８でＮＯ）、上記繰り返しに戻る。一致していれば（ステップＳ５２８でＹＥＳ）、デバイス鍵を用いて、暗号化変換情報鍵を復号して変換情報鍵を生成し（ステップＳ５２９）、変換情報鍵ブロック内の変換情報鍵ＩＤと、生成した変換情報鍵とを対応付けて、変換情報鍵テーブル２６１へ書き込む（ステップＳ５３０）。
【０２３９】
以上のようにして、サブモジュール鍵がサブモジュール鍵保持部２０１へ書き込まれ、変換情報鍵が変換情報鍵テーブル２６１へ書き込まれる。
これにより、デバイス鍵を持っていない不正な機器が、サブモジュール鍵や変換情報鍵を得ることができなくなるので、不正な機器が不正にプログラムを復号する危険性や、プログラムの難読化を弱める危険性を無くし、これらの不正な攻撃からプログラムを保護することができる。
【０２４０】
４．３  情報処理装置の無効化
プログラム変換装置１００ｄは、携帯電話２００ａｄ、ＤＶＤプレーヤ２００ｂｄ及びパーソナルコンピュータ２００ｃｄなどの各情報処理装置の無効化を管理している。
ここで、デバイス鍵ＩＤ「ｔ」により識別されるデバイス鍵ＤＫ−ｔを有する情報処理装置が不正に解析されて、デバイス鍵、サブモジュール鍵、変換情報鍵のいずれかが暴露されたとする。
【０２４１】
この場合には、プログラム変換装置１００ｄは、デバイス鍵テーブル７０１及びデバイス鍵対応テーブル７１１において、「ｔ」であるデバイス鍵ＩＤを含むフィールドを削除する。こうしてデバイス鍵対応テーブル７１１から無効化されたデバイス鍵が削除される。
これ以降、プログラム変換装置１００ｄは、無効化されたデバイス鍵を含まないデバイス鍵対応テーブルを用いる。
【０２４２】
これにより、これ以降にプログラム変換装置１００ｄにより生成された配布プログラムを、デバイス鍵ＤＫ−ｔを有する情報処理装置で実行しようとしても、サブモジュール鍵や変換情報鍵を得ることができなくなる。こうして、デバイス鍵ＤＫ−ｔを有する情報処理装置を無効化することができる。
サブモジュール鍵及び変換情報鍵は、配布プログラムを生成する都度、乱数を用いて生成される。このため、無効化前のサブモジュール鍵が暴露されても、無効化後に新たに生成された配布プログラムの生成に用いられたサブモジュール鍵は、無効化前のサブモジュール鍵とは異なるものであり、新たなサブモジュール鍵が知られることはない。
【０２４３】
５．その他の変形例
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
（１）プログラム変換装置１００は、複数のセキュリティレベル鍵を保持しているとしてもよい。複数のセキュリティレベル鍵は、それぞれ、複数のセキュリティレベルに対応している。
【０２４４】
例えば、携帯電話２００ａのセキュリティレベルは、「３」であり、ＤＶＤプレーヤ２００ｂのセキュリティレベルは、「２」であり、パーソナルコンピュータ２００ｃのセキュリティレベルは、「１」であるとする。
このとき、プログラム変換装置１００は、セキュリティレベル「３」に対応するセキュリティレベル鍵ＳＫＥＹ３と、セキュリティレベル「２」に対応するセキュリティレベル鍵ＳＫＥＹ２と、セキュリティレベル「１」に対応するセキュリティレベル鍵ＳＫＥＹ１とを保持している。
【０２４５】
ここで、プログラム変換装置１００において、例えば３個の統合情報が生成され各統合情報が暗号化されるとする。
プログラム変換装置１００は、セキュリティレベル鍵ＳＫＥＹ３をそれぞれ用いて、第１、第２及び第３の統合情報をそれぞれ暗号化して、３個の暗号化統合情報を生成する。また、プログラム変換装置１００は、セキュリティレベル鍵ＳＫＥＹ２をそれぞれ用いて、第１及び第２の統合情報をそれぞれ暗号化して、２個の暗号化統合情報を生成する。また、プログラム変換装置１００は、セキュリティレベル鍵ＳＫＥＹ１をそれぞれ用いて、第１統合情報を暗号化して、暗号化統合情報を生成する。
【０２４６】
次に、プログラム変換装置１００は、こうして生成した６個の暗号化統合情報を変換情報５５０内に挿入する。
こうして、６個の暗号化統合情報が挿入された変換情報５５０を含む配布プログラムが、携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃに送信される。
【０２４７】
携帯電話２００ａ、ＤＶＤプレーヤ２００ｂ及びパーソナルコンピュータ２００ｃは、それぞれ、予め、セキュリティレベル鍵ＳＫＥＹ３、ＳＫＥＹ２及びＳＫＥＹ１を保持している。
携帯電話２００ａは、保持しているセキュリティレベル鍵ＳＫＥＹ３を用いて、３個の暗号化統合情報を復号して、３個の統合情報を生成し、生成した３個の統合情報を用いる。
【０２４８】
ＤＶＤプレーヤ２００ｂは、保持しているセキュリティレベル鍵ＳＫＥＹ２を用いて、２個の暗号化統合情報を復号して、２個の統合情報を生成し、生成した２個の統合情報を用いる。
パーソナルコンピュータ２００ｃは、保持しているセキュリティレベル鍵ＳＫＥＹ１を用いて、１個の暗号化統合情報を復号して、１個の統合情報を生成し、生成した１個の統合情報を用いる。
【０２４９】
ここで、パーソナルコンピュータ２００ｃ、セキュリティレベル鍵を保持していないとしてもよい。この場合には、パーソナルコンピュータ２００ｃは、暗号化統合情報を復号することはできず、統合情報を用いることはできない。
（２）図１１に示す統合情報において、関数名により関数を識別しているが、統合情報はこのようなものに限るものではなく、統合情報は、関数名に代えて、関数名を表す識別子を含むとしてもよいし、関数名に代えて、関数の格納位置を示す位置アドレスを含むとしてもよい。
【０２５０】
（３）追加元関数サイズは、追加元関数を展開処理した際に、関数保持部に展開される関数の合計サイズであるとしてもよい。
例えば、旧Ｍｅｔｈｏｄ１を、新Ｍｅｔｈｏｄ１、新Ｍｅｔｈｏｄ１＿ｂ０、新Ｍｅｔｈｏｄ１＿ｂ１及び新Ｍｅｔｈｏｄ１＿ｂ２に分割した場合に、新Ｍｅｔｈｏｄ１、新Ｍｅｔｈｏｄ１＿ｂ０、新Ｍｅｔｈｏｄ１＿ｂ１及び新Ｍｅｔｈｏｄ１＿ｂ２の合計のサイズを、追加元関数サイズとする。
【０２５１】
プログラム変換装置は、結合情報を暗号化する際に、追加元関数サイズに基づいて、いずれの変換情報鍵を用いて暗号化するかを決定する。
例えば、追加元関数サイズが、０Ｋバイト以上４Ｋバイト未満の場合に、変換情報鍵Ａを選択し、追加元関数サイズが、４Ｋバイト以上４０Ｋバイト未満の場合に、変換情報鍵Ｂを選択する。
【０２５２】
機器１が、セキュリティ強度が高いメモリ（例えば、ＬＳＩ内部に存在しユーザからのアクセスが困難なメモリ）に関数保持部を有し、この関数保持部が、４０Ｋバイト以上の記憶領域を有する場合には、機器１に、変換情報鍵Ａと変換情報鍵Ｂとを予め持たせる。
機器２が、セキュリティ強度が高いメモリに関数保持部を有し、この関数保持部が、４Ｋバイト〜４０Ｋバイトの記憶領域を有する場合には、機器２には、変換情報鍵Ａのみを持たせておく。
【０２５３】
セキュリティ強度が高いメモリを持たない機器には、変換情報鍵Ａも変換情報鍵Ｂも持たせない。
このような構成を用いれば、セキュリティ強度が高いメモリを有する機器では、その機器に有するセキュリティ強度の高いメモリにプログラムを展開し、プログラムの処理を行うことができる。
【０２５４】
（４）本実施の形態では、暗号及び復号において、ＤＥＳやＡＥＳなどのいわゆる共通鍵暗号方式を用いるとしているが、これには限定されない。ＲＳＡなどのいわゆる公開鍵暗号方式を用いるとしてもよい。
また、セキュリティ強度が低い機器に対しては、公開鍵暗号方式を用い、セキュリティ強度が高い機器に対しては、共通鍵暗号方式を用いるなど、暗号方式の使い分けをしてもよい。
【０２５５】
（５）上述したように、携帯電話２００ａは、プログラム変換装置１００から配布プログラムを取得し内部に記憶する。次に、携帯電話２００ａは、配布プログラムをメモリカードに書き込むことにより保存することができる。さらに、セキュリティ強度の異なる別の装置、例えば、ＤＶＤプレーヤ２００ｂやパーソナルコンピュータ２００ｃは、前記メモリカードから配布プログラムを読み出し、読み出した配布プログラムを内部に記憶し、記憶した配布プログラムを実行することができる。
【０２５６】
このように、配布プログラムは、セキュリティ強度の異なる機器で実行することができる。
（６）上記の実施の形態において、冗長情報は、冗長ブロックの存在位置を示す開始位置、終了位置を含んでいるが、冗長ブロックの存在位置を示すために、冗長情報が、位置を直接的に示すアドレス等を含んでいなくてもよい。
【０２５７】
例えば、プログラム内の特定の変数が用いられているブロックが、冗長ブロックであることを示す情報を、前記冗長情報が含んでいるとしてもよい。
（７）上記の実施の形態において、プログラム変換装置は、典型的には、難読化に用いた情報に基づいて、難読化強度を弱める情報を生成している。
ここで、難読化の強度を弱める情報は、難読化の逆変換を行う変換情報であるとしてもよい。
【０２５８】
このような構成により、難読化に用いた情報から、どこにどのような難読化が施されているかが分かるので、それを弱めるような変換を容易に定義することができる。具体的には、冗長な箇所をＮＯＰ命令に置き換えることや、施された難読化の逆変換を示す変換情報を定義することが可能となる。
（８）上記において説明したように、本発明は、プログラムの難読化効果を変換するための変換情報を用いてプログラムを実行する実行手段を有するプログラム変換実行装置である。
【０２５９】
ここで、前記変換情報の一部または全てが暗号化されており、前記プログラム変換実行装置は、さらに、暗号化された変換情報を復号化する復号手段を備え、前記実行手段は、前記復号手段で復号化した変換情報を用いてプログラムを実行するとしてもよい。
ここで、前記プログラム変換実行装置は、さらに、前記変換手段によってできたプログラムを記憶するプログラム記憶手段を有するとしてもよい。
【０２６０】
ここで、前記変換情報は、プログラムの難読化効果を弱める変換情報であるとしてもよい。
また、本発明は、プログラムの構造を解析するプログラム解析手段と、前記プログラム解析手段が解析した情報に基づいて、前記プログラムを変換するための変換情報を生成する変換情報生成手段とを有する変換情報生成装置である。
【０２６１】
また、本発明は、プログラムを難読化するプログラム難読化手段と、前記プログラム難読化手段が難読化したプログラムの難読化効果を変換するための変換情報を生成する変換情報生成手段とを有するプログラム生成装置である。
ここで、前記変換情報は、プログラムの難読化効果を弱める変換情報であるとしてもよい。
【０２６２】
ここで、前記変換情報は、端末装置ごとに最適な難読化効果をもたらすようにプログラムを変換するための変換情報であるとしてもよい。
また、本発明は、プログラムと前記プログラムを変換するための変換情報とを配布するプログラム配布方法である。
ここで、前記変換情報は、前記配布方法で配布したプログラムを、端末装置で変換するための情報であるとしてもよい。
【０２６３】
ここで、前記変換情報は、プログラムの難読化効果を弱める変換情報であるとしてもよい。
ここで、前記変換情報は、端末装置ごとに最適な難読化効果をもたらすようにプログラムを変換するための変換情報であるとしてもよい。
また、本発明は、プログラムを変換するための変換情報を用いてプログラムを変換する変換ステップを有するプログラム変換方法である。
【０２６４】
ここで、前記プログラム変換方法は、さらに、暗号化された変換情報を復号化する復号ステップと、前記復号ステップで復号化した変換情報を用いてプログラムを変換する変換ステップとを有するとしてもよい。
（９）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、各装置は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０２６５】
（１０）上記の各装置を構成する構成要素の一部又は全部は、１個のシステムＬＳＩ（Large ScaleIntegration：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、システムＬＳＩは、その機能を達成する。
【０２６６】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されてもよい。また、ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Field Programmable Gate Array）やＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサを利用しても良い。
【０２６７】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応などが可能性としてあり得る。
（１１）上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なＩＣカード又は単体のモジュールから構成されているとしてもよい。前記ＩＣカード又は前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、などから構成されるコンピュータシステムである。前記ＩＣカード又は前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ＩＣカード又は前記モジュールは、その機能を達成する。このＩＣカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
【０２６８】
（１２）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
【０２６９】
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
【０２７０】
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（１３）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【産業上の利用可能性】
【０２７１】
本発明を構成する各装置は、コンピュータプログラムを製作し、配布するコンピュータプログラム産業において、経営的に、また継続的及び反復的に使用することができる。また、本発明を構成する各装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。
【図面の簡単な説明】
【０２７２】
【図１】  プログラム配布システム１０の構成を示すシステム構成図である。
【図２】  プログラム変換装置１００の構成を示すブロック図である。
【図３】  変換情報鍵テーブル１２１のデータ構造の一例である。
【図４】  原プログラム１３０のデータ構造の一例である。
【図５】  冗長ブロック１６１、１６２、１６３、１６４、・・・のデータ構造の一例である。
【図６】  原関数情報テーブル１４０のデータ構造の一例である。
【図７】  配布プログラム５００のデータ構造の一例である。
【図８】  ヘッダ部５１０のデータ構造の一例である。
【図９】  新プログラム５３０のデータ構造の一例である。
【図１０】  暗号化プログラム５４６のデータ構造の一例である。
【図１１】  変換情報５５０のデータ構造の一例である。図１２へ続く。
【図１２】  変換情報５５０のデータ構造の一例である。図１１から続く。
【図１３】  プログラム変換装置１００の動作を示すフローチャートである。図１４へ続く。
【図１４】  プログラム変換装置１００の動作を示すフローチャートである。図１５へ続く。
【図１５】  プログラム変換装置１００の動作を示すフローチャートである。図１６へ続く。
【図１６】  プログラム変換装置１００の動作を示すフローチャートである。図１７へ続く。
【図１７】  プログラム変換装置１００の動作を示すフローチャートである。図１８へ続く。
【図１８】  プログラム変換装置１００の動作を示すフローチャートである。図１７から続く。
【図１９】  携帯電話２００ａの構成を示すブロック図である。
【図２０】  変換情報鍵テーブル２６１のデータ構造の一例である。
【図２１】  関数情報２８１のデータ構造の一例である。
【図２２】  統合情報３０１、統合情報３０２、・・・、冗長情報３０３、冗長情報３０４、・・・のデータ構造の一例である。
【図２３】  関数保持部２０３が保持する関数３４１、関数３４２、関数３４３及び関数３４４のデータ構造の一例である。
【図２４】  復号状況テーブル３６１のデータ構造の一例である。
【図２５】  携帯電話２００ａによる配布プログラムの実行の動作を示すフローチャートである。
【図２６】  前処理部２０４及び復号部２０５による暗号化された関数位置情報と暗号化された統合情報の復号の動作を示すフローチャートである。
【図２７】  冗長処理部２１２による動作を示すフローチャートである。
【図２８】  展開部２０６による動作を示すフローチャートである。図２９へ続く。
【図２９】  展開部２０６による動作を示すフローチャートである。図２８から続く。
【図３０】  ＤＶＤプレーヤ２００ｂの構成を示すブロック図である。
【図３１】  パーソナルコンピュータ２００ｃの構成を示すブロック図である。
【図３２】  配布プログラムの受信時の携帯電話２００ａｂの動作を示すフローチャートである。図３３へ続く。
【図３３】  配布プログラムの受信時の携帯電話２００ａｂの動作を示すフローチャートである。図３２から続く。
【図３４】  前処理部２０４による関数の統合の詳細の動作を示すフローチャートである。
【図３５】  携帯電話２００ａｂによる配布プログラムの実行の動作を示すフローチャートである。
【図３６】  原プログラム６０１のデータ構造の一例を示す。
【図３７】  検査用プログラム６１１のデータ構造の一例を示す。
【図３８】  プログラム６２１のデータ構造の一例を示す。
【図３９】  変換情報ブロック６４１のデータ構造の一例を示す。
【図４０】  プログラム６５１のデータ構造の一例を示す。
【図４１】  携帯電話２００ａｃにおける配布プログラム２５０の実行の際の動作を示すフローチャートである。
【図４２】  デバイス鍵テーブル７０１のデータ構造の一例を示す。
【図４３】  デバイス鍵対応テーブル７１１のデータ構造の一例を示す。
【図４４】  暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２のデータ構造の一例を示す。
【図４５】  プログラム変換装置１００ｄの難読化部１０３による暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２の生成の動作を示すフローチャートである。図４６へ続く。
【図４６】  プログラム変換装置１００ｄの難読化部１０３による暗号化サブモジュール鍵ブロック７２１及び暗号化変換情報鍵ブロック７２２の生成の動作を示すフローチャートである。図４５から続く。
【図４７】  携帯電話２００ａｄにおける暗号化サブモジュール鍵及び暗号化変換情報鍵の復号の動作を示すフローチャートである。
【符号の説明】
【０２７３】
１０    プログラム配布システム
２０    インターネット
３０    携帯電話網
１００    プログラム変換装置
１０１    情報記憶部
１０２    プログラム解析部
１０３    難読化部
１０４    制御部
１０５    入力部
１０６    表示部
１０７    冗長処理生成部
１０９    サブモジュール鍵保持部
１１０    暗号化部
１１１    変換情報鍵保持部
１１２    通信部
２００ａ  携帯電話
２００ｂ  ＤＶＤプレーヤ
２００ｃ  パーソナルコンピュータ
２０１    サブモジュール鍵保持部
２０２    変換情報鍵保持部
２０３    関数情報保持部
２０３    関数保持部
２０４    前処理部
２０５    復号部
２０６    展開部
２０７    プログラム実行部
２０８    統合情報保持部
２０９    関数情報保持部
２１０    復号状況管理部
２１１    情報記憶部
２１２    冗長処理部
２２１    スピーカ
２２２    マイク
２２３    表示部
２２４    入力部
２２５    変換部
２２６    制御部
２２７    通信制御部
２２８    通信部
２２９    アンテナ
【図１】
0004828517.tif 000002
【図２】
0004828517.tif 000003
【図３】
0004828517.tif 000004
【図４】
0004828517.tif 000005
【図５】
0004828517.tif 000006
【図６】
0004828517.tif 000007
【図７】
0004828517.tif 000008
【図８】
0004828517.tif 000009
【図９】
0004828517.tif 000010
【図１０】
0004828517.tif 000011
【図１１】
0004828517.tif 000012
【図１２】
0004828517.tif 000013
【図１３】
0004828517.tif 000014
【図１４】
0004828517.tif 000015
【図１５】
0004828517.tif 000016
【図１６】
0004828517.tif 000017
【図１７】
0004828517.tif 000018
【図１８】
0004828517.tif 000019
【図１９】
0004828517.tif 000020
【図２０】
0004828517.tif 000021
【図２１】
0004828517.tif 000022
【図２２】
0004828517.tif 000023
【図２３】
0004828517.tif 000024
【図２４】
0004828517.tif 000025
【図２５】
0004828517.tif 000026
【図２６】
0004828517.tif 000027
【図２７】
0004828517.tif 000028
【図２８】
0004828517.tif 000029
【図２９】
0004828517.tif 000030
【図３０】
0004828517.tif 000031
【図３１】
0004828517.tif 000032
【図３２】
0004828517.tif 000033
【図３３】
0004828517.tif 000034
【図３４】
0004828517.tif 000035
【図３５】
0004828517.tif 000036
【図３６】
0004828517.tif 000037
【図３７】
0004828517.tif 000038
【図３８】
0004828517.tif 000039
【図３９】
0004828517.tif 000040
【図４０】
0004828517.tif 000041
【図４１】
0004828517.tif 000042
【図４２】
0004828517.tif 000043
【図４３】
0004828517.tif 000044
【図４４】
0004828517.tif 000045
【図４５】
0004828517.tif 000046
【図４６】
0004828517.tif 000047
【図４７】
0004828517.tif 000048