(57)【特許請求の範囲】
【請求項１】
複数の処理を実現する処理装置であって、
複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択手段と、
選択された命令ブロックを実行する実行手段と、
前記選択手段によって選択された処理について前記管理手段が管理する識別情報を、前記実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段と
を備えることを特徴とする処理装置。
【請求項２】
前記選択手段は、前記次に進めるべき処理をランダムに選択する
ことを特徴とする請求項１に記載の処理装置。
【請求項３】
前記複数の処理の少なくとも１つは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、
前記選択手段は、前記他の処理の処理結果が得られるまでは、前記ランダムに選択を行った結果に関わらず、前記依存ブロック以降の命令ブロックとは異なる命令ブロックを選択する
ことを特徴とする請求項２に記載の処理装置。
【請求項４】
原処理命令群を難読化して難読命令群を生成する難読化装置であって、
前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、
前記複数の命令ブロックそれぞれに識別情報を付与する付与手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、
前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段と
を備えることを特徴とする難読化装置。
【請求項５】
前記複数の処理命令群の少なくとも１つは変数の値に応じた条件分岐を行う条件分岐命令を含み、
前記難読化装置は、更に、
前記条件分岐命令の分岐先または前記分岐先の後に実行される命令ブロックを、
前記変数に代入される値が、前記条件分岐命令が前記分岐先に分岐する場合に代入されるべき値であれば前記命令ブロックと同一の結果を得られる動作を行い、
前記条件分岐命令が前記分岐先に分岐する場合に代入されるべき値と異なれば前記命令ブロックと異なる動作を行う依存ブロックに置き換える依存化手段と、
前記条件分岐命令を含む命令ブロックから、前記条件分岐命令を削除する削除手段と  を備える
ことを特徴とする請求項４に記載の難読化装置。
【請求項６】
前記命令生成手段は、前記次に進めるべき処理をランダムに選択する選択命令を生成する
ことを特徴とする請求項４に記載の難読化装置。
【請求項７】
前記複数の処理のうち少なくとも１つを実現する複数の命令ブロックは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、
前記選択命令は、前記他の処理の処理結果が得られるまでは、前記ランダムに選択を行った結果に関わらず、前記依存ブロック以降の命令ブロックとは異なる命令ブロックを選択する
ことを特徴とする請求項６に記載の難読化装置。
【請求項８】
前記原処理命令群はループを含み、
前記分割手段は、前記原処理命令群を分割する際に、前記ループを展開して分割を行い、
前記命令生成手段は、
展開されたループの各繰り返しに対応する命令ブロックに対し、
前記ループの最後以外の繰り返しに対応する命令ブロックについては、前記ループの最初に当たる命令ブロックを示す識別情報によって、
前記ループの最後の繰り返しに対応する命令ブロックについては、前記ループの繰り返しが終了した後に実行される命令ブロックを示す識別情報によって、
前記管理領域が管理する識別情報を更新する更新命令を生成する
ことを特徴とする請求項６に記載の難読化装置。
【請求項９】
前記原処理命令群はループを含み、
前記命令生成手段は、前記複数の命令ブロックのうち、前記ループ内で最後に実行される命令ブロックについて、
当該命令ブロックが前記ループの最後の繰り返し以外で実行される場合には、前記ループの最初に当たる命令ブロックを示す識別情報によって、
当該命令ブロックが前記ループの最後の繰り返しで実行される場合には、前記ループの繰り返しが終了した後に実行される命令ブロックによって、
前記管理領域が管理する識別情報を更新する更新命令を生成する
ことを特徴とする請求項６に記載の難読化装置。
【請求項１０】
複数の処理を実現する処理装置で用いられる処理方法であって、
複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段とを備え、
前記処理方法は、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択ステップと、
選択された命令ブロックを実行する実行ステップと、
前記選択ステップによって選択された処理について前記管理手段が管理する識別情報を、前記実行ステップによって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新ステップと
を含むことを特徴とする処理方法。
【請求項１１】
複数の処理を実現する処理装置で用いられる処理プログラムであって、
複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段とを備え、
前記処理プログラムは、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択ステップと、
選択された命令ブロックを実行する実行ステップと、
前記選択ステップによって選択された処理について前記管理手段が管理する識別情報を、前記実行ステップによって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新ステップと
を含むことを特徴とする処理プログラム。
【請求項１２】
複数の処理を実現する処理装置で用いられる集積回路であって、
複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理手段が管理する識別情報を用いて選択する選択手段と、
選択された命令ブロックを実行する実行手段と、
前記選択手段によって選択された処理について前記管理手段が管理する識別情報を、前記実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段と
を備えることを特徴とする集積回路。
【請求項１３】
原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる難読化方法であって、
前記難読化方法は、
前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割ステップと、
前記複数の命令ブロックそれぞれに識別情報を付与する付与ステップと、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成ステップと、
前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成ステップと
を含むことを特徴とする難読化方法。
【請求項１４】
原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる難読化プログラムであって、
前記難読化プログラムは、
前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割ステップと、
前記複数の命令ブロックそれぞれに識別情報を付与する付与ステップと、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成ステップと、
前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成ステップと
を含むことを特徴とする難読化プログラム。
【請求項１５】
原処理命令群を難読化して難読命令群を生成する難読化装置で用いられる集積回路であって、
前記複数の原処理命令群を、前記原処理命令群が実現する複数の処理それぞれに分類し、かつ、前記複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、
前記複数の命令ブロックそれぞれに識別情報を付与する付与手段と、
前記複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、
前記複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを前記管理領域が管理する識別情報を用いて選択する選択命令と、
前記管理領域が管理する前記複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、
前記初期化命令と、前記選択命令と、前記更新命令と、前記識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段と
を備えることを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを構成する命令ブロックの実行順序を複雑化することで解析を困難にする技術に関する。
【背景技術】
【０００２】
コンピュータ上で動作するプログラムの中には、ある処理を行う命令群と他の処理を行う命令群とを区別されると不都合が生じるものがある。このようなプログラムの例としては、改ざんチェック処理を含むプログラムが考えられる。通常、改ざんチェックを行う機能を持つプログラムは、改ざんチェックの処理を行う命令群、改ざんがなかった場合の正当な処理を行う命令群、および、改ざんが発見された場合の例外処理を行う命令群を含む。この場合、改ざんチェックを行う命令群がどの命令群であるか特定されてしまうと以下のような不都合がおこる。すなわち、改ざんチェックを行う命令群を重点的に解析し、改ざんチェックを飛ばすように改変を加えることで、改ざんチェックの結果に関わらず、常に正当な処理が実行されるようにプログラムを改ざんすることが出来てしまう。
【０００３】
また、他の例としては、プログラム中に秘密にすべき情報が含まれており、その情報が特定の命令群から算出される場合などが考えられる。ここで、秘密にすべき情報とは、解析または改ざんされることによって、プログラムの提供者に何らかの不都合が発生する情報である。具体的には、データの暗号化を解く鍵であったり、他のプログラムや装置に自身の正当性を証明するために用いる情報であったり、映画などのコンテンツの利用権を示す情報などが考えられる。この場合も、どの命令群が秘密にすべき情報の算出に使われているか特定されてしまうと、その命令群を解析したり改ざんしたりすることで、秘密にすべき情報が暴露されたり、不正者に不当な権利を与えてしまうことになる。
【０００４】
不正な解析者がある処理を行う命令群と他の処理を行う命令群とを区別する手法の例としては、連続して実行される命令群を監視する方法が考えられる。解析に対する対策が施されていないプログラムでは、一般にある処理を行うために必要な命令群が連続して実行され、また、その実行結果が特定の変数に代入されることが多い。このような性質を利用すると、連続して実行される命令群のうち特定の変数が利用されなくなる箇所が、処理が切り替わる箇所であると推測することが出来てしまう。
【０００５】
このような攻撃を回避するためには、例えば、特許文献１に記載のように互いに関連しない処理を実行する命令群同士について、その実行順序を入れ替えて解析を困難にすることが考えられる。ここで、この実行順序の入れ替えによって元のプログラムと同じ結果が得られなくなってしまうと、もともとのプログラムの目的が達成できなくなってしまう。そのため、実行順序の入れ替えは、プログラムの実行結果に影響が出ない範囲で行う必要がある。
【特許文献１】特願平１０−２４６９６２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来技術で示したような実行順序の入れ替えでは、分岐やループなどの複雑な制御構造を持つプログラムの場合、解析を十分に困難にすることができないという課題があった。
【０００７】
この課題を図１を用いて説明する。図１（ａ）では、処理１を実行する命令群と処理２を実行する命令群とが図示されている。処理１を実行する命令群は、Ａ１、Ａ２、Ａ３という３つのブロックからなる。また、処理２を実行する命令群は、Ｂ１、Ｂ２、…、Ｂ６という６つのブロックからなる。ここで、各ブロックは1つ以上の命令の意味のあるまとまりであり、命令ブロックとも呼ぶ。また、説明を簡単にするため、処理１と処理２とは互いに独立した処理であるとする。すなわち、処理１の何れかのブロックが実行されなくては処理２のいずれかのブロックが実行できない（またはその逆）という関係にはないものとする。
【０００８】
図１に示すように、処理１では、各ブロックがＡ１、Ａ２、Ａ３という順序で１回ずつ実行されると正しい結果が得られる。また、処理２では、各ブロックがＢ１、Ｂ２、…という順序で各命令群が実行され、かつ、Ｂ６のあと、Ｂ２へループすると言う処理が幾度か繰り替えされることで正しい結果が得られる。
【０００９】
この場合、命令群の制御構造（ループ）を考慮せずに命令群の実行順序を入れ替えると、処理１を実行する命令群のうち、処理２のループ内に配置されてしまったブロックが複数回実行されることになる。処理１を構成する命令群は本来１度ずつ実行されることで正しい結果が得られるものであるため、このような実行順序で各命令群を実行されてしまうと正しい結果が得られなくなる（例えば、図１（ｂ））。
【００１０】
一方、制御構造を考慮し、実行結果に影響が出ないように各命令群の実行順序を工夫すると、実行順序を入れ替えられるブロックは限られてしまう（例えば、図１（ｃ））。そのため、処理１を構成する命令群と処理２（特にループを構成する処理）を構成する命令群との分離が容易となり、不正解析者の攻撃を十分に防ぐことは困難となる。
【００１１】
そこで、本発明では、複雑な制御構造を持つプログラムであっても、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難になるような処理装置、プログラム、およびそのようなプログラムを生成する難読化装置等を提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明に係る処理装置は、複数の処理を実現する処理装置であって、複数の処理それぞれについて、当該処理を実現するために所定の順序で実行すべき複数の命令ブロックを保持する保持手段と、複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理手段と、複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを管理手段が管理する識別情報を用いて選択する選択手段と、選択された命令ブロックを実行する実行手段と、選択手段によって選択された処理について管理手段が管理する識別情報を、実行手段によって実行された命令ブロックの次に実行すべき命令ブロックを示す識別情報に更新する更新手段とを備えることを特徴とする。
【００１３】
この構成により、本発明に係る処理装置では、管理手段によってそれぞれの処理を構成する命令ブロックについての実行の進行状況を把握しつつ処理を進めることができる。そのため、複雑な制御構造を持つプログラムであっても、各処理を構成する命令ブロックの実行順序を複雑化し、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難にすることができる。
【００１４】
本発明に係る処理装置は、さらに、選択手段は、次に進めるべき処理をランダムに選択することを特徴とする。
【００１５】
この構成により、本発明に係る処理装置では、次に進めるべき処理をランダムに選択する。そのため、不正解析者から、実行されている命令ブロックがどの処理を実現するものであるかを認識することが困難となり、更に命令ブロックの区別を困難にすることができる。
【００１６】
本発明に係る処理装置は、さらに、複数の処理の少なくとも１つは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、選択手段は、他の処理の処理結果が得られるまでは、ランダムに選択を行った結果に関わらず、依存ブロック以降の命令ブロックとは異なる命令ブロックを選択することを特徴とする。
【００１７】
この構成により、本発明に係る処理装置では、ランダムな順序で命令ブロックを実行する場合であっても、複数の処理間に依存関係がある場合であれば、その依存関係を踏まえた正常な動作を行うように命令ブロックの実行順序を調節することができる。
【００１８】
また、本発明に係る難読化装置は、原処理命令群を難読化して難読命令群を生成する難読化装置であって、複数の原処理命令群を、原処理命令群が実現する複数の処理それぞれに分類し、かつ、複数の処理それぞれごとについての複数の命令ブロックに分割する分割手段と、複数の命令ブロックそれぞれに識別情報を付与する付与手段と、複数の処理それぞれについて、当該処理を進めるために次に実行すべき命令ブロックを示す識別情報を管理する管理領域を確保する初期化命令と、複数の処理から次に進めるべき処理を選択し、選択された処理を進めるために実行すべき命令ブロックを管理領域が管理する識別情報を用いて選択する選択命令と、管理領域が管理する複数の処理それぞれに対応する識別情報を、当該処理を実現する複数の命令ブロックそれぞれが実行された場合に、当該処理において次に実行すべき命令ブロックを示す識別情報に更新する更新命令とを生成する命令生成手段と、初期化命令と、選択命令と、更新命令と、識別情報を付与された複数の命令ブロックとから、難読命令群を生成する生成手段とを備えることを特徴とする。
【００１９】
この構成により、本発明に係る難読化装置では、原処理命令群を難読化することができる。また、この難読化により生成された難読命令群は、管理領域によってそれぞれの処理を構成する命令ブロックについての実行の進行状況を把握しつつ処理を進めることができる。そのため、原処理命令群が複雑な制御構造を持っていても、各処理を構成する命令ブロックの実行順序を複雑化し、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別が困難にすることができる。
【００２０】
本発明に係る難読化装置は、さらに、複数の処理命令群の少なくとも１つは変数の値に応じた条件分岐を行う条件分岐命令を含み、難読化装置は、更に、条件分岐命令の分岐先または分岐先の後に実行される命令ブロックを、変数に代入される値が、条件分岐命令が分岐先に分岐する場合に代入されるべき値であれば命令と同一の結果を得られる動作を行い、条件分岐命令が分岐先に分岐する場合に代入されるべき値と異なれば命令と異なる動作を行う依存ブロックに置き換える依存化手段と、条件分岐命令を含む命令ブロックから、分岐命令を削除する削除手段とを備えることを特徴とする。
【００２１】
この構成により、本発明に係る難読化装置では、更に不正解析の標的となりやすい条件分岐命令を隠蔽することができる。
【００２２】
本発明に係る難読化装置は、さらに、命令生成手段は、次に進めるべき処理をランダムに選択する選択命令を生成することを特徴とする。
【００２３】
この構成により、本発明に係る難読化装置が生成する難読命令群は、次に進めるべき処理をランダムに選択する。そのため、不正解析者から、実行されている命令ブロックがどの処理を実現するものであるかを認識することが困難となり、更に命令ブロックの区別を困難にすることができる。
【００２４】
本発明に係る難読化装置は、さらに、複数の処理のうち少なくとも１つを実現する複数の命令ブロックは、他の処理の処理結果に依存した動作を行う依存ブロックを含み、選択手段は、他の処理の処理結果が得られるまでは、ランダムに選択を行った結果に関わらず、依存ブロック以降の命令ブロックとは異なる命令ブロックを選択することを特徴とする。
【００２５】
この構成により、本発明に係る難読化装置が生成する難読命令群は、ランダムな順序で命令ブロックを実行する場合であっても、複数の処理間に依存関係がある場合であれば、その依存関係を踏まえた正常な動作を行うように命令ブロックの実行順序を調節することができる。
【００２６】
本発明に係る難読化装置は、さらに、原処理命令群はループを含み、分割手段は、原処理命令群を分割する際に、ループを展開して分割を行い、命令生成手段は、展開されたループの各繰り返しに対応する命令ブロックに対し、ループの最後以外の繰り返しに対応する命令ブロックについては、ループの最初に当たる命令ブロックを示す識別情報によって、ループの最後の繰り返しに対応する命令ブロックについては、ループの繰り返しが終了した後に実行される命令ブロックを示す識別情報によって管理領域が管理する識別情報を更新する更新命令を生成することを特徴とする。
【００２７】
また、本発明に係る難読化装置は、原処理命令群はループを含み、命令生成手段は、複数の命令ブロックのうち、ループ内で最後に実行される命令ブロックについて、当該命令ブロックがループの最後の繰り返し以外で実行される場合には、ループの最初に当たる命令ブロックを示す識別情報によって、当該命令ブロックがループの最後の繰り返しで実行される場合には、ループの繰り返しが終了した後に実行される命令ブロックによって、管理領域が管理する識別情報を更新する更新命令を生成することを特徴とする。
【００２８】
これらの構成により、本発明に係る難読化装置は、ループを持つ原処理命令群についても、実行結果を変更することなく難読化することができる。
【００２９】
また、本発明を、プログラム、集積回路、方法として実現しても同様の効果が得られる。
【発明の効果】
【００３０】
本発明の処理装置は、複雑な制御構造を持つプログラムであっても、ある処理を構成する命令ブロックと他の処理を構成する命令ブロックとの区別を困難にすることができるという作用効果を奏する。
【発明を実施するための最良の形態】
【００３１】
（実施の形態１）
実施の形態１では、ループを含む制御構造を持つ原処理命令群を、その原処理命令群を構成するブロックの実行順序を隠蔽することができるよう変換した難読命令群、および、
その変換を行う難読化装置について説明する。
【００３２】
＜変換前後の命令群についての説明＞
まず、本実施の形態で例として用いる原処理命令群、および、それを変換して得られる難読命令群についての説明を行う。なお、原処理命令群および難読命令群は、それぞれコンピュータに対する１つ以上の命令の集合であり、１つまたは複数のプログラムであっても良いし、プログラムを構成する一部の単位（例えば関数）などであってもよい。本発明で述べる他の「命令群」および「命令」または「ブロック」についても同様である。
【００３３】
まず原処理命令群２０００について説明を行う。図２は、原処理命令群２０００の例である。図２において、原処理命令群２０００は、秘密情報を用いない処理Ａを行う命令群と、秘密情報を用いる処理Ｂを行う命令群とから構成されている。ここで、秘密情報とは不正な解析から保護すべき情報であり、本実施の形態では、データの復号化に用いる鍵であるものとして説明を行う。
【００３４】
原処理命令群２０００において、処理Ａは、それぞれが１つ以上の命令の集合であるブロックＡ１、Ａ２、Ａ３から構成されている。また、処理Ｂは、ブロックＢ１、Ｂ２、・・・Ｂ６、Ｂ７から構成され、Ｂ２とＢ６の間の処理を所定の回数（例えば１０回）繰り返すループを含む。
【００３５】
ここで、本実施の形態における秘密情報である鍵は、変数ｘを用いて計算され、ブロックＢ７において、データｄａｔａの復号化に用いられる。なお、ブロックＢ７に記載している「ｄｅｃｒｙｐｔ（ｄａｔａ，ｘ）；」は、データｄａｔａを鍵ｘを用いて復号化することを意味している。
【００３６】
また、処理Ａは、処理Ｂと依存関係のない処理であれば、どのような処理であっても構わない。上記では処理Ａは秘密情報を使わない処理であるとしたが、処理Ａもまた、別の秘密情報を含んでいるとしても良い。
【００３７】
原処理命令群２０００はループを含むため、従来の技術によれば、処理Ａを実行する命令群と処理Ｂを実行する命令群との実行順序を入れ替えられる範囲が限定されてしまう。そのため、鍵ｘの値が不正解析によって漏洩する可能性が高い。
【００３８】
続いて、本実施の形態に示す手法によって、原処理命令群２０００を変換して得られる難読命令群３０００の説明を行う。図３は、図２に示した原処理命令群２０００を変換して得られる難読命令群３０００の例を示す図である。
【００３９】
難読命令群３０００では、原処理命令群２０００と比べて、初期化命令群３００１および選択命令群３００２が追加されている。また、原処理命令群２０００を構成する各ブロックには、それぞれ更新命令および分岐命令が追加されている。また、図示していないが、各ブロックに対しては、そのブロックを識別する識別情報であるブロック番号が付与されている。さらに、難読命令群３０００は、記録媒体上に設けたブロック番号保持部３０１Ａとブロック番号保持部３０１Ｂを用いる。これらのブロック番号保持部は、難読命令群３０００自身が記録媒体上に領域を確保することで実現するものとする。ただし、予め記録媒体上に確保されているものとしてもよい。なお、ブロック番号保持部が設けられる記録媒体は、例えば、ワーキングメモリや、ハードディスクなどである。
【００４０】
続いて、難読命令群３０００を構成する各構成要素、および、ブロック番号保持部の説明を行う。
【００４１】
ブロック番号保持部３０１Ａは、処理Ａを実現する各ブロックのうち、次に実行すべきブロックのブロック番号を保持することで、処理Ａの進行状況を管理する。保持するブロック番号は、処理Ａを実現するブロック（以下、処理Ａのブロックとも呼ぶ）が１つ実行される毎に、そのブロックに追加された更新命令によって更新される。
【００４２】
ブロック番号保持部３０１Ｂは、処理Ｂを実現する各ブロックのうち、次に実行すべきブロックのブロック番号を保持することで、処理Ｂの進行状況を管理する。保持するブロック番号は、処理Ｂを実現するブロック（以下、処理Ｂのブロックとも呼ぶ）が１つ実行される毎に、そのブロックに追加された更新命令によって更新される。
【００４３】
初期化命令群３００１は、ブロック番号保持部３０１Ａおよびブロック番号保持部３０１Ｂを記録媒体上に生成する。また、処理Ａおよび処理Ｂそれぞれの最初のブロックを示すブロック番号を、各ブロック番号保持部の保持するブロック番号に設定する。図３の例では、ブロック番号保持部３０１ＡにはブロックＡ１のブロック番号が、ブロック番号保持部３０１ＢにはブロックＢ１のブロック番号が設定される。また、初期化命令群３００１は、難読命令群３０００で用いる変数の変数宣言および初期化も行う。後述するとおり、難読命令群３０００において各処理を実現するブロックは、原処理命令群２０００に含まれていたブロックを用いている。したがって、初期化命令群３００１中での変数宣言は、原処理命令群２０００中での変数宣言をそのまま用いることができる。ただし、難読命令群３０００で使用しない変数が予め分かっている場合には、その変数の変数宣言を省略するとしても良い。例えば、本実施の形態１では、後述するとおりループを展開しているので、ループの繰り返し回数を数える変数については変数宣言を省略できる。また、原処理命令群２０００の何れかのブロックで変数の初期化が行われる場合は、初期化命令群３００１では変数宣言のみを行ってもよい。なお、処理結果が変わらない限り、原処理命令群２０００に含まれている変数と異なる変数を宣言し、原処理命令群２０００に含まれる変数の代わりとして用いても構わない。さらに、初期化命令群３００１は、難読命令群３０００で用いる他の変数の宣言および必要であればその宣言の初期化も行う。このような変数の例としては、ブロック番号保持部から読み出した次に実行すべきブロックのブロック番号を格納する変数などが挙げられる。
【００４４】
選択命令群３００２は、次に実行を進めるべきを処理を処理Ａと処理Ｂのどちらにすべきかを決定する。本実施の形態では、処理Ａと処理Ｂのどちらを選択するかはランダムであるとする。また、選択命令群３００２は、選択した処理のブロックのうち、次に実行すべきブロックを、その選択した処理に対応するブロック番号保持部の保持するブロック番号を参照して決める。すなわち、処理Ａを選択した場合は、処理Ａのブロックのうち、ブロック番号保持部３０１Ａの保持する番号のブロックを選択する。また、処理Ｂを選択した場合は、処理Ｂのブロックのうち、ブロック番号保持部３０１Ｂの保持する番号のブロックを選択する。なお、選択した処理のブロックの実行が全て完了している時には、常に他方の処理のブロックを選択するものとする。また、いずれの処理についてもブロックの実行が全て完了している場合には、難読命令群３０００の実行を終了する。なお、本実施の形態では、各ブロック番号保持部には、そのブロック番号保持部に対応する処理のブロックの実行が全て終了すると、その旨を示す値が記録されるものとする。選択命令群３００２は、その値を参照することで、各処理のブロックが、全て実行完了しているかどうかを判断する。
【００４５】
選択対象命令群３００３は、原処理命令群に含まれていた処理Ａおよび処理Ｂのブロックそれぞれの集合である。ただし、各ブロックに対しては、ブロック番号が付与され、また、更新命令および分岐命令が追加されている。また、原処理命令群にループがある場合には、そのループを展開した状態のブロックが格納される。すなわち、本実施の形態では、ブロックＢ２、・・・Ｂ６と同一の内容を持つブロックは、ループの繰り替し回数の分だけ存在する。本実施の形態では、ループの繰り返し回数をＮとし、各繰り返し回数に対応するブロックを、Ｂ２−１・・・Ｂ２−Ｎ、・・・、Ｂ６−１、・・・、Ｂ６−Ｎと表して区別している。
【００４６】
各ブロックに追加される更新命令は、各ブロックが実現する処理（以下、各ブロックが属する処理とも呼ぶ）に対応するブロック番号保持部を更新する命令である。更新命令は、そのブロックが属する処理と同じ処理に属するブロックのうち、当該ブロックの次に実行すべきブロックのブロック番号を示すようブロック番号保持部の保持する値を更新する。例えば、処理ＡのブロックのうちブロックＡ１の次に実行すべきブロックはブロックＡ２であるので、ブロックＡ１に追加されている更新命令Ａ３１１は、ブロック番号保持部３０１Ａの保持するブロック番号を「Ａ２」に更新する命令である。同様に、ブロックＡ２に追加されている更新命令３１２Ａはブロック保持部３０１Ａの保持するブロック番号を「Ａ３」に更新する命令である。なお、ブロックＡ３は処理Ａを実現するブロックのうち最後のブロックであり、次に実行すべきブロックがない。そのため、ブロックＡ３に追加される更新命令３１３Ａは処理Ａを実現するブロックの全てが実行済みであることを示す値をブロック番号保持部３０１Ａに記録する命令となる。
【００４７】
処理Ｂの各ブロックに追加されている更新命令も、基本的には処理Ａのブロックに追加された更新命令と同様の処理を行う。ただし、処理Ｂを実現するブロックはループを有するので、以下の点で処理Ａの場合と異なる。上述の通り、選択対象命令群３００３中では、ループは展開されている。そのため、選択対象命令群３００３中には、ループの繰り返しの数だけループ内での最後のブロックＢ６（すなわち、ブロックＢ６−１・・・ブロックＢ６−Ｎ）が存在する。この場合、ブロックＢ６−１、・・・ブロックＢ６−（Ｎ−１）までの各ブロックについては、次に実行されるべきブロックは、次の繰り返しにおけるループ内での最初のブロックであるブロックＢ２−２、・・・ブロックＢ２−Ｎである。そのため、上記の各ブロックに追加される更新命令は、ブロック番号保持部３０１Ｂの保持するブロック番号を、次の繰り返しに対応するブロックＢ２のブロック番号である「Ｂ２−２」・・・「Ｂ２−（Ｎ−１）」に更新する。一方、ブロックＢ６−Ｎは繰り返しの最後であるので、次に実行されるべきブロックは、ループによる繰り返しが終わった後に実行されるべきブロックであるブロックＢ７である。そのため、ブロックＢ６−Ｎに追加される更新命令は、ブロック番号保持部３０１の保持するブロック番号を「Ｂ７」に更新する。上記のループに関する処理以外は、更新命令の行う処理は処理Ａを実現する各ブロックに追加された更新命令と同様である。
【００４８】
各ブロックに追加される分岐命令は、次に実行すべき命令群として選択命令群３００２へとジャンプする分岐命令である。本実施の形態では、いずれのブロックについても同じ飛び先を示す分岐命令が追加される。なお、この分岐命令は、上述した更新命令が行われた後で実行される。また、いずれのブロックについても飛び先は同一であるので、各ブロックに分岐命令を追加するのではなく、各ブロックの実行後に実行される１つの命令として実現してもよい。
【００４９】
なお、本実施の形態における更新命令および分岐命令は、単一の命令であってもよいし複数の命令の集合として構成されていても良い。
【００５０】
＜難読命令群３０００の動作説明＞
続いて、難読命令群３０００の動作について説明する。図４は、難読命令群３０００の動作を示した図である。
【００５１】
難読命令群３０００は、まず、初期化命令群３００１により、ブロック番号保持部３０１Ａ、ブロック番号保持部３０１Ｂに初期値を設定する。また、難読命令群３０００が用いる変数の宣言、および、必要であれば変数の初期化も行う。本実施の形態では、ブロック番号保持部３０１Ａには「Ａ１」が、ブロック番号保持部３０１Ｂには「Ｂ１」が記録される（ステップＳ４０１）。
【００５２】
続いて、選択命令群３００２が、処理Ａと処理Ｂのどちらの処理を進めるかをランダムに決定する。より具体的には、ブロック番号保持部３０１Ａとブロック番号保持部３０１Ｂのいずれを参照するかをランダムに決める（ステップＳ４０２）。選択したブロック番号保持部に、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値が保持されていれば（ステップＳ４０３のＹｅｓ）、選択命令群３００２は、他方のブロック番号保持部を確認する。確認したブロック番号保持部が、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値を保持していなければ、そのブロック番号保持部を参照すべきブロック番号保持部として選択し直す（ステップＳ４０４のＮｏ）。一方、選択されたブロック番号保持部が、そのブロック番号保持部に対応するブロックの全てが実行済みであることを示す値を保持していなければ（ステップＳ４０３のＮｏ）、参照すべきブロック番号保持部の選択は変更しない。そして、選択されているブロック番号保持部が記録しているブロック番号が示すブロックが実行される（ステップＳ４０６）。
【００５３】
一方、両方のブロック番号保持部が、それぞれに対応するブロックの全てが実行済みであることを示す値を保持していれば（ステップＳ４０４のＹｅｓ）、全ブロックの実行が完了しているので、難読命令群３０００は処理を終了する。
【００５４】
ステップＳ４０４で実行を指示されたブロックの処理が完了すると、そのブロック内の更新命令により、ブロック番号保持部３０１Ａまたはブロック番号３０１Ｂの値が更新される（ステップＳ４０７）。
【００５５】
その後、そのブロック内の分岐命令によって、処理がステップＳ４０２に戻される。
【００５６】
＜具体例＞
図５は、原処理命令群２０００の具体例をＣ言語を用いて記述したものである。なお、各命令ブロックの詳細については、発明の本質ではないので省略している。また、説明を簡単にするため、ブロックＢ１〜Ｂ５までの処理の繰り返し回数は２回としている。図５に示すとおり、原処理命令群では、各命令ブロックは図１に示した通りの実行順序で動作するプログラムとなっている。
【００５７】
図５に示した原処理命令群を変換して得られる難読命令群３０００の具体例が、図６および図７に示したプログラムである。以下、図６および図７に示した具体例について説明する。
【００５８】
初期化命令群３００１では、変数ｂｌｏｃｋ＿ｎｏ０および変数ｂｌｏｃｋ＿ｎｏ１を宣言することにより、各ブロック番号保持部を生成している。ここで、変数ｂｌｏｃｋ＿ｎｏ０が処理Ａの進行状況を管理する変数であり、処理Ａにおいて次に実行すべきブロックのブロック番号を保持する。変数ｂｌｏｃｋ＿ｎｏ１が処理Ｂの進行状況を管理する変数であり、処理Ｂにおいて次に実行すべきブロックのブロック番号を保持する。また、この具体例では、各変数に初期値「１」および「４」を代入している。この具体例では、選択命令群３００２における処理の分岐において、処理Ａおよび処理Ｂの両方ともで同一の変数ｓｗを使用する。そのため、各変数の値が重ならないよう、処理Ａに属する全ブロックの数「３」以上の差をつけた数で初期化する必要がある。なお、この具体例におけるブロック番号は、後述する選択対象命令群３００３においてＣ言語のｃａｓｅ命令による各ブロックの選択に使用している値である。この具体例では、変数ｓｗに次に実行すべきブロックのブロック番号を格納し、その番号に対応するブロックを実行することで処理を進めていく。なお、この具体例では、各ブロックの詳細は省略しているので、初期化命令群３００１における変数の宣言および初期化の命令についての具体例は省略している。
【００５９】
選択命令群３００２は、変数ｂｌｏｃｋ＿ｎｏ０と変数ｂｌｏｃｋ＿ｎｏ１の値に基づき、次に実行するブロックを選択し、選択した選択対象ブロックの識別子を変数ｓｗに格納する。選択命令群３００２の動作は、各ｂｌｏｃｋ＿ｎｏの値によって以下の４つの場合がある。
【００６０】
（１）ｂｌｏｃｋ＿ｎｏ０とｂｌｏｃｋ＿ｎｏ１がともに０の場合、すなわち、処理Ａの最後のブロックと処理Ｂの最後のブロックがともに終了している場合、「ｒｅｔｕｒｎ；」文により、難読命令群３０００の実行を終了する。
【００６１】
（２）ｂｌｏｃｋ＿ｎｏ０が０で、ｂｌｏｃｋ＿ｎｏ１が非０の場合、すなわち、処理Ａの全てのブロックの実行が終了し、処理Ｂのブロックの実行が終了していない場合、処理Ｂのブロックを選択する。つまり、ｂｌｏｃｋ＿ｎｏ１に格納されている、処理Ｂで次に実行するブロックの識別子を変数ｓｗに格納する。
【００６２】
（３）ｂｌｏｃｋ＿ｎｏ０が非０で、ｂｌｏｃｋ＿ｎｏ１が０の場合、すなわち、処理Ａの実行が終了しておらず、処理Ｂの全てのブロックの実行が終了している場合には、処理Ａのブロックを選択する。つまり、ｂｌｏｃｋ＿ｎｏ０に格納されている、処理Ａで次に実行するブロックの識別子を変数ｓｗに格納する。
【００６３】
（４）ｂｌｏｃｋ＿ｎｏ０が非０で、ｂｌｏｃｋ＿ｎｏ０１が非０の場合、すなわち、処理Ａおよび処理Ｂともに最後のブロックの実行が終了していない場合、次に進めるべき処理を処理Ａまたは処理Ｂのいずれにすべきかをランダムに選び、その処理を進める。ここでは、乱数「ｒａｎｄ（）」を生成し、それを２で割った余りが０であれば処理Ａを進め、１であれば処理Ｂを進めるとしている。そのため、余りが０の場合は変数ｓｗにｂｌｏｃｋ＿ｎｏ０の値が代入され、余りが非０の場合は変数ｓｗにｂｌｏｃｋ＿ｎｏ１の値が代入される。
【００６４】
選択対象命令群３００３は、原処理命令群２０００を構成する各ブロックが変換された複数のブロックから構成される。各ブロックにはブロック番号が割り当てられており、変数ｓｗの値がそのブロック番号と一致するブロックが実行される。また、各ブロックにはそのブロックが属する処理のうち、次に実行すべきブロックを指すよう、それぞれの変数ｂｌｏｃｋ＿ｎｏを更新する更新命令が含まれている。ただし、各処理のうち、最後に実行されるブロックにおいては、全てのブロックの実行が完了したことを示す値「０」が代入される。なお、この具体例では、分岐命令３２１Ａ〜３２３Ａおよび分岐命令３２１Ｂ〜３２７Ｂについては、ｗｈｉｌｅ（１）によるループが代わりを務めている。そのため、各ブロックに分岐命令は存在しない。また、ループを構成していたブロックＢ２〜Ｂ６についてはループが展開されている。この具体例では、ループの繰り返し回数Ｎは２であるとしている。そのため、処理Ｂに属するブロックの総数は、Ｂ１＋（Ｂ２〜Ｂ６）×２＋Ｂ７で１２個となる。
【００６５】
以上で、本発明に係る変換前後の処理命令群の具体例についての説明を終了する。
【００６６】
＜難読化装置の説明＞
続いて、原処理命令群を変換して難読命令群を生成する難読化装置８０００について説明する。図８は、難読化装置８０００の構成を示した図である。難読化装置８０００は、
入力部８０１、ブロック分割部８０２、ブロック番号付与部８０３、初期化命令生成部８０４、選択命令群生成部８０５、ブロック更新部８０６、命令統合部８０７、および出力部８０８から構成される。以下、それぞれの構成要素について説明する。
【００６７】
入力部８０１は、外部の記録媒体やネットワーク経由で原処理命令群２０００の入力を受け付ける。なお、難読化装置８０００内に原処理命令群２０００を保持している場合には、外部からではなく、難読化装置８０００内の他の構成要素から入力を受け付けても良い。
【００６８】
ブロック分割部８０２は、入力された原処理命令群２０００を分割し、各ブロックを生成する。ここで、ブロック分割部８０２は、ループの中に含まれるブロックについては、そのループを展開したブロックを生成する。すなわち、ループの繰り返し回数の分だけ、同一の内容をコピーしたブロックを生成する。また、ブロック分割部８０２は、ブロックを生成する際に、どのブロックが同じ処理に属するブロックであるかを分類し、その分類の数（すなわち、原処理命令群２０００内に存在する処理の数）を得る。本実施の形態では、各ブロックは処理Ａと処理Ｂのいずれかに分類されるので、分類の数は「２」となる。さらに、ブロック分割部８０２は、生成した各ブロックの、各分類の中における実行順序を示す実行順序情報を生成する。なお、本実施の形態では、難読化装置８０００は、ユーザからブロックの分割や分類の仕方を示す情報を与えられ、その情報に従って原処理命令群２０００の分割および分類を行うものとする。また、ユーザが手動で情報を与えるのではなく、分割や分類のヒントを与えるなどとしても良い。本実施の形態の場合、例えば、変数ｘが含まれているブロックは処理Ａのブロックであると判断し、他のブロックは処理Ｂのブロックであると判断することを示す情報を与えること等が考えられる。さらに、ユーザからの入力に頼らず、プログラムをブロックに分割する公知の手法を用いて原処理命令群を自動的に分割するとしても良い。なお、ブロックの分類についても同一の変数が使われているブロックについては同一の処理を実現するブロックとして分類するなどとすれば、ユーザの入力によらずに分類することができる。
【００６９】
ブロック番号付与部８０３は、ブロック分割部８０２が生成した各ブロックに対して、各ブロックを識別するブロック番号を付与する。なお、各ブロックが識別できる限り、ブロック番号の付与の仕方は任意でよい。また、本実施の形態では「ブロック番号」と呼んでいるが、ブロック番号は、数字以外の文字のみからなる情報であっても良い。
【００７０】
初期化命令生成部８０４は、初期化命令３００１を生成する。より具体的には、初期化命令生成部８０４は、ブロック分割部８０２が得た分類の数（本実施の形態では２つ）と同数のブロック番号保持部を作る命令を生成する。さらに、それぞれのブロック番号保持部に、各処理に属するブロックのうちの最初のブロックに付与されたブロック番号を記録する命令を生成する。また、初期化命令生成部８０４は、難読命令群３０００で用いる各変数の宣言および初期化の命令を生成する。変数宣言および初期化の命令は、原処理命令群２０００における変数宣言および初期化の命令を用いる。また、難読命令群３０００で使用するが、原処理命令群２０００に含まれていない変数があれば、その変数についての変数宣言および初期化の命令も生成する。このような命令の具体例としては、図６および図７で示した変数「ｓｗ」が挙げられる。そして、初期化命令生成部８０４は、生成したこれらの命令を合わせて初期化命令群３００１とする。
【００７１】
選択命令群生成部８０５は、選択命令群を生成する。より具体的には、初期化命令群３００１によって生成されるブロック番号保持部をランダムに選択する分岐命令を生成する。ここで、分岐の数は分類の数と同一となる。
【００７２】
ブロック更新部８０６は、各ブロックに対して更新命令および分岐命令を追加する。より具体的には、ブロック更新部８０６は、各ブロックに対して、各ブロック番号保持部にそのブロックの次に実行されるブロックを指すブロック番号を書き込む命令を生成し、それを更新命令とする。また、選択命令群に分岐する命令を生成し、それを分岐命令とする。さらに、ブロック更新部８０６は、各ブロックに対して、生成した更新命令および分岐命令を追加する。
【００７３】
命令統合部８０７は、更新命令と分岐命令とブロック番号が追加された各ブロックと、生成された初期化処理命令群および選択処理命令群を、難読命令群３０００を記述する言語の書式に合うよう統合して難読命令群３０００を生成する。
【００７４】
出力部８０８は、生成された難読命令群３０００を出力する。
【００７５】
＜難読化装置の動作説明＞
続いて、難読化装置８０００の動作を説明する。図９は、難読化装置８０００の動作を表すフローチャートである。
【００７６】
まず、難読化装置８０００は、入力部８０１により原処理命令群を受け付ける（ステップＳ９０１）。続いて、ブロック分割部８０２によって、原処理命令群をブロック毎に分割し、また、各ブロックの分類を行う（ステップＳ９０２）。
【００７７】
その後、ブロック番号付与部８０３によって、各ブロックにブロック番号を付与する（ステップＳ９０３）。
【００７８】
付与されたブロック番号と分類の数とをもとに、初期化命令群生成部８０４が初期化命令群を生成する（ステップＳ９０４）。より具体的には、分類の数だけのブロック番号保持部を生成する命令と、そのブロック番号保持部に各分類の中で最初に実行されるブロックの番号を格納する命令とを生成し、それらの命令を初期化命令群とする。
【００７９】
続いて、選択処理命令群生成部８０５が、選択処理命令群を生成する（ステップＳ９０５）。より具体的には、選択処理命令群生成部８０５は、ブロック番号保持部をランダムに選択する命令群を生成し、選択処理命令群とする。
【００８０】
さらに、ブロック更新部８０６が、各ブロックに対して更新命令と分岐命令を生成して追加する（ステップＳ９０６）。ここで追加される更新命令は、各ブロックそれぞれと同一の分類に属し、かつ、そのブロックの次に実行すべきブロックを示すブロック番号を、その分類に対応するブロック番号保持部に記録する命令である。また、追加される分岐命令は、選択処理命令群へと分岐する命令である。
【００８１】
最後に、命令統合部８０７によって、作られた各ブロックと、初期化命令群および選択命令群を、使用しているプログラミング言語のフォーマットに従って統合し、難読命令群を生成する。また、生成された難読命令群は、出力部８０８によって出力される（ステップＳ９０７）。
【００８２】
以上で実施の形態１の説明を終了するが、本発明はこれに限られるものではない。以下のような変形例も本発明に含まれる。
【００８３】
上記の実施の形態では、秘密情報は、データの復号化に使う鍵であるとしたが、これに限られるものではない。ただし、秘密情報はこれに限られるものではなく、他の装置との認証に使う情報や、映画などのコンテンツデータの利用権を示す情報、条件分岐に用いる変数、ユーザに提供する機能のオン／オフを切り替えるフラグ等であってもよい。すなわち、漏洩すると原処理命令群の提供者に不都合が起こる等の事情により、不正な解析者から秘匿しなくてはならない情報であればどのようなものであっても構わない。
【００８４】
＜実施の形態１の効果＞
実施の形態１では、ループを含む原処理命令群の難読化を行った。より具体的には、原処理命令群によって実現される各処理についての進行状況を管理するブロック番号保持部を設け、それぞれの処理の進行状況を個別に管理し、次に実行すべき処理をどちらにするかをこのブロック番号保持部の選択により実現した。これにより、原処理命令群がループなどを含む複雑な制御構造を持っていたとしても、それぞれの処理の実行状況を適切に把握しつつ、各ブロックの実行順序を入れ替えることができる。これにより、従来技術と比べ、より広い範囲で順序の入れ替えが可能となった。
【００８５】
（実施の形態２）
本発明の実施の形態２を説明する。実施の形態２では、原処理命令群にループおよび分岐が含まれる場合に、その原処理命令群を、分岐を狙った攻撃を防止できるよう変換した難読命令群、および、その変換を行う難読化装置について説明する。
【００８６】
＜実行ログ差分攻撃の説明＞
図１０および図１１を用いて、本実施の形態が想定している攻撃である「実行ログ差分攻撃」について説明する。
【００８７】
図１０（ａ）は、ループおよび分岐を含むプログラムである原処理命令群１００００を示したブロック図である。ここで、原処理命令群１００００は、実施の形態１と同様、１つ以上の処理命令からなる処理命令群である。原処理命令群１００００は、サービスの本体処理を実現するＢ２０〜Ｂ２９、使用制限チェック処理を実現するＡ１０〜Ａ１９、および、エラー処理を実現するＣ３０〜Ｃ３９からなる。なお、Ａ１０〜Ａ１９、Ｂ２０〜Ｂ２９、Ｃ３０〜Ｃ３９はそれぞれ１つ以上の命令が集まった命令群であり、原処理命令群を構成する各命令を処理のまとまり毎にブロック化したものである。
【００８８】
本体処理は、原処理命令群１００００が本来果たすべき処理であり、具体的には、デジタルコンテンツの再生処理や、表計算処理、文書処理、ゲーム処理等である。使用制限チェック処理は、プログラムが改ざんされていないかをチェックする処理である。使用制限チェック処理は、他にも、デジタルデータが改ざんされていないかをチェックする処理や、プログラムの使用者がライセンス・パスワードを知っているかを確認する処理であってもよい。エラー処理は、使用制限チェック処理の結果、プログラム等に改ざんがあると判断された場合に行うべき処理である。具体的には、プログラムの実行を停止したり、改ざんがあった旨および／または改ざんがあった箇所を外部のサーバ等に報告する処理である。なお、原処理命令群１００００では、改ざんの有無を変数ａの値で表している。すなわち、改ざんが検出されれば「ａ＝０」となり、改ざんが検出されなければ「ａ＝１」となる。ブロックＢ１９は分岐を含み、変数ａの値を参照することで、原処理命令群２０００に改ざんがあったか否かを判断し、以後の処理を本体処理もしくはエラー処理のどちらに進めるべきかを決定している。
【００８９】
図１１は、この原処理命令群１００００の動作を模式的に表したものである。
【００９０】
まず、ステップＳ１１１０において処理が開始する。続いて、ステップＳ１１２０で、原処理命令群１００００の本体処理を実行するか否かを判定するための使用制限チェック処理が実行される。より具体的にはＡ１９のブロックまで処理が進む。続いて、ステップＳ１１３０では、ステップＳ１１２０で行った使用制限チェック処理の結果の真偽を判定し、真（改ざんなし。本体処理の使用可）である場合にはステップＳ１１４０に分岐し、偽（改ざんあり。本体処理の使用不可）である場合にはステップＳ１１５０に分岐する。ステップＳ１１４０では、原処理命令群１００００の本体処理を実行する。これは、原処理命令群を構成するブロックのうち、Ｂ２０以下のブロックの処理を指す。また、ステップＳ１１５０では、入力命令群１３０の本体処理を実行しない場合のエラー処理を行う。これは、原処理命令群を構成するブロックのうち、Ｃ３０以下のブロックの処理を指す。そして、ステップＳ１１６０で、処理を終了する。
【００９１】
このような原処理命令群１００００を元に、実行ログ差分攻撃について図１２を用いて説明する。
【００９２】
実行ログ差分攻撃では、不正解析者は、まず、原処理命令群１１０を本体処理が実行される条件下で実行し、その際にどのブロックが実行されたかを順次、実行ログとして記録する。この結果、図１２の上段に示したような、各ブロックが「Ａ１０、…、Ａ１８、Ａ１０、…、Ａ１９、Ｂ２０、…、Ｂ２９」の順で実行されたことを示す実行ログが記録される。
【００９３】
次に、不正解析者は、本体処理が実行されない状況下で原処理命令群１００００を実行する。例えば、使用制限チェックが改ざんチェックの処理である場合には、改ざんチェックの対象を改ざんした上で原処理命令群１００００を実行する。そして、同様に実行ログを記録する。この結果、図１２の下段に示したような、各ブロックが「Ａ１０、…、Ａ１８、Ａ１０、…、Ａ１９、Ｃ２０、…、Ｃ２９」の順で実行されたことを示す実行ログが記録される。
【００９４】
このログを解析することにより、不正解析者はどこで処理の分岐が発生しているかがわかる。より具体的には、図１２に破線で示したように、Ａ１９の後で実行されるブロックが変化している。このことから、不正解析者は、実線で囲んでいるＡ１９が改ざんチェックを行い、処理を分岐させている命令ブロックであると推測することが出来る。
【００９５】
このような情報を得た、不正解析者は、そのブロックＡ１９を改ざんすることで、改ざんチェック処理を無効化しようと試みる。具体的には、Ａ１９の最後の条件分岐命令を常にブロックＢ２０に分岐する命令ブロックＸ１９に書き換える。
【００９６】
図１０（ｂ）は、原処理命令群１００００に上記の改ざんが行われた処理命令群である改ざんされた原処理命令群１０１００を示す図である。１０１００では、ブロックＸ１９は、改ざんチェックの結果に関わらず、常にブロックＢ２０に分岐する。そのため、１０１００は、改ざんを検出することが出来なくなり、常に本体処理を行うようになってしまう。
【００９７】
＜実行ログ差分攻撃への対策＞
上述した実行ログ差分攻撃は、分岐を行う処理命令群をなくし、一部のブロックを以下で説明する依存ブロックに変換することで回避することができる。以下、依存ブロックについて説明する。
【００９８】
依存ブロックは、分岐処理の後に実行されるブロック中の命令を、その分岐に使われる変数に依存した動作を行うよう変換した命令ブロックである。以下、図１３を用いて、依存ブロックについて説明する。
【００９９】
図１３は、原処理命令群１００００の命令「ｘ＝ｘ＋１０；」を含むブロックＢ２６を依存ブロックに変換して得られる命令群を示す図である。この命令群では、原処理命令群１００００におけるブロックＢ２６が、命令「ｘ＝ｘ＋１０；」を「ｘ＝ｘ＋ａ＋９；」と置き換えた依存ブロックＢ２６’に変換されている。これにより、Ａ１９までの改ざんチェック処理の結果に応じて、ブロックＢ２６’の動作が変化する。上述のように、原処理命令群では、改ざんチェックの結果、改ざんが検出された場合には変数ａの値に「０」を、改ざんが検出されなかった場合には変数ａに値を「１」を代入していた。そのため、ブロックＢ２６’では、使用制限チェックにより本体処理の実行が可と判断された場合には、変数ａに１が代入され、Ｂ２６’における「ｘ＝ｘ＋ａ＋９；」が「ｘ＝ｘ＋１＋９；」となる。よって、Ｂ２６’ではＢ２６と同じ処理が行われることとなる。
【０１００】
逆に、使用制限チェック処理の結果、本体処理の実行が否と判断された場合、使用制限チェック処理の結果が格納される変数ａに０が代入され、Ｂ２６’における「ｘ＝ｘ＋ａ＋９；」は、「ｘ＝ｘ＋０＋９；」となる。よって、Ｂ２６’はＢ２６と異なる処理となる。その結果、プログラムの改ざんが検出されると、使用制限一体型処理命令群１１０は正常に動作しなくなる。したがって、改ざんチェックの結果による分岐をなくしているにも関わらず、プログラムの利用制御を適切に行うことが出来る。さらに、プログラム中から改ざんチェック処理の結果に依存する分岐を削除しているので、実行ログ差分攻撃によってどのブロックが改ざんチェックの処理を行っているのかを分かりにくくすることが出来る。
【０１０１】
なお、依存ブロックの例は、この具体例に限らない。すなわち、本体処理の一部のブロックを、使用制限チェックの結果に依存させるように変換し、使用制限チェックの結果が使用可の場合にのみ本体処理が実行されるようにできるのであれば、どのような変換であっても構わない。
【０１０２】
例えば、変数に代入する値の計算を依存化する以外にも、変換前の命令がテーブル引き命令「ｘ＝ｔａｂｌｅ［ｙ］；」の時に、「ｘ＝ｔａｂｌｅ［ｙ＋ａ−１］；」としても構わない。
【０１０３】
また、使用制限チェックの結果は、複数の変数間の関係に隠蔽しても構わない。この場合、依存ブロックは、この複数の変数間の関係に依存するようにする。例えば、原処理プログラムで使用されていない変数を変数Ｖ１、Ｖ２とし、Ｖ１の値からＶ２の値を引くと使用制限チェックの結果が求まるように難読化しておく。すなわち、ブロックＸ１９の最後に「Ｖ１＝ｒａｎｄ（）；Ｖ２＝Ｖ１−ａ；」を追加しておく。このとき、Ｖ１の値がどのような値であっても「Ｖ１−Ｖ２」はａと等しい値となる。そこで、ブロックＢ２６の「Ｘ＝Ｘ＋１０；」を「Ｘ  ＝Ｖ１＋Ｘ  −Ｖ２＋９；」に変換することで依存ブロックＢ２６’を生成する。
【０１０４】
このような変換を行わない場合では、使用制限チェックが使用可な場合、依存処理命令群において変数ａの値が常に「１」で、使用不可の場合に、依存処理命令群において変数ａの値が常に「０」である。よって、不正解析者は、使用制限の可否によって０、１が逆になる変数が含まれる処理命令を見つけることで依存処理命群を見つけ出すことができた。一方、前記の場合では、Ｖ１、Ｖ２の値が毎回異なるので、上記の攻撃を用いても依存処理命令群を見つけだすことが出来ない。
【０１０５】
＜依存ブロックを含む命令の難読化＞
上記のように、原処理命令群１００００を依存ブロックを含んだ命令群に変換することで条件分岐命令をなくし、かつ、条件分岐命令がある場合と同等の結果を得ることができる。しかし、この場合でも、例えば改ざんチェックの処理にループが含まれている場合には、改ざんチェックとその他の命令群との境界がどこであるか、大まかに推測することができてしまう。
【０１０６】
そこで、上記の変換によって条件分岐をなくした命令群を実施の形態１に記載の手法によって更に難読化することが望ましい。難読命令群の動作および原処理プログラムの難読命令群への変換の手順は、実施の形態１と同様である。
【０１０７】
ただし、実施の形態２では、実施の形態１と異なり、処理の実行順序をランダム化する場合に以下の制限が発生する。上述の通り、依存ブロックは、そのブロックよりも前の処理によって定まる変数の値に依存した動作をする。そのため、依存ブロックが、その依存ブロックが依存している変数の値に予期していた値が代入される前に実行されてしまうと、依存ブロックが正しく動作することが保証できなくなってしまう。そこで、依存ブロックは、その依存ブロックが依存している変数の値を確定させる処理よりも後に実行する必要がある。例えば、本実施の形態では、使用制限チェックの処理によって変数ａの値が定まり、依存ブロックＢ２６’はその値に応じた動作をする。そのため、依存ブロックＢ２６’を、使用制限チェックの処理が終了する前に実行してしまうと、依存ブロックＢ２６’が実行される時点におけるａの値が予期していた値（本実施の形態では「１」）とならない可能性がある。そこで、依存ブロックＢ２６’を使用制限チェックの後にのみ実行されるよう、選択命令群３００２の内容を変更する必要がある。より具体的には、実施の形態２における選択命令群３００２は、本体処理に対応するブロック番号保持部の値が依存ブロックＢ２６’を指す番号となっている場合には、本体処理の進行を止め、使用制限チェックの処理を進めるような命令群とする必要がある。
【０１０８】
図１４は実施の形態２に係る難読命令群１４０００の例を示した図である。ここで、実施の形態１と同様の構成については、実施の形態１と同じ符号を付して詳細な説明を省略する。
【０１０９】
難読命令群１４０００は、実施の形態１に係る難読命令群３０００と選択命令群１４００２の内容が異なる。
【０１１０】
選択命令群１４００２は、変数ｂｌｏｃｋ＿ｎｏ０と変数ｂｌｏｃｋ＿ｎｏ１の値に基づき、次に実行するブロックを選択する命令群であり、選択した選択対象ブロックの識別子を変数ｓｗに格納する。選択には以下の５つの場合がある。
【０１１１】
１）ｂｌｏｃｋ＿ｎｏ０とｂｌｏｃｋ＿ｎｏ１がともに０の場合、すなわち、使用制限チェックの最後の処理と本体処理の最後の処理がともに終了している場合、「ｒｅｔｕｒｎ；」文により、難読命令群１４０００の実行を終了する。
【０１１２】
２）ｂｌｏｃｋ＿ｎｏ０が０で、ｂｌｏｃｋ＿ｎｏ１が非０の場合、すなわち、使用制限チェックの最後の処理が終了し、本体処理の最後の処理が終了していない場合、本体処理のブロックを選択する。つまり、ｂｌｏｃｋ＿ｎｏ１に格納された本体処理で次に実行するブロックの識別子を変数ｓｗに格納する。
【０１１３】
３）ｂｌｏｃｋ＿ｎｏ０が非０で、ｂｌｏｃｋ＿ｎｏ１が依存ブロックのブロック番号を示している場合、すなわち、使用制限チェックの最後の処理が終了しておらず、本体処理の次に実行する処理が依存ブロックである場合には、使用制限チェックのブロックを選択する。依存ブロックは、使用制限チェックの結果に依存する処理であるため、使用制限チェックの処理を先に終わらせる必要があるからである。つまり、ｂｌｏｃｋ＿ｎｏ０に格納された使用制限チェックで次に実行するブロックの識別子を変数ｓｗに格納する。なお、使用制限チェックの処理が全て終了するとｂｌｏｃｋ＿ｎｏ０が０となり、ｂｌｏｃｋ＿ｎｏ１は非０（すなわち依存ブロックのブロック番号）となるので、上記の２）により依存ブロック以降の処理が再開されることとなる。
【０１１４】
４）その他の場合、すなわち、使用制限チェックの最後の処理が終了しておらず、本体処理が依存ブロックに達していない場合、使用制限チェックまたは本体処理のいずれかのブロックを実行する。ここでは、乱数を生成し、生成した乱数の値に基づき、ランダムにどちらかを選択する。
【０１１５】
また、本実施の形態では、実施の形態１と異なり、選択対象命令群１４００３内ブロックはループを展開したものとはしていない。その代わり、ループの最後に当たるブロック（本実施の形態ではブロックＡ１８）の更新命令に、当該ブロックが実行された回数に応じて分岐を設けることでループの動作を実現している。以下、本実施の形態に沿って説明すると、ブロックＡ１８が繰り返し回数であるＮ回実行されるまでは、ブロックＡ１８の次に実行されるブロックはＡ１０である。また、Ｎ回実行されると、ブロックＡ１８の後には、ループの後に続くブロックＡ１９が実行される。そのため、ループを実現するためには、ブロックＡ１８が自身の実行された回数を記録しておき、Ｎ回に達するまではブロック番号保持部１４０１Ｂにループの最初にあたるブロックＡ１０を示すブロック番号を、Ｎ回に達するとブロックＡ１９を示すブロック番号を格納させればよい。なお、ループのブロック番号を数えるための記憶領域の確保は、どのようにして行っても良いが、本実施の形態では初期化命令群１４００１がこの領域の確保を行うものとして説明を行う。ただし、予め領域を確保しておき、その領域を利用するとしてもよい。
【０１１６】
本実施の形態も、実施の形態１と同様、本体処理の進行状況をブロック番号保持部１４０１Ｂで管理しているので、各処理間でのブロックの実行順序の入れ替えをループの内外を問わずに行うことができる。
【０１１７】
＜具体例＞
図１５は、本実施の形態に係る原処理命令群の具体例をＣ言語を用いて表したものである。ただし、図１５に示した原処理命令群は、すでに分岐命令を削除し、ブロックＢ２６を依存ブロックＢ２６’に変換した後のものである。なお、ブロックＡ１０・・・Ａ１８までのループの回数は２回としている。
【０１１８】
図１６および図１７は、図１５に示した命令群を難読化した難読命令群１４０００の具体例である。基本的な構成は実施の形態１に係る難読命令群３０００と同様であるが、以下で説明する各命令群が異なっている。
【０１１９】
初期化命令群１４００１は、基本的には難読命令群３０００の具体例と同様である。ただし、実施の形態２では、ループを展開せずに処理しているため、ループの繰り返し回数を数える変数についての宣言を省略することはできない。なお、各ブロックで必要な他の変数については、実施の形態１と同様、変数宣言および初期化の例を省略している。
【０１２０】
選択命令群１４００２は、上述の通り、４つのパターンを実現する条件分岐命令から構成されている。なお、本具体例では、ブロックＢ２６’のブロック番号を「２６」としているため、ｂｌｏｃｋ＿ｎｏ１が「２６」であるか否かによって分岐が生じている。
【０１２１】
ブロックＡ１８内の更新命令は、ループの動作を実現するため、条件分岐命令を絡めて構成されている。すなわち、Ｎ回の繰り返しが実行されれば、ｂｌｏｃｋ＿ｎｏ０にループを抜けた次のブロックであるＡ１９のブロック番号「１９」を代入する。また、Ｎ回の繰り返しが実行されるまでは、ｂｌｏｃｋ＿ｎｏ０にループの先頭であるＡ１０のブロック番号「１０」を代入する。この制御により、ループの処理を実現することが出来る。
【０１２２】
他の命令群の構成については、実施の形態１と同様であるので説明を省略する。
【０１２３】
＜難読化装置の説明＞
図１８は、原処理命令群１００００を難読命令群１４０００に変換する難読化装置１８０００の構成を示した図である。難読化装置１８０００は、基本的には実施の形態１の難読化装置８０００と同様の構成であるので、同等の機能を実現する部分については図８と同一の符号を付し、説明を省略する。
【０１２４】
ブロック分割部１８０２は、入力された原処理命令群１００００を分割し、各ブロックを生成する。基本的な動作は実施の形態１と同様であるが、ループは展開せず、ループの先頭のブロックとループの末尾のブロック、および、そのループの繰り返し回数を示す情報を生成する点が異なる。
【０１２５】
依存化部１８０９は、受け取った命令群を依存ブロックを含む命令群に変換する。本実施の形態では、ブロックに分割された命令群から条件分岐命令を削除する。また、依存化部１８０９は、本体処理の一部のブロックをその条件分岐命令が分岐の判断に用いていた変数に依存する依存ブロックに変換する。
【０１２６】
初期化命令生成部１８０４は、初期化命令群を生成する。基本的な動作は実施の形態１と同様である。ただし、前述の通り、ループの繰り返し回数をカウントするために用いる変数の宣言を省略することはできない。
【０１２７】
選択命令群生成部１８０５は、選択命令群を生成する。基本的な動作は実施の形態１と同様であるが、依存ブロックまで本体処理の命令が進んだ時に使用制限チェックの処理を先に終わらせるための命令、すなわち、上記の条件が満たされた場合に使用制限チェックに対応するブロック番号保持部を選択し続けるよう、選択命令群を生成する必要がある点が異なる。
【０１２８】
ブロック更新部１８０６は、各ブロックに対して更新命令および分岐命令を生成して追加する。ここで、ループの最後のブロックについては、当該ブロックがループの繰り返し回数だけ実行されればループを抜け、それまではループの最初のブロックに戻るような更新命令を生成して追加する。具体的には、以下のような機能を持つ命令を更新命令として追加する。すなわち、更新命令は、当該ブロックがループの繰り返し回数だけ実行されれば、そのブロックが属する処理に対応するブロック番号保持部にそのループの後で実行されるブロックのブロック番号を格納する。その他の場合は、ループの最初のブロックのブロック番号を格納し、繰り返し回数のカウントを１つ増やす。
【０１２９】
その他の構成は実施の形態１と同様であるので詳細な説明を省略する。
【０１３０】
また、上記の違い以外は、実施の形態１と同様の動作を行うので、難読化装置１８０００についての動作説明は省略する。
【０１３１】
以上で実施の形態２の説明を終了するが、本発明はこれに限られるものではない。以下のような変形例も本発明に含まれる。
【０１３２】
実施の形態２では、条件分岐命令の処理に使う変数に依存化させたブロックを含む命令群を対象として難読化を行った。しかし、これに限られるものではない。例えば、命令群によっては、複雑に変数の参照が絡み合っており、互いに変数を参照しない独立した処理同士を分類することが難しい場合がある。このような場合、命令群の行う処理を、一部の変数を互いに若しくは一方的に参照する複数種類の処理に分類し、その変数を含むブロックを依存ブロックとして実施の形態２と同様の選択命令群を生成すれば、処理の実行順序を複雑化することが出来る。この場合も、他の処理の変数を参照するブロックは、その変数の内容が確定するまで実行を待たされることとなる。
【０１３３】
また、実施の形態２では、依存ブロックは使用制限チェックの処理全てが完了してからしか実行できないものとしていたが、これに限られるものではない。依存ブロックの実行を待たせる理由は、変数ａの内容が確定しないためである。そのため、使用制限チェックの処理の途中で変数ａの値が確定することが原処理命令群の解析等により分かっていれば、依存ブロックの実行を待たせるのは、変数ａの値が確定するブロックの実行が終わるまででよい。
【０１３４】
＜実施の形態２の効果＞
実施の形態２の難読命令群１４０００では、使用制限チェックの処理における分岐命令がなくなっている。よって、不正解析者が、使用制限チェックの分岐命令を無条件分岐命令に置き換える改ざんを行おうとしても、そのような改ざんを行うことが出来ない。
【０１３５】
更に、実施の形態２では、命令群にループが含まれる場合であってもブロックの実行順序を解析しにくくしている。図１９は、乱数が０、１交互に生成される場合の実行ログを示す図であり、左上、右上、左下、右下の順で各ブロックの実行ログを示している。この図に示すように、難読命令群１４０００でば、使用制限チェックの処理がループを含むプログラムである場合においても、使用制限チェックの処理と本体処理が入れ替わり実行されることとなり、プログラムの解析が困難になる。
【０１３６】
以下、より具体的に説明する。不正解析者が、１ブロックずつ順番にブロックを理解しながら解析することを考える。このような解析を行う場合、実行順序の入れ替えをしていなければ、不正解析者は実行ログ（Ａ１０、Ａ１１、・・・、Ａ１９）の１０個のブロックを理解すれば、使用制限チェックの動作を完全に理解することが出来る。
【０１３７】
これに対し、本発明の難読命令群８０００では、実行ログは（Ａ１０、Ｂ２０、Ａ１１、Ｂ２１、・・・、Ａ１９）となる。この実行ログは、Ａ１０〜Ａ１９の１０個のブロックと、Ｂ２０〜Ｂ２５の６個のブロックからなり、計１６個のブロックからなる。ここで、Ｂ２０〜Ｂ２５は、本体処理の最初のブロックから、依存ブロックの一つ前のブロックまでの個数である。
【０１３８】
このことから分かるように、実行順序の入替を行ったことで、不正解析者が、理解しながら解析しなければならないブロック数が６つ増加している。そのため、不正解析者にとっては増加したブロックの数だけ、理解しなくてはならないブロック数が増えることとなり、より解析が困難になる。なお、この例は、不正解析者が解析しなければならないブロック数が６個しか増加しない例となっているが、一般に本体処理には多数のブロックが含まれているため、実際のシステムでは不正解析者が解析をしなくてはならないブロックは非常に多くに増加することとなる。
【０１３９】
また、この例では、使用制限チェックの処理のブロック数と本体処理のブロック数の関係から図１９の下段では実行順序に偏りが出ており、不正解析への対策としては多少不十分となっている。しかし、実際のシステムでは、乱数列は０、１が交互となる可能性は低いのでより分散された実行ログが得られることとなる。また、本体処理に本体処理と同様の変数を使うものの結果に影響しない処理を行う（または処理の実行自体がされない）ダミーのブロックを追加してブロック数を増加させたり、処理の分類時にループの繰り返し回数も含めて数えたブロック数がなるべく均等になるよう分類の仕方を工夫することで、より解析しにくいログが得られるような難読命令群を生成することが可能となる。
【０１４０】
（その他変形例）
なお、本発明を上記実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０１４１】
（１）実施の形態２では、ループが何回実行されているかによって分岐先が異なる原処理命令群の難読化を示したが、これに限るものではない。例えば、条件分岐命令を含む原処理命令群に対し、実施の形態２と同様に、条件分岐命令を含むブロックに各分岐の条件対応する更新命令と分岐命令の組を複数設けることで難読化することができる。
【０１４２】
（２）上記の実施の形態１および２では、どの処理の実行を進めるべきかをランダムに決定していたが、これに限られるものではない。例えば、所定の数列にしたがって選択するなどとしてもよい。ただし、この場合、数列の内容が不正解析者に理解されてしまうと解析が容易になってしまう。そのため、この数列についての情報は耐タンパ化した記録手段に記録するなどとして安全に保護する必要がある。
【０１４３】
また、上記の実施の形態１および２では、どの処理の実行を進めるべきかを選択するタイミングで乱数を生成し、その乱数に基づいてランダムな選択を実現していた。しかし、どの処理の実行を進めるべきかをランダムに選択する方法はこれに限られるものではない。例えば、難読命令群の実行開始時に乱数列を生成し、その乱数列に従ってどの処理の実行を進めるべきかを選択するとしても良い。
【０１４４】
また、上記の実施の形態１および２では、どの処理の実行を進めるべきかをランダムに決定していたが、原処理命令群に含まれる変数の値によって決定する構成としても構わない。また、どの処理を進めるべきかの決定の際に、原処理命令群に含まれる複数の変数のうち、いづれの変数の値を用いるかをランダムに決定する構成としても構わない。
【０１４５】
また、乱数を生成する処理を選択命令群に配置する変わりに、各ブロックに乱数を生成する処理を行わせても良い。この場合、乱数を格納する変数を設け、それぞれ（あるいは一部）のブロックにその変数に値を格納する処理を追加し、選択処理命令群ではその変数の値に基づいて実行する処理を決定する。また、難読化の際に各ブロックが変数に格納すべき乱数の値を決めておき、ブロックに決定した値をその変数に格納する処理を追加する構成としても構わない。更にまた、変数に格納する値はランダムに決定せずに、所定のルールに基づいて決定しても構わない。
【０１４６】
上記の実施の形態１および２では、ブロック番号保持部３０１Ａとブロック番号保持部３０１Ｂをそれぞれ別々の変数として示したが、一つの変数に両方の値を格納しても構わない。例えば、一つの変数の上位８ビットに処理Ａの番号を格納し、下位８ビットに処理Ｂの番号を格納しても構わない。また、更新命令は、ブロック番号保持部に値を代入する命令には限らない。例えば、ブロック番号保持部にどのような値が入っている場合にどのような値に変換するかを示すテーブルによって実現される構成であっても構わない。この場合、テーブルの値を暗号化等で変換して格納することで保護する構成であることが望ましい。このようなテーブルを用いる場合には、全ての更新テーブルは同一のテーブルを引く事になる。したがって、実施の形態１および２のように各ブロックが個別に更新命令を含むのではなく、全体で一つの更新命令を設け、各ブロックを実行した後に、その更新命令を実行する構成としても構わない。
【０１４７】
また、選択命令群が次に実行すべきブロックを決める処理についても、テーブルを用いて実現することができる。具体的には、ブロック番号保持部にどのような値が入っている場合に、どこに分岐するかを示すテーブルを保持しておく。そして、選択命令群を、選択した処理に対応するブロック番号保持部に入っている値を参照してテーブルを引くような命令とすればよい。
【０１４８】
（３）上記の実施の形態１および２では、プログラム記述言語はＣ言語であるとしていた。しかし、これに限られるものではなく、原処理命令群や難読命令群は他のプログラミング言語で記述されたものであるとしてもよい。また、原処理命令群と難読命令群とが同一のプログラム記述言語で記述されている必要はない。例えば難読化装置にコンパイラを内蔵し、難読化した上で別の言語にコンパイルするなどとしてもよい。
【０１４９】
（４）上記の実施の形態１および２では、選択命令群において全ての処理が実行されたか否かを判断していたが、これに限られるものではない。例えば、選択対象命令群を構成する各ブロックから各処理がどの程度進んでいるかを確認させ、全ての処理が完了していればその時点で実行を終了するとしてもよい。これは、各ブロックを、当該ブロックからブロック番号保持部を参照して処理が完了しているか否かの実行状況（上記の例では値が「０」であるか）を確認するようにすれば実現できる。
【０１５０】
（５）上記の実施の形態１および２では、本発明を、難読命令群に基づいて説明したが、これに限られない。例えば、難読命令群の動作の一部または全体をハードウェア的に実現した処理装置も本発明に含まれる。
【０１５１】
図２０は、実施の形態１に係る難読命令群８０００と同等の動作を行う処理装置の例である。難読命令群８０００の説明と同じ構成要素については同一の番号を付し、説明を省略する。
【０１５２】
初期化部２０００１は、初期化命令群３００１と同様の動作を行う。具体的にはブロック番号保持部３０１Ａとブロック番号保持部３０１Ｂの値の初期化を行う。なお、難読命令群の動作を情報処理装置として実現する場合は、ブロック番号保持部は予め領域が確保されていてもよいし、ワーキングメモリ上に初期化部の処理によって領域を確保しても良い。
【０１５３】
選択部２０００２は、選択命令群３００２と同様の動作を行う。すなわち、選択部２０００２は、処理Ａと処理Ｂのどちらの処理を進めるかをランダムに選択する。より具体的には、参照すべきブロック番号保持部をブロック番号保持部３０１Ａとするかブロック番号保持部３０１Ｂとするかを選択する。そして、後述する実行部２０００４に対して、選択したブロック番号保持部が保持しているブロック番号に対応するブロックを実行するよう指示する。
【０１５４】
命令保持部２０００３は、原処理命令群から生成された各ブロックを、そのブロックを識別する番号と対応付けて記録している。記録される各ブロックは実施の形態１と同様である。なお、この例では、選択部２０００２に対する次のブロックの選択の指示は、後述する実行部２０００４が行うこととしているので、各ブロック内に分岐命令はない。
【０１５５】
実行部２０００４は、具体的にはＣＰＵ等であり、プログラムを実行する機能を持つ。実行部２０００４は、選択部２０００２から通知されたブロック番号に対応するブロックを命令保持部２０００３から読み出して実行する。また、その実行が完了すると、選択部に対して次に実行すべきブロックの選択を要求する。
【０１５６】
以上で情報処理装置２００００についての説明を終了する。
【０１５７】
なお、情報処理装置２００００の動作は難読命令群３０００の動作と同様となるので説明を省略する。
【０１５８】
また、実施の形態２に係る難読命令群１８０００と同等の動作を行う処理装置およびその動作については、上記の構成の一部を難読命令群１８０００に合わせて変形するのみであるので説明を省略する。
【０１５９】
（６）上記の実施の形態１ではループを展開し、また実施の形態２ではループをループのままで選択対象命令群としていた。しかし、これに限られるものではない。実施の形態１でもループをループのままで選択対象命令群としてもよいし、実施の形態２でもループを展開するとしても良い。この変形例は、ループをそれぞれの実施の形態と同様に処理することで実現することができる。
【０１６０】
（７）上記の実施の形態１および２では、実行すべき処理の種類は２種類の例を示した。しかし、これに限られるものではなく、処理の種類を３種類以上であるとしてもよいことは言うまでもない。この場合、生成すべきブロック番号保持部の数がその処理の数だけ増える。また、選択命令群による選択肢がその処理の種類数だけ増える。なお、いずれかの処理に属するブロックの実行が全て完了した場合には、選択命令群３００２は、まだ実行が完了していない処理をランダムに選択することとなる。
【０１６１】
（８）上記の実施の形態１では処理Ａと秘密情報を用いる処理Ｂ、実施の形態２では本体処理と使用制限チェックの処理との間での実行順序の入れ替えを行うとしたが、これに限られるものではない。命令群が行う動作を複数個の処理に分類できるのであれば、どのような命令群に対しても本発明は適用できる。
【０１６２】
また、上記の実施の形態１および２では、１つの原処理命令群を難読化した例を示したが、これに限られるものではない。各処理それぞれを行う複数の原処理命令群が与えられた場合にも、本発明を適用することができる。なお、この場合、与えられた原処理命令群の数を処理の分類の数とすることができるので、分類の数を調べる処理を省略するとしてもよい。ただし、複数の原処理命令群が与えられた場合であっても、それぞれの原処理命令群を更に細かい処理に分けた上で、本発明を適用しても良いことは言うまでもない。
【０１６３】
（９）上記の実施の形態１および２では、各ブロック番号保持部は次に実行すべきブロックのブロック番号を保持しているとしたが、これに限られるものではない。例えば、各処理におけるブロックの実行順序を知ることができるのであれば、既に実行したブロックのブロック番号を保持しておいても良い。この場合、過去に実行したブロックのブロック番号から次に実行すべきブロックの番号を特定することができるので、次に実行すべきブロックの番号自体は保持しておかなくともよい。この場合、各ブロックの更新命令は、そのブロックのブロック番号をブロック番号保持部に格納する構成となる。
【０１６４】
なお、ブロックの実行順序を示す情報を知る方法は、予め難読命令群の中に保持しておいたり、外部から取得したりと、様々なものが考えられる。ただし、この情報自体が不正解析によって盗まれてしまうと安全性が大きく低下することとなるので、安全に保持および取得できることが望ましい。
【０１６５】
また、各ブロック番号保持部が保持するブロック番号の更新も各ブロックから行う必要はない。ブロック番号保持部が保持するブロック番号を参照して次に実行すべきブロックが確定した後であれば、いつ更新されても良い。例えば、各処理におけるブロックの実行順序が分かるのであれば、選択命令群の実行が終わった直後に更新することなどが考えられる。また、順序については上述した変形例（２）と同様、テーブルで保持することが考えられる。すなわち、選択命令群が得た実行すべきブロックのブロック番号と、各ブロック番号保持部に保持させるブロック番号とを対応付けたテーブルを保持しておくことが考えられる。この場合、全体で一つの更新命令を設け、選択命令群を実行した後に、そのテーブルを引く更新命令を実行すること等が考えられる。
【０１６６】
（１０）上記の実施の形態１および２では、ブロック番号保持部は、処理の数と同数だけ生成するとしたが、これに限られるものではない。各処理について複数のブロック番号保持部を用いてもよいし、解析を困難にするために使用されないダミーのブロック番号保持部を追加するなどとしてもよい。
【０１６７】
（１１）上記の実施の形態１および２では、常にいずれかの処理を選択するとしていたが、それに限られるものではない。例えば、実行結果に影響を与えないダミーの処理を実現するダミーのブロックを用意しておき、そのダミーの処理も含めてどの処理を進めるべきかを決定するとしてもよい。このようにすることで、不正解析者は意味のないブロックまでも理解しつつ解析を行うこととなるので更に解析を困難にすることができる。
【０１６８】
（１２）上記の実施の形態１および２で説明した各処理では、各処理の途中結果を格納する変数が異なることがある。実施の形態２を例に説明すると、使用制限チェックのブロックＡ１０〜Ａ１９では、変数ｖａｒ＿ｃ１〜ｖａｒ＿ｃ３が用いられ、本体処理のブロックＢ２０〜Ｂ２５では、別の変数ｖａｒ＿ｂ１〜ｖａｒ＿ｖ３が用いられている場合がある。このような場合、不正解析者は、それぞれのブロックで使用されている変数を調べ、変数ｖａｒ＿ｃ１〜ｖａｒ＿ｃ３が使用されているブロックのみを抽出することで使用制限チェックの処理を抽出する攻撃を行うことが考えられる。このようにして抽出されたブロックは、使用制限チェックのブロックである１０個のブロックとなる（Ａ１０〜Ａ１９）。よって、不正解析者は抽出した使用制限チェックのブロックである１０個のブロックのみ理解しながら解析を行い、使用制限チェックを無効化する改ざんを考え付く可能性がある。そこで、このような攻撃を防止するために、実施の形態１および２で示した難読化の手法に加え、恒等式を用いた変換を用いて、このような改ざんを困難にすることが考えられる。
【０１６９】
例えば、本体処理のブロックＢ２１が、処理命令「ｖａｌ＿ｂ１＝ｖａｌ＿ｂ２＾ｖａｌ＿ｂ３；」であるとする。ここで、＾は排他論理和を示す。これをａ＾ｂ＾ａのような常にｂと等しくなる恒等式を用いて変換する。すなわち、ｂに「ｖａｌ＿ｂ２＾ｖａｌ＿ｂ３」とし、ａを使用制限チェックで用いる変数ｖａｌ＿ｃ１とすると、使用制限チェックのブロックで使用される変数ｖａｌ＿ｃ１が本体処理のブロックＢ２１でも使用されることになる。これによって、各ブロックで使用される変数に基づいて、そのブロックが使用制限チェックのブロックであるか、本体処理のブロックであるかの判定が困難になる。なお、使用制限チェックのブロックについても、同様に、本体処理ブロックで使用されている変数ｖａｌ＿ｂ１〜ｖａｌ＿ｂ３を用いた処理に変換することでより解析を困難にすることが出来る。
【０１７０】
また、ここでは恒等式を使用して各ブロックで使用する変数を変える方法を示したが、一般に知られている他の難読化手法を用いて、各ブロックで使用する変数を変えても構わない。
【０１７１】
（１３）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。なお、各装置は、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどの全てを含むコンピュータシステムには限らず、これらの一部から構成されているコンピュータシステムであってもよい。
【０１７２】
（１４）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。
【０１７３】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていても良いし、一部又は全てを含むように１チップ化されてもよい。
【０１７４】
また、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０１７５】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適用等が可能性としてありえる。
【０１７６】
（１５）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０１７７】
（１６）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
【０１７８】
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。
【０１７９】
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
【０１８０】
また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【０１８１】
また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
【０１８２】
（１７）上記実施の形態および上記変形例をそれぞれ組み合わせるとしてもよい。
【産業上の利用可能性】
【０１８３】
本発明に係るプログラムは、不正解析者による解析が困難な形をしているので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。また、本発明に係るプログラム難読化装置は、暗号鍵などの秘密情報を扱うプログラムを、より解析が困難な形に変換することが出来るので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。
【図面の簡単な説明】
【０１８４】
【図１】従来技術の課題を説明する図
【図２】原処理命令群２０００の例を示す図
【図３】難読命令群３０００の例を示す図
【図４】難読命令群３０００の動作を示すフローチャート
【図５】原処理命令群２０００の具体例を示す図
【図６】難読命令群３０００の具体例を示す図
【図７】難読命令群３０００の具体例を示す図
【図８】難読化装置８０００の構成図
【図９】難読化装置８０００の動作を示すフローチャート
【図１０】実行ログ差分攻撃前後のプログラムの例を示す図
【図１１】原処理命令群１００００の動作を説明する図
【図１２】実行ログ差分攻撃の例を示す図
【図１３】依存ブロックを含む命令群の例を示す図
【図１４】難読命令群１４０００の例を示す図
【図１５】原処理命令群１００００の具体例を示す図
【図１６】難読命令群１４０００の具体例を示す図
【図１７】難読命令群１４０００の具体例を示す図
【図１８】難読化装置１８０００の構成図
【図１９】難読命令群１４０００の実行ログを示す図
【図２０】情報処理装置２００００の構成図
【符号の説明】
【０１８５】
２０００、１００００  原処理命令群
３０００、１４０００  難読命令群
３００１、１４００１  初期化命令群
３００２、１４００２  選択命令群
３００３、１４００３  選択対象命令群
３０１、１４０１  ブロック番号保持部
８０００、１８０００  難読化装置
８０１  入力部
８０２、１８０２  ブロック分割部
８０３  ブロック番号付与部
８０４  初期化命令群生成部
８０５、１８０５  選択命令群生成部
８０６、１８０６  ブロック更新部
８０７  命令統合部
８０８  出力部
１８０９  依存化部
２００００  情報処理装置
２０００１  初期化部
２０００２  選択部
２０００３  命令保持部
【図１】
0005300294.tif 000002
【図２】
0005300294.tif 000003
【図３】
0005300294.tif 000004
【図４】
0005300294.tif 000005
【図５】
0005300294.tif 000006
【図６】
0005300294.tif 000007
【図７】
0005300294.tif 000008
【図８】
0005300294.tif 000009
【図９】
0005300294.tif 000010
【図１０】
0005300294.tif 000011
【図１１】
0005300294.tif 000012
【図１２】
0005300294.tif 000013
【図１３】
0005300294.tif 000014
【図１４】
0005300294.tif 000015
【図１５】
0005300294.tif 000016
【図１６】
0005300294.tif 000017
【図１７】
0005300294.tif 000018
【図１８】
0005300294.tif 000019
【図１９】
0005300294.tif 000020
【図２０】
0005300294.tif 000021