(57)【特許請求の範囲】
【請求項１】
通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールと、
前記通信装置内の前記セキュアモジュール外に備えられ、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムが保持された記憶装置と、
前記セキュアモジュールに備えられ、前記プログラムの改ざんを検出する検出手段と、
前記セキュアモジュールに備えられ、前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
前記セキュアモジュールに備えられ、前記検出手段によって前記プログラムの改ざんが検出されない場合に、前記プログラムが前記外部の装置に送信するデータの暗号化依頼を前記プログラムから受け付けると、前記データを暗号化し、前記暗号化したデータを前記プログラムに送信する暗号化手段と、
前記セキュアモジュールに備えられ、前記プログラムに固有なコードを記憶する記憶手段と、
前記セキュアモジュールに備えられ、前記プログラムに固有なコードを生成するスキャン処理を前記通信装置で実行させるスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、
を備え、
前記検出手段は、
前記記憶装置内の特定の記憶領域に記憶されている前記プログラムに対し前記スキャンプログラムが前記通信装置で実行された場合、前記通信装置での前記スキャンプログラムの実行結果と前記記憶手段に記憶された前記コードとに基づいて、前記特定の記憶領域に記憶されている前記プログラムの改ざんを検出する、
ことを特徴とする通信装置。
【請求項２】
前記プログラムを、記述内容は異なるが機能は同一のプログラムコードに加工し、加工後のプログラムに固有なコードを前記記憶手段に上書きする加工手段を備え、
前記検出手段は、
前記加工手段による加工後のプログラム内の演算プログラムの演算結果の正当性に基づいて、前記加工後のプログラムの改ざんを検出することを特徴とする請求項１に記載の通信装置。
【請求項３】
前記検出手段によって前記プログラムの改ざんが検出されなかった場合に、前記プログラムを実行する前記通信装置内のプロセッサへ要求を出力した時から、前記プロセッサからの返答を取得する時までの経過時間が許容時間以上であるか否かを判定する判定手段を前記セキュアモジュール内に備え、
前記設定手段は、
前記判定手段によって前記許容時間以上であると判定された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする請求項１または２に記載の通信装置。
【請求項４】
前記セキュアモジュールに備えられ、前記プログラムが前記外部の装置に送信するデータを、前記送信に先だって前記プログラムから取得する取得手段を備え、
前記暗号化手段は、
前記取得手段によって取得されたデータを前記暗号鍵を用いて暗号化し、
前記設定手段は、
前記暗号化手段を不能な状態に設定することにより、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする請求項１〜３のいずれか一つに記載の通信装置。
【請求項５】
前記セキュアモジュールに備えられ、前記暗号鍵の出力依頼を前記プログラムから取得する取得手段と、
前記セキュアモジュールに備えられ、前記取得手段によって前記出力依頼が取得された場合に、前記暗号鍵を前記プログラムに出力する出力手段と、を備え、
前記設定手段は、
前記出力手段を不能な状態に設定することにより、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする請求項１〜４のいずれか一つに記載の通信装置。
【請求項６】
前記データは、前記セキュアモジュールと前記プログラムを実行するプロセッサとが有する共通鍵を用いて暗号化されることを特徴とする請求項４または５に記載の通信装置。
【請求項７】
前記暗号鍵は、前記外部の装置が有する公開鍵に対応する前記セキュアモジュールの秘
密鍵であることを特徴とする請求項３〜６のいずれか一つに記載の通信装置。
【請求項８】
前記暗号鍵は、前記セキュアモジュールと前記外部の装置とが共通して有する共通鍵であることを特徴とする請求項３〜６のいずれか一つに記載の通信装置。
【請求項９】
通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールと、
前記通信装置内の前記セキュアモジュール外に備えられ、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムが保持された記憶装置と、
前記セキュアモジュールに備えられ、前記プログラムの改ざんを検出する検出手段と、
前記セキュアモジュールに備えられ、前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
前記セキュアモジュールに備えられ、前記検出手段によって前記プログラムの改ざんが検出されない場合に、前記プログラムが前記外部の装置に送信するデータの暗号化依頼を前記プログラムから受け付けると、前記データを暗号化し、前記暗号化したデータを前記プログラムに送信する暗号化手段と、
前記セキュアモジュールに備えられ、前記プログラムに固有なコードを記憶する記憶手段と、
前記セキュアモジュールに備えられ、前記記憶装置に直接アクセスをおこない読み出した前記プログラムから前記プログラムに固有なコードを生成するスキャン処理を実行するスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、を備え、
前記検出手段は、
前記スキャンプログラムの実行結果と、前記記憶手段に記憶された前記コードとに基づいて、前記プログラムの改ざんを検出する、
ことを特徴とする通信装置。
【請求項１０】
通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールにおいて、
前記通信装置内の前記セキュアモジュール外に備えられた記憶装置に保持され、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムの改ざんを検出する検出手段と、
前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
前記検出手段によって前記プログラムの改ざんが検出されない場合に、前記プログラムが前記外部の装置に送信するデータの暗号化依頼を前記プログラムから受け付けると、前記データを暗号化し、前記暗号化したデータを前記プログラムに送信する暗号化手段と、
前記プログラムに固有なコードを記憶する記憶手段と、
前記プログラムに固有なコードを生成するスキャン処理を前記通信装置で実行させるスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、
を備え、
前記検出手段は、
前記記憶装置内の特定の記憶領域に記憶されている前記プログラムに対し前記スキャンプログラムが前記通信装置で実行された場合、前記通信装置での前記スキャンプログラムの実行結果と前記記憶手段に記憶された前記コードとに基づいて、前記特定の記憶領域に記憶されている前記プログラムの改ざんを検出する、
ことを特徴とするセキュアモジュール。
【請求項１１】
通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールにおいて、
前記通信装置内の前記セキュアモジュール外に備えられた記憶装置に保持され、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムの改ざんを検出する検出手段と、
前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
前記検出手段によって前記プログラムの改ざんが検出されない場合に、前記プログラムが前記外部の装置に送信するデータの暗号化依頼を前記プログラムから受け付けると、前記データを暗号化し、前記暗号化したデータを前記プログラムに送信する暗号化手段と、
前記プログラムに固有なコードを記憶する記憶手段と、
前記記憶装置に直接アクセスをおこない読み出した前記プログラムから前記プログラムに固有なコードを生成するスキャン処理を実行するスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、
を備え、
前記検出手段は、
前記スキャンプログラムの実行結果と、前記記憶手段に記憶された前記コードとに基づいて、前記プログラムの改ざんを検出する、
ことを特徴とするセキュアモジュール。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報を処理する通信装置およびセキュアモジュールに関する。
【背景技術】
【０００２】
従来、モバイル端末（以下、単に「端末」という）は、第３者によるソフトウェア開発を想定していなかったため、端末の仕様およびソフトウェア構造は一般に知られておらず、端末内部は秘匿性が保たれ相当に安全であった。また、安全性の保証されたセキュアモジュール（耐タンパモジュール、例えばＳＩＭカード（Ｓｕｂｓｃｒｉｂｅｒ  Ｉｄｅｎｔｉｔｙ  Ｍｏｄｕｌｅ  Ｃａｒｄ））を信頼性拠点として、特に秘匿すべき情報（例えば、正規の暗号鍵）の安全性を担保していた（例えば、下記特許文献１および２参照）。
【０００３】
そのため、外部装置は、端末と通信をおこなう際には、受信した通信内容が、安全性の担保された正規の暗号鍵により暗号化されているかに基づいて、正規の通信内容か偽の通信内容かを判別して通信の安全性を担保していた。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００４−１２９２２７号公報
【特許文献２】特許第４４０８６０１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、近年では、スマートフォンで見られるように、端末の仕様およびソフトウェア構造を公開し、第３者によるソフトウェア開発を促す傾向にある。このため、クラッカーによって、端末内のソフトウェアが読み出され、解析され、改ざんされ、不正ソフトウェアが開発される可能性が増大している。また、セキュアモジュールは、外から覗き見や改ざんは不可能であるが、ソフトウェアから利用するためのインターフェースが公開されているため、セキュアモジュール内の秘匿すべき情報は不正ソフトウェアによって容易に読み出されてしまう。
【０００６】
したがって、不正ソフトウェアが、偽の通信内容を正規の暗号鍵を用いて暗号化した上で、外部の装置に送信することができるため、外部の装置では偽の通信内容か否かを判別できず、通信の安全性を担保できないという問題があった。
【０００７】
本発明は、かかる問題点に鑑み、不正ソフトウェアによる正規の暗号鍵を用いた暗号化通信を防止する通信装置およびセキュアモジュールを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールと、通信装置内のセキュアモジュール外に備えられ、通信装置の外部の装置との暗号化通信をセキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムが保持された記憶装置と、を備え、セキュアモジュールに実装された検出手段により、プログラムの改ざんを検出し、セキュアモジュールに実装された設定手段により、プログラムの改ざんが検出された場合に、セキュアモジュールを、プログラムによる暗号鍵を用いた暗号化通信が不可能な状態に設定する通信装置が一例として提案される。
【０００９】
上述した課題を解決し、目的を達成するため、通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールにおいて、通信装置内のセキュアモジュール外に備えられた記憶装置に保持され、通信装置の外部の装置との暗号化通信をセキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムの改ざんを検出し、プログラムの改ざんが検出された場合に、セキュアモジュールを、プログラムによる暗号鍵を用いた暗号化通信が不可能な状態に設定するセキュアモジュールが一例として提案される。
【発明の効果】
【００１０】
本発明の一側面によれば、不正ソフトウェアによる正規の暗号鍵を用いた暗号化通信の防止を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、通信装置とセンタ間の通信の内容を示す説明図である。
【図２】図２は、実施の形態にかかる通信装置１０１のハードウェア構成例１を示すブロック図である。
【図３】図３は、図２のセキュアモジュール１０２のハードウェア構成例を示すブロック図である。
【図４】図４は、実施の形態にかかる通信装置１０１のハードウェア構成例２を示すブロック図である。
【図５】図５は、図４のセキュアモジュール１０２のハードウェア構成例を示すブロック図である。
【図６】図６は、セキュアモジュール１０２の機能的構成を示すブロック図である。
【図７】図７は、通信装置１０１での動作概要例１を示す説明図である。
【図８】図８は、通信装置１０１での動作概要例２を示す説明図である。
【図９】図９は、スキャンプログラムＳＰの具体例を示す説明図（その１）である。
【図１０】図１０は、スキャンプログラムＳＰの具体例を示す説明図（その２）である。
【図１１】図１１は、スキャンプログラムＳＰの具体例を示す説明図（その３）である。
【図１２】図１２は、スキャンプログラムＳＰの具体例を示す説明図（その４）である。
【図１３】図１３は、スキャンプログラム生成／更新処理の手順を示すフローチャートである。
【図１４】図１４は、図１３に示したスキャンプログラム生成処理（ステップＳ１３０３）の詳細な処理手順例を示すフローチャート（その１）である。
【図１５】図１５は、図１３に示したスキャンプログラム生成処理（ステップＳ１３０３）の詳細な処理手順例を示すフローチャート（その２）である。
【図１６】図１６は、スキャンプログラム更新処理（ステップＳ１３０８）の詳細な処理手順例を示すフローチャート（その１）である。
【図１７】図１７は、スキャンプログラム更新処理（ステップＳ１３０８）の詳細な処理手順例を示すフローチャート（その２）である。
【図１８】図１８は、対象プログラムＴＰの加工の概要を示す説明図である。
【図１９】図１９は、加工プログラムＰＰによる対象プログラムＴＰの加工例を示す説明図（その１）である。
【図２０】図２０は、加工プログラムＰＰによる対象プログラムＴＰの加工例を示す説明図（その２）である。
【図２１】図２１は、加工プログラムＰＰによる対象プログラムＴＰの加工例を示す説明図（その３）である。
【図２２】図２２は、加工プログラムＰＰによる対象プログラムＴＰの加工例を示す説明図（その４）である。
【図２３】図２３は、対象プログラムＴＰ加工処理の処理手順例を示すフローチャートである。
【図２４】図２４は、図２３に示したシャッフリング処理（ステップＳ２３１２）の詳細な処理手順例を示すフローチャートである。
【図２５】図２５は、対象プログラムＴＰの加工例を示す説明図である。
【図２６】図２６は、対象プログラムＴＰ内の演算プログラムの内容を示す説明図である。
【図２７】図２７は、セキュアモジュール１０２による認証処理の詳細を示す説明図である。
【図２８】図２８は、セキュアモジュール１０２による暗号化許可のフローチャートを示す説明図である。
【図２９】図２９は、通信装置１０１とセンタ１０３との相互認証を示すシーケンス図（その１）である。
【図３０】図３０は、通信装置１０１とセンタ１０３との相互認証を示すシーケンス図（その２）である。
【図３１】図３１は、通信装置１０１とセンタ１０３との暗号化通信を示すシーケンス図である。
【図３２】図３２は、通信装置１０１とセンタ１０３とのプログラムコードの暗号化通信を示すシーケンス図（その１）である。
【図３３】図３３は、通信装置１０１とセンタ１０３とのプログラムコードの暗号化通信を示すシーケンス図（その２）である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、この発明にかかる通信装置およびセキュアモジュールの実施の形態を詳細に説明する。
【００１３】
（通信装置とセンタ間の通信）
図１は、通信装置とセンタ間の通信の内容を示す説明図である。図１において、通信装置１０１は、セキュアモジュール１０２を有し、また、セキュアモジュール１０２内の暗号（復号）鍵Ｋ（以下、単に「暗号鍵Ｋ」という）を用いて暗号化通信をおこなうプログラム（以下、「暗号化通信プログラム」という）を有している。暗号化通信とは、通信内容を暗号化する通信であり、暗号化通信プログラムは、例えば、暗号鍵Ｋを用いて送信する通信内容を暗号化し、または、暗号鍵Ｋを用いて受信した通信内容を復号する。また、暗号化用の鍵と復号用の鍵は異なる鍵でもよい。
【００１４】
通信装置１０１は、暗号化通信プログラムを用いて、外部の装置（ここでは、センタ１０３）とネットワーク１１０を介した暗号化通信をおこなう。暗号化通信プログラムは、例えば、書籍注文用ソフトウェアや電子書籍注文用ソフトウェアや電子マネー受信用ソフトウェアである。また、通信装置１０１は、ネットワーク１１０を介してクラッカーのコンピュータ１０４に接続されている。
【００１５】
セキュアモジュール１０２は、ＴＲＭ（Ｔａｍｐｅｒ  Ｒｅｓｉｓｔａｎｔ  Ｍｏｄｕｌｅ）構造など内部に格納された情報を外部から参照できない構造を有するＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）である。これにより、セキュアモジュール１０２は、外部からの覗き見を防止するとともに、内部のデータの改ざんを防止する。
【００１６】
セキュアモジュール１０２は、正規の暗号鍵Ｋを保持している。暗号鍵Ｋに対応する復号鍵は、例えば、暗号鍵Ｋそのものである。また、暗号鍵Ｋと復号鍵が異なる場合は、セキュアモジュール１０２は、復号鍵をさらに保持する。さらに、セキュアモジュール１０２は、通信装置１０１内の通信相手であるセンタ１０３の暗号鍵に対応する復号鍵を保持する。
【００１７】
また、セキュアモジュール１０２は、プログラムの改ざんを検出する機能により監視対象となるプログラム（以下、「対象プログラムＴＰ」という）が正規プログラムなのか改ざんされた不正プログラムなのかを一定時間間隔で監視している。ここでは、対象プログラムＴＰは、上述した通信装置１０１内の暗号化通信プログラムである。
【００１８】
セキュアモジュール１０２は、対象プログラムＴＰが正規プログラムであると判断されている場合、対象プログラムＴＰによる通信内容の暗号化に暗号鍵Ｋを供する。一方、セキュアモジュール１０２は、対象プログラムＴＰが不正プログラムであると判断された場合、自身の状態を、通信装置１０１内の対象プログラムＴＰによる暗号鍵Ｋを用いた暗号化通信が不可能な状態に設定する。
【００１９】
暗号鍵Ｋを用いた暗号化通信が不可能な状態とは、例えば、セキュアモジュール１０２が不正プログラムからの暗号鍵Ｋの読出し要求や通信内容の暗号化依頼を拒絶する状態である。また、例えば、セキュアモジュール１０２が、再起動されるまで全機能を停止させた状態であってもよい。さらに、セキュアモジュール１０２が通信装置１０１に不正プログラムの停止要求を送信し、不正プログラム自体を終了させてもよい。
【００２０】
センタ１０３は、通信装置１０１と暗号化通信をおこなう。また、センタ１０３は、セキュアモジュール１０２内の暗号鍵Ｋに対応する復号鍵を保持している。例えば、セキュアモジュール１０２の暗号鍵Ｋが秘密鍵である場合は、センタ１０３の復号鍵はセキュアモジュール１０２の公開鍵である。また、例えば、セキュアモジュール１０２の暗号鍵Ｋとセンタ１０３の復号鍵とは、共通鍵でもよい。
【００２１】
センタ１０３は、受信した通信内容が、安全性の担保された正規の暗号鍵Ｋにより暗号化されているかに基づいて、正規の通信内容か偽の通信内容かを判別している。すなわち、センタ１０３が、暗号鍵Ｋに対応する復号鍵によって、受信した通信内容が正常に復号できた場合に、正規の通信内容と判断する。
【００２２】
図１の（Ａ）に示すように、通信装置１０１内で正規プログラムが動作している場合は、セキュアモジュール１０２により対象プログラムＴＰが正規プログラムであると判断される。よって、セキュアモジュール１０２は、正規プログラムの通信内容の暗号化に暗号鍵Ｋを供する。これにより、正規プログラムは、通信内容を正規の暗号鍵Ｋによって暗号化してセンタ１０３に送信することができる。
【００２３】
センタ１０３は、受信した通信内容が、安全性の担保された正規の暗号鍵Ｋにより暗号化されているかに基づいて、正規の通信内容か偽の通信内容かを判別する。ここで、センタ１０３が、受信した通信内容を暗号鍵Ｋに対応する復号鍵によって復号すると、正常に復号できるため、正規の通信内容と判断できる。よって、センタ１０３のユーザは、安心して、受信した通信内容にしたがって、通信装置１０１のユーザへの書籍の発送や課金をおこなうことができる。
【００２４】
次に、図１の（Ｂ）に示すように、クラッカーのコンピュータ１０４から不正プログラムが通信装置１０１に送信され、正規プログラムに上書きされたとする。不正プログラムとは、例えば、書籍販売用ソフトウェアを改ざんしたプログラムであって、通信装置１０１のユーザが書籍購入時に入力した宛先住所を偽装することによりユーザの購入書籍を窃取するプログラムである。
【００２５】
その後、図１の（Ｃ）に示すように、通信装置１０１内で不正プログラムが動作している場合は、セキュアモジュール１０２により対象プログラムＴＰが不正プログラムであると判断されるようになる。セキュアモジュール１０２は、対象プログラムＴＰが不正プログラムであると判断された場合、自身の状態を、通信装置１０１内の対象プログラムＴＰによる暗号鍵Ｋを用いた暗号化通信が不可能な状態に設定する。これにより、不正プログラムは、偽装した通信内容を正規の暗号鍵Ｋを用いて暗号化することができない。
【００２６】
このように、正規プログラムによる通信内容は正規の暗号鍵Ｋを用いて暗号化されるが、不正プログラムにより偽装された通信内容が正規の暗号鍵Ｋを用いて暗号化されることはない。よって、センタ１０３が偽装された通信内容を正規プログラムからの通信内容と誤認することもなくなるため、通信の安全性を担保できる。
【００２７】
（通信装置１０１のハードウェア構成例１）
図２は、実施の形態にかかる通信装置１０１のハードウェア構成例１を示すブロック図である。図２において、通信装置１０１は、プロセッサ２０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）２０４と、を備えている。また、通信装置１０１は、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０５と、ディスプレイ２０６と、セキュアモジュール１０２と、を備えている。また、各構成部はバス２００によってそれぞれ接続されている。
【００２８】
ここで、プロセッサ２０１は、通信装置１０１の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、プロセッサ２０１のワークエリアとして使用される。ＨＤＤ２０４は、プロセッサ２０１の制御にしたがって内蔵するハードディスクに対するデータのリード／ライトを制御する駆動装置である。
【００２９】
インターフェース（以下、「Ｉ／Ｆ」と略する。）２０５は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク１１０に接続され、このネットワーク１１０を介して他の装置に接続される。そして、Ｉ／Ｆ２０５は、ネットワーク１１０と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０５には、例えばモデムやＬＡＮアダプタなどを採用することができる。
【００３０】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２０６は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３１】
セキュアモジュール１０２は、ＨＤＤ２０４から対象プログラムＴＰを読み出す機能、対象プログラムＴＰをスキャンして改ざんを検出するスキャンプログラムを生成／更新する機能を備えている。また、セキュアモジュール１０２は、対象プログラムＴＰやスキャンプログラムをＲＡＭ２０３に実装する機能、暗号化機能、復号化機能、乱数生成機能等を備えている。セキュアモジュール１０２は、暗号鍵Ｋやユーザ識別情報をセキュアに保持している。
【００３２】
ただし、セキュアモジュール１０２は、正規の暗号鍵Ｋ、ユーザ識別情報のみを保持し、暗号化機能、復号化機能、乱数生成機能等は、通信装置１０１が備えることとしてもよい。この場合、セキュアモジュール１０２は、通信装置１０１の要求にしたがって、暗号鍵Ｋやユーザ識別情報を出力する。セキュアモジュール１０２は、通信装置１０１に内蔵されていてもよく、外付けとしてもよい。
【００３３】
図３は、図２のセキュアモジュール１０２のハードウェア構成例を示すブロック図である。セキュアモジュール１０２は、プロセッサ３０１と、Ｉ／Ｆ３０２と、暗号化回路３０３と、ＲＡＭ３０４と、ＲＯＭ３０５と、フラッシュメモリ３０６と、乱数生成回路３０７と、を備えている。
【００３４】
プロセッサ３０１は、セキュアモジュール３１０内の制御や演算処理をおこなう。Ｉ／Ｆ３０２は、バス３００を介して通信装置１０１内の各構成部と接続され、通信をおこなう。暗号化回路３０３は、データやプログラムを暗号化したり、暗号化されたデータやプログラムを復号したりする。
【００３５】
ＲＡＭ３０４は、プロセッサ３０１のワークエリアとして使用されるメインメモリである。ＲＯＭ３０５は、プログラムやデータが格納される不揮発性メモリである。ＲＯＭ３０５には、正規の暗号鍵Ｋ、ユーザ識別情報が格納されている。フラッシュメモリ３０６は、保存したデータやプログラムが書き換え可能な不揮発性メモリである。乱数生成回路３０７は、乱数を生成する。
【００３６】
セキュアモジュール１０２は、外部から覗き見や改ざんができないのが前提であるため、できる限り、図３の構成のようにワンチップのＬＳＩにして実装するべきである。例えば、セキュアモジュール１０２はＴＲＭ構造である。ＴＲＭ構造は、半導体チップ（この場合、セキュアモジュール１０２）の内部解析や改ざんを物理的および論理的に防衛するための構造をいう。具体的には、セキュアモジュール１０２においては、内部に強固で粘着力が高いコーティングが施され、その表面が剥がされると内部の回路が完全に破壊されたり、ダミーの配線が配されている。
【００３７】
（通信装置１０１のハードウェア構成例２）
図４は、実施の形態にかかる通信装置１０１のハードウェア構成例２を示すブロック図である。図４において、通信装置１０１は、プロセッサ２０１と、ＲＯＭ２０２と、ＲＡＭ２０３と、ＨＤＤ２０４と、Ｉ／Ｆ２０５と、ディスプレイ２０６と、セキュアモジュール１０２と、を備えている。図４において、図２と同様の構成部には同一の符号を付し、その説明を省略する。
【００３８】
図４では、セキュアモジュール１０２は、暗号化機能、復号化機能、乱数生成機能等を備えるＬＳＩ４０１と、暗号鍵Ｋやユーザ識別情報をセキュアに保持する既存のＳＩＭカード４０２とを接合して作成される。そして、ＬＳＩ４０１は、必要に応じて暗号鍵ＫをＳＩＭカード４０２から読み出して暗号化機能、復号化機能を使用する。
【００３９】
図５は、図４のセキュアモジュール１０２のハードウェア構成例を示すブロック図である。図５において、セキュアモジュール１０２は、ＬＳＩ４０１とＳＩＭカード４０２とで構成される。ＬＳＩ４０１は、プロセッサ３０１と、Ｉ／Ｆ３０２と、暗号化回路３０３と、ＲＡＭ３０４と、ＲＯＭ３０５と、フラッシュメモリ３０６と、乱数生成回路３０７と、を備えている。ＳＩＭカード４０２は、暗号鍵Ｋやユーザ識別情報をセキュアに保持している。セキュアモジュール１０２内で、ＬＳＩ４０１と、ＳＩＭカード４０２とはＩ／Ｆ３０２によって接続され、通信をおこなう。図５において、図３と同様の構成部には同一の符号を付し、その説明を省略する。
【００４０】
セキュアモジュール１０２は、外部から覗き見や改ざんができないのが前提であるため、図５の構成のように複数チップで実現した場合は、全体を一つのモジュールとし、全体を樹脂で固めて第３者が覗き見や改ざんが困難なように実装すべきである。
【００４１】
（セキュアモジュール１０２の機能的構成例）
次に、セキュアモジュール１０２の機能的構成例について説明する。図６は、セキュアモジュール１０２の機能的構成を示すブロック図である。セキュアモジュール１０２は、検出部６０１と、設定部６０２と、記憶部６０３と、生成部６０４と、加工部６０５と、判定部６０６と、取得部６０７と、暗号化部６０８と、出力部６０９と、を含む構成である。
【００４２】
検出部６０１は、プログラムの改ざんを検出する機能を有する。ここで、プログラムとは、通信装置１０１の記憶装置に保持され、通信装置１０１の外部の装置（センタ１０３）との暗号化通信をセキュアモジュール１０２内に保持されている暗号鍵Ｋを用いておこなうプログラムである。例えば、プログラムとは、上述した対象プログラムＴＰである。
【００４３】
例えば、通信装置１０１の記憶装置内の特定の記憶領域に記憶されているプログラムに対しスキャンプログラムが通信装置１０１で実行される。この場合、検出部６０１は、通信装置１０１でのスキャンプログラムの実行結果と記憶部６０３に記憶されたコードとに基づいて、特定の記憶領域に記憶されているプログラムの改ざんを検出する。ここで、特定の記憶領域とは、ＲＡＭ２０３内の対象プログラムＴＰを含むスキャン対象となる領域であり、後述するスキャン対象領域２３０である。スキャンプログラムは、対象プログラムＴＰの改ざんを検出するプログラムであり、後述するスキャンプログラムＳＰである。この場合、スキャンプログラムは、通信装置１０１内で実行されている。
【００４４】
コードおよび実行結果とは、対象プログラムＴＰのプログラムコードそのもの、または、対象プログラムＴＰのプログラムコードに所定の演算をおこなった結果である。所定の演算とは、例えば、四則演算や論理演算、チェックサムの算出やハッシュ関数によるハッシュ値算出である。これにより、検出部６０１は、クラッキングによる対象プログラムＴＰの改ざんを検出することができる。
【００４５】
例えば、検出部６０１は、通信装置１０１の記憶装置内の特定の記憶領域に記憶されているプログラムに対するスキャンプログラムの実行結果と記憶部６０３に記憶されたコードとに基づいて、特定の記憶領域に記憶されているプログラムの改ざんを検出する。この場合、スキャンプログラムは、セキュアモジュール１０２内で実行されている。これにより、検出部６０１は、クラッキングによる対象プログラムＴＰの改ざんを検出することができる。また、検出部６０１は、安全性の担保されたセキュアモジュール１０２内のスキャンプログラムを実行するため、スキャンプログラム自体がクラッキングされる虞がない。
【００４６】
検出部６０１は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、その機能を実現する。
【００４７】
設定部６０２は、セキュアモジュール１０２を、プログラムによる暗号鍵Ｋを用いた暗号化通信が不可能な状態に設定する機能を有する。
【００４８】
具体的には、例えば、設定部６０２は、検出部６０１によってプログラムの改ざんが検出された場合に、後述する暗号化部６０８、出力部６０９、または全機能を使用不能に設定する。これにより、設定部６０２は、セキュアモジュール１０２を、改ざんが検出された対象プログラムＴＰからの暗号鍵Ｋの読出し要求や通信内容の暗号化依頼に対応しないようにできる。そのため、改ざんが検出された対象プログラムＴＰによる暗号鍵Ｋを用いた暗号化通信が不可能となる。
【００４９】
具体的には、例えば、後述する判定部６０６によって、通信装置１０１を装ってクラッカーのコンピュータ１０４がセキュアモジュール１０２と通信していると判断される。この場合に、設定部６０２は、後述する暗号化部６０８、出力部６０９、または全機能を使用不能に設定する。これにより、設定部６０２は、セキュアモジュール１０２を、クラッカーのコンピュータ１０４との通信に対応しないようにできる。
【００５０】
設定部６０２は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、その機能を実現する。
【００５１】
記憶部６０３は、プログラムに固有なコードを記憶する機能を有する。ここで、プログラムに固有なコードとは、対象プログラムＴＰのプログラムコードそのものであってもよく、プログラムコードに所定の演算をおこなった結果であってもよい。所定の演算とは、例えば、四則演算や論理演算、チェックサムの算出やハッシュ関数によるハッシュ値算出である。
【００５２】
具体的には、例えば、記憶部６０３は、対象プログラムＴＰを予め通信装置１０１のＲＡＭ２０３とは別にセキュアモジュール１０２のＲＡＭ３０４に保持しておく。そして、記憶部６０３は、セキュアモジュール１０２のＲＡＭ３０４に保持された対象プログラムＴＰに固有のコードを記憶しておく。
【００５３】
記憶部６０３は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、その機能を実現する。
【００５４】
生成部６０４は、プログラムに固有なコードを生成するスキャン処理をおこなうスキャンプログラムを生成する生成処理を実行する機能を有する。また、生成部６０４は、固有なコードと同一コードの生成を維持したままスキャンプログラムの内容をランダムに更新する更新処理を実行する機能を有する。ここで、スキャンプログラムとは、対象プログラムＴＰのプログラムコードを取得し、または取得したプログラムコードに所定の演算をおこなった結果を算出するプログラムである。
【００５５】
具体的には、例えば、生成部６０４は、スキャン処理を通信装置１０１で実行させるスキャンプログラムを生成する。これにより、生成部６０４は、対象プログラムＴＰに固有のコードを生成することができ、対象プログラムＴＰの改ざんの検出に使用できる。また、生成部６０４は、通信装置１０１の記憶装置に直接アクセスをおこなうスキャン処理をセキュアモジュール１０２で実行させるスキャンプログラムを生成する。これにより、クラッカーによるスキャンプログラムへのクラッキングをセキュアモジュール１０２の構造によって防止できる。
【００５６】
具体的には、例えば、生成部６０４は、定期的にスキャンプログラムを更新する。これにより、生成部６０４は、クラッカーによるスキャンプログラムのクラッキングを防止することができる。また、生成部６０４は、不定期的にスキャンプログラムを更新する。これにより、生成部６０４は、クラッカーによるスキャンプログラムのクラッキングを防止することができる。
【００５７】
また、生成部６０４は、スキャンプログラムを、例えば、後述する「難読化」、「スキャン対象領域変更」、「スキャン対象アドレスの順序変更」、「スキャン結果演算の追加」、「スキャンプログラムのアドレス追加」により更新する。生成部６０４は、スキャンプログラムを更新することにより、クラッカーによってスキャンプログラムが解読され、改ざんされることを防止することができる。
【００５８】
生成部６０４は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、または、Ｉ／Ｆ３０２により、その機能を実現する。
【００５９】
加工部６０５は、プログラムを、記述内容は異なるが機能は同一のプログラムコードに加工する機能を有する。具体的には、例えば、加工部６０５は、対象プログラムＴＰを、後述する「難読化」、「暗号化」、「シャッフリング」により加工する。これにより、クラッカーが対象プログラムＴＰを解読するのを困難にし、対象プログラムＴＰが解読され、改ざんされることを防止することができる。
【００６０】
加工部６０５は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、または、Ｉ／Ｆ３０２により、その機能を実現する。
【００６１】
判定部６０６は、プログラムを実行する通信装置内のプロセッサへ要求を出力した時から、プロセッサからの返答を取得する時までの経過時間を計測する。そして、判定部６０６は、通信装置内のプロセッサとセキュアモジュールとの物理的距離に対応する許容時間以上であるか否かを判定する機能を有する。
【００６２】
具体的には、例えば、判定部６０６は、セキュアモジュール１０２内にタイマーを設け、対象プログラムＴＰを実行する通信装置１０１内のプロセッサ２０１へ要求を出力した時から、タイマーの計測を開始する。そして、セキュアモジュール１０２は、返答を取得する時まで時間を計測し、計測した経過時間が予め定められた許容時間以上であるかを判定する。
【００６３】
クラッカーのコンピュータ１０４が、通信装置１０１を装って、セキュアモジュール１０２と通信をおこなう場合が考えられる。この場合、タイマーの経過時間が、通信装置１０１内のプロセッサ３０１とセキュアモジュール１０２間の物理的距離から推測される所要時間より大きく上回ると推定される。よって、判定部６０６により、経過時間を測定することで、クラッカーによる通信装置１０１のなりすましを判断できる。
【００６４】
判定部６０６は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、または、Ｉ／Ｆ３０２により、その機能を実現する。
【００６５】
取得部６０７は、プログラムが外部の装置に送信するデータを、送信に先だってプログラムから取得する機能を有する。また、取得部６０７は、暗号鍵Ｋの出力依頼をプログラムから取得する機能を有する。
【００６６】
具体的には、例えば、取得部６０７は、Ｉ／Ｆ３０２を介して、対象プログラムＴＰからセンタ１０３に送信する通信内容や暗号鍵Ｋの出力依頼を取得する。これにより、取得部６０７は、対象プログラムＴＰから暗号鍵Ｋの出力依頼を取得できる。また、これにより、取得部６０７は、暗号化対象となる通信内容を取得することができる。
【００６７】
取得部６０７は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、または、Ｉ／Ｆ３０２により、その機能を実現する。
【００６８】
暗号化部６０８は、暗号鍵Ｋを用いて取得部６０７によって取得された通信内容を暗号化する機能を有する。具体的には、例えば、暗号化部６０８は、暗号鍵Ｋを用いて通信内容を暗号化する。暗号鍵Ｋは、例えば、セキュアモジュール１０２の秘密鍵やセンタ１０３との共通鍵である。これにより、暗号化部６０８は、暗号鍵Ｋを外部に出力することなく、通信内容の暗号化をおこなうことができる。
【００６９】
暗号化部６０８は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、その機能を実現する。
【００７０】
出力部６０９は、暗号鍵Ｋをプログラムに出力する機能を有する。具体的には、例えば、出力部６０９は、取得部６０７によって、暗号鍵Ｋの出力依頼を取得した場合に、暗号鍵Ｋを対象プログラムＴＰに出力する。これにより、出力部６０９は、対象プログラムＴＰに暗号鍵Ｋを供することができる。
【００７１】
出力部６０９は、図３に示したＲＯＭ３０５、ＲＡＭ３０４、フラッシュメモリ３０６、などの記憶装置に記憶されたプログラムをプロセッサ３０１に実行させることにより、または、Ｉ／Ｆ３０２により、その機能を実現する。
【００７２】
また、セキュアモジュール１０２は、取得部６０７および出力部６０９が扱うデータを暗号化する。これにより、クラッカーによって、セキュアモジュール１０２と通信装置１０１内のプロセッサ３０１との間の通信路がクラッキングされ、データが解析されることを防止することができる。
【００７３】
（セキュアモジュール１０２による対象プログラムＴＰの正当性チェックの内容）
次に、セキュアモジュール１０２による対象プログラムＴＰの正当性チェックの内容について説明する。本実施の形態において、通信装置１０１上の対象プログラムＴＰの正当性をチェックするセキュアモジュール１０２は、ハードウェアスキャンが不可能なインターフェースで通信装置１０１に接続される場合と、ハードウェアスキャンが可能なインターフェースで通信装置１０１と接続される場合とがある。
【００７４】
まず、セキュアモジュール１０２が、ハードウェアスキャンが不可能なインターフェース（例えば、ＵＳＢインターフェース）で通信装置１０１に接続される場合を例に挙げる。この場合、セキュアモジュール１０２が普通にＵＳＢインターフェース経由でＵＳＢ対応ソフトウェア（一般にこの種のソフトを「ドライバ」という）にメモリのスキャン対象領域のスキャンを依頼することで対象プログラムＴＰの正当性をチェックできる。
【００７５】
しかし、この場合には、ＵＳＢ対応ソフトウェア自身がクラッキングされる虞がある。例えば、通信装置１０１上のソフトウェアが書き換えられても、さも書き換えられていないような結果を返すようにクラッキングされる。これにより、スキャン機能が有効に働かない可能性がある。したがって、本実施の形態では、以下のような処理を実行する。
【００７６】
（通信装置１０１での動作概要例１）
図７は、通信装置１０１での動作概要例１を示す説明図である。本実施の形態では、まず、（１）セキュアモジュール１０２は、ＨＤＤ２０４内に記憶されている暗号化された対象プログラム（以下、「暗号化対象プログラムＥ（ＴＰ）」）を取得して、セキュアモジュール１０２内の暗号化回路３０３で対象プログラムＴＰに復号する。そして、セキュアモジュール１０２は、ＲＡＭ２０３のスキャン対象領域２３０に、復号された対象プログラムＴＰを書き出す。対象プログラムＴＰはセキュアモジュール１０２内でも保持しておく。
【００７７】
なお、ＨＤＤ２０４内に記憶されているプログラムが暗号化されていない場合は、セキュアモジュール１０２では復号することなく、ＲＡＭ２０３のスキャン対象領域２３０に、取得した対象プログラムＴＰを書き出す。
【００７８】
また、セキュアモジュール１０２は、加工プログラムＰＰにより対象プログラムＴＰを加工してもよい。加工内容の詳細は後述するが、対象プログラムＴＰの働きは同じであっても処理内容や処理手順は異なるように加工する。また、この加工により、対象プログラムＴＰの一部となるプログラム片をセキュアモジュール１０２内に保持しておき、通信装置１０１での対象プログラムＴＰの実行の際に、セキュアモジュール１０２内のプログラム片を参照しないと、対象プログラムＴＰの実行を継続できないようにする。さらに、この加工により、対象プログラムＴＰ内に、後述する演算プログラムを書き込んでおく。
【００７９】
（２）セキュアモジュール１０２は、定期的にまたは不定期に、スキャンプログラムＳＰをランダムに自動生成／更新する生成プログラムＧＰを実行する。具体的には、対象プログラムＴＰをスキャンするという機能は変わらないが、処理内容が毎回異なるスキャンプログラムＳＰをランダム自動生成する。
【００８０】
この自動生成は、例えば、数［ｍｓｅｃ］〜数分間隔で定期的に実行してもよく、ランダムな間隔で不定期に実行してもよい。いずれにしても、クラッカーが改ざんに要する時間よりも短い間隔となるよう設定しておけばよい。
【００８１】
生成プログラムＧＰによりランダムに変化させるのは、例えば、スキャン対象領域２３０、スキャン対象アドレスの順序、スキャン結果演算、演算したスキャン結果をセキュアモジュール１０２に戻す演算処理、スキャンプログラムＳＰコード、通信装置１０１のメモリ上の位置などが挙げられる。この生成プログラムＧＰによるスキャンプログラムＳＰのランダム自動生成／更新処理は、セキュアモジュール１０２内で実行されるため、生成過程を覗き見されたり、解析されたり、その結果無効化されることはない。
【００８２】
なお、生成プログラムＧＰによりスキャンプログラムＳＰが生成／更新された場合、セキュアモジュール１０２でも対象プログラムＴＰを最新のスキャンプログラムＳＰでスキャンし、スキャン結果Ｒ１を更新しておく。スキャン結果Ｒ１はＲＡＭ３０４またはフラッシュメモリ３０６に記憶しておく。スキャン結果Ｒ１は、対象プログラムＴＰに固有のコードである。
【００８３】
（３）スキャンプログラムＳＰは、プロセッサ２０１に、ドライバ２３１にＲＡＭ２０３上の非スキャン対象領域への配置を依頼させる。これにより、ドライバ２３１は、プロセッサ２０１に、セキュアモジュール１０２から送られてきたスキャンプログラムＳＰをＲＡＭ２０３の非スキャン対象領域に格納させる。
【００８４】
（４）ＲＡＭ２０３に格納されたスキャンプログラムＳＰは、プロセッサ２０１に、スキャン対象領域２３０内の対象プログラムＴＰをスキャンさせる。スキャン結果Ｒ２は、ドライバ２３１を介してセキュアモジュール１０２に通知される。
【００８５】
（５）セキュアモジュール１０２はドライバ２３１から送られてくるスキャン結果Ｒ２を受け取る。スキャン結果Ｒ２を受け取ると、認証プログラムＡＰは、プロセッサ２０１に、セキュアモジュール１０２で保持しておいたスキャン結果Ｒ１と送られてきたスキャン結果Ｒ２を比較して一致判定を実行させる。
【００８６】
一致していれば、対象プログラムＴＰが改ざんされていないこととなる。一方、対象プログラムＴＰが書き換えられていれば、セキュアモジュール１０２は、例えば、対象プログラムＴＰの実行停止指示をプロセッサ２０１に通知する。これにより、プロセッサ２０１は当該通知を受けると対象プログラムＴＰの実行を停止する。
【００８７】
また、一定期間が経過してもドライバ２３１からスキャン結果Ｒ２を受け取れなかった場合も、対象プログラムＴＰの実行停止指示をプロセッサ２０１に通知する。
【００８８】
セキュアモジュール１０２は、対象プログラムＴＰの動作が停止するまでは、上記（２）〜（５）を繰り返す。
【００８９】
このように、定期的または不定期にセキュアモジュール１０２によってランダムに生成／更新されたスキャンプログラムＳＰが動作するため、たとえスキャンプログラムＳＰが誰もが覗き見や書き換えが可能な通信装置１０１のメモリ空間に存在してもクラッカーにクラックされることはない。
【００９０】
すなわち、クラッカーがスキャンプログラムＳＰを覗き見し、解析し、偽スキャンプログラムに書き換えるには、一定の時間が必要である。しかし、セキュアモジュール１０２が不定期あるいは定期的にスキャンプログラムをランダムに毎回違う形にするため、クラッカーは、解析し、偽スキャンプログラムに書き換える時間が得られない。
【００９１】
（通信装置１０１での動作概要例２）
次に、セキュアモジュール１０２が、ハードウェアスキャンが可能なインターフェース（例えば、ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ））で通信装置１０１と接続される場合を例に挙げる。
【００９２】
図８は、通信装置１０１での動作概要例２を示す説明図である。まず、（１）セキュアモジュール１０２は、ＨＤＤ２０４内に記憶されている暗号化対象プログラムＥ（ＴＰ）を取得して、セキュアモジュール１０２内の暗号化回路３０３で対象プログラムＴＰに復号する。そして、セキュアモジュール１０２は、ＲＡＭ２０３のスキャン対象領域２３０に、復号された対象プログラムＴＰを書き出す。対象プログラムＴＰはセキュアモジュール１０２内でも保持しておく。
【００９３】
（２）セキュアモジュール１０２は、定期的にまたは不定期に、スキャンプログラムＳＰをランダムに自動生成／更新する生成プログラムＧＰを実行する。具体的には、対象プログラムＴＰをスキャンするという機能は変わらないが、処理内容が毎回異なるスキャンプログラムＳＰをランダム自動生成する。
【００９４】
この自動生成は、例えば、数［ｍｓｅｃ］〜数分間隔で定期的に実行してもよく、ランダムな間隔で不定期に実行してもよい。いずれにしても、クラッカーが改ざんに要する時間よりも短い間隔となるよう設定しておけばよい。
【００９５】
生成プログラムＧＰによりランダムに変化させるのは、例えば、スキャン対象領域２３０、スキャン対象アドレスの順序、スキャン結果演算、演算したスキャン結果をセキュアモジュール１０２に戻す演算処理、スキャンプログラムＳＰコード、通信装置１０１のメモリ上の位置などが挙げられる。この生成プログラムＧＰによるスキャンプログラムＳＰのランダム自動生成／更新処理は、セキュアモジュール１０２内で実行されるため、生成過程を覗き見されたり、解析されたり、その結果無効化されることはない。
【００９６】
なお、生成プログラムＧＰによりスキャンプログラムＳＰが生成／更新された場合、セキュアモジュール１０２でも対象プログラムＴＰを最新のスキャンプログラムＳＰでスキャンし、スキャン結果Ｒ１を更新しておく。スキャン結果Ｒ１はＲＡＭ３０４またはフラッシュメモリ３０６に記憶しておく。スキャン結果Ｒ１は、対象プログラムＴＰに固有のコードである。
【００９７】
（３）セキュアモジュール１０２内のスキャンプログラムＳＰは、スキャン対象領域２３０内にＤＭＡを用いて直接アクセスし、対象プログラムＴＰをスキャンする。スキャン結果Ｒ２は、セキュアモジュール１０２に保持される。
【００９８】
（４）そして、認証プログラムＡＰが、セキュアモジュール１０２で保持しておいたスキャン結果Ｒ１とスキャン結果Ｒ２を比較して一致判定をおこなう。
【００９９】
一致していれば、対象プログラムＴＰが改ざんされていないこととなる。一方、対象プログラムＴＰが書き換えられていれば、セキュアモジュール１０２は、例えば、対象プログラムＴＰの実行停止指示をプロセッサ２０１に通知する。これにより、プロセッサ２０１は当該通知を受けると対象プログラムＴＰの実行を停止する。
【０１００】
セキュアモジュール１０２は、対象プログラムＴＰの動作が停止するまでは、上記（２）〜（４）を繰り返す。
【０１０１】
スキャンプログラムＳＰは、通信装置１０１のプロセッサ２０１やドライバを一切経由しないのでドライバのクラッキングによる改ざんや覗き見に対しても安全性が強い。
【０１０２】
（スキャンプログラムＳＰの具体例）
図９〜図１２は、スキャンプログラムＳＰの具体例を示す説明図である。なお、図９〜図１２では、わかりやすさを考慮して単純なスキャンプログラムＳＰを例示している。なお、図９〜図１２において、「○○番地」と記述されている番地は、スキャン対象領域２３０に対応する論理アドレスである。
【０１０３】
図９は、対象プログラムＴＰのスキャンを実行するスキャンプログラムＳＰを示している。例えば、１１番地に「１」、１２番地に「２」、１３番地に「３」、１４番地に「４」、１５番地に「５」が記憶されているとする。アドレス１〜５のステップでは、１１番地〜１５番地の内容をそれぞれ１００１番地〜１００５番地に書き出す。そして、アドレス６のステップですべて加算して、アドレス７のステップで加算結果「１５」を１０１０番地に書き込む。
【０１０４】
アドレス８のステップで１０１０番地の内容「１５」に「＋８０」して、さらに「＊５」するため、（１５＋８０）×５＝４７５を得る。アドレス９のステップで、アドレス８の計算結果「４７５」を１０１１番地に書き込み、アドレス１０のステップで１０１１番地の内容「４７５」をセキュアモジュール１０２に通知する。
【０１０５】
セキュアモジュール１０２でも、事前のスキャンによりスキャン結果を保持している。そして、事前のスキャン結果とスキャン対象領域２３０内の対象プログラムＴＰのスキャン結果とが一致すれば、対象プログラムＴＰは改ざんされていないこととなる。一方、不一致であれば、対象プログラムＴＰは改ざんされていることとなり、対象プログラムＴＰの実行を停止する。
【０１０６】
図１０は、図９に示したスキャンプログラムＳＰにおいて、アドレス１〜５の読込先となるスキャン対象アドレスを、１１番地〜１５番地から２１番地〜２５番地に変更した例を示している。図１０では、２１番地〜２５番地の値を読み込むため、セキュアモジュール１０２に通知するスキャン結果が図９の場合と異なることとなる。
【０１０７】
図１１は、図９に示したスキャンプログラムＳＰにおいて、スキャン対象アドレスの順序変更および順序変更に依存した演算に変更した例を示している。具体的には、スキャンプログラムＳＰは、アドレス１〜５でのスキャン対象アドレスの順序が変更されている。この順序変更だけでは、スキャン結果は図９と変わらないため、アドレス６のステップの演算もランダムに書き換えている。これにより、セキュアモジュール１０２に通知されるスキャン結果は図９のスキャン結果と異なる値となる。
【０１０８】
図１２は、図１１に示したスキャンプログラムＳＰにおいて、スキャンプログラムＳＰが特定の記憶領域に保持されていないと、スキャンが実行されない例を示している。この場合、セキュアモジュール１０２でも、スキャンプログラムＳＰが保持されるアドレスが特定済みである。
【０１０９】
具体的には、アドレス１〜５のステップにおいて、読込先のスキャン対象アドレスの値に、スキャンプログラムＳＰが保持されているアドレス（たとえば、先頭の番地）を加算することとしている。この場合、セキュアモジュール１０２に保持されている図１２のスキャンプログラムＳＰのスキャン結果Ｒ１と、スキャン対象領域２３０内の対象プログラムＴＰのスキャン結果Ｒ２が一致すれば、対象プログラムＴＰが改ざんされておらず、かつ、スキャンプログラムＳＰが特定の位置に配置されていることが確認できる。
【０１１０】
逆に、不一致の場合は、スキャンプログラムＳＰが意図的に他の位置に保持されている可能性があるため、そのような場合はスキャン結果の不一致により、対象プログラムＴＰが停止する。
【０１１１】
このように、スキャンプログラムＳＰの存在するメモリ番地が違えば、スキャン結果が変わってしまうこととなり、スキャンプログラムＳＰを想定と違うメモリ番地に書き込んで動作解析するようなクラッキングが困難になる。
【０１１２】
（スキャンプログラム生成／更新処理）
図１３は、スキャンプログラム生成／更新処理の手順を示すフローチャートである。スキャンプログラム生成／更新処理は、セキュアモジュール１０２のプロセッサ３０１が生成プログラムＧＰを実行する時の処理である。
【０１１３】
まず、セキュアモジュール１０２は、所定時間経過するまで待ち受ける（ステップＳ１３０１：Ｎｏ）。例えば、すでに、対象プログラムＴＰがＲＡＭ２０３のスキャン対象領域２３０に書き込まれて実行開始したのをトリガにして、所定時間の計時を開始する。所定時間は、上述したように、数［ｍｓｅｃ］〜数分間隔とする。なお、数［ｍｓｅｃ］〜数分間隔の範囲内でランダムに設定してもよい。
【０１１４】
所定時間が経過した場合（ステップＳ１３０１：Ｙｅｓ）、セキュアモジュール１０２は、すでにスキャンプログラムＳＰが生成済みであるか否かを判断する（ステップＳ１３０２）。生成済みでない場合（ステップＳ１３０２：Ｎｏ）、セキュアモジュール１０２は、スキャンプログラム生成処理（図１４〜図１５）を実行し（ステップＳ１３０３）、生成されたスキャンプログラムＳＰをＲＡＭ２０３の非スキャン対象領域に書き込む（ステップＳ１３０４）。
【０１１５】
このあと、セキュアモジュール１０２は、生成されたスキャンプログラムＳＰで対象プログラムＴＰをスキャンし、スキャン結果をセキュアモジュール１０２内（例えば、ＲＡＭ３０４やフラッシュメモリ３０６）に保持しておく（ステップＳ１３０５）。そして、ステップＳ１３０１に戻る。
【０１１６】
また、ステップＳ１３０２において、スキャンプログラムＳＰが生成済みである場合（ステップＳ１３０２：Ｙｅｓ）、セキュアモジュール１０２は、スキャンプログラムＳＰを新規生成するか生成済みのスキャンプログラムＳＰを更新するかを決定する（ステップＳ１３０６）。そして、新規生成である場合（ステップＳ１３０７：新規生成）、ステップＳ１３０３に移行する。一方、更新である場合（ステップＳ１３０７：更新）、スキャンプログラム更新処理（図１６〜図１７）を実行し（ステップＳ１３０８）、更新されたスキャンプログラムＳＰをＲＡＭ２０３の非スキャン対象領域に書き込む（ステップＳ１３０４）。
【０１１７】
このあと、セキュアモジュール１０２は、更新されたスキャンプログラムＳＰで対象プログラムＴＰをスキャンし、スキャン結果をセキュアモジュール１０２内（例えば、ＲＡＭ３０４やフラッシュメモリ３０６）に保持しておく（ステップＳ１３０５）。そして、ステップＳ１３０１に戻る。
【０１１８】
なお、起動の契機となった対象プログラムＴＰが終了等により、スキャン対象領域２３０から消去されると、セキュアモジュール１０２は、スキャンプログラム生成／更新処理を終了する。
【０１１９】
（スキャンプログラム生成処理）
図１４は、図１３に示したスキャンプログラム生成処理（ステップＳ１３０３）の詳細な処理手順例を示すフローチャート（その１）である。まず、セキュアモジュール１０２は、セキュアモジュール１０２外のＲＡＭ２０３のスキャン対象領域２３０［Ａｓ，Ａｅ］および書込先領域［Ｂｓ，Ｂｅ］を設定する（ステップＳ１４０１）。なお、ここで設定するスキャン対象領域２３０［Ａｓ，Ａｅ］は、対象プログラムＴＰと同じサイズでもよく、対象プログラムＴＰの一部と同じサイズでもよい。
【０１２０】
また、スキャン対象領域２３０［Ａｓ，Ａｅ］が対象プログラムＴＰの一部と同じサイズとする場合、スキャンプログラム生成処理を実行する都度、スキャン対象領域２３０［Ａｓ，Ａｅ］を異なる範囲とする。例えば、スキャンプログラム生成処理を実行する都度、スキャン対象領域２３０［Ａｓ，Ａｅ］をシフトしていく。
【０１２１】
セキュアモジュール１０２は、スキャン対象領域２３０よりも大きいメモリ領域［Ｍｓ，Ｍｅ］（以下、「モジュール内設定領域」という）をセキュアモジュール１０２内のＲＡＭ３０４（またはフラッシュメモリ３０６）に設定する（ステップＳ１４０２）。また、セキュアモジュール１０２は、各種変数の初期値を設定する（ステップＳ１４０３）。ｉは初期値を１とする変数である。Ａｉは、スキャン対象領域２３０の任意のアドレスを示し、初期値は、先頭アドレスＡｓとする。Ｂｉは、書込先領域の任意のアドレスを示し、初期値は、先頭アドレスＢｓとする。
【０１２２】
Ｍｉは、モジュール内設定領域内の任意のアドレスを示し、初期値は、先頭アドレスＭｓとする。Ｙｉは、生成されるスキャンプログラムＳＰ内で用いられるアドレスであり、初期値は、Ｂｉとする。このあと、セキュアモジュール１０２は、「Ａｉ番地の内容を読み込んで、Ｂｉ番地に書き込む」というスキャン命令を、モジュール内設定領域のＭｉ番地に書き込む（ステップＳ１４０４）。
【０１２３】
そして、セキュアモジュール１０２は、Ａｉ＞Ａｅであるか否かを判断する（ステップＳ１４０５）。Ａｅは、スキャン対象領域２３０の末尾アドレスである。Ａｉ＞Ａｅでない場合（ステップＳ１４０５：Ｎｏ）、セキュアモジュール１０２は、ｉをインクリメントして（ステップＳ１４０６）、ステップＳ１４０４に戻る。一方、Ａｉ＞Ａｅである場合（ステップＳ１４０５：Ｙｅｓ）、図１５のステップＳ１５０１に移行する。
【０１２４】
図１５は、図１３に示したスキャンプログラム生成処理（ステップＳ１３０３）の詳細な処理手順例を示すフローチャート（その２）である。図１４のステップＳ１４０５：Ｙｅｓの後、セキュアモジュール１０２は、モジュール内設定領域の番地Ｍｉをインクリメントして（ステップＳ１５０１）、Ｍｉ＞Ｍｅ−２であるか否かを判断する（ステップＳ１５０２）。
【０１２５】
Ｍｉ＞Ｍｅ−２でない場合（ステップＳ１５０２：Ｎｏ）、セキュアモジュール１０２は、変数ｊの初期値をｊ＝１とし（ステップＳ１５０３）、演算方法Ｚｊをランダムに決定する（ステップＳ１５０４）。演算方法とは、四則演算や論理演算、チェックサムの算出やハッシュ関数によるハッシュ値算出などが挙げられる。以降、演算方法Ｚｊでの演算を「Ｚｊ演算」と称す。
【０１２６】
そして、セキュアモジュール１０２は、ｊをインクリメントし（ステップＳ１５０５）、ｊ＝ｙであるか否かを判断する（ステップＳ１５０６）。ここで、ｙはＹｉの個数である。すなわち、モジュール内設定領域のＭｉ番地の個数である。
【０１２７】
ｊ＝ｙでない場合（ステップＳ１５０６：Ｎｏ）、ステップＳ１５０４に戻る。一方、ｊ＝ｙとなった場合（ステップＳ１５０６：Ｙｅｓ）、セキュアモジュール１０２は、「Ｙ１番地の内容とＹ２番地の内容をＺ１演算する。そして、セキュアモジュール１０２は、Ｚ１演算結果とＹ３番地の内容とをＺ２演算し、…、Ｚ（ｙ−２）演算結果とＹｙ番地の内容とをＺ（ｙ−１）演算する」というスキャン命令Ｚ（Ｍｉ）を、Ｍｉ番地に書き込む（ステップＳ１５０７）。
【０１２８】
このあと、セキュアモジュール１０２は、Ｍｉをインクリメントし（ステップＳ１５０８）、「スキャン命令Ｚ（Ｍｉ―１）の計算結果を、（Ｂｉ＋１）番地に書き込む」というスキャン命令をＭｉ番地に書き込む（ステップＳ１５０９）。そして、ステップＳ１５０１に戻る。
【０１２９】
ステップＳ１５０２において、Ｍｉ＞Ｍｅ−２である場合（ステップＳ１５０２：Ｙｅｓ）、セキュアモジュール１０２は、「（Ｂｉ＋１）番地の内容をセキュアモジュール１０２に通知する」というスキャン命令をＭｉ番地に書き込む（ステップＳ１５１０）。そして、ステップＳ１３０４に移行する。このスキャンプログラム生成処理（ステップＳ１３０３）によれば、定期的（または不定期に）スキャンプログラムＳＰをランダムに生成することができる。
【０１３０】
（スキャンプログラム更新処理）
図１６は、スキャンプログラム更新処理（ステップＳ１３０８）の詳細な処理手順例を示すフローチャート（その１）である。まず、セキュアモジュール１０２は、更新内容をランダムに決定する（ステップＳ１６０１）。ここで、更新内容とは、例えば、「難読化」、「スキャン対象領域変更」、「スキャン対象アドレスの順序変更」、「スキャン結果演算の追加」、「スキャンプログラムＳＰのアドレス追加」、「何もしない」、などが挙げられる。
【０１３１】
「難読化」、「スキャン対象領域変更」、「スキャン対象アドレスの順序変更」の順序変更については、図１６で説明する。一方、「スキャン結果演算の追加」、「スキャンプログラムＳＰのアドレス追加」、「何もしない」については、図１７で説明する。なお、スキャンプログラム更新処理としては、これら６つの更新内容のうち、少なくとも１つ（「何もしない」を除く）でもあればよい。
【０１３２】
図１６に戻って、セキュアモジュール１０２は、ランダムに決定された更新内容が、「難読化」であるか否かを判断する（ステップＳ１６０２）。難読化とは、対象となる命令または命令群を複雑にすることで、解読を難しくする方法である。具体的には、本当に「働きは、同じだが、処理内容が違うプログラムコード」に置き換えることである。例えば、単一の命令の場合、「Ｘ＝１＋Ｙ」という命令を「Ｘ＝１０−９＋２Ｙ−Ｙ」という命令に更新する。また、「Ｘ＝１＋Ｙ」、「Ｚ＝Ｘ＋５０」を「Ｘ＝２６＋Ｙ」、「Ｚ＝Ｘ＋２５」という命令群に更新する。
【０１３３】
更新後の命令は、更新前と同じ働きをするが、別のプログラムコードである。こうすると生成プログラムＧＰは、更新前後において、「働きは同じだが、プログラムコードが違う」ものになる。クラッカーが、生成プログラムＧＰのコードを「覗き見」したとしても、生成プログラムＧＰのプログラムコードが更新の都度違うのでそれだけ解析が困難である。また、生成プログラムＧＰのどの部分に肝心のコードがあるかわからなくなるという利点がある。
【０１３４】
「難読化」である場合（ステップＳ１６０２：Ｙｅｓ）、セキュアモジュール１０２は、難読化の対象範囲を対象プログラムＴＰの中から指定し（ステップＳ１６０３）、指定された対象範囲の命令（難読化可能な命令に限る）の難読化を実行する（ステップＳ１６０４）。そして、ステップＳ１６０１に戻る。
【０１３５】
一方、ステップＳ１６０２において、ランダムに決定された更新内容が、「難読化」でない場合（ステップＳ１６０２：Ｎｏ）、セキュアモジュール１０２は、ランダムに決定された更新内容が、「スキャン対象領域変更」か否かを判断する（ステップＳ１６０５）。
【０１３６】
「スキャン対象領域変更」とは、スキャンプログラムＳＰにおいて指定されるスキャン対象アドレスを、スキャン対象領域２３０内の異なるアドレスに変更することである。例えば、図９に示したスキャンプログラムＳＰから図１０に示したスキャンプログラムＳＰへ更新する際に、スキャン対象領域変更が実行されることとなる。
【０１３７】
「スキャン対象領域変更」である場合（ステップＳ１６０５：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰからスキャン対象領域２３０の変更の対象範囲を指定し（ステップＳ１６０６）、指定された対象範囲のアドレスどうしを変更する（ステップＳ１６０７）。そして、ステップＳ１６０１に戻る。
【０１３８】
スキャン対象領域変更をおこなっても、生成プログラムＧＰがアクセスするアドレスが変わるだけで、スキャンプログラムＳＰの働きは同じである。また、スキャン対象領域２３０が変更されることで、スキャン結果も更新されるため、セキュリティ強度が向上することとなる。
【０１３９】
また、ステップＳ１６０５において、ランダムに決定された更新内容が、「スキャン対象領域変更」でない場合（ステップＳ１６０５：Ｎｏ）、セキュアモジュール１０２は、ランダムに決定された更新内容が、「スキャン対象アドレスの順序変更」か否かを判断する（ステップＳ１６０８）。スキャン対象アドレスの順序変更とは、スキャンプログラムＳＰのあるアドレスのコードとあるアドレスのコードを入れ替えることである。
【０１４０】
例えば、図９に示したスキャンプログラムＳＰから図１１に示したスキャンプログラムＳＰへ更新する際に、スキャン対象アドレスの順序変更が実行されている。なお、スキャン対象アドレスの順序変更により実行順序が入れ替わることとなるが、入れ替え前後において、スキャン結果が変わる場合と変わらない場合とがある。
【０１４１】
「スキャン対象アドレスの順序変更」である場合（ステップＳ１６０８：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰから順序変更の対象範囲を指定し（ステップＳ１６０９）、指定された対象範囲のアドレスのコードどうしを変更する（ステップＳ１６１０）。そして、ステップＳ１６０１に戻る。一方、ステップＳ１６０８において、スキャン対象アドレスの順序変更でない場合（ステップＳ１６０８：Ｎｏ）、図１７のステップＳ１７０１に移行する。
【０１４２】
図１７は、スキャンプログラム更新処理（ステップＳ１３０８）の詳細な処理手順例を示すフローチャート（その２）である。ステップＳ１７０１において、セキュアモジュール１０２は、ステップＳ１６０１においてランダムに決定された更新内容が、「スキャン結果演算」であるか否かを判断する（ステップＳ１７０１）。
【０１４３】
「スキャン結果演算の追加」である場合（ステップＳ１７０１：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰから演算対象アドレスを指定し（ステップＳ１７０２）、演算方法をランダムに決定する（ステップＳ１７０３）。ここで、演算方法とは、ある演算対象アドレスのデータとある演算対象アドレスのデータとについて、四則演算や論理演算をおこなったり、データごとにチェックサムの算出やハッシュ関数によるハッシュ値算出をおこなったりする。
【０１４４】
そして、セキュアモジュール１０２は、「演算対象アドレス内のデータを用いて、ステップＳ１７０３で決定された演算方法で演算する」スキャン命令を、更新元の生成プログラムＧＰに追加する（ステップＳ１７０４）。また、セキュアモジュール１０２は、「追加されたスキャン命令による演算結果をセキュアモジュール１０２に通知する」スキャン命令を、更新元の生成プログラムＧＰに追加する（ステップＳ１７０５）。このあと、ステップＳ１６０１に戻る。
【０１４５】
また、ステップＳ１６０１においてランダムに決定された更新内容が、「スキャン結果演算の追加」でない場合（ステップＳ１７０１：Ｎｏ）、セキュアモジュール１０２は、ランダムに決定された更新内容が、「スキャンプログラムＳＰのアドレス追加」であるか否かを判断する（ステップＳ１７０６）。スキャンプログラムＳＰのアドレス追加とは、スキャンプログラムＳＰのあるアドレスの命令に、スキャンプログラムＳＰの書込先アドレスを与えて、この書込先アドレスに依存したスキャン結果を得る手法である。
【０１４６】
例えば、図１１に示したスキャンプログラムＳＰから図１２に示したスキャンプログラムＳＰへ更新する際に、スキャンプログラムＳＰのアドレス追加が実行されている。
【０１４７】
セキュアモジュール１０２は、ステップＳ１７０６において、「スキャンプログラムＳＰのアドレス追加」と判断された場合（ステップＳ１７０６：Ｙｅｓ）、追加対象アドレスを対象プログラムＴＰから指定する（ステップＳ１７０７）。そして、図１２のアドレス１〜５に示したように、追加対象アドレス内のデータに、スキャンプログラムＳＰのアドレスの値を追加して、書き換える（ステップＳ１７０８）。このあと、ステップＳ１６０１に戻る。
【０１４８】
また、ステップＳ１７０６で「スキャンプログラムＳＰのアドレス追加」でもないと判断された場合（ステップＳ１７０６：Ｎｏ）、セキュアモジュール１０２は、生成プログラムＧＰの更新を終了するか否かを判断する（ステップＳ１７０９）。具体的には、例えば、このケースでは、「何もしない」にランダム決定されているため、一度も更新していない場合は、更新を終了しない（ステップＳ１７０９：Ｎｏ）。この場合は、ステップＳ１６０１に戻る。
【０１４９】
少なくとも１度、または、予め設定しておいた所定回数更新が行われた場合、ランダムに更新を終了する（ステップＳ１７０９：Ｙｅｓ）。この場合、図１３のステップＳ１３０４に戻る。
【０１５０】
この更新は、耐タンパ性構造のセキュアモジュール１０２内で実行されるため、スキャンプログラムＳＰの生成／更新を毎回セキュアにおこなうことができる。したがって、クラッキングによりスキャン機能を無効化しづらい状態となり、ＵＳＢ接続においてもセキュリティ強度を高めることができる。
【０１５１】
（対象プログラムＴＰの加工）
次に、対象プログラムＴＰの加工について説明する。図７で説明したように、セキュアモジュール１０２内のプロセッサ３０１が加工プログラムＰＰを実行することで対象プログラムＴＰが加工される。ここで、対象プログラムＴＰの加工について具体的に説明する。
【０１５２】
図１８は、対象プログラムＴＰの加工の概要を示す説明図である。プログラムは、アドレス単位の命令の集合体である。ここでは、わかりやすさを考慮して、対象プログラムＴＰが５つのアドレス単位の命令で成り立っているものとする。具体的には、分割プログラムＰ１〜Ｐ５で構成されており、アドレスａｄｒ１〜ａｄｒ５の順に分割プログラムＰ１〜Ｐ５が実行されるものとする。したがって、ＨＤＤ２０４では、論理アドレスとして、実行順序となるアドレスａｄｒ１〜ａｄｒ５の並びで記憶されている。
【０１５３】
対象プログラムＴＰ（分割プログラムＰ１〜Ｐ５）は、加工プログラムＰＰにより配置順、すなわち、アドレスを入れ替えられる。図１８では、アドレスａｄｒ１が分割プログラムＰ１、アドレスａｄｒ２が分割プログラムＰ４、アドレスａｄｒ３が分割プログラムＰ２、アドレスａｄｒ４が分割プログラムＰ３、アドレスａｄｒ５が分割プログラムＰ５に加工されている。
【０１５４】
この場合、分割プログラムＰ１，Ｐ４，Ｐ３の後続に、セキュアモジュール１０２へのＲｅａｄ命令を追記しておく。セキュアモジュール１０２内には、アドレス変更後の対応関係を示すプログラム片を保持しておく。例えば、プログラム片ｐａは、分割プログラムＰ１の実行後に参照されるＧｏｔｏ文であり、アドレスａｄｒ３にジャンプするものとする。
【０１５５】
また、プログラム片ｐｂは、分割プログラムＰ３の実行後に参照されるＧｏｔｏ文であり、アドレスａｄｒ２にジャンプするものとする。プログラム片ｐｃは、分割プログラムＰ４の実行後に参照されるＧｏｔｏ文であり、アドレスａｄｒ５にジャンプするものとする。プログラム片ｐａ〜ｐｃは加工の際に生成される。なお、加工前後では、スキャン結果Ｒ１は変わりない。
【０１５６】
図１９〜図２２は、加工プログラムＰＰによる対象プログラムＴＰの加工例を示す説明図である。まず、図１９では、ＨＤＤ２０４内の対象プログラムＴＰのアドレス３〜５の命令群を、アドレス７〜９に移動させている。また、対象プログラムＴＰのアドレス６，７の命令群を、アドレス１５，１６に移動させている。アドレス１，２の命令群はそのままである。
【０１５７】
加工前では、アドレス２の命令「Ｙ＝Ｘ＋８」の次は、アドレス３の命令「Ｚ＝Ｘ＋Ｙ」が実行される。アドレス３の命令「Ｚ＝Ｘ＋Ｙ」は、アドレス７に移動したため、アドレス３の内容を、「Ｇｏｔｏ７」というプログラム片（ジャンプ命令）に書き換える。そして、セキュアモジュール１０２は、テーブルにアドレス３とプログラム片「Ｇｏｔｏ７」との組み合わせを保持する。
【０１５８】
同様に、加工前では、アドレス５の命令「Ｚ＝Ｚ＋１」の次は、アドレス６の命令「Ｚ＝５＋Ｚ」が実行される。アドレス５の命令「Ｚ＝Ｚ＋１」はアドレス９に移動し、アドレス６の命令は、アドレス１５に移動したため、アドレス９の次であるアドレス１０の内容を、「Ｇｏｔｏ１５」というプログラム片（ジャンプ命令）に書き換える。そして、セキュアモジュール１０２は、テーブルにアドレス１０とプログラム片「Ｇｏｔｏ１５」との組み合わせを保持する。
【０１５９】
そして、セキュアモジュール１０２は、対象プログラムＴＰをスキャン対象領域２３０に書き出す前に、プログラム片をセキュアモジュール１０２へのＲｅａｄ命令に書き換える。これにより、スキャン対象領域２３０に実装された加工後の対象プログラムＴＰが実行される場合、アドレス３のＲＥＡＤ命令により、セキュアモジュール１０２内のテーブルを参照して、アドレス３に対応するプログラム片「Ｇｏｔｏ７」を特定する。セキュアモジュール１０２は、プロセッサ２０１に対し、「Ｇｏｔｏ７」を通知することで、プロセッサ２０１は加工後の対象プログラムＴＰのアドレス７の命令を実行することとなる。
【０１６０】
このように、対象プログラムＴＰを構成する命令群を、対応関係を保持しておきながらシャッフリングする。したがって、対象プログラムＴＰも解読しにくい状態とすることで、セキュリティの向上を図ることができる。
【０１６１】
図２０は、図１９よりも加工を複雑化した例である。具体的には、図１９では、プログラム片を単なるジャンプ命令としたが、図２０では、単なるジャンプ命令ではなく、プログラム片に対象プログラムＴＰを構成する命令も挿入している。
【０１６２】
まず、図２０では、ＨＤＤ２０４内の対象プログラムＴＰのアドレス４，５の命令群を、アドレス８，９に移動させている。また、対象プログラムＴＰのアドレス６，７の命令群を、アドレス１５，１６に移動させている。アドレス１〜３の命令群はそのままである。
【０１６３】
加工前では、アドレス２の命令「Ｙ＝Ｘ＋８」の次は、アドレス３の命令「Ｚ＝Ｘ＋Ｙ」が実行される。アドレス３の次であるアドレス４の命令は、アドレス８に移動したため、Ｇｏｔｏ文「Ｇｏｔｏ８」を生成する。そして、セキュアモジュール１０２は、アドレス３と、アドレス３の命令「Ｚ＝Ｘ＋Ｙ」および生成されたＧｏｔｏ文「Ｇｏｔｏ８」との組み合わせを保持する。このように、プログラム片を単なるジャンプ命令ではなく、複雑化することで、セキュリティの向上を図ることができる。
【０１６４】
図２１は、対象プログラムＴＰを構成する命令群を暗号化する例である。図２１では、セキュアモジュール１０２は、対象プログラムＴＰ（加工前）のアドレス４〜７の命令群を暗号鍵Ｋ１〜Ｋ４で暗号化する。次に、暗号化された命令の前に、セキュアモジュール１０２へのＲＥＡＤ命令と復号命令を挿入する。これにより、挿入された命令分だけ、アドレスが繰り下がる。
【０１６５】
例えば、アドレス４の命令「Ｙ＝Ｙ＋１」を暗号鍵Ｋ１で暗号化して、アドレス６に書き込む。そして、空いているアドレス４にセキュアモジュールへのＲＥＡＤ命令を挿入し、アドレス５に復号命令を挿入する。
【０１６６】
このあと、セキュアモジュール１０２では、対象プログラムＴＰ（加工後）における暗号化命令を暗号化した鍵とその暗号化命令のために挿入されたＲＥＡＤ命令のアドレスとの組み合わせをテーブルに保持する。例えば、アドレス６に書き込まれた暗号化命令Ｅ１（Ｙ＝Ｙ＋１）を暗号化した暗号鍵Ｋ１と、暗号化命令Ｅ１（Ｙ＝Ｙ＋１）の生成により挿入されたＲＥＡＤ命令のアドレス４との組み合わせをテーブルに保持する。
【０１６７】
このあと、セキュアモジュール１０２は、テーブルをＲＡＭ３０４またはフラッシュメモリ３０６に保持しておき、加工した対象プログラムＴＰをスキャン対象領域に書き込む。対象プログラムＴＰ（加工後）を実行する時は、挿入されたＲＥＡＤ命令により暗号鍵を読み出して、次の復号命令で、暗号化命令を復号する。これにより、復号された命令を実行することが可能となる。例えば、アドレス４のＲＥＡＤ命令があると、セキュアモジュール１０２は、テーブルを参照して暗号鍵Ｋ１をプロセッサ２０１に渡す。
【０１６８】
プロセッサ２０１は、暗号鍵Ｋ１とアドレス５の復号命令により、暗号化命令Ｅ１（Ｙ＝Ｙ＋１）を復号して、アドレス６に命令「Ｙ＝Ｙ＋１」を書き込む。そして、アドレス６で、命令「Ｙ＝Ｙ＋１」を実行することとなる。こうすることで、スキャン対象プログラムが一部暗号化されていても、復号鍵をセキュアモジュールから取得することで処理の続行が可能になる。
【０１６９】
図２２は、対象プログラムＴＰを構成する命令群を暗号化する例である。図２２では、セキュアモジュール１０２は、対象プログラムＴＰ（加工前）のアドレス４〜７の命令群をセキュアモジュール１０２へのＲＥＡＤ命令に置換する。例えば、アドレス４の命令「Ｙ＝Ｙ＋１」をＲＥＡＤ命令に置換する。そして、次のアドレス５に、「アドレス４でセキュアモジュール１０２から読み出した命令「Ｙ＝Ｙ＋１」を書き込む」命令を挿入する。
【０１７０】
このあと、セキュアモジュール１０２は、置換対象の命令とそのアドレスとの組み合わせをテーブルに保持する。例えば、セキュアモジュール１０２は、置換対象となったアドレス４とその命令「Ｙ＝Ｙ＋１」の組み合わせをテーブルに保持する。
【０１７１】
このあと、セキュアモジュール１０２は、テーブルをＲＡＭ３０４またはフラッシュメモリ３０６に保持しておき、加工した対象プログラムＴＰをスキャン対象領域２３０に書き込む。対象プログラムＴＰ（加工後）を実行する時は、プロセッサ２０１は、置換されたＲＥＡＤ命令により置換元の命令を読み出して実行する。例えば、プロセッサ２０１は、アドレス４のＲＥＡＤ命令でセキュアモジュール１０２から命令「Ｙ＝Ｙ＋１」を読み出して実行することとなる。
【０１７２】
（対象プログラムＴＰ加工処理）
図２３は、対象プログラムＴＰ加工処理の処理手順例を示すフローチャートである。まず、セキュアモジュール１０２が、暗号化対象プログラムＥ（ＴＰ）をＨＤＤ２０４から読み出し（ステップＳ２３０１）、暗号化対象プログラムＥ（ＴＰ）を復号する（ステップＳ２３０２）。なお、ＨＤＤ２０４において対象プログラムＴＰが暗号化されていない場合は、ＨＤＤ２０４から対象プログラムＴＰを読み出すだけでよい。
【０１７３】
ここで、対象プログラムＴＰに演算プログラムを書き込んでおく（ステップＳ２３０３）。演算プログラムの内容については、図２６および図２７を用いて後述する。次に、セキュアモジュール１０２は、対象プログラムＴＰの加工方法をランダムに決定する（ステップＳ２３０４）。具体的には、セキュアモジュール１０２は、「難読化」、「暗号化」（図２１を参照）、「シャッフリング」（図２０，図２１を参照）、「何もしない」の中から決定する。
【０１７４】
そして、セキュアモジュール１０２は、加工方法が「難読化」であるか否かを判断する（ステップＳ２３０５）。加工方法が「難読化」である場合（ステップＳ２３０５：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰから難読化の対象範囲を指定し（ステップＳ２３０６）、対象範囲の命令を難読化する（ステップＳ２３０７）。そして、ステップＳ２３０４に戻る。
【０１７５】
また、ステップＳ２３０５において、加工方法が「難読化」でない場合（ステップＳ２３０５：Ｎｏ）、セキュアモジュール１０２は、加工方法が「暗号化」であるか否かを判断する（ステップＳ２３０８）。加工方法が「暗号化」である場合（ステップＳ２３０８：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰから暗号化の対象範囲を指定し（ステップＳ２３０９）、対象範囲の命令を暗号化する（ステップＳ２３１０）。このとき、図２１に示したように、セキュアモジュール１０２は、暗号化対象のアドレスとそのアドレスの暗号化命令を復号する復号鍵の組み合わせをテーブルに保存する。そして、ステップＳ２３０４に戻る。
【０１７６】
また、ステップＳ２３０８において、加工方法が「暗号化」でない場合（ステップＳ２３０８：Ｎｏ）、セキュアモジュール１０２は、加工方法が「シャッフリング」であるか否かを判断する（ステップＳ２３１１）。加工方法が「シャッフリング」である場合（ステップＳ２３１１：Ｙｅｓ）、セキュアモジュール１０２は、シャッフリング処理（図１９）を実行する（ステップＳ２３１２）。そして、シャッフリング処理の後、ステップＳ２３０４に戻る。
【０１７７】
また、ステップＳ２３１１において、加工方法が「シャッフリング」でない場合（ステップＳ２３１１：Ｎｏ）、セキュアモジュール１０２は、加工終了であるか否かを判断する（ステップＳ２３１３）。具体的には、例えば、このケースでは、加工方法が「何もしない」にランダム決定されているため、一度も加工していない場合は、加工を終了しない（ステップＳ２３１３：Ｎｏ）。この場合は、ステップＳ２３０４に戻る。
【０１７８】
少なくとも１度、または、予め設定しておいた所定回数加工が行われた場合、ランダムに加工を終了する（ステップＳ２３１３：Ｙｅｓ）。これにより、加工処理を終了する。そして、ＲＡＭ２０３のスキャン対象領域２３０に加工後の対象プログラムＴＰを書き出す。
【０１７９】
図２４は、図２３に示したシャッフリング処理（ステップＳ２３１２）の詳細な処理手順例を示すフローチャートである。ここでは、例として、図１５に示したようなシャッフリングをする場合を例に挙げる。まず、セキュアモジュール１０２は、セキュアモジュール１０２内で加工先の領域を確保し（ステップＳ２４０１）、対象プログラムＴＰを複数の命令群に分割する（ステップＳ２４０２）。
【０１８０】
次に、セキュアモジュール１０２は、先頭の命令群を対象命令群に設定する（ステップＳ２４０３）。そして、セキュアモジュール１０２は、対象命令群の後続命令群があるか否かを判断する（ステップＳ２４０４）。後続命令群がある場合（ステップＳ２４０４：Ｙｅｓ）、セキュアモジュール１０２は、プログラム片（たとえば、Ｇｏｔｏ文）をランダムに生成する（ステップＳ２４０５）。具体的には、セキュアモジュール１０２は、ランダムかつ対象命令群が入る領域が確保できるように生成する。
【０１８１】
このあと、セキュアモジュール１０２は、生成されたプログラム片のアドレスを、対象命令群の末尾アドレスの次のアドレスに設定する（ステップＳ２４０６）。そして、セキュアモジュール１０２は、プログラム片とその書込先アドレスとの組み合わせをテーブルに追加する（ステップＳ２４０７）。
【０１８２】
そして、セキュアモジュール１０２は、対象プログラムＴＰのプログラム片に割り当てられたアドレスに、プログラム片のＲｅａｄ命令を書き込む（ステップＳ２４０８）。このあと、セキュアモジュール１０２は、プログラム片で指定されたアドレス（プログラム片が「Ｇｏｔｏ８」なら「８」）に、後続命令群を対象命令群に設定して（ステップＳ２４０９）、ステップＳ２４０４に戻る。
【０１８３】
ステップＳ２４０４において、対象命令群の後続命令群がない場合（ステップＳ２４０４：Ｎｏ）、シャッフリング処理を終了して、ステップＳ２３０４に戻る。
【０１８４】
このように、対象プログラムＴＰを加工することで対象プログラムＴＰのクラッキングに対してもセキュリティ強度を高めることができる。なお、上述した加工処理は、暗号化対象プログラムＴＰを読み込む都度実行されるため、その都度、対象プログラムＴＰの加工方法が変更することとなる。したがって、クラッカーから見るとさらに対象プログラムＴＰの解析を困難にすることができる。
【０１８５】
また、スキャンプログラムＳＰが、スキャン対象領域２３０を不定期または定期的にスキャンした場合、そのスキャンプログラムＳＰが更新される前に、加工プログラムＰＰが、スキャン対象領域２３０にランダムにデータやコードを書き込む。そして、更新前に、加工後のスキャンプログラムＳＰでスキャンすることで、スキャンプログラムＳＰの正常動作を再々確認することができる。
【０１８６】
図２５は、対象プログラムＴＰの加工例を示す説明図である。（Ａ）では、対象プログラムＴＰのアドレス１〜４の命令が難読化され、アドレス５〜７にＮＯＰを追加した例である。（Ｂ）では、アドレス１〜４の命令はそのままで、アドレス５〜７に命令が追加されているが、結果は同一となる例である。（Ｃ）では、アドレス１〜４の命令はそのままで、アドレス５〜７に無意味な命令が追加されているため、結果は同一となる例である。
【０１８７】
このように、図２５の左側の対象プログラムＴＰをスキャンしたあと、図２５の右側のように対象プログラムＴＰを加工して、スキャンプログラムＳＰを更新する前に加工後の対象プログラムＴＰをスキャンする。これにより、スキャンプログラムＳＰの正常動作を再々確認することができる。
【０１８８】
（対象プログラムＴＰ内の演算プログラム）
図２６は、対象プログラムＴＰ内の演算プログラムの内容を示す説明図である。演算プログラムは、所定の演算結果を算出するプログラムであり、セキュアモジュール１０２は、演算プログラムの演算結果が正規の値であるか否かによって対象プログラムＴＰの正当性を判断する。
【０１８９】
例えば、演算プログラムは、１番地の値に第１の秘密番号「ｙｙｙ」を乗算した値を２番地に格納し、２番地の値に第２の秘密番号「ｚｚｚ」を乗算した値を３番地に格納するプログラムであるとする。
【０１９０】
ここで、セキュアモジュール１０２は、ランダムに生成した値「Ｘ」を１番地に格納する。セキュアモジュール１０２は、「Ｘ」から演算プログラムによって算出されるべき正規の値「Ｘａｎｓ」を算出しておく。
【０１９１】
一方、対象プログラムＴＰは、１番地の「Ｘ」を読出し、「Ｘ」に第１の秘密番号「ｙｙｙ」を乗算した値「Ｙ」を２番地に格納し、２番地の値「Ｙ」に第２の秘密番号「ｚｚｚ」を乗算した値「Ｘｃｕｌ」を３番地に格納する。
【０１９２】
セキュアモジュール１０２は、定期的に３番地の値を参照し、３番地の値「Ｘｃｕｌ」を読出し、正規の値「Ｘａｎｓ」と比較する。セキュアモジュール１０２は、１番地に「Ｘ」を格納してから所定時間以内に「Ｘｃｕｌ」と「Ｘａｎｓ」が一致した場合は、対象プログラムＴＰが正規プログラムであると判断する。セキュアモジュール１０２は、所定時間以内に「Ｘｃｕｌ」と「Ｘａｎｓ」が一致しなかった場合は、対象プログラムＴＰが不正プログラムであると判断する。
【０１９３】
図２７は、セキュアモジュール１０２による認証処理の詳細を示す説明図である。まず、セキュアモジュール１０２は、時間計測を開始する（ステップＳ２７０１）。次に、セキュアモジュール１０２は、ランダムに生成した値「Ｘ」を所定の第１のメモリ番地に格納する（ステップＳ２７０２）。そして、「Ｘ」から演算プログラムによって算出されるべき正規の値「Ｘａｎｓ」を算出する（ステップＳ２７０３）。
【０１９４】
次に、セキュアモジュール１０２は、所定の第２のメモリ番地を読み出す（ステップＳ２７０４）。セキュアモジュール１０２は、読み出した値が「Ｘａｎｓ」と一致するか判定する（ステップＳ２７０５）。「Ｘａｎｓ」と一致する場合（ステップＳ２７０５：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰを正規プログラムと判断して（ステップＳ２７０６）、認証処理を終了する。
【０１９５】
一方、「Ｘａｎｓ」と一致しない場合（ステップＳ２７０５：Ｎｏ）、セキュアモジュール１０２は、ステップＳ２７０１の時間計測の開始から一定時間が経過したか判定する（ステップＳ２７０７）。一定時間が経過していない場合（ステップＳ２７０７：Ｎｏ）、ステップＳ２７０４に戻る。
【０１９６】
一方、一定時間が経過した場合（ステップＳ２７０７：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰを不正プログラムと判断して（ステップＳ２７０８）、認証処理を終了する。なお、この認証処理（演算プログラム）の内容は、毎回違う内容になるように加工してもよい。この加工処理を暗号化対象プログラムＴＰを読み込む都度実行すれば、その都度、対象プログラムＴＰの中の演算プログラムが変更されることとなる。したがって、クラッカーから見ると認証処理（演算プログラム）の解析となりすましを困難にすることができる。
【０１９７】
（セキュアモジュール１０２の暗号化処理プログラム）
図２８は、セキュアモジュール１０２による暗号化許可のフローチャートを示す説明図である。まず、セキュアモジュール１０２は、対象プログラムＴＰが改ざんされているか否かを判断する（ステップＳ２８０１）。
【０１９８】
改ざんされていない場合（ステップＳ２８０１：Ｎｏ）、セキュアモジュール１０２は、対象プログラムＴＰから処理要求を受信したか否か判断する（ステップＳ２８０２）。
【０１９９】
処理要求を受信した場合（ステップＳ２８０２：Ｙｅｓ）、セキュアモジュール１０２は、対象プログラムＴＰからの処理要求にしたがって処理を行い（ステップＳ２８０３）、ステップＳ２８０１に戻る。また、処理要求を受信していない場合（ステップＳ２８０２：Ｎｏ）、ステップＳ２８０１に戻る。
【０２００】
一方、改ざんされている場合（ステップＳ２８０１：Ｙｅｓ）、セキュアモジュール１０２は、「エラーモード」に移行して（ステップＳ２８０４）、暗号化許可処理を終了する。「エラーモード」では、セキュアモジュール１０２は、対象プログラムＴＰを再起動しない限り、対象プログラムＴＰからの操作を受け付けない状態となる。
【０２０１】
（通信装置１０１とセンタ１０３との通信）
次に図２９〜図３３を用いて、通信装置１０１とセンタ１０３との通信の内容について説明する。まず、図２９および図３０に示すように、通信装置１０１とセンタ１０３とは、相互に、通信の相手方が正規の装置であることを認証する。
【０２０２】
図２９は、通信装置１０１とセンタ１０３との相互認証を示すシーケンス図（その１）である。ここでは、セキュアモジュール１０２は、センタ１０３の公開鍵およびセキュアモジュール１０２の秘密鍵を保持しており、センタ１０３は、セキュアモジュール１０２の公開鍵およびセンタ１０３の秘密鍵を保持している。ただし、セキュアモジュール１０２とセンタ１０３で共通な共通鍵を保持しているとしてもよい。
【０２０３】
図２９に示すように、まず、対象プログラムＴＰは、発生させた通信装置乱数と、ユーザ情報と、を認証依頼としてセンタ１０３に送信する（ステップＳ２９０１）。
【０２０４】
認証依頼を受信したセンタ１０３は、センタ１０３で発生させたセンタ乱数と、センタ１０３で生成したセッション鍵（一時鍵）と、受信した認証依頼に含まれる通信装置乱数と、をセンタの秘密鍵により暗号化する（ステップＳ２９０２）。そして、センタ１０３は、暗号化したセンタ乱数と、セッション鍵と、通信装置乱数と、を対象プログラムＴＰに送信する（ステップＳ２９０３）。
【０２０５】
暗号化されたセンタ乱数と、セッション鍵と、通信装置乱数と、を受信した対象プログラムＴＰは、暗号化されたセンタ乱数と、セッション鍵と、通信装置乱数と、を、復号依頼としてセキュアモジュール１０２に送信する（ステップＳ２９０４）。復号依頼を受信したセキュアモジュール１０２は、対象プログラムＴＰからプログラム認証情報を取得する（ステップＳ２９０５）。そして、セキュアモジュール１０２は、取得したプログラム認証情報によって対象プログラムＴＰの正当性を認証する（ステップＳ２９０６）。
【０２０６】
次に、セキュアモジュール１０２は、通信装置乱数と、センタ乱数と、セッション鍵と、をセンタ１０３の公開鍵により復号する（ステップＳ２９０７）。セキュアモジュール１０２は、復号したセッション鍵を保持しておく。また、セキュアモジュール１０２は、復号したセンタ乱数をセキュアモジュール１０２の秘密鍵で再暗号化する（ステップＳ２９０８）。そして、セキュアモジュール１０２は、復号した通信装置乱数と、再暗号化したセンタ乱数と、を対象プログラムＴＰに送信する（ステップＳ２９０９）。
【０２０７】
通信装置乱数と、再暗号化されたセンタ乱数を受信した対象プログラムＴＰは、受信したセキュアモジュール１０２に復号された通信装置乱数と、ステップＳ２９０１において送信した通信装置乱数とが一致するか判定する。一致しているならば、対象プログラムＴＰは、正規のセンタ１０３に接続されていることを認証する（ステップＳ２９１０）。また、対象プログラムＴＰは、再暗号化されたセンタ乱数を、センタ１０３に送信する（ステップＳ２９１１）。
【０２０８】
そして、センタ１０３は、受信した再暗号化されたセンタ乱数を復号する（ステップＳ２９１２）。センタ１０３は、復号したセンタ乱数と、ステップＳ２９０３において送信したセンタ乱数とが一致するか判定する。一致しているならば、センタ１０３は、正規の対象プログラムＴＰと接続されていることを認証する（ステップＳ２９１３）。そして、図３０のステップＳ３００１処理に進む。
【０２０９】
図３０は、通信装置１０１とセンタ１０３との相互認証を示すシーケンス図（その２）である。図３０に示すように、対象プログラムＴＰを認証したセンタ１０３は、接続確認を、セッション鍵により暗号化する（ステップＳ３００１）。そして、センタ１０３は、暗号化した接続確認を対象プログラムＴＰに送信する（ステップＳ３００２）。
【０２１０】
暗号化された接続確認を受信した対象プログラムＴＰは、暗号化された接続確認を、復号依頼としてセキュアモジュール１０２に送信する（ステップＳ３００３）。復号依頼を受信したセキュアモジュール１０２は、対象プログラムＴＰからプログラム認証情報を取得する（ステップＳ３００４）。そして、セキュアモジュール１０２は、取得したプログラム認証情報によって対象プログラムＴＰの正当性を認証する（ステップＳ３００５）。
【０２１１】
次に、セキュアモジュール１０２は、接続確認を復号依頼からセンタ１０３のセッション鍵により復号する（ステップＳ３００６）。セキュアモジュール１０２は、復号した接続確認を対象プログラムＴＰに送信する（ステップＳ３００７）。
【０２１２】
接続確認を受信した対象プログラムＴＰは、センタ１０３と相互接続が完了したと判断して、ユーザからの入力待ちの状態に移行する（ステップＳ３００８）。
【０２１３】
ここで、相互認証の際、通信装置１０１とセンタ１０３それぞれの乱数を送信するのは、いわゆる再送攻撃を防止するための処理である。すなわち、相互認証を複数回おこなった場合、乱数を送信しないと、常に同じ暗号化された信号列を送信することになる。
【０２１４】
よって、クラッカーは暗号化された信号列を復号することができずとも、全く同じ信号列をセンタ１０３に送ることで正規の通信装置として偽装できる。これを防止するため、相互認証の都度、乱数を送信し、相互認証の信号列が変わるようにする。なお、乱数を予測されると、クラッカーに信号列を偽装される虞があるため、乱数生成機能もセキュアである必要がある。
【０２１５】
これにより、通信装置１０１とセンタ１０３とが、相互に通信の相手方が正規の装置であることを認証してから、通信装置１０１は対象プログラムＴＰによるデータの送受信をおこなうことができる。次に、図３１を用いて、対象プログラムＴＰが書籍購入用の通信プログラムである場合の通信装置１０１とセンタ１０３との暗号化通信の内容について説明する。
【０２１６】
図３１は、通信装置１０１とセンタ１０３との暗号化通信を示すシーケンス図である。ここで、ユーザが、届け先住所と購入書籍の情報からなる購入情報を対象プログラムＴＰに入力したとする。
【０２１７】
図３１に示すように、対象プログラムＴＰは、ユーザから購入情報の入力を受けると、購入情報を、暗号化依頼としてセキュアモジュール１０２に送信する（ステップＳ３１０１）。暗号化依頼を受信したセキュアモジュール１０２は、対象プログラムＴＰからプログラム認証情報を取得する（ステップＳ３１０２）。そして、セキュアモジュール１０２は、取得したプログラム認証情報によって対象プログラムＴＰの正当性を認証する（ステップＳ３１０３）。
【０２１８】
購入情報を受信したセキュアモジュール１０２は、購入情報を、セキュアモジュール１０２のセッション鍵により暗号化する（ステップＳ３１０４）。そして、セキュアモジュール１０２は、暗号化した購入情報を対象プログラムＴＰに送信する（ステップＳ３１０５）。暗号化された購入情報を受信した対象プログラムＴＰは、暗号化された購入情報をセンタ１０３に送信する（ステップＳ３１０６）。
【０２１９】
暗号化された購入情報を受信したセンタ１０３は、購入情報を、センタ１０３のセッション鍵により復号する（ステップＳ３１０７）。センタ１０３は、復号した購入情報に基づいて、商品の販売処理をおこなう（ステップＳ３１０８）。
【０２２０】
これにより、セキュアモジュール１０２は、対象プログラムＴＰが正規プログラムであることを確認してから、購入情報の暗号化をおこなうため、偽装された購入情報がセンタ１０３に送信されることを防止できる。次に、図３２および図３３を用いて、対象プログラムＴＰが希望ソフトウェアサービスのダウンロード用の通信プログラムである場合の通信装置１０１とセンタ１０３との暗号化通信の内容について説明する。
【０２２１】
図３２は、通信装置１０１とセンタ１０３とのプログラムコードの暗号化通信を示すシーケンス図（その１）である。ここで、ユーザが、希望ソフトウェアサービスのサービス識別番号を対象プログラムＴＰに入力したとする。
【０２２２】
図３２に示すように、対象プログラムＴＰは、ユーザからサービス識別番号の入力を受けると、サービス識別番号を、暗号化依頼としてセキュアモジュール１０２に送信する（ステップＳ３２０１）。暗号化依頼を受信したセキュアモジュール１０２は、対象プログラムＴＰからプログラム認証情報を取得する（ステップＳ３２０２）。そして、セキュアモジュール１０２は、取得したプログラム認証情報によって対象プログラムＴＰの正当性を認証する（ステップＳ３２０３）。
【０２２３】
サービス識別番号を受信したセキュアモジュール１０２は、サービス識別番号を、セキュアモジュール１０２のセッション鍵により暗号化する（ステップＳ３２０４）。そして、セキュアモジュール１０２は、暗号化したサービス識別番号を対象プログラムＴＰに送信する（ステップＳ３２０５）。暗号化されたサービス識別番号を受信した対象プログラムＴＰは、暗号化されたサービス識別番号をセンタ１０３に送信する（ステップＳ３２０６）。
【０２２４】
暗号化されたサービス識別番号を受信したセンタ１０３は、サービス識別番号を、センタのセッション鍵により復号する（ステップＳ３２０７）。次に、センタ１０３は、復号したサービス識別番号と、サービス識別番号に対応するプログラムコードと、をセンタ１０３のセッション鍵により暗号化する。そして、センタ１０３は、暗号化したサービス識別番号と、プログラムコードと、を対象プログラムＴＰに送信する（ステップＳ３２０８）。次に、図３３のステップＳ３３０１の処理に進む。
【０２２５】
図３３は、通信装置１０１とセンタ１０３とのプログラムコードの暗号化通信を示すシーケンス図（その２）である。図３３に示すように、対象プログラムＴＰは、受信した暗号化されたサービス識別番号と、プログラムコードと、を、復号依頼としてセキュアモジュール１０２に送信する（ステップＳ３３０１）。復号依頼を受信したセキュアモジュール１０２は、対象プログラムＴＰからプログラム認証情報を取得する（ステップＳ３３０２）。そして、セキュアモジュール１０２は、取得したプログラム認証情報によって対象プログラムＴＰの正当性を認証する（ステップＳ３３０３）。
【０２２６】
暗号化されたサービス識別番号とプログラムコードとを受信したセキュアモジュール１０２は、サービス識別番号とプログラムコードとを、セキュアモジュール１０２のセッション鍵により復号する（ステップＳ３３０４）。次に、セキュアモジュール１０２は、復号したプログラムコードを、ランダムに生成した鍵により再暗号化する（ステップＳ３３０５）。
【０２２７】
そして、セキュアモジュール１０２は、サービス識別番号と、再暗号化したプログラムコードと、を対象プログラムＴＰに送信する（ステップＳ３３０６）。また、セキュアモジュール１０２は、ランダムに生成した暗号鍵と、サービス識別番号と、を対応付けて保存する（ステップＳ３３０７）。次に、対象プログラムＴＰは、受信したサービス識別番号と、再暗号化されたプログラムコードと、を対応付けて保存する（ステップＳ３３０８）。
【０２２８】
これにより、セキュアモジュール１０２は、対象プログラムＴＰが正規プログラムであることを確認してから、サービス識別番号の暗号化をおこなうため、偽装されたサービス識別番号がセンタ１０３に送信されることを防止できる。また、セキュアモジュール１０２は、センタ１０３から送信されたプログラムコードを再暗号化して、プログラムコードの復号鍵をセキュアに管理するため、プログラムコードの改ざんを防止できる。
【０２２９】
以上説明したように、通信装置１０１およびセキュアモジュール１０２によれば、対象プログラムＴＰの改ざんを検出し、検出した対象プログラムＴＰが暗号化通信ができないようにするため、安全な暗号化通信が実現できる。
【０２３０】
また、改ざんの検出は、安全性の担保されたセキュアモジュール１０２内のスキャンプログラムＳＰによりおこなわれるため、スキャンプログラムＳＰがクラッキングされる虞がなく、安全に改ざんの検出ができる。
【０２３１】
また、改ざんの検出が通信装置１０１内のスキャンプログラムＳＰによりおこなわれる場合には、セキュアモジュール１０２は通信装置１０１内のスキャンプログラムＳＰの更新をランダムにおこなう。そのため、クラッカーによりスキャンプログラムＳＰがクラッキングされる虞を減らすことができる。
【０２３２】
また、セキュアモジュール１０２は、スキャンプログラムＳＰを、「難読化」、「スキャン対象領域変更」、「スキャン対象アドレスの順序変更」、「スキャン結果演算の追加」、「スキャンプログラムのアドレス追加」により更新する。これにより、クラッカーによってスキャンプログラムＳＰが解読され、改ざんされることを防止することができる。
【０２３３】
また、セキュアモジュール１０２は、対象プログラムＴＰを加工することにより、クラッカーにより対象プログラムＴＰがクラッキングされる虞を減らすことができる。例えば、セキュアモジュール１０２は、対象プログラムＴＰを、「難読化」、「暗号化」、「シャッフリング」により加工する。これにより、クラッカーによって対象プログラムＴＰが解読され、改ざんされることを防止することができる。
【０２３４】
そして、改ざんが検出された場合には、セキュアモジュール１０２は、暗号化部６０８、出力部６０９、または全機能を使用不能に設定する。これにより、改ざんが検出された対象プログラムＴＰからの暗号鍵Ｋの読出し要求や通信内容の暗号化依頼に対応しないようにできるため、改ざんが検出された対象プログラムＴＰによる暗号鍵Ｋを用いた暗号化通信が不可能となる。
【０２３５】
また、セキュアモジュール１０２は、通信装置１０１内に対する要求の出力時とその応答の取得時との時間間隔から、セキュアモジュール１０２と応答の送信元との物理的距離を推定する。これにより、セキュアモジュール１０２は、クラッカーのコンピュータ１０４による通信装置１０１のなりすましを判定し、クラッカーのコンピュータ１０４との通信に対応しないようにできる。
【０２３６】
また、セキュアモジュール１０２は、通信装置１０１内の対象プログラムＴＰとやり取りするデータを暗号化する。そのため、クラッカーによって、セキュアモジュール１０２と通信装置１０１内のプロセッサ３０１との間の通信路がクラッキングされ、データが解析されることを防止することができる。
【０２３７】
このように安全な暗号化通信が実現されるため、セキュアモジュール１０２のユーザおよびセンタ１０３のユーザの損害を防止できる。
【０２３８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２３９】
（付記１）通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールと、
前記通信装置内の前記セキュアモジュール外に備えられ、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムが保持された記憶装置と、
前記セキュアモジュールに備えられ、前記プログラムの改ざんを検出する検出手段と、
前記セキュアモジュールに備えられ、前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
を備えることを特徴とする通信装置。
【０２４０】
（付記２）前記セキュアモジュールに備えられ、前記プログラムに固有なコードを記憶する記憶手段と、
前記セキュアモジュールに備えられ、前記プログラムに固有なコードを生成するスキャン処理を前記通信装置で実行させるスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、を備え、
前記検出手段は、
前記記憶装置内の特定の記憶領域に記憶されている前記プログラムに対し前記スキャンプログラムが前記通信装置で実行された場合、前記通信装置での前記スキャンプログラムの実行結果と前記記憶手段に記憶された前記コードとに基づいて、前記特定の記憶領域に記憶されている前記プログラムの改ざんを検出することを特徴とする付記１に記載の通信装置。
【０２４１】
（付記３）前記セキュアモジュールに備えられ、前記プログラムに固有なコードを記憶する記憶手段と、
前記セキュアモジュールに備えられ、前記記憶装置に直接アクセスをおこない読み出した前記プログラムから前記プログラムに固有なコードを生成するスキャン処理を実行するスキャンプログラムを生成する生成処理と、前記固有なコードと同一コードの生成を維持したまま前記スキャンプログラムの内容をランダムに更新する更新処理とを実行する生成手段と、を備え、
前記検出手段は、
前記スキャンプログラムの実行結果と、前記記憶手段に記憶された前記コードとに基づいて、前記プログラムの改ざんを検出することを特徴とする付記１に記載の通信装置。
【０２４２】
（付記４）前記生成手段は、前記更新処理を定期的に実行することを特徴とする付記２または３に記載の通信装置。
【０２４３】
（付記５）前記生成手段は、前記更新処理を不定期に実行することを特徴とする付記２または３に記載の通信装置。
【０２４４】
（付記６）前記生成手段は、前記更新処理として、前記スキャンプログラムの命令を難読化することを特徴とする付記２〜５のいずれか一つに記載の通信装置。
【０２４５】
（付記７）前記生成手段は、前記更新処理として、前記スキャンプログラムで指定された前記特定の記憶領域内のスキャン先アドレスを変更することを特徴とする付記２〜５のいずれか一つに記載の通信装置。
【０２４６】
（付記８）前記生成手段は、前記更新処理として、前記スキャンプログラム内の命令群においてそれぞれ指定された前記特定の記憶領域内のスキャン先アドレスの順序を変更することを特徴とする付記２〜５のいずれか一つに記載の通信装置。
【０２４７】
（付記９）前記生成手段は、前記更新処理として、前記スキャンプログラム内の命令で指定されたデータに基づく演算命令の内容を変更して、変更後の演算命令による演算結果を前記記憶手段に記憶しておき、前記変更後の演算命令による演算結果を前記セキュアモジュールに返す命令を追加することを特徴とする付記２〜５のいずれか一つに記載の通信装置。
【０２４８】
（付記１０）前記生成手段は、前記更新処理として、前記スキャンプログラム内の命令を、前記スキャンプログラムの前記通信装置での格納先アドレスに依存した命令に変更することを特徴とする付記２〜５のいずれか一つに記載の通信装置。
【０２４９】
（付記１１）前記生成手段は、前記生成処理として、前記固有なコードと同一コードの生成を維持したまま記述内容が異なるスキャンプログラムをランダムに生成することを特徴とする付記２または３に記載の通信装置。
【０２５０】
（付記１２）前記生成手段は、前記生成処理を定期的に実行することを特徴とする付記１１に記載の通信装置。
【０２５１】
（付記１３）前記生成手段は、前記生成処理を不定期に実行することを特徴とする付記１２に記載の通信装置。
【０２５２】
（付記１４）前記プログラムを、記述内容は異なるが機能は同一のプログラムコードに加工する加工手段を備え、
前記加工手段による加工後のプログラムに固有なコードを前記記憶手段に上書きすることを特徴とする付記２〜１３のいずれか一つに記載の通信装置。
【０２５３】
（付記１５）前記プログラムを、記述内容は異なるが機能は同一のプログラムコードに加工し、加工後のプログラムに固有なコードを前記記憶手段に上書きする加工手段を備え、
前記検出手段は、
前記加工手段による加工後のプログラム内の演算プログラムの演算結果の正当性に基づいて、前記加工後のプログラムの改ざんを検出することを特徴とする付記１に記載の通信装置。
【０２５４】
（付記１６）前記加工手段は、前記通信装置において前記スキャンプログラムの実行中に、前記プログラムを、記述内容は異なるが機能は同一のプログラムコードに加工し、前記加工後のプログラムに固有なコードを前記記憶手段に上書きすることを特徴とする付記１５に記載の通信装置。
【０２５５】
（付記１７）前記加工手段は、前記プログラムの命令を難読化することを特徴とする付記１４〜１６のいずれか一つに記載の通信装置。
【０２５６】
（付記１８）前記加工手段は、前記プログラムの命令群をシャッフリングし、ジャンプ先命令のアドレスを指定するジャンプ命令と当該ジャンプ命令のアドレスとの組み合わせを特定するテーブルを前記記憶手段に記憶し、シャッフリング後の前記プログラムにおける前記ジャンプ命令の内容を前記テーブルのリード命令に変更して、前記特定の記憶領域に書き出すことを特徴とする付記１４〜１６のいずれか一つに記載の通信装置。
【０２５７】
（付記１９）前記加工手段は、前記プログラムの命令群をシャッフリングし、ジャンプ先命令のアドレスを指定するジャンプ命令およびジャンプ元命令と当該ジャンプ元命令のアドレスとの組み合わせを特定するテーブルを前記記憶手段に記憶し、シャッフリング後の前記プログラムにおける前記ジャンプ元命令の内容を前記テーブルのリード命令に変更して、前記特定の記憶領域に書き出すことを特徴とする付記１４〜１６のいずれか一つに記載の通信装置。
【０２５８】
（付記２０）前記加工手段は、前記プログラムの任意の命令を、当該命令を暗号化した暗号化命令と、前記セキュアモジュールに対するリード命令と、前記暗号化命令を復号する復号命令とに置換し、前記リード命令のアドレスと前記暗号化命令を復号する復号鍵との組み合わせを特定するテーブルを前記記憶手段に記憶し、加工後の前記プログラムを前記特定の記憶領域に書き出すことを特徴とする付記１４〜１６のいずれか一つに記載の通信装置。
【０２５９】
（付記２１）前記加工手段は、前記プログラムの任意の命令を前記セキュアモジュールに対するリード命令に置換し、当該リード命令のアドレスと置換元の命令との組み合わせを特定するテーブルを前記記憶手段に記憶し、加工後の前記プログラムを前記特定の記憶領域に書き出すことを特徴とする付記１４〜１６のいずれか一つに記載の通信装置。
【０２６０】
（付記２２）前記検出手段によって前記プログラムの改ざんが検出されなかった場合に、前記プログラムを実行する前記通信装置内のプロセッサへ要求を出力した時から、前記プロセッサからの返答を取得する時までの経過時間が、前記通信装置内の前記プロセッサと前記セキュアモジュールとの物理的距離に対応する許容時間以上であるか否かを判定する判定手段を前記セキュアモジュール内に備え、
前記設定手段は、
前記判定手段によって前記許容時間以上であると判定された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする付記１〜２１のいずれか一つに記載の通信装置。
【０２６１】
（付記２３）前記セキュアモジュールに備えられ、前記プログラムが前記外部の装置に送信するデータを、前記送信に先だって前記プログラムから取得する取得手段と、
前記セキュアモジュールに備えられ、前記取得手段によって取得された前記データを前記暗号鍵を用いて暗号化する暗号化手段と、を備え、
前記設定手段は、
前記暗号化手段を不能な状態に設定することにより、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする付記１〜２２のいずれか一つに記載の通信装置。
【０２６２】
（付記２４）前記セキュアモジュールに備えられ、前記暗号鍵の出力依頼を前記プログラムから取得する取得手段と、
前記セキュアモジュールに備えられ、前記取得手段によって前記出力依頼が取得された場合に、前記暗号鍵を前記プログラムに出力する出力手段と、を備え、
前記設定手段は、
前記出力手段を不能な状態に設定することにより、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定することを特徴とする付記１〜２２のいずれか一つに記載の通信装置。
【０２６３】
（付記２５）前記データは、前記セキュアモジュールと前記プログラムを実行するプロセッサとが有する共通鍵を用いて暗号化されることを特徴とする付記２３または２４に記載の通信装置。
【０２６４】
（付記２６）前記暗号鍵は、前記外部の装置が有する公開鍵に対応する前記セキュアモジュールの秘密鍵であることを特徴とする付記２２〜２５のいずれか一つに記載の通信装置。
【０２６５】
（付記２７）前記暗号鍵は、前記セキュアモジュールと前記外部の装置とが共通して有する共通鍵であることを特徴とする付記２２〜２５のいずれか一つに記載の通信装置。
【０２６６】
（付記２８）通信装置内に備えられ、内部に格納された情報を外部から参照ができない構造のセキュアモジュールにおいて、
前記通信装置内の前記セキュアモジュール外に備えられた記憶装置に保持され、前記通信装置の外部の装置との暗号化通信を前記セキュアモジュール内に保持されている暗号鍵を用いておこなうプログラムの改ざんを検出する検出手段と、
前記検出手段によって前記プログラムの改ざんが検出された場合に、前記セキュアモジュールを、前記プログラムによる前記暗号鍵を用いた前記暗号化通信が不可能な状態に設定する設定手段と、
を備えることを特徴とするセキュアモジュール。
【符号の説明】
【０２６７】
１０１  通信装置
１０２  セキュアモジュール
６０１  検出部
６０２  設定部
６０３  記憶部
６０４  生成部
６０５  加工部
６０６  判定部
６０７  取得部
６０８  暗号化部
６０９  出力部
【図１】
0005772031.tif 000002
【図２】
0005772031.tif 000003
【図３】
0005772031.tif 000004
【図４】
0005772031.tif 000005
【図５】
0005772031.tif 000006
【図６】
0005772031.tif 000007
【図７】
0005772031.tif 000008
【図８】
0005772031.tif 000009
【図９】
0005772031.tif 000010
【図１０】
0005772031.tif 000011
【図１１】
0005772031.tif 000012
【図１２】
0005772031.tif 000013
【図１３】
0005772031.tif 000014
【図１４】
0005772031.tif 000015
【図１５】
0005772031.tif 000016
【図１６】
0005772031.tif 000017
【図１７】
0005772031.tif 000018
【図１８】
0005772031.tif 000019
【図１９】
0005772031.tif 000020
【図２０】
0005772031.tif 000021
【図２１】
0005772031.tif 000022
【図２２】
0005772031.tif 000023
【図２３】
0005772031.tif 000024
【図２４】
0005772031.tif 000025
【図２５】
0005772031.tif 000026
【図２６】
0005772031.tif 000027
【図２７】
0005772031.tif 000028
【図２８】
0005772031.tif 000029
【図２９】
0005772031.tif 000030
【図３０】
0005772031.tif 000031
【図３１】
0005772031.tif 000032
【図３２】
0005772031.tif 000033
【図３３】
0005772031.tif 000034