(57)【要約】  【課題】  オーバレイローダで、分割プログラムを順にロードしながら実行する場合に、実行時のロード回数が考慮されないため、高速化に限界がある。メモリ上の生存時間が考慮されないので、秘匿性の高い部分が長い時間メモリ上に残ったままになり、プログラムの安全性が下がる。  【解決手段】  分割プログラムをロード領域にロードするオーバレイローダと、分割プログラムをロードする位置を記憶する分割プログラムロード位置記憶手段と、分割プログラムのロード履歴を管理する分割プログラムロード履歴管理手段と、それらを記憶する分割プログラムロード履歴記憶手段と、分割プログラムコールツリーと分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置決定手段により、分割プログラムの最適なロード位置を決定し、暗号化プログラムの実行を行う。【選択図】  図１
2005050196.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、
前記分割プログラム記憶手段で記憶しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持手段と、
メモリ上に配置されるロード領域と、
前記分割プログラム記憶手段に記憶している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダと、
前記オーバレイローダが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて記憶する分割プログラムロード位置記憶手段と、
前記オーバレイローダが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理手段と、
前記分割プログラムロード履歴管理手段が管理している履歴情報を記憶する分割プログラムロード履歴記憶手段と、
前記分割プログラムコールツリー保持手段が記憶している分割プログラムコールツリーと、前記分割プログラムロード履歴記憶手段で記憶している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置決定手段とを備えた暗号化プログラム実行装置。
【請求項２】
前記分割プログラムロード履歴管理手段を、ロードされた分割プログラムのロード回数、ロード開始時刻、ロード終了時刻、ロードされた分割プログラムを呼び出した分割プログラムの識別子ごとのロード回数、ロードされた分割プログラムのアクセス回数の少なくとも１つをカウントする分割プログラムカウント手段により形成した、
請求項１に記載の暗号化プログラム実行装置。
【請求項３】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、
前記分割プログラム記憶手段で記憶しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持手段と、
メモリ上に配置されるロード領域と、
前記分割プログラム記憶手段に記憶している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダと、
前記オーバレイローダが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理手段と、
前記オーバレイローダが分割プログラムをロードするロード領域中の位置を前記分割プログラムコールツリー保持手段が記憶している分割プログラムコールツリーと、前記分割プログラムロード履歴管理手段で管理している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置実行時決定手段とを備えた暗号化プログラム実行装置。
【請求項４】
前記分割プログラムロード履歴管理手段を、ロードされた分割プログラムのロード回数、ロードされた分割プログラムのロード開始時刻からの経過時間、ロード終了時刻、ロードされた分割プログラムを呼び出した分割プログラムの識別子ごとのロード回数、ロードされた分割プログラムの最終アクセス時刻、アクセス回数、ロードされた分割プログラムのロード位置と、分割プログラムのサイズのうち少なくとも１つ以上を記憶する分割プログラムロードカウント手段により形成した、
請求項３に記載の暗号化プログラム実行装置。
【請求項５】
前記分割プログラムロード位置実行時決定手段を、一定時間以上ロードされているもの、あるいは、一定時間以上アクセスがなかったものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラム時間優先位置決定手段により形成した、
請求項４に記載の暗号化プログラム実行装置。
【請求項６】
前記分割プログラムロード位置実行時決定手段を、ロード時間の最も古いもの、あるいは、最終アクセス時間の最も古いものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラム最古優先位置決定手段により形成した、
請求項４に記載の暗号化プログラム実行装置。
【請求項７】
前記分割プログラムロード位置実行時決定手段を、前記分割プログラムコールツリー保持手段が記憶している分割プログラムコールツリー内で、ロードしようとする分割プログラムの下位または上位に存在しないものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラムロード子関係位置決定手段により形成した、
請求項４に記載の暗号化プログラム実行装置。
【請求項８】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で、分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、
前記分割プログラム記憶手段で記憶しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持手段と、
メモリ上に配置されるロード領域と、
前記分割プログラム記憶手段に記憶している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダと、
前記オーバレイローダが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて記憶する分割プログラムロード位置記憶手段と、
前記オーバレイローダが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理手段と、
前記分割プログラムロード履歴管理手段が管理している履歴情報を記憶する分割プログラムロード履歴記憶手段と、
各分割プログラムに必要な属性を設定する分割プログラム属性設定手段と、
前記分割プログラム属性設定手段が設定した属性を記憶する分割プログラム属性記憶手段と、
分割プログラムロード位置決定手段を、前記分割プログラム属性記憶手段で記憶している分割プログラムの属性を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置属性依存決定手段とを備えた暗号化プログラム実行装置。
【請求項９】
前記分割プログラム属性設定手段を、各分割プログラムに必要なセキュリティ強度、または、各分割プログラムに必要な処理速度を設定する分割プログラム強度／速度設定手段により形成し、
前記分割プログラムロード位置属性依存決定手段を、前記分割プログラムセキュリティ強度設定手段で設定した強度が強いものを優先して削除するか、または、速度が遅くてもよいものを優先して削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラムロード位置強度／速度依存決定手段により形成した、
請求項８に記載の暗号化プログラム実行装置。
【請求項１０】
プログラム中に分割プログラム属性を設定するプログラム属性設定手段と、
前記プログラム属性設定手段で設定されたプログラムの属性に従ってプログラムを分割し、暗号化するか、あるいは分割のみ行った属性依存分割プログラム生成手段と、
前記属性依存分割プログラム生成手段で生成された分割プログラムを分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段とを備えた暗号化プログラム生成装置。
【請求項１１】
前記プログラム属性設定手段を、プログラムの各部分に必要なセキュリティ強度と、処理速度を設定するプログラム強度／速度設定手段により形成し、
前記属性依存分割プログラム生成手段を、プログラムを分割プログラムに分割する際に、前記プログラムセキュリティ強度設定手段でセキュリティ強度を強く設定した部分のみを含むように分割する強度／速度依存分割プログラム生成手段より形成した、
請求項１０に記載の暗号化プログラム生成装置。
【請求項１２】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、
前記分割プログラム記憶手段に記憶している分割プログラムと同じ結果を得られるが、異なる命令コード群からなる少なくとも１つ以上の分割プログラムを、オリジナルの分割プログラムの識別子と対応付けて記憶する複製分割プログラム記憶手段と、
メモリ上に配置されるロード領域と、
前記オーバレイローダが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて記憶する分割プログラムロード位置記憶手段と、
前記分割プログラム記憶手段に記憶している分割プログラムを前記ロード領域にロードするときに、複製分割プログラム記憶手段に記憶している分割プログラム中から、オリジナルの分割プログラム識別子を持つ分割プログラムを検索し、該当する分割プログラムがあればそれらの中からランダムに１つを選択し、復号して、オリジナルの分割プログラムの代わりにロードする分割プログラム／複製分割プログラムローダと
を備えた暗号化プログラム実行装置。
【請求項１３】
プログラムを分割プログラムに分割し暗号化するか、あるいは、分割のみ行う分割プログラム生成手段と、
前記分割プログラム生成手段で生成された分割プログラムを分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、
前記分割プログラム生成手段で生成された分割プログラムから、同じ結果を得られるが異なる命令コード群からなる複製分割プログラムを生成し暗号化するか、あるいは、生成のみ行う複製分割プログラム生成手段と、
前記複製分割プログラム生成手段で生成された複製分割プログラムをオリジナルの分割プログラムの識別子と、複製分割プログラムの識別子と対応付けて記憶する複製分割プログラム記憶手段とを備えた暗号化プログラム生成装置。
【請求項１４】
前記複製分割プログラム生成手段を、オリジナルの分割プログラムに本来の処理とは関係のないダミーコードを挿入するか、オリジナルの分割プログラム中の１ステップに対する処理を複数ステップで代替させるか、オリジナルの分割プログラム中の処理を異なるアルゴリズムで代替させるかの少なくとも１つ以上の変形をさせることにより生成する複製分割プログラム生成・変換手段により形成した、
請求項１３に記載の暗号化プログラム生成装置。
【請求項１５】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて格納する分割プログラム格納ステップと、
前記分割プログラム格納ステップで格納しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持ステップと、
メモリ上に配置されるロード領域と、
前記分割プログラム格納ステップに格納している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダステップと、
前記オーバレイローダステップが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて格納する分割プログラムロード位置格納ステップと、
前記オーバレイローダステップが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理ステップと、
前記分割プログラムロード履歴管理ステップが管理している履歴情報を格納する分割プログラムロード履歴格納ステップと、
前記分割プログラムコールツリー保持ステップが格納している分割プログラムコールツリーと、前記分割プログラムロード履歴格納ステップで格納している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置決定ステップとを含む暗号化プログラム実行方法。
【請求項１６】
前記分割プログラムロード履歴管理ステップを、ロードされた分割プログラムのロード回数、ロード開始時刻、ロード終了時刻、ロードされた分割プログラムを呼び出した分割プログラムの識別子ごとのロード回数、ロードされた分割プログラムのアクセス回数の少なくとも１つをカウントする分割プログラムカウントステップにより形成した、
請求項１５に記載の暗号化プログラム実行方法。
【請求項１７】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて格納する分割プログラム格納ステップと、
前記分割プログラム格納ステップで格納しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持ステップと、
メモリ上に配置されるロード領域と、
前記分割プログラム格納ステップに格納している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダステップと、
前記オーバレイローダステップが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理ステップと、
前記オーバレイローダステップが分割プログラムをロードするロード領域中の位置を前記分割プログラムコールツリー保持ステップが格納している分割プログラムコールツリーと、前記分割プログラムロード履歴管理ステップで管理している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置実行時決定ステップとを含む暗号化プログラム実行方法。
【請求項１８】
前記分割プログラムロード履歴管理ステップを、ロードされた分割プログラムのロード回数、ロードされた分割プログラムのロード開始時刻からの経過時間、ロード終了時刻、ロードされた分割プログラムを呼び出した分割プログラムの識別子ごとのロード回数、ロードされた分割プログラムの最終アクセス時刻、アクセス回数、ロードされた分割プログラムのロード位置と、分割プログラムのサイズのうち少なくとも１つ以上を格納する分割プログラムロードカウントステップにより形成した、
請求項１７に記載の暗号化プログラム実行方法。
【請求項１９】
前記分割プログラムロード位置実行時決定ステップを、一定時間以上ロードされているもの、あるいは、一定時間以上アクセスがなかったものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラム時間優先位置決定ステップにより形成した、
請求項１８に記載の暗号化プログラム実行方法。
【請求項２０】
前記分割プログラムロード位置実行時決定ステップを、ロード時間の最も古いもの、あるいは、最終アクセス時間の最も古いものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラム最古優先位置決定ステップにより形成した、
請求項１８に記載の暗号化プログラム実行方法。
【請求項２１】
前記分割プログラムロード位置実行時決定ステップを、前記分割プログラムコールツリー保持ステップが格納している分割プログラムコールツリー内で、ロードしようとする分割プログラムの下位または上位に存在しないものを優先して前記ロード領域から削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラムロード子関係位置決定ステップにより形成した、
請求項１８に記載の暗号化プログラム実行方法。
【請求項２２】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で、分割プログラム識別子と対応付けて格納する分割プログラム格納ステップと、
前記分割プログラム格納ステップで格納しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持ステップと、
メモリ上に配置されるロード領域と、
前記分割プログラム格納ステップに格納している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダステップと、
前記オーバレイローダステップが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて格納する分割プログラムロード位置格納ステップと、
前記オーバレイローダステップが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理ステップと、
前記分割プログラムロード履歴管理ステップが管理している履歴情報を格納する分割プログラムロード履歴格納ステップと、
各分割プログラムに必要な属性を設定する分割プログラム属性設定ステップと、
前記分割プログラム属性設定ステップが設定した属性を格納する分割プログラム属性格納ステップと、
分割プログラムロード位置決定ステップを、前記分割プログラム属性格納ステップで格納している分割プログラムの属性を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置属性依存決定ステップとを含む暗号化プログラム実行方法。
【請求項２３】
前記分割プログラム属性設定ステップを、各分割プログラムに必要なセキュリティ強度、または、各分割プログラムに必要な処理速度を設定する分割プログラム強度／速度設定ステップにより形成し、
前記分割プログラムロード位置属性依存決定ステップを、前記分割プログラムセキュリティ強度設定ステップで設定した強度が強いものを優先して削除するか、または、速度が遅くてもよいものを優先して削除することによって、ロード領域内に空き領域を確保し、次にロードする分割プログラムのロード位置を決定する分割プログラムロード位置強度／速度依存決定ステップにより形成した、
請求項２２に記載の暗号化プログラム実行方法。
【請求項２４】
プログラム中に分割プログラム属性を設定するプログラム属性設定ステップと、
前記プログラム属性設定ステップで設定されたプログラムの属性に従ってプログラムを分割し、暗号化するか、あるいは分割のみ行った属性依存分割プログラム生成ステップと、
前記属性依存分割プログラム生成ステップで生成された分割プログラムを分割プログラム識別子と対応付けて格納する分割プログラム格納ステップとを含む暗号化プログラム生成方法。
【請求項２５】
前記プログラム属性設定ステップを、プログラムの各部分に必要なセキュリティ強度と、処理速度を設定するプログラム強度／速度設定ステップにより形成し、
前記属性依存分割プログラム生成ステップを、プログラムを分割プログラムに分割する際に、前記プログラムセキュリティ強度設定ステップでセキュリティ強度を強く設定した部分のみを含むように分割する強度／速度依存分割プログラム生成ステップより形成した、
請求項２４に記載の暗号化プログラム生成方法。
【請求項２６】
プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて格納する分割プログラム格納ステップと、
前記分割プログラム格納ステップに格納している分割プログラムと同じ結果を得られるが、異なる命令コード群からなる少なくとも１つ以上の分割プログラムを、オリジナルの分割プログラムの識別子と対応付けて格納する複製分割プログラム格納ステップと、
メモリ上に配置されるロード領域と、
前記オーバレイローダステップが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて格納する分割プログラムロード位置格納ステップと、
前記分割プログラム格納ステップに格納している分割プログラムを前記ロード領域にロードするときに、複製分割プログラム格納ステップに格納している分割プログラム中から、オリジナルの分割プログラム識別子を持つ分割プログラムを検索し、該当する分割プログラムがあればそれらの中からランダムに１つを選択し、復号して、オリジナルの分割プログラムの代わりにロードする分割プログラム／複製分割プログラムローダステップと
を含む暗号化プログラム実行方法。
【請求項２７】
プログラムを分割プログラムに分割し暗号化するか、あるいは、分割のみ行う分割プログラム生成ステップと、
前記分割プログラム生成ステップで生成された分割プログラムを分割プログラム識別子と対応付けて格納する分割プログラム格納ステップと、
前記分割プログラム生成ステップで生成された分割プログラムから、同じ結果を得られるが異なる命令コード群からなる複製分割プログラムを生成し暗号化するか、あるいは、生成のみ行う複製分割プログラム生成ステップと、
前記複製分割プログラム生成ステップで生成された複製分割プログラムをオリジナルの分割プログラムの識別子と、複製分割プログラムの識別子と対応付けて格納する複製分割プログラム格納ステップとを含む暗号化プログラム生成方法。
【請求項２８】
前記複製分割プログラム生成ステップを、オリジナルの分割プログラムに本来の処理とは関係のないダミーコードを挿入するか、オリジナルの分割プログラム中の１ステップに対する処理を複数ステップで代替させるか、オリジナルの分割プログラム中の処理を異なるアルゴリズムで代替させるかの少なくとも１つ以上の変形をさせることにより生成する複製分割プログラム生成・変換ステップにより形成した、
請求項２７に記載の暗号化プログラム生成方法。
【請求項２９】
請求項１を実現するプログラムを記憶した記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号化されたプログラムを、復号しながらメモリ上にロードして実行する装置であり、特に、ロード領域を制限することにより機密保護を実現する装置およびその方法に関するものである。
【背景技術】
【０００２】
従来、コンピュータシステム上で実行するプログラムを機密保護するためには、命令コードや、データを暗号化しておき、実行時にそれらを復号してメモリ上にロードしているものがあった（例えば、特許文献１参照）。
【０００３】
図３２は、前記特許文献１に記載された従来の暗号化プログラム実行装置を示すものである。
【０００４】
図３２において、暗号化プログラム記憶手段３２０１は暗号化されたプログラムを記憶する。プログラムローダ３２０２は、暗号化プログラム記憶手段３２０１で記憶している暗号化プログラムを読み出して、プログラム復号手段３２０３に復号処理を依頼する。プログラム復号手段３２０３は、プログラムローダ３２０２から与えられた暗号化プログラムを復号し、プログラムローダ３２０２に返す。プログラムローダ３２０２は、ロード領域３２０４に復号された実行可能なプログラムをロードする。このようにして、プログラムを暗号化して記憶しておき、プログラム実行時に復号してメモリ上にロードして、実行可能な状態にしていた。
【０００５】
また、少ないメモリ上でプログラムを動作させるための方式として、オーバレイローダ方式があった（例えば、非特許文献１参照）。
【０００６】
図３３は、前記非特許文献１に記載された従来のオーバレイローダを示すものである。
【０００７】
図３３において、プログラムは、小さい単位に分割される。これらを、分割プログラム記憶手段３３０１で記憶する。分割プログラムロード位置記憶手段３３０２は、分割プログラムのロード位置を記憶する。オーバレイローダ３３０３は、分割プログラム記憶手段３３０１で記憶している分割プログラムを、分割プログラムロード位置記憶手段３３０２で記憶しているロード領域３３０４上のロード位置にロードする。このようにして、小さく分割された分割プログラムを小さなサイズのロード領域３３０４に順番にロードすることにより、少ないメモリでプログラムを実行可能にしていた。
【０００８】
さらに、分割プログラムのロード位置を決定するアルゴリズムとして、仮想メモリ方式で利用しているものがあった（例えば、非特許文献２参照）。
【０００９】
図３４、図３５、図３６は、前記非特許文献２に記載された従来のアルゴリズムを示すものである。
【００１０】
図３４において、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）アルゴリズムを示す。ロード領域３４０１には、分割プログラムがロードされる。分割プログラム３４０２は、最初にロードされた分割プログラムである。分割プログラム３４０３は、これからロードされる分割プログラムである。このとき、ロード領域３４０１には、分割プログラム３４０３をロードするための十分な空きサイズがないので、最初にロードされた分割プログラム３４０２（図３４の場合は「１」）を最初に削除するアルゴリズムである。
【００１１】
図３５において、ＬＲＵ（Ｌｅａｓｔ  Ｒｅｃｅｎｔｌｙ  Ｕｓｅｄ）アルゴリズムを示す。ロード領域３５０１には、分割プログラムがロードされる。ＬＲＵエントリ３５０２は、アクセスされた分割プログラムの順を記憶する。分割プログラム３５０３は、これからロードされる分割プログラムである。このとき、ロード領域３５０１には、分割プログラム３５０３をロードするための十分な空きサイズがないので、最も過去にアクセスされた分割プログラム３５０４（図３５の場合は「３」）を最初に削除するアルゴリズムである。
【００１２】
図３６において、ＮＲＵ（Ｎｏｔ  Ｒｅｃｅｎｔｌｙ  Ｕｓｅｄ）アルゴリズムを示す。ロード領域３６０１には、分割プログラムがロードされる。リファレンスビット３６０２は、ある一定間隔で全部リセットし、アクセスされるとビットがセットされる。分割プログラム３６０３は、これからロードされる分割プログラムである。このとき、ロード領域３６０１には、分割プログラム３６０３をロードするための十分な空きサイズがないので、リファレンスビット３６０２がセットされていない分割プログラム３６０４（図３６の場合は、「２」、「３」）を最初に削除するアルゴリズムである。
【特許文献１】特開平９−６２３２号公報
【非特許文献１】Ｌｉｎｋｅｒｓ＆Ｌｏａｄｅｒｓ  オーム社（Ｐ．１６５−１７１）
【非特許文献２】オペレーティングシステムの基礎  ＣＱ出版社（Ｐ．８４−１０７）
【発明の開示】
【発明が解決しようとする課題】
【００１３】
しかしながら、前記従来の構成では、分割プログラムを暗号化してオーバレイロード時に復号しながらロード、実行させることになるので、ロード位置の指定によっては、メモリ上に長い時間ロードされたままになり、ハッカーによって、プログラムをメモリ上から盗まれる危険性が高くなるという課題を有していた。
【００１４】
また、ＦＩＦＯ、ＬＲＵ、ＮＲＵなどのアルゴリズムを用いてロード位置を決定すると、分割プログラム間の呼び出し関係が考慮されないので、相互に呼び出される分割プログラムが同じロード位置にロードされるような場合に、何度もロードを繰り返すことになり、処理速度が遅くなるという課題を有していた。
【００１５】
本発明は、前記従来の課題を解決するもので、分割プログラムのロード時に削除する不要な分割プログラムをそのロード履歴情報をもとに決定することにより、プログラムの安全性を低下させずに、実行速度を向上することを目的とする暗号化プログラム実行装置を提供することを目的とする。
【課題を解決するための手段】
【００１６】
前記従来の課題を解決するために、本発明の暗号化プログラム実行装置は、プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子と対応付けて記憶する分割プログラム記憶手段と、前記分割プログラム記憶手段で記憶しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する分割プログラムコールツリー保持手段と、メモリ上に配置されるロード領域と、前記分割プログラム記憶手段に記憶している分割プログラムを、暗号化されている場合は復号して、前記ロード領域にロードするオーバレイローダと、前記オーバレイローダが分割プログラムをロードするロード領域中の位置を、分割プログラム識別子、位置情報を対応付けて記憶する分割プログラムロード位置記憶手段と、前記オーバレイローダが分割プログラムをロードしたときの分割プログラムのロード履歴を管理する分割プログラムロード履歴管理手段と、前記分割プログラムロード履歴管理手段が管理している履歴情報を記憶する分割プログラムロード履歴記憶手段と、前記分割プログラムコールツリー保持手段が記憶している分割プログラムコールツリーと、前記分割プログラムロード履歴記憶手段で記憶している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する分割プログラムロード位置決定手段を有し、暗号化プログラムの実行を行う。
【００１７】
本構成によって、プログラム実行時の各分割プログラムのロード経過時間やロード回数を用いて、分割プログラムの最適なロード位置を決定することができる。
【発明の効果】
【００１８】
本発明の暗号化プログラム実行装置によれば、あらかじめ、分割プログラム間の呼び出し関係を解析し、実行時に各分割プログラムがロードされた回数と、どの分割プログラムから呼び出されたかの履歴情報を記憶する。これらの情報から、次にどの分割プログラムがロードされるかを予測し、次にロードされる可能性の高い分割プログラムは、ロード領域上から削除しないようにすることにより、プログラム実行時の処理速度を速くすることができる。
【００１９】
また、分割プログラムがロードされてからの経過時間を計測し、一定時間以上ロードされている分割プログラムを、優先的に削除することにより、プログラム実行時のメモリ上の状態をハッカーが解析しにくいようにすることができ、プログラムの安全性を向上させることができる。
【発明を実施するための最良の形態】
【００２０】
以下本発明の実施の形態について、図面を参照しながら説明する。
【００２１】
（実施の形態１）
図１は、本発明の実施の形態１における暗号化プログラム実行装置の構成を示すブロック図である。図１において、分割プログラム記憶手段１０１は、プログラムを小さい単位に分割した分割プログラムを暗号化するか、あるいは分割のみ行った状態で分割プログラム識別子とを対応付けて記憶する。分割プログラムコールツリー保持手段１０２は、分割プログラム記憶手段１０１で記憶しているある分割プログラムから呼び出される他の分割プログラムを含む分割プログラムとの関係を木構造で表現した分割プログラムコールツリー情報を格納する。ロード領域１０３は、メモリ上の領域で分割プログラムが、復号された状態で命令コードの並びやデータとして配置される。オーバレイローダ１０４は、分割プログラム記憶手段１０１に記憶している分割プログラムを、暗号化されている場合は復号して、ロード領域１０３にロードする。
【００２２】
分割プログラムロード位置記憶手段１０５は、オーバレイローダ１０４が分割プログラムをロードするロード領域中の位置を、前記ロード領域１０３の開始アドレスからのオフセットと、分割プログラム識別子を対応付けて記憶する。分割プログラムロード情報管理手段１０６は、オーバレイローダ１０４が分割プログラムをロードしたときの分割プログラムのロード履歴を管理する。例えば、履歴情報として、ロードされた分割プログラムのロード回数、ロードされた分割プログラムのロード開始時刻からの経過時間、ロードされた分割プログラムを呼び出した分割プログラムの識別子ごとのロード回数、ロードされた分割プログラムのアクセス回数などである。これらをカウントするカウンターを持つ。分割プログラムロード情報記憶手段１０７は、分割プログラムロード情報管理手段１０６が管理している履歴情報を記憶する。さらに、ファイルとして外部記憶に書き出す。分割プログラムロード位置決定手段１０８は、分割プログラムコールツリー保持手段１０２が記憶している分割プログラムコールツリーと、分割プログラムロード情報記憶手段１０７で記憶している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する。
【００２３】
図２は、分割プログラムコールツリー保持手段１０２で記憶している分割プログラムコールツリーの図である。なお、図中○の中に数字を付した記号は、分割プログラムの呼び出し順を示している。この記号を明細書中では、数字の右横に)を付して示す。例えば、○の中に1を付した記号は、明細書では、１）で表わされる。
【００２４】
図３は、ロード領域１０３に分割プログラムがロードされる状態を示す概念図である。図中1)〜6)は、分割プログラムの呼び出し順を示しており、図２の同じ番号と対応している。6)＊〜1)＊は、1)〜6)の呼び出しに対するリターンに相当する。ロードエリア番号３０１は、ロード領域１０３の識別子を示す。
【００２５】
図４は、分割プログラムロード位置記憶手段１０５で記憶しているロード位置を示す概念図である。分割プログラムロード位置記憶テーブル４０１は、分割プログラム識別子と、ロードエリア番号と、各ロードエリア上に分割プログラムをロードするときの先頭からのオフセットを対応付けて格納する。
【００２６】
図５は、分割プログラムロード情報管理手段１０６で管理する情報を示す概念図である。分割プログラムロード情報管理テーブル５０１は、各分割プログラムが、ロードされたときに、その分割プログラム識別子５０２と、呼び出した側の分割プログラム識別子５０３を対応付ける。ロード回数５０４を１だけ増加させる。ロード開始時刻５０５を設定する。また、この分割プログラムにアクセスされたときに参照ビット５０７を「ＯＮ」にする。一定時間間隔で、参照ビット５０７はクリアされる。さらに、この分割プログラムがロード領域１０３から削除または上書きされたとき、ロード終了時刻を設定する。説明を簡単にするために、各分割プログラムの処理時間を「９９」とし、復号やメモリ上のコピーなどのロード処理に必要な時間を「０」としている。
【００２７】
図６は、本発明の実施の形態１における分割プログラムのロード処理の具体的な流れを示すフロー図である。上記のような構成の暗号化データ実行装置において、分割されたプログラムのロード処理の具体的な流れを図６のフロー図を用いて説明する。
【００２８】
プログラムのロードとは、プログラムを実行できるように、例えば、ハードディスクのような２次記憶装置からメインメモリにコピーすることである。また、分割プログラムは、１つ以上のソースファイルのグループから生成されたオブジェクトコードを指している。
【００２９】
＜プログラムの実行順＞
（ステップ１）  オーバレイローダ１０４は、プログラムの実行途中に別の分割プログラムをロードするように指示を受け取る（Ｓ６０１）。プログラムの実行途中に別の分割プログラムをロードするように指示を受け取ったオーバレイローダ１０４は、現在、ロード領域１０３上に指定された分割プログラムがすでにロードされているかどうかを判定する（Ｓ６０２）。すでにロードされている場合、（ステップ６）へ進む。ロードされていない場合は、（ステップ２）へ進む。
【００３０】
（ステップ２）  ステップ１で、分割プログラムがロードされていないと判定された場合、分割プログラム記憶手段１０１から分割プログラムを読み出す。このとき、読み出された分割プログラムが暗号化されているならば、オーバレイローダ１０４は、これを復号する（Ｓ６０３）。（ステップ３）に進む。
【００３１】
（ステップ３）  読み出された分割プログラムの持つ、分割プログラム識別子をもとに、分割プログラムロード位置記憶手段１０５から、ロード開始位置を検索する（Ｓ６０４）。（ステップ４）に進む。
【００３２】
（ステップ４）  オーバレイローダ１０４は、復号された分割プログラムをロード領域１０３上のロード開始位置にコピーする（Ｓ６０５）。（ステップ５）に進む。
【００３３】
（ステップ５）  分割プログラムロード情報管理手段１０６は、図５で示す管理情報テーブル５０１に、ロードされた分割プログラムの分割プログラム識別子５０２と、呼び出した側の分割プログラム識別子５０３を対応付けて追加する。ロード回数５０４を１だけ増加させる。ロード開始時刻５０５を設定する。参照ビット５０７を「ＯＮ」にする。（ステップ７）に進む。
【００３４】
（ステップ６）  （ステップ１）で、分割プログラムがロードされていた場合には、管理情報テーブル５０１に、ロードされた分割プログラムの分割プログラム識別子５０２と、呼び出した側の分割プログラム識別子５０３に対応が一致するものに対してロード回数５０４を１だけ増加させる。参照ビット５０７を「ＯＮ」にする（Ｓ６０６）。（ステップ７）に進む。
【００３５】
（ステップ７）  ロード領域１０３にロードされた分割プログラムを順に実行させる（Ｓ６０７）。
【００３６】
（ステップ８）  プログラム実行の終了を判定する。終了しないならば、（ステップ１）へ進む。終了ならば、（ステップ９）へ進む（Ｓ６０８）。
【００３７】
（ステップ９）  分割プログラムロード情報記憶手段１０７は、分割プログラムロード情報管理手段１０６で記憶している管理情報テーブル５０１をファイルに出力する（Ｓ６１０）。（おわり）
次に、分割プログラムロード位置決定手段１０８の詳細なアルゴリズムの第１の例について説明する。
【００３８】
図７は、本発明の実施の形態１における分割プログラムのロード位置決定アルゴリズムを示すフロー図である。
【００３９】
図８は、ロードエリアの数が１つの状態で、図２で示す分割プログラムコールツリーの呼び出し関係があるプログラムを実行したときの分割プログラムロード管理情報テーブル５０１の内容を示している。
【００４０】
図９は、図８の分割プログラムロード管理情報テーブル５０１の記憶内容を集計した結果である。
【００４１】
図１０は、図２、図８、図９の条件で、図７のフローチャートに従って、分割プログラムロード位置決定手段１０８で決定したロードエリアの割り当て結果である。
【００４２】
図１１は、分割プログラムロード情報管理手段１０６で管理する情報を示す概念図である。５０２から５０７は、図５と同じものである。アクセス回数１１０７は、分割プログラムにアクセスされた回数をカウントする。
【００４３】
上記のような条件の分割プログラムロード位置決定手段１０８において、分割されたプログラムのロード位置決定処理の具体的な流れを図７のフロー図を用いて説明する。
【００４４】
＜第１の例の実行順＞
（ステップ１）  図９で示す分割プログラムロード回数集計結果９０１により、ロード回数の多い分割プログラムから順にロードエリアを割り当てる（Ｓ７０１）。この場合、最初はＳＵ２−１となる。（ステップ２）に進む。
【００４５】
（ステップ２）  図２の分割プログラムコールツリーからＳＵ２−１の呼び出し元になっているすべての分割プログラムを検索する。この場合、ＳＵ１−１がある。すでに分割プログラムが割り当てられているロードエリアの中で、ＳＵ１−１を含まないロードエリアを探し（Ｓ７０２）、該当するロードエリアが存在するか否かを判定する（Ｓ７０３）。この場合、どのロードエリアにも分割プログラムは割り当てられていないので、ロードエリア＃１が割り当て可能である。（ステップ３）に進む。
【００４６】
（ステップ３）  （ステップ２）で、該当するロードエリアが存在しない場合、新規にロードエリアを作成し（Ｓ７０４）、作成したロードエリアを割り当てる（ステップＳ７０５）。（ステップ４）に進む。該当するロードエリアが存在する場合、そのロードエリアを割り当てる（Ｓ７０５）。（ステップ４）に進む。
【００４７】
（ステップ４）  ロードエリアの割り当てができていない分割プログラムがあるか否か判定する（Ｓ７０６）。まだ割り当てができていない分割プログラムがあれば、（ステップ１）に戻る。すべての分割プログラムにロードエリアが割り当てられていれば、図１０の分割プログラムロード位置記憶テーブル１００１のようになる。この内容を各分割プログラムのロード位置をファイルに書き出して（Ｓ７０７）、終了する（おわり）。
【００４８】
図１１は、図１０で示す分割プログラムロード位置記憶テーブル１００１を使用してプログラムを実行した場合の分割プログラムロード管理情報テーブル５０１の内容を示している。分割プログラムのＳＵ１−１は、プログラム開始から、終了までのすべての間、平文の状態でメモリ上にロードされたままになる。
【００４９】
上記のようにロードエリアを決定すると、分割プログラムのロードの回数が少なくなるため、処理速度は高速になる。しかし、分割プログラムが復号されたままの状態でロード領域１０３上に長い時間置かれることになり、セキュリティ強度が下がる。
【００５０】
さらに、分割プログラムロード位置決定手段１０８の詳細なアルゴリズムの第２の例について説明する。
【００５１】
図１２は、本発明の実施の形態１における分割プログラムのロード位置決定アルゴリズムを示すフロー図である。各分割プログラムの（ロード開始時刻＋一定時間）以降にロードされる他の分割プログラムで、異なるロードエリアに割り当てられているものを、同じロードエリアに割り当て直して、元の分割プログラムの上に上書きしてロードさせることにより、分割プログラムがある一定時間以上ロード領域１０３上に存在しないようにする。
【００５２】
図１３は、図１１の分割プログラムロード管理情報テーブル５０１の記憶内容を集計した結果である。ロード時間１３０３は、各分割プログラムが、ロード領域１０３にロードされていた時間を示している。
【００５３】
図１４は、図２、図１１、図１３の条件で、図１２のフローチャートに従って、分割プログラムロード位置決定手段１０８で決定したロードエリアの割り当て結果である。
【００５４】
図１５は、分割プログラムロード情報管理手段１０６で管理する情報を示す概念図である。５０２から５０７は、図５と同じものである。１１０７は、図１１に示したアクセス回数１１０７と同じものである。
【００５５】
上記のような条件の分割プログラムロード位置決定手段１０８において、分割されたプログラムのロード位置決定処理の具体的な流れを図１２のフロー図を用いて説明する。
【００５６】
＜第２の例の実行順＞
（ステップ１）  図１３で示す分割プログラムロード回数集計結果１３０１により、ロード時間の多い分割プログラムから順にロードエリアを割り当てる（Ｓ１２０１）。分割プログラムの識別子をａとする。分割プログラムａのロードエリアを＃Ｎとする。（ステップ２）に進む。
【００５７】
（ステップ２）  （ロード開始時刻＋一定時間）以降にロードされる分割プログラムで、異なるロードエリア（ロードエリア＃Ｎ以外）に割り当てられているものを探し（Ｓ１２０２）、条件に該当するものがあるか否か判定する（Ｓ１２０３）。該当する分割プログラムｂが存在すれば、（ステップ３）に進む。該当する分割プログラムがなければ、（ステップ４）に進む。
【００５８】
（ステップ３）  （ステップ２）の条件に該当する分割プログラムｂを、同じロードエリア＃Ｎに割り当てる（Ｓ１２０４）。（ステップ４）に進む。
【００５９】
（ステップ４）  一定時間より長くロードされている分割プログラムで、再割り当てされていないものがあるか否か判定する（Ｓ１２０５）。該当する分割プログラムがあれば、（ステップ１）に戻る。なければ、この内容を各分割プログラムのロード位置をファイルに書き出して（Ｓ１２０６）、終了する（おわり）。
【００６０】
図１０のように分割プログラムのロードエリアが割り当てられた状態から、図１１の分割プログラムロード情報を用いて、図１２のフローに従ってロードエリアを再割り当てすると、以下の手順を経て、図１４のようになる。
【００６１】
最初に、(ステップ１)において、図１３の集計結果によりＳＵ１−１が選ばれて、ロードエリア＃２にそのまま割り当てられる。(ステップ２)において、一定時間を５００とした場合、ＳＵ１−１のロード開始時刻１００に５００を足した６００以降にロードを開始される分割プログラムＳＵ２−２が見つかる。そこで、(ステップ３)において、ＳＵ１−１とＳＵ２−２を同一のロードエリア＃２に割り当てる。(ステップ４)において、分割プログラムが残っていると判定され、（ステップ１）に戻る。
【００６２】
次に、(ステップ１)において、ＳＵ２−１が選ばれて、ロードエリア＃１にそのまま割り当てられる。(ステップ２)において、一定時間を５００とした場合、ＳＵ２−１のロード開始時刻２００に５００を足した７００以降にロードを開始される分割プログラムＳＵ１−２が見つかる。そこで、(ステップ３)において、ＳＵ２−１とＳＵ１−２を同一のロードエリア＃１に割り当てる。(ステップ４)において、分割プログラムが残っていると判定され、（ステップ１）に戻る。
【００６３】
さらに、(ステップ１)において、ＳＵ３−２が選ばれて、ロードエリア＃３にそのまま割り当てられる。(ステップ２)において、一定時間を５００とした場合、ＳＵ３−２のロード開始時刻５００に５００を足した１０００以降にロードを開始される分割プログラムで、かつ、異なるロードエリアのものは見つからない。(ステップ４)において、分割プログラムが残っていないと判定され、図１４の分割プログラムロード位置記憶テーブル１４０１のようになって終了する。
【００６４】
図１５は、図１４で示す分割プログラムロード位置記憶テーブル１４０１を使用してプログラムを実行した場合の分割プログラムロード管理情報テーブル５０１の内容を示している。分割プログラムがロードされている時間は、９９〜６９９になる。
【００６５】
上記のようにロードエリアを決定すると、分割プログラムのロード時間が平均化されるため、分割プログラムが復号されたままの状態でロード領域１０３上に長い時間置かれることがなくなり、セキュリティ強度を強く保持できる。
【００６６】
なお、分割プログラムロード情報管理手段１０６において、管理する情報には、アクセス開始時刻と終了時刻を用いてもよい。これらを保持することにより、実際に分割プログラムが実行されている時間を管理することが可能となる。また、ロード所要時間を追加してもよい。
【００６７】
また、本実施の形態において、オーバレイローダとしたが、仮想記憶管理方式で用いられるページング機能としてもよい。
【００６８】
また、ロードオフセットを仮に「０」としたが、ランダムに設定してもよい。
【００６９】
（実施の形態２）
図１６は、本発明の実施の形態２における暗号化プログラム実行装置の構成を示すブロック図である。図１６において、分割プログラム記憶手段１０１、分割プログラムコールツリー保持手段１０２、ロード領域１０３、オーバレイローダ１０４、分割プログラムロード情報管理手段１０６は、図１で用いたものと同じものである。分割プログラムロード位置実行時決定手段１６０５は、分割プログラムコールツリー保持手段１０２が記憶している分割プログラムコールツリーと、分割プログラムロード情報管理手段１０６で記憶している分割プログラムロード履歴情報を用いて、分割プログラムのロード位置を決定する。
【００７０】
図１７は、本発明の実施の形態２における分割プログラムのロード処理の具体的な流れを示すフロー図である。
【００７１】
図１８は、分割プログラムロード情報管理手段１０６で管理する情報を示す概念図である。５０２から５０７は、図５と同じものである。１１０７は、図１１に示したアクセス回数１１０７と同じものである。アクセス時刻１８０１は、分割プログラムにアクセスした最終時刻を格納する。
【００７２】
上記の構成と、図２、図３のような分割プログラムで構成される暗号化データ実行装置において、分割されたプログラムのロード処理の具体的な流れを図１７のフロー図を用いて説明する。
【００７３】
＜プログラムの実行順＞
（ステップ１）  オーバレイローダ１０４は、プログラムの実行途中に別の分割プログラムをロードする指示を受け取る（Ｓ１７０１）。プログラムの実行途中に別の分割プログラムをロードするように指示を受け取ったオーバレイローダ１０４は、現在、ロード領域１０３上に指定された分割プログラムがすでにロードされているかどうかを判定する（Ｓ１７０２）。すでにロードされている場合、（ステップ６）へ進む。ロードされていない場合は、（ステップ２）へ進む。
【００７４】
（ステップ２）  （ステップ１）で、分割プログラムがロードされていないと判定された場合、分割プログラム記憶手段１０１から分割プログラムを読み出す。このとき、読み出された分割プログラムが暗号化されているならば、オーバレイローダ１０４は、これを復号する（Ｓ１７０３）。（ステップ３）に進む。
【００７５】
（ステップ３）  分割プログラムロード位置実行時決定手段１６０５は、削除すべき分割プログラムを決定する（Ｓ１７０４）。（ステップ４）に進む。
【００７６】
（ステップ４）  さらに、分割プログラムロード位置実行時決定手段１６０５は、分割プログラムのロード位置を決定し、オーバレイローダ１０４は、分割プログラムをロード領域１０３の指定の位置にロードする（Ｓ１７０５）。（ステップ５）に進む。
【００７７】
（ステップ５）  分割プログラムロード情報管理手段１０６は、図５で示す管理情報テーブル５０１に、ロードされた分割プログラムの分割プログラム識別子５０２と、呼び出した側の分割プログラム識別子５０３を対応付けて追加する。ロード回数５０４を１だけ増加させる。ロード開始時刻５０５を設定する。参照ビット５０７を「ＯＮ」にする。アクセス回数１１０７を更新する。アクセス時刻１８０１を更新する（Ｓ１７０７）。（ステップ７）に進む。
【００７８】
（ステップ６）  （ステップ１）で、分割プログラムがロードされていた場合には、管理情報テーブル５０１に、ロードされた分割プログラムの分割プログラム識別子５０２と、呼び出した側の分割プログラム識別子５０３に対応が一致するものに対してロード回数５０４を１だけ増加させる。参照ビット５０７を「ＯＮ」にする（Ｓ１７０６）。（ステップ７）に進む。
【００７９】
（ステップ７）  ロード領域１０３にロードされた分割プログラムを順に実行させる（Ｓ１７０８）。
【００８０】
（ステップ８）  プログラム実行の終了を判定する（Ｓ１７０９）。終了しないならば、（ステップ１）へ進む（おわり）。
【００８１】
次に、分割プログラムロード位置実行時決定手段１６０５で処理される（Ｓ１７０４）の詳細なアルゴリズムの例について説明する。
【００８２】
図１９は、ロード領域１０３がロードエリアの数が１つの状態で、図２で示す分割プログラムコールツリーの呼び出し関係があるプログラムを実行した場合における、ロード領域１０３に分割プログラムがロードされる状態を示す概念図である。図中1)〜6)は、図２で示したコールツリーに従った分割プログラムの呼び出し順を示しており、図２の同じ番号と対応している。6)＊〜1)＊は、1)〜6)の呼び出しに対するリターンに相当する。
【００８３】
図２０は、図１９の（１）の状態で、分割プログラムロード情報管理手段１０６が管理する情報を示す概念図である。図３７は、図１９の（２）から（３）の状態で、分割プログラムロード情報管理手段１０６が管理する情報を示す概念図である。ＳＵ１−１が削除されて、ＳＵ３−２がロード領域１０３の空き領域にロードされたことを示している。図３８は、図１９の（３）から（４）の状態、図３９は、図１９の（４）から（５）の状態、図４０は、図１９の（５）から（６）の状態、図４１は、図１９の（６）から（７）の状態、図４２は、図１９の（７）から（８）の状態で、分割プログラムロード情報管理手段１０６が管理する情報を示す概念図である。図中、網掛けの欄は、ロード領域１０３から削除された分割プログラムの分割プログラムロード情報管理である。
【００８４】
図２１は、本発明の実施の形態３における分割プログラムの動的なロード位置決定アルゴリズムを示すフロー図である。
【００８５】
図２２は、分割プログラムロード情報管理手段１０６が管理する情報を示す概念図である。
【００８６】
上記のような構成と、図２の条件の分割プログラムロード位置実行時決定手段１６０５において、分割されたプログラムの動的なロード位置決定アルゴリズムの具体的な流れを図２１のフロー図を用いて説明する。
【００８７】
＜動的なロード位置決定アルゴリズム＞
（ステップ１）  分割プログラムロード情報管理手段１０６で管理している管理情報から一定時間アクセスがないか、一定時間以上ロードされている分割プログラムを探す（Ｓ２１０１）。（ステップ２）に進む。
【００８８】
（ステップ２）  （ステップ１）で該当するものが存在すれば（ステップ６）に進む。なければ、（ステップ３）に進む（Ｓ２１０２）。
【００８９】
（ステップ３）  （ステップ１）で該当するものがなければ、ロード回数の最も少ないもの、ロード経過時間が最も長いもの、アクセス時刻の最も古いものを探す（Ｓ２１０４）。
【００９０】
（ステップ４）  （ステップ３）で探したものが１つに決定した場合、（ステップ６）に進む。複数個になった場合、（ステップ５）に進む（Ｓ２１０５）。
【００９１】
（ステップ５）  （ステップ４）で求められた複数個の分割プログラムのうち、ロードしたい分割プログラムがコールツリー内で親子関係になっていないものを選んで削除する（Ｓ２１０６）。（ステップ７）に進む。
【００９２】
（ステップ６）  （ステップ２）または（ステップ４）で、該当する分割プログラムが存在する場合、該当する分割プログラムを削除する（Ｓ２１０３）。（ステップ７）に進む。
【００９３】
（ステップ７）  ロード領域１０３の空き領域サイズと、ロードしたい分割プログラムのサイズを比較して、空き領域が足りなければ、（ステップ１）にもどる。空き領域が十分ならば、終了する（Ｓ２１０７）（おわり）。
【００９４】
プログラムが実行されて、図２のコールツリーにしたがって1)、2)、3)の呼び出しが行われると、ロード領域１０３は図１９の（１）のようになる。また、分割プログラムロード管理情報テーブル５０１の内容は、図２０のようになる。3)の呼び出しが行われたことにより、ＳＵ２−１のアクセス時刻が更新されて「４００」となっている。
【００９５】
次に、4)の呼び出しが行われると、空き領域サイズが足りないので、動的なロード位置決定アルゴリズムにしたがって、削除する分割プログラムが決定される。この場合、最も古くにロードされたＳＵ１−１が削除される。図３７は、図１９の4)の呼び出しが行われた状態である。
【００９６】
5)の呼び出しが行われた場合は、最もアクセス時刻が古いＳＵ３−１が削除される。図３８は、図１９の5)の呼び出しが行われた状態である。
【００９７】
6)の呼び出しが行われた場合は、ロード経過時間が最も長いＳＵ２−１が削除される。図３９は、図１９の6)の呼び出しが行われた状態である。
【００９８】
6)＊の呼び出しが行われた場合は、最もアクセス回数の少ないＳＵ１−２が削除される。図４０は、図１９の6)＊の呼び出しが行われた状態である。
【００９９】
3)＊の呼び出しが行われた場合は、一定時間以上（例えば、５００とする）ロードされているＳＵ２−２とＳＵ３−２が削除される。図４１は、図１９の3)＊の呼び出しが行われた状態である。図４２は、図１９の1)＊の呼び出しが行われた状態である。
【０１００】
上記のようにロードエリアを決定すると、分割プログラムがロードされている時間は、９９〜４９９の間に制御可能となり、セキュリティ強度を強く保持できる。
【０１０１】
なお、本実施の形態において、一定時間を５００としたが、セキュリティ強度を強めるために一定時間を短くしてもよい。例えば、３００と設定すると、図２２で示すように一定時刻でロード領域１０３から削除される。ＳＵ２−２をロードしたときに、２２０１のようにＳＵ３−２は一定時間（３００）が経過したので、削除の対象となる。ところが、ＳＵ３−２は、図２のコールツリーで示されるように、ＳＵ２−２の呼び出し元となっている。すなわち、ＳＵ３−２は、近い将来、ロードされる可能性が高いことが予想される。ここで、一定時間経過のチェックだけでロード領域１０３から削除してしまうと、再び、ロード処理が発生するため、処理時間が遅くなる。したがって、現在実行中の分割プログラムが、図２のコールツリーで呼び出し元、または、呼び出し先になっている分割プログラムは、削除しないようにする。これによって、速度低下が少なくなるという効果がある。
【０１０２】
さらに、本実施の形態において、カレント分割プログラムから呼び出される分割プログラムのうち、呼び出される回数の少ない分割プログラムを削除するとしてもよい。
【０１０３】
なお、Ｓ２１０１やＳ２１０４では全てのチェックを行うのではなく一部のチェックを行ってもよい。
【０１０４】
（実施の形態３）
図２３は、本発明の実施の形態３における暗号化プログラム実行装置の構成を示すブロック図である。図２３において、分割プログラム記憶手段１０１、分割プログラムコールツリー保持手段１０２、ロード領域１０３、オーバレイローダ１０４、分割プログラムロード位置記憶手段１０５、分割プログラムロード情報管理手段１０６、分割プログラムロード情報記憶手段１０７は、図１で用いたものと同じものである。分割プログラム属性設定手段２３０１は、分割プログラムごとの属性を設定する。属性の種類として、分割プログラムに要求されるセキュリティの強さ、処理速度などがある。分割プログラム属性記憶手段２３０２は、分割プログラム属性設定手段２３０１で設定された分割プログラムの属性を、分割プログラム識別子と対応付けて記憶する。分割プログラムロード位置属性依存決定手段２３０３は、分割プログラムロード情報記憶手段１０７で記憶しているロード時の管理情報と、分割プログラム属性記憶手段２３０２で記憶している分割プログラムの属性によって、分割プログラムのロード位置を決定する。セキュリティ強度が強く設定されているものは、短時間で削除（上書き）する。
【０１０５】
処理速度が速く設定されているものは、ロード回数を少なくするなどのルールを用いる。ロード回数を少なくするためには、コンパイラのレジスタ割り当てアルゴリズムとして知られているような、生存区間を用いた方法がある。レジスタ割り当ての場合、変数ｘと変数ｙの生存区間に共通部分がなければ、変数ｘと変数ｙに同じレジスタを割り付けることができる。同様に、分割プログラムの生存区間、すなわち、エリア上にロードされて、実行されている区間に共通部分がなければ、同じエリアを割り当てることができる。
【０１０６】
図２４は、本発明の実施の形態３におけるロード位置決定処理の具体的な流れを示すフロー図である。
【０１０７】
上記の構成と、図２、図１３のような構成の暗号化データ実行装置において、ロード位置決定処理の具体的な流れを図２４のフロー図を用いて説明する。
【０１０８】
＜プログラムの実行順＞
（ステップ１）  分割プログラム属性設定手段２３０１により、各分割プログラムにセキュリティ強度と、処理速度の属性を設定する（Ｓ２４０１）。（ステップ２）に進む。
【０１０９】
（ステップ２）  速度が必要な分割プログラムをロード回数の多いものから順に別々のロードエリアに割り当てる（Ｓ２４０２）。（ステップ３）に進む。
【０１１０】
（ステップ３）  （ステップ２）でロードエリアが足りない場合には、図２のコールツリーから呼び出し関係のないものを同じロードエリアに割り当てる（Ｓ２４０３）。（ステップ４）に進む。
【０１１１】
（ステップ４）  強度が必要なものを割り当てる。図２のコールツリーから呼び出し先の分割プログラム（子ども）を同じロードエリアに割り当てる。なければ、呼び出し先の呼び出し先（孫）、または、呼び出し元（親を同じロードエリアに割り当てる（Ｓ２４０４）。この内容を各分割プログラムのロード位置をファイルに書き出して終了する（おわり）。
【０１１２】
上記のようにロードエリアを決定すると、分割プログラムのロード時間が平均化されるため、分割プログラムが復号されたままの状態でロード領域１０３上に長い時間置かれることがなくなり、セキュリティ強度を強く保持できる。
【０１１３】
なお、本実施の形態において、セキュリティ強度の強い分割プログラムは、実行終了後、毎回０クリアするとしてもよい。また、０クリアの代わりに、暗号化してもよい。処理速度は遅くなるが、安全性は高くなる。
【０１１４】
さらに、分割プログラムロード位置属性依存決定手段２３０３において、分割プログラムロード情報記憶手段１０７で記憶している情報から、各分割プログラムのロード所要時間、実行時間、生存時間、ロード順、実行順を読み取り、強度指定のものが指定時間以上生存しないようにした上で、プログラムの全処理時間が最短になるようにロード位置を決定する。このとき、全パターンについてシミュレートしてもよいし、組み合わせ最適化アルゴリズムとしてシミュレーテッドアニーリングや遺伝的アルゴリズムなどのよく知られた方法を用いてもよい。
【０１１５】
また、分割プログラムロード情報管理手段１０６において、管理する情報には、一定時間に一定値を加算する参照フラグを用いてもよい。参照フラグが、閾値以上になった場合にメモリ上から削除する。強度指定されている分割プログラムと、速度指定している分割プログラム、指定なしの分割プログラムで加算する値を変えることにより、メモリ上から分割プログラムから削除されるタイミングをずらすことが可能になる。
【０１１６】
（実施の形態４）
図２５は、本発明の実施の形態４における暗号化プログラム実行装置の構成を示すブロック図である。図２５において、分割プログラム記憶手段１０１、分割プログラムコールツリー保持手段１０２、ロード領域１０３、オーバレイローダ１０４、分割プログラムロード位置記憶手段１０５、分割プログラムロード情報管理手段１０６、分割プログラムロード情報記憶手段１０７は、図１で用いたものと同じものである。分割プログラム属性設定手段２３０１、分割プログラム属性記憶手段２３０２、分割プログラムロード位置属性依存決定手段２３０３は、図２３で用いたものと同じものである。プログラム２５０１は、分割プログラムのもととなるものである。通常、Ｃ言語などのプログラミング言語で記述されている。強度／速度設定手段２５０２は、プログラム２５０１中の一部分に対して、セキュリティ強度が必要な部分や、高速な処理速度が必要な部分にしるしをつける。分割プログラム生成手段２５０３は、プログラム２５０１を小さい処理単位に分割して分割プログラムを生成する。このとき、強度／速度設定手段２５０２で設定されている情報に従って、必要な条件が満たされるようにプログラム２５０１を分割する。また、各分割プログラムの識別子と、設定された強度、速度を対応付けて分割プログラム属性記憶手段２３０２に記憶させる。
【０１１７】
図２６は、プログラム中に強度／速度設定手段２５０２でパラメータを設定した状態のプログラム例である。速度指定範囲（ａ）２６０１は、速い処理速度が必要な部分である。強度指定範囲（ｂ）２６０２と強度指定範囲（ｃ）２６０３は、セキュリティ強度が必要な部分である。
【０１１８】
図２７は、分割プログラム生成手段２５０３で、図２６で示すプログラムから分割プログラムを生成した例である。２７０１、２７０２、２７０３、２７０４は、それぞれ分割プログラムを示している。
【０１１９】
図２８は、生成された分割プログラムを実行時の履歴情報を用いて最適化する処理の流れを示すフロー図である。
【０１２０】
図２９は、本発明の実施の形態４における分割プログラム生成処理の具体的な流れを示すフロー図である。
【０１２１】
上記の構成のような構成の暗号化データ生成装置において、分割プログラム生成処理の具体的な流れを図２８、図２９のフロー図を用いて説明する。
【０１２２】
＜プログラムの実行順＞
（ステップ１）  分割プログラム属性設定手段２３０１により、各分割プログラムにセキュリティ強度と、処理速度の属性を設定する（Ｓ２８０１）。（ステップ２）に進む。
【０１２３】
（ステップ２）  プログラムを分割する（S２８０２）。強度が必要な部分を１つの分割プログラムとする（Ｓ２９０２）。速度が必要な部分を１つの分割プログラムにする（Ｓ２９０３）。（ステップ３）に進む。
【０１２４】
（ステップ３）  分割プログラムの属性情報を分割プログラムと対応させて記憶する（Ｓ２９０４）。（ステップ４）に進む。
【０１２５】
（ステップ４）  分割プログラムの属性に従ってロード位置を決定する（Ｓ２８０３）。例えば、実施の形態３に示す方法がある。この内容を各分割プログラムのロード位置を分割プログラムロード位置記憶手段１０５で記憶する。（ステップ５）に進む。
【０１２６】
（ステップ５）プログラムを実行させて、ロード時の履歴情報を分割プログラムロード情報記憶手段１０７で記憶する（Ｓ２８０４）。（ステップ６）に進む。
【０１２７】
（ステップ６）  必要なセキュリティ強度、速度の条件を満たしているか判定する（Ｓ２８０５）。満たしていれば終了する。満たしていなければ、（ステップ１）に戻る（おわり）。
【０１２８】
まず、図２６でプログラム中に指定されている強度指定範囲（ｂ）２６０２と、強度指定範囲（ｃ）２６０３を、１つの分割プログラムとして抽出する。図２７の２７０３，２７０４のように分割プログラムが生成される。
【０１２９】
次に、速度指定範囲（ａ）２６０１を１つの分割プログラムとして抽出する。このとき、ｆｏｒ文の中が範囲指定されているので、ｆｏｒ文の外側までを１つの分割プログラムとする。図２７の２７０２のように分割プログラムが生成される。
【０１３０】
上記のように分割プログラムを生成すると、プログラムの属性に合うように分割されるため、分割プログラムが復号されたままの状態でロード領域１０３上に長い時間置かれることがなくなり、セキュリティ強度を強く保持できる。さらに、速度が必要な部分は何回もロードされなくなるため、プログラム全体の処理速度が向上する。
【０１３１】
なお、プログラムをフラット化して分割してもよいし、強度指定は、ファイル単位、関数単位で行ってもよい。
【０１３２】
（実施の形態５）
図３０は、本発明の実施の形態５における暗号化プログラム実行装置の構成を示すブロック図である。図３０において、分割プログラム記憶手段１０１、ロード領域１０３、オーバレイローダ１０４、分割プログラムロード位置記憶手段１０５は、図１で用いたものと同じものである。プログラム２５０１、分割プログラム生成手段２５０３は、図２５で用いたものと同じである。分割プログラム記憶手段１０１は、分割プログラム生成手段２５０３が生成した分割プログラムの識別子と、サイズと、その実体を対応付けて記憶する。複製分割プログラム生成手段３００１は、前記プログラム２５０１から生成した分割プログラムに対し、同じ結果を得られるが、異なる命令コード群からなる複製分割プログラムを生成する。例えば、分割プログラム中の式に対して、定数式を追加したり、式の恒等変換を行ったりして置換することにより、複製分割プログラムを生成する方法がある。
【０１３３】
＜変形前＞
ｚ＝ｘ＋ｙ；
＜変形後＞
ａ＝１；
ｂ＝２；
ｃ＝ｂ−ａ；
ａ＝ｘ＋ａ；
ｂ＝ｙ―ｂ；
ｚ＝ａ＋ｂ＋ｃ；
複製分割プログラム記憶手段３００２は、複製分割プログラムを、暗号化するか、あるいは分割のみ行った状態で記憶する。複製分割プログラムの識別子、サイズ、実体と、オリジナルの分割プログラムの識別子を対応付けて記憶する。複製オーバレイローダ３００３は、ロード要求されたオリジナルの分割プログラムまたは、対応する複製分割プログラムのいずれかをロード領域１０３にロードする。
【０１３４】
図３１は、本発明の実施の形態５における分割プログラムのロード処理の具体的な流れを示すフロー図である。
【０１３５】
上記の構成のような構成の暗号化データ実行装置において、プログラムを分割して分割プログラムを生成し、プログラムのロード処理の具体的な流れを図３１のフロー図を用いて説明する。
【０１３６】
＜プログラムのロード処理の実行順＞
（ステップ１）  プログラムの実行途中に別の分割プログラムをロードするように指示を受け取る（Ｓ３１０１）。（ステップ２）へ進む。
【０１３７】
（ステップ２）  （ステップ１）で指示された分割プログラムの識別子に対応する複製分割プログラムを、複製分割プログラム記憶手段３００２から複製分割プログラムを探す（Ｓ３１０２）。（ステップ３）に進む。
【０１３８】
（ステップ３）  複製オーバレイローダ３００３は、オリジナルの分割プログラムか、（ステップ２）で得た１つ以上の複製分割プログラムの中から１つをランダムに決定する（Ｓ３１０３）。（ステップ４）に進む。
【０１３９】
（ステップ４）  さらに、複製オーバレイローダ３００３は、（ステップ３）で決定した分割プログラムまたは複製分割プログラムを分割プログラム記憶手段１０１か、複製分割プログラム記憶手段３００２から読み出す。このとき、読み出された分割プログラムまたは複製分割プログラムが暗号化されているならば、複製オーバレイローダ３００３は、これを復号する。これらのロード位置を分割プログラムロード位置記憶手段１０５から読み出して、ロード領域１０３の指定の位置にロードする（Ｓ３１０４）。（ステップ５）に進む。
【０１４０】
（ステップ５）  ロード領域１０３にロードされた分割プログラムまたは複製分割プログラムを順に実行させる（Ｓ３１０５）。（ステップ６）に進む。
【０１４１】
（ステップ６）  プログラム実行の終了を判定する（Ｓ３１０６）。終了しないならば、（ステップ１）へ進む（おわり）。
【０１４２】
上記のように複製分割プログラムを生成すると、毎回、異なる処理が行われることになり、プログラムの解析が困難となり、セキュリティ強度を強く保持できる。
【０１４３】
なお、複製分割プログラム生成手段３００１は、式の恒等変換としたが、プログラムの制御フローを変換する方法、データフローを変換する方法、実際には処理されないダミーコードを挿入する方法でもよい。コンパイラの最適化の手法を用いてもよい。
【０１４４】
なお、分割プログラムは、１台のコンピュータ内で動いてもよいし、ネットワーク上の複数のコンピュータに分散してもよい。また、本実施例では、プログラム言語をＣ言語としたが、他の高級言語、アセンブリ言語、コンパイラで用いる中間言語、ＪＡＶＡ（登録商標）バイトコードなどを用いてもよい。
【産業上の利用可能性】
【０１４５】
本発明にかかる暗号化プログラム実行方法およびその装置は、秘密情報を守るプログラムを不正に利用されないようにするという効果を有し、プログラムの耐タンパ化方法等として有用である。
【図面の簡単な説明】
【０１４６】
【図１】本発明の実施の形態１における暗号化プログラム実行装置の構成を示すブロック図
【図２】分割プログラムコールツリー保持手段１０２で記憶している分割プログラムコールツリー
【図３】ロード領域１０３に分割プログラムがロードされる状態を示す概念図
【図４】分割プログラムロード位置記憶手段１０５で記憶しているロード位置を示す概念図
【図５】分割プログラムロード情報管理手段１０６で管理する情報を示す概念図
【図６】本発明の実施の形態１における分割プログラムのロード処理の具体的な流れを示すフロー図
【図７】本発明の実施の形態１における分割プログラムのロード位置決定アルゴリズムを示すフロー図
【図８】分割プログラムロード管理情報テーブル５０１の内容
【図９】分割プログラムロード管理情報テーブル５０１の記憶内容を集計した結果
【図１０】分割プログラムロード位置決定手段１０８で決定したロードエリアの割り当て結果
【図１１】分割プログラムロード情報管理手段１０６で管理する情報を示す概念図
【図１２】本発明の実施の形態１における分割プログラムのロード位置決定アルゴリズムを示すフロー図
【図１３】図１１の分割プログラムロード管理情報テーブル５０１の記憶内容を集計した結果
【図１４】分割プログラムロード位置決定手段１０８で決定したロードエリアの割り当て結果
【図１５】分割プログラムロード情報管理手段１０６で管理する情報を示す概念図
【図１６】本発明の実施の形態２における暗号化プログラム実行装置の構成を示すブロック図
【図１７】本発明の実施の形態２における分割プログラムのロード処理の具体的な流れを示すフロー図
【図１８】分割プログラムロード情報管理手段１０６で管理する情報を示す概念図
【図１９】ロード領域１０３に分割プログラムがロードされる状態を示す概念図
【図２０】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図２１】本発明の実施の形態３における分割プログラムの動的なロード位置決定アルゴリズムを示すフロー図
【図２２】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図２３】本発明の実施の形態３における暗号化プログラム実行装置の構成を示すブロック図
【図２４】本発明の実施の形態３におけるロード位置決定処理の具体的な流れを示すフロー図
【図２５】本発明の実施の形態４における暗号化プログラム実行装置の構成を示すブロック図
【図２６】プログラム中に強度／速度設定手段２５０２でパラメータを設定した状態のプログラム例
【図２７】前記分割プログラム生成手段２５０３で、プログラムから分割プログラムを生成した例
【図２８】生成された分割プログラムを実行時の履歴情報を用いて最適化する処理の流れを示すフロー図
【図２９】本発明の実施の形態４における分割プログラム生成処理の具体的な流れを示すフロー図
【図３０】本発明の実施の形態５における暗号化プログラム実行装置の構成を示すブロック図
【図３１】本発明の実施の形態５における分割プログラムのロード処理の具体的な流れを示すフロー図
【図３２】前記特許文献１に記載された従来の暗号化プログラム実行装置
【図３３】前記非特許文献１に記載された従来のオーバレイローダ
【図３４】前記非特許文献２に記載された従来のアルゴリズム
【図３５】前記非特許文献２に記載された従来のアルゴリズム
【図３６】前記非特許文献２に記載された従来のアルゴリズム
【図３７】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図３８】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図３９】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図４０】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図４１】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【図４２】分割プログラムロード情報管理手段１０６が管理する情報を示す概念図
【符号の説明】
【０１４７】
１０１、３３０１  分割プログラム記憶手段
１０２  分割プログラムコールツリー保持手段
１０３、３２０４、３３０４  ロード領域
１０４、３３０３  オーバレイローダ
１０５、３３０２  分割プログラムロード位置記憶手段
１０６  分割プログラムロード情報管理手段
１０７  分割プログラムロード情報記憶手段
１０８  分割プログラムロード位置決定手段
１６０５  分割プログラムロード位置実行時決定手段
２３０１  分割プログラム属性設定手段
２３０２  分割プログラム属性記憶手段
２３０３  分割プログラムロード位置属性依存決定手段
２５０１  プログラム
２５０２  強度／速度設定手段
２５０３  分割プログラム生成手段
３００１  複製分割プログラム生成手段
３００２  複製分割プログラム記憶手段
３００３  複製オーバレイローダ
３２０１  暗号化プログラム記憶手段
３２０２  プログラムローダ
３２０３  プログラム復号手段
【図１】
2005050196.tif 000003
【図２】
2005050196.tif 000004
【図３】
2005050196.tif 000005
【図４】
2005050196.tif 000006
【図５】
2005050196.tif 000007
【図６】
2005050196.tif 000008
【図７】
2005050196.tif 000009
【図８】
2005050196.tif 000010
【図９】
2005050196.tif 000011
【図１０】
2005050196.tif 000012
【図１１】
2005050196.tif 000013
【図１２】
2005050196.tif 000014
【図１３】
2005050196.tif 000015
【図１４】
2005050196.tif 000016
【図１５】
2005050196.tif 000017
【図１６】
2005050196.tif 000018
【図１７】
2005050196.tif 000019
【図１８】
2005050196.tif 000020
【図１９】
2005050196.tif 000021
【図２０】
2005050196.tif 000022
【図２１】
2005050196.tif 000023
【図２２】
2005050196.tif 000024
【図２３】
2005050196.tif 000025
【図２４】
2005050196.tif 000026
【図２５】
2005050196.tif 000027
【図２６】
2005050196.tif 000028
【図２７】
2005050196.tif 000029
【図２８】
2005050196.tif 000030
【図２９】
2005050196.tif 000031
【図３０】
2005050196.tif 000032
【図３１】
2005050196.tif 000033
【図３２】
2005050196.tif 000034
【図３３】
2005050196.tif 000035
【図３４】
2005050196.tif 000036
【図３５】
2005050196.tif 000037
【図３６】
2005050196.tif 000038
【図３７】
2005050196.tif 000039
【図３８】
2005050196.tif 000040
【図３９】
2005050196.tif 000041
【図４０】
2005050196.tif 000042
【図４１】
2005050196.tif 000043
【図４２】
2005050196.tif 000044