(57)【特許請求の範囲】
【請求項１】
オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置であって、
オリジナルプログラムを取得するプログラム取得手段と、
所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、
複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、
前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段と
を備えることを特徴とするプログラム変換装置。
【請求項２】
前記所定の順序は、前記複数の選択パラメータに所定の初期値を与えて、前記選択処理命令群及び前記更新処理命令群の実行を繰り返すことにより、順次算出される選択識別子の順序である
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項３】
前記複数の選択対象データのそれぞれは、１個以上のデータからなる
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項４】
前記オリジナルプログラムは、秘匿すべき秘密情報を有し、
前記選択処理命令群生成手段は、
前記複数の選択パラメータを用いる第１の演算式により前記選択識別子を算出する命令群からなる選択処理命令群を生成し、
前記更新処理命令群生成手段は、
算出された前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新する更新処理命令群を生成し、
前記プログラム変換装置は、さらに、
更新した複数の選択パラメータを用いた第２の演算式により、前記秘密情報と同一の値を算出する変遷処理命令群を生成する変遷処理命令群生成手段を備え、
前記秘密保持プログラム生成手段は、
生成された変遷処理命令群を、前記更新処理命令群の配置位置と、前記秘密情報の配置位置との間へ配置し、及び前記秘密情報を前記変遷処理命令群で算出する処理に置換する
ことを特徴とする請求項３に記載のプログラム変換装置。
【請求項５】
プログラム変換装置は、さらに、
前記オリジナルプログラムを、１つ以上のブロックに分割する分割手段を備え、
前記複数の選択対象データのそれぞれは、異なるブロックを含む
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項６】
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記更新処理命令群生成手段は、
前記複数の選択対象データのそれぞれに対して、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、定数値を第１の選択パラメータに格納する更新処理命令群を生成する
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項７】
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記演算式は、
前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、選択識別子を算出し、
Ｐｉとモジュロ値Ｎとは、互いに素である
であることを特徴とする請求項６に記載のプログラム変換装置。
【請求項８】
選択対象データ生成手段は、
現時点までに前記演算式にて算出された選択識別子それぞれを記憶する記憶部と、
１つのブロックに対して、１つの値を選択し、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、選択した値を第１の選択パラメータに格納して、前記演算式を実行する実行部と、
算出された算出値と同一の選択識別子が前記記憶部に記憶されているか否かを判断する判断部と、
判断結果が否定的である場合には、前記選択された１つの値を、前記１つのブロックに対する前記定数値と決定し、前記１つのブロックを算出された算出値が示す選択対象データに格納する格納部と、
判断結果が肯定的である場合には、前記定数値が決定され、１つのブロックが選択対象データに格納されるまでの間、前記実行部と前記判断部とによる処理を繰り返すように制御する繰返制御部とを備え、
前記選択対象データ生成手段による処理は、全てのブロックに対して実行される
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項９】
前記選択処理命令群生成手段は、
未実行である選択対象データを示す識別子を、常に取得する選択処理命令群を生成する
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項１０】
前記選択処理命令群生成手段は、
未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する選択処理命令群を生成する
ことを特徴とする請求項９に記載のプログラム変換装置。
【請求項１１】
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記選択処理命令群生成手段は、
前記配列テーブルと、
前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する前記演算式と、
前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行う取得プログラム命令群とを生成し、
前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含み、
Ｐｉとモジュロ値Ｎとは互いに素である
ことを特徴とする請求項１０に記載のプログラム変換装置。
【請求項１２】
前記更新処理命令群生成手段は、
第ｊ（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊ−１の選択パラメータへ格納し、前記選択処理命令群にて取得された前記真の選択識別子を第ｎの選択パラメータへ格納する前記更新処理命令群を生成する
ことを特徴とする請求項１１に記載のプログラム変換装置。
【請求項１３】
前記演算式は、１つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記１つのパラメータを取得する第１取得プログラム命令群であり、
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
前記選択処理命令群生成手段は、
前記第１取得プログラム命令群と、
前記配列テーブルと、
前記配列テーブルのうち未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第１取得プログラム命令群にて取得されたパラメータの値にて示される順序に配置された選択識別子を取得する第２取得プログラム命令群とを生成し、
前記選択処理命令群は、前記第１取得プログラム命令群と、前記配列テーブルと、前記第２取得プログラム命令群とを含む
ことを特徴とする請求項１０に記載のプログラム変換装置。
【請求項１４】
前記更新処理命令群生成手段は、
前記インデックスの値をインクリメントする前記更新処理命令群を生成する
ことを特徴とする請求項１３に記載のプログラム変換装置。
【請求項１５】
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
前記選択処理命令群生成手段は、
前記配列テーブルと、
前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す値を算出する前記演算式と、
前記配列テーブルと同一のテーブルテーブル内において、未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する取得プログラム命令群とを生成し、
前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含む
ことを特徴とする請求項１０に記載のプログラム変換装置。
【請求項１６】
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記秘密保持プログラム生成手段は、さらに、
前記複数のブロックのそれぞれが選択対象データに含まれた後、ブロックを含まない１つ以上の選択対象データに、１つ以上のプログラム命令を含む偽装ブロックを挿入する
ことを特徴とする請求項５に記載のプログラム変換装置。
【請求項１７】
処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置であって、
複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理実行手段と、
前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、
前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返す
ことを特徴とする秘密処理装置。
【請求項１８】
前記複数の選択対象データのそれぞれは、１個以上のデータからなる
ことを特徴とする請求項１７に記載の秘密処理装置。
【請求項１９】
前記秘密処理は、秘匿すべき秘密情報を用いる代わりに、所定の処理を施して前記秘密情報を算出する処理であり、
前記選択処理実行手段は、
前記複数の選択パラメータを用いる演算式により前記選択識別子を算出し、
前記更新処理実行手段は、
前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新し、
前記秘密処理装置は、さらに、
更新した複数の選択パラメータを用いた前記所定の処理により、前記秘密情報と同一の値を算出する変遷処理実行手段を備える
ことを特徴とする請求項１８に記載の秘密処理装置。
【請求項２０】
前記秘密処理は、外部装置により１つ以上のブロックに分割されたオリジナルプログラムを実行する処理であり、
前記ブロックは１つ以上のプログラム命令を含み、
前記複数の選択対象データのそれぞれは、異なるブロックを含む
ことを特徴とする請求項１７に記載の秘密処理装置。
【請求項２１】
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記更新処理実行手段は、
前記複数の選択対象データのそれぞれに対して、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、定数値を第１の選択パラメータに格納し、
前記定数値は、前記演算式を用いて、次に実行される選択対象データを示す選択識別子が算出されるように、前記外部装置が前記秘密保持プログラム生成時に予め設定した値である
ことを特徴とする請求項２０に記載の秘密処理装置。
【請求項２２】
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記演算式は、
前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、選択識別子を算出し、
Ｐｉとモジュロ値Ｎとは、互いに素である
であることを特徴とする請求項２１に記載の秘密処理装置。
【請求項２３】
前記選択処理実行手段は、
未実行である選択対象データを示す識別子を、常に取得する
ことを特徴とする請求項２０に記載の秘密処理装置。
【請求項２４】
前記選択処理実行手段は、
未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する
ことを特徴とする請求項２３に記載の秘密処理装置。
【請求項２５】
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
前記選択処理実行手段は、
前記配列テーブルを保持し、
前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、
前記選択処理実行手段は、
前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行い、
Ｐｉとモジュロ値Ｎとは互いに素である
ことを特徴とする請求項２４に記載の秘密処理装置。
【請求項２６】
前記更新処理実行手段は、
第ｊ（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊ−１の選択パラメータへ格納し、前記選択処理実行手段にて取得された前記真の選択識別子を第ｎの選択パラメータへ格納する
ことを特徴とする請求項２５に記載の秘密処理装置。
【請求項２７】
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
前記選択処理実行手段は、
前記配列テーブルを保持し、
１つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記１の選択パラメータを取得する前記演算式を実行する第１取得部と、
前記配列テーブルのうち未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第１取得部にて取得された選択パラメータの値にて示される順序に配置された選択識別子を取得する第２取得部とを含む
ことを特徴とする請求項２４に記載の秘密処理装置。
【請求項２８】
前記更新処理実行手段は、
前記インデックスの値をインクリメントする
ことを特徴とする請求項２７に記載の秘密処理装置。
【請求項２９】
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、
前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
前記選択処理実行手段は、
前記配列テーブルを保持し、
前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、
前記選択処理実行手段は、
前記配列テーブルと同一のテーブルテーブル内において、未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する
ことを特徴とする請求項２４に記載の秘密処理装置。
【請求項３０】
前記秘密処理は、前記外部装置により前記オリジナルプログラムから生成された秘密保持プログラムを実行する処理であり、
前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
ブロックを含まない１つ以上の選択対象データには、１つ以上のプログラム命令を含む偽装ブロックが含まれ、
前記秘密保持プログラムは、前記オリジナルプログラムより分割された各ブロックと、１つ以上の偽装ブロックとを含む
ことを特徴とする請求項２０に記載の秘密処理装置。
【請求項３１】
オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置で用いられる変換方法であって、
オリジナルプログラムを取得するプログラム取得ステップと、
所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成ステップと、
複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成ステップと、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成ステップと、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成ステップと、
前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成ステップと
を含むことを特徴とする変換方法。
【請求項３２】
オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置で用いられる変換プログラムであって、
コンピュータに対して、
オリジナルプログラムを取得するプログラム取得ステップと、
所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成ステップと、
複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成ステップと、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成ステップと、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成ステップと、
前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成ステップと
を実行させることを特徴とする変換プログラム。
【請求項３３】
前記変換プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項３２に記載の変換プログラム。
【請求項３４】
処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置で用いられる秘密処理方法であって、
複数の選択パラメータのそれぞれに値を代入する前処理実行ステップと、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行ステップと、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理実行ステップと、
前記選択処理実行ステップにて取得された選択識別子が示す選択対象データを処理する選択対象データ実行ステップと
を含むことを特徴とする秘密処理方法。
【請求項３５】
実行順序が定まった複数の選択対象データを含み、解析が困難な秘密保持プログラムを実行する秘密処理装置で用いられる秘密処理プログラムであって、
コンピュータに対して、
複数の選択パラメータのそれぞれに値を代入する前処理実行ステップと、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行ステップと、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理実行ステップと、
前記選択処理実行ステップにて取得された選択識別子が示す選択対象データを処理する選択対象データ実行ステップと
を実行させることを特徴とする秘密処理プログラム。
【請求項３６】
前記秘密処理プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項３５に記載の秘密処理プログラム。
【請求項３７】
オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置の集積回路であって、
オリジナルプログラムを取得するプログラム取得手段と、
所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、
複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、
前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段と
を備えることを特徴とする集積回路。
【請求項３８】
処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置の集積回路であって、
複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、
前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、
選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理実行手段と、
前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、
前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返す
ことを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、秘密情報を保持して実行するプログラムを、秘密情報を不正に解析することを困難にするプログラムに変換する技術に関する。
【背景技術】
【０００２】
従来、秘密の要素を使用して処理を行うプログラムを、不正解析者に解析させたくないという要求がある。このようなプログラムには、例えば、暗号プログラムがある。暗号プログラムは、秘密情報である暗号鍵を用いて処理を行うが、これを解析されたくないという要望がある。
また、例えば、画像に埋め込まれたコピー制御情報のウォーターマークの検出を行うプログラムである。ウォーターマークの検出プログラムの処理が不正解析者によって解析された場合、画像に埋め込まれたウォーターマークを除去するツールを作成される恐れがある。よって、このようなプログラムは、不正解析者にとって解析困難であることが望まれる。そのような要望に対し、例えばプログラムを暗号化しておき、実行時には復号してからそのプログラムを実行するという方法がある。しかし、このような方法を用いてもプログラムは実行時にメモリ上で平文となるため、メモリ上のプログラムを抜き取られて解析されるという脅威がある。このような脅威に対し、抜き取ったプログラムに含まれるプログラム命令群がどのような実行順序で実行されるかが解析困難であれば、ウォーターマークを除去するツールを作成することは困難になる。
【０００３】
従来、秘密の要素を使用して処理を行うプログラムの不正な解析／改ざんを防止するための方法としてプログラムの制御構造／処理などを元のプログラムとは異なる形式に変換することで制御構造を複雑にして、解析困難なプログラムにするプログラム難読化の方法が考えられている（例えば非特許文献１参照）。
非特許文献１では、秘密情報を含むプログラム命令を、複数のプログラム命令群に置き換えることでプログラムを難読化する方法が開示されている。例えば、「ｄ０＝１２３４」というプログラム命令において「１２３４」が被秘匿情報である場合、「ｄ０＝１２３４」というプログラム命令を、「ｄ０＝１００」、「ｄ０＝ｄ０×２」、「ｄ０＝ｄ０＋３０」、「ｄ０＝ｄ０＋１０００」、「ｄ０＝ｄ０＋４」のようなプログラム命令群に置き換え、これらを分散して配置することが述べられている。このような方法を用いれば、プログラム中に存在する定数データを収集しても、その中から被秘匿情報を見つけることができなくなる。
【０００４】
しかしながら、プログラムに含まれる各命令群の実行順序が知られてしまうと、不正解析者は、その実行順序に従って、ｄ０の値を算出することにより被秘匿情報を見つけることができる。
そこで、従来、プログラムの実行順序の解析を困難にする方法として、実行する命令群を示す値に基づいて分岐先を決定する分岐命令（例えば、ｓｗｉｔｃｈ文）と配列とを用いて、各命令群の実行順序を制御する方法がある（非特許文献２）。このとき、オリジナルプログラムに含まれる複数の命令群（例えば、命令群１〜３であり、この順序に実行される。）は、実行する命令群を示す値と１対１に対応付けられており、また、命令群１〜３の最後に、配列を用いた演算式により次に実行する命令群を示す値を算出し、算出した値が、ｓｗｉｔｃｈ文にて用いられる変数Ｖａｒに格納するプログラム命令が挿入される。配列の個数を１０とすると、挿入されるプログラム命令の一例は、Ｖａｒ＝ｇ［３］＋ｇ［４］である。
【０００５】
これにより、命令群１〜３の配置順序を入れ替えても、ｓｗｉｔｃｈ文により実行順序は、正当なままで保たれている。また、命令群１〜３の配置順序を入れ替えることで、オリジナルプログラムの構造の解析を困難にすることができる。つまり、ウォーターマークの検出プログラムの解析や、被秘匿情報の取得を困難にすることができる。
【非特許文献１】
鴨志田、松本、井上、"耐タンパーソフトウェアの構成手法に関する考察"、ＩＳＥＣ９７−５９
【非特許文献２】
Ｃｈｅｎｘｉ  Ｗａｎｇ、”Ａ  Ｓｅｃｕｒｉｔｙ  Ａｒｃｈｉｔｅｃｔｕｒｅ  ｆｏｒ  Ｓｕｒｖｉｖａｂｉｌｉｔｙ  Ｍｅｃｈａｎｉｓｍｓ”、  Ｐｈ．Ｄ．  Ｄｉｓｓｅｒｔａｔｉｏｎ  （２０００）
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、各命令群の最後に挿入されるプログラム命令と配列に格納されている各データとは、例えば、コンピュータ装置の記憶領域から取得される可能性がある。そのため、各命令群の最後に挿入されるプログラム命令と配列に格納されている各データとが、不正解析者に知られてしまうと、不正解析者は、ｓｗｉｔｃｈ文にて用いられる変数の値を取得し、オリジナルプログラムの制御構造を再構成することができ、オリジナルプログラムの解析を容易に行うことができる。
【０００７】
そこで、本発明は、不正解析者がオリジナルプログラムの解析を容易にすることができない秘密保持プログラムを生成するプログラム変換装置、前記秘密保持プログラムを実行する秘密処理装置、変換方法、及び秘密処理方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するために、本発明は、オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置であって、オリジナルプログラムを取得するプログラム取得手段と、所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段とを備えることを特徴とする。
【発明の効果】
【０００９】
上記に示した構成によると、プログラム変換装置にて生成された秘密保持プログラムは、演算式の前記複数の選択パラメータを更新する際に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させている。従来は、次に実行すべきブロックを決定する際には、複数の固定値が格納された配列を用いていたが、本発明のプログラム変換装置にて生成された秘密保持プログラムは、次に実行すべきブロックを決定した後、常に、演算式に用いる選択パラメータを更新するので、複数の選択パラメータに格納される値は特定されにくくなる。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
【００１０】
ここで、前記所定の順序は、前記複数の選択パラメータに所定の初期値を与えて、前記選択処理命令群及び前記更新処理命令群の実行を繰り返すことにより、順次算出される選択識別子の順序であるとしてもよい。
この構成によると、プログラム変換装置は、各選択パラメータに所定の初期値を与えた場合に、オリジナルプログラムと同一の実行結果を出力する秘密保持プログラムを生成することができる。
【００１１】
ここで、前記複数の選択対象データのそれぞれは、１個以上のデータからなるとしてもよい。
この構成によると、プログラム変換装置は、選択対象データをデータとして扱う秘密保持プログラムを生成することができる。
ここで、前記オリジナルプログラムは、秘匿すべき秘密情報を有し、前記選択処理命令群生成手段は、前記複数の選択パラメータを用いる第１の演算式により前記選択識別子を算出する命令群からなる選択処理命令群を生成し、前記更新処理命令群生成手段は、算出された前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新する更新処理命令群を生成し、前記プログラム変換装置は、さらに、更新した複数の選択パラメータを用いた第２の演算式により、前記秘密情報と同一の値を算出する変遷処理命令群を生成する変遷処理命令群生成手段を備え、前記秘密保持プログラム生成手段は、生成された変遷処理命令群を、前記更新処理命令群の配置位置と、前記秘密情報の配置位置との間へ配置し、及び前記秘密情報を前記変遷処理命令群で算出する処理に置換するとしてもよい。
【００１２】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、秘密情報と同一の値を算出する方法を、前記選択処理命令群、前記更新処理命令群、及び前記変遷処理命令群により隠匿しているので、不正解析者は、秘密情報を解析することが困難となる。
ここで、プログラム変換装置は、さらに、前記オリジナルプログラムを、１つ以上のブロックに分割する分割手段を備え、前記複数の選択対象データのそれぞれは、異なるブロックを含むとしてもよい。
【００１３】
この構成によると、プログラム変換装置は、選択対象データをオリジナルプログラムから分割されたブロックとして扱う秘密保持プログラムを生成することができる。
ここで、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記更新処理命令群生成手段は、前記複数の選択対象データのそれぞれに対して、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、定数値を第１の選択パラメータに格納する更新処理命令群を生成するとしてもよい。
【００１４】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させて前記複数の選択パラメータの値を更新することができる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、選択識別子を算出し、Ｐｉとモジュロ値Ｎとは、互いに素であるとしてもよい。
【００１５】
この構成によると、プログラム変換装置は、演算式を用いて、選択対象データを確実に決定することができる。
ここで、選択対象データ生成手段は、現時点までに前記演算式にて算出された選択識別子それぞれを記憶する記憶部と、１つのブロックに対して、１つの値を選択し、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、選択した値を第１の選択パラメータに格納して、前記演算式を実行する実行部と、算出された算出値と同一の選択識別子が前記記憶部に記憶されているか否かを判断する判断部と、判断結果が否定的である場合には、前記選択された１つの値を、前記１つのブロックに対する前記定数値と決定し、前記１つのブロックを算出された算出値が示す選択対象データに格納する格納部と、判断結果が肯定的である場合には、前記定数値が決定され、１つのブロックが選択対象データに格納されるまでの間、前記実行部と前記判断部とによる処理を繰り返すように制御する繰返制御部とを備え、前記選択対象データ生成手段による処理は、全てのブロックに対して実行されるとしてもよい。
【００１６】
この構成によると、プログラム変換装置は、更新処理命令群の演算式を用いて、次のブロックを格納する選択対象データを決定する場合に、これまでに格納されていない選択対象データとなるように、前記複数の選択パラメータを更新することができる。これにより、生成された秘密保持プログラムは、複数の選択パラメータを用いた演算式により次に実行するべきブロックを確実に決定することができるので、オリジナルプログラムと同等の機能を提供することができる。
【００１７】
ここで、前記選択処理命令群生成手段は、未実行である選択対象データを示す識別子を、常に取得する選択処理命令群を生成するとしてもよい。
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、未実行であるブロックを含む選択対象データを、常に取得することができる。また、秘密保持プログラムは、選択処理命令群により、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
【００１８】
ここで、前記選択処理命令群生成手段は、未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する選択処理命令群を生成するとしてもよい。
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、管理情報を用いて、未実行であるブロックを含む選択対象データを、常に取得することができる。
【００１９】
ここで、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記選択処理命令群生成手段は、前記配列テーブルと、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する前記演算式と、前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行う取得プログラム命令群とを生成し、前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含み、Ｐｉとモジュロ値Ｎとは互いに素であるとしてもよい。
【００２０】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、配列テーブルを用いて、未実行であるブロックを含む選択対象データを確実に取得することができる。
ここで、前記更新処理命令群生成手段は、第ｊ（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊ−１の選択パラメータへ格納し、前記選択処理命令群にて取得された前記真の選択識別子を第ｎの選択パラメータへ格納する前記更新処理命令群を生成するとしてもよい。
【００２１】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、選択パラメータの更新の際には、常に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させているので、複数の選択パラメータに格納される値は特定されにくくなる。
【００２２】
ここで、前記演算式は、１つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記１つのパラメータを取得する第１取得プログラム命令群であり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択処理命令群生成手段は、前記第１取得プログラム命令群と、前記配列テーブルと、前記配列テーブルのうち未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第１取得プログラム命令群にて取得されたパラメータの値にて示される順序に配置された選択識別子を取得する第２取得プログラム命令群とを生成し、前記選択処理命令群は、前記第１取得プログラム命令群と、前記配列テーブルと、前記第２取得プログラム命令群とを含むとしてもよい。
【００２３】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、インデックスを用いて、次に実行する選択対象データを示す選択識別子を取得することができる。
ここで、前記更新処理命令群生成手段は、前記インデックスの値をインクリメントする前記更新処理命令群を生成するとしてもよい。
【００２４】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、インデックスの更新をする。不正解析者が、ある１のブロックを知ったとしても、インデックスの値が分からないため、次に実行すべきブロックが特定されることはない。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択処理命令群生成手段は、前記配列テーブルと、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す値を算出する前記演算式と、前記配列テーブルと同一のテーブルテーブル内において、未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する取得プログラム命令群とを生成し、前記選択命処理令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含むとしてもよい。
【００２５】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、未実行であるブロックを含む選択対象データを確実に取得することができる。また、秘密保持プログラムは、選択処理命令群により、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記秘密保持プログラム生成手段は、さらに、前記複数のブロックのそれぞれが選択対象データに含まれた後、ブロックを含まない１つ以上の選択対象データに、１つ以上のプログラム命令を含む偽装ブロックを挿入するとしてもよい。
【００２６】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、偽装ブロックを含むので、不正解析者の解析を困難にすることができる。
また、本発明は、処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置であって、複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された１つ以上の選択パラメータの値のうち少なくとも１つの選択パラメータの値を反映させる更新処理実行手段と、前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返すことを特徴とする。
【００２７】
この構成によると、秘密処理装置は、演算式の前記複数の選択パラメータを更新する際に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させている。従来は、次に実行すべきブロックを決定する際には、複数の固定値が格納された配列を用いていたが、本発明の秘密処理装置は、次に実行すべき選択対象データを決定した後、常に、演算式に用いる選択パラメータを更新するので、複数の選択パラメータに格納される値は特定されにくくなる。そのため、不正解析者が秘密処理の解析を容易にすることができない。
【００２８】
ここで、前記複数の選択対象データのそれぞれは、１個以上のデータからなるとしてもよい。
この構成によると、秘密処理装置は、選択対象データをデータとして扱うことができる。
ここで、前記秘密処理は、秘匿すべき秘密情報を用いる代わりに、所定の処理を施して前記秘密情報を算出する処理であり、前記選択処理実行手段は、前記複数の選択パラメータを用いる演算式により前記選択識別子を算出し、前記更新処理実行手段は、前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新し、前記秘密処理装置は、さらに、更新した複数の選択パラメータを用いた前記所定の処理により、前記秘密情報と同一の値を算出する変遷処理実行手段を備えるとしてもよい。
【００２９】
この構成によると、秘密処理装置は、秘密情報と同一の値を算出する方法を隠匿しているので、不正解析者は、秘密情報を解析することが困難となる。
ここで、前記秘密処理は、外部装置により１つ以上のブロックに分割されたオリジナルプログラムを実行する処理であり、前記ブロックは１つ以上のプログラム命令を含み、前記複数の選択対象データのそれぞれは、異なるブロックを含むとしてもよい。
【００３０】
この構成によると、秘密処理装置は、選択対象データをオリジナルプログラムから分割されたブロックとして扱うことができる。
ここで、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記更新処理実行手段は、前記複数の選択対象データのそれぞれに対して、第ｊ−１（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊの選択パラメータへ格納し、定数値を第１の選択パラメータに格納し、前記定数値は、前記演算式を用いて、次に実行される選択対象データを示す選択識別子が算出されるように、前記外部装置が前記秘密保持プログラム生成時に予め設定した値であるとしてもよい。
【００３１】
この構成によると、秘密処理装置は、前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させて前記複数の選択パラメータの値を更新することができる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、選択識別子を算出し、Ｐｉとモジュロ値Ｎとは、互いに素であるとしてもよい。
【００３２】
この構成によると、秘密処理装置は、演算式により、選択対象データを確実に決定することができる。
ここで、前記選択処理実行手段は、未実行である選択対象データを示す識別子を、常に取得するとしてもよい。
この構成によると、秘密処理装置は、未実行であるブロックを含む選択対象データを、常に取得することができる。また、秘密処理装置にて実行される秘密処理は、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
【００３３】
ここで、前記選択処理実行手段は、未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得するとしてもよい。
この構成によると、秘密処理装置は、管理情報を用いて、未実行であるブロックを含む選択対象データを、常に取得することができる。
【００３４】
ここで、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、前記選択処理実行手段は、前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行い、Ｐｉとモジュロ値Ｎとは互いに素であるとしてもよい。
【００３５】
この構成によると、秘密処理装置は、配列テーブルを用いて、未実行であるブロックを含む選択対象データを確実に取得することができる。
ここで、前記更新処理実行手段は、第ｊ（ｊは２以上ｎ以下の整数）の選択パラメータに格納されている値を第ｊ−１の選択パラメータへ格納し、前記選択処理実行手段にて取得された前記真の選択識別子を第ｎの選択パラメータへ格納するとしてもよい。
【００３６】
この構成によると、秘密処理装置は、選択パラメータの更新の際には、常に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された１以上の選択パラメータの値のうち少なくとも１の選択パラメータの値を反映させているので、複数の選択パラメータに格納される値は特定されにくくなる。
ここで、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、１つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記１の選択パラメータを取得する前記演算式を実行する第１取得部と、前記配列テーブルのうち未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第１取得部にて取得された選択パラメータの値にて示される順序に配置された選択識別子を取得する第２取得部とを含むとしてもよい。
【００３７】
この構成によると、秘密処理装置は、インデックスを用いて、次に実行する選択対象データを示す選択識別子を取得することができる。
ここで、前記更新処理実行手段は、前記インデックスの値をインクリメントするとしてもよい。
この構成によると、秘密処理装置は、インデックスの更新をする。不正解析者が、ある１のブロックを知ったとしても、インデックスの値が分からないため、次に実行すべきブロックが特定されることはない。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
【００３８】
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記複数の選択パラメータは、第１から第ｎの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、前記演算式は、前記第１から第ｎの選択パラメータのそれぞれに対して、Ｐｉ×第ｉの選択パラメータ（ｉは１以上ｎ以下の整数）を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Ｎとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、前記選択処理実行手段は、前記配列テーブルと同一のテーブルテーブル内において、未実行である１つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得するとしてもよい。
【００３９】
この構成によると、秘密処理装置は、未実行であるブロックを含む選択対象データを確実に取得することができる。また、秘密処理装置にて実行される秘密処理は、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
ここで、前記秘密処理は、前記外部装置により前記オリジナルプログラムから生成された秘密保持プログラムを実行する処理であり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、ブロックを含まない１つ以上の選択対象データには、１つ以上のプログラム命令を含む偽装ブロックが含まれ、前記秘密保持プログラムは、前記オリジナルプログラムより分割された各ブロックと、１つ以上の偽装ブロックとを含むとしてもよい。
【００４０】
この構成によると、秘密処理装置にて実行される秘密保持プログラムは、偽装ブロックを含むので、不正解析者の解析を困難にすることができる。
【発明を実施するための最良の形態】
【００４１】
１．第１の実施の形態
以下、本発明に係る第１の実施の形態としての秘密保持プログラム１００及びプログラム難読化装置１０について、図面を参照して説明する。
１．１  秘密保持システム１の概要
秘密保持システム１は、図１に示すように、プログラム難読化装置１０と、プログラム実行装置２０とから構成されている。
【００４２】
プログラム難読化装置１０は、実行順序を秘密にしたい難読化対象プログラムから秘密保持プログラム１００を生成し、生成した秘密保持プログラム１００をプログラム実行装置２０へ配布する。
プログラム実行装置２０は、プログラム難読化装置１０から配布された秘密保持プログラム１００を実行する。
【００４３】
ここで、難読化対象プログラムは、命令群Ａ、命令群Ｂ、命令群Ｃの３つの命令群から構成されており、命令群Ａ、Ｂ、Ｃの順に実行することにより正しく動作するものとする。
１．２  秘密保持プログラム１００の構造
ここでは、プログラム難読化装置１０にて生成され、プログラム実行装置２０にて実行される秘密保持プログラム１００のプログラム構造について説明する。
【００４４】
秘密保持プログラム１００は、秘密の要素を使用して処理を行うプログラムであり、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されたくないプログラムである。例えば、ウォーターマーク検出プログラムや、非特許文献１で述べられている方法で、秘密情報を扱うプログラム命令を別のプログラム命令群に置き換えて、それらを分散して配置したプログラムである。後者については、置き換えたプログラム命令群を不正解析者が収集し、正しい順番で実行すれば秘密情報の値が算出できるので、実行経路を分かり難くしたい。
【００４５】
秘密保持プログラム１００は、おおまかにはプログラムに含まれる複数の選択対象データ１４０〜１４６がどのような実行順序で実行されるかが解析困難なプログラムである。なお、選択対象データ１４０〜１４６には、正常系の実行時には実行されることのない選択対象データも含まれている。実行されることのない選択対象データは、正しい実行順序を知らない不正解析者が、考えうる実行順序の組み合わせ数を多くするために組み込まれている。ここで、正常系の実行とは、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わないで処理をすることである。秘密保持プログラム１００は、図２に示すように、前処理命令群１１０、選択処理命令群１２０、変遷処理命令群１３０、選択対象データ１４０、１４１、・・・、１４６から構成され、これらが図２に示す順番に配置されている。
【００４６】
秘密保持プログラム１００は、呼出元のプログラムから、３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３、および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取る。
秘密保持プログラム１００は、選択処理命令群１２０での処理に用いる複数の選択パラメータの各値（ここでは、３つの値）を保持する３２ビットの第１、第２及び第３の選択パラメータ用変数と、選択識別子を保持する３２ビットの選択識別子用変数を用いて処理を行う。ここで、選択パラメータは、選択対象データ１４０、１４１、・・・、１４６から１の選択対象を決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子である。
【００４７】
ここでは、秘密保持プログラム１００が実際に使用される際に呼出元のプログラムから受け取る入力値ｉｎ１、ｉｎ２、ｉｎ３は値「１」、「２」、「３」であるとする。本実施の形態で提供する秘密保持プログラム１００は、呼出元のプログラムから受け取る値を用いれば、（選択対象主要命令群を含む）選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、（選択対象主要命令群を含む）選択対象データの実行順序を知ることが困難なプログラムである。
【００４８】
１．２．１  前処理命令群１１０
前処理命令群１１０は、選択処理命令群１２０で用いる選択パラメータ群の初期値を算出するプログラム命令群である。ここで、選択パラメータ群は、第１、第２及び第３の選択パラメータ用変数からなる。
前処理命令群１１０は、秘密保持プログラム１００が起動された際に、最初に実行されるプログラム命令群である。
【００４９】
前処理命令群１１０は、呼び出し元のプログラムから３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第１の前処理プログラム命令群と、選択処理命令群１２０に分岐する第２の前処理プログラム命令群とからなり、これらを順に行う。
具体的には、第１の前処理プログラム命令群は、第１〜３の選択パラメータ用変数にそれぞれ、ｉｎ１、ｉｎ２、ｉｎ３の値を格納する。正常系の実行時には、第１の前処理プログラム命令群は、入力値ｉｎ１、ｉｎ２、ｉｎ３として、それぞれ値「１」、「２」、「３」を受け取り、第１〜３の選択パラメータ用変数にそれぞれ値「１」、「２」、「３」を格納する処理を行う。
【００５０】
第２の前処理プログラム命令群は、例えば、Ｃ言語で記述されるプログラムにおいて選択処理命令群１２０の先頭にラベル「ｌａｂｅｌ＿１２０：」が挿入されている場合には、プログラム命令「ｇｏｔｏ  ｌａｂｅｌ＿１２０；」で表されるプログラム命令である。
なお、前処理命令群１１０の直後に選択処理命令群１２０が配置されている場合には、プログラム命令「ｇｏｔｏ  ｌａｂｅｌ＿１２０；」がなくても構わない。この場合、前処理命令群１１０は、第１の前処理プログラム命令群のみから構成されることになる。
【００５１】
１．２．２  選択処理命令群１２０
選択処理命令群１２０は、選択パラメータ群に基づき、選択対象データ１４０〜１４６から１つを選択し選択識別子とするプログラム命令群である。
選択処理命令群１２０は、選択パラメータ群を用いて、選択識別子を算出する第１の選択処理プログラム命令群と、変遷処理命令群１３０に分岐する第２の選択処理プログラム命令群からなり、これらを順に行う。なお、選択識別子は後述の変遷処理命令群で使用する値である。
【００５２】
第１の選択処理プログラム命令群について、具体例を用いて、以下に説明する。第１の選択処理プログラム命令群は、ｐ１×（第１の選択パラメータ用変数）＋ｐ２×（第２の選択パラメータ用変数）＋ｐ３×（第３の選択パラメータ用変数）  ｍｏｄ  ＮＮを算出し、算出した値を選択識別子用変数に格納するプログラム命令の集まりである。ＮＮは選択対象データの数とする。また、ｐ１、ｐ２、ｐ３は、それぞれＮＮと互いに素な素数であって、ＮＮを法とした場合にそれぞれ異なる値となる数とする。なお、ＮＮを素数とし、ｐ１、ｐ２、ｐ３をそれぞれＮＮ未満の互いに異なる素数としてもよい。ここで演算子「×」は掛け算を表す。ここでは、ｐ１、ｐ２、ｐ２、ＮＮをそれぞれ、値「２」、「３」、「５」、「７」とし、式１「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）  ＭＯＤ  ７」を算出するプログラム命令群であるとする。
【００５３】
なお、変遷処理命令群１３０に分岐するプログラム命令群については、前処理命令群１１０で述べた第２の前処理プログラム命令群と同様で、分岐先が変遷処理命令群１３０になったものである。
１．２．３  変遷処理命令群１３０
変遷処理命令群１３０は、選択処理命令群１２０で算出した選択識別子に基づき、いずれかの選択対象データ１４０〜１４６に分岐する処理を行うプログラム命令群である。
【００５４】
具体的には、選択識別子用変数の値が、０、１、・・・、６の場合にそれぞれ、選択対象データ１４０、１４１、・・・、１４６への分岐を行うプログラム命令群である。
例えば、秘密保持プログラム１００が記述されるプログラムがＣ言語のプログラムとし、選択対象データ１４０、１４１、・・・、１４６の先頭に、それぞれラベル「ｌａｂｅｌ＿１４０：」、「ｌａｂｅｌ＿１４１：」、・・・、「ｌａｂｅｌ＿１４６：」があるとすると、変遷処理命令群１３０は以下のようなプログラム命令となる。
【００５５】
「
ｓｗｉｔｃｈ（選択識別子用変数）｛
ｃａｓｅ  ０：  ｇｏｔｏ  ｌａｂｅｌ＿１４０；
ｃａｓｅ  １：  ｇｏｔｏ  ｌａｂｅｌ＿１４１；
・・・
ｃａｓｅ  ６：  ｇｏｔｏ  ｌａｂｅｌ＿１４６；
｝
」
１．２．４  選択対象データ１４０〜１４６
選択対象データ１４０〜１４６は、変遷処理命令群１３０により分岐してきた際に、実行されるプログラム命令群である。
【００５６】
選択対象データ１４０〜１４６は、それぞれ、選択対象主要命令群１５０〜１５６、更新処理命令群１６０〜１６６、分岐命令群１７０〜１７６からなり、これらは図２に示す順番に配置されている。各命令群は、１以上のプログラム命令からなるプログラム命令群である。
ここでは、選択対象データ１４０の構成内容について説明する。なお、選択対象データ１４１〜１４６については、選択対象データ１４０の構成内容と同様であるため、説明は省略する。
【００５７】
（１）選択対象主要命令群１５０
選択対象主要命令群１５０は、このプログラムが提供する機能（例えばウォーターマーク検出の機能）の処理の一部を行うプログラム命令群であるか、あるいは、提供する機能とは無関係であり、正常系での実行時（以降、正常系の実行時）には実行されない命令群である。
【００５８】
本実施例では、正常系の実行時には、選択対象主要命令群１５２、１５４、１５６の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群１５２、１５４、１５６は、難読化対象プログラムが提供する機能の処理の一部を含むプログラム命令群であり、選択対象主要命令群１５２、１５４、１５６のそれぞれは、順に命令群Ａ、Ｂ、Ｃと同一のものである。
【００５９】
また、選択対象主要命令群１５０、１５１、１５３、１５５は、提供する機能とは無関係な処理が含まれるプログラム命令群である。以降の説明では、選択対象主要命令群１５２、１５４，１５６の命令群であって、秘密保持プログラムが提供する機能の一部である命令群をそれぞれ機能提供命令群１〜３と呼ぶ。また、選択対象主要命令群１５０、１５１、１５３、１５５に含まれる正常系の実行時には実行されない命令群を偽装機能提供命令群と呼ぶ。
【００６０】
本実施例では、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わない正常系での実行時（以降、正常系の実行時）には、前処理命令群１１０で選択パラメータ用変数１〜３にそれぞれ初期値「１」、「２」、「３」が格納されて、以降説明する処理に乗っ取って、選択対象主要命令群１５２、１５４、１５６が順番に実行されることとなる。正確には、途中、更新処理命令群などの処理が行われている。
【００６１】
（２）更新処理命令群１６０
更新処理命令群１６０は、選択パラメータ群の値の更新を行うプログラム命令群である。
更新処理命令群１６０は、選択パラメータ群の値の更新に用いる定数値を予め有している。更新処理命令群１６０は、正当な選択パラメータ群を受け取った場合には、受け取った選択パラメータ群と定数値とを用いて、選択処理命令群１２０が次処理として正当な選択対象を選択することができる新たな選択パラメータ群を生成する。
【００６２】
ここで、生成方法の一例を以下に示す。
更新処理命令群１６０は、第２の選択パラメータ用変数の値を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値を第２の選択パラメータ用変数に格納し、選択パラメータ用変数１に予め有している定数値を代入して、新たな選択パラメータを生成する。
【００６３】
定数値は、これらの第１〜第３の選択パラメータ用変数の値「（定数値）」、「ｘ」、「ｙ」を選択処理命令群１２０の式１に代入して得られる選択識別子が、これまでに選択された１以上の選択対象データを示さない値である。もし、これが、これまでに選択された１の選択対象データになる値であるとすると、当該選択対象データが連続して無限ループを行う処理となってしまうからである。
【００６４】
ここで、更新処理命令群１６０〜１６６のそれぞれが有する定数値の具体例を、以下に示す。
秘密保持プログラム１００は、上述したように、選択対象主要命令群１５２、１５４、１５６の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【００６５】
選択対象主要命令群１５２が実行された後、更新処理命令群１６２は、第２の選択パラメータ用変数の値「２」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「１」を第２の選択パラメータ用変数に格納する。このとき、更新処理命令群１６２が有する定数値Ａを「６」とすることで、選択処理命令群１２０は、次の正当な処理として、選択対象データ１４４を選択することができる。
【００６６】
次に、選択対象主要命令群１５４が実行された後、更新処理命令群１６４は、第２の選択パラメータ用変数の値「１」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「６」を第２の選択パラメータ用変数に格納する。このとき、更新処理命令群１６４が有する定数値Ｂを「２」とすることで、選択処理命令群１２０は、次の正当な処理として、選択対象データ１４６を選択することができる。
【００６７】
次に、選択対象主要命令群１５６が実行された後、更新処理命令群１６６は、第２の選択パラメータ用変数の値「６」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「２」を第２の選択パラメータ用変数に格納する。このとき、更新処理命令群１６４が有する定数値Ｂを「０」とすることで、選択処理命令群１２０は、これまでに実行された選択対象データ１４２、１４４、１４６以外の選択対象データを指定することができる。
【００６８】
正常系の動作では実行されることない、選択対象データ１４０、１４１、１４３、１４５の更新処理命令群１６０、１６１、１６３、１６５には、値「０」から「６」のうち未使用である値を重複しないように、選択する。ここでは、更新処理命令群１６０、１６１、１６３、１６５のそれぞれには、値「１」、「３」、「４」、「５」とする。
（３）分岐命令群１７０
分岐命令群１７０は、選択処理命令群１２０へ分岐するプログラム命令群や、プログラム呼出元に制御を戻す処理のプログラム命令群である。
【００６９】
１．２．５  秘密保持プログラム１００の具体例
秘密保持プログラム１００の具体例として、Ｃ言語にて記述した秘密保持プログラム１００ａを図３に示す。ここで、演算子「＊」は掛け算を表す。
プログラム命令群１１０ａは前処理命令群１１０に対応し、プログラム命令群１２０ａは選択処理命令群１２０に対応し、プログラム命令群１３０ａは変遷処理命令群１３０に対応している。また、プログラム命令群１４０ａ、１４２ａ、１４３ａ、１４６ａのそれぞれは、選択対象データ１４０、１４２、１４３、１４６と対応している。
【００７０】
プログラム命令群１５０ａ、１５２ａ、１５３ａ、１５６ａのそれぞれは、選択対象主要命令群１５０、１５２、１５３、１５６と対応している。プログラム命令群１６０ａ、１６２ａ、１６３ａ、１６６ａのそれぞれは、更新処理命令群１６０、１６２、１６３、１６６と対応している。また、プログラム命令群１７０ａ、１７２ａ、１７３ａ、１７６ａのそれぞれは、分岐命令群１７０、１７２、１７３、１７６と対応している。なお、選択対象データ１４１、１４４、１４５に対応する具体例は、図面の都合上記述していない。
【００７１】
１．３  秘密保持プログラム１００の実行
プログラム実行装置２０が、秘密保持プログラム１００を正常系で実行した場合の処理について、図４に示す流れ図を用いて説明する。
秘密保持プログラム１００は、前処理命令群１１０の処理を行う（ステップＳ５）。具体的には、前処理命令群１１０は、入力値ｉｎ１、ｉｎ２、ｉｎ３として、それぞれ値「１」、「２」、「３」を受け取り、第１〜３の選択パラメータ用変数にそれぞれ値「１」、「２」、「３」を格納する処理を行い、選択処理命令群１２０へ分岐する。
【００７２】
次に、秘密保持プログラム１００は、受け取った入力値「１」、「２」、「３」を用いて、選択処理命令群１２０の処理を行う（ステップＳ１０）。具体的には、選択処理命令群１２０は、式１「２×（第１の選択パラメータ用変数（＝１））＋３×（第２の選択パラメータ用変数（＝２））＋５×（第３の選択パラメータ用変数（＝３））  ＭＯＤ  ７」により値「２」を算出し、算出した値「２」を選択識別子用変数に格納し、変遷処理命令群１３０へ分岐する。
【００７３】
秘密保持プログラム１００は、選択識別子用変数（＝２）を用いて、変遷処理命令群１３０の処理を行う（ステップＳ１５）。具体的には、変遷処理命令群１３０は、選択処理命令群１２０で算出した選択識別子「２」に基づいて、選択対象データ１４２に分岐する。
秘密保持プログラム１００は、変遷処理命令群１３０の分岐命令に従って、選択対象データ１４２の選択対象主要命令群１５２の処理を行う（ステップＳ２０）。具体的には、選択対象主要命令群１５２は、難読化対象プログラムにおける命令群Ａを実行する。
【００７４】
次に、秘密保持プログラム１００は、更新処理命令群１６２の処理を行う（ステップＳ２５）。具体的には、更新処理命令群１６２は、第２の選択パラメータ用変数の値を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値を第２の選択パラメータ用変数に格納し、第１の選択パラメータ用変数に定数値Ａ（＝「６」）を代入する処理を行うプログラム命令群である。ここでは、第１〜第３の選択パラメータ用変数のそれぞれは初期値「１」、「２」、「３」であるので、更新処理命令群１６２は、第１〜第３の選択パラメータ用変数のそれぞれに値「定数値Ａ（＝６）」、「１」、「２」を代入する。
【００７５】
次に、秘密保持プログラム１００は、分岐命令群１７２の処理を行う（ステップＳ３０）。具体的には、分岐命令群１７２は、選択処理命令群１２０へ分岐する。
次に、秘密保持プログラム１００は、更新された選択パラメータ群（値「６」、「１」、「２」）を用いて、選択処理命令群１２０の処理を行う（ステップＳ３５）。具体的には、選択処理命令群１２０は、式１「２×（第１の選択パラメータ用変数（＝６））＋３×（第２の選択パラメータ用変数（＝１））＋５×（第３の選択パラメータ用変数（＝２））  ＭＯＤ  ７」により値「４」を算出し、算出した値「４」を選択識別子用変数に格納し、変遷処理命令群１３０へ分岐する。
【００７６】
秘密保持プログラム１００は、選択識別子用変数（＝４）を用いて、変遷処理命令群１３０の処理を行う（ステップＳ４０）。具体的には、変遷処理命令群１３０は、選択処理命令群１２０で算出した選択識別子「４」に基づいて、選択対象データ１４４に分岐する。
秘密保持プログラム１００は、変遷処理命令群１３０の分岐命令に従って、選択対象データ１４４の選択対象主要命令群１５４の処理を行う（ステップＳ４５）。具体的には、選択対象主要命令群１５４は、難読化対象プログラムにおける命令群Ｂを実行する。
【００７７】
次に、秘密保持プログラム１００は、更新処理命令群１６４の処理を行う（ステップＳ５０）。具体的には、更新処理命令群１６４は、第２の選択パラメータ用変数の値を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値を第２の選択パラメータ用変数に格納し、第１の選択パラメータ用変数に定数値Ｂ（＝「２」）を代入する処理を行うプログラム命令群である。ここでは、第１〜第３の選択パラメータ用変数のそれぞれは初期値「６」、「１」、「２」であるので、更新処理命令群１６４は、第１〜第３の選択パラメータ用変数のそれぞれに値「定数値Ｂ（＝２）」、「６」、「１」を代入する。
【００７８】
次に、秘密保持プログラム１００は、分岐命令群１７４の処理を行う（ステップＳ５５）。具体的には、分岐命令群１７４は、選択処理命令群１２０へ分岐する。
次に、秘密保持プログラム１００は、更新された選択パラメータ群（値「２」、「６」、「１」）を用いて、選択処理命令群１２０の処理を行う（ステップＳ６０）。具体的には、選択処理命令群１２０は、式１「２×（第１の選択パラメータ用変数（＝２））＋３×（第２の選択パラメータ用変数（＝６））＋５×（第３の選択パラメータ用変数（＝１））  ＭＯＤ  ７」により値「６」を算出し、算出した値「６」を選択識別子用変数に格納し、変遷処理命令群１３０へ分岐する。
【００７９】
秘密保持プログラム１００は、選択識別子用変数（＝６）を用いて、変遷処理命令群１３０の処理を行う（ステップＳ６５）。具体的には、変遷処理命令群１３０は、選択処理命令群１２０で算出した選択識別子「６」に基づいて、選択対象データ１４６に分岐する。
秘密保持プログラム１００は、変遷処理命令群１３０の分岐命令に従って、選択対象データ１４６の選択対象主要命令群１５６の処理を行う（ステップＳ７０）。具体的には、選択対象主要命令群１５６は、難読化対象プログラムにおける命令群Ｃを実行する。
【００８０】
次に、秘密保持プログラム１００は、更新処理命令群１６６の処理を行う（ステップＳ７５）。具体的には、更新処理命令群１６６は、第２の選択パラメータ用変数の値を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値を第２の選択パラメータ用変数に格納し、第１の選択パラメータ用変数に定数値Ｃ（＝「０」）を代入する処理を行うプログラム命令群である。ここでは、第１〜第３の選択パラメータ用変数のそれぞれは初期値「２」、「６」、「１」であるので、更新処理命令群１６４は、第１〜第３の選択パラメータ用変数のそれぞれに値「定数値Ｃ（＝０）」、「２」、「６」を代入する。
【００８１】
次に、秘密保持プログラム１００は、分岐命令群１７６の処理を行う（ステップＳ８０）。具体的には、分岐命令群１７６は、呼出元のプログラムへ制御を返す処理を行う（選択対象データ１４６は、最後に実行される選択対象データなので、選択処理命令群１２０に分岐する必要はない）。例えば、Ｃ言語のプログラムではｒｅｔｕｒｎ文がこの処理に対応する。
【００８２】
なお、ここでは、動作の主体を秘密保持プログラム１００としているが、実際には、プログラム実行装置２０が秘密保持プログラム１００を実行することにより、上記の動作が実現できる。つまり、動作の主体を、秘密保持プログラム１００からプログラム実行装置２０へと置き換えてもよい。
１．４  プログラム難読化装置１０
ここでは、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム１００を生成するプログラム難読化装置１０について述べる。秘密保持プログラム１００において、選択対象主要命令群１５０〜１５６に含まれる機能提供命令群および偽装機能提供命令群以外の各部は、どのような難読化対象プログラムに対しても共通して用いることができる。ここでは、機能提供命令群の生成、偽装機能提供命令群の生成について中心に述べる。
【００８３】
プログラム難読化装置１０は、図５に示すように、入力部２００、機能提供命令群生成部２０１と、偽装機能提供命令群生成部２０２と、秘密保持プログラム生成部２０３とから構成されている。
プログラム難読化装置１０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置１０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【００８４】
１．４．１  入力部２００
難読化対象のプログラムと、秘密保持プログラム１００を正常系にて実行する際、秘密保持プログラム１００に与える３つの初期値（ここでは、「１」、「２」、「３」）を受け付ける。
１．４．２  機能提供命令群生成部２０１
機能提供命令群生成部２０１は、入力部２００にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群を生成する。なお、難読化対象プログラムに無条件飛び越し、条件飛び越しが含まれる場合には、飛び越しを行うプログラム命令と飛び越し先のプログラム命令は同じブロックに含まれるように分割を行う。
【００８５】
ここでは、分割した各部に含まれる命令数が出来るだけ均等になるように３つのブロックに分割し、３つの機能提供命令群を生成する。生成した機能提供命令群は、元となったプログラム命令群が難読化対象プログラムにおいて始まりの方にあった順に機能提供命令群１〜３とする。
１．４．３  偽装機能提供命令群生成部２０２
偽装機能提供命令群生成部２０２は、難読化対象プログラムが記述されているプログラミング言語で記述された1以上のプログラム命令をランダムに組み合わせた偽装機能提供命令群を複数個生成する。
【００８６】
なお、難読化対象プログラムに含まれているプログラム命令のみを用いてランダムあるいは手動で偽装機能提供命令群を生成しても構わない。このようにすることで、偽装機能提供命令群と難読化対象プログラムに元から含まれている命令とを区別することを困難にすることができ、解析を困難にすることができる。また、Ｃ言語、Ｊａｖａ（登録商標）言語などのコンパイル処理を行うプログラミング言語においては、偽装機能提供命令群生成部２０２は、コンパイルが通るように難読化対象プログラムで使われている変数を用いて偽装機能提供命令群を生成する。または、難読化対象プログラムで使われていない変数を偽装機能提供命令群に含める場合には、偽装機能提供命令群生成部２０２は、難読化後のプログラムに、そのような変数の宣言を追加する。なお、Ｃ言語に関する用語、変数の宣言の仕方などについては、公知のプログラミング言語（Ｃ言語）の仕様であるので、ここでの説明は省略する。Ｊａｖａ（登録商標）に関する用語は、変数の宣言の仕方などについては、公知のプログラミング言語（Ｊａｖａ（登録商標））の仕様であるので、ここでの説明は省略する。ここでは、偽装機能提供命令群生成部２０２は、４つの偽装機能提供命令群を生成する。
【００８７】
１．４．４  秘密保持プログラム生成部２０３
秘密保持プログラム生成部２０３は、複数の機能提供命令群、及び複数の偽装機能提供命令群を用いて、前処理命令群１１０、選択処理命令群１２０、変遷処理命令群１３０、選択対象データ１４０、１４１、・・・、１４６を生成することにより、秘密保持プログラム１００を生成する。
【００８８】
秘密保持プログラム生成部２０３は、図６に示すように、プログラム記憶部２１０、位置記憶部２１１、ブロック選択部２１２、ブロック配置部２１３、決定部２１４、及び挿入部２１５を有している。
プログラム記憶部２１０は、生成された各命令群及び選択対象データを記憶する領域を有している。
【００８９】
位置記憶部２１１は、各選択対象主要命令群が配置された位置を示す情報を記憶するための領域を有している。例えば、値「２」が位置記憶部２１１に格納されている場合には、選択対象データ１４２には、既に、１の機能提供命令群、又は１の偽装機能提供命令群が挿入されていることを示す。
ブロック選択部２１２は、難読対象プログラムから、次に配置すべきブロック（機能提供命令群）を選択する。
【００９０】
ブロック配置部２１３は、式１を用いて、選択された前記ブロックの配置位置を算出し、前記中間プログラム内において、算出した前記配置位置に、選択された前記ブロックを配置する。
決定部２１４は、位置記憶部２１１に記憶されている前記配置位置以外の配置位置が算出されるように、前記変数に代入すべき代入値を決定する。
【００９１】
挿入部２１５は、決定された代入値を前記変数に代入するプログラム命令群（更新処理命令群）を生成し、配置された前記ブロックの直後に、生成した前記プログラム命令群を挿入する。
（１）前処理命令群１１０の生成
秘密保持プログラム生成部２０３は、呼び出し元のプログラムから３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第１の前処理プログラム命令群と、選択処理命令群１２０に分岐する第２の前処理プログラム命令群とからなり、これらを順に行う前処理命令群１１０を生成する。秘密保持プログラム生成部２０３は、生成した前処理命令群１１０をプログラム記憶部２１０に格納する。
【００９２】
（２）選択処理命令群１２０の生成
秘密保持プログラム生成部２０３は、選択パラメータ群を用いて、選択識別子を算出する第１の選択処理プログラム命令群と、変遷処理命令群１３０に分岐する第２の選択処理プログラム命令群からなり、これらを順に行う選択処理命令群１２０を生成する。
ここでは、秘密保持プログラム生成部２０３は、第１の選択処理プログラム命令群として、式１「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）  ＭＯＤ  ７」を算出するプログラム命令群を生成する。秘密保持プログラム生成部２０３は、生成した選択処理命令群１２０をプログラム記憶部２１０に格納する。
【００９３】
（３）変遷処理命令群１３０の生成
秘密保持プログラム生成部２０３は、選択処理命令群１２０で算出した選択識別子に基づき、選択対象データ１４０〜１４６のうちいずれかの選択対象データに分岐する処理を行う変遷処理命令群１３０を生成する。
具体的には、秘密保持プログラム生成部２０３は、機能提供命令群生成部２０１にて生成された複数の機能提供命令群の個数（ここでは、３個）と、偽装機能提供命令群生成部２０２にて生成された複数の偽装機能提供命令群の個数（ここでは、４個）とを取得し、その合計値を算出する。秘密保持プログラム生成部２０３は、算出した合計値（ここでは、７）と同数のラベル名を生成する。秘密保持プログラム生成部２０３は、選択処理命令群１２０に含まれる式１が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群１３０を生成する。秘密保持プログラム生成部２０３は、生成した変遷処理命令群１３０をプログラム記憶部２１０に格納する。
【００９４】
（４）選択対象データ１４０、１４１、・・・、１４６の生成
秘密保持プログラム生成部２０３は、３つの初期値と、式１と、生成した複数の機能提供命令群及び複数の偽装機能提供命令群とを用いて、複数の機能提供命令群の個数と、機能提供命令群の個数との合計値と同数の選択対象データを生成する。
以下、具体例を用いて、選択対象データの生成について説明する。
【００９５】
秘密保持プログラム生成部２０３は、生成した各ラベル名のみからなる選択対象データを生成する。ここでは、秘密保持プログラム生成部２０３は、７個の選択対象データ１４０〜１４６を生成する。秘密保持プログラム生成部２０３は、生成した各ラベル名のみからなる選択対象データそれぞれをプログラム記憶部２１０に格納する。
秘密保持プログラム生成部２０３は、機能提供命令群１を機能提供命令群生成部２０１から取得する。秘密保持プログラム生成部２０３は、入力部２００にて受け取った３つの初期値と、式１とを用いて、取得した機能提供命令群１を挿入する選択対象データを決定する。ここでは、３つの初期値（「１」、「２」、「３」）と式１とから値「２」が算出されるので、秘密保持プログラム生成部２０３は、機能提供命令群１を、プログラム記憶部２１０に格納されている選択対象データ１４２に挿入する。秘密保持プログラム生成部２０３は、位置記憶部２１１に「２」を格納する。
【００９６】
秘密保持プログラム生成部２０３は、選択対象データ１４２に挿入する更新処理命令群１６２を生成する。ここでは、秘密保持プログラム生成部２０３は、第２の選択パラメータ用変数の値「２」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「１」を第２の選択パラメータ用変数に格納する。秘密保持プログラム生成部２０３は、第１〜第３の選択パラメータ用変数の値「（定数値Ａ）」、「１」、「２」を式１に代入して得られる値が、これまでに選択された１以上の選択対象データを示さない値となるように、位置記憶部２１１に格納されている１つ以上の値を用いて、定数値Ａとして、「６」を取得する。なお、取得方法については後述する。秘密保持プログラム生成部２０３は、取得した定数値Ａ（＝「６」）を含み、選択パラメータ群の値の更新を行う更新処理命令群１６２を生成し、生成した更新処理命令群をプログラム記憶部２１０に格納されている選択対象データ１４２に挿入する。
【００９７】
秘密保持プログラム生成部２０３は、選択対象データ１４２に挿入する分岐命令群１７２を生成し、生成した分岐命令群１７２を選択対象データ１４２に挿入する。ここでは、秘密保持プログラム生成部２０３は、選択処理命令群１２０へ分岐する分岐命令群１７２を生成し、生成した分岐命令群１７２をプログラム記憶部２１０に格納されている選択対象データ１４２に挿入する。これにより、秘密保持プログラムを構成する選択対象データ１４２が生成されることになる。
【００９８】
秘密保持プログラム生成部２０３は、機能提供命令群２を機能提供命令群生成部２０１から取得する。秘密保持プログラム生成部２０３は、選択パラメータ群（「定数値Ａ（＝６）」、「１」、「２」）と、式１とを用いて、取得した機能提供命令群２を挿入する選択対象データを決定する。ここでは、３つの初期値（「６」、「１」、「２」）と式１とから値「４」が算出されるので、秘密保持プログラム生成部２０３は、機能提供命令群２をプログラム記憶部２１０に格納されている選択対象データ１４４に挿入する。秘密保持プログラム生成部２０３は、位置記憶部２１１に「４」を格納する。このとき、位置記憶部２１１には、値「２」、「４」が格納されている。
【００９９】
秘密保持プログラム生成部２０３は、選択対象データ１４４に挿入する更新処理命令群１６４を生成する。ここでは、秘密保持プログラム生成部２０３は、第２の選択パラメータ用変数の値「１」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「６」を第２の選択パラメータ用変数に格納する。秘密保持プログラム生成部２０３は、定数値Ｂとして、第１〜第３の選択パラメータ用変数の値「（定数値Ｂ）」、「６」、「１」を式１に代入して得られる値が、これまでに選択された１以上の選択対象データを示さない値となるように、位置記憶部２１１に格納されている１つ以上の値を用いて、定数値Ｂとして、「２」を取得する。秘密保持プログラム生成部２０３は、取得した定数値Ｂ（＝「２」）を含み、選択パラメータ群の値の更新を行う更新処理命令群１６４を生成し、生成した更新処理命令群１６４をプログラム記憶部２１０に格納されている選択対象データ１４４に挿入する。
【０１００】
秘密保持プログラム生成部２０３は、選択対象データ１４４に挿入する分岐命令群１７４を生成する。ここでは、秘密保持プログラム生成部２０３は、選択処理命令群１２０へ分岐する分岐命令群１７４を生成し、生成した分岐命令群１７４をプログラム記憶部２１０に格納されている選択対象データ１４４に挿入する。これにより、秘密保持プログラムを構成する選択対象データ１４４が生成されることになる。
【０１０１】
秘密保持プログラム生成部２０３は、機能提供命令群３を機能提供命令群生成部２０１から取得する。秘密保持プログラム生成部２０３は、選択パラメータ群（「定数値Ｂ（＝２）」、「６」、「１」）と、式１とを用いて、取得した機能提供命令群３を挿入する選択対象データを決定する。ここでは、３つの初期値（「２」、「６」、「１」）と式１とから値「６」が算出されるので、秘密保持プログラム生成部２０３は、機能提供命令群３をプログラム記憶部２１０に格納されている選択対象データ１４６に挿入する。秘密保持プログラム生成部２０３は、位置記憶部２１１に「６」を格納する。このとき、位置記憶部２１１には、値「２」、「４」、「６」が格納されている。
【０１０２】
秘密保持プログラム生成部２０３は、選択対象データ１４６に挿入する更新処理命令群１６６を生成する。ここでは、秘密保持プログラム生成部２０３は、第２の選択パラメータ用変数の値「６」を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値「２」を第２の選択パラメータ用変数に格納する。秘密保持プログラム生成部２０３は、定数値Ｃとして、第１〜第３の選択パラメータ用変数の値「（定数値Ｃ）」、「２」、「６」を式１に代入して得られる値が、これまでに選択された１以上の選択対象データを示さない値となるように、位置記憶部２１１に格納されている１つ以上の値を用いて、定数値Ｃとして、「０」を取得する。秘密保持プログラム生成部２０３は、取得した定数値Ｃ（＝「０」）を含み、選択パラメータ群の値の更新を行う更新処理命令群１６６を生成し、生成した更新処理命令群１６６をプログラム記憶部２１０に格納されている選択対象データ１４６に挿入する。
【０１０３】
秘密保持プログラム生成部２０３は、選択対象データ１４６に挿入する分岐命令群１７６を生成する。ここでは、秘密保持プログラム生成部２０３は、呼出元のプログラムへ制御を返す処理を行う分岐命令群１７６を生成し、生成した分岐命令群１７６をプログラム記憶部２１０に格納されている選択対象データ１４６に挿入する。これにより、秘密保持プログラムを構成する選択対象データ１４６が生成されることになる。なお、最後の機能提供命令群３（選択対象主要命令群１５６）自体がｒｅｔｕｒｎ文で終わっている場合には、改めてｒｅｔｕｒｎ文を追加する必要はない。
【０１０４】
次に、秘密保持プログラム生成部２０３は、機能提供命令群、又は偽装機能提供命令群が挿入されていない選択対象データ１４０を取得する。秘密保持プログラム生成部２０３は、取得した選択対象データ１４０に、選択対象データに挿入されていない１以上の偽装機能提供命令群のうち１の偽装機能提供命令群を挿入する。秘密保持プログラム生成部２０３は、「０」〜「６」のうち定数値として使用されていない値（ここでは、「１」）を含み、選択パラメータ群の値の更新を行う更新処理命令群１６０を生成し、生成した更新処理命令群１６０を選択対象データ１４０に挿入する。
【０１０５】
秘密保持プログラム生成部２０３は、選択対象データ１４０に挿入する分岐命令群１７０を生成する。ここでは、秘密保持プログラム生成部２０３は、選択処理命令群１２０へ分岐する分岐命令群１７０を生成し、生成した分岐命令群１７０を選択対象データ１４０に挿入する。これにより、秘密保持プログラムを構成する選択対象データ１４０が生成されることになる。
【０１０６】
選択対象データ１４１、１４３、１４５の生成については、選択対象データ１４０の生成と同様であるので、ここでの説明は省略する。
ここで、機能提供命令群の挿入時における定数値の取得方法について説明する。なお、選択対象データの個数をｍ個とする。
秘密保持プログラム生成部２０３は、「０」から「ｍ−１」までの整数のうちランダムに１の整数「ｎ」を選択し、第１〜第３の選択パラメータ用変数の値をそれぞれ、「ｎ」、「第１の選択パラメータ用変数の値」、「第２の選択パラメータ用変数の値」として、式１に代入して値を算出する。算出した値が位置記憶部２１１に存在しない場合には、秘密保持プログラム生成部２０３は、選択した整数「ｎ」を定数値とする。算出した値が位置記憶部２１１に存在する場合には、秘密保持プログラム生成部２０３は、「０」から「ｍ−１」までの整数のうちランダムに１の整数「ｎ」を、再度選択し、上記の動作を、式１が位置記憶部２１１に存在しない値を算出するまで繰り返す。
【０１０７】
秘密保持プログラム生成部２０３は、全ての機能提供命令群の挿入が終了すると、複数の偽装機能提供命令群それぞれに、「０」から「ｍ−１」までの整数のうち未使用である整数を割り当てる。
なお、整数「ｎ」は「０」から「ｍ−１」までの整数から選択されたが、これに限定されない。選択する整数は、０以上の整数であればよい。この場合、偽装機能提供命令群の挿入先についても、上記にて示す定数値の算出方法を用いて決定する。
【０１０８】
（５）秘密保持プログラム１００の生成
秘密保持プログラム生成部２０３は、プログラム記憶部２１０に格納している前処理命令群１１０、選択処理命令群１２０、変遷処理命令群１３０、及び選択対象データ１４０、１４１、・・・、１４６を図２に示す順番に配置することにより、秘密保持プログラム１００を生成する。
【０１０９】
１．４．５  プログラム難読化装置１０の動作
（１）動作概要
ここでは、プログラム難読化装置１０の動作概要について、図７にて示す流れ図を用いて説明する。
プログラム難読化装置１０の入力部２００は、難読化対象プログラムと、秘密保持プログラム１００を正常系にて実行する際、秘密保持プログラムに与える３つの初期値（ここでは、「１」、「２」、「３」）を受け付ける（ステップＳ１００）。
【０１１０】
機能提供命令群生成部２０１は、入力部２００にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群を生成する（ステップＳ１０５）。
偽装機能提供命令群生成部２０２は、難読化対象プログラムが記述されているプログラミング言語で記述された1以上のプログラム命令をランダムに組み合わせた偽装機能提供命令群を複数個生成する（ステップＳ１１０）。
【０１１１】
秘密保持プログラム生成部２０３は、呼び出し元のプログラムから３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第１の前処理プログラム命令群と、選択処理命令群に分岐する第２の前処理プログラム命令群とからなり、これらを順に行う前処理命令群を生成する（ステップＳ１１５）。
【０１１２】
秘密保持プログラム生成部２０３は、選択パラメータ群を用いて、選択識別子を算出する第１の選択処理プログラム命令群と、変遷処理命令群に分岐する第２の選択処理プログラム命令群からなり、これらを順に行う選択処理命令群を生成する（ステップＳ１２０）。ここでは、秘密保持プログラム生成部２０３は、第１の選択処理プログラム命令群として、式１「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）  ＭＯＤ  ７」を算出するプログラム命令群を生成する。
【０１１３】
秘密保持プログラム生成部２０３は、選択処理命令群で算出した選択識別子に基づき、複数の選択対象データのうちいずれかの選択対象データに分岐する処理を行う変遷処理命令群を生成する（ステップＳ１２５）。具体的には、秘密保持プログラム生成部２０３は、機能提供命令群生成部２０１にて生成された複数の機能提供命令群の個数（ｍ個）と、偽装機能提供命令群生成部２０２にて生成された複数の偽装機能提供命令群の個数（ｎ個）とを取得し、その合計値を算出する。秘密保持プログラム生成部２０３は、算出した合計値（ここでは、７）と同数のラベル名を生成する。秘密保持プログラム生成部２０３は、選択処理命令群１２０に含まれる式１が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群を生成する。
【０１１４】
秘密保持プログラム生成部２０３は、３つの初期値と、式１と、生成した複数の機能提供命令群及び複数の偽装機能提供命令群とを用いて、複数の機能提供命令群の個数と、機能提供命令群の個数との合計値と同数の選択対象データを生成する（ステップＳ１３０）。
秘密保持プログラム生成部２０３は、生成した前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データを、順番に配置することにより、秘密保持プログラムを生成する（ステップＳ１３５）。
【０１１５】
（２）選択対象データの生成処理
ここでは、図７のステップＳ１３０にて示す選択対象データの生成処理の動作について、図８及び図９にて示す流れ図を用いて説明する。
秘密保持プログラム生成部２０３は、生成した各ラベル名のみからなる選択対象データを生成する（ステップＳ２００）。
【０１１６】
秘密保持プログラム生成部２０３は、カウンタｉに１を設定する（ステップＳ２０５）。ここで、カウンタｉは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。
秘密保持プログラム生成部２０３は、実行順序ｉ番目の機能提供命令群を機能提供命令群生成部２０１から取得する。秘密保持プログラム生成部２０３は、取得した実行順序ｉ番目の機能提供命令群を挿入する選択対象データを、選択パラメータ群及び式１を用いて、決定する。なお、ｉが１である場合には、秘密保持プログラム生成部２０３は、３つの初期値からなる選択パラメータ群及び式１を用いて、選択対象データを決定し、ｉが２以上である場合には、秘密保持プログラム生成部２０３は、更新された選択パラメータ群及び式１を用いて、選択対象データを決定する。秘密保持プログラム生成部２０３は、決定した選択対象データに、実行順序ｉ番目の機能提供命令群を挿入する（ステップＳ２１０）。
【０１１７】
秘密保持プログラム生成部２０３は、第２の選択パラメータ用変数の値を第３の選択パラメータ用変数に格納し、第１の選択パラメータ用変数の値を第２の選択パラメータ用変数に格納する。秘密保持プログラム生成部２０３は、第１〜第３の選択パラメータ用変数の値「定数値」、「１」、「２」を式１に代入して得られる値が、これまでに選択された１以上の選択対象データを示さない値となるように、定数値を取得する（ステップＳ２１５）。
【０１１８】
秘密保持プログラム生成部２０３は、取得した定数値を含み、選択パラメータ群の値の更新を行う更新処理命令群を生成し、生成した更新処理命令群を選択対象データに挿入する（ステップＳ２２０）。
秘密保持プログラム生成部２０３は、カウンタｉの値が、機能提供命令群の個数ｍと一致するか否かを判定する（ステップＳ２２５）。
【０１１９】
一致しないと判定する場合（ステップＳ２２５における「ＮＯ」）、秘密保持プログラム生成部２０３は、選択処理命令群へ分岐する分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する（ステップＳ２３０）。
一致すると判定する場合（ステップＳ２２５における「ＹＥＳ」）、秘密保持プログラム生成部２０３は、呼出元のプログラムへ制御を返す処理を行う分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する（ステップＳ２３５）。
【０１２０】
秘密保持プログラム生成部２０３は、カウンタｉに値「１」を加算する（ステップＳ２４０）。
秘密保持プログラム生成部２０３は、カウンタｉが機能提供命令群の個数より大きいか否かを判定する（ステップＳ２４３）。
大きくないと判定する場合には（ステップＳ２４３における「ＮＯ」）、秘密保持プログラム生成部２０３は、ステップＳ２１０に戻り、再度、処理を繰り返す。
【０１２１】
大きいと判定する場合には（ステップＳ２４３における「ＹＥＳ」）、秘密保持プログラム生成部２０３は、偽装機能提供命令群の個数ｎの間、ステップＳ２４５からステップＳ２７５を繰り返す。
秘密保持プログラム生成部２０３は、機能提供命令群も偽装機能提供命令群も挿入されていない選択対象データ、つまりラベル名のみが含まれる選択対象データを１つ取得する（ステップＳ２５０）。
【０１２２】
秘密保持プログラム生成部２０３は、選択対象データに挿入されていない偽装機能提供命令群を１つ取得し、取得した偽装機能提供命令群を、ステップＳ２５０にて取得した選択対象データに挿入する（ステップＳ２５５）。
秘密保持プログラム生成部２０３は、定数値として使用されていない値を取得し（ステップＳ２６０）、取得した定数値を含み、選択パラメータ群の値の更新を行う更新処理命令群を生成し、生成した更新処理命令群を選択対象データに挿入する（ステップＳ２６５）。
【０１２３】
秘密保持プログラム生成部２０３は、選択処理命令群へ分岐する分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する（ステップＳ２７０）。
秘密保持プログラム生成部２０３は、偽装機能提供命令群の個数ｎまでの間、ステップＳ２５０からステップＳ２７０を繰り返すと、処理を終了する（ステップＳ２７５）。
１．５  変形例
なお、本発明を上記第１の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０１２４】
（１）上記第１の実施の形態では、選択識別子を算出する算出式として式１を用いたが、これに限定されない。選択識別子を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
また、選択識別子用変数に初期値を設定しておき、選択識別子用変数を用いた式であっても構わない。また、選択処理命令群に、選択処理命令群が呼び出された回数を数えるカウンター用変数を設けておき、カウンター用変数をも用いた式であっても構わない。
【０１２５】
また、カウンター用変数は、選択処理命令群以外でカウンターの値を上げる処理を行ってもよい。
（２）上記第１の実施の形態において、最後の機能提供命令群３を含む選択対象データ１４６に、更新処理命令群１６６を含めなくてもよい。
（３）上記第１の実施の形態において、機能提供命令群の数を３つとしたが、これに限定されない。機能提供命令群の数は、幾つであってもよい。
【０１２６】
（４）上記第１の実施の形態において、選択パラメータの数を３としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式１は、「ｐ１×（第１の選択パラメータ用変数）＋ｐ２×（第２の選択パラメータ用変数）＋・・・＋ｐｎ×（第ｎの選択パラメータ用変数）  ＭＯＤ  ＮＮ」となる（ｎは２以上の整数）。なお、ｐ１、ｐ２、・・・、ｐｎは互いに素である素数であり、ＮＮを選択対象データの数とする。また、選択パラメータの更新時には、第ｉ−１のパラメータに格納されている値を第ｉのパラメータに格納する。このとき、第ｎのパラメータ、第ｎ−１のパラメータ、・・・、第２のパラメータの順に格納する。また、第１のパラメータには、実行した選択対象主要命令群が有する定数値を格納する。ここで、ｉは２以上ｎ以下の整数である。
【０１２７】
また、入力値の初期値を「１」、「２」、「３」としたがこの値でなくてもよい。
また、入力値等を３２ビットの値としたが、３２ビットより短いビット数であってもよいし、３２ビットより長いビット数であってもよい。
（５）上記第１の実施の形態において、選択対象データ１４０〜１４６に分岐命令群１７０〜１７５がある構成を、各選択対象データに選択処理命令群と変遷処理命令群を持つ構成としても構わない。
【０１２８】
（６）上記第１の実施の形態において、選択情報パラメータの初期値は、秘密保持プログラムに与えられた値としている構成を、前処理部等で、秘密保持プログラム外のプログラムやプログラムを実行する機器が有する機能を用いて決定する値としてもよい。
（７）秘密保持プログラムが秘密情報を持つ場合に、秘密情報の値を選択パラメータ用変数、選択識別子用変数を用いて算出する処理に置き換えても構わない。
【０１２９】
（８）上記第１の実施の形態のプログラム難読化装置１０において、選択対象データの数や選択パラメータの数は、必ずしも固定の値である必要はなく、別の値であってもよい。
また、これらの値を、プログラム難読化装置に入力として与えてもよい。
（９）上記第１の実施の形態において、ブロックの分割の分割方法として、ここでは簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。なお、制御構造の解析については、公知であるため説明は省略する。
【０１３０】
（１０）上記第１の実施の形態において、プログラム難読化装置１０は、初期値、定数値の決定後、機能提供命令群を挿入する選択対象データを決定したが、これに限定されない。プログラム難読化装置１０は、機能提供命令群の配置を決めた後に、初期値、定数値を決めてもよい。
（１１）上記第１の実施の形態において、プログラム難読化装置１０は、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入した後に、前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データの配置を決定して秘密保持プログラムを生成したが、これに限定されない。
【０１３１】
プログラム難読化装置１０は、前処理命令群、選択処理命令群、変遷処理命令群、及びラベル名のみからなる複数の選択対象データの配置を決定し、その後、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入して秘密保持プログラムを生成してもよい。
（１２）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【０１３２】
１．６  まとめ
上記第１の実施の形態にて示す秘密保持プログラム１００は、選択対象主要命令群１５２、１５４、１５６は実際の実行順序とは無関係にバラバラな位置に配置されるため、実行順序の解析が困難である。
また、選択対象主要命令群１５２、１５４、１５６には、他の選択対象主要命令群への直接的な分岐命令が含まれていないので、実行順序の解析が困難である。
【０１３３】
また、次にどの選択対象データに分岐するかを決定する処理を行う選択処理命令群は、選択パラメータの値によっては、全ての選択対象主要命令群に分岐する可能性があるプログラム命令であるため、実行順序の解析が困難である。さらに、選択対象データ１４０〜１４６には正常系の実行時には実行されることのない選択対象データ１４０、１４１、１４３、１４５が含まれるため、解析がより困難である。
【０１３４】
更に、本実施の形態では、複数の選択パラメータを用いて、選択対象データ１４０〜１４６の実行順序を決定している。よって、もし、不正解析者が実行順序の一部をたまたま知っていたとしても、それ以外の部分の実行順序を知ることが困難になる。このことをより具体的に説明する。例えば、秘密保持プログラムがウォーターマーク検出するアルゴリズムであった場合において、不正解析者が一般的なウォーターマーク処理に詳しく、一般的なウォーターマーク検出アルゴリズムのどのような処理で含まれるかを知っていることが考えられる。このような場合、多数の選択対象データの中から、実行されそうな選択対象データを見つけ出すことが考えられる。このとき、もし、選択処理命令群が１つの選択パラメータに基づいて実行順序を決める処理であれば、不正解析者はその１つだけの選択パラメータの値を知ることができる。これを行うには、実行されそうな選択対象データに分岐するには、変遷処理命令群がどのような選択識別子を使っているかを逆算し、さらに、そのような選択識別子をもたらすには、選択処理命令群がどのような選択パラメータに用いて処理を行ったかを逆算すればよい。以降は、選択パラメータの値の変化、選択処理命令群の処理を追跡することで実行順序を知ることが出来る。
【０１３５】
しかし、本手法のように複数の選択パラメータを用いるのであれば、たまたま、実行されそうな選択対象データを１つ見つけ出しても、選択識別子から選択パラメータを逆算することはできない。
さらに、不正解析者が、たまたま、連続して実行される選択対象データが分かる場合が考えられる。このような場合に、不正解析者は、選択処理命令群の式１に対する入出力の組をより多く知ることができるようになるので、式１に用いる選択パラメータ用の変数の数を多くすることが、解析を困難にすることになる。
【０１３６】
更に、本実施例では、選択対象データに選択パラメータを更新する処理がある。よって、不正解析者が秘密保持プログラムと、秘密保持プログラムに与えられる入力値とを知っていたとしても、選択パラメータの値がどのように変わっていくかを、順に解析していかなければ、実際に選択対象が実行される順番を解析することができない。
また、従来、例えば、Ｓｗｉｔｃｈ文を用いて、実行順序を決定する場合、あるブロックの最後に、次の実行すべきブロックを示す値（Ｓｗｉｔｃｈ文にて用いられる値）が直接記述されている。本実施の形態では、３つの値からなる選択パラメータ群を用いて選択処理命令群を実行することにより、次に実行する選択対象データが決定される。このとき、正当な３つの初期値から、まず、１番目に実行される機能提供命令群が決定される。次に、更新処理命令群により更新された選択パラメータ群（１回目の更新選択パラメータ群）から、２番目に実行される機能提供命令群が決定される。ｎ番目に実行される機能提供命令群は、３つの初期値からなる選択パラメータ群、１回目の更新選択パラメータ群、・・・、（ｎ−１）回目の選択パラメータ群を、順次用いて選択処理命令群を実行することにより、決定される。ここで、ｎは１以上の整数である。より詳細には、更新処理命令群を正当な順序で実行することにより、正当に更新された選択パラメータ群を生成し、生成した選択パラメータ群を用いて択処理命令群を実行することにより、ｎ番目に実行される機能提供命令群が決定される。本実施の形態では、選択パラメータ群を順次更新することにより、Ｓｗｉｔｃｈ文にて用いられる値を取得することができる。つまり、本実施の形態では、Ｓｗｉｔｃｈ文にて用いられる値をプログラム上では隠匿し、選択パラメータ群を順次更新することにより取得している。このように、隠匿したい情報を、いくつかの他の情報から取得することを分割秘密による難読化といい、本実施の形態における更新処理命令群が、分割秘密に相当している。
【０１３７】
２．第２の実施の形態
以下、本発明に係る第２の実施の形態としての秘密保持プログラム３００及びプログラム難読化装置３０について、図面を参照して説明する。
２．１  秘密保持システム２の概要
秘密保持システム２は、図１０に示すように、プログラム難読化装置３０と、プログラム実行装置４０とから構成されている。
【０１３８】
プログラム難読化装置３０は、実行順序を秘密にしたい難読化対象プログラムから秘密保持プログラム３００を生成し、生成した秘密保持プログラム３００をプログラム実行装置４０へ配布する。
プログラム実行装置４０は、プログラム難読化装置３０から配布された秘密保持プログラム３００を実行する。
【０１３９】
ここで、難読化対象プログラムは、命令群Ａ、命令群Ｂ、命令群Ｃの３つの命令群から構成されており、命令群Ａ、Ｂ、Ｃの順に実行することにより正しく動作するものとする。
２．２  秘密保持プログラム３００の構造
ここでは、プログラム難読化装置３０にて生成され、プログラム実行装置４０にて実行される秘密保持プログラム３００のプログラム構造について説明する。
【０１４０】
秘密保持プログラム３００は、２以上の秘密情報を用いて処理を行うプログラムである。秘密情報は、不正解析者に対して解析されたくない情報である。例えば、秘密保持プログラム３００は、秘密情報である複数のサブ鍵を用いて暗号処理を行うプログラムである。このようなプログラムにおいて複数の秘密情報を隠蔽したいという要求がある。ここでは、命令群Ａ、Ｂ、Ｃのそれぞれが、秘密情報を有しているものとする。
【０１４１】
秘密保持プログラム３００は、前処理命令群３１０、選択処理命令群３２０、主要処理命令群３４０、選択対象データ３５０〜３５６からなり、これらが図１１に示す順番に配置されている。
秘密保持プログラム３００は、呼出元のプログラムから、選択パラメータ群の初期値となる３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３および秘密情報を用いた処理で使用するパラメータを受け取り、秘密情報を用いた処理を行うプログラム命令群である。秘密保持プログラムの処理では、選択処理命令群３２０での処理に用いる複数の選択パラメータの各値（ここでは、３つの値）を保持する３２ビットの変数である第１〜第３の選択パラメータ用変数、選択識別子を保持する３２ビットの変数である選択識別子用変数、また変遷処理命令群３９０〜３９２で算出される秘密情報を格納する３２ビットの変数である秘密情報用変数を用いる。ここで、選択パラメータは、選択対象データ３５０、３５１、・・・、３５６から１の選択対象データを決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子である。
【０１４２】
ここでは、秘密保持プログラムが実際に使用される際に呼出元のプログラムから受け取る入力値ｉｎ１、ｉｎ２、ｉｎ３は値「１」、「２」、「３」であるとする。
秘密保持プログラム３００は２以上の秘密情報を用いた処理を行うプログラム命令群であり、本実施例では命令群Ａ、Ｂ、Ｃのそれぞれが有する秘密情報を、第１〜第３の秘密情報とし、それぞれの値を「１００」、「２００」、「３００」とする。
【０１４３】
２．２．１  前処理命令群３１０
前処理命令群３１０は、後述の選択処理命令群３２０で用いる選択パラメータ群の初期値を算出するプログラム命令群である。ここで、選択パラメータ群は、第１、第２及び第３の選択パラメータ用変数からなる。
前処理命令群３１０の処理は、上記第１の実施の形態にて示す前処理命令群１１０と同様のほぼ同様の処理であるが、前処理命令群１１０の最後は、選択処理命令群１２０分岐するプログラム命令群であるのに対し、前処理命令群３１０の最後は、主要処理命令群３４０へ分岐するプログラム命令群である点が異なる。
【０１４４】
２．２．２  選択処理命令群３２０
選択処理命令群３２０は、選択パラメータ群に基づき、選択対象データ３５０〜３５６から１つを選択し選択識別子とするプログラム命令群である。
選択処理命令群３２０の処理は、選択処理命令群１２０と同様とほぼ同等の処理であるが、選択処理命令群３２０はサブルーチンである点で異なる。
【０１４５】
具体的には、選択処理命令群１２０は、当該命令群の処理の最後で変遷処理命令群へ分岐するプログラム命令を有するのに対し、選択処理命令群３２０はプログラム関数であり、選択処理命令群３２０の最後ではこの関数を呼び出した呼出元に分岐する点が異なる。
なお、ここでは、選択処理命令群１２０と同様に、式１を用いて選択識別子を算出するものとする。
【０１４６】
２．２．３  選択対象データ３５０〜３５６
選択対象データ３５０〜３５６は、更新処理命令群にて読み出されるデータである。
具体的には、選択対象データ３５０〜３５６は、例えば、配列データであって、Ｃ言語の場合は、以下のような配列である。
「
ｖａｒｉａｂｌｅ＿１４０［７］＝｛１、２、３、４、５、６、７｝；
」
この配列は、後述の変遷処理命令群３９０〜３９２にて用いられる配列であり、この配列と前処理命令群３１０で選択パラメータに設定する初期値に依存して変遷処理命令群３９０〜３９２がどのようなプログラム命令群になるかが決まる。
【０１４７】
２．２．４  主要処理命令群３４０
主要処理命令群３４０は、秘密情報を用いて処理を行うプログラム命令群である。
主要処理命令群３４０は、機能提供命令群３６０〜３６２、選択処理命令群呼出命令３７０〜３７２、更新処理命令群３８０〜３８２、及び変遷処理命令群３９０〜３９２からなるプログラム命令群であり、各命令群は、図１１に示す位置に配置されている。
【０１４８】
（１）機能提供命令群３６０〜３６２
機能提供命令群３６０は、秘密情報を用いた処理を行うプログラム命令群である。秘密情報の値を用いるプログラム命令は、秘密情報用変数を用いた処理として記述されている。つまり、秘密情報が予め秘密情報用変数に変換されている。もし、秘密情報用変数の値が第１の秘密情報の値「１００」であれば、機能提供命令群３６０は、本来の処理を行うプログラム命令群である。
【０１４９】
機能提供命令群３６１も同様なプログラム命令群であり、秘密情報用変数に格納された値が秘密情報２の値が「２００」であれば、機能提供命令群３６１は、本来の処理を行うプログラム命令群である。
機能提供命令群３６２も同様なプログラム命令群であり、秘密情報用変数に格納された値が秘密情報３の値が「３００」であれば、機能提供命令群３６２は、本来の処理を行うプログラム命令群である。
【０１５０】
なお、各機能提供命令群に含まれる秘密情報は、予め秘密情報用変数に変換されている。
（２）選択処理命令群呼出命令３７０〜３７２
選択処理命令群呼出命令３７０〜３７２は、選択処理命令群３２０を呼び出すプログラム命令群である。
【０１５１】
（３）更新処理命令群３８０〜３８２
更新処理命令群３８０は、選択識別子に対応する選択対象データの値を読み出す処理を行って、読み出した値を用いて選択パラメータ群の値を更新する処理を行うプログラム命令群である。
具体的には、更新処理命令群３８０は、まず、選択識別子用変数の値が、０、１、・・・、６の場合にそれぞれ、選択対象データ３５０、３５１、・・・、３５６に格納されている値を読み出す。
【０１５２】
次に、更新処理命令群３８０は、読み出した値に基づき、選択パラメータ群の更新を行う。ここでは、更新処理命令群３８０は、第２の選択パラメータの値を第３の選択パラメータに格納し、第１の選択パラメータの値を第２の選択パラメータに格納し、第１の選択パラメータに読み出した値を格納する。
例えば、Ｃ言語のプログラム命令で、更新処理を記載すると
「
（第３の選択パラメータ変数）  ＝（第２の選択パラメータ変数）；
（第２の選択パラメータ変数）＝（第１の選択パラメータ変数）；
（第１の選択パラメータ変数）＝  ｖａｒｉａｂｌｅ＿１４０［（選択識別子用変数）］；」
で表されるプログラム命令群になる。
【０１５３】
なお、更新処理命令群３８１〜３８２は、更新処理命令群３８０と同様の構成であるので、ここでの説明は省略する。
（４）変遷処理命令群３９０〜３９２
変遷処理命令群３９０〜３９２は、選択パラメータ変数の値に基づいて秘密情報用変数の値を決定する処理である。
【０１５４】
具体的には、変遷処理命令群３９０〜３９２は、選択パラメータ変数に格納する値（秘密情報）を算出し、算出した値を秘密情報用変数に格納するプログラム命令群である。
以下に、変遷処理命令群３９０〜３９２の動作の詳細について説明する。
（４−１）変遷処理命令群３９０
変遷処理命令群３９０は、第１〜第３選択パラメータ用変数を用いた演算を行い、第１の秘密情報の値を算出し、算出した値を秘密情報用変数に格納する処理を行うプログラム命令である。
【０１５５】
例えば、変遷処理命令群３９０は、Ｐ４、Ｐ５、Ｐ６を互いに素な素数とし、「Ｐ４×（第１の選択パラメータ用変数）＋Ｐ５×（第２の選択パラメータ用変数）＋Ｐ６×（第３の選択パラメータ用変数）＋（定数１）」を算出し、算出した値を秘密情報用変数に格納する処理を行うプログラム命令群である。なお演算子「×」は掛け算を表す。ここでは、Ｐ４、Ｐ５、Ｐ６をそれぞれ値「２」、「３」、「５」、とした場合、式２「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数１）」を算出し、算出した値を秘密情報用変数に格納する処理である。
【０１５６】
以下、定数１について説明する。
秘密保持プログラム３００では、変遷処理命令群３９０が実行されるまでには、前処理命令群３１０、選択処理命令群呼出命令３７０、選択処理命令群３２０、更新処理命令群３８０が、この順序で実行されている。なお、前処理命令群３１０、選択処理命令群呼出命令３７０、選択処理命令群３２０、及び更新処理命令群３８０を実行する際には、呼出元のプログラムから受け取る入力値ｉｎ１、ｉｎ２、ｉｎ３の値をそれぞれ値「１」、「２」、「３」として実行する。その他の呼出元のプログラムから受ける入力値は任意の値であってよい。
【０１５７】
このとき、選択処理命令群３２０は、式１「２×（第１の選択パラメータ用変数（＝１））＋３×（第２の選択パラメータ用変数（＝２））＋５×（第３の選択パラメータ用変数（＝３））  ＭＯＤ  ７」により選択識別子の値は「２」となり、更新処理命令群３８０が選択対象データ３５０〜３５６から取得する値は「３」となり、第１〜第３の選択パラメータ変数の更新後の値は、「３」、「１」、「２」となる。
【０１５８】
定数１は、このようにして得られた第１〜第３の選択パラメータ変数の値を式２に代入して得られる秘密情報用変数の値が、第１の秘密情報の値「１００」になるように、予め設定された値であり、ここでは、８１となる。
（４−２）変遷処理命令群３９１
同様に、変遷処理命令群３９２は、「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数２）」からなる命令群である。
【０１５９】
以下、定数２の値について説明する。
秘密保持プログラム３００では、変遷処理命令群３９１が実行されるまでには、前処理命令群３１０、選択処理命令群呼出命令３７０、選択処理命令群３２０、更新処理命令群３８０、変遷処理命令群３９０、機能提供命令群３６０、選択処理命令群呼出命令３７１、選択処理命令群３２０、更新処理命令群３８１が、この順序で実行されている。
【０１６０】
このとき、更新処理命令群３８１にて取得される第１〜第３の選択パラメータ変数の値は、「６」、「３」、「１」となる。上記と同様の方法にて定数２を算出すると、値「１７４」となる。
（４−３）変遷処理命令群３９２
同様に、変遷処理命令群３９２は、「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数３）」からなる命令群である。
【０１６１】
秘密保持プログラム３００では、変遷処理命令群３９２が実行されるまでには、前処理命令群３１０、選択処理命令群呼出命令３７０、選択処理命令群３２０、更新処理命令群３８０、変遷処理命令群３９０、機能提供命令群３６０、選択処理命令群呼出命令３７１、選択処理命令群３２０、更新処理命令群３８１、変遷処理命令群３９１、機能提供命令群３６１、選択処理命令群呼出命令３７２、選択処理命令群３２０、及び更新処理命令群３８２、が、この順序で実行されている。
【０１６２】
このとき、更新処理命令群３８２にて取得される第１〜第３の選択パラメータ変数の値は、「６」、「６」、「３」となる。上記と同様の方法にて定数３を算出すると、値「２５５」となる。
２．３  秘密保持プログラム３００の実行
プログラム実行装置４０が、秘密保持プログラム３００を正常系で実行した場合の処理について、図１２に示す流れ図を用いて説明する。
【０１６３】
秘密保持プログラム３００は、前処理命令群３１０の処理を行う（ステップＳ３００）。具体的には、前処理命令群３１０は、入力値ｉｎ１、ｉｎ２、ｉｎ３として、それぞれ値「１」、「２」、「３」を受け取り、第１〜３の選択パラメータ用変数にそれぞれ値「１」、「２」、「３」を格納する処理を行い、選択処理命令群呼出命令３７０へ分岐する。
【０１６４】
次に、秘密保持プログラム３００は、選択処理命令群呼出命令３７０の処理を行う（ステップＳ３０５）。具体的には、選択処理命令群呼出命令３７０は、選択処理命令群３２０の呼出を行う。
次に、秘密保持プログラム３００は、受け取った入力値「１」、「２」、「３」を用いて、選択処理命令群３２０の処理を行う（ステップＳ３１０）。具体的には、選択処理命令群３２０は、式１「２×（第１の選択パラメータ用変数（＝１））＋３×（第２の選択パラメータ用変数（＝２））＋５×（第３の選択パラメータ用変数（＝３））  ＭＯＤ  ７」により値「２」を算出し、算出した値「２」を選択識別子用変数に格納する。
【０１６５】
秘密保持プログラム３００は、更新処理命令群３８０の処理を行う（ステップＳ３１５）。具体的には、更新処理命令群３８０は、選択識別子用変数の値「２」により、選択対象データ３５２の値「３」を読み出す。更新処理命令群３８０は、第２の選択パラメータの値「２」を第３の選択パラメータに格納し、第１の選択パラメータの値「１」を第２の選択パラメータに格納し、第１の選択パラメータに読み出した値「３」を格納する。
【０１６６】
秘密保持プログラム３００は、更新処理命令群３８０にて生成した選択パラメータ群（第１〜第３の選択パラメータ）を用いて変遷処理命令群３９０の処理を行う（ステップＳ３２０）。具体的には、変遷処理命令群３９０は、式２「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数１）」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「１００」が格納される。
【０１６７】
秘密保持プログラム３００は、秘密情報変数に格納された値に基づいて、機能提供命令群３６０の処理を行う（ステップＳ３２５）。具体的には、機能提供命令群３６０は、難読化対象プログラムにおける命令群Ａを実行する。
次に、秘密保持プログラム３００は、選択処理命令群呼出命令３７１の処理を行う（ステップＳ３３０）。具体的には、選択処理命令群呼出命令３７１は、選択処理命令群３２０の呼出を行う。
【０１６８】
次に、秘密保持プログラム３００は、第１〜第３の選択パラメータの値「３」、「１」、「２」を用いて、選択処理命令群３２０の処理を行う（ステップＳ３３５）。具体的には、選択処理命令群３２０は、式１「２×（第１の選択パラメータ用変数（＝３））＋３×（第２の選択パラメータ用変数（＝１））＋５×（第３の選択パラメータ用変数（＝２））  ＭＯＤ  ７」により値「５」を算出し、算出した値「５」を選択識別子用変数に格納する。
【０１６９】
秘密保持プログラム３００は、更新処理命令群３８１の処理を行う（ステップＳ３４０）。具体的には、更新処理命令群３８１は、選択識別子用変数の値「５」により、選択対象データ３５５の値「６」を読み出す。更新処理命令群３８１は、第２の選択パラメータの値「１」を第３の選択パラメータに格納し、第１の選択パラメータの値「３」を第２の選択パラメータに格納し、第１の選択パラメータに読み出した値「６」を格納する。
【０１７０】
秘密保持プログラム３００は、更新処理命令群３８１にて生成した選択パラメータ群（第１〜第３の選択パラメータ）を用いて変遷処理命令群３９１の処理を行う（ステップＳ３４５）。具体的には、変遷処理命令群３９１は、式２「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数２）」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「２００」が格納される。
【０１７１】
秘密保持プログラム３００は、秘密情報変数に格納された値に基づいて、機能提供命令群３６１の処理を行う（ステップＳ３５０）。具体的には、機能提供命令群３６１は、難読化対象プログラムにおける命令群Ｂを実行する。
次に、秘密保持プログラム３００は、選択処理命令群呼出命令３７２の処理を行う（ステップＳ３５５）。具体的には、選択処理命令群呼出命令３７２は、選択処理命令群３２０の呼出を行う。
【０１７２】
次に、秘密保持プログラム３００は、第１〜第３の選択パラメータの値「６」、「３」、「１」を用いて、選択処理命令群３２０の処理を行う（ステップＳ３６０）。具体的には、選択処理命令群３２０は、式１「２×（第１の選択パラメータ用変数（＝６））＋３×（第２の選択パラメータ用変数（＝３））＋５×（第３の選択パラメータ用変数（＝１））  ＭＯＤ  ７」により値「５」を算出し、算出した値「５」を選択識別子用変数に格納する。
【０１７３】
秘密保持プログラム３００は、更新処理命令群３８２の処理を行う（ステップＳ３６５）。具体的には、更新処理命令群３８２は、選択識別子用変数の値「５」により、選択対象データ３５５の値「６」を読み出す。更新処理命令群３８２は、第２の選択パラメータの値「３」を第３の選択パラメータに格納し、第１の選択パラメータの値「６」を第２の選択パラメータに格納し、第１の選択パラメータに読み出した値「６」を格納する。
【０１７４】
秘密保持プログラム３００は、更新処理命令群３８２にて生成した選択パラメータ群（第１〜第３の選択パラメータ）を用いて変遷処理命令群３９２の処理を行う（ステップＳ３７０）。具体的には、変遷処理命令群３９２は、式２「２×（第１の選択パラメータ用変数）＋３×（第２の選択パラメータ用変数）＋５×（第３の選択パラメータ用変数）＋（定数３）」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「３００」が格納される。
【０１７５】
秘密保持プログラム３００は、秘密情報変数に格納された値に基づいて、機能提供命令群３６２の処理を行う（ステップＳ３７５）。具体的には、機能提供命令群３６２は、難読化対象プログラムにおける命令群Ｃを実行する。
２．４  プログラム難読化装置３０
ここでは、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム３００を生成するプログラム難読化装置３０について述べる。秘密保持プログラム３００において、機能提供命令群３６０〜３６２、変遷処理命令群３９０〜３９２以外の各部は、どのような難読化対象プログラムに対しても共通して用いることができる。ここでは、機能提供命令群、変更処理命令群の生成について中心に述べる。
【０１７６】
プログラム難読化装置３０は、図１３に示すように、入力部４００と、機能提供命令群生成部４０１と、変遷処理命令群生成部４０２と、秘密保持プログラム生成部４０３とから構成されている。
プログラム難読化装置３０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置３０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０１７７】
２．４．１  入力部４００
難読化対象のプログラムと、秘密保持プログラム３００を正常系にて実行する際、秘密保持プログラム３００に与える３つの初期値（ここでは、「１」、「２」、「３」）と、秘密情報の位置を示す位置情報（ここでは、３個の秘密情報「１００」、「２００」、「３００」が出現する位置を示す情報）とを受け付ける。
【０１７８】
２．４．２  機能提供命令群生成部４０１
機能提供命令群生成部４０１は、入力部４００にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割し機能提供命令群を生成する。なお、難読化対象プログラムに無条件飛び越し、条件飛び越しが含まれる場合には、飛び越しを行うプログラム命令と飛び越し先のプログラム命令は同じブロックに含まれるように分割を行う。また、秘密情報の値を用いた処理を行うプログラム命令は、それぞれ異なるブロックに含まれるようにブロックを構成する。
【０１７９】
ここでは、難読化対象プログラムが３つの秘密情報の値を用いた処理であるとし、分割した各部に含まれる命令数が出来るだけ均等になるように３つのブロックに分割し、３つの機能提供命令群を生成する。生成した機能提供命令群は、元となったプログラム命令群が難読化対象プログラムにおいて始まりの方にあった順に機能提供命令群１〜３とする。
２．４．３  変遷処理命令群生成部４０２
変遷処理命令群生成部４０２は、定数が未決定である式２を含む変遷処理命令群を、機能提供命令群生成部４０１にて生成した機能提供命令群の個数分生成する。
【０１８０】
ここでは、変遷処理命令群生成部４０２は、定数が未決定である式２を含む変遷処理命令群を３個生成する。
２．４．４  秘密保持プログラム生成部４０３
秘密保持プログラム生成部４０３は、複数の機能提供命令群、及び機能提供命令群と同数の変遷処理命令群を用いて、前処理命令群３１０、選択処理命令群３２０、選択処理命令群呼出命令３７０〜３７２、更新処理命令群３８０〜３８２、及び選択対象データ３５０〜３５１を生成することにより秘密保持プログラム３００を生成する。
【０１８１】
秘密保持プログラム生成部４０３は、図１３に示すように、プログラム記憶部４１０を有している。
プログラム記憶部４１０は、生成された各命令群及び選択対象データを記憶する領域を有している。
秘密保持プログラム生成部４０３は、機能提供命令群生成部４０１にて生成された複数の機能提供命令群を取得し、取得した複数の機能提供命令群をプログラム記憶部４１０に格納する。
【０１８２】
秘密保持プログラム生成部４０３は、変遷処理命令群生成部４０２にて生成された、機能提供命令群の個数と同数の変遷処理命令群を取得し、取得した複数の変遷処理命令群をプログラム記憶部４１０に格納する。
（１）前処理命令群３１０の生成
秘密保持プログラム生成部４０３は、呼び出し元のプログラムから３２ビットの入力値ｉｎ１、ｉｎ２、ｉｎ３を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第１の前処理プログラム命令群と、選択処理命令群呼出命令に分岐する第２の前処理プログラム命令群とからなり、これらを順に行う前処理命令群３１０を生成する。
【０１８３】
秘密保持プログラム生成部４０３は、生成した前処理命令群３１０をプログラム記憶部４１０へ格納する。
（２）選択処理命令群３２０の生成
秘密保持プログラム生成部４０３は、選択パラメータ群に基づき、選択対象データ３５０〜３５６から１つを選択し選択識別子とする選択処理命令群３２０を生成する。
【０１８４】
なお、選択処理命令群３２０の処理は、選択処理命令群１２０と同様とほぼ同等の処理であるが、選択処理命令群３２０はサブルーチンである点で異なる。具体的には、選択処理命令群１２０は、当該命令群の処理の最後で変遷処理命令群へ分岐するプログラム命令を有するのに対し、選択処理命令群３２０はプログラム関数であり、選択処理命令群３２０の最後ではこの関数を呼び出した呼出元に分岐する点が異なる。ここでは、選択処理命令群１２０と同様に、式１を用いて選択識別子を算出するものとする。
【０１８５】
秘密保持プログラム生成部４０３は、生成した選択処理命令群３２０をプログラム記憶部４１０へ格納する。
（３）選択処理命令群呼出命令３７０〜３７２の生成
秘密保持プログラム生成部４０３は、選択処理命令群３２０を呼び出す選択処理命令群呼出命令３７０〜３７２を生成する。
【０１８６】
秘密保持プログラム生成部４０３は、生成した選択処理命令群呼出命令３７０〜３７２をプログラム記憶部４１０へ格納する。
（４）更新処理命令群３８０〜３８２の生成
秘密保持プログラム生成部４０３は、選択識別子に対応する選択対象データの値を読み出す処理を行って、読み出した値を用いて選択パラメータ群の値を更新する処理を行う更新処理命令群３８０〜３８２を生成する。
【０１８７】
秘密保持プログラム生成部４０３は、生成した更新処理命令群３８０〜３８２をプログラム記憶部４１０へ格納する。
（５）選択対象データ３５０〜３５６の生成
秘密保持プログラム生成部４０３は、更新処理命令群３８０〜３８２にて読み出されるデータである選択対象データ３５０〜３５６を生成する。秘密保持プログラム生成部４０３は、生成した選択対象データ３５０〜３５６をプログラム記憶部４１０へ格納する。
【０１８８】
具体的には、選択対象データ３５０〜３５６は、例えば、配列データであって、Ｃ言語の場合は、以下のような配列である。
「
ｖａｒｉａｂｌｅ＿１４０［７］＝｛１、２、３、４、５、６、７｝；
」
秘密保持プログラム生成部４０３による上記動作により、本発明における選択対象データをデータとして扱うことができる。
【０１８９】
（６）秘密保持プログラム３００の生成
秘密保持プログラム生成部４０３は、プログラム記憶部４１０にて記憶されている前処理命令群３１０、選択処理命令群３２０、機能提供命令群３６０〜３６２、選択処理命令群呼出命令３７０〜３７２、更新処理命令群３８０〜３８２、変遷処理命令群３９０〜３９２及び選択対象データ３５０〜３５６を、図１１に示す順番に配置することにより、変遷処理命令群３９０〜３９２に含まれる各定数が未決定である秘密保持プログラム３００ａを生成する。
【０１９０】
次に、秘密保持プログラム生成部４０３は、入力部４００にて受け取った初期値（「１」、「２」、「３」）を用いて、生成した秘密保持プログラム３００ａを、更新処理命令群３８０による処理まで実行する。その後、秘密保持プログラム生成部４０３は、変遷処理命令群３９０の実行時に、入力部４００にて受け取った秘密情報「１００」を用いて、定数１を決定し、決定した定数１を、変遷処理命令群３９０に含まれる式２へ代入する。
【０１９１】
秘密保持プログラム生成部４０３は、次に、更新処理命令群３８１による処理まで実行する。その後、秘密保持プログラム生成部４０３は、変遷処理命令群３９１の実行時に、入力部４００にて受け取った秘密情報「２００」を用いて、定数２を決定し、決定した定数２を、変遷処理命令群３９１に含まれる式２へ代入する。
秘密保持プログラム生成部４０３は、次に、更新処理命令群３８２による処理まで実行する。その後、秘密保持プログラム生成部４０３は、変遷処理命令群３９２の実行時に、入力部４００にて受け取った秘密情報「３００」を用いて、定数３を決定し、決定した定数３を、変遷処理命令群３９２に含まれる式２へ代入する。
【０１９２】
これにより、秘密保持プログラム生成部４０３は、変遷処理命令群３９０〜３９２に含まれる各定数が決定された秘密保持プログラム３００を生成することができる。
秘密保持プログラム生成部４０３は、選択処理命令群呼出命令３７０〜３７２、更新処理命令群３８０〜３８２、変遷処理命令群３９０〜３９２を配置し、各定数を決定し、対応する変遷処理命令群の式２へ代入することにより、各命令群を適切な配置位置へ挿入することができる。
【０１９３】
秘密保持プログラム生成部４０３は、入力部４００にて受け取った位置情報に基づいて、秘密情報を秘密情報用変数へと変換する。これにより、生成する秘密保持プログラムを、秘匿すべき秘密情報を予め変換した秘密変数を用いる処理とすることができる。
２．４．５  プログラム難読化装置３０の動作
ここでは、プログラム難読化装置３０の動作について、図１４にて示す流れ図を用いて説明する。
【０１９４】
プログラム難読化装置３０の入力部４００は、難読化対象プログラムと、秘密保持プログラム３００を正常系にて実行する際、秘密保持プログラムに与える３つの初期値（ここでは、「１」、「２」、「３」）と、秘密情報の位置を示す位置情報（ここでは、３個の秘密情報「１００」、「２００」、「３００」の位置を示す情報）とを受け付ける（ステップＳ４００）。
【０１９５】
機能提供命令群生成部４０１は、入力部４００にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群（ここでは、機能提供命令群３６０〜３６２）を生成する（ステップＳ４０５）。
変遷処理命令群生成部４０２は、定数が未決定である式２を含む変遷処理命令群を、ステップＳ４０５にて生成した機能提供命令群の個数分生成する（ステップＳ４１０）。ここでは、変遷処理命令群生成部４０２は、定数が未決定である式２を含む変遷処理命令群３９０〜３９２を生成する。
【０１９６】
秘密保持プログラム生成部４０３は、前処理命令群３１０を生成する（ステップＳ４１５）。
秘密保持プログラム生成部４０３は、選択処理命令群３２０を生成する（ステップＳ４２０）。
秘密保持プログラム生成部４０３は、生成した機能提供命令群の数と同数の選択処理命令群呼出命令３７０〜３７２を生成する（ステップＳ４２５）。
【０１９７】
秘密保持プログラム生成部４０３は、生成した機能提供命令群の数と同数の更新処理命令群３８０〜３８２を生成する（ステップＳ４３０）。
秘密保持プログラム生成部４０３は、選択対象データ３５０〜３５６を生成する（ステップＳ４３５）。
秘密保持プログラム生成部４０３は、生成した前処理命令群３１０、選択処理命令群３２０、機能提供命令群３６０〜３６２、選択処理命令群呼出命令３７０〜３７２、更新処理命令群３８０〜３８２、変遷処理命令群３９０〜３９２及び選択対象データ３５０〜３５６の配置を決定し、秘密保持プログラム３００ａを生成する（ステップＳ４４０）。
【０１９８】
秘密保持プログラム生成部４０３は、ステップＳ４００にて受け取った３つの初期値、及び３つの秘密情報と、秘密保持プログラム３００ａとを用いて、未決定である各定数を決定、及び各秘密情報を秘密情報用変数へと変換し、秘密保持プログラム３００を生成する（ステップＳ４４５）。
２．５  変形例
なお、本発明を上記第２の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０１９９】
（１）上記第２の実施の形態では、秘密情報を算出する算出式として式２を用いたが、これに限定されない。秘密情報を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
（２）上記第２の実施の形態では、第１の実施の形態と同様に、選択識別子を算出する算出式として式１を用いたが、これに限定されない。選択識別子を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
【０２００】
また、選択識別子用変数に初期値を設定しておき、選択識別子用変数を用いた式であっても構わない。また、選択処理命令群に、選択処理命令群が呼び出された回数を数えるカウンター用変数を設けておき、カウンター用変数をも用いた式であっても構わない。
また、カウンター用変数は、選択処理命令群以外でカウンターの値を上げる処理を行ってもよい。
【０２０１】
（３）上記第２の実施の形態において、機能提供命令群の数を３つとしたが、これに限定されない。機能提供命令群の数は、幾つであってもよい。
（４）上記第２の実施の形態において、選択パラメータの数を３としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式２は、「ｐ１×（第１の選択パラメータ用変数）＋ｐ２×（第２の選択パラメータ用変数）＋・・・＋ｐｎ×（第ｎの選択パラメータ用変数）＋定数値」となる（ｎは２以上の整数）。なお、ｐ１、ｐ２、・・・、ｐｎは互いに素である素数である。また、選択パラメータの更新時には、第ｉ−１のパラメータに格納されている値を第ｉのパラメータに格納する。このとき、第ｎのパラメータ、第ｎ−１のパラメータ、・・・、第２のパラメータの順に格納する。また、第１のパラメータには、選択識別子に対応する選択対象データから読み出した値を格納する。ここで、ｉは２以上ｎ以下の整数である。
【０２０２】
また、入力値の初期値を「１」、「２」、「３」としたがこの値でなくてもよい。
また、入力値等を３２ビットの値としたが、３２ビットより短いビット数であってもよいし、３２ビットより長いビット数であってもよい。
（５）上記第２の実施の形態において、選択情報パラメータの初期値は、秘密保持プログラムに与えられた値としている構成を、前処理部等で、秘密保持プログラム外のプログラムやプログラムを実行する機器が有する機能を用いて決定する値としてもよい。
【０２０３】
（６）秘密保持プログラムが秘密情報を持つ場合に、秘密情報の値を選択パラメータ用変数、選択識別子用変数を用いて算出する処理に置き換えても構わない。
（７）上記第２の実施の形態のプログラム難読化装置３０において、選択対象データの数や選択パラメータの数は、必ずしも固定の値である必要はなく、別の値であってもよい。
【０２０４】
また、これらの値を、プログラム難読化装置に入力として与えてもよい。
（８）上記第２の実施の形態において、ブロックの分割の分割方法として、ここでは簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。なお、制御構造の解析については、コンパイラの分野で公知であるため説明は省略する。
【０２０５】
（９）上記第２実施の形態において、プログラム難読化装置３０は、式２における各定数を決定した後に、秘密情報を秘密情報用変数に変換したが、これに限定されない。プログラム難読化装置３０は、複数の機能提供命令群の生成時に、秘密情報を秘密情報用変数に変換してもよい。つまり、プログラム難読化装置３０は、式２における各定数を決定する前に、秘密情報を秘密情報用変数に変換してもよい。この場合、プログラム難読化装置３０は、各秘密情報を、一時的に記憶し、式２における各定数を決定する際には、一時的に記憶している秘密情報を用いる。
【０２０６】
（１０）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
２．６  まとめ
上記第２の実施の形態では、選択対象の実行順序が、選択パラメータの初期値によって決定するので、プログラムのみを見て選択パラメータの初期値を知らない不正解析者に対し、選択対象データの実行順序の解析を困難にすることが出来る。
【０２０７】
更に、第２の実施の形態では、更新処理命令群に選択パラメータを更新する処理がある。よって、不正解析者が秘密保持プログラムと、秘密保持プログラムに与えられる入力値とを知っていたとしても、選択パラメータの値がどのように変わっていくかを、順に解析していかなければ、実際に選択対象が実行される順番を解析することができない。
３．第３の実施の形態
以下、本発明に係る第３の実施の形態としての秘密保持プログラム５００、プログラム難読化装置５０及び秘密処理装置６０について、図面を参照して説明する。
【０２０８】
非特許文献２及び第１の実施の形態の難読化手法では、正しい手順においては、各ブロックが１度ずつしか実行されない。このことを不正解析者が知っていた場合、効率的な解析を行うことが可能となる。
例えば、第１の実施の形態において、プログラムの正しい初期値の組み合わせを知らない不正解析者が、初期値の組み合わせを「０」、「０」、「０」と仮定した場合、秘密保持プログラム１００は、まず、式１を実行すると選択識別子「０」を取得し、選択対象データ１４３へ分岐する。そして、更新処理命令群１６３を実行することにより、各選択パラメータの値はそれぞれ、「１」、「０」、「０」となる。秘密保持プログラム１００は、さらに、更新された値「１」、「０」、「０」を用いて、式１を実行すると選択識別子「２」を取得し、選択対象データ１４２へ分岐する。そして、更新処理命令群１６２を実行することにより、各選択パラメータの値はそれぞれ、「６」、「１」、「０」となる。秘密保持プログラム１００は、さらに、更新された値「６」、「１」、「０」を用いて、式１を実行すると選択識別子「１」を取得し、各選択パラメータは、「３」、「６」、「１」に更新される。秘密保持プログラム１００は、値「３」、「６」、「１」を用いて、式１を実行すると選択識別子「１」を取得することになる。これは、選択対象データ１４１が２回実行されることになる。
【０２０９】
もし、不正解析者が同じブロックが重複して実行されることがないことを知っていたならば、この時点で選択対象データ１４１が重複して実行される初期値の組み合わせを「０」、「０」、「０」と仮定する実行手順は間違いであったことを知ることができる。この場合、その後のプログラムの解析を続けてウォーターマーク除去ツールを作成するまでもなく、この仮定が間違っていたことが分かり、効率的な解析を行うことが出来る。すなわち、上記全数攻撃にかかる時間を短くすることができる。
【０２１０】
そこで、本実施の形態では、どのような初期値の組み合わせを用いても、同じブロックが重複して実行されることない秘密保持システム３を提供する。
３．１  秘密保持システム３の概要
秘密保持システム３は、図１５に示すように、プログラム難読化装置５０と、秘密処理装置６０とから構成されている。
【０２１１】
プログラム難読化装置５０は、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム５００を生成し、生成した秘密保持プログラム５００を秘密処理装置６０へ配布する。
秘密処理装置６０は、プログラム難読化装置５０から配布された秘密保持プログラム５００を実行する。
【０２１２】
３．２  秘密保持プログラム５００の構造
秘密保持プログラム５００の構造について説明する。秘密保持プログラム５００は、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されないように、難読化されたプログラムである。
秘密保持プログラム５００は、図１６に示すように、前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０、選択対象データ５４０、５４１、・・・、５４６からなり、これらが図１６に示す順番に配置されている。
【０２１３】
また、選択対象データ５４０〜５４６はそれぞれ、選択対象主要命令群５５０〜５５６、更新処理命令群５６０〜５６６、分岐命令群５７０〜５７６からなり、これらは図１６に示す順番に配置されている。各命令部は、１以上のプログラム命令からなるプログラム命令群である。選択対象主要命令群５５０〜５５６は、このプログラムが提供する機能（例えばウォーターマーク検出の機能）の処理の一部を示すプログラム命令群であるか、あるいは、提供する機能とは無関係で正常系の実行時には実行されない命令群である。ここで、正常系とは、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わずに秘密保持プログラム５００を実行する場合のことをいう。
【０２１４】
難読対象プログラムは、例えば、図１７に示すコントロールフローのプログラムを実行するプログラムである。ここで、図１７における第１機能提供命令群６０１、第２機能提供命令群６０２、第３機能提供命令群６０３は、プログラム命令の集合であり、図１７に示すフローで実行された場合に適切な結果を出力する命令群である。しかしながら、これをそのままの順番で実行すると解析が容易となるため、秘密保持プログラム５００においてはこの実行順序を解析されにくくする難読化が施されている。すなわち、秘密保持プログラム５００は複数の選択対象データ５４０〜５４６のいずれかに第１機能提供命令群６０１、第２機能提供命令群６０２、第３機能提供命令群６０３が含まれるように難読化されている。
【０２１５】
ここでは、選択対象データ５４５、５４６、５４３に、それぞれ第１機能提供命令群６０１、第２機能提供命令群６０２、第３機能提供命令群６０３が含まれているものとし、正常系の実行時には、選択対象データ５４５、５４６、５４３が順に選択されて実行されるものとして説明を続ける。また、第１〜第３機能提供命令群が割り当てられていない選択対象データ５４０、５４１、５４２、５４４は、正常系では実行されることのない選択対象データである。これらは、正しい実行順序を知らない不正解析者が全数攻撃により解析を行う際には実行される場合がある選択対象データであり、不正解析者が第１〜第３の機能提供命令群を得にくくするために組み込まれている。以下では、このような命令群を偽装機能提供命令群と呼ぶ。
【０２１６】
ここで、秘密保持プログラム５００のコントロールフローの一例を、図１８に示す。秘密保持プログラム５００は、このコントロールフローにて示すように、まず、前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０を順次実行し、その後、変遷処理命令群５３０に基づいて、選択対象データ５４０〜５４６の何れかが実行される。秘密保持プログラム５００は、この処理を、選択対象データ５４３が実行されるまで、繰り返す。秘密保持プログラム５００は、変遷処理命令群１３０が何らかの分岐を行うことは分かっても、選択対象データが実行される順番は分からないような構造になっている。
【０２１７】
ここで、秘密保持プログラム５００の具体例としてＣ言語にて記述した秘密保持プログラム５００ａを、図１９に示す。
プログラム命令群５１０ａは前処理命令群５１０に対応し、プログラム命令群５２０ａは選択処理命令群５２０に対応し、プログラム命令群５２５ａは管理情報更新命令群５２５に対応し、プログラム命令群５３０ａは変遷処理命令群５３０に対応している。また、プログラム命令群５４０ａ、５４３ａ、５４５ａ、５４６ａのそれぞれは、選択対象データ５４０、５４３、５４５、５４６と対応している。
【０２１８】
プログラム命令群５５０ａ、５５３ａ、５５５ａ、５５６ａのそれぞれは、選択対象主要命令群５５０、５５３、５５５、５５６と対応している。プログラム命令群５６０ａ、５６３ａ、５６５ａ、５６６ａのそれぞれは、更新処理命令群５６０、５６３、５６５、５６６と対応している。また、プログラム命令群５７０ａ、５７３ａ、５７５ａ、５７６ａのそれぞれは、分岐命令群５７０、５７３、５７４、５７６と対応している。なお、選択対象データ５４１、５４２、５４４に対応する具体例は、図面の都合上記述していない。
【０２１９】
また、図２０において、図１９に示すプログラムの処理の流れを具体的に示す。
秘密保持プログラム５００は、呼出元のプログラムから、入力値ｉｎ＿１、ｉｎ＿２および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の前処理を行うプログラム命令群である。ここで、入力値ｉｎ＿１およびｉｎ＿２は、選択処理命令群５２０での処理に用いる選択パラメータＣＰ＿１およびＣＰ＿２の初期値であるものとする。本実施の形態においては、選択対象データの数が７つであるため、ｉｎ＿１およびｉｎ＿２は、７未満の非負整数であるものとして説明する。
【０２２０】
ここで、秘密保持プログラム５００は、選択パラメータＣＰ＿１、ＣＰ＿２を示す変数として「ｃｐ＿１」、「ｃｐ＿２」を、選択識別子ｓｗＶａｒを示す変数として「ｓｖ」を用いているものとする。なお、選択パラメータは、選択対象データ５４０、５４１、・・・、５４６から１の選択対象を決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子であり、次に実行すべき選択対象データを特定する情報である。
【０２２１】
以下、図１８の各ブロックと、図２０の各ブロックとの対応関係を説明する。
図２０おいては、図１８の前処理命令群５１０は、ブロック６５０に記載の「ｃｐ＿１＝１；ｃｐ＿２＝２；ｔｂ［７］＝０；」に相当する。選択処理命令群５２０は、ブロック６５１に記載の「ｌａｂｅｌ  Ａ：ｓｖ＝（ｃｐ＿１＋ｃｐ＿２＊２）％７；ｗｈｉｌｅ（ｔｂ［ｓｖ］＝＝１）｛ｓｖ＝（＋＋ｓｖ）％７；｝」に相当する。また、管理情報更新命令群５２５は、ブロック６５２に記載の「ｔｂ［ｓｖ］＝１；」に相当し、変遷処理命令群５３０は、ブロック６５３に記載の「ｓｗｉｔｃｈ（ｓｖ）」に相当し、選択対象データ５４０〜５４６は選択対象データ６６０〜６６６に相当している。
【０２２２】
また、図１６に示す更新処理命令群５６０〜５６６は、選択対象データ６６０〜６６６に含まれるそれぞれの「ｃｐ＿１＝ｃｐ２；ｃｐ２＿ｓｖ；」に相当する。また、第１〜第３機能提供命令群のそれぞれは、「ａ＝ｂ＝２；」、「ａ＊ｂ；」、［ａ−−；］に相当し、それぞれは選択対象データ６６５、６６６、６６３に含まれている。したがって、偽装機能提供命令群は、選択対象データ６６０、６６１、６６２、６６４に含まれる「ａ＝１、ａ＝２；」「ａ＊＝ｂ；ｂ＋＝ａ；」「ｂ−−；」「ａ＝ｂ／ａ」である。
【０２２３】
また、分岐命令群５７０〜５７２及び５７４〜５８６は、「ｇｏｔｏ  ｌａｂｅｌ  Ａ；」に相当し、分岐命令群５７３は、「ｒｅｔｕｒｎ；」に相当する。
それぞれの命令群の具体的な動作については以下で詳しく説明する。
３．２．１  前処理命令群５１０
前処理命令群５１０は、選択処理命令群５２０で用いる選択パラメータ群の初期値を算出するプログラム命令群である。
【０２２４】
前処理命令群５１０は、秘密保持プログラム５００が起動された際に、最初に実行されるプログラム命令群である。
前処理命令群５１０は、具体的には、呼び出し元のプログラムから入力値ｉｎ＿１、ｉｎ＿２を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータＣＰ＿１〜ＣＰ＿２に格納する命令群と、選択対象データの個数と同数の管理情報の初期化命令とからなるプログラム命令群である。ここで、管理情報のそれぞれは、選択対象データと対応しており、対応する選択対象データが実行されたか否かを管理している。
【０２２５】
ここでは、前処理命令群５１０は、選択パラメータＣＰ＿１〜ＣＰ＿２にそれぞれ、ｉｎ＿１、ｉｎ＿２の値を格納する処理を行う。また、正常系の実行時には、入力値ｉｎ＿１、ｉｎ＿２として値「１」、「２」が与えられるものとする。
前処理命令群５１０は、管理情報の初期化として、秘密処理装置６０が有する管理情報を初期化する。ここでは、管理情報は、６個の配列からなり、前処理命令群５１０は、これら全ての値に未実行を示す「０」を代入することにより、管理情報の初期化を行っている。
【０２２６】
ここで、前処理命令群５１０は、図２０におけるブロック６５０に記載の「ｃｐ＿１＝ｉｎ＿１；ｃｐ＿２＝ｉｎ＿２；ｔｂ［７］＝０；」に相当する。
３．２．２  選択処理命令群５２０
選択処理命令群５２０は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群である。
【０２２７】
以下、選択処理命令群５２０が選択識別子を算出する処理について説明する。なお、以下の説明では、選択対象データの数をＮＮという記号で表す。
まず、選択処理命令群５２０は、値ＮＮと、値ＮＮと互いに素な整数であるｐ１及びｐ２とを用いた式３「ｐ１×（選択パラメータＣＰ＿１）＋ｐ２×（選択パラメータＣＰ＿２）  ｍｏｄ  ＮＮ」により、仮の選択識別子を算出する。ここで演算子「×」は掛け算を表す。また、ｐ１とＮＮと互いに素とはｐ１とＮＮの最大公約数が１であることを示す。ここでは、ｐ１、ｐ２、及びＮＮをそれぞれ、「１」、「２」、及び「７」とする。
【０２２８】
次に、選択処理命令群５２０は、式３の結果を仮の選択識別子ｓｗＶａｒとして選択識別子用変数ｓｖに格納する。続いて、選択処理命令群５２０は、ｓｖが示す選択対象データが既に実行されているか否か判断する。
ｓｖが示す選択対照データが未実行であると判断する場合には、選択処理命令群５２０は、ｓｖの値を変更せず、選択識別子の値を現在のｓｖの値に決定する。
【０２２９】
ｓｖが示す選択対象データが既に実行されていると判断する場合は、選択処理命令群５２０は、算出した値以降で直近の未実行の選択対象データを検索する。ここで、算出した値以降の全ての選択対象データが既に実行済みであった場合には、選択処理命令群５２０は、最初の選択対象データから順に未実行の選択対象データを検索する。
選択処理命令群５２０は、検索により見つかった選択対象データの番号を選択識別子用変数ｓｖに格納する。このような処理を行うことにより、算出した値に対応する選択対象データが既に実行されている場合でも、未実行の選択対象データが常に選択されることとなり、正常系の実行時であるか否かに関わらず、常に異なる対象データが実行されることとなる。
【０２３０】
ここで、選択処理命令群５２０は、図２０におけるブロック６５１に記載の「ｓｖ＝（ｃｐ＿１＋ｃｐ＿２＊２）％７；ｗｈｉｌｅ（ｔｂ［ｓｖ］＝＝１）｛ｓｖ＝（＋＋ｓｖ）％７；｝」に相当する。
３．２．３  管理情報更新命令群５２５
管理情報更新命令群５２５は、選択処理命令群５２０で選択した選択対象データに対応する管理情報を、「実行済み」を示す状態に更新するプログラム命令群である。具体的には、図２０におけるブロック６５２に記載の「ｔｂ［ｓｖ］＝１；」に相当する。
【０２３１】
例えば、選択処理命令群５２０の動作の結果、選択識別子用変数ｓｖの値が「５」になった場合には、管理情報更新命令群５２５は、選択対象データ５４５に対応する管理情報ｔｂ［５］の値を、未実行を示す「０」から実行済みを示す「１」へと更新する。
３．２．４  変遷処理命令群５３０
変遷処理命令群５３０は、選択処理命令群５２０で選択した選択識別子に基づき、いずれかの選択対象データ５４０〜５４６に分岐する処理を行うプログラム命令群である。具体的には、選択識別子用変数ｓｖの値が、０、１、・・・、６の場合にそれぞれ、選択対象データ５４０、５４１、・・・、５４６への分岐を行うプログラム命令群である。
【０２３２】
具体例として、秘密保持プログラム５００が記述されるプログラムがＣ言語のプログラムであり、選択対象データ５４０、５４１、・・・、５４６の先頭に、それぞれラベル「ｌａｂｅｌ＿１４０：」、「ｌａｂｅｌ＿１４１：」、・・・、「ｌａｂｅｌ＿１４６：」が記述されている場合には、変遷処理命令群５３０は以下のようなプログラム命令となる。
【０２３３】
「
ｓｗｉｔｃｈ（ｓｖ）｛
ｃａｓｅ  ０：  ｇｏｔｏ  ｌａｂｅｌ＿１４０；
ｃａｓｅ  １：  ｇｏｔｏ  ｌａｂｅｌ＿１４１；
・・・
ｃａｓｅ  ６：  ｇｏｔｏ  ｌａｂｅｌ＿１４６；
｝
」
３．２．５  選択対象データ５４０〜５４６
選択対象データ５４０〜５４６は、変遷処理命令群５３０により分岐してきた際に、実行されるプログラム命令群である。
【０２３４】
選択対象データ５４０〜５４６は、それぞれ、選択対象主要命令群５５０〜５５６、更新処理命令群５６０〜５６６、分岐命令群５７０〜５７６からなるプログラム命令群である。
選択対象主要命令群５５０〜５５６は、各選択対象データにおいて行うべき処理を示すプログラム命令群である。具体的には、例えば、選択対象データ６６０に記載の「ａ＝１；ｂ＝２；」がこれに当たる。
【０２３５】
更新処理命令群５６０〜５６６は、選択パラメータ群に含まれる各値の更新を行うプログラム命令群である。ここでは、一例として、選択パラメータ変数ｃｐ＿２に格納されている値を選択パラメータ変数ｃｐ＿１に代入し、選択パラメータ変数ｃｐ＿２に、選択識別子用変数ｓｖの値を代入している。具体的には、図２０における選択対象データ６６０〜６６６のそれぞれに含まれる「ｃｐ＿１＝ｃｐ２；ｃｐ＿２＝ｓｖ；」がこれに当たる。
【０２３６】
分岐命令群５７０〜５７６は、それぞれ選択対象データ５４０〜５４６の外にある選択処理命令群５２０へ分岐するプログラム命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群のいずれかである。
ここで、最後に実行されるべき第３機能提供命令群を含む選択対象データ５４３の分岐命令群５７３は、プログラム呼び出し元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる分岐命令群は、選択処理命令群１２０へ分岐するプログラム命令群である。具体的には、図２０における選択対象データ６６０〜６６６のそれぞれに含まれる「ｇｏｔｏ  ｌａｂｅｌ  Ａ；」、又は「ｒｅｔｕｒｎ」がこれに当たる。
【０２３７】
３．３  秘密処理装置６０
ここでは、秘密保持プログラム５００を実行する秘密処理装置６０について述べる。
秘密処理装置６０は、図２１に示すように、制御部７００と記憶部７０１とから構成されている。
秘密処理装置６０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、秘密処理装置６０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０２３８】
３．３．１  記憶部７０１
記憶部７０１は、図２１に示すように、第１プログラム記憶部７０２、第２プログラム記憶部７０３、管理情報保持部７０４、及び選択パラメータ群保持部７０５を有している。
（１）第１プログラム記憶部７０２
第１プログラム記憶部７０２は、秘密保持プログラムに含まれる複数の選択対象データを記憶している。ここで、選択対象データは、秘密情報を用いた処理の手順を示す情報であり、具体的にはプログラム命令の集合等である。これらの選択対象データは、制御部７００からの指示に応じていずれかが選択され、秘密処理装置６０により選択された選択対象データに示される手順が実行される。また、選択対象データは、秘密情報を用いた演算の正しい手順を分割したもの、又は正常系では実行されることのない偽装の秘密情報を用いた演算を含むものである。
【０２３９】
なお、ここでは、第１プログラム記憶部７０２には、選択対象データ５４０、５４１、・・・、５４６の計７つが記憶されているとするが、この数が７つに限られるものではないことは言うまでもない。
（２）第２プログラム記憶部７０３
第２プログラム記憶部７０３は、秘密保持プログラムに含まれる複数の選択対象データ以外のプログラム命令を記憶している。
【０２４０】
具体的には、第２プログラム記憶部７０３は、秘密保持プログラム５００に含まれる前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０を記憶している。
（３）管理情報保持部７０４
管理情報保持部７０４は、各選択対象データのそれぞれに対して、選択対象データの実行及び未実行の情報を管理する管理情報を保持している。
【０２４１】
管理情報保持部７０４は、図２２に示すように、管理情報テーブルＴ７００を有している。
管理情報テーブルＴ７００は、選択対象データの個数からなり、選択対象データのそれぞれに対応する管理情報を記憶する領域を有している。
管理情報テーブルＴ７００に含まれる管理情報７１０〜７１６のそれぞれは、順に、選択対象データ５４０〜５４６に対応している。
【０２４２】
管理情報７１０〜７１６格納される初期値は、未実行であることを示す値「０」である。
選択対象データが制御部７００により選択されると、対応する管理情報は、制御部７００により値「０」から実行済であることを示す値「１」へと更新される。
（４）選択パラメータ群保持部７０５
選択パラメータ群保持部７０５は、選択パラメータＣＰ＿１、ＣＰ＿２からなる選択パラメータ群を保持する。
【０２４３】
３．３．２  制御部７００
制御部７００は、秘密処理装置６０全体の動作を制御し、秘密情報を用いた処理（秘密保持プログラム）を解析が困難になるように実行する。
制御部７００は、図２３に示すように、全体処理部７２０、前処理部７２１、選択処理部７２２、管理情報更新部７２３、変遷処理部７２４、及び更新処理部７２５を有している。
【０２４４】
なお、制御部７００は、これらの構成要素を別個の構成として備えるのではなく、制御部７００が随時これらの構成要素それぞれの機能を果たすものとしてもよい。
（１）前処理部７２１
前処理部７２１は、秘密保持プログラムが起動された際に、最初に動作する。
前処理部７２１は、第２プログラム記憶部７０３から前処理命令群に含まれる１以上のプログラム命令を、全体処理部７２０を介して、読み出し、読み出した１以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【０２４５】
具体的には、前処理部７２１は、まず、呼出元のプログラムからの入力値ｉｎ＿１、ｉｎ＿２を、選択パラメータＣＰ＿１及びＣＰ＿２の初期値として取得し、取得した選択パラメータＣＰ＿１及びＣＰ＿２を、全体処理部７２０を介して選択パラメータ群保持部７０５へ格納する。次に、前処理部７２１は、管理情報保持部７０４の初期化を行う。つまり、管理情報テーブルＴ７００に含まれる各管理情報の値を「０」に設定する。
【０２４６】
（２）選択処理部７２２
選択処理部７２２は、選択パラメータを用いて選択識別子ｓｗＶａｒを決定する。
選択処理部７２２は、第２プログラム記憶部７０３から選択処理命令群に含まれる１以上のプログラム命令を、全体処理部７２０を介して、読み出し、読み出した１以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【０２４７】
具体的には、選択処理部７２２は、選択パラメータ群保持部７０５に格納されている選択パラメータＣＰ＿１及びＣＰ＿２と、選択処理命令群に含まれる式３とを用いて、仮の選択識別子を算出する。選択処理部７２２は、管理情報テーブルＴ７００を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する。
実行済であると判定する場合には、選択処理部７２２は、未実行の選択対象データを示す識別子を取得し、取得した値を選択識別子ｓｗＶａｒとする。
【０２４８】
未実行であると判定する場合には、選択処理部７２２は、算出した仮の選択識別子を、選択識別子ｓｗＶａｒとする。
このような処理を行うことにより、選択処理部７２２は、選択識別子ｓｗＶａｒとして、常に未実行の選択対象データに対応する値を取得することができる。すなわち、選択パラメータの初期値がどのような値であっても同一の選択対象データが重複して実行されることはなくなるため、不正解析者による解析を困難にすることができる。
【０２４９】
（３）管理情報更新部７２３
管理情報更新部７２３は、選択処理部７２２にて選択された選択対象データに対応する管理情報を更新する。
管理情報更新部７２３は、第２プログラム記憶部７０３から管理情報命令群に含まれる以上のプログラム命令を、全体処理部７２０を介して、読み出し、読み出した１以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【０２５０】
具体的には、管理情報更新部７２３は、管理情報テーブルＴ７００に含まれる複数の管理情報のうち、選択処理部７２２にて取得された選択識別子ｓｗＶａｒに対応する管理情報を、値「０」から値「１」へと更新する。
例えば、図２２において、選択処理部７２２が選択識別子ｓｗＶａｒの値を「５」とした場合には、管理情報更新部７２３は、選択対象データ５４５に対応する管理情報７１５の値を「１」に更新する。
【０２５１】
（４）変遷処理部７２４
変遷処理部７２４は、選択処理部７２２で選択された選択識別子ｓｗＶａｒに基づき、複数の選択対象データのうち、分岐先の選択対象データを決定し、決定した選択対象データに含まれる選択対象主要命令群を実行する。
変遷処理部７２４は、第２プログラム記憶部７０３から変遷処理命令群に含まれる１以上のプログラム命令を、全体処理部７２０を介して、読み出し、読み出したプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【０２５２】
具体的には、変遷処理部７２４は、選択処理部７２２で選択された選択識別子ｓｗＶａｒに基づき、複数の選択対象データのうち、分岐先の選択対象データを決定する。
変遷処理部７２４は、決定した選択対象データに含まれる選択対象主要命令群を、全体処理部７２０を介して、読み出し、読み出した選択対象主要命令群を実行する。
（５）更新処理部７２５
更新処理部７２５は、選択された選択対象データに含まれる選択対象主要命令群が実行された後に、選択パラメータの値を更新する処理を行う。
【０２５３】
更新処理部７２５は、選択された選択対象データに含まれる更新処理命令群を、全体処理部７２０を介して第１プログラム記憶部７０２から、読み出し、読み出した更新処理命令群を実行する。
具体的には、更新処理部７２５は、選択パラメータ群保持部７０５に格納されている選択パラメータＣＰ＿１及びＣＰ＿２と、選択識別子とを用いて、選択パラメータＣＰ＿１及びＣＰ＿２の更新を行う。更新方法については、上述しているので、ここでの説明は省略する。
【０２５４】
（６）全体処理部７２０
全体処理部７２０は、制御部７００に含まれる各構成部の動作の制御を行う。
全体処理部７２０は、秘密保持プログラムの実行開始時には、前処理部７２１、選択処理部７２２、管理情報更新部７２３、変遷処理部７２４、更新処理部７２５の順に動作するように制御する。
【０２５５】
全体処理部７２０は、選択対象データに含まれる分岐命令群に基づいて、秘密保持プログラムの終了の制御、及び選択処理部７２２、管理情報更新部７２３、変遷処理部７２４、更新処理部７２５の順に動作するように制御のいずれかを行う。
具体的には、全体処理部７２０は、選択された選択対象データに含まれる分岐命令群を、全体処理部７２０を介して第１プログラム記憶部７０２から、読み出す。
【０２５６】
全体処理部７２０は、読み出した分岐命令群が、選択処理命令群への分岐を示すプログラム命令群である場合には、選択処理部７２２、管理情報更新部７２３、変遷処理部７２４、更新処理部７２５の順に動作するように制御する。
全体処理部７２０は、読み出した分岐命令群が、プログラム呼出元に制御を戻す処理のプログラム命令群である場合には、全体処理部７２０は、秘密保持プログラムを終了し、秘密保持プログラムの呼び出し元に制御を戻す。
【０２５７】
３．３．３  秘密処理装置６０の動作
ここでは、秘密処理装置６０の動作を、図２４にて示す流れ図を用いて説明する。
秘密処理装置６０の前処理部７２１は、呼出元のプログラム若しくは外部装置等からの入力値ｉｎ＿１、ｉｎ＿２を、選択パラメータＣＰ＿１及びＣＰ＿２の初期値として取得し、取得した選択パラメータＣＰ＿１及びＣＰ＿２を、全体処理部７２０を介して選択パラメータ群保持部７０５へ格納し、管理情報保持部７０４の管理情報テーブルＴ７００の初期化を行う（ステップＳ５００）。
【０２５８】
また、前処理部７２１は、必要であれば、記憶部７０１上に第１プログラム記憶部７０２、第２プログラム記憶部７０３、管理情報保持部７０４、選択パラメータ群保持部７０５に用いる領域を確保し、各領域に記憶される値の初期化を行う。
選択処理部７２２は、選択パラメータ群保持部７０５に格納されている選択パラメータＣＰ＿１及びＣＰ＿２と、選択処理命令群に含まれる式３とを用いて、仮の選択識別子を算出する（ステップＳ５０５）。
【０２５９】
選択処理部７２２は、管理情報テーブルＴ７００を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する（ステップＳ５１０）。
実行済であると判定する場合には（ステップＳ５１０における「ＹＥＳ」）、選択処理部７２２は、仮の選択識別子を更新する（ステップＳ５１５）。ここで、ステップＳ５１０およびＳ５１５の具体例は、図２０におけるブロック６５１に含まれる「ｗｈｉｌｅ(ｔｂ[ｓｖ]＝＝１){ｓｖ＝(＋＋ｓｖ)％７；」等である。この例では、ｔｂ[ｓｖ]の値が１（実行済みを示す）である限り、ｓｖをインクリメントしていくことにより、未実行の選択対象データに相当する選択識別子を探索している。
【０２６０】
未実行であると判定する場合には（ステップＳ５１０における「ＮＯ」）、選択処理部７２２は、算出した仮の選択識別子を、選択識別子ｓｗＶａｒとする。管理情報更新部７２３は、管理情報テーブルＴ７００に含まれる複数の管理情報のうち、選択識別子ｓｗＶａｒに対応する管理情報を、値「０」から値「１」へと更新する（ステップＳ５２０）。
変遷処理部７２４は、選択識別子ｓｗＶａｒに基づき、複数の選択対象データのうち、分岐先の選択対象データを取得し、取得した選択対象データに含まれる選択対象主要命令群を実行する（ステップＳ５２５）。
【０２６１】
更新処理部７２５は、選択パラメータ群保持部７０５に格納されている選択パラメータＣＰ＿１及びＣＰ＿２と、選択識別子とを用いて、選択パラメータＣＰ＿１及びＣＰ＿２の更新を行う（ステップＳ５３０）。
全体処理部７２０は、選択された選択対象データに含まれる分岐命令群がプログラムの終了を示すか否かを判断する（ステップＳ５３５）。
【０２６２】
分岐命令群がプログラムの終了を示すと判断する場合には（ステップＳ５３５における「ＹＥＳ」）、全体処理部７２０は、秘密保持プログラムを終了し、秘密保持プログラムの呼び出し元に制御を戻す。
分岐命令群がプログラムの終了を示さないと判断する場合には（ステップＳ５３５における「ＮＯ」）、つまり、分岐命令群が、選択処理命令群への分岐を示すと判断する場合には、全体処理部７２０は、ステップＳ５０５へ戻る。
【０２６３】
ステップＳ５３５は、具体的には、選択された選択対象データに含まれる分岐命令群が選択処理命令群に分岐する命令群（例えば、ｇｏｔｏ文）である場合には、判断結果を「ＮＯ」とし、分岐命令群がプログラムの終了を示す命令群（例えば、ｒｅｔｕｒｎ文）である場合には、判断結果を「ＹＥＳ」とする。
３．４  プログラム難読化装置５０
ここでは、実行順序を隠蔽したい難読化対象プログラムから、秘密保持プログラム５００を生成するプログラム難読化装置５０について述べる。
【０２６４】
プログラム難読化装置５０は、図２５に示すように、プログラム記憶部８００、入力部８０１、機能提供命令群生成部８０２、偽装機能提供命令群生成部８０３、配置順序決定部８０４、管理命令群生成部８０５、秘密保持プログラム生成部８０６、及び出力部８０７から構成されている。
プログラム難読化装置５０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置５０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０２６５】
３．４．１  プログラム記憶部８００
プログラム記憶部８００は、当該装置で生成した各命令群、及び選択対象データを記憶するための領域を有している。
３．４．２  入力部８０１
入力部８０１は、難読化対象となるプログラム、及び生成した秘密保持プログラムに与える２つの初期値を受け付ける。
【０２６６】
３．４．３  機能提供命令群生成部８０２
機能提供命令群生成部８０２は、入力部８０１にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割する。機能提供命令群生成部８０２は、分割した各ブロックを、機能提供命令群とする。これにより、機能提供命令群生成部８０２は、入力部８０１にて受け付けた難読化対象プログラムから複数の機能提供命令群を生成することができる。
【０２６７】
機能提供命令群生成部８０２は、複数のブロックに分割する際に、難読化対象プログラムに条件飛び越しを行うプログラム命令が含まれる場合には、機能提供命令群生成部８０２は、その条件飛び越しを行うプログラム命令と複数ある飛び越し先のプログラム命令とが全て同じブロックに含まれるように分割を行う。このように分割することで、機能提供命令群生成部８０２は、一つのブロックからの分岐先を必ず一つのブロックにすることが出来る。
【０２６８】
また、入力プログラムに無条件飛び越しを行うプログラム命令がある場合には、機能提供命令群生成部８０２は、その無条件飛越を行うプログラム命令と飛び越し先のプログラム命令とは同じブロックになるように分割を行う。このように分割することで、機能提供命令群生成部８０２は、一つのブロックに対する分岐元を必ず一つのブロックにすることが出来る。
【０２６９】
ここで、「条件飛び越しを行う命令」とは、所定の条件に従ってプログラム命令を飛ばすような命令であり、具体的には、「ｉｆ（ａ＝＝０）  ｇｏｔｏ  ｌａｂｅｌＡ；」等であるこの場合、変数ａがゼロであるという条件が満たされた場合に、ｌａｂｅｌＡへとプログラム命令の飛び越しを行う。また、「無条件飛び越しを行う命令」とは、常にプログラム命令を飛ばす命令であり、具体的には「ｇｏｔｏ  ｌａｂｅｌＡ；」等である。この場合、特に変数の値等に関わらず、常にｌａｂｅｌＡへの飛び越しが行われる。
【０２７０】
ここでは、機能提供命令群生成部８０２は、３つの機能提供命令群に分割したものとする。この場合におけるコントロールフローグラフは、図１７と同様になる。すなわち、前述したように飛び越し命令の飛び越し元と飛び越し先とが１つのブロックに含まれるよう分割しているので、生成されるブロックのコントロールフローグラフは、分岐のないコントロールフローとなる。ここでは、コントロールフローの始点となるブロックから順番に、各ブロックを構成するプログラム命令群を第１、第２及び第３機能提供命令群とする。
【０２７１】
３．４．４  偽装機能提供命令群生成部８０３
偽装機能提供命令群生成部８０３は、入力部８０１にて受け付けた難読化対象プログラムを元に、複数の偽装機能提供命令群を生成する。
偽装機能提供命令群生成部８０３は、例えば、難読化対象プログラムが記述されているプログラミング言語のプログラム命令をランダムに組み合わせた偽装機能提供命令群を生成する。
【０２７２】
なお、難読化対象プログラムに含まれているプログラム命令のみを用いてランダムあるいは手動で偽装機能提供命令群を生成しても構わないし、入力プログラム内にない命令を適当に生成しても構わない。また、プログラミング言語が、Ｃ言語、Ｊａｖａ（登録商標）言語などのコンパイル処理を行うプログラミング言語である場合には、コンパイルが通るように入力プログラムで使われている変数を用いて偽装機能提供命令群を生成する。また、入力プログラムで使われていない変数を偽装機能提供命令群に含める場合には、難読化後のプログラムにそのような変数の宣言を追加することによりコンパイルに失敗しないようにする。
【０２７３】
ここでは、偽装機能提供命令群生成部８０３は、４つの偽装機能提供命令群を生成したものとして説明を続ける。
３．４．５  管理命令群生成部８０５
管理命令群生成部８０５、秘密保持プログラム５００のうち、難読化対象プログラムに依存しないプログラム命令群を生成する。すなわち、図１６の秘密保持プログラム５００を例にすると、難読化対象プログラムに依存して変化するのは、難読化対象プログラムの手順を分割したものである選択対象主命令群である１５０〜１５６であるため、管理命令群生成部８０５は、その他の命令群を生成する。
【０２７４】
具体的には、管理命令群生成部８０５は、前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０、１個の更新処理命令群、分岐先が選択処理命令群を示すプログラム命令群からなる第１の分岐命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群からなる第２の分岐命令群を生成する。
このとき、管理命令群生成部８０５は、機能提供命令群生成部８０２にて生成された複数の機能提供命令群の個数（ここでは、３個）と、偽装機能提供命令群生成部８０３にて生成された複数の偽装機能提供命令群の個数（ここでは、４個）とを取得し、その合計値を算出する。管理命令群生成部８０５は、算出した合計値（ここでは、７）と同数のラベル名を生成する。管理命令群生成部８０５は、選択処理命令群５２０に含まれる式３が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群５３０を生成する。
【０２７５】
管理命令群生成部８０５は、生成した各ラベル名のみからなる選択対象データを生成する。ここでは、管理命令群生成部８０５は、７個の選択対象データ５４０〜５４６を生成する。
ここで、管理命令群生成部８０５は、生成した前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０、１個の更新処理命令群、第１の分岐命令群、及び第２の分岐命令群をプログラム記憶部８００へ格納する。
【０２７６】
また、管理命令群生成部８０５は、生成した各ラベル名のみからなる選択対象データ５４０〜５４６をもプログラム記憶部８００へ格納する。
３．４．６  配置順序決定部８０４
配置順序決定部８０４は、生成した機能提供命令群（ここでは、３つの機能提供命令群）、および偽装機能提供命令群（ここでは、４つの偽装機能提供命令群）をどのような順序で選択対象主要命令群５５０〜５５６に割り当てるのかを決定する。具体的には、配置順序決定部８０４は、選択対象主要命令群５５０〜５５６のいずれに第１〜第３機能提供命令群を配置するかを決め、残り４つの選択対象主要命令群のいずれに偽装機能提供命令群を配置するかを決める。
【０２７７】
配置順序決定部８０４は、上述した式３を予め記憶している。ここでは、式３におけるｐ１、ｐ２、及びＮＮをそれぞれ、「１」、「２」、及び「７」とする。
なお、ここでは、後述する管理命令群生成部８０５にてラベル名からなる選択対象主要命令群５５０〜５５６が生成されているものとする。
配置順序決定部８０４は、入力部８０１にて受け付けた２つの選択パラメータの初期値と、予め記憶している式３を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
【０２７８】
なお、入力部８０１にて２つの初期値として、選択パラメータＣＰ＿１（＝１）、ＣＰ＿２（＝２）を受け付けたものとする。以下に配置の決定方法の一例について説明する。
配置順序決定部８０４は、図２６に示すように、制御部８５０、選択処理部８５１、管理情報更新部８５２、更新処理部８５３及び管理情報保持部８５４を備えている。以下、配置順序決定部８０４の各構成要素についての詳細を説明する。
【０２７９】
（１）管理情報保持部８５４
管理情報保持部８５４は、管理情報テーブルＴ８００を有している。管理情報テーブルＴ８００のデータ構造は、管理情報保持部７０４が有する管理情報テーブルＴ７００のデータ構造と同様であるので、ここでの説明は省略する。
なお、ここでは、管理情報テーブルＴ８００に格納される値「１」は、対応する選択対象データには、機能提供命令群が配置されていることを示し、値「０」は、対応する選択対象データには、機能提供命令群が配置されていないことを示す。
【０２８０】
また、管理情報テーブルＴ８００の各管理情報の初期値は「０」である。
これにより、機能提供命令群が配置された位置（配置された選択対象データ）を記憶することができる。
（２）制御部８５０
制御部８５０は、選択パラメータ群を記憶するパラメータ記憶領域を有している。
【０２８１】
制御部８５０は、入力部８０１にて受け付けた選択パラメータの初期値ＣＰ＿１及びＣＰ＿２（ここでは、それぞれ「１」、「２」）をパラメータ記憶領域に記憶する。
制御部８５０は、選択処理部８５１、管理情報更新部８５２、及び更新処理部８５３の動作を制御する。
制御部８５０は、後述する選択処理部８５１が有する式３が取り得る値、つまり、式３にて取り得る選択識別子の値それぞれと、プログラム記憶部８００にて記憶されている選択対象データとの対応付けを行う。
【０２８２】
制御部８５０は、生成された第ｉ番目の機能提供命令群を機能提供命令群生成部８０２から取得する。制御部８５０は、取得した第ｉ番目の機能提供命令群を、選択処理部８５１にて取得された選択識別子に基づいて、プログラム記憶部８００にて記憶され、対応する選択対象データへ挿入する。ここで、ｉは１以上ｍ以下の整数である。また、制御部８５０は、第ｉ番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【０２８３】
制御部８５０は、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない１の偽装機能提供命令群を偽装機能提供命令群生成部８０３から取得する。制御部８５０は、取得した偽装機能提供命令群を、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入されていない１の選択対象データに挿入する。制御部８５０は、この動作を、全ての偽装機能提供命令群に対して行う。
【０２８４】
これにより、制御部８５０は、各選択対象データに、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部８５０による第ｉ番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
（３）選択処理部８５１
選択処理部８５１は、上述した式３を予め記憶している。
【０２８５】
選択処理部８５１は、パラメータ記憶領域に記憶されている選択パラメータＣＰ＿１、及びＣＰ＿２を取得する。
選択処理部８５１は、取得したＣＰ＿１及びＣＰ＿２と、予め記憶している式３とを用いて、仮の選択識別子を算出する。選択処理部８５１は、管理情報テーブルＴ８００を用いて、算出した仮の選択識別子に対応する選択対象データが配置済であるか否かを判定する。
【０２８６】
配置済であると判定する場合には、選択処理部８５１は、未配置の選択対象データを示す識別子を取得し、取得した値を選択識別子ｓｗＶａｒとする。
未配置であると判定する場合には、選択処理部８５１は、算出した仮の選択識別子を、選択識別子ｓｗＶａｒとする。
選択処理部８５１の動作と、制御部８５０による第ｉ番目の機能提供命令群を選択処理部８５１にて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
【０２８７】
（４）管理情報更新部８５２
管理情報更新部８５２は、管理情報テーブルＴ８００に含まれる複数の管理情報のうち、選択処理部８５１にて取得された選択識別子ｓｗＶａｒに対応する管理情報を、値「０」から値「１」へと更新する。
（５）更新処理部８５３
更新処理部８５３は、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部８５１にて取得された選択識別子とを用いて、選択パラメータＣＰ＿１及びＣＰ＿２の更新を行う。なお、更新方法は、上述しているので、ここでの説明は省略する。
【０２８８】
更新処理部８５３は、更新した選択パラメータ群を、制御部８５０のパラメータ記憶領域へ上書きする。
３．４．７  秘密保持プログラム生成部８０６
秘密保持プログラム生成部８０６は、プログラム記憶部８００にて記憶されている更新処理命令群を、選択対象データのそれぞれに対して、選択対象主要命令群の次に位置するように挿入する。これにより、秘密保持プログラム生成部８０６は、選択対象データのそれぞれに対して、更新処理命令群５６０〜５６６を生成することができる。管理命令群生成部８０５による更新処理命令群の生成の動作と、秘密保持プログラム生成部８０６による上記動作とにより、更新処理命令群５６０〜５６６を適切な配置先へ挿入することができる。
【０２８９】
秘密保持プログラム生成部８０６は、第ｍ番目の機能提供命令群（つまり、正常系にて最後に実行される機能提供命令群）が挿入された選択対象データに対して、管理命令群生成部８０５にて生成された第２の分岐命令群を、更新処理命令群の次に位置するように挿入する。このとき、秘密保持プログラム生成部８０６は、第ｍ番目の機能提供命令群の最後にプログラム呼出元に制御を戻す処理のプログラム命令が含まれている場合には、そのプログラム命令を削除する、若しくは、第２の分岐命令群を挿入しない。
【０２９０】
秘密保持プログラム生成部８０６は、他の選択対象データに対して、管理命令群生成部８０５にて生成された第１の分岐命令群を、更新処理命令群の次に位置するように挿入する。これにより、秘密保持プログラム生成部８０６は、選択対象データ５４０〜５４６を生成することができる。
秘密保持プログラム生成部８０６は、プログラム記憶部８００にて記憶されている各命令群を配置し、秘密保持プログラム５００を生成する。すなわち、管理命令群生成部８０５は、生成した各命令群を図１６に示す順序に配置する。
【０２９１】
３．４．８  出力部８０７
出力部８０７は、生成した秘密保持プログラムを、秘密処理装置６０へ出力する。
３．４．９  プログラム難読化装置５０の動作
（１）動作概要
ここでは、プログラム難読化装置５０の動作概要について、図２７に示す流れ図を用いて説明する。
【０２９２】
入力部８０１は、難読化対象となるプログラム、及び生成した秘密保持プログラムに与える２つの初期値を受け付ける（ステップＳ６００）。
機能提供命令群生成部８０２は、入力部８０１にて受け付けた難読化対象プログラムを１以上のプログラム命令からなる複数のブロックに分割する（ステップＳ６０５）。
偽装機能提供命令群生成部８０３は、入力部８０１にて受け付けた難読化対象プログラムを元に、複数の偽装機能提供命令群を生成する（ステップＳ６１０）。
【０２９３】
管理命令群生成部８０５は、前処理命令群５１０、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０、１個の更新処理命令群、分岐先が選択処理命令群を示すプログラム命令群からなる第１の分岐命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群からなる第２の分岐命令群、及びラベル名のみからなる複数の選択対象データを生成する（ステップＳ６１５）。なお、選択対象データの個数は、機能提供命令群の個数と偽装機能提供命令群の個数の合計値と同一である。
【０２９４】
配置順序決定部８０４は、選択パラメータ群と、予め記憶している式３を用いて、機能提供命令群および偽装機能提供命令群の配置先を決定する（ステップＳ６２０）。
秘密保持プログラム生成部８０６は、管理命令群生成部８０５にて生成された更新処理命令群を用いて、選択対象データのそれぞれに対する更新処理命令群５６０〜５６６を生成する。秘密保持プログラム生成部８０６は、第１及び第２の分岐命令群を用いて、選択対象データ５４０〜５４６を生成する。秘密保持プログラム生成部８０６は、生成された各命令群を配置し、秘密保持プログラム５００を生成する（ステップＳ６２５）。
【０２９５】
出力部８０７は、生成した秘密保持プログラムを、秘密処理装置６０へ出力する（ステップＳ６３０）。
（２）配置決定処理
ここでは、図２７のステップＳ６２０にて示す配置決定処理の動作について、図２８に示す流れ図を用いて説明する。
【０２９６】
制御部８５０は、カウンタｉに「１」を設定し、選択パラメータ群の初期値をパラメータ記憶領域へ格納する。制御部８５０は、選択識別子の値それぞれと、プログラム記憶部８００にて記憶されている選択対象データとの対応付けを行う（ステップＳ７００）。ここで、カウンタｉは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第１の機能提供命令群から順番に配置順序を決定していく。
【０２９７】
選択処理部８５１は、パラメータ記憶領域に記憶されている選択パラメータＣＰ＿１、及びＣＰ＿２を取得する。選択処理部８５１は、取得したＣＰ＿１及びＣＰ＿２と、予め記憶している式３とを用いて、仮の選択識別子を算出する（ステップＳ７０５）。例えば、選択パラメータＣＰ＿１〜ＣＰ＿２の値が「１」、「２」である場合には、式３の値は「１×１＋２×２  ＭＯＤ  ７＝５」になる。
【０２９８】
選択処理部８５１は、管理情報テーブルＴ８００を用いて、算出した仮の選択識別子に対応する管理情報の値が「１」であるか否かを判定する（ステップＳ７１０）。
「１」あると判定する場合には（ステップＳ７１０における「ＹＥＳ」）、選択処理部８５１は、仮の選択識別子を更新し（ステップＳ７１５）、ステップＳ７１０へ戻る。具体的には、選択処理部８５１は、算出した仮の選択識別子が「５」であり、値「５」に対応する管理情報の値が「１」である場合には、仮の選択識別子「５」以降の直近に値「６」を仮の選択識別子とする。
【０２９９】
「１」でないと判定する場合には（ステップＳ７１０における「ＮＯ」）、選択処理部８５１は、算出した仮の選択識別子を、選択識別子ｓｗＶａｒとし、制御部８５０は、第ｉ番目の機能提供命令群を、選択処理部８５１にて取得された選択識別子ｓｗＶａｒに基づいて、対応する選択対象データへ挿入する（ステップＳ７２０）。例えばｃｏｎｔ  ＝１  で、選択識別子の値が「５」であった場合には、第１機能提供命令群が、選択対象データ５４５に配置されることとなる。
【０３００】
管理情報更新部８５２は、管理情報テーブルＴ８００に含まれる複数の管理情報のうち、選択処理部８５１にて取得された選択識別子ｓｗＶａｒに対応する管理情報を、値「０」から値「１」へと更新する（ステップＳ７２５）。例えば、選択識別子の値が「５」であった場合には、管理情報保持部８５４の管理情報テーブルＴ８００において、選択対象データ５４５に対応する管理情報を未配置から配置済みに変える。
【０３０１】
更新処理部８５３は、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部８５１にて取得された選択識別子とを用いて、選択パラメータＣＰ＿１及びＣＰ＿２の更新を行う。更新処理部８５３は、更新した選択パラメータ群を、制御部８５０のパラメータ記憶領域へ上書きする（ステップＳ７３０）。例えば、選択パラメータの値が「１」「２」で選択識別子の値が「５」であった場合は、選択パラメータの値を「２」、「５」にする。
【０３０２】
制御部８５０は、カウンタｉに値「１」を加算する（ステップＳ７３５）。
制御部８５０は、カウンタｉが機能提供命令群の個数より大きいか否かを判定する（ステップＳ７４０）。
大きくないと判定する場合には（ステップＳ７４０における「ＮＯ」）、制御部８５０は、ステップＳ７０５に戻り、選択処理部８５１の動作を制御する。
【０３０３】
大きいと判定する場合には（ステップＳ７４０における「ＹＥＳ」）、制御部８５０は、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない１以上の選択対象データの何れかが配置先となるように、配置先を決定する（ステップＳ７４５）。例えば、選択対象データ５４０、５４１、５４２、５４４が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【０３０４】
３．５  まとめ
第３の実施の形態における秘密処理装置６０の選択処理部７２２、及び秘密保持プログラム５００の選択処理命令群５２０では、複数の選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。これにより、秘密処理装置６０や秘密保持プログラム５００が同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはないため、効率的に解析を行うことが困難になる。
【０３０５】
プログラム難読化装置５０は、難読化対象プログラムを、秘密処理装置６０にて実行される秘密保持プログラムへと変換することができる。これにより、同じプログラム命令群を重複して実行することのないことを知っている不正解析者が、変換後のプログラムに対して、選択パラメータ群の初期値を変えての全数探索を行ったとしても、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことができない。そのため、入力プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【０３０６】
３．６  変形例１
上記にて示すプログラム難読化装置５０は、配置順序決定部８０４を、以下に示す配置順序決定部８０４ａ（図示せず）に置き換えてもよい。
他の構成要素については、上記と同様であるためここでの説明は省略する。
なお、本変形例１では、プログラム難読化装置５０は、難読化対象プログラムのみを、入力部８０１にて受け付ける。
【０３０７】
３．６．１  配置順序決定部８０４ａ
配置順序決定部８０４と配置順序決定部８０４ａとの違いは、前者は、選択パラメータ用の初期値を決めてから機能提供命令群を配置する位置を決定する方法であったのに対し、後者は１番〜ｐ番目（ｐは選択パラメータの数）までの機能提供命令群を配置する位置を決めてから選択パラメータ用変数の初期値を決定し、ｐ＋１番目以降の機能提供命令群を配置する位置を決定することである。
【０３０８】
配置順序決定部８０４ａは、制御部８５０ａ、選択処理部８５１ａ、管理情報更新部８５２ａ、更新処理部８５３ａ及び管理情報保持部８５４ａを備えている。以下、配置順序決定部８０４ａの各構成要素についての詳細を説明する。
（１）管理情報保持部８５４ａ
管理情報保持部８５４ａは、管理情報保持部８５４と同様であるためここでの説明は省略する。なお、以降において必要であれば、管理情報テーブルＴ８００を用いて説明する。
【０３０９】
（２）制御部８５０ａ
制御部８５０ａは、選択パラメータの個数ｐ（ここでは、２個）を予め記憶している。
制御部８５０ａは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部８５０ａは、後述する選択処理部８５１ａが有する式３が取り得る値、つまり、式３にて取り得る選択識別子の値それぞれと、プログラム記憶部８００にて記憶されている選択対象データとの対応付けを行う。
【０３１０】
制御部８５０ａは、１〜ｐ番目の機能提供命令群を配置する位置を、ランダムに設定する。例えば、制御部８５０ａは、選択対象データ５４０〜５４６のいずれに第１の機能提供命令群を配置するかを乱数を用いて決定し、次に、第１の機能提供命令群が配置されていない選択対象データのいずれに第２の機能提供命令群を配置するかを乱数を用いて決定する。以下、同様に機能提供命令群が配置されていない選択対象データのいずれに機能提供命令群Ｋ（Ｋ＝３・・・ｍ）を配置するかを乱数を用いて決定する。
【０３１１】
制御部８５０ａは、第１〜ｐ番目の機能提供命令群それぞれの配置先に対応する管理情報の値を「０」から「１」へと更新する。制御部８５０ａは、更新された管理情報テーブルＴ８００と、第１〜ｐ番目の機能提供命令群それぞれの配置先に係る情報と、選択識別子を算出する算出式とを用いて、ｐ個の初期値を算出する。制御部８５０ａは、算出したｐ個の初期値を、表示部（図示せず）を用いて表示することにより、ユーザに通知する。
【０３１２】
制御部８５０ａは、算出したｐ個の初期値をパラメータ記憶領域に格納する。
制御部８５０ａは、選択処理部８５１ａ、管理情報更新部８５２ａ、及び更新処理部８５３ａの動作を制御する。
制御部８５０ａは、第ｉ番目の機能提供命令群を、選択処理部８５１ａにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する。ここで、ｉは（ｐ＋１）以上ｍ以下の整数であり、ｍは機能提供命令群の個数である。また、制御部８５０ａは、第ｉ番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。なお、選択処理部８５１ａについては後述する。
【０３１３】
制御部８５０ａは、機能提供命令群が挿入されていない１以上の選択対象データのそれぞれに対して、生成された複数の偽装機能提供命令群のうち１の偽装機能提供命令群を挿入する。ここで、１度挿入された偽装機能提供命令群は、他の選択対象データには挿入されない。
＜初期値算出方法の具体例＞
初期値算出方法の具体例を以下に示す。ここでは、選択パラメータ数ｐ＝２とし、選択対象データ５４０〜５４６、式３を用いる。また、第１番目の機能提供命令群は、選択対象データ５４５に配置され、第２の機能提供命令群は、選択対象データ５４６に配置されているとする。
【０３１４】
制御部８５０ａは、まず、選択対象データ５４５の処理が終了した時点での選択パラメータの値ＣＰ＿１及びＣＰ＿２を取得する。以下にその取得について説明する。選択対象データ５４５の更新処理命令群１６５は、「ｃｐ＿１＝ｃｐ＿２；ｃｐ＿２＝ｓｖ；」であるため、選択パラメータＣＰ＿１（プログラム中の変数ｃｐ＿１に相当）には、選択パラメータＣＰ＿２に設定されている値が代入される。そして、選択パラメータＣＰ＿２（プログラム中の変数ｃｐ＿２に相当）には、選択識別子の値（プログラム中の変数ｓｖに相当）の値が代入される。なお、この時点での選択識別子は第１の機能提供命令群が配置される選択対象データ５４５の識別子（すなわち、５）である。その後、上記のように値が代入された選択パラメータを用いて、選択識別子が計算しなおされる。ここまでをまとめると、第１の選択パラメータの値は選択パラメータＣＰ＿２の初期値となり、第２の選択パラメータの値は、第１の機能提供命令群が配置された選択対象データの識別子となる。本変形例１では、第２の機能提供命令群を配置する位置を選択対象データ５４６としているので、式３により算出される仮の選択識別情報は、「５」又は「６」となる。なぜなら、式３の値が「６」であれば未実行の選択対象データ５４６が選択され、式３の値が「５」であれば選択済みの選択対象データ５４５は選択されずに、それ以降の直近にある未実行の選択対象データ５４６が選択されるからである。
【０３１５】
ここで、式３の値が「５」であるためには、「１×（選択パラメータＣＰ＿１）＋２×５  ＭＯＤ  ７  ＝５」である必要があり、これを解くと選択パラメータＣＰ＿１の値が「２」となる。同様に、式の値が「６」であるためには、「１×（選択パラメータＣＰ＿１）＋２×５  ＭＯＤ７  ＝６」である必要があり、これを解くと選択パラメータＣＰ＿１の値が「３」となる。一般にｐ１とＮＮとが互いに素であるとき、全ての自然数Ａに対して、「ｐ１×Ｙ  ＭＯＤ  ＮＮ  ＝  Ａ」を満たすＹが存在する。よって、選択パラメータＣＰ＿１の値を決定することができる。
【０３１６】
よって、選択パラメータＣＰ＿２の初期値は「２」または「３」のいずれかになる。制御部８５０ａは、選択パラメータＣＰ＿２の初期値は「２」または「３」のいずれかを選択する。
以下では、制御部８５０ａは、選択パラメータＣＰ＿２の初期値として「２」を選択したものとして説明を続ける。
【０３１７】
次に、制御部８５０ａは、選択パラメータＣＰ＿１の初期値を決定する。
第１の機能提供命令群を配置した選択対象データ５４５が選択されるためには、式３によって算出される仮の選択識別子が「５」である必要がある。なお、この時点では全選択対象データが未実行であるため、式の値が選択対象データ５４５を直接示す「５」以外の値を取ることはできない。よって「１×（選択パラメータＣＰ＿１）＋２×（選択パラメータＣＰ＿２）  ＭＯＤ  ７  ＝５」である必要がある。さらに、選択パラメータＣＰ＿２の初期値は先ほど算出した通り「２」であり、管理情報更新命令群１２５が最初に実行される時点では、選択パラメータＣＰ＿２の値は、その初期値である。この値を、式３に代入すると、「１×（選択パラメータＣＰ＿１）＋２×２  ＭＯＤ  ７  ＝５」となる。これを解くと選択パラメータＣＰ＿１の値は「１」となる。この時点では、選択パラメータＣＰ＿１の値は初期値のままであるので、選択パラメータＣＰ＿１の初期値が「１」となる
これにより、第１及び第２の選択パラメータの初期値「１」、「２」が算出されることになる。
【０３１８】
（３）選択処理部８５１ａ
選択処理部８５１ａは、選択処理部８５１と同様であるため、ここでの説明は省略する。
（４）管理情報更新部８５２ａ
管理情報更新部８５２ａは、管理情報更新部８５２と同様であるため、ここでの説明は省略する。
【０３１９】
（５）更新処理部８５３ａ
更新処理部８５３ａは、更新処理部８５３と同様であるため、ここでの説明は省略する。
３．６．２  変形例１のプログラム難読化装置の動作
（１）動作概要
変形例１のプログラム難読化装置の動作は、図２７にて示すステップＳ６１５と、配置決定処理（ステップＳ６２０）との間に、初期値算出処理を追加することで、秘密保持プログラムを生成することができる。
【０３２０】
（２）初期値算出処理
ここでは、初期値算出処理の動作について、図２９にて示す流れ図を用いて説明する。
制御部８５０ａは、第１〜ｐ番目の機能提供命令群を配置する位置を、ランダムに設定する（ステップＳ８００）。
制御部８５０ａは、第１〜ｐ番目の機能提供命令群それぞれの配置先に対応する管理情報の値を「０」から「１」へと更新する（ステップＳ８０５）。
【０３２１】
制御部８５０ａは、ｊ＝ｐ〜１までの間、ステップＳ８１５からステップＳ８２５を繰り返す（ステップＳ８１０）。
制御部８５０ａは、第ｊの選択パラメータの初期値を算出し（ステップＳ８１５）、算出した第ｊの選択パラメータの初期値をパラメータ記憶領域へ格納する（ステップＳ８２０）。
【０３２２】
繰り返しの終了後、制御部８５０ａは、算出した第１〜ｐの選択パラメータの初期値を表示する（ステップＳ８３０）。
３．６．２  変形例１の効果
本変形例１のプログラム難読化装置は、難読化対象プログラムを第１の実施の形態に示したような秘密保持プログラムへと変換することができる。これにより、同じプログラム命令群を重複して実行することのないことを知っている不正解析者が、変換後の秘密保持プログラムに対して、選択パラメータ群の初期値を変えての全数探索を行ったとしても、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことができない。そのため、難読化対象プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【０３２３】
なお、本変形例１のプログラム難読化装置は、第１〜ｐの機能提供命令群の配置先を決定した後、配置決定処理にて、再度、第１〜ｐの機能提供命令群の配置先を決定している。この場合、予め決定した配置先の選択識別子が算出されるように、各選択パラメータの初期値が算出されているので、配置決定処理にて決定された第１〜ｐの機能提供命令群の配置先は、予め決定した配置先と同じになる。
【０３２４】
ここで、本変形例１のプログラム難読化装置は、第１〜ｐの機能提供命令群の配置先を決定した後、配置決定処理にて、再度、第１〜ｐの機能提供命令群の配置先を決定しなくてもよい。この場合、制御部８５０ａは、第１〜ｐの機能提供命令群を順次実行した後の、各選択パラメータの値を算出し、算出した各値をパラメータ記憶領域へ格納し、それ以降における選択処理部８５１、管理情報更新部８５２、及び更新処理部８５３の動作を制御する。このとき、図２８に示す配置決定処理を実行する際には、ステップＳ６００をｉ＝ｐ＋１に変更する。これにより、プログラム難読化装置は、すでに配置先が決定している第１〜ｐの機能提供命令群に対する位置決定処理を省略して、配置決定処理にて、第ｐ＋１以降の機能提供命令群の配置先を決定することができる。
【０３２５】
３．７  変形例２
変形例２では、機能提供命令群１〜３を図３０に示す順序で実行する秘密処理装置について説明する。すなわち、この秘密処理装置は正常系の実行時に同じ選択対象データの手順を重複して実行することがある秘密処理装置である。変形例２の秘密処理装置は、第３の実施の形態の選択処理部７２２を、図３１に図示する選択処理部７２２ｂに置き換えることにより実現される。
【０３２６】
３．７．１  選択処理部７２２ｂ
選択処理部７２２ｂは、選択対象データの選択が行われた回数をカウントするカウンタを有し、カウンタの値に応じて、選択識別子の決定方法を変化させる。
以下、第３の実施の形態と同様の選択識別子の決定方法、すなわち、未実行の選択対対象データを示す選択識別子が得られるまで選択識別子の更新を行う決定方法を「第一の決定方法」と呼ぶ。また、選択識別子の値を、Ａ回目（Ｂ＝１、２、・・・６）に決定した選択識別子の値と同一のものとする決定方法をする「第二の決定方法」と呼ぶ。
【０３２７】
以下、選択処理部７２２ｂは、図３１に示すように決定方法保持部７５０ｂ、選択履歴保持部７５１ｂ、カウンタ７５２ｂ、制御部７５３ｂを有している。
（１）決定方法保持部７５０ｂ
決定方法保持部７５０ｂは、図３１に示すように、決定方法テーブルＴ１０００を有している。
【０３２８】
決定方法テーブルＴ１０００は、選択回数と決定方法とからなる組を１以上記憶するための領域を有している。
選択回数は、選択対象データの選択回数を示し、決定方法は、その回数の場合における選択識別子の決定方法を示している。
値「０」が決定方法に設定されている場合には、選択識別子の決定方法が第一の決定方法であることを示し、値「０」以外の値「Ａ」が決定方法に設定されている場合には、選択識別子の決定方法が第二の決定方法であることを示す。値「Ａ」が設定されている場合には、Ａ回目に選択された値と同一の選択識別子を取得することを示す。
【０３２９】
例えば、選択回数と決定方法とからなる組が、「１、０」である場合には、１回目に選択する選択対象データを決定する選択識別子は、第一の決定方法を用いて決定されることを表している。また、選択回数と決定方法とからなる組が、「３、１」である場合には、３回目に選択する選択対象データを決定する選択識別子は、第二の決定方法を用いて決定され、１回目に決定された値と同一の選択識別子とすることを表している。
【０３３０】
（２）選択履歴保持部７５１ｂ
選択履歴保持部７５１ｂは、過去に決定された選択識別子を、決定された時点におけるカウンタの値と対応付けて保持している。
（３）カウンタ７５２ｂ
カウンタ７５２ｂは、現在行おうとしているの選択対象データの選択が何回目の選択であるのかをカウントする。カウンタ７５２ｂの初期値は１であり、選択を行うたびにカウンタ７５２ｂの値をインクリメントする。
【０３３１】
（４）制御部７５３ｂ
制御部７５３ｂは、カウンタ７５２ｂの値と、決定方法テーブルＴ１０００とを用いて、選択識別子の決定方法を決定する。具体的には、カウンタ７５２ｂの値が「１」である場合には、制御部７５３ｂは、決定方法テーブルＴ１０００の選択回数が「１」に対応する決定方法「０」を取得する。制御部７５３ｂは、取得した決定方法が「０」であるので、選択識別子の決定方法は、第一の決定方法であると決定する。なお、取得した決定方法の値が「０」以外である場合には、制御部７５３ｂは、選択識別子の決定方法は、第二の決定方法であると決定する。
【０３３２】
制御部７５３ｂは、決定した決定方法が第一の決定方法である場合には、選択処理命令群５２０を実行する場合と同様の処理により選択識別子を選択する。
制御部７５３ｂは、決定した決定方法が第二の決定方法である場合には、取得した値「Ａ」を用いて、Ａ回目に決定された選択識別子を選択履歴保持部７５１ｂから取得する。
制御部７５３ｂは、カウンタ７５２ｂが示す値と決定された選択識別子とを選択履歴保持部７５１ｂに格納する。制御部７５３ｂはカウンタ１３４０の値を１カウントアップする。
【０３３３】
３．７．２  秘密処理装置の動作
変形例２における秘密処理装置の動作は、図２４にて示すステップＳ５００に、カウンタ７５２ｂのカウンタｃｏｕｎｔに初期値「１」を設定する処理を追加する。
その後、以下に示す識別子算出処理を行い、その後、ステップＳ５２０以降を行う。ステップＳ５３５における判断が「ＹＥＳ」の場合には処理を終了し、「ＮＯ」である場合には、識別子算出処理に戻る。
【０３３４】
以下に、識別子算出処理の動作について、図３２にて示す流れ図を用いて説明する。
なお、ここでは、選択パラメータの数が２個であるとし、選択識別子を算出する式は、式３を用いる。また、必要があれば、第３の実施の形態にて示す構成部を用いて説明する。
制御部７５３ｂは、カウンタ７５２ｂの値と、決定方法テーブルＴ１０００とを用いて、選択識別子の決定方法を決定する（ステップＳ８５０）。
【０３３５】
制御部７５３ｂは、決定した決定方法が第一の決定方法であるか否かを判断する（ステップＳ８５５）
第一の決定方法であると判断する場合には（ステップＳ８５５における「ＹＥＳ」）、制御部７５３ｂは、選択パラメータ群保持部７０５に格納されている選択パラメータＣＰ＿１及びＣＰ＿２と、選択処理命令群に含まれる式３とを用いて、仮の選択識別子を算出する（ステップＳ８６０）。
【０３３６】
制御部７５３ｂは、管理情報テーブルＴ７００を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する（ステップＳ８６５）。
制御部７５３ｂは、実行済であると判定する場合には（ステップＳ８６５における「ＹＥＳ」）、制御部７５３ｂは、仮の選択識別子を更新する（ステップＳ８７０）。
未実行であると判定する場合には（ステップＳ８６５における「ＮＯ」）、制御部７５３ｂは、カウンタ７５２ｂが示す値と決定された選択識別子とを選択履歴保持部７５１ｂに格納し（ステップＳ８８０）、カウンタ１３４０の値ｃｏｕｎｔをインクリメントする（ステップＳ８８５）。
【０３３７】
第二の決定方法であると判断する場合には（ステップＳ８５５における「ＮＯ」）、制御部７５３ｂは、決定方法テーブルＴ１０００か取得した決定方法の値「Ａ」を用いて、Ａ回目に決定された選択識別子を選択履歴保持部７５１ｂから取得し（ステップＳ８７５）、ステップＳ８８０以降の動作を行う。
３．７．３  変形例２の効果
変形例２における選択処理部７２２ｂは、図３１にて示す決定方法テーブルＴ１０００では、３、４、６番目に実行する選択対象データを選択する際に、選択済みの選択対象データから１つを選択している。よって、難読化対象プログラムが同じ選択対象データを重複して実行することを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれ、効率的に間違った初期値を見つけ出していくことができない。そのため、難読化対象プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【０３３８】
３．８  変形例３
ここでは、ループを有し、ループ内のプログラム命令群が実行される回数が固定の回数である難読化対象プログラムから秘密保持プログラムを生成するプログラム難読化装置５０ｃである。本変形例３では、一例として、難読化対象プログラムのコントロールフローを図３３に示す。このプログラムにはループ構造が２箇所あり、それぞれのループ内のプログラム命令が実行される回数は２回である。
【０３３９】
以下、図３３に示す難読化対象プログラムを用いて説明する。
３．８．１  プログラム難読化装置５０ｃ
プログラム難読化装置５０ｃは、図３４にて示すように、プログラム記憶部８００ｃ、入力部８０１ｃ、機能提供命令群生成部８０２ｃ、偽装機能提供命令群生成部８０３ｃ、配置順序決定部８０４ｃ、管理命令群生成部８０５ｃ、秘密保持プログラム生成部８０６ｃ、出力部８０７、及び選択処理命令群生成部８０８ｃから構成されている。
【０３４０】
プログラム難読化装置５０ｃは、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置５０ｃは、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０３４１】
なお、プログラム難読化装置５０ｃは、難読化対象プログラムから３つの機能提供命令群を取得するものとする。また、プログラム難読化装置５０ｃで生成される秘密保持プログラムの構造は、上記にて示す秘密保持プログラム５００の構造と同一であるものとし、以下の説明において、必要であれば、秘密保持プログラム５００で用いた符号を用いて説明する。
【０３４２】
（１）プログラム記憶部８００ｃ
プログラム記憶部８００ｃは、上記第３の実施の形態にて示すプログラム記憶部８００と同様であるため、説明は省略する。
（２）入力部８０１ｃ
入力部８０１ｃは、上記第３の実施の形態にて示す入力部８０１と同様であるため、説明は省略する。
【０３４３】
なお、入力部８０１ｃが受け取る難読化対象プログラムは、ループを有し、ループ内のプログラム命令群が実行される回数が予め定められているプログラムである。
（３）機能提供命令群生成部８０２ｃ
機能提供命令群生成部８０２ｃは、入力部８０１ｃにて受け取った難読化対象プログラムから、複数の機能提供命令群を生成する。
【０３４４】
機能提供命令群生成部８０２ｃは、例えば、入力部８０１ｃが図３３に示す難読化対象プログラムを受け取ると、ループ内に存在する２つのプログラム命令群（ここでは、ステップＳ９０５で実行されるプログラム命令群１と、ステップＳ９２５で実行されるプログラム命令群２）のそれぞれに対して、上記にて示す機能提供命令群生成部８０２と同様に動作を行って、複数の機能提供命令群を生成する。ここでは、機能提供命令群生成部８０２ｃは、プログラム命令群１を分割して２つの機能提供命令群（以下、機能提供命令群１、２という。）を生成し、プログラム命令群２から、１つの機能提供命令群（以下、機能提供命令群３という。）を生成する。
【０３４５】
図３３に示すコントロールフローを、生成した３つの機能提供命令群に置き換えたコントロールフローを、図３５に示す。
ステップＳ９０５で実行されるプログラム命令群１が、ステップＳ９０６で実行される機能提供命令群１と、ステップＳ９０７で実行される機能提供命令群２とに置き換わり、ステップＳ９２５で実行されるプログラム命令群２が、ステップＳ９２６で実行される機能提供命令群３に置き換わっている。なお、プログラム命令群２と機能提供命令群３とは同一のものである。
【０３４６】
（４）偽装機能提供命令群生成部８０３ｃ
偽装機能提供命令群生成部８０３ｃは、上記にて示す偽装機能提供命令群生成部８０３と同様であるため、説明は省略する。
（５）選択処理命令群生成部８０８ｃ
選択処理命令群生成部８０８ｃは、変形例２に示した選択処理部７２２ｂをコンピュータ等に実現させるプログラム命令群を生成する。
【０３４７】
選択処理命令群生成部８０８ｃは、まず、決定方法保持部７５０ｂが有する決定方法テーブルＴ１０００を生成する。
選択処理命令群生成部８０８ｃは、図３５にて示すコントロールフローから、ループを展開したプログラムのコントロールフローを生成する。具体的には、図３５において、ループ内のプログラム命令である第１及び第２機能提供命令群をループが実行される回数分すなわち、２回展開し、第３機能提供命令群も同様に２回展開する。図３６に各機能提供命令群を展開したプログラムのコントロールフローを示す。
【０３４８】
次に、選択処理命令群生成部８０８ｃは、ループを展開したプログラムのコントロールフローを元に、決定方法保持部７５０ｂに保持する決定方法を生成する。
図３６のコントロールフローにおいて、ステップＳ９５０〜Ｓ９７５はそれぞれ、１〜６番目に実行されるブロックである。このコントロールフローにおいて３番目に実行される機能提供命令群１は１番目に実行される機能提供命令群１と同じである。よって、選択処理命令群生成部８０８ｃは、決定方法テーブルＴ１０００の選択回数「３」に対応する決定方法には値「１」を設定する。同様に、選択処理命令群生成部８０８ｃは、決定方法テーブルＴ１０００の選択回数「４」、「６」のそれぞれに対応する決定方法には値「２」、「５」を設定する。
【０３４９】
また、図３６のコントロールフロー上では存在しないが、ループを展開した後のコントロールフロー上でも一度しか現れないブロックを選択する際の選択識別子の決定方法は、未配置の選択対象データより選択するという決定方法とする。
このようにして、選択処理命令群生成部８０８ｃは、決定方法保持部７５０ｂにて保持する決定方法テーブルＴ１０００を生成する。具体的には、選択処理命令群生成部８０８ｃは、コンピュータ上に、決定方法テーブルＴ１０００のデータ構造を持たせるようなプログラム命令群を生成する。これにより、ｅ回目の選択識別子が、未実行の選択対象データを示す選択識別子となる決定方法を用いる場合には「ｅ、０」の組を持ち、ｆ回目に決定した選択識別子と同一のものとする場合には「ｅ、ｆ」の組を持つような決定方法テーブルＴ１０００が実現できる。
【０３５０】
また、選択処理命令群生成部８０８ｃは、さらに、選択履歴保持部７５１ｂ、カウンタ７５２ｂおよび制御部７５３ｂをコンピュータ上に実現するプログラム命令群も生成する。ここで、選択履歴保持部７５１ｂを実現するプログラム命令群は、選択識別子をカウンタの値と対応付けて記憶するような命令群である。カウンタ７５２ｂを実現するプログラム命令群は、初期値を「１」とし、１インクリメントするカウンタを示す命令群である。また、制御部７５３ｂを実現する命令群は、変形例２にて説明した動作を実現するプログラム命令群である。以下において、カウンタ示す命令群及び、制御部７５３ｂを実現する命令群をあわせて決定方法制御命令群という。
【０３５１】
これにより、選択処理命令群生成部８０８ｃは、選択処理部７２２ｂを動作させるためのプログラム命令群を生成することができる。
選択処理命令群生成部８０８ｃは、生成した各命令群をプログラム記憶部８００ｃへ格納する。
（６）配置順序決定部８０４ｃ
配置順序決定部８０４ｃは、生成した機能提供命令群（ここでは、３つの機能提供命令群）、および偽装機能提供命令群（ここでは、４つの偽装機能提供命令群）をどのような順序で選択対象主要命令群５５０〜５５６に割り当てるのかを決定する。具体的には、配置順序決定部８０４ｃは、選択対象主要命令群５５０〜５５６のいずれに第１〜第３機能提供命令群を配置するかを決め、残り４つの選択対象主要命令群のいずれに偽装機能提供命令群を配置するかを決める。
【０３５２】
配置順序決定部８０４ｃは、上述した式３を予め記憶している。ここでは、式３におけるｐ１、ｐ２、及びＮＮをそれぞれ、「１」、「２」、及び「７」とする。
配置順序決定部８０４ｃは、入力部８０１ｃにて受け付けた２つの選択パラメータの初期値と、予め記憶している式３を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
【０３５３】
なお、入力部８０１ｃにて２つの初期値として、選択パラメータＣＰ＿１（＝１）、ＣＰ＿２（＝２）を受け付けたものとする。以下に配置の決定方法の一例について説明する。
配置順序決定部８０４ｃは、図３７に示すように、制御部８５０ｃ、選択処理部８５１ｃ、管理情報更新部８５２ｃ、更新処理部８５３ｃ及び管理情報保持部８５４ｃを備えている。以下、配置順序決定部８０４ｃの各構成要素についての詳細を説明する。
【０３５４】
＜管理情報保持部８５４ｃ＞
管理情報保持部８５４ｃは、管理情報保持部８５４と同様であるので、説明は省略する。なお、以降において必要であれば、管理情報テーブルＴ８００を用いて説明する。
これにより、機能提供命令群が配置された位置（配置された選択対象データ）を記憶することができる。
【０３５５】
＜制御部８５０ｃ＞
制御部８５０ｃは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部８５０ｃは、入力部８０１ｃにて受け付けた選択パラメータの初期値ＣＰ＿１及びＣＰ＿２（ここでは、それぞれ「１」、「２」）をパラメータ記憶領域に記憶する。
制御部８５０ｃは、選択処理部８５１ｃ、管理情報更新部８５２ｃ、及び更新処理部８５３ｃの動作を制御する。
【０３５６】
制御部８５０ｃは、後述する選択処理部８５１ｃが有する式３が取り得る値、つまり、式３にて取り得る選択識別子の値それぞれと、プログラム記憶部８００ｃにて記憶されている選択対象データとの対応付けを行う。
制御部８５０ｃは、生成された第ｉ番目の機能提供命令群を機能提供命令群生成部８０２ｃから取得する。制御部８５０ｃは、取得した第ｉ番目の機能提供命令群を、選択処理部８５１ｃにて取得された選択識別子に基づいて、プログラム記憶部８００ｃにて記憶され、対応する選択対象データへ挿入する。ここで、ｉは１以上ｍ以下の整数である。また、制御部８５０ｃは、第ｉ番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【０３５７】
制御部８５０ｃは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない１の偽装機能提供命令群を偽装機能提供命令群生成部８０３から取得する。制御部８５０ｃは、取得した偽装機能提供命令群を、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入されていない１の選択対象データに挿入する。制御部８５０ｃは、この動作を、全ての偽装機能提供命令群に対して行う。
【０３５８】
これにより、制御部８５０ｃは、各選択対象データに、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部８５０ｃによる第ｉ番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
＜選択処理部８５１ｃ＞
選択処理部８５１ｃは、上述した式３を予め記憶している。
【０３５９】
選択処理部８５１ｃは、図３６にて示すコントロールフロー及び選択処理命令群生成部８０８ｃにて生成された選択処理部７２２ｂを動作させるためのプログラム命令群に基づいて、各機能提供命令群の配置先を決定する。
選択処理部８５１ｃは、図３６にて示すコントロールフローにより、ｔ回目に実行される第ｉの機能提供命令群を取得する。ここで、ｔは、１以上６以下の整数であり、ｉは１以上３以下の整数である。
【０３６０】
選択処理部８５１ｃは、選択処理命令群生成部８０８ｃにて生成された決定方法テーブルＴ１０００を用いて、選択回数「ｔ」に対応する決定方法を取得する。
決定方法が「０」である場合には、選択処理部８５１ｃは、上記にて示す選択処理部８５１と同様の動作により、選択識別子ｓｗＶａｒを取得する。選択処理部８５１ｃは、取得した選択識別子ｓｗＶａｒと、第ｉの機能提供命令群とを対応付ける。これにより、制御部８５０ｃは、第ｉの機能提供命令群を、対応する選択識別子ｓｗＶａｒにて示される選択対象データに挿入することができる。
【０３６１】
決定方法が「０」以外の値である場合には、選択処理部８５１ｃは、ｔ＋１回目に実行される第ｊの機能提供命令群を取得し、上記の動作を行う。
選択処理部８５１ｃの動作と、制御部８５０ｃによる第ｉ番目の機能提供命令群を選択処理部８５１ｃにて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
【０３６２】
＜管理情報更新部８５２ｃ＞
管理情報更新部８５２ｃは、管理情報更新部８５２と同様であるので、説明は省略する。
＜更新処理部８５３ｃ＞
更新処理部８５３ｃは、更新処理部８５３と同様であるため、説明は省略する。
【０３６３】
（７）管理命令群生成部８０５ｃ
管理命令群生成部８０５ｃは、上記にて示す管理命令群生成部８０５と同様であるため説明は省略する。
（８）秘密保持プログラム生成部８０６ｃ
秘密保持プログラム生成部８０６ｃは、プログラム記憶部８００ｃにて記憶されている各命令群を配置し、秘密保持プログラムを生成する。すなわち、管理命令群生成部８０５ｃが生成した命令群と、選択処理命令群生成部８０８ｃが生成した命令群と、配置順序決定部８０４ｃにて生成された選択対象データとを図３８のような順序に配置し、秘密保持プログラム１８００を生成する。管理命令群生成部８０５ｃによる更新処理命令群の生成の動作と、秘密保持プログラム生成部８０６ｃによる上記動作とにより、各命令群を適切な配置位置へ挿入することができる。
【０３６４】
なお、選択処理命令群生成部８０８ｃが生成する決定方法制御命令群５８０以外の他の命令群の位置については、特に明示していないが、例えば前処理命令群５１０の中等に含ませることで、実行開始時に必要な領域を確保したり、決定方法保持部７５０ｂを例えばメモリ上に生成したりすることができる。
さらに、秘密保持プログラム生成部８０６ｃは、選択対象主要命令群５５０〜５５６に対し、機能提供命令群生成部８０２ｃが生成した複数の機能提供命令群および偽装機能提供命令群生成部８０３ｃが生成した複数の偽装機能提供命令群を、配置順序決定部８０４ｃが決定した順序に対応するように配置する。
【０３６５】
（９）出力部８０７ｃ
出力部８０７ｃは、上記にて示す出力部８０７と同様であるので、説明は省略する。
３．８．２  プログラム難読化装置５０ｃの動作
ここでは、プログラム難読化装置５０ｃの動作について説明する。
プログラム難読化装置５０ｃの動作は、基本的には、プログラム難読化装置５０と同様である。以下に、図２７にて示す流れ図を用いて、プログラム難読化装置５０の動作と異なる点を中心に説明する。
【０３６６】
ステップＳ６２０は、配置順序決定部８０４ｃにより実行される。
また、図２７にて示す流れ図において、選択処理命令群生成部８０８ｃが動作するステップを加える。選択処理命令群生成部８０８ｃを動作させるステップは、配置順序決定部８０４ｃによる配置順序を決定する前、つまりステップＳ６２０より前であれば、どの位置でもよい。
【０３６７】
３．８．３  変形例３の効果
本変形例３のプログラム難読化装置５０ｃは、難読化対象プログラムを第３の実施の形態にて示すような秘密保持プログラムへと変換することができる。ここで、第３の実施の形態にて示すプログラム難読化装置５０とは異なり、ループのあるプログラムで難読化することができるため、より多種の入力プログラムに対して、難読化を施すことができる。
【０３６８】
３．９  変形例４
変形例４にて示すプログラム難読化装置は、第３の実施の形態のプログラム難読化装置によるプログラムの難読化に加え、さらに、定数を含むプログラム命令を、その定数を含まないプログラム命令に置き換える難読化を追加する装置である。
３．９．１  変形例４のプログラム難読化装置
ここで、プログラム難読化装置は、機能提供命令群を構成するプログラム命令に含まれる第一の定数を「（第１の選択パラメータ）＋（第２の選択パラメータ）＋（第二の定数）」に置き換える。例えば、機能提供命令群１にプログラム命令「ｂ＝ａ＋３０」が含まれており、機能提供命令群１が実行される際の第１及び第２選択パラメータそれぞれの値が「１」、「２」である場合に、「ｂ＝ａ＋３０」を「ｂ＝ａ＋（選択パラメータＣＰ＿１）＋（選択パラメータＣＰ＿２）＋２７」に置き換える。
【０３６９】
以下、このような変換を行うプログラム難読化装置を説明する。
変形例４では、第３の実施の形態で示す配置順序決定部８０４の変わりに配置順序決定部８０４ｄ（図示せず）を用いる。配置順序決定部８０４ｄは、第３の実施の形態で説明した構成要素に加え、プログラム命令変更部８１０ｄを有する。
プログラム命令変更部８１０ｄは、上述したように入力プログラム中の定数を「（第１の選択パラメータ）＋（第２の選択パラメータ）＋（第二の定数）」に置き換える処理を行う。具体的には、配置順序決定部８０４ｄが現在見ている各機能提供命令群について、定数を含むプログラム命令が含まれている場合に、パラメータ記憶領域に格納されている第１及び第２の選択パラメータを取得する。プログラム命令変更部８１０ｄは、取得した第１及び第２の選択パラメータを用いて、その定数を「（第１の選択パラメータ）＋（第２の選択パラメータ）＋（第二の定数）」に置き換えていく処理を行う。
【０３７０】
ここで、第二の定数は、第一の定数から第１及び第２の選択パラメータのそれぞれの値を減算することにより算出される。
３．９．２  動作
以下、変形例４のプログラム難読化装置の動作を、配置順序決定部８０４ｄの処理の流れを中心に図３９を用いて説明する。なお、変形例４のプログラム難読化装置の動作は、配置順序決定部８０４ｄの動作以外は第３の実施の形態と同様である。
【０３７１】
配置順序決定部８０４ｄは、カウンタｃｏｕｎｔに「１」を設定し、パラメータ記憶領域に選択パラメータ群の初期値を格納する（ステップＳ１０００）。
配置順序決定部８０４ｄは、パラメータ記憶領域に記憶されている選択パラメータＣＰ＿１、及びＣＰ＿２を取得する。配置順序決定部８０４ｄは、取得したＣＰ＿１及びＣＰ＿２と、予め記憶している式３とを用いて、仮の選択識別子を算出する（ステップＳ１００５）。
【０３７２】
配置順序決定部８０４ｄは、第ｃｏｕｎｔ番目の機能提供命令群の配置先を決定する（ステップＳ１０１０）。具体的には、配置順序決定部８０４ｄは、図２８にて示すステップＳ７１０、Ｓ７１５、Ｓ７２０を行う。
配置順序決定部８０４ｄは、第ｃｏｕｎｔ番目の機能提供命令群に定数を含むプログラム命令が存在するか否かを判断する（ステップＳ１０１５）。
【０３７３】
存在すると判断する場合には（ステップＳ１０１５における「ＹＥＳ」）、配置順序決定部８０４ｄは、定数を含むプログラム命令を取得し、取得したプログラム命令に含まれる定数及びパラメータ記憶領域に格納されている第１及び第２の選択パラメータを用いて第二の定数を算出する（ステップＳ１０２０）。配置順序決定部８０４ｄは、取得したプログラム命令に含まれる定数を、第１及び第２の選択パラメータと、算出した第二の定数とに置き換える（ステップＳ１０２５）。例えば、配置順序決定部８０４ｄは、「ｂ＝ａ＋３０」を「ｂ＝ａ＋（選択パラメータ１）＋（選択パラメータ２）＋２７」に置き換える。なお、配置順序決定部８０４ｄは、ステップＳ１０２０及びＳ１０２５の動作を、第ｃｏｕｎｔ番目の機能提供命令群に存在する定数を含むプログラム命令全てに対して行う。
【０３７４】
配置順序決定部８０４ｄは、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部８５１にて取得された選択識別子とを用いて、選択パラメータＣＰ＿１及びＣＰ＿２の更新を行い、更新した選択パラメータ群を、パラメータ記憶領域へ上書きする（ステップＳ１０３０）。
配置順序決定部８０４ｄは、管理情報テーブルＴ８００に含まれる複数の管理情報のうち、取得された選択識別子ｓｗＶａｒに対応する管理情報を、値「０」から値「１」へと更新する（ステップＳ１０３５）。
【０３７５】
配置順序決定部８０４ｄは、カウンタｃｏｕｎｔに値「１」を加算する（ステップＳ１０４０）。
配置順序決定部８０４ｄは、カウンタｃｏｕｎｔが機能提供命令群の個数より大きいか否かを判定する（ステップＳ１０４５）。
大きくないと判定する場合には（ステップＳ１０４５における「ＮＯ」）、配置順序決定部８０４ｄは、ステップＳ１００５に戻る。
【０３７６】
大きいと判定する場合には（ステップＳ１０４５における「ＹＥＳ」）、配置順序決定部８０４ｄは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない１以上の選択対象データの何れかが配置先となるように、配置先を決定する（ステップＳ１０５０）。
第ｃｏｕｎｔ番目の機能提供命令群に定数を含むプログラム命令が存在しないと判断する場合には（ステップＳ１０１５における「ＮＯ」）、配置順序決定部８０４ｄは、ステップＳ１０３０以降を行う。
【０３７７】
なお、ここでは、定数を置き換える置換式を「（選択パラメータ１）＋（選択パラメータ２）＋（第二の定数）」としているが、他の式であっても構わない。その場合は式「（置換式）＝（第一の定数）」から第二の定数を求める式を作成し、その式を用いて、第二の定数を算出してもよい。また、置換式は固定である必要はなく、置き換えを行うたびに別々のものを用いても構わない。
【０３７８】
また、なお、説明に用いた難読化対象プログラムは一例であって、そのコントロールフローやループの回数、その他の制御構造はこれに限るものではない。
３．９．３  変形例４の効果
本変形例４のような変換を行えば、第３の実施の形態で行った難読化に加え、生成されたプログラム中の定数の値を直接見ることが出来なくなり、さらに解析が困難になる。特に、秘密情報である鍵の値等を本変形例４によって、直接見ることが出来なくすることで、秘密情報の値の解析を困難にすることが出来る。
【０３７９】
３．１０  その他の変形例
なお、本発明を上記第３の実施の形態、及び変形例１〜４に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
（１）上記第３の実施の形態において、選択識別子の算出式を「１×（選択パラメータＣＰ＿１）＋２×（選択パラメータＣＰ＿２）  ＭＯＤ  ７」としているが、これに限定されない。何らかの形で選択識別子の候補を算出できる式であれば他の式であっても構わない。
【０３８０】
（２）上記第３の実施の形態において、選択パラメータ群の更新処理（更新処理命令群）が、選択対象データ５４０〜５４６に埋め込まれているが（例えば、図２０における選択対象データ６６０の「ｃｐ＿１＝ｃｐ＿２；ｃｐ＿２＝ｓｖ；」など）、これに限定されない。秘密保持プログラムは、更新処理命令群を選択対象データ５４０〜５４６の実行後に参照する構成でもよい。
【０３８１】
（３）また、図２０では、図２４にて示すステップＳ５３５における判断は明示的には行っておらず、正常系の実行において最後に実行される選択対象データ５４３の実行後に処理を終了する構成としているが、これに限定されない。秘密保持プログラムは、実行された選択対象データが処理の最後に実行すべき選択対象データであるかの判断処理を選択対象データから独立した形で実行してもよい。
【０３８２】
（４）さらに、上記第３の実施の形態では、選択パラメータを更新することにより間接的に選択対象識別子を更新しているが、これに限定されない。秘密保持プログラムは、選択識別子を直接更新する構成としてもよい。この場合は、図２４にて示すステップＳ５３０において選択識別子の更新を行い、ステップＳ５３５における判断結果が「ＮＯ」である場合には、ステップＳ５１０へ戻る。
【０３８３】
（５）上記第３の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
（６）上記第３の実施の形態において、プログラム難読化装置は、難読化対象プログラムを、秘密保持プログラムに変換する際に、入力部にて選択パラメータの初期値を受け取ったが、これに限定されない。プログラム難読化装置は、選択パラメータの初期値は定められているものとし、予め記憶していてもよい。
【０３８４】
（７）上記第３の実施の形態では、機能提供命令群が３つ、偽装機能提供命令群が４つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は１個以上であればよい。
（８）上記第３の実施の形態では、選択対象部の数、選択パラメータの数、選択識別子の計算式を、固定して秘密保持プログラムを生成する場合について述べたが、これらの値や式を必ずしも固定の値である必要はなく、別の値や式であってもよい。これらの値や式は、例えば、プログラム難読化装置に入力として与えられる構成であってもよいし、全数攻撃を用いて攻撃を行う際の全数に基づいて決定する構成であってもよい。なお、入力として与えられる構成である場合には、生成される秘密保持プログラム５００が正しくコンピュータ上で動作することを保証するためには、選択識別子の計算式は、その計算結果が常に選択対象データの数以下であるような式が望ましい。また、この式は不正解析者による解析を困難にするため、選択パラメータの値に応じて算出される値が大きく変動するような式が望ましい。
【０３８５】
また、選択パラメータの初期値は、難読化対象となるプログラム毎にランダムな値であるとしてもよい。これにより、仮に不正解析者が正しい選択パラメータの初期値を得ることができたとしても、他のプログラムに対してはその初期値を適用することができなくなる。
（９）上記第３の実施の形態では、ブロックの分割は、簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。
【０３８６】
（１０）上記第３の実施の形態では、秘密処理装置６０を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
（１１）上記第３の実施の形態において、秘密処理装置６０は、図２４のステップＳ５３５の判断結果により、処理の終了又は継続の判断を行っているが、これに限定されない。
【０３８７】
秘密処理装置６０は、図２４のステップＳ５３５にて示す判断の代わりに、分割後ブロックの個数と同一の選択処理データが選択されたか否かを判断してもよい。
この場合の、秘密保持プログラム５００ｅの具体例を図４０の流れ図にて示す。図４０にて示すプログラムの流れ図は、図１８の各ブロックをＣ言語で記述した具体例である。
図４０における値「ｉ」は、選択対象データの選択回数を示す。ブロック６５１ｅに含まれる条件式「ｉｆ  （ｉ  ＞  ３）  ｔｈｅｎ  ｒｅｔｕｒｎ；」により、秘密保持プログラム５００ｅの終了、及び処理の継続が制御されている。つまり、選択回数が３より大きい場合には、秘密処理装置６０は、秘密保持プログラム５００ｅの実行を終了し、３以下の場合には、秘密保持プログラム５００ｅの実行を継続する。ここで、条件式に含まれる値「３」は分割後ブロックの数と同一の値である。
【０３８８】
また、選択対象データに含まれる分岐命令群は、選択処理命令群に分岐する分岐命令に統一されている。
これにより、正常系の実行において最後に実行される選択対象データを、見つけ出すことは困難になる。
また、条件式「ｉｆ  （ｉ  ＞  ３）  ｔｈｅｎ  ｒｅｔｕｒｎ；」に含まれる値を、分割後ブロックの数と同一とすることで、正条系の動作において最後に実行される選択対象データ（例えば、第３の機能提供命令群）を実行後に、常に秘密保持プログラム５００ｅの動作が終了することが保証されている。
【０３８９】
（１２）上記第３の実施の形態において、選択パラメータの数を２としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式３は、「ｐ１×（第１の選択パラメータ用変数）＋ｐ２×（第２の選択パラメータ用変数）＋・・・＋ｐｎ×（第ｎの選択パラメータ用変数）  ｍｏｄ  ＮＮ」となる（ｎは２以上の整数）。なお、ＮＮとｐ１、ｐ２、・・・、ｐｎとは互いに素である整数である。また、選択パラメータの更新時には、第ｉのパラメータに格納されている値を第ｉ−１のパラメータに格納する。このとき、第１のパラメータ、第２のパラメータ、・・・、第ｎ−１のパラメータの順に格納する。また、第ｎのパラメータには、選択対象データの選択に使用した選択識別子の値を格納する。ここで、ｉは２以上ｎ以下の整数である。
【０３９０】
（１３）上記第３の実施の形態において、プログラム難読化装置５０は、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入した後に、前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データの配置を決定して秘密保持プログラムを生成したが、これに限定されない。
【０３９１】
プログラム難読化装置５０は、前処理命令群、選択処理命令群、変遷処理命令群、及びラベル名のみからなる複数の選択対象データの配置先を決定して、その後、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入して秘密保持プログラムを生成してもよい。
（１４）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【０３９２】
４．第４の実施の形態
以下、本発明に係る第４の実施の形態としての秘密保持プログラム２０００、プログラム難読化装置１０１０及び秘密処理装置１０２０について、図面を参照して説明する。
なお、システムの構成は、第３の実施の形態にて示す構成と同様であるため、説明は省略する。
【０３９３】
秘密処理装置１０２０は、第３の実施の形態にて示す秘密処理装置６０と同様に、秘密情報を用いた装置である。
秘密処理装置１０２０と、第３の実施の形態にて示す秘密処理装置６０とは、構成要素は同じであるが、各部の処理がそれぞれ異なっている。以下では、各部の処理の説明が中心となるため、説明を簡単にするために、コンピュータ上で実行されることで秘密処理装置を実現する秘密保持プログラム２０００の説明をもって、秘密処理装置の説明に替える。ここで、秘密処理装置１０２０の構成と秘密保持プログラム２０００の各部との対応関係は第３の実施の形態と同様である。
【０３９４】
４．１  秘密保持プログラム２０００
秘密保持プログラム２０００の全体構成図を図４１に示す。以下では秘密保持プログラム２０００の詳細について、図４１を参照しながら説明していく。ここで、第３の実施の形態の秘密保持プログラム５００と同様の部分については、同一の符号を付け、説明を省略する。
【０３９５】
秘密保持プログラム２０００は、第３の実施の形態にて示す秘密保持プログラム５００と同様、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されないように、難読化されたプログラムである。
秘密保持プログラム２０００は、第３の実施の形態と同様の管理情報更新命令群５２５、変遷処理命令群５３０と、第３の実施の形態と異なる前処理命令群２０１０、選択処理命令群２０２０、選択対象データ２０４０、２０４１、・・・、２０４６とを備え、これらが図４１に示す順番に配置されている。各部の具体的な説明は後述する。
【０３９６】
選択対象データ２０４０〜２０４６はそれぞれ、第３の実施の形態と同様の選択対象主要命令群５５０〜５５６、第３の実施の形態と異なる更新処理命令群２０６０〜２０６６と分岐命令群２０７０〜２０７６とからなり、これらは図４１に示す順番に配置されている。各部は１以上のプログラム命令からなるプログラム命令群である。
秘密保持プログラム２０００は、呼出元のプログラムから、３つの入力値ｉｎ＿１、ｉｎ＿２、ｉｎ＿３および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の処理を行うプログラム命令群である。なお、ｉｎ＿ｋ（ｋはインデックス）は（７−ｋ）未満の非負整数である。なお、選択対象データをここでは、２０４０〜２０４６の７つとしているが、これに限らない。選択対象データの個数をｎ＋１個としてもよい。ここで、ｎは自然数である。このとき、ｉｎ＿ｋは（ｎ＋１−ｋ）未満の非負整数である。また、入力値の個数は、ｉｎ＿１、ｉｎ＿２、ｉｎ＿３の３つとしているが、これに限らない。ｍ（ｍはｎ＋１以下の自然数）個であってもよい。
【０３９７】
秘密保持プログラム２０００の処理では、選択処理命令群２０２０での処理に用いる選択パラメータ群の選択パラメータＣＰ＿１、ＣＰ＿２、ＣＰ＿３と選択パラメータインデックスＣＰＩと、選択識別子を保持する選択識別子用変数を用いる。
ここでは、秘密保持プログラム２０００が正常系の実行時に呼出元のプログラムから受け取る入力値ｉｎ＿１、ｉｎ＿２、ｉｎ＿３は値「２」、「４」、「３」であるとする。本実施の形態で提供する秘密保持プログラム２０００は、呼出元のプログラムから受け取る値を用いれば、（選択対象主要命令群を含む）選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、（選択対象主要命令群を含む）選択対象データの実行順序を知ることが困難なプログラムである。
【０３９８】
４．１．１  前処理命令群２０１０
前処理命令群２０１０は、選択処理命令群２０２０で用いる選択パラメータ群を設定するプログラム命令群である。なお、選択パラメータ群は、選択パラメータＣＰ＿１、選択パラメータＣＰ＿２、選択パラメータＣＰ＿３と、選択パラメータインデックスＣＰＩからなる。これらの選択パラメータＣＰ＿１〜ＣＰ＿３は、非負整数値であり、選択パラメータインデックスＣＰＩは自然数である。
【０３９９】
前処理命令群２０１０は、秘密保持プログラム２０００が起動された際に、最初に実行されるプログラム命令群である。呼び出し元のプログラムから入力値ｉｎ＿１、ｉｎ＿２、ｉｎ＿３を受け取り、受け取った３つの値それぞれを選択パラメータ群の選択パラメータＣＰ＿１、選択パラメータＣＰ＿２、選択パラメータＣＰ＿３にそれぞれ格納し、選択パラメータ群の選択パラメータインデックスＣＰＩを値「１」に設定するプログラム命令群を含む。正常系の実行時には、ｉｎ＿１、ｉｎ＿２、ｉｎ＿３は値「２」、「４」、「３」であり、選択パラメータＣＰ＿１〜ＣＰ＿３にそれぞれ値「２」、「４」、「３」を格納する処理を行う。なお、選択パラメータは、入力値ｉｎ＿１、ｉｎ＿２、・・・の個数（本実施の形態では３個）だけ存在する。
【０４００】
４．１．２  選択処理命令群２０２０
選択処理命令群２０２０は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群を含む。なお、選択識別子は、第３の実施の形態と同様、変遷処理命令群の実行時に使用する値である。
選択処理命令群が選択識別子を算出する処理では、まず、選択パラメータ群の選択パラメータインデックスＣＰＩに対し、選択パラメータ群の選択パラメータＣＰ＿ＣＰＩを選択する（すなわち、ＣＰＩ＝１の場合には、選択パラメータＣＰ＿１を選択する）。
【０４０１】
次に、秘密処理装置１０２０が有する管理情報を用いて、未実行の選択対象データの中でＣＰ＿ＣＰＩ番目の選択対象データを選択する。選択した選択対象データの番号を選択識別子用変数に格納する。ここで、選択対象データの番号は１からではなく、０から順に数える。例えば、選択対象データ２０４０が未実行であり、ＣＰ＿ＣＰＩ＝０である場合は、選択対象データ２０４０を選択し、選択識別子用変数には０が格納される。
【０４０２】
４．１．３  選択対象データ２０４０〜２０４６
選択対象データ２０４０〜２０４６は、変遷処理命令群５３０による分岐後に、いずれかが実行されるプログラム命令群である。
選択対象データ２０４０〜２０４６は、それぞれ、第３の実施の形態と同様の選択対象主要命令群１５０〜１５６と、第３の実施の形態と異なる更新処理命令群２０６０〜２０６６と分岐命令群２０７０〜２０７６とを含むプログラム命令群である。
【０４０３】
本実施の形態では、正常系での実行時には、選択対象主要命令群５５２、５５５、５５４の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群５５２、５５５、５５４のそれぞれには、第１〜第３の機能提供命令群が入る。また、選択対象主要命令群５５０、５５１、５５３、５５６には、偽装機能提供命令群が入る。
【０４０４】
（１）更新処理命令群２０６０〜２０６６
更新処理命令群２０６０〜２０６６は、次回の選択時に用いる選択パラメータ群の値の更新を行うプログラム命令群である。具体的には、更新処理命令群２０６０〜２０６６は、選択パラメータインデックスＣＰＩをインクリメントする。これにより、選択処理命令群２０２０は、選択時に用いる選択パラメータを直接指定する。
【０４０５】
（２）分岐命令群２０７０〜２０７６
分岐命令群２０７０〜２０７６は、それぞれ選択対象データ２０４０〜２０４６の外にある選択処理命令群２０２０へ分岐するプログラム命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群の何れかからなる。
第３の機能提供命令群を含む選択対象データ２０４４に含まれる分岐命令群２０７４は、プログラム呼び出し元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる選択対象外への分岐命令群は、選択処理命令群２０２０へ分岐するプログラム命令群である。
【０４０６】
４．１．４  動作
（１）秘密保持プログラム２０００の実行時の動作
ここでは、秘密保持プログラム２０００を実行した場合の秘密処理装置１０２０の動作と秘密処理装置６０の動作との異なる点を、図２４を用いて説明する。
秘密処理装置１０２０の動作は、図２４に示すステップＳ５００、ステップＳ５０５、ステップＳ５３０の動作を以下の動作に変更する。
【０４０７】
本実施の形態では、ステップＳ５００を、選択パラメータの初期値を、機能提供命令群の数と同じだけ取得、選択パラメータインデックスＣＰＩの値の初期化、及び前処理の実行を行うように変更する。
本実施の形態では、ステップＳ５０５を、選択識別子を、選択パラメータインデックスＣＰＩが示す番号を持つ選択パラメータを選択することにより選択するように変更する。例えば、選択パラメータインデックスＣＰＩが「１」の場合は選択パラメータＣＰ＿１を選択する。
【０４０８】
本実施の形態では、ステップＳ５３０を、選択パラメータインデックスＣＰＩの値をインクリメントするように変更する。
（２）動作の具体例
以下、本実施の形態における秘密保持プログラム２０００の動作の具体例を、図４２を用いて説明する。
【０４０９】
ここでは、上述したように、選択対象主要命令群５５２、５５５、５５４のそれぞれに、第１〜第３の機能提供命令群が含まれ、選択対象主要命令群５５０、５５１、５５３、５５６には、偽装機能提供命令群が含まれており、正常系での実行時には、選択対象主要命令群５５２、５５５、５５４の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【０４１０】
秘密保持プログラム２０００は、前処理命令群２０１０の処理を行う（ステップＳ２０００）。具体的には、秘密保持プログラム２０００の前処理命令群２０１０は、呼出元のプログラムから、入力値ｉｎ１、ｉｎ２、ｉｎ３として、それぞれ値「２」、「４」、「３」を受け取り、第１〜３の選択パラメータ用変数にそれぞれ値「２」、「４」、「３」を格納する処理、及び選択パラメータインデックスＣＰＩを値「１」に初期化する処理を行い、選択処理命令群２０２０へ分岐する。
【０４１１】
秘密保持プログラム２０００は、選択処理命令群２０２０の処理を行う（ステップＳ２００５）。具体的には、選択処理命令群２０２０は、選択パラメータインデックスＣＰＩに格納されている値に基づいて、１つの選択パラメータを取得する。選択処理命令群２０２０は、取得した選択パラメータに基づいて、複数の選択対象データうち１の選択対象データを選択する。ここでは、選択パラメータインデックスＣＰＩは１であるため、選択処理命令群２０２０は、選択パラメータＣＰ＿１（＝２）を取得する。選択処理命令群２０２０は、秘密処理装置１０２０が有する管理情報により、未実行の選択対象データ（２０４０、２０４１、２０４２、２０４３、２０４４、２０４５、２０４６）の中で、ＣＰ＿１（＝２）番目に配置された選択対象データ２０４２を選択する。選択処理命令群２０２０は、選択識別子用変数に値「２」を格納する。
【０４１２】
秘密保持プログラム２０００は、管理情報更新命令群５２５の処理を行う（ステップＳ２０１０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「２」に対応する選択対象データ２０４２の管理情報を実行済みに更新する。
秘密保持プログラム２０００は、変遷処理命令群５３０の処理を行う（ステップＳ２０１５）。具体的には、変遷処理命令群５３０は、選択識別子用変数「２」に対応する選択対象データ２０４２に分岐する処理を行う。
【０４１３】
秘密保持プログラム２０００は、選択対象データ２０４２に含まれる選択対象主要命令群５５２の処理を行う（ステップＳ２０２０）である。具体的には、選択対象データ２０４２は、このプログラムが提供する機能の一部である第１機能提供命令群に相当する処理を行う。
秘密保持プログラム２０００は、更新処理命令群２０６２の処理を行う（ステップＳ２０２５）。具体的には、更新処理命令群２０６２は、選択パラメータ群の選択パラメータインデックスＣＰＩをインクリメントする。ここでは、選択パラメータインデックスＣＰＩの値が「１」であったものが「２」になる。
【０４１４】
秘密保持プログラム２０００は、分岐命令群２０７２の処理を行う（ステップＳ２０３０）。具体的には、分岐命令群２０７２は、選択処理命令群２０２０へ分岐する処理を行う。
秘密保持プログラム２０００は、選択処理命令群２０２０の処理を行う（ステップＳ２０３５）。具体的には、選択パラメータインデックスＣＰＩに格納された値は「２」であるため、選択処理命令群２０２０は、選択パラメータＣＰ＿２（＝４）を取得する。選択処理命令群２０２０は、秘密処理装置１０２０が有する管理情報により、未実行の選択対象データ（２０４０、２０４１、２０４３、２０４４、２０４５、２０４６）の中で、ＣＰ＿２（＝４）番目に配置された選択対象データ２０４５を選択する。選択処理命令群２０２０は、選択識別子用変数に値「５」を格納する。
【０４１５】
秘密保持プログラム２０００は、管理情報更新命令群５２５の処理を行う（ステップＳ２０４０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「５」に対応する選択対象データ２０４５の管理情報を実行済みに更新する。
秘密保持プログラム２０００は、変遷処理命令群５３０の処理を行う（ステップＳ２０４５）。具体的には、変遷処理命令群５３０は、選択識別子用変数「５」に対応する選択対象データ２０４５に分岐する処理を行う。
【０４１６】
秘密保持プログラム２０００は、選択対象データ２０４５に含まれる選択対象主要命令群５５５の処理を行う（ステップＳ２０５０）。具体的には、選択対象データ２０４５は、このプログラムが提供する機能の一部である第２機能提供命令群に相当する処理を行う。
秘密保持プログラム２０００は、更新処理命令群２０６５の処理を行う（ステップＳ２０５５）。具体的には、更新処理命令群２０６５は、選択パラメータ群の選択パラメータインデックスＣＰＩをインクリメントする。ここでは、選択パラメータインデックスの値が「２」であったものが「３」になる。
【０４１７】
秘密保持プログラム２０００は、分岐命令群２０７５の処理を行う（ステップＳ２０６０）。具体的には、分岐命令群２０７５は、選択処理命令群２０２０へ分岐する処理を行う。
秘密保持プログラム２０００は、選択処理命令群２０２０の処理を行う（ステップＳ２０６５）。具体的には、選択パラメータインデックスＣＰＩに格納された値は「３」であるため、選択処理命令群２０２０は、選択パラメータＣＰ＿３（＝３）を取得する。選択処理命令群２０２０は、秘密処理装置１０２０が有する管理情報により、未実行の選択対象データ（２０４０、２０４１、２０４３、２０４４、２０４６）の中で、ＣＰ＿３（＝３）番目に配置された選択対象データ２０４４を選択する。選択処理命令群２０２０は、選択識別子用変数に値「４」を格納する。
【０４１８】
秘密保持プログラム２０００は、管理情報更新命令群５２５の処理を行う（ステップＳ２０７０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「４」に対応する選択対象データ２０４４の管理情報を実行済みに更新する。
秘密保持プログラム２０００は、変遷処理命令群５３０の処理を行う（ステップＳ２０７５）。具体的には、変遷処理命令群５３０は、選択識別子用変数「４」に対応する選択対象データ２０４４に分岐する処理を行う。
【０４１９】
秘密保持プログラム２０００は、選択対象データ２０４４に含まれる選択対象主要命令群５５４の処理を行う（ステップＳ２０８０）。具体的には、選択対象データ２０４４は、このプログラムが提供する機能の一部である第３機能提供命令群に相当する処理を行う。
秘密保持プログラム２０００は、更新処理命令群２０６４の処理を行う（ステップＳ２０８５）。具体的には、更新処理命令群２０６４は、選択パラメータ群の選択パラメータインデックスＣＰＩをインクリメントする。ここでは、選択パラメータインデックスの値が「３」であったものが「４」になる。
【０４２０】
秘密保持プログラム２０００は、分岐命令群２０７４の処理を行う（ステップＳ２０９０）。具体的には、分岐命令群２０７４は、秘密保持プログラム２０００の呼び出し元に分岐する処理を行う。
４．２  プログラム難読化装置１０１０
プログラム難読化装置１０１０は、図４３にて示すように、プログラム記憶部８００ｆ、入力部８０１ｆ、機能提供命令群生成部８０２ｆ、偽装機能提供命令群生成部８０３ｆ、配置順序決定部８０４ｆ、管理命令群生成部８０５ｆ、秘密保持プログラム生成部８０６ｆ、及び出力部８０７ｆから構成されている。
【０４２１】
プログラム難読化装置１０１０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置１０１０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０４２２】
なお、プログラム記憶部８００ｆ、入力部８０１ｆ、機能提供命令群生成部８０２ｆ、偽装機能提供命令群生成部８０３ｆ、管理命令群生成部８０５ｆ、秘密保持プログラム生成部８０６ｆ、及び出力部８０７ｆのそれぞれは、第３の実施の形態にて示すプログラム記憶部８００、入力部８０１、機能提供命令群生成部８０２、偽装機能提供命令群生成部８０３、管理命令群生成部８０５、秘密保持プログラム生成部８０６、及び出力部８０７と同様であるため、説明は省略する。
【０４２３】
配置順序決定部８０４と、配置順序決定部８０４ｆとの違いは、前者は選択パラメータの初期値と選択識別子を求めるための計算式を用いて選択識別子を算出したが、後者は選択パラメータの初期値を用い、計算式を用いないことである。
以下、配置順序決定部８０４ｆについて説明する。
また、配置順序決定部８０４ｆは、図示していないが、制御部８５０ｆ、選択処理部８５１ｆ、管理情報更新部８５２ｆ、更新処理部８５３ｆ、及び管理情報保持部８５４ｆを有している。これら構成要素の接続関係は、図２６にて示す配置順序決定部８０４の構成要素の接続関係と同じである。
【０４２４】
配置順序決定部８０４ｆは、選択パラメータの初期値を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
なお、本実施の形態では、第３の実施の形態と同様に、入力部８０１ｆにて選択パラメータの初期値を受け付けるものとし、選択パラメータＣＰ＿１〜ＣＰ＿３の初期値は「２」、「４」、「３」であるとする。
【０４２５】
（１）管理情報保持部８５４ｆ
管理情報保持部８５４ｆは、管理情報保持部８５４と同様であるため、説明は省略する。なお、以降、必要であれば、管理情報テーブルＴ８００を用いて説明する。
これにより、機能提供命令群が配置された位置（配置された選択対象データ）を記憶することができる。
【０４２６】
（２）制御部８５０ｆ
制御部８５０ｆは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部８５０ｆは、入力部８０１ｆにて受け付けた選択パラメータの初期値ＣＰ＿１、ＣＰ＿２、及びＣＰ＿３（ここでは、それぞれ「２」、「４」、「３」）をパラメータ記憶領域に記憶する。
【０４２７】
また、処理開始時には、制御部８５０ｆは、選択パラメータインデックスＣＰＩに初期値「１」を設定し、パラメータ記憶領域に記憶する。
制御部８５０ｆは、選択処理部８５１ｆ、管理情報更新部８５２ｆ、及び更新処理部８５３ｆの動作を制御する。
制御部８５０ｆは、選択識別子の値それぞれと、プログラム記憶部８００ｆにて記憶されている選択対象データとの対応付けを行う。
【０４２８】
制御部８５０ｆは、生成された第ｉ番目の機能提供命令群を機能提供命令群生成部８０２ｆから取得する。制御部８５０ｆは、取得した第ｉ番目の機能提供命令群を、選択処理部８５１ｆにて取得された選択識別子に基づいて、プログラム記憶部８００ｆにて記憶され、対応する選択対象データへ挿入する。ここで、ｉは１以上ｍ以下の整数である。また、制御部８５０ｆは、第ｉ番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【０４２９】
制御部８５０ｆは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない１の偽装機能提供命令群を偽装機能提供命令群生成部８０３ｆから取得する。制御部８５０ｆは、取得した偽装機能提供命令群を、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入されていない１の選択対象データに挿入する。制御部８５０ｆは、この動作を、全ての偽装機能提供命令群に対して行う。
【０４３０】
これにより、制御部８５０ｆは、各選択対象データに、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部８５０ｆによる第ｉ番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
（３）選択処理部８５１ｆ
選択処理部８５１ｆは、パラメータ記憶領域に記憶されている選択パラメータインデックスＣＰＩを取得し、取得したＣＰＩに基づいて、選択パラメータＣＰ＿ｋを取得する。ここで、ｋは１以上３以下の数である。
【０４３１】
選択処理部８５１ｆは、取得したＣＰ＿ｋの値と管理情報テーブルＴ８００を用いて、選択識別子を取得する。
選択識別子の取得方法について、以下に説明する。
選択処理部８５１ｆは、管理情報テーブルＴ８００において値が「０」であるものを上位から順に、０番目、１番目、・・・・とし、取得したＣＰ＿ｋの値と一致する管理情報を取得する。選択処理部８５１ｆは、取得した管理情報に対応する選択対象データの選択識別子を取得する。
【０４３２】
選択処理部８５１ｆの動作と、制御部８５０ｆによる第ｉ番目の機能提供命令群を選択処理部８５１ｆにて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
（４）管理情報更新部８５２ｆ
管理情報更新部８５２ｆは、管理情報更新部８５２と同様であるので、説明は省略する。
【０４３３】
（５）更新処理部８５３ｆ
更新処理部８５３ｆは、パラメータ記憶領域にて記憶されている選択パラメータインデックスＣＰＩを更新する。つまり、パラメータ記憶領域にて記憶されている選択パラメータインデックスＣＰＩに１をインクリメントする。
４．３  プログラム難読化装置１０１０の動作
プログラム難読化装置１０１０の動作は、図２７にて示すステップＳ６２０の処理を、以下に示す配置決定処理に置き換えることで、秘密保持プログラムを生成する。
【０４３４】
４．３．１  配置決定処理
ここでは、配置決定処理の動作について、図４４に示す流れ図を用いて説明する。
制御部８５０ｆは、カウンタｉに「１」、選択パラメータインデックスＣＰＩに初期値「１」を設定し、選択パラメータインデックスＣＰＩ及び選択パラメータＣＰ＿１、ＣＰ＿２、ＣＰ＿３の各初期値「２」、「４」、「３」をパラメータ記憶領域へ格納する。制御部８５０ｆは、選択識別子の値それぞれと、選択対象データとの対応付けを行う（ステップＳ２５００）。ここで、カウンタｉは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第１の機能提供命令群から順番に配置順序を決定していく。
【０４３５】
選択処理部８５１ｆは、選択パラメータインデックスＣＰＩを取得し、取得したＣＰＩに基づいて、選択パラメータＣＰ＿ｋを取得する。選択処理部８５１ｆは、取得したＣＰ＿ｋの値と管理情報テーブルＴ８００を用いて、選択識別子を取得する（ステップＳ２５０５）。ここで、ｋは１以上３以下の数である。例えば、選択処理部８５１ｆは、選択パラメータインデックスＣＰＩが「１」である場合には、選択パラメータＣＰ＿１（＝２）を取得し、取得したＣＰ＿１と管理情報テーブルＴ８００とを用いて、選択識別子「２」を取得する。
【０４３６】
制御部８５０ｆは、第ｉ番目の機能提供命令群を、選択処理部８５１ｆにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する（ステップＳ２５１０）。例えばｃｏｎｔ  ＝１で、選択識別子の値が「２」であった場合には、第１機能提供命令群が、選択対象データ２０４２に配置されることとなる。
管理情報更新部８５２ｆは、管理情報テーブルＴ８００に含まれる複数の管理情報のうち、選択処理部８５１ｆにて取得された選択識別子に対応する管理情報を、値「０」から値「１」へと更新する（ステップＳ２５１５）。例えば、選択識別子の値が「２」であった場合には、管理情報保持部８５４ｆの管理情報テーブルＴ８００において、選択対象データ２０４２に対応する管理情報を未配置から配置済みに変える。
【０４３７】
更新処理部８５３ｆは、パラメータ記憶領域にて記憶されている選択パラメータインデックスＣＰＩに１をインクリメントして、選択パラメータインデックスＣＰＩの値を更新し、更新結果をパラメータ記憶領域へ上書きする（ステップＳ２５２０）。
制御部８５０ｆは、カウンタｉに値「１」を加算する（ステップＳ２５２５）。
制御部８５０ｆは、カウンタｉが機能提供命令群の個数より大きいか否かを判定する（ステップＳ２５３０）。
【０４３８】
大きくないと判定する場合には（ステップＳ２５３０における「ＮＯ」）、制御部８５０ｆは、ステップＳ２５０５に戻り、選択処理部８５１ｆの動作を制御する。
大きいと判定する場合には（ステップＳ２５３０における「ＹＥＳ」）、制御部８５０ｆは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない１以上の選択対象データの何れかが配置先となるように、配置先を決定する（ステップＳ２５３５）。例えば、選択対象データ２０４０、２０４１、２０４３、２０４６が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【０４３９】
４．４  変形例
（１）上記第４の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
（２）上記第４の実施の形態では、機能提供命令群が３つ、偽装機能提供命令群が４つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は１個以上であればよい。
【０４４０】
（３）上記第４の実施の形態では、秘密処理装置１０２０を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
（４）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
４．５  第４の実施の形態の効果
本実施の形態では、選択処理命令群２０２０では選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。よって、難読化対象データが同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはなく、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことが困難になる。
【０４４１】
また、本実施の形態では、機能提供命令群の数と同じだけの入力値を用意し、各入力値に対応する選択対象データを選択している。このような実装による効果を、具体例を交えながら、以下に述べる。上述した例では機能提供命令群の数は３つであるため、入力値ｉｎ＿１、ｉｎ＿２、ｉｎ＿３により、選択対象データを選択している。本実施の形態の秘密保持プログラム２０００では、始めに６以下の非負整数ｉｎ＿１（７種類存在）を用いて、７種類の選択対象データ２０４０〜２０４６のいずれかを選択する。ここで、括弧内の“７種類存在”は、不正解析者が設定しうるｉｎ＿１の値が７種類存在するという意味である。次に５以下の非負整数ｉｎ＿２（６種類存在）を用いて、６種類の未実行の選択対象データ（選択対象データ２０４０〜２０４６からｉｎ＿１で選択された選択対象データを除いたもの）のいずれかを選択する。さらに４以下の非負整数ｉｎ＿３（５種類存在）を用いて、５種類の未実行の選択対象データ（選択対象データ２０４０〜２０４６からｉｎ＿１及びｉｎ＿２で選択された選択対象データを除いたもの）を選択する。このように一意に選択対象データを選択することにより、入力値に対して選択対象データの選択するバリエーションが減らず、攻撃者が全数攻撃するときの組合せ数を減らすことがない。
【０４４２】
５．第５の実施の形態
以下、本発明に係る第５の実施の形態としての秘密保持プログラム２２００、プログラム難読化装置３０１０及び秘密処理装置３０２０について、図面を参照して説明する。
なお、システムの構成は、第３の実施の形態にて示す構成と同様であるため、説明は省略する。
【０４４３】
秘密処理装置３０２０は、第３の実施の形態にて示す秘密処理装置６０と同様に、秘密情報を用いた装置である。
秘密処理装置３０２０と、第３の実施の形態にて示す秘密処理装置６０とは、構成要素は同じであるが、各部の処理がそれぞれ異なっている。以下では、各部の処理の説明が中心となるため、説明を簡単にするために、コンピュータ上で実行されることで秘密処理装置を実現する秘密保持プログラム２２００の説明をもって、秘密処理装置の説明に替える。ここで、秘密処理装置３０２０の構成と秘密保持プログラム２２００の各部との対応関係は第３の実施の形態と同様である。
【０４４４】
５．１  秘密保持プログラム２２００
秘密保持プログラム２２００の全体構成図を図４５に示す。以下では秘密保持プログラム２２００の詳細について、図４５を参照しながら説明していく。ここで、第３の実施の形態の秘密保持プログラム５００と同様の部分については、同一の符号を付け、説明を省略する。
【０４４５】
秘密保持プログラム２２００は、第３実施の形態の秘密保持プログラム５００と同様、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されたくないプログラムである。
秘密保持プログラム２２００は、管理情報更新命令群５２５、変遷処理命令群５３０と、第３の実施の形態と異なる前処理命令群２２１０、選択処理命令群２２２０、選択対象データ２２４０、２２４１、・・・、２２４６とを含み、これらが図４５に示す順番に配置されている。
【０４４６】
選択対象データ２２４０〜２２４６はそれぞれ、第３の実施の形態と同様の選択対象主要命令群５５０〜５５６、第３の実施の形態と異なる更新処理命令群２２６０〜２２６６と分岐命令群２２７０〜２２７６と、とからなり、これらは図４５に示す順番に配置されている。各命令群は１以上のプログラム命令からなるプログラム命令群である。
秘密保持プログラム２２００は、呼出元のプログラムから、２つの入力値ｉｎ＿１、ｉｎ＿２および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の処理を行うプログラム命令群である。なお、ｉｎ＿ｋ（ｋはインデックス）は（７−ｋ）未満の非負整数である。なお、選択対象データをここでは、２２４０〜２２４６の７つとしているが、これに限らない。選択対象データの個数をｎ＋１個としてもよい。ここで、ｎは自然数である。このとき、ｉｎ＿ｋは（ｎ＋１−ｋ）未満の非負整数である。また、入力値ｉｎ＿１、ｉｎ＿２の数は２つとしているが、これに限らない。ｍ（ｍはｎ＋１以下の自然数）個であってもよい。
【０４４７】
秘密保持プログラム２２００の処理では、後述の選択処理命令群２２２０での処理に用いる選択パラメータ群の選択パラメータＣＰ＿１、ＣＰ＿２とモジュラス値ＮＮと、後述の選択識別子を保持する選択識別子用変数を用いる。
ここでは、秘密保持プログラム２２００が正常系の実行時に呼出元のプログラムから受け取る入力値ｉｎ＿１、ｉｎ＿２は値「２」、「４」であるとする。本実施の形態で提供する秘密保持プログラム２２００は、呼出元のプログラムから受け取る値を用いれば、（選択対象主要命令群を含む）選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、（選択対象主要命令群を含む）選択対象データの実行順序を知ることが困難なプログラムである。
【０４４８】
５．１．１  前処理命令群２２１０
前処理命令群２２１０は、選択処理命令群２２２０で用いる選択パラメータ群を設定するプログラム命令群である。なお、選択パラメータ群は、選択パラメータＣＰ＿１、選択パラメータＣＰ＿２と、モジュラス値ＮＮからなる。これらの選択パラメータＣＰ＿１、ＣＰ＿２は、非負整数値であり、モジュラス値ＮＮは自然数である。
【０４４９】
前処理命令群２２１０は、秘密保持プログラム２２００が起動された際に、最初に実行されるプログラム命令群である。呼び出し元のプログラムから入力値ｉｎ＿１、ｉｎ＿２を受け取り、前処理命令群２２１０は、受け取った値を選択パラメータ群の選択パラメータＣＰ＿１、選択パラメータＣＰ＿２にそれぞれ格納し、選択パラメータ群のモジュラス値ＮＮを７に設定するプログラム命令群と、選択処理命令群２２２０に分岐するプログラム命令群とからなり、これらは順に行われるプログラム命令群である。正常系の実行時には、ｉｎ＿１、ｉｎ＿２は値「２」、「４」であり、前処理命令群２２１０は、選択パラメータＣＰ＿１、ＣＰ＿２にそれぞれ値「２」、「４」を格納する処理を行う。なお、選択パラメータは、入力値ｉｎ＿１、ｉｎ＿２、・・・の個数（本実施の形態では２個）だけ存在する。また、本実施の形態では、モジュラス値の初期値は選択対象データの数に合わせて７としている。
【０４５０】
５．１．２  選択処理命令群２２２０
選択処理命令群２２２０は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群と、変遷処理命令群５３０に分岐するプログラム命令群からなり、これらは順に行われるプログラム命令群である。なお、選択識別子は、第３の実施の形態と同様に変遷処理命令群５３０で使用する値である。
【０４５１】
選択処理命令群２２２０が選択識別子を算出する処理では、まず、選択パラメータ群の選択パラメータＣＰ＿１、ＣＰ＿２とモジュラス値ＮＮに対し、ｐ１、ｐ２をＮＮと互いに素な整数とし、式２０「ｐ１×（選択パラメータＣＰ＿１）＋ｐ２×（選択パラメータＣＰ＿２）  ｍｏｄ  ＮＮ」を算出し、算出結果をＩＮＤに設定する。以降の説明において、ＩＮＤは選択識別子を示す。ここで、ｐ１とＮＮと互いに素とはｐ１とＮＮの最大公約数が１であることを示す。また、演算子「×」は掛け算を表す。次に、秘密処理装置３０２０が有する管理情報を用いて、未実行の選択対象データの中でＩＮＤ番目の選択対象データを選択する。選択した選択対象データの番号を選択識別子用変数に格納する。ここで、選択対象データの番号は１からではなく、０から順に数える。したがって、もし、選択対象データ２２４０が未実行であり、ＩＮＤ＝０である場合は、選択対象データ２２４０を選択し、選択識別子用変数は０となる。
【０４５２】
本実施の形態では、ｐ１、ｐ２をそれぞれ、値「１」、「２」とし、式２０を「１×（選択パラメータＣＰ＿１）＋２×（選択パラメータＣＰ＿２）  ｍｏｄ  ＮＮ」とする。
５．１．３  選択対象データ２２４０〜２２４６
選択対象データ２２４０〜２２４６は、変遷処理命令群５３０により分岐してきた際に、実行されるプログラム命令群である。
【０４５３】
選択対象データ２２４０〜２２４６は、それぞれ、第３の実施の形態と同様の選択対象主要命令群５５０〜５５６と、第３の実施の形態と異なる更新処理命令群２２６０〜２２６６と分岐命令群２２７０〜２２７６とからなるプログラム命令群である。
本実施例では、正常系での実行時には、選択対象主要命令群５５３、５５５、５５４の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群５５３、５５５、５５４のそれぞれには、第３の実施の形態における第１機能提供命令群、第２機能提供命令群、及び第３機能提供命令群が入り、選択対象主要命令群５５０、５５１、５５２、５５６には第３の実施の形態と同様の偽装機能提供命令群が入るものとする。
【０４５４】
（１）更新処理命令群２２６０〜２２６６
更新処理命令群２２６０〜２２６６は、選択パラメータ群の値の更新を行うプログラム命令群である。選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿２に、選択識別子用変数に格納されている値を代入し、選択パラメータ群のモジュラス値をデクリメントする。なお、ここでは選択パラメータの数が２つであるが、ｍ個の場合は、選択パラメータＣＰ＿ｍの値を選択パラメータＣＰ＿（ｍ−１）に代入し、選択パラメータＣＰ＿（ｍ−１）の値を選択パラメータＣＰ＿（ｍ−２）に代入し、・・・、選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿ｍに、選択識別子用変数に格納されている値を代入し、モジュラス値をデクリメントする。また、モジュラス値をデクリメントした場合には、デクリメントされたモジュラス値は、ｐ１、ｐ２と互いに素になる必要はない。
【０４５５】
（２）分岐命令群２２７０〜２２７６
分岐命令群２２７０〜２２７６は、それぞれ選択対象データ２２４０〜２２４６の外にある選択処理命令群５２０へ分岐するプログラム命令群や、プログラム呼出元に制御を戻す処理のプログラム命令群である。第３機能提供命令群を含む選択対象データ２２４４に含まれる分岐命令群２２７４は、プログラムの呼出元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる分岐命令群は、選択処理命令群５２０へ分岐するプログラム命令群である。
【０４５６】
５．１．４  動作
ここでは、秘密保持プログラム２２００を実行した場合の秘密処理装置３０２０の動作と、秘密処理装置６０の動作との異なる点を、図２４を用いて説明する。
秘密処理装置３０２０の動作は、図２４に示すステップＳ５００、ステップＳ５０５、ステップＳ５３０の動作を以下の動作に変更する。
【０４５７】
本実施の形態では、ステップＳ５００を、選択パラメータの初期化お呼び前処理の実行に加え、モジュラス値ＮＮの初期化も行うように変更する。ここで、モジュラス値の初期値は選択対象データの数と同一とする。
本実施の形態では、ステップＳ５０５を、選択パラメータ群に含まれるモジュラス値ＮＮを取得し、式２０と、取得したモジュラス値ＮＮとを用いて選択識別子を算出するように変更する。なお、ここでのＮＮは選択対象データの数ではなく、モジュラス値である。
【０４５８】
本実施の形態では、ステップＳ５３０を、選択パラメータの更新に加え、モジュラス値ＮＮをデクリメントするように変更する。
（２）動作の具体例
以下、本実施の形態における秘密保持プログラム２２００の動作の具体例を、図４６を用いて説明する。
【０４５９】
ここでは、上述したように、選択対象主要命令群５５３、５５５、５５４のそれぞれに、第１〜第３の機能提供命令群が含まれ、選択対象主要命令群５５０、５５１、５５２、５５６には、偽装機能提供命令群が含まれており、正常系での実行時には、選択対象主要命令群５５３、５５５、５５４の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【０４６０】
秘密保持プログラム２２００は、前処理命令群２２１０の処理を行う（ステップＳ３０００）。具体的には、前処理命令群２２１０は、選択パラメータＣＰ＿１、ＣＰ＿２のそれぞれに、値「２」、「４」を格納し、モジュラス値ＮＮに値「７」を設定する。
秘密保持プログラム２２００は、選択処理命令群２２２０の処理を行う（ステップＳ３００５）。具体的には、選択処理命令群２２２０は、式２０、選択パラメータＣＰ＿１（＝２）、ＣＰ＿２（＝４）、及びモジュラス値ＮＮ（＝７）を用いて、値ＩＮＤを算出する。ここでは、算出される値ＩＮＤは、「１×２＋２×４  ｍｏｄ  ７＝３」となる。秘密処理装置３０２０が有する管理情報より、未実行の選択対象データ（２２４０、２２４１、２２４２、２２４３、２２４４、２２４５、２２４６）の中で３番目の選択対象データ２２４３を選択する。選択識別子用変数の値は「３」となる。
【０４６１】
秘密保持プログラム２２００は、管理情報更新命令群５２５の処理を行う（ステップＳ３０１０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「３」に対応する選択対象データ２２４３の管理情報を実行済みに更新する。
秘密保持プログラム２２００は、変遷処理命令群５３０の処理を行う（ステップＳ３０１５）。具体的には、変遷処理命令群５３０は、選択識別子変数「３」に対応する選択対象データ２２４３に分岐する処理を行う。
【０４６２】
秘密保持プログラム２２００は、選択対象データ２２４３に含まれる選択対象主要命令群５５３の処理を行う（ステップＳ３０２０）。具体的には、選択対象データ２２４３は、プログラムが提供する機能の一部である第１機能提供命令群に相当する処理を行う。
秘密保持プログラム２２００は、更新処理命令群２２６３の処理を行う（ステップＳ３０２５）。具体的には、更新処理命令群２２６３は、選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿２に、選択識別子用変数の値を代入する。ここでは、選択パラメータＣＰ＿１、ＣＰ＿２のそれぞれの値が「２」、「４」であったものが、「４」、「３」になる。さらに、モジュラス値ＮＮをデクリメントする。ここでは、モジュラス値ＮＮが「７」であったものが「６」になる。
【０４６３】
秘密保持プログラム２２００は、分岐命令群２２７３の処理を行う（ステップＳ３０３０）。具体的には、分岐命令群２２７３は、選択処理命令群２２２０へ分岐する処理を行う。
秘密保持プログラム２２００は、選択処理命令群２２２０の処理を行う（ステップＳ３０３５）。具体的には、選択処理命令群２２２０は、式２０、選択パラメータＣＰ＿１（＝４）、ＣＰ＿２（＝３）、及びモジュラス値ＮＮ（＝６）を用いて、値ＩＮＤを算出する。ここでは、算出される値ＩＮＤは、「１×４＋２×３  ｍｏｄ  ６＝４」となる。秘密処理装置３０２０が有する管理情報より、未実行の選択対象データ（２２４０、２２４１、２２４２、２２４４、２２４５、２２４６）の中で４番目の選択対象データ２２４５を選択する。選択識別子用変数の値は「５」となる。
【０４６４】
秘密保持プログラム２２００は、管理情報更新命令群５２５の処理を行う（ステップＳ３０４０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「５」に対応する選択対象データ２２４５の管理情報を実行済みに更新する。
秘密保持プログラム２２００は、変遷処理命令群５３０の処理を行う（ステップＳ３０４５）。具体的には、変遷処理命令群５３０は、選択識別子変数「５」に対応する選択対象データ２２４５に分岐する処理を行う。
【０４６５】
秘密保持プログラム２２００は、選択対象データ２２４５に含まれる選択対象主要命令群５５５の処理を行う（ステップＳ３０５０）。具体的には、選択対象データ２２４５は、プログラムが提供する機能の一部である第２機能提供命令群に相当する処理を行う。
秘密保持プログラム２２００は、更新処理命令群２２６５の処理を行う（ステップＳ３０５５）。具体的には、更新処理命令群２２６５は、選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿２に、選択識別子用変数の値を代入する。ここでは、選択パラメータＣＰ＿１、ＣＰ＿２のそれぞれの値が「４」、「３」であったものが、「３」、「５」になる。さらに、モジュラス値ＮＮをデクリメントする。ここでは、モジュラス値ＮＮが「６」であったものが「５」になる。
【０４６６】
秘密保持プログラム２２００は、分岐命令群２２７５の処理を行う（ステップＳ３０６０）。具体的には、分岐命令群２２７５は、選択処理命令群２２２０へ分岐する処理を行う。
秘密保持プログラム２２００は、選択処理命令群２２２０の処理を行う（ステップＳ３０６５）。具体的には、選択処理命令群２２２０は、式２０、選択パラメータＣＰ＿１（＝３）、ＣＰ＿２（＝５）、及びモジュラス値ＮＮ（＝５）を用いて、値ＩＮＤを算出する。ここでは、算出される値ＩＮＤは、「１×３＋２×５  ｍｏｄ  ５＝３」となる。秘密処理装置３０２０が有する管理情報より、未実行の選択対象データ（２２４０、２２４１、２２４２、２２４４、２２４６）の中で３番目の選択対象データ２２４４を選択する。選択識別子用変数の値は「４」となる。
【０４６７】
秘密保持プログラム２２００は、管理情報更新命令群５２５の処理を行う（ステップＳ３０７０）。具体的には、管理情報更新命令群５２５は、選択識別子用変数「４」に対応する選択対象データ２２４４の管理情報を実行済みに更新する。
秘密保持プログラム２２００は、変遷処理命令群５３０の処理を行う（ステップＳ３０７５）。具体的には、変遷処理命令群５３０は、選択識別子変数「４」に対応する選択対象データ２２４４に分岐する処理を行う。
【０４６８】
秘密保持プログラム２２００は、選択対象データ２２４４に含まれる選択対象主要命令群５５４の処理を行う（ステップＳ３０８０）。具体的には、選択対象データ２２４４は、プログラムが提供する機能の一部である第３機能提供命令群に相当する処理を行う。
秘密保持プログラム２２００は、更新処理命令群２２６４の処理を行う（ステップＳ３０８５）。具体的には、更新処理命令群２２６４は、選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿２に、選択識別子用変数の値を代入する。ここでは、選択パラメータＣＰ＿１、ＣＰ＿２のそれぞれの値が「３」、「５」であったものが、「５」、「４」になる。さらに、モジュラス値ＮＮをデクリメントする。ここでは、モジュラス値ＮＮが「５」であったものが「４」になる。
【０４６９】
秘密保持プログラム２２００は、分岐命令群２２７４の処理を行う（ステップＳ３０９０）。具体的には、分岐命令群２２７４は、秘密保持プログラム２２００の呼び出し元に分岐する処理を行う。
５．２  プログラム難読化装置３０１０
プログラム難読化装置３０１０は、図４７にて示すように、プログラム記憶部８００ｇ、入力部８０１ｇ、機能提供命令群生成部８０２ｇ、偽装機能提供命令群生成部８０３ｇ、配置順序決定部８０４ｇ、管理命令群生成部８０５ｇ、秘密保持プログラム生成部８０６ｇ、及び出力部８０７ｇから構成されている。
【０４７０】
プログラム難読化装置３０１０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置３０１０は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を１個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【０４７１】
なお、プログラム記憶部８００ｇ、入力部８０１ｇ、機能提供命令群生成部８０２ｇ、偽装機能提供命令群生成部８０３ｇ、管理命令群生成部８０５ｇ、秘密保持プログラム生成部８０６ｇ、及び出力部８０７ｇのそれぞれは、第３の実施の形態にて示すプログラム記憶部８００、入力部８０１、機能提供命令群生成部８０２、偽装機能提供命令群生成部８０３、管理命令群生成部８０５、秘密保持プログラム生成部８０６、及び出力部８０７と同様であるため、説明は省略する。
【０４７２】
配置順序決定部８０４と、配置順序決定部８０４ｇとの違いは、選択識別子を求めるための計算式が異なることと、後者において計算式のモジュラス値が変化していくことである。
以下、配置順序決定部８０４ｇについて説明する。
また、配置順序決定部８０４ｇは、図示していないが、制御部８５０ｇ、選択処理部８５１ｇ、管理情報更新部８５２ｇ、更新処理部８５３ｇ、及び管理情報保持部８５４ｇを有している。これら構成要素の接続関係は、図２６にて示す配置順序決定部８０４の構成要素の接続関係と同じである。
【０４７３】
配置順序決定部８０４ｇは、選択パラメータの初期値と選択識別子の計算式を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。なお、本実施の形態では、入力部８０１ｇにて選択パラメータの初期値を受け付けるものとし、選択パラメータＣＰ＿１〜ＣＰ＿２の初期値は「２」、「４」であるとする。
【０４７４】
（１）管理情報保持部８５４ｇ
管理情報保持部８５４ｇは、管理情報保持部８５４と同様であるため、説明は省略する。なお、以降、必要であれば、管理情報テーブルＴ８００を用いて説明する。
これにより、機能提供命令群が配置された位置（配置された選択対象データ）を記憶することができる。
【０４７５】
（２）制御部８５０ｇ
制御部８５０ｇは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部８５０ｇは、入力部８０１ｇにて受け付けた選択パラメータの初期値ＣＰ＿１、及びＣＰ＿２（ここでは、それぞれ「２」、「４」）をパラメータ記憶領域に記憶する。
また、処理開始時には、制御部８５０ｇは、モジュラス値ＮＮに初期値「７」を設定し、パラメータ記憶領域に記憶する。
【０４７６】
制御部８５０ｇは、選択処理部８５１ｇ、管理情報更新部８５２ｇ、及び更新処理部８５３ｇの動作を制御する。
制御部８５０ｇは、選択処理部８５１ｇが有する式２０が取り得る値、つまり、式２０にて取り得る選択識別子の値それぞれと、プログラム記憶部８００ｇにて記憶されている選択対象データとの対応付けを行う。
【０４７７】
制御部８５０ｇは、生成された第ｉ番目の機能提供命令群を機能提供命令群生成部８０２ｇから取得する。制御部８５０ｇは、取得した第ｉ番目の機能提供命令群を、選択処理部８５１ｇにて取得された選択識別子に基づいて、プログラム記憶部８００ｇにて記憶され、対応する選択対象データへ挿入する。ここで、ｉは１以上ｍ以下の整数である。また、制御部８５０ｇは、第ｉ番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【０４７８】
制御部８５０ｇは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない１の偽装機能提供命令群を偽装機能提供命令群生成部８０３ｇから取得する。制御部８５０ｇは、取得した偽装機能提供命令群を、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入されていない１の選択対象データに挿入する。制御部８５０ｇは、この動作を、全ての偽装機能提供命令群に対して行う。
【０４７９】
これにより、制御部８５０ｇは、各選択対象データに、第ｉ機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部８５０ｇによる第ｉ番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
（３）選択処理部８５１ｇ
選択処理部８５１ｇは、パラメータ記憶領域に記憶されている選択パラメータＣＰ＿１、ＣＰ＿２、及びモジュラス値ＮＮを取得し、取得した各値と、式２０とを用いて、値ＩＮＤを算出する。
【０４８０】
選択処理部８５１ｇは、算出した値ＩＮＤと管理情報テーブルＴ８００を用いて、選択識別子を取得する。
選択識別子の取得方法について、以下に説明する。
選択処理部８５１ｇは、管理情報テーブルＴ８００において値が「０」であるものを上位から順に、０番目、１番目、・・・・とし、算出したＩＮＤの値と一致する管理情報を取得する。選択処理部８５１ｇは、取得した管理情報に対応する選択対象データの選択識別子を取得する。
【０４８１】
選択処理部８５１の動作と、制御部８５０による第ｉ番目の機能提供命令群を選択処理部８５１にて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
（４）管理情報更新部８５２ｇ
管理情報更新部８５２ｇは、管理情報更新部８５２と同様であるので、説明は省略する。
【０４８２】
（５）更新処理部８５３ｇ
更新処理部８５３ｇは、パラメータ記憶領域にて記憶されている選択パラメータＣＰ＿１、ＣＰ＿２、及びモジュラス値ＮＮを更新する。
ここでは、更新処理部８５３ｇは、選択パラメータＣＰ＿２の値を選択パラメータＣＰ＿１に代入し、選択パラメータＣＰ＿２に、選択識別子用変数の値を代入し、それぞれに選択パラメータの値を更新する。更新処理部８５３ｇは、更新した選択パラメータＣＰ＿１及びＣＰ＿２を、制御部８５０ｇのパラメータ記憶領域へ上書きする。更新処理部８５３ｇは、モジュラス値ＮＮの値をデクリメントし、その結果を、制御部８５０ｇのパラメータ記憶領域へ上書きする。
【０４８３】
５．３  プログラム難読化装置３０１０の動作
プログラム難読化装置３０１０の動作は、図２７にて示すステップＳ６２０の処理を、以下に示す配置決定処理に置き換えることで、秘密保持プログラムを生成する。
５．３．１  配置決定処理
ここでは、配置決定処理の動作について、図４８に示す流れ図を用いて説明する。
【０４８４】
制御部８５０ｇは、カウンタｉに「１」、モジュラス値ＮＮに初期値「７」を設定し、選択パラメータ群に含まれる選択パラメータＣＰ＿１、ＣＰ＿２及び、モジュラス値ＮＮの各初期値「２」、「４」、「７」をパラメータ記憶領域へ格納する。制御部８５０ｇは、選択識別子の値それぞれと、選択対象データとの対応付けを行う（ステップＳ３５００）。ここで、カウンタｉは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第１の機能提供命令群から順番に配置順序を決定していく。
【０４８５】
選択処理部８５１ｇ、パラメータ記憶領域に記憶されている選択パラメータＣＰ＿１、ＣＰ＿２、及びモジュラス値ＮＮを取得し、取得した各値と、式２０とを用いて、値ＩＮＤを算出する。選択処理部８５１ｇは、算出した値ＩＮＤと管理情報テーブルＴ８００を用いて、選択識別子を取得する（ステップＳ３５０５）。例えば、選択パラメータＣＰ＿１〜ＣＰ＿２の値が「２」、「４」であり、モジュラス値ＮＮが「７」である場合には、式２０の値は「１×２＋２×４  ＭＯＤ  ７＝３」になる。選択処理部８５１ｇは、管理情報テーブルＴ８００より、未実行の選択対象データ（２２４０、２２４１、２２４２、２２４３、２２４４、２２４５、２２４６）の中で３番目の選択対象データ２２４３を選択する。選択識別子用変数の値は「３」となる。ここで、「未実行」とは、機能提供命令群が選択対象データに配置されていないことを示す。また、「実行済」とは、機能提供命令群が選択対象データに配置済であることを示す。
【０４８６】
制御部８５０ｇは、第ｉ番目の機能提供命令群を、選択処理部８５１ｇにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する（ステップＳ３５１０）。例えばｃｏｎｔ  ＝１で、選択識別子の値が「３」であった場合には、第１機能提供命令群が、選択対象データ２２４３に配置されることとなる。
管理情報更新部８５２ｇは、管理情報テーブルＴ８００に含まれる複数の管理情報のうち、選択処理部８５１ｇにて取得された選択識別子に対応する管理情報を、値「０」から値「１」へと更新する（ステップＳ３５１５）。例えば、選択識別子の値が「３」であった場合には、管理情報保持部８５４ｇの管理情報テーブルＴ８００において、選択対象データ２２４３に対応する管理情報を未配置から配置済みに変える。
【０４８７】
更新処理部８５３ｇは、パラメータ記憶領域にて記憶されている選択パラメータＣＰ＿１及びＣＰ＿２を更新し、更新結果をパラメータ記憶領域へ上書きする（ステップＳ３５２０）。更新方法は、上述しているのでここでの説明は省略する。例えば、選択パラメータＣＰ＿１及びＣＰ＿２のそれぞれの値が「２」、「４」で選択識別子の値が「３」であった場合は、選択パラメータＣＰ＿１及びＣＰ＿２のそれぞれの値を「４」、「３」にする。
【０４８８】
更新処理部８５３ｇは、モジュラス値ＮＮをデクリメントし、その結果をパラメータ記憶領域へ上書きする（ステップＳ３５２５）。
制御部８５０ｇは、カウンタｉに値「１」を加算する（ステップＳ３５３０）。
制御部８５０ｇは、カウンタｉが機能提供命令群の個数より大きいか否かを判定する（ステップＳ３５３５）。
【０４８９】
大きくないと判定する場合には（ステップＳ３５３５における「ＮＯ」）、制御部８５０ｇは、ステップＳ３５０５に戻り、選択処理部８５１ｇの動作を制御する。
大きいと判定する場合には（ステップＳ３５３５における「ＹＥＳ」）、制御部８５０ｇは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない１以上の選択対象データの何れかが配置先となるように、配置先を決定する（ステップＳ３５４０）。例えば、選択対象データ２２４０、２２４１、２２４２、２２４６が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【０４９０】
５．４  変形例
（１）上記第５の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
（２）上記第５の実施の形態では、機能提供命令群が３つ、偽装機能提供命令群が４つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は１個以上であればよい。
【０４９１】
（３）上記第５の実施の形態では、秘密処理装置３０２０を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
（４）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
５．５  第５の実施の形態の効果
本実施の形態では、選択処理命令群２２２０では選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。よって、難読化対象データが同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはなく、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことが困難になる。
【０４９２】
また、本実施の形態では、入力値ｉｎ＿１、ｉｎ＿２により、一意に選択対象データを選択していく。その理由を以下で述べる。始めに６以下の非負整数ｉｎ＿１（７種類存在）を用いて、７種類の選択対象データ２２４０〜２２４６のいずれかを選択する。次に５以下の非負整数ｉｎ＿２（６種類存在）を用いて、６種類の未実行の選択対象データ（選択対象データ２２４０〜２２４６からｉｎ＿１で選択された選択対象データを除いたもの）のいずれかを選択する。入力のｉｎ＿ｋ（ｋ＝１、２）の取りうる種類と、選択対象データの選択しうる種類が同じであるため、これらの選択はｉｎ＿１、ｉｎ＿２を用いて一意に決定する。したがって、入力値ｉｎ＿１、ｉｎ＿２により、一意に選択対象データを選択する。このように一意に選択対象データを選択することにより、入力値に対して選択対象データの選択するバリエーションが減らず、攻撃者が全数攻撃するときの組合せの数を減らすことがない。
【０４９３】
６．変形例
上記に説明した実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。
（１）上記第３の実施の形態の選択処理命令群が選択識別子を算出する処理で使用する式は、式３「ｐ１×（選択パラメータＣＰ＿１）＋ｐ２×（選択パラメータＣＰ＿２）  ｍｏｄ  ＮＮ」としているが、これに限らない。例えば、この式は、選択パラメータＣＰ＿１の値を固定したときに、選択パラメータＣＰ＿２の値と式の計算結果が１対１となる条件を満たせばよい。式３では、選択パラメータＣＰ＿２がＮＮ未満の値であれば、ｐ２とＮＮが互いに素であるため、取りうる選択パラメータＣＰ＿２がＮＮ種類存在すれば、それに対応して、ｐ２×（選択パラメータＣＰ＿２）  ｍｏｄ  ＮＮもＮＮ種類存在する。
【０４９４】
また、第５の実施の形態においても同様に、選択識別子の算出式を、式２０としているが、これに限らない。例えば、この式は、選択パラメータＣＰ＿１の値を固定したときに、選択パラメータＣＰ＿２の値と式の計算結果が１対１となる条件を満たせばよい。
（２）各実施の形態の動作において、選択対象主要命令群と変遷処理命令群は順番を入れ替えてもよい。また、第３の実施の形態において、更新処理命令群５６０〜５６６は、選択対象データ５４０〜５４６に含まれる構成となっているが、管理情報更新命令群５２５の後にひとつだけ配置する構成であっても構わない。また、選択処理命令群５２０、管理情報更新命令群５２５、変遷処理命令群５３０の３つの命令群はそれぞれ一つである構成だが、各選択対象データに含まれる分岐命令群５７０から５７６のぞれぞれの代わりに前記３つの命令群を配置する構成であっても構わない。
【０４９５】
また、第４及び第５の実施の形態においても同様である。
（３）各命令群は、必ずしも独立した命令群である必要はなく、複数の命令群が提供する機能を組み合わせた手段とする構成であっても構わない。
（４）第３、第４及び第５の実施の形態では、実行済みの選択対象データに相当する選択識別子が算出された場合、未実行の選択識別子に対応する直近の値を算出するという方法を取っているが、この計算方法に限られるものではない。例えば、選択識別子をランダムに計算し、対応する選択対象データが実行されているか否かの確認を繰り返していく計算方法などでもよい。このようにすると、不正解析者による解析はより困難となる。
【０４９６】
（５）上記各実施の形態および変形例における、機能提供命令群、偽装機能提供命令群、管理命令群の生成順序は上述した順序に限るものではない。各ステップは、生成した各命令群を用いて秘密保持プログラムを生成するステップまでに終了していれば、どのような順序で実行されても構わない。例えば、偽装機能提供命令群と機能提供命令群の生成順序を逆にするなどしても構わない。
【０４９７】
（６）各実施の形態の説明にて挙げた数値は全て一例であり、その数値に限るものではない。例えば、選択対象データの数や初期値の数をより増やしてもよいし、初期値の数値を別のものとしてもよい。
初期値の数を増やすことで解析をさらに困難にすることができる。
（７）第１の実施の形態において、秘密保持プログラムは、１以上の偽装機能提供命令群を含むとしたが、これに限定されない。
【０４９８】
秘密保持プログラムは、偽装機能提供命令群を含まなくてもよい。
また、第３、第４及び第５の実施の形態においても同様に、秘密保持プログラムは、偽装機能提供命令群を含まなくてもよい。
（８）上記の各実施の形態の秘密処理装置や秘密保持プログラムでは、いずれもプログラムを分割して生成した命令群を選択対象データとしていたが、これに限られるものではなく、何らかの順序をもって使用された場合に正当な結果を得られるような情報であればどのようなものでも構わない。具体的な例としては、複数の暗号鍵により順序をもった多重の暗号化を行うような場合には、その暗号鍵それぞれを選択対象データとして扱うことなどが考えられる。また、秘密保持プログラムについても同様である。
【０４９９】
（９）上記の各実施の形態の秘密処理装置や秘密保持プログラムでは、いずれも選択パラメータの初期値を受け取り、内部でその値を更新していく構成を取っているが、これに限られるものではない。具体的には、秘密処理装置等の外部で選択パラメータの値を更新し、秘密処理装置等は更新後の値を受け取るようにしてもよい。また、予め秘密処理装置による処理が終了するまでに用いる選択パラメータの全てを配列によるデータとして受け取って、それに従った動作をするとしてもよい。また、秘密保持プログラムについても同様である。
【０５００】
（１０）第１の実施の形態において、選択識別子の算出方法として、第３の実施の形態にて示す方法、第４の実施の形態にて示す方法、及び第５の実施の形態にて示す方法の何れかを用いてもよい。
（１１）上記第１の実施の形態において、プログラム難読化装置１０は、ブロックの配置位置に対応する値を、式１を用いて算出したが、これに限定されない。
【０５０１】
プログラム難読化装置１０は、ブロックを配置するアドレスを算出する算出式を用いてもよい。このとき、プログラム実行装置２０は、前記算出式を用いて、次に実行するブロックのアドレスを算出する。
なお、第３、第４、及び第５の実施の形態においても同様に、プログラム難読化装置は、ブロックを配置するアドレスを算出する算出式を用いてもよい。
【０５０２】
（１２）本発明における「変数」は、特定の言語における変数に限定されるのではなく、レジスタ、キャッシュ、ＲＡＭ、ＨＤＤ、その他の書き換え可能なメモリに記憶した内容、及びそれらのメモリに記載された値によって指定された位置に記憶された内容であってもよい。
（１３）上記第１の実施の形態において、更新処理命令群は、選択対象主要命令群の直後に配置されたが、これに限定されない。選択対象主要命令群の中に挿入してもよい。
【０５０３】
ここでは、選択主要命令群に含まれる１以上のプログラム命令群のうち最後に位置するプログラム命令群の直後に更新処理命令群を配置することも、選択対象主要命令群の中に挿入するという。
選択主要命令群に含まれる１以上のプログラム命令群のうち最後に位置するプログラム命令群の直後に更新処理命令群が挿入されることは、選択対象主要命令群の直後に配置されることと同等である。
【０５０４】
（１４）上記実施の形態において、選択パラメータの更新を行う場合に、選択パラメータに、前回算出された選択識別子そのものを代入したが、これに限定されない。
算出された選択識別子に演算を施して、その演算結果を用いて選択パラメータの更新を行ってもよい。例えば、Ａ＝（算出された選択識別子の値）＋１とし、Ａの値を選択パラメータに代入してもよい。他の例として、Ａ＝（算出された選択識別子の値）×３とし、Ａの値を選択パラメータに代入してもよい。
【０５０５】
または、２つ前に選択された選択対象データ等、過去の何れかの時点で処理された選択対象データを示す選択識別子の値を代入してもよい。すなわち、過去に選択された選択対象データを示す選択識別子が反映されるのであればどのような代入の仕方でもよい。ここで、過去の何れかの時点で処理された選択対象データを示す選択識別子とは、現在選択されている選択対象データを示す選択識別子をも含む。
【０５０６】
例えば、前回算出された選択対象データを示す選択識別子と、２回以上過去に算出された選択対象データを示す選択識別子を用いて、選択パラメータを更新してもよい。具体的には、Ａ＝（前回算出された選択識別子）＋（２回前に算出された選択識別子）とし、Ａの値を選択パラメータに代入してもよい。
（１５）本発明における命令群とは、１以上の命令からなるものとする。つまり、本発明における命令群は、１の命令からなる場合も含まれる。
【０５０７】
（１６）上記第１の実施の形態において、複数の選択パラメータ全てを用いて、選択識別子を算出したが、これに限定されない。
複数の選択パラメータのうち1以上の選択パラメータを用いて選択識別子を算出してもよい。例えば、３つの選択パラメータＡ、Ｂ、Ｃのうち、ある選択識別子を算出する際には、選択パラメータＡ、Ｂを用い、他の選択識別子を算出する際には、選択パラメータＡ、Ｃを用いてもよい。
【０５０８】
なお、第２の実施の形態、第３の実施の形態、第４の実施の形態、及び第５に実施の形態においても同様に、複数の選択パラメータのうち1以上の選択パラメータを用いて選択識別子を算出してもよい。
（１７）上記第２の実施の形態において、各選択対象データには１のデータが格納されていたが、これに限定されない。
【０５０９】
各選択対象データに格納されるデータの個数は、1以上であればよい。
（１８）上記第２の実施の形態において、選択パラメータの更新の際に、選択識別子の値を更新対象の選択パラメータに代入したが、これに限定されない。
選択識別子の値に演算を施して、その演算結果を更新対象の選択パラメータに代入してもよい。例えば、選択識別子の値に、定数を加算し、加算結果を更新対象の選択パラメータに代入する。
【０５１０】
なお、第３の実施の形態、第４の実施の形態、及び第５に実施の形態においても同様に、選択識別子の値に演算を施して、その演算結果を更新対象の選択パラメータに代入してもよい。
また、第２の実施の形態において、プログラム難読化装置は、秘密保持プログラムを生成する際に、秘密情報を秘密情報用変数へ変換したがこれに限定されない。
【０５１１】
秘密情報用変数を含む演算式に変換してもよい。例えば、秘密情報を、秘密情報用変数と定数との和の演算式に変換してもよい。
（１９）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。なお、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ(Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ)や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０５１２】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて構成要素の集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
（２０）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０５１３】
（２１）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるディジタル信号であるとしてもよい。
（２２）また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記ディジタル信号であるとしてもよい。
【０５１４】
（２３）また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
（２４）また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【０５１５】
（２５）また、前記プログラムまたは前記ディジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記ディジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（２６）これらの実施の形態及び変形例の組合せであってもよい。
【産業上の利用可能性】
【０５１６】
本発明にかかる秘密処理装置、秘密保持プログラムは、暗号鍵などの秘密情報を扱う処理を行う場合に不正解析者による攻撃を困難にすることができるため、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行う装置等の分野で有用である。
また、本発明にかかるプログラム難読化装置は、暗号鍵などの秘密情報を扱うプログラムを、より解析が困難な形に変換することができるので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。
【０５１７】
また、上記にて示したプログラム難読化装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。
【図面の簡単な説明】
【０５１８】
【図１】秘密保持システム１の構成を示すブロック図である。
【図２】秘密保持プログラム１００の構造を示す図である。
【図３】秘密保持プログラム１００の具体的なプログラムを示す図である。
【図４】秘密保持プログラム１００を正常系で実行した場合の処理の動作を示す流れ図である。
【図５】プログラム難読化装置１０の構成を示すブロック図である。
【図６】秘密保持プログラム生成部２０３の構成を示すブロック図である。
【図７】プログラム難読化装置１０の動作概要を示す流れ図である。
【図８】選択対象データの生成処理の動作を示す流れ図である。図９に続く。
【図９】選択対象データの生成処理の動作を示す流れ図である。図８から続く。
【図１０】秘密保持システム２の構成を示すブロック図である。
【図１１】秘密保持プログラム３００の構造を示す図である。
【図１２】秘密保持プログラム３００を正常系で実行した場合の処理の動作を示す流れ図である。
【図１３】プログラム難読化装置３０の構成を示すブロック図である。
【図１４】プログラム難読化装置３０の動作概要を示す流れ図である。
【図１５】秘密保持システム３の構成を示すブロック図である。
【図１６】秘密保持プログラム５００の構造を示す図である。
【図１７】難読対象プログラムのコントロールフローを示す図である。
【図１８】秘密保持プログラム５００の各ブロックを模式的に記述した図である。
【図１９】秘密保持プログラム５００の具体的なプログラムを示す図である。
【図２０】秘密保持プログラム５００の各ブロックをＣ言語で記述した具体例を示す図である。
【図２１】秘密処理装置６０の構成を示すブロック図である。
【図２２】管理情報テーブルＴ７００のデータ構造の一例を示す図である。
【図２３】制御部７００の構成を示すブロック図である。
【図２４】秘密処理装置６０の動作を示す流れ図である。
【図２５】プログラム難読化装置５０の構成を示すブロック図である。
【図２６】配置順序決定部８０４の構成を示すブロック図である。
【図２７】プログラム難読化装置５０の動作概要を示す流れ図である。
【図２８】配置決定処理の動作を示す流れ図である。
【図２９】初期値算出処理の動作を示す流れ図である。
【図３０】機能提供命令群１〜３の実行順序を示す図である。
【図３１】選択処理部７２２ｂの構成を示すブロック図である。
【図３２】選択識別子取得処理の動作を示す流れ図である。
【図３３】難読化対象プログラムのコントロールフローを示す図である。
【図３４】プログラム難読化装置５０ｃの構成を示すブロック図である。
【図３５】図３３に示すコントロールフローを、生成した３つの機能提供命令群に置き換えたコントロールフローを示す図である。
【図３６】各機能提供命令群を展開したプログラムのコントロールフローを示す図である。
【図３７】配置順序決定部８０４ｃの構成を示すブロック図である。
【図３８】秘密保持プログラム１８００の構造を示す図である。
【図３９】配置順序決定部８０４ｄの動作を示す流れ図である。
【図４０】秘密保持プログラム５００ｅの各ブロックをＣ言語で記述した具体例を示す図である。
【図４１】秘密保持プログラム２０００の構造を示す図である。
【図４２】秘密保持プログラム２０００の動作の具体例を示す流れ図である。
【図４３】プログラム難読化装置１０１０の構成を示すブロック図である。
【図４４】配置決定処理の動作を示す流れ図である。
【図４５】秘密保持プログラム２２００の構造を示す図である。
【図４６】秘密保持プログラム２２００の動作の具体例を示す流れ図である。
【図４７】プログラム難読化装置３０１０の構成を示すブロック図である。
【図４８】配置決定処理の動作を示す流れ図である。
【符号の説明】
【０５１９】
１        秘密保持システム
１０      プログラム難読化装置
２０      プログラム実行装置
１００    秘密保持プログラム
２００    入力部
２０１    機能提供命令群生成部
２０２    偽装機能提供命令群生成部
２０３    秘密保持プログラム生成部
２        秘密保持システム
３０      プログラム難読化装置
４０      プログラム実行装置
３００    秘密保持プログラム
４００    入力部
４０１    機能提供命令群生成部
４０２    変遷処理命令群生成部
４０３    秘密保持プログラム生成部
３        秘密保持システム
５０      プログラム難読化装置
６０      秘密処理装置
５００    秘密保持プログラム
７００    制御部
７０１    記憶部
７０２    第１プログラム記憶部
７０３    第２プログラム記憶部
７０４    管理情報保持部
７０５    選択パラメータ群保持部
８００    プログラム記憶部
８０１    入力部
８０２    機能提供命令群生成部
８０３    偽装機能提供命令群生成部
８０４    配置順序決定部
８０５    管理命令群生成部
８０６    秘密保持プログラム生成部
８０７    出力部
１０１０    プログラム難読化装置
１０２０    秘密処理装置
２０００    秘密保持プログラム
２２００    秘密保持プログラム
３０１０    プログラム難読化装置
３０２０    秘密処理装置
【図１】
0004235243.tif 000002
【図２】
0004235243.tif 000003
【図３】
0004235243.tif 000004
【図４】
0004235243.tif 000005
【図５】
0004235243.tif 000006
【図６】
0004235243.tif 000007
【図７】
0004235243.tif 000008
【図８】
0004235243.tif 000009
【図９】
0004235243.tif 000010
【図１０】
0004235243.tif 000011
【図１１】
0004235243.tif 000012
【図１２】
0004235243.tif 000013
【図１３】
0004235243.tif 000014
【図１４】
0004235243.tif 000015
【図１５】
0004235243.tif 000016
【図１６】
0004235243.tif 000017
【図１７】
0004235243.tif 000018
【図１８】
0004235243.tif 000019
【図１９】
0004235243.tif 000020
【図２０】
0004235243.tif 000021
【図２１】
0004235243.tif 000022
【図２２】
0004235243.tif 000023
【図２３】
0004235243.tif 000024
【図２４】
0004235243.tif 000025
【図２５】
0004235243.tif 000026
【図２６】
0004235243.tif 000027
【図２７】
0004235243.tif 000028
【図２８】
0004235243.tif 000029
【図２９】
0004235243.tif 000030
【図３０】
0004235243.tif 000031
【図３１】
0004235243.tif 000032
【図３２】
0004235243.tif 000033
【図３３】
0004235243.tif 000034
【図３４】
0004235243.tif 000035
【図３５】
0004235243.tif 000036
【図３６】
0004235243.tif 000037
【図３７】
0004235243.tif 000038
【図３８】
0004235243.tif 000039
【図３９】
0004235243.tif 000040
【図４０】
0004235243.tif 000041
【図４１】
0004235243.tif 000042
【図４２】
0004235243.tif 000043
【図４３】
0004235243.tif 000044
【図４４】
0004235243.tif 000045
【図４５】
0004235243.tif 000046
【図４６】
0004235243.tif 000047
【図４７】
0004235243.tif 000048
【図４８】
0004235243.tif 000049