JP4235243B2 - プログラム変換装置及び秘密保持プログラム - Google Patents

プログラム変換装置及び秘密保持プログラム Download PDF

Info

Publication number
JP4235243B2
JP4235243B2 JP2007514686A JP2007514686A JP4235243B2 JP 4235243 B2 JP4235243 B2 JP 4235243B2 JP 2007514686 A JP2007514686 A JP 2007514686A JP 2007514686 A JP2007514686 A JP 2007514686A JP 4235243 B2 JP4235243 B2 JP 4235243B2
Authority
JP
Japan
Prior art keywords
selection
instruction group
program
target data
processing
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2007514686A
Other languages
English (en)
Other versions
JPWO2006115217A1 (ja
Inventor
太一 佐藤
基司 大森
理惠子 浅井
裕一 布田
智之 芳賀
雅浩 満保
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Publication of JPWO2006115217A1 publication Critical patent/JPWO2006115217A1/ja
Application granted granted Critical
Publication of JP4235243B2 publication Critical patent/JP4235243B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • G06F21/54Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Description

【技術分野】
【0001】
本発明は、秘密情報を保持して実行するプログラムを、秘密情報を不正に解析することを困難にするプログラムに変換する技術に関する。
【背景技術】
【0002】
従来、秘密の要素を使用して処理を行うプログラムを、不正解析者に解析させたくないという要求がある。このようなプログラムには、例えば、暗号プログラムがある。暗号プログラムは、秘密情報である暗号鍵を用いて処理を行うが、これを解析されたくないという要望がある。
また、例えば、画像に埋め込まれたコピー制御情報のウォーターマークの検出を行うプログラムである。ウォーターマークの検出プログラムの処理が不正解析者によって解析された場合、画像に埋め込まれたウォーターマークを除去するツールを作成される恐れがある。よって、このようなプログラムは、不正解析者にとって解析困難であることが望まれる。そのような要望に対し、例えばプログラムを暗号化しておき、実行時には復号してからそのプログラムを実行するという方法がある。しかし、このような方法を用いてもプログラムは実行時にメモリ上で平文となるため、メモリ上のプログラムを抜き取られて解析されるという脅威がある。このような脅威に対し、抜き取ったプログラムに含まれるプログラム命令群がどのような実行順序で実行されるかが解析困難であれば、ウォーターマークを除去するツールを作成することは困難になる。
【0003】
従来、秘密の要素を使用して処理を行うプログラムの不正な解析/改ざんを防止するための方法としてプログラムの制御構造/処理などを元のプログラムとは異なる形式に変換することで制御構造を複雑にして、解析困難なプログラムにするプログラム難読化の方法が考えられている(例えば非特許文献1参照)。
非特許文献1では、秘密情報を含むプログラム命令を、複数のプログラム命令群に置き換えることでプログラムを難読化する方法が開示されている。例えば、「d0=1234」というプログラム命令において「1234」が被秘匿情報である場合、「d0=1234」というプログラム命令を、「d0=100」、「d0=d0×2」、「d0=d0+30」、「d0=d0+1000」、「d0=d0+4」のようなプログラム命令群に置き換え、これらを分散して配置することが述べられている。このような方法を用いれば、プログラム中に存在する定数データを収集しても、その中から被秘匿情報を見つけることができなくなる。
【0004】
しかしながら、プログラムに含まれる各命令群の実行順序が知られてしまうと、不正解析者は、その実行順序に従って、d0の値を算出することにより被秘匿情報を見つけることができる。
そこで、従来、プログラムの実行順序の解析を困難にする方法として、実行する命令群を示す値に基づいて分岐先を決定する分岐命令(例えば、switch文)と配列とを用いて、各命令群の実行順序を制御する方法がある(非特許文献2)。このとき、オリジナルプログラムに含まれる複数の命令群(例えば、命令群1〜3であり、この順序に実行される。)は、実行する命令群を示す値と1対1に対応付けられており、また、命令群1〜3の最後に、配列を用いた演算式により次に実行する命令群を示す値を算出し、算出した値が、switch文にて用いられる変数Varに格納するプログラム命令が挿入される。配列の個数を10とすると、挿入されるプログラム命令の一例は、Var=g[3]+g[4]である。
【0005】
これにより、命令群1〜3の配置順序を入れ替えても、switch文により実行順序は、正当なままで保たれている。また、命令群1〜3の配置順序を入れ替えることで、オリジナルプログラムの構造の解析を困難にすることができる。つまり、ウォーターマークの検出プログラムの解析や、被秘匿情報の取得を困難にすることができる。
【非特許文献1】
鴨志田、松本、井上、"耐タンパーソフトウェアの構成手法に関する考察"、ISEC97−59
【非特許文献2】
Chenxi Wang、”A Security Architecture for Survivability Mechanisms”、 Ph.D. Dissertation (2000)
【発明の開示】
【発明が解決しようとする課題】
【0006】
しかしながら、各命令群の最後に挿入されるプログラム命令と配列に格納されている各データとは、例えば、コンピュータ装置の記憶領域から取得される可能性がある。そのため、各命令群の最後に挿入されるプログラム命令と配列に格納されている各データとが、不正解析者に知られてしまうと、不正解析者は、switch文にて用いられる変数の値を取得し、オリジナルプログラムの制御構造を再構成することができ、オリジナルプログラムの解析を容易に行うことができる。
【0007】
そこで、本発明は、不正解析者がオリジナルプログラムの解析を容易にすることができない秘密保持プログラムを生成するプログラム変換装置、前記秘密保持プログラムを実行する秘密処理装置、変換方法、及び秘密処理方法を提供することを目的とする。
【課題を解決するための手段】
【0008】
上記目的を達成するために、本発明は、オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置であって、オリジナルプログラムを取得するプログラム取得手段と、所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段とを備えることを特徴とする。
【発明の効果】
【0009】
上記に示した構成によると、プログラム変換装置にて生成された秘密保持プログラムは、演算式の前記複数の選択パラメータを更新する際に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させている。従来は、次に実行すべきブロックを決定する際には、複数の固定値が格納された配列を用いていたが、本発明のプログラム変換装置にて生成された秘密保持プログラムは、次に実行すべきブロックを決定した後、常に、演算式に用いる選択パラメータを更新するので、複数の選択パラメータに格納される値は特定されにくくなる。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
【0010】
ここで、前記所定の順序は、前記複数の選択パラメータに所定の初期値を与えて、前記選択処理命令群及び前記更新処理命令群の実行を繰り返すことにより、順次算出される選択識別子の順序であるとしてもよい。
この構成によると、プログラム変換装置は、各選択パラメータに所定の初期値を与えた場合に、オリジナルプログラムと同一の実行結果を出力する秘密保持プログラムを生成することができる。
【0011】
ここで、前記複数の選択対象データのそれぞれは、1個以上のデータからなるとしてもよい。
この構成によると、プログラム変換装置は、選択対象データをデータとして扱う秘密保持プログラムを生成することができる。
ここで、前記オリジナルプログラムは、秘匿すべき秘密情報を有し、前記選択処理命令群生成手段は、前記複数の選択パラメータを用いる第1の演算式により前記選択識別子を算出する命令群からなる選択処理命令群を生成し、前記更新処理命令群生成手段は、算出された前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新する更新処理命令群を生成し、前記プログラム変換装置は、さらに、更新した複数の選択パラメータを用いた第2の演算式により、前記秘密情報と同一の値を算出する変遷処理命令群を生成する変遷処理命令群生成手段を備え、前記秘密保持プログラム生成手段は、生成された変遷処理命令群を、前記更新処理命令群の配置位置と、前記秘密情報の配置位置との間へ配置し、及び前記秘密情報を前記変遷処理命令群で算出する処理に置換するとしてもよい。
【0012】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、秘密情報と同一の値を算出する方法を、前記選択処理命令群、前記更新処理命令群、及び前記変遷処理命令群により隠匿しているので、不正解析者は、秘密情報を解析することが困難となる。
ここで、プログラム変換装置は、さらに、前記オリジナルプログラムを、1つ以上のブロックに分割する分割手段を備え、前記複数の選択対象データのそれぞれは、異なるブロックを含むとしてもよい。
【0013】
この構成によると、プログラム変換装置は、選択対象データをオリジナルプログラムから分割されたブロックとして扱う秘密保持プログラムを生成することができる。
ここで、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記更新処理命令群生成手段は、前記複数の選択対象データのそれぞれに対して、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、定数値を第1の選択パラメータに格納する更新処理命令群を生成するとしてもよい。
【0014】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させて前記複数の選択パラメータの値を更新することができる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、選択識別子を算出し、Piとモジュロ値Nとは、互いに素であるとしてもよい。
【0015】
この構成によると、プログラム変換装置は、演算式を用いて、選択対象データを確実に決定することができる。
ここで、選択対象データ生成手段は、現時点までに前記演算式にて算出された選択識別子それぞれを記憶する記憶部と、1つのブロックに対して、1つの値を選択し、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、選択した値を第1の選択パラメータに格納して、前記演算式を実行する実行部と、算出された算出値と同一の選択識別子が前記記憶部に記憶されているか否かを判断する判断部と、判断結果が否定的である場合には、前記選択された1つの値を、前記1つのブロックに対する前記定数値と決定し、前記1つのブロックを算出された算出値が示す選択対象データに格納する格納部と、判断結果が肯定的である場合には、前記定数値が決定され、1つのブロックが選択対象データに格納されるまでの間、前記実行部と前記判断部とによる処理を繰り返すように制御する繰返制御部とを備え、前記選択対象データ生成手段による処理は、全てのブロックに対して実行されるとしてもよい。
【0016】
この構成によると、プログラム変換装置は、更新処理命令群の演算式を用いて、次のブロックを格納する選択対象データを決定する場合に、これまでに格納されていない選択対象データとなるように、前記複数の選択パラメータを更新することができる。これにより、生成された秘密保持プログラムは、複数の選択パラメータを用いた演算式により次に実行するべきブロックを確実に決定することができるので、オリジナルプログラムと同等の機能を提供することができる。
【0017】
ここで、前記選択処理命令群生成手段は、未実行である選択対象データを示す識別子を、常に取得する選択処理命令群を生成するとしてもよい。
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、未実行であるブロックを含む選択対象データを、常に取得することができる。また、秘密保持プログラムは、選択処理命令群により、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
【0018】
ここで、前記選択処理命令群生成手段は、未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する選択処理命令群を生成するとしてもよい。
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、管理情報を用いて、未実行であるブロックを含む選択対象データを、常に取得することができる。
【0019】
ここで、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記選択処理命令群生成手段は、前記配列テーブルと、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する前記演算式と、前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行う取得プログラム命令群とを生成し、前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含み、Piとモジュロ値Nとは互いに素であるとしてもよい。
【0020】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、配列テーブルを用いて、未実行であるブロックを含む選択対象データを確実に取得することができる。
ここで、前記更新処理命令群生成手段は、第j(jは2以上n以下の整数)の選択パラメータに格納されている値を第j−1の選択パラメータへ格納し、前記選択処理命令群にて取得された前記真の選択識別子を第nの選択パラメータへ格納する前記更新処理命令群を生成するとしてもよい。
【0021】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、選択パラメータの更新の際には、常に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させているので、複数の選択パラメータに格納される値は特定されにくくなる。
【0022】
ここで、前記演算式は、1つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記1つのパラメータを取得する第1取得プログラム命令群であり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択処理命令群生成手段は、前記第1取得プログラム命令群と、前記配列テーブルと、前記配列テーブルのうち未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第1取得プログラム命令群にて取得されたパラメータの値にて示される順序に配置された選択識別子を取得する第2取得プログラム命令群とを生成し、前記選択処理命令群は、前記第1取得プログラム命令群と、前記配列テーブルと、前記第2取得プログラム命令群とを含むとしてもよい。
【0023】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、インデックスを用いて、次に実行する選択対象データを示す選択識別子を取得することができる。
ここで、前記更新処理命令群生成手段は、前記インデックスの値をインクリメントする前記更新処理命令群を生成するとしてもよい。
【0024】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、インデックスの更新をする。不正解析者が、ある1のブロックを知ったとしても、インデックスの値が分からないため、次に実行すべきブロックが特定されることはない。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、前記選択処理命令群生成手段は、前記配列テーブルと、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す値を算出する前記演算式と、前記配列テーブルと同一のテーブルテーブル内において、未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する取得プログラム命令群とを生成し、前記選択命処理令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含むとしてもよい。
【0025】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、未実行であるブロックを含む選択対象データを確実に取得することができる。また、秘密保持プログラムは、選択処理命令群により、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記秘密保持プログラム生成手段は、さらに、前記複数のブロックのそれぞれが選択対象データに含まれた後、ブロックを含まない1つ以上の選択対象データに、1つ以上のプログラム命令を含む偽装ブロックを挿入するとしてもよい。
【0026】
この構成によると、プログラム変換装置にて生成された秘密保持プログラムは、偽装ブロックを含むので、不正解析者の解析を困難にすることができる。
また、本発明は、処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置であって、複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理実行手段と、前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返すことを特徴とする。
【0027】
この構成によると、秘密処理装置は、演算式の前記複数の選択パラメータを更新する際に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させている。従来は、次に実行すべきブロックを決定する際には、複数の固定値が格納された配列を用いていたが、本発明の秘密処理装置は、次に実行すべき選択対象データを決定した後、常に、演算式に用いる選択パラメータを更新するので、複数の選択パラメータに格納される値は特定されにくくなる。そのため、不正解析者が秘密処理の解析を容易にすることができない。
【0028】
ここで、前記複数の選択対象データのそれぞれは、1個以上のデータからなるとしてもよい。
この構成によると、秘密処理装置は、選択対象データをデータとして扱うことができる。
ここで、前記秘密処理は、秘匿すべき秘密情報を用いる代わりに、所定の処理を施して前記秘密情報を算出する処理であり、前記選択処理実行手段は、前記複数の選択パラメータを用いる演算式により前記選択識別子を算出し、前記更新処理実行手段は、前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新し、前記秘密処理装置は、さらに、更新した複数の選択パラメータを用いた前記所定の処理により、前記秘密情報と同一の値を算出する変遷処理実行手段を備えるとしてもよい。
【0029】
この構成によると、秘密処理装置は、秘密情報と同一の値を算出する方法を隠匿しているので、不正解析者は、秘密情報を解析することが困難となる。
ここで、前記秘密処理は、外部装置により1つ以上のブロックに分割されたオリジナルプログラムを実行する処理であり、前記ブロックは1つ以上のプログラム命令を含み、前記複数の選択対象データのそれぞれは、異なるブロックを含むとしてもよい。
【0030】
この構成によると、秘密処理装置は、選択対象データをオリジナルプログラムから分割されたブロックとして扱うことができる。
ここで、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記更新処理実行手段は、前記複数の選択対象データのそれぞれに対して、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、定数値を第1の選択パラメータに格納し、前記定数値は、前記演算式を用いて、次に実行される選択対象データを示す選択識別子が算出されるように、前記外部装置が前記秘密保持プログラム生成時に予め設定した値であるとしてもよい。
【0031】
この構成によると、秘密処理装置は、前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させて前記複数の選択パラメータの値を更新することができる。
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、選択識別子を算出し、Piとモジュロ値Nとは、互いに素であるとしてもよい。
【0032】
この構成によると、秘密処理装置は、演算式により、選択対象データを確実に決定することができる。
ここで、前記選択処理実行手段は、未実行である選択対象データを示す識別子を、常に取得するとしてもよい。
この構成によると、秘密処理装置は、未実行であるブロックを含む選択対象データを、常に取得することができる。また、秘密処理装置にて実行される秘密処理は、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
【0033】
ここで、前記選択処理実行手段は、未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得するとしてもよい。
この構成によると、秘密処理装置は、管理情報を用いて、未実行であるブロックを含む選択対象データを、常に取得することができる。
【0034】
ここで、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、前記選択処理実行手段は、前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行い、Piとモジュロ値Nとは互いに素であるとしてもよい。
【0035】
この構成によると、秘密処理装置は、配列テーブルを用いて、未実行であるブロックを含む選択対象データを確実に取得することができる。
ここで、前記更新処理実行手段は、第j(jは2以上n以下の整数)の選択パラメータに格納されている値を第j−1の選択パラメータへ格納し、前記選択処理実行手段にて取得された前記真の選択識別子を第nの選択パラメータへ格納するとしてもよい。
【0036】
この構成によると、秘密処理装置は、選択パラメータの更新の際には、常に、選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記演算式に過去に代入された1以上の選択パラメータの値のうち少なくとも1の選択パラメータの値を反映させているので、複数の選択パラメータに格納される値は特定されにくくなる。
ここで、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、1つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記1の選択パラメータを取得する前記演算式を実行する第1取得部と、前記配列テーブルのうち未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第1取得部にて取得された選択パラメータの値にて示される順序に配置された選択識別子を取得する第2取得部とを含むとしてもよい。
【0037】
この構成によると、秘密処理装置は、インデックスを用いて、次に実行する選択対象データを示す選択識別子を取得することができる。
ここで、前記更新処理実行手段は、前記インデックスの値をインクリメントするとしてもよい。
この構成によると、秘密処理装置は、インデックスの更新をする。不正解析者が、ある1のブロックを知ったとしても、インデックスの値が分からないため、次に実行すべきブロックが特定されることはない。そのため、不正解析者がオリジナルプログラムの解析を容易にすることができない。
【0038】
ここで、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、前記複数の選択パラメータは、第1から第nの選択パラメータであり、前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、前記選択処理実行手段は、前記配列テーブルを保持し、前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、前記選択処理実行手段は、前記配列テーブルと同一のテーブルテーブル内において、未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得するとしてもよい。
【0039】
この構成によると、秘密処理装置は、未実行であるブロックを含む選択対象データを確実に取得することができる。また、秘密処理装置にて実行される秘密処理は、常に異なる選択対象データを次に実行すべき選択対象データとしているので、不正解析者は、正しい実行順序を特定することが困難となる。
ここで、前記秘密処理は、前記外部装置により前記オリジナルプログラムから生成された秘密保持プログラムを実行する処理であり、前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、ブロックを含まない1つ以上の選択対象データには、1つ以上のプログラム命令を含む偽装ブロックが含まれ、前記秘密保持プログラムは、前記オリジナルプログラムより分割された各ブロックと、1つ以上の偽装ブロックとを含むとしてもよい。
【0040】
この構成によると、秘密処理装置にて実行される秘密保持プログラムは、偽装ブロックを含むので、不正解析者の解析を困難にすることができる。
【発明を実施するための最良の形態】
【0041】
1.第1の実施の形態
以下、本発明に係る第1の実施の形態としての秘密保持プログラム100及びプログラム難読化装置10について、図面を参照して説明する。
1.1 秘密保持システム1の概要
秘密保持システム1は、図1に示すように、プログラム難読化装置10と、プログラム実行装置20とから構成されている。
【0042】
プログラム難読化装置10は、実行順序を秘密にしたい難読化対象プログラムから秘密保持プログラム100を生成し、生成した秘密保持プログラム100をプログラム実行装置20へ配布する。
プログラム実行装置20は、プログラム難読化装置10から配布された秘密保持プログラム100を実行する。
【0043】
ここで、難読化対象プログラムは、命令群A、命令群B、命令群Cの3つの命令群から構成されており、命令群A、B、Cの順に実行することにより正しく動作するものとする。
1.2 秘密保持プログラム100の構造
ここでは、プログラム難読化装置10にて生成され、プログラム実行装置20にて実行される秘密保持プログラム100のプログラム構造について説明する。
【0044】
秘密保持プログラム100は、秘密の要素を使用して処理を行うプログラムであり、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されたくないプログラムである。例えば、ウォーターマーク検出プログラムや、非特許文献1で述べられている方法で、秘密情報を扱うプログラム命令を別のプログラム命令群に置き換えて、それらを分散して配置したプログラムである。後者については、置き換えたプログラム命令群を不正解析者が収集し、正しい順番で実行すれば秘密情報の値が算出できるので、実行経路を分かり難くしたい。
【0045】
秘密保持プログラム100は、おおまかにはプログラムに含まれる複数の選択対象データ140〜146がどのような実行順序で実行されるかが解析困難なプログラムである。なお、選択対象データ140〜146には、正常系の実行時には実行されることのない選択対象データも含まれている。実行されることのない選択対象データは、正しい実行順序を知らない不正解析者が、考えうる実行順序の組み合わせ数を多くするために組み込まれている。ここで、正常系の実行とは、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わないで処理をすることである。秘密保持プログラム100は、図2に示すように、前処理命令群110、選択処理命令群120、変遷処理命令群130、選択対象データ140、141、・・・、146から構成され、これらが図2に示す順番に配置されている。
【0046】
秘密保持プログラム100は、呼出元のプログラムから、32ビットの入力値in1、in2、in3、および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取る。
秘密保持プログラム100は、選択処理命令群120での処理に用いる複数の選択パラメータの各値(ここでは、3つの値)を保持する32ビットの第1、第2及び第3の選択パラメータ用変数と、選択識別子を保持する32ビットの選択識別子用変数を用いて処理を行う。ここで、選択パラメータは、選択対象データ140、141、・・・、146から1の選択対象を決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子である。
【0047】
ここでは、秘密保持プログラム100が実際に使用される際に呼出元のプログラムから受け取る入力値in1、in2、in3は値「1」、「2」、「3」であるとする。本実施の形態で提供する秘密保持プログラム100は、呼出元のプログラムから受け取る値を用いれば、(選択対象主要命令群を含む)選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、(選択対象主要命令群を含む)選択対象データの実行順序を知ることが困難なプログラムである。
【0048】
1.2.1 前処理命令群110
前処理命令群110は、選択処理命令群120で用いる選択パラメータ群の初期値を算出するプログラム命令群である。ここで、選択パラメータ群は、第1、第2及び第3の選択パラメータ用変数からなる。
前処理命令群110は、秘密保持プログラム100が起動された際に、最初に実行されるプログラム命令群である。
【0049】
前処理命令群110は、呼び出し元のプログラムから32ビットの入力値in1、in2、in3を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第1の前処理プログラム命令群と、選択処理命令群120に分岐する第2の前処理プログラム命令群とからなり、これらを順に行う。
具体的には、第1の前処理プログラム命令群は、第1〜3の選択パラメータ用変数にそれぞれ、in1、in2、in3の値を格納する。正常系の実行時には、第1の前処理プログラム命令群は、入力値in1、in2、in3として、それぞれ値「1」、「2」、「3」を受け取り、第1〜3の選択パラメータ用変数にそれぞれ値「1」、「2」、「3」を格納する処理を行う。
【0050】
第2の前処理プログラム命令群は、例えば、C言語で記述されるプログラムにおいて選択処理命令群120の先頭にラベル「label_120:」が挿入されている場合には、プログラム命令「goto label_120;」で表されるプログラム命令である。
なお、前処理命令群110の直後に選択処理命令群120が配置されている場合には、プログラム命令「goto label_120;」がなくても構わない。この場合、前処理命令群110は、第1の前処理プログラム命令群のみから構成されることになる。
【0051】
1.2.2 選択処理命令群120
選択処理命令群120は、選択パラメータ群に基づき、選択対象データ140〜146から1つを選択し選択識別子とするプログラム命令群である。
選択処理命令群120は、選択パラメータ群を用いて、選択識別子を算出する第1の選択処理プログラム命令群と、変遷処理命令群130に分岐する第2の選択処理プログラム命令群からなり、これらを順に行う。なお、選択識別子は後述の変遷処理命令群で使用する値である。
【0052】
第1の選択処理プログラム命令群について、具体例を用いて、以下に説明する。第1の選択処理プログラム命令群は、p1×(第1の選択パラメータ用変数)+p2×(第2の選択パラメータ用変数)+p3×(第3の選択パラメータ用変数) mod NNを算出し、算出した値を選択識別子用変数に格納するプログラム命令の集まりである。NNは選択対象データの数とする。また、p1、p2、p3は、それぞれNNと互いに素な素数であって、NNを法とした場合にそれぞれ異なる値となる数とする。なお、NNを素数とし、p1、p2、p3をそれぞれNN未満の互いに異なる素数としてもよい。ここで演算子「×」は掛け算を表す。ここでは、p1、p2、p2、NNをそれぞれ、値「2」、「3」、「5」、「7」とし、式1「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数) MOD 7」を算出するプログラム命令群であるとする。
【0053】
なお、変遷処理命令群130に分岐するプログラム命令群については、前処理命令群110で述べた第2の前処理プログラム命令群と同様で、分岐先が変遷処理命令群130になったものである。
1.2.3 変遷処理命令群130
変遷処理命令群130は、選択処理命令群120で算出した選択識別子に基づき、いずれかの選択対象データ140〜146に分岐する処理を行うプログラム命令群である。
【0054】
具体的には、選択識別子用変数の値が、0、1、・・・、6の場合にそれぞれ、選択対象データ140、141、・・・、146への分岐を行うプログラム命令群である。
例えば、秘密保持プログラム100が記述されるプログラムがC言語のプログラムとし、選択対象データ140、141、・・・、146の先頭に、それぞれラベル「label_140:」、「label_141:」、・・・、「label_146:」があるとすると、変遷処理命令群130は以下のようなプログラム命令となる。
【0055】

switch(選択識別子用変数){
case 0: goto label_140;
case 1: goto label_141;
・・・
case 6: goto label_146;


1.2.4 選択対象データ140〜146
選択対象データ140〜146は、変遷処理命令群130により分岐してきた際に、実行されるプログラム命令群である。
【0056】
選択対象データ140〜146は、それぞれ、選択対象主要命令群150〜156、更新処理命令群160〜166、分岐命令群170〜176からなり、これらは図2に示す順番に配置されている。各命令群は、1以上のプログラム命令からなるプログラム命令群である。
ここでは、選択対象データ140の構成内容について説明する。なお、選択対象データ141〜146については、選択対象データ140の構成内容と同様であるため、説明は省略する。
【0057】
(1)選択対象主要命令群150
選択対象主要命令群150は、このプログラムが提供する機能(例えばウォーターマーク検出の機能)の処理の一部を行うプログラム命令群であるか、あるいは、提供する機能とは無関係であり、正常系での実行時(以降、正常系の実行時)には実行されない命令群である。
【0058】
本実施例では、正常系の実行時には、選択対象主要命令群152、154、156の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群152、154、156は、難読化対象プログラムが提供する機能の処理の一部を含むプログラム命令群であり、選択対象主要命令群152、154、156のそれぞれは、順に命令群A、B、Cと同一のものである。
【0059】
また、選択対象主要命令群150、151、153、155は、提供する機能とは無関係な処理が含まれるプログラム命令群である。以降の説明では、選択対象主要命令群152、154,156の命令群であって、秘密保持プログラムが提供する機能の一部である命令群をそれぞれ機能提供命令群1〜3と呼ぶ。また、選択対象主要命令群150、151、153、155に含まれる正常系の実行時には実行されない命令群を偽装機能提供命令群と呼ぶ。
【0060】
本実施例では、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わない正常系での実行時(以降、正常系の実行時)には、前処理命令群110で選択パラメータ用変数1〜3にそれぞれ初期値「1」、「2」、「3」が格納されて、以降説明する処理に乗っ取って、選択対象主要命令群152、154、156が順番に実行されることとなる。正確には、途中、更新処理命令群などの処理が行われている。
【0061】
(2)更新処理命令群160
更新処理命令群160は、選択パラメータ群の値の更新を行うプログラム命令群である。
更新処理命令群160は、選択パラメータ群の値の更新に用いる定数値を予め有している。更新処理命令群160は、正当な選択パラメータ群を受け取った場合には、受け取った選択パラメータ群と定数値とを用いて、選択処理命令群120が次処理として正当な選択対象を選択することができる新たな選択パラメータ群を生成する。
【0062】
ここで、生成方法の一例を以下に示す。
更新処理命令群160は、第2の選択パラメータ用変数の値を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値を第2の選択パラメータ用変数に格納し、選択パラメータ用変数1に予め有している定数値を代入して、新たな選択パラメータを生成する。
【0063】
定数値は、これらの第1〜第3の選択パラメータ用変数の値「(定数値)」、「x」、「y」を選択処理命令群120の式1に代入して得られる選択識別子が、これまでに選択された1以上の選択対象データを示さない値である。もし、これが、これまでに選択された1の選択対象データになる値であるとすると、当該選択対象データが連続して無限ループを行う処理となってしまうからである。
【0064】
ここで、更新処理命令群160〜166のそれぞれが有する定数値の具体例を、以下に示す。
秘密保持プログラム100は、上述したように、選択対象主要命令群152、154、156の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【0065】
選択対象主要命令群152が実行された後、更新処理命令群162は、第2の選択パラメータ用変数の値「2」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「1」を第2の選択パラメータ用変数に格納する。このとき、更新処理命令群162が有する定数値Aを「6」とすることで、選択処理命令群120は、次の正当な処理として、選択対象データ144を選択することができる。
【0066】
次に、選択対象主要命令群154が実行された後、更新処理命令群164は、第2の選択パラメータ用変数の値「1」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「6」を第2の選択パラメータ用変数に格納する。このとき、更新処理命令群164が有する定数値Bを「2」とすることで、選択処理命令群120は、次の正当な処理として、選択対象データ146を選択することができる。
【0067】
次に、選択対象主要命令群156が実行された後、更新処理命令群166は、第2の選択パラメータ用変数の値「6」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「2」を第2の選択パラメータ用変数に格納する。このとき、更新処理命令群164が有する定数値Bを「0」とすることで、選択処理命令群120は、これまでに実行された選択対象データ142、144、146以外の選択対象データを指定することができる。
【0068】
正常系の動作では実行されることない、選択対象データ140、141、143、145の更新処理命令群160、161、163、165には、値「0」から「6」のうち未使用である値を重複しないように、選択する。ここでは、更新処理命令群160、161、163、165のそれぞれには、値「1」、「3」、「4」、「5」とする。
(3)分岐命令群170
分岐命令群170は、選択処理命令群120へ分岐するプログラム命令群や、プログラム呼出元に制御を戻す処理のプログラム命令群である。
【0069】
1.2.5 秘密保持プログラム100の具体例
秘密保持プログラム100の具体例として、C言語にて記述した秘密保持プログラム100aを図3に示す。ここで、演算子「*」は掛け算を表す。
プログラム命令群110aは前処理命令群110に対応し、プログラム命令群120aは選択処理命令群120に対応し、プログラム命令群130aは変遷処理命令群130に対応している。また、プログラム命令群140a、142a、143a、146aのそれぞれは、選択対象データ140、142、143、146と対応している。
【0070】
プログラム命令群150a、152a、153a、156aのそれぞれは、選択対象主要命令群150、152、153、156と対応している。プログラム命令群160a、162a、163a、166aのそれぞれは、更新処理命令群160、162、163、166と対応している。また、プログラム命令群170a、172a、173a、176aのそれぞれは、分岐命令群170、172、173、176と対応している。なお、選択対象データ141、144、145に対応する具体例は、図面の都合上記述していない。
【0071】
1.3 秘密保持プログラム100の実行
プログラム実行装置20が、秘密保持プログラム100を正常系で実行した場合の処理について、図4に示す流れ図を用いて説明する。
秘密保持プログラム100は、前処理命令群110の処理を行う(ステップS5)。具体的には、前処理命令群110は、入力値in1、in2、in3として、それぞれ値「1」、「2」、「3」を受け取り、第1〜3の選択パラメータ用変数にそれぞれ値「1」、「2」、「3」を格納する処理を行い、選択処理命令群120へ分岐する。
【0072】
次に、秘密保持プログラム100は、受け取った入力値「1」、「2」、「3」を用いて、選択処理命令群120の処理を行う(ステップS10)。具体的には、選択処理命令群120は、式1「2×(第1の選択パラメータ用変数(=1))+3×(第2の選択パラメータ用変数(=2))+5×(第3の選択パラメータ用変数(=3)) MOD 7」により値「2」を算出し、算出した値「2」を選択識別子用変数に格納し、変遷処理命令群130へ分岐する。
【0073】
秘密保持プログラム100は、選択識別子用変数(=2)を用いて、変遷処理命令群130の処理を行う(ステップS15)。具体的には、変遷処理命令群130は、選択処理命令群120で算出した選択識別子「2」に基づいて、選択対象データ142に分岐する。
秘密保持プログラム100は、変遷処理命令群130の分岐命令に従って、選択対象データ142の選択対象主要命令群152の処理を行う(ステップS20)。具体的には、選択対象主要命令群152は、難読化対象プログラムにおける命令群Aを実行する。
【0074】
次に、秘密保持プログラム100は、更新処理命令群162の処理を行う(ステップS25)。具体的には、更新処理命令群162は、第2の選択パラメータ用変数の値を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値を第2の選択パラメータ用変数に格納し、第1の選択パラメータ用変数に定数値A(=「6」)を代入する処理を行うプログラム命令群である。ここでは、第1〜第3の選択パラメータ用変数のそれぞれは初期値「1」、「2」、「3」であるので、更新処理命令群162は、第1〜第3の選択パラメータ用変数のそれぞれに値「定数値A(=6)」、「1」、「2」を代入する。
【0075】
次に、秘密保持プログラム100は、分岐命令群172の処理を行う(ステップS30)。具体的には、分岐命令群172は、選択処理命令群120へ分岐する。
次に、秘密保持プログラム100は、更新された選択パラメータ群(値「6」、「1」、「2」)を用いて、選択処理命令群120の処理を行う(ステップS35)。具体的には、選択処理命令群120は、式1「2×(第1の選択パラメータ用変数(=6))+3×(第2の選択パラメータ用変数(=1))+5×(第3の選択パラメータ用変数(=2)) MOD 7」により値「4」を算出し、算出した値「4」を選択識別子用変数に格納し、変遷処理命令群130へ分岐する。
【0076】
秘密保持プログラム100は、選択識別子用変数(=4)を用いて、変遷処理命令群130の処理を行う(ステップS40)。具体的には、変遷処理命令群130は、選択処理命令群120で算出した選択識別子「4」に基づいて、選択対象データ144に分岐する。
秘密保持プログラム100は、変遷処理命令群130の分岐命令に従って、選択対象データ144の選択対象主要命令群154の処理を行う(ステップS45)。具体的には、選択対象主要命令群154は、難読化対象プログラムにおける命令群Bを実行する。
【0077】
次に、秘密保持プログラム100は、更新処理命令群164の処理を行う(ステップS50)。具体的には、更新処理命令群164は、第2の選択パラメータ用変数の値を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値を第2の選択パラメータ用変数に格納し、第1の選択パラメータ用変数に定数値B(=「2」)を代入する処理を行うプログラム命令群である。ここでは、第1〜第3の選択パラメータ用変数のそれぞれは初期値「6」、「1」、「2」であるので、更新処理命令群164は、第1〜第3の選択パラメータ用変数のそれぞれに値「定数値B(=2)」、「6」、「1」を代入する。
【0078】
次に、秘密保持プログラム100は、分岐命令群174の処理を行う(ステップS55)。具体的には、分岐命令群174は、選択処理命令群120へ分岐する。
次に、秘密保持プログラム100は、更新された選択パラメータ群(値「2」、「6」、「1」)を用いて、選択処理命令群120の処理を行う(ステップS60)。具体的には、選択処理命令群120は、式1「2×(第1の選択パラメータ用変数(=2))+3×(第2の選択パラメータ用変数(=6))+5×(第3の選択パラメータ用変数(=1)) MOD 7」により値「6」を算出し、算出した値「6」を選択識別子用変数に格納し、変遷処理命令群130へ分岐する。
【0079】
秘密保持プログラム100は、選択識別子用変数(=6)を用いて、変遷処理命令群130の処理を行う(ステップS65)。具体的には、変遷処理命令群130は、選択処理命令群120で算出した選択識別子「6」に基づいて、選択対象データ146に分岐する。
秘密保持プログラム100は、変遷処理命令群130の分岐命令に従って、選択対象データ146の選択対象主要命令群156の処理を行う(ステップS70)。具体的には、選択対象主要命令群156は、難読化対象プログラムにおける命令群Cを実行する。
【0080】
次に、秘密保持プログラム100は、更新処理命令群166の処理を行う(ステップS75)。具体的には、更新処理命令群166は、第2の選択パラメータ用変数の値を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値を第2の選択パラメータ用変数に格納し、第1の選択パラメータ用変数に定数値C(=「0」)を代入する処理を行うプログラム命令群である。ここでは、第1〜第3の選択パラメータ用変数のそれぞれは初期値「2」、「6」、「1」であるので、更新処理命令群164は、第1〜第3の選択パラメータ用変数のそれぞれに値「定数値C(=0)」、「2」、「6」を代入する。
【0081】
次に、秘密保持プログラム100は、分岐命令群176の処理を行う(ステップS80)。具体的には、分岐命令群176は、呼出元のプログラムへ制御を返す処理を行う(選択対象データ146は、最後に実行される選択対象データなので、選択処理命令群120に分岐する必要はない)。例えば、C言語のプログラムではreturn文がこの処理に対応する。
【0082】
なお、ここでは、動作の主体を秘密保持プログラム100としているが、実際には、プログラム実行装置20が秘密保持プログラム100を実行することにより、上記の動作が実現できる。つまり、動作の主体を、秘密保持プログラム100からプログラム実行装置20へと置き換えてもよい。
1.4 プログラム難読化装置10
ここでは、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム100を生成するプログラム難読化装置10について述べる。秘密保持プログラム100において、選択対象主要命令群150〜156に含まれる機能提供命令群および偽装機能提供命令群以外の各部は、どのような難読化対象プログラムに対しても共通して用いることができる。ここでは、機能提供命令群の生成、偽装機能提供命令群の生成について中心に述べる。
【0083】
プログラム難読化装置10は、図5に示すように、入力部200、機能提供命令群生成部201と、偽装機能提供命令群生成部202と、秘密保持プログラム生成部203とから構成されている。
プログラム難読化装置10は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置10は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0084】
1.4.1 入力部200
難読化対象のプログラムと、秘密保持プログラム100を正常系にて実行する際、秘密保持プログラム100に与える3つの初期値(ここでは、「1」、「2」、「3」)を受け付ける。
1.4.2 機能提供命令群生成部201
機能提供命令群生成部201は、入力部200にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群を生成する。なお、難読化対象プログラムに無条件飛び越し、条件飛び越しが含まれる場合には、飛び越しを行うプログラム命令と飛び越し先のプログラム命令は同じブロックに含まれるように分割を行う
【0085】
ここでは、分割した各部に含まれる命令数が出来るだけ均等になるように3つのブロックに分割し、3つの機能提供命令群を生成する。生成した機能提供命令群は、元となったプログラム命令群が難読化対象プログラムにおいて始まりの方にあった順に機能提供命令群1〜3とする。
1.4.3 偽装機能提供命令群生成部202
偽装機能提供命令群生成部202は、難読化対象プログラムが記述されているプログラミング言語で記述された1以上のプログラム命令をランダムに組み合わせた偽装機能提供命令群を複数個生成する。
【0086】
なお、難読化対象プログラムに含まれているプログラム命令のみを用いてランダムあるいは手動で偽装機能提供命令群を生成しても構わない。このようにすることで、偽装機能提供命令群と難読化対象プログラムに元から含まれている命令とを区別することを困難にすることができ、解析を困難にすることができる。また、C言語、Java(登録商標)言語などのコンパイル処理を行うプログラミング言語においては、偽装機能提供命令群生成部202は、コンパイルが通るように難読化対象プログラムで使われている変数を用いて偽装機能提供命令群を生成する。または、難読化対象プログラムで使われていない変数を偽装機能提供命令群に含める場合には、偽装機能提供命令群生成部202は、難読化後のプログラムに、そのような変数の宣言を追加する。なお、C言語に関する用語、変数の宣言の仕方などについては、公知のプログラミング言語(C言語)の仕様であるので、ここでの説明は省略する。Java(登録商標)に関する用語は、変数の宣言の仕方などについては、公知のプログラミング言語(Java(登録商標))の仕様であるので、ここでの説明は省略する。ここでは、偽装機能提供命令群生成部202は、4つの偽装機能提供命令群を生成する。
【0087】
1.4.4 秘密保持プログラム生成部203
秘密保持プログラム生成部203は、複数の機能提供命令群、及び複数の偽装機能提供命令群を用いて、前処理命令群110、選択処理命令群120、変遷処理命令群130、選択対象データ140、141、・・・、146を生成することにより、秘密保持プログラム100を生成する。
【0088】
秘密保持プログラム生成部203は、図6に示すように、プログラム記憶部210、位置記憶部211、ブロック選択部212、ブロック配置部213、決定部214、及び挿入部215を有している。
プログラム記憶部210は、生成された各命令群及び選択対象データを記憶する領域を有している。
【0089】
位置記憶部211は、各選択対象主要命令群が配置された位置を示す情報を記憶するための領域を有している。例えば、値「2」が位置記憶部211に格納されている場合には、選択対象データ142には、既に、1の機能提供命令群、又は1の偽装機能提供命令群が挿入されていることを示す。
ブロック選択部212は、難読対象プログラムから、次に配置すべきブロック(機能提供命令群)を選択する。
【0090】
ブロック配置部213は、式1を用いて、選択された前記ブロックの配置位置を算出し、前記中間プログラム内において、算出した前記配置位置に、選択された前記ブロックを配置する。
決定部214は、位置記憶部211に記憶されている前記配置位置以外の配置位置が算出されるように、前記変数に代入すべき代入値を決定する。
【0091】
挿入部215は、決定された代入値を前記変数に代入するプログラム命令群(更新処理命令群)を生成し、配置された前記ブロックの直後に、生成した前記プログラム命令群を挿入する。
(1)前処理命令群110の生成
秘密保持プログラム生成部203は、呼び出し元のプログラムから32ビットの入力値in1、in2、in3を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第1の前処理プログラム命令群と、選択処理命令群120に分岐する第2の前処理プログラム命令群とからなり、これらを順に行う前処理命令群110を生成する。秘密保持プログラム生成部203は、生成した前処理命令群110をプログラム記憶部210に格納する。
【0092】
(2)選択処理命令群120の生成
秘密保持プログラム生成部203は、選択パラメータ群を用いて、選択識別子を算出する第1の選択処理プログラム命令群と、変遷処理命令群130に分岐する第2の選択処理プログラム命令群からなり、これらを順に行う選択処理命令群120を生成する。
ここでは、秘密保持プログラム生成部203は、第1の選択処理プログラム命令群として、式1「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数) MOD 7」を算出するプログラム命令群を生成する。秘密保持プログラム生成部203は、生成した選択処理命令群120をプログラム記憶部210に格納する。
【0093】
(3)変遷処理命令群130の生成
秘密保持プログラム生成部203は、選択処理命令群120で算出した選択識別子に基づき、選択対象データ140〜146のうちいずれかの選択対象データに分岐する処理を行う変遷処理命令群130を生成する。
具体的には、秘密保持プログラム生成部203は、機能提供命令群生成部201にて生成された複数の機能提供命令群の個数(ここでは、3個)と、偽装機能提供命令群生成部202にて生成された複数の偽装機能提供命令群の個数(ここでは、4個)とを取得し、その合計値を算出する。秘密保持プログラム生成部203は、算出した合計値(ここでは、7)と同数のラベル名を生成する。秘密保持プログラム生成部203は、選択処理命令群120に含まれる式1が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群130を生成する。秘密保持プログラム生成部203は、生成した変遷処理命令群130をプログラム記憶部210に格納する。
【0094】
(4)選択対象データ140、141、・・・、146の生成
秘密保持プログラム生成部203は、3つの初期値と、式1と、生成した複数の機能提供命令群及び複数の偽装機能提供命令群とを用いて、複数の機能提供命令群の個数と、機能提供命令群の個数との合計値と同数の選択対象データを生成する。
以下、具体例を用いて、選択対象データの生成について説明する。
【0095】
秘密保持プログラム生成部203は、生成した各ラベル名のみからなる選択対象データを生成する。ここでは、秘密保持プログラム生成部203は、7個の選択対象データ140〜146を生成する。秘密保持プログラム生成部203は、生成した各ラベル名のみからなる選択対象データそれぞれをプログラム記憶部210に格納する。
秘密保持プログラム生成部203は、機能提供命令群1を機能提供命令群生成部201から取得する。秘密保持プログラム生成部203は、入力部200にて受け取った3つの初期値と、式1とを用いて、取得した機能提供命令群1を挿入する選択対象データを決定する。ここでは、3つの初期値(「1」、「2」、「3」)と式1とから値「2」が算出されるので、秘密保持プログラム生成部203は、機能提供命令群1を、プログラム記憶部210に格納されている選択対象データ142に挿入する。秘密保持プログラム生成部203は、位置記憶部211に「2」を格納する。
【0096】
秘密保持プログラム生成部203は、選択対象データ142に挿入する更新処理命令群162を生成する。ここでは、秘密保持プログラム生成部203は、第2の選択パラメータ用変数の値「2」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「1」を第2の選択パラメータ用変数に格納する。秘密保持プログラム生成部203は、第1〜第3の選択パラメータ用変数の値「(定数値A)」、「1」、「2」を式1に代入して得られる値が、これまでに選択された1以上の選択対象データを示さない値となるように、位置記憶部211に格納されている1つ以上の値を用いて、定数値Aとして、「6」を取得する。なお、取得方法については後述する。秘密保持プログラム生成部203は、取得した定数値A(=「6」)を含み、選択パラメータ群の値の更新を行う更新処理命令群162を生成し、生成した更新処理命令群をプログラム記憶部210に格納されている選択対象データ142に挿入する。
【0097】
秘密保持プログラム生成部203は、選択対象データ142に挿入する分岐命令群172を生成し、生成した分岐命令群172を選択対象データ142に挿入する。ここでは、秘密保持プログラム生成部203は、選択処理命令群120へ分岐する分岐命令群172を生成し、生成した分岐命令群172をプログラム記憶部210に格納されている選択対象データ142に挿入する。これにより、秘密保持プログラムを構成する選択対象データ142が生成されることになる。
【0098】
秘密保持プログラム生成部203は、機能提供命令群2を機能提供命令群生成部201から取得する。秘密保持プログラム生成部203は、選択パラメータ群(「定数値A(=6)」、「1」、「2」)と、式1とを用いて、取得した機能提供命令群2を挿入する選択対象データを決定する。ここでは、3つの初期値(「6」、「1」、「2」)と式1とから値「4」が算出されるので、秘密保持プログラム生成部203は、機能提供命令群2をプログラム記憶部210に格納されている選択対象データ144に挿入する。秘密保持プログラム生成部203は、位置記憶部211に「4」を格納する。このとき、位置記憶部211には、値「2」、「4」が格納されている。
【0099】
秘密保持プログラム生成部203は、選択対象データ144に挿入する更新処理命令群164を生成する。ここでは、秘密保持プログラム生成部203は、第2の選択パラメータ用変数の値「1」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「6」を第2の選択パラメータ用変数に格納する。秘密保持プログラム生成部203は、定数値Bとして、第1〜第3の選択パラメータ用変数の値「(定数値B)」、「6」、「1」を式1に代入して得られる値が、これまでに選択された1以上の選択対象データを示さない値となるように、位置記憶部211に格納されている1つ以上の値を用いて、定数値Bとして、「2」を取得する。秘密保持プログラム生成部203は、取得した定数値B(=「2」)を含み、選択パラメータ群の値の更新を行う更新処理命令群164を生成し、生成した更新処理命令群164をプログラム記憶部210に格納されている選択対象データ144に挿入する。
【0100】
秘密保持プログラム生成部203は、選択対象データ144に挿入する分岐命令群174を生成する。ここでは、秘密保持プログラム生成部203は、選択処理命令群120へ分岐する分岐命令群174を生成し、生成した分岐命令群174をプログラム記憶部210に格納されている選択対象データ144に挿入する。これにより、秘密保持プログラムを構成する選択対象データ144が生成されることになる。
【0101】
秘密保持プログラム生成部203は、機能提供命令群3を機能提供命令群生成部201から取得する。秘密保持プログラム生成部203は、選択パラメータ群(「定数値B(=2)」、「6」、「1」)と、式1とを用いて、取得した機能提供命令群3を挿入する選択対象データを決定する。ここでは、3つの初期値(「2」、「6」、「1」)と式1とから値「6」が算出されるので、秘密保持プログラム生成部203は、機能提供命令群3をプログラム記憶部210に格納されている選択対象データ146に挿入する。秘密保持プログラム生成部203は、位置記憶部211に「6」を格納する。このとき、位置記憶部211には、値「2」、「4」、「6」が格納されている。
【0102】
秘密保持プログラム生成部203は、選択対象データ146に挿入する更新処理命令群166を生成する。ここでは、秘密保持プログラム生成部203は、第2の選択パラメータ用変数の値「6」を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値「2」を第2の選択パラメータ用変数に格納する。秘密保持プログラム生成部203は、定数値Cとして、第1〜第3の選択パラメータ用変数の値「(定数値C)」、「2」、「6」を式1に代入して得られる値が、これまでに選択された1以上の選択対象データを示さない値となるように、位置記憶部211に格納されている1つ以上の値を用いて、定数値Cとして、「0」を取得する。秘密保持プログラム生成部203は、取得した定数値C(=「0」)を含み、選択パラメータ群の値の更新を行う更新処理命令群166を生成し、生成した更新処理命令群166をプログラム記憶部210に格納されている選択対象データ146に挿入する。
【0103】
秘密保持プログラム生成部203は、選択対象データ146に挿入する分岐命令群176を生成する。ここでは、秘密保持プログラム生成部203は、呼出元のプログラムへ制御を返す処理を行う分岐命令群176を生成し、生成した分岐命令群176をプログラム記憶部210に格納されている選択対象データ146に挿入する。これにより、秘密保持プログラムを構成する選択対象データ146が生成されることになる。なお、最後の機能提供命令群3(選択対象主要命令群156)自体がreturn文で終わっている場合には、改めてreturn文を追加する必要はない。
【0104】
次に、秘密保持プログラム生成部203は、機能提供命令群、又は偽装機能提供命令群が挿入されていない選択対象データ140を取得する。秘密保持プログラム生成部203は、取得した選択対象データ140に、選択対象データに挿入されていない1以上の偽装機能提供命令群のうち1の偽装機能提供命令群を挿入する。秘密保持プログラム生成部203は、「0」〜「6」のうち定数値として使用されていない値(ここでは、「1」)を含み、選択パラメータ群の値の更新を行う更新処理命令群160を生成し、生成した更新処理命令群160を選択対象データ140に挿入する。
【0105】
秘密保持プログラム生成部203は、選択対象データ140に挿入する分岐命令群170を生成する。ここでは、秘密保持プログラム生成部203は、選択処理命令群120へ分岐する分岐命令群170を生成し、生成した分岐命令群170を選択対象データ140に挿入する。これにより、秘密保持プログラムを構成する選択対象データ140が生成されることになる。
【0106】
選択対象データ141、143、145の生成については、選択対象データ140の生成と同様であるので、ここでの説明は省略する。
ここで、機能提供命令群の挿入時における定数値の取得方法について説明する。なお、選択対象データの個数をm個とする。
秘密保持プログラム生成部203は、「0」から「m−1」までの整数のうちランダムに1の整数「n」を選択し、第1〜第3の選択パラメータ用変数の値をそれぞれ、「n」、「第1の選択パラメータ用変数の値」、「第2の選択パラメータ用変数の値」として、式1に代入して値を算出する。算出した値が位置記憶部211に存在しない場合には、秘密保持プログラム生成部203は、選択した整数「n」を定数値とする。算出した値が位置記憶部211に存在する場合には、秘密保持プログラム生成部203は、「0」から「m−1」までの整数のうちランダムに1の整数「n」を、再度選択し、上記の動作を、式1が位置記憶部211に存在しない値を算出するまで繰り返す。
【0107】
秘密保持プログラム生成部203は、全ての機能提供命令群の挿入が終了すると、複数の偽装機能提供命令群それぞれに、「0」から「m−1」までの整数のうち未使用である整数を割り当てる。
なお、整数「n」は「0」から「m−1」までの整数から選択されたが、これに限定されない。選択する整数は、0以上の整数であればよい。この場合、偽装機能提供命令群の挿入先についても、上記にて示す定数値の算出方法を用いて決定する。
【0108】
(5)秘密保持プログラム100の生成
秘密保持プログラム生成部203は、プログラム記憶部210に格納している前処理命令群110、選択処理命令群120、変遷処理命令群130、及び選択対象データ140、141、・・・、146を図2に示す順番に配置することにより、秘密保持プログラム100を生成する。
【0109】
1.4.5 プログラム難読化装置10の動作
(1)動作概要
ここでは、プログラム難読化装置10の動作概要について、図7にて示す流れ図を用いて説明する。
プログラム難読化装置10の入力部200は、難読化対象プログラムと、秘密保持プログラム100を正常系にて実行する際、秘密保持プログラムに与える3つの初期値(ここでは、「1」、「2」、「3」)を受け付ける(ステップS100)。
【0110】
機能提供命令群生成部201は、入力部200にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群を生成する(ステップS105)。
偽装機能提供命令群生成部202は、難読化対象プログラムが記述されているプログラミング言語で記述された1以上のプログラム命令をランダムに組み合わせた偽装機能提供命令群を複数個生成する(ステップS110)。
【0111】
秘密保持プログラム生成部203は、呼び出し元のプログラムから32ビットの入力値in1、in2、in3を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第1の前処理プログラム命令群と、選択処理命令群に分岐する第2の前処理プログラム命令群とからなり、これらを順に行う前処理命令群を生成する(ステップS115)。
【0112】
秘密保持プログラム生成部203は、選択パラメータ群を用いて、選択識別子を算出する第1の選択処理プログラム命令群と、変遷処理命令群に分岐する第2の選択処理プログラム命令群からなり、これらを順に行う選択処理命令群を生成する(ステップS120)。ここでは、秘密保持プログラム生成部203は、第1の選択処理プログラム命令群として、式1「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数) MOD 7」を算出するプログラム命令群を生成する。
【0113】
秘密保持プログラム生成部203は、選択処理命令群で算出した選択識別子に基づき、複数の選択対象データのうちいずれかの選択対象データに分岐する処理を行う変遷処理命令群を生成する(ステップS125)。具体的には、秘密保持プログラム生成部203は、機能提供命令群生成部201にて生成された複数の機能提供命令群の個数(m個)と、偽装機能提供命令群生成部202にて生成された複数の偽装機能提供命令群の個数(n個)とを取得し、その合計値を算出する。秘密保持プログラム生成部203は、算出した合計値(ここでは、7)と同数のラベル名を生成する。秘密保持プログラム生成部203は、選択処理命令群120に含まれる式1が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群を生成する。
【0114】
秘密保持プログラム生成部203は、3つの初期値と、式1と、生成した複数の機能提供命令群及び複数の偽装機能提供命令群とを用いて、複数の機能提供命令群の個数と、機能提供命令群の個数との合計値と同数の選択対象データを生成する(ステップS130)。
秘密保持プログラム生成部203は、生成した前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データを、順番に配置することにより、秘密保持プログラムを生成する(ステップS135)。
【0115】
(2)選択対象データの生成処理
ここでは、図7のステップS130にて示す選択対象データの生成処理の動作について、図8及び図9にて示す流れ図を用いて説明する。
秘密保持プログラム生成部203は、生成した各ラベル名のみからなる選択対象データを生成する(ステップS200)。
【0116】
秘密保持プログラム生成部203は、カウンタiに1を設定する(ステップS205)。ここで、カウンタiは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。
秘密保持プログラム生成部203は、実行順序i番目の機能提供命令群を機能提供命令群生成部201から取得する。秘密保持プログラム生成部203は、取得した実行順序i番目の機能提供命令群を挿入する選択対象データを、選択パラメータ群及び式1を用いて、決定する。なお、iが1である場合には、秘密保持プログラム生成部203は、3つの初期値からなる選択パラメータ群及び式1を用いて、選択対象データを決定し、iが2以上である場合には、秘密保持プログラム生成部203は、更新された選択パラメータ群及び式1を用いて、選択対象データを決定する。秘密保持プログラム生成部203は、決定した選択対象データに、実行順序i番目の機能提供命令群を挿入する(ステップS210)。
【0117】
秘密保持プログラム生成部203は、第2の選択パラメータ用変数の値を第3の選択パラメータ用変数に格納し、第1の選択パラメータ用変数の値を第2の選択パラメータ用変数に格納する。秘密保持プログラム生成部203は、第1〜第3の選択パラメータ用変数の値「定数値」、「1」、「2」を式1に代入して得られる値が、これまでに選択された1以上の選択対象データを示さない値となるように、定数値を取得する(ステップS215)。
【0118】
秘密保持プログラム生成部203は、取得した定数値を含み、選択パラメータ群の値の更新を行う更新処理命令群を生成し、生成した更新処理命令群を選択対象データに挿入する(ステップS220)。
秘密保持プログラム生成部203は、カウンタiの値が、機能提供命令群の個数mと一致するか否かを判定する(ステップS225)。
【0119】
一致しないと判定する場合(ステップS225における「NO」)、秘密保持プログラム生成部203は、選択処理命令群へ分岐する分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する(ステップS230)。
一致すると判定する場合(ステップS225における「YES」)、秘密保持プログラム生成部203は、呼出元のプログラムへ制御を返す処理を行う分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する(ステップS235)。
【0120】
秘密保持プログラム生成部203は、カウンタiに値「1」を加算する(ステップS240)。
秘密保持プログラム生成部203は、カウンタiが機能提供命令群の個数より大きいか否かを判定する(ステップS243)。
大きくないと判定する場合には(ステップS243における「NO」)、秘密保持プログラム生成部203は、ステップS210に戻り、再度、処理を繰り返す。
【0121】
大きいと判定する場合には(ステップS243における「YES」)、秘密保持プログラム生成部203は、偽装機能提供命令群の個数nの間、ステップS245からステップS275を繰り返す。
秘密保持プログラム生成部203は、機能提供命令群も偽装機能提供命令群も挿入されていない選択対象データ、つまりラベル名のみが含まれる選択対象データを1つ取得する(ステップS250)。
【0122】
秘密保持プログラム生成部203は、選択対象データに挿入されていない偽装機能提供命令群を1つ取得し、取得した偽装機能提供命令群を、ステップS250にて取得した選択対象データに挿入する(ステップS255)。
秘密保持プログラム生成部203は、定数値として使用されていない値を取得し(ステップS260)、取得した定数値を含み、選択パラメータ群の値の更新を行う更新処理命令群を生成し、生成した更新処理命令群を選択対象データに挿入する(ステップS265)。
【0123】
秘密保持プログラム生成部203は、選択処理命令群へ分岐する分岐命令群を生成し、生成した分岐命令群を選択対象データに挿入する(ステップS270)。
秘密保持プログラム生成部203は、偽装機能提供命令群の個数nまでの間、ステップS250からステップS270を繰り返すと、処理を終了する(ステップS275)。
1.5 変形例
なお、本発明を上記第1の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【0124】
(1)上記第1の実施の形態では、選択識別子を算出する算出式として式1を用いたが、これに限定されない。選択識別子を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
また、選択識別子用変数に初期値を設定しておき、選択識別子用変数を用いた式であっても構わない。また、選択処理命令群に、選択処理命令群が呼び出された回数を数えるカウンター用変数を設けておき、カウンター用変数をも用いた式であっても構わない。
【0125】
また、カウンター用変数は、選択処理命令群以外でカウンターの値を上げる処理を行ってもよい。
(2)上記第1の実施の形態において、最後の機能提供命令群3を含む選択対象データ146に、更新処理命令群166を含めなくてもよい。
(3)上記第1の実施の形態において、機能提供命令群の数を3つとしたが、これに限定されない。機能提供命令群の数は、幾つであってもよい。
【0126】
(4)上記第1の実施の形態において、選択パラメータの数を3としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式1は、「p1×(第1の選択パラメータ用変数)+p2×(第2の選択パラメータ用変数)+・・・+pn×(第nの選択パラメータ用変数) MOD NN」となる(nは2以上の整数)。なお、p1、p2、・・・、pnは互いに素である素数であり、NNを選択対象データの数とする。また、選択パラメータの更新時には、第i−1のパラメータに格納されている値を第iのパラメータに格納する。このとき、第nのパラメータ、第n−1のパラメータ、・・・、第2のパラメータの順に格納する。また、第1のパラメータには、実行した選択対象主要命令群が有する定数値を格納する。ここで、iは2以上n以下の整数である。
【0127】
また、入力値の初期値を「1」、「2」、「3」としたがこの値でなくてもよい。
また、入力値等を32ビットの値としたが、32ビットより短いビット数であってもよいし、32ビットより長いビット数であってもよい。
(5)上記第1の実施の形態において、選択対象データ140〜146に分岐命令群170〜175がある構成を、各選択対象データに選択処理命令群と変遷処理命令群を持つ構成としても構わない。
【0128】
(6)上記第1の実施の形態において、選択情報パラメータの初期値は、秘密保持プログラムに与えられた値としている構成を、前処理部等で、秘密保持プログラム外のプログラムやプログラムを実行する機器が有する機能を用いて決定する値としてもよい。
(7)秘密保持プログラムが秘密情報を持つ場合に、秘密情報の値を選択パラメータ用変数、選択識別子用変数を用いて算出する処理に置き換えても構わない。
【0129】
(8)上記第1の実施の形態のプログラム難読化装置10において、選択対象データの数や選択パラメータの数は、必ずしも固定の値である必要はなく、別の値であってもよい。
また、これらの値を、プログラム難読化装置に入力として与えてもよい。
(9)上記第1の実施の形態において、ブロックの分割の分割方法として、ここでは簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。なお、制御構造の解析については、公知であるため説明は省略する。
【0130】
(10)上記第1の実施の形態において、プログラム難読化装置10は、初期値、定数値の決定後、機能提供命令群を挿入する選択対象データを決定したが、これに限定されない。プログラム難読化装置10は、機能提供命令群の配置を決めた後に、初期値、定数値を決めてもよい。
(11)上記第1の実施の形態において、プログラム難読化装置10は、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入した後に、前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データの配置を決定して秘密保持プログラムを生成したが、これに限定されない。
【0131】
プログラム難読化装置10は、前処理命令群、選択処理命令群、変遷処理命令群、及びラベル名のみからなる複数の選択対象データの配置を決定し、その後、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入して秘密保持プログラムを生成してもよい。
(12)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【0132】
1.6 まとめ
上記第1の実施の形態にて示す秘密保持プログラム100は、選択対象主要命令群152、154、156は実際の実行順序とは無関係にバラバラな位置に配置されるため、実行順序の解析が困難である。
また、選択対象主要命令群152、154、156には、他の選択対象主要命令群への直接的な分岐命令が含まれていないので、実行順序の解析が困難である。
【0133】
また、次にどの選択対象データに分岐するかを決定する処理を行う選択処理命令群は、選択パラメータの値によっては、全ての選択対象主要命令群に分岐する可能性があるプログラム命令であるため、実行順序の解析が困難である。さらに、選択対象データ140〜146には正常系の実行時には実行されることのない選択対象データ140、141、143、145が含まれるため、解析がより困難である。
【0134】
更に、本実施の形態では、複数の選択パラメータを用いて、選択対象データ140〜146の実行順序を決定している。よって、もし、不正解析者が実行順序の一部をたまたま知っていたとしても、それ以外の部分の実行順序を知ることが困難になる。このことをより具体的に説明する。例えば、秘密保持プログラムがウォーターマーク検出するアルゴリズムであった場合において、不正解析者が一般的なウォーターマーク処理に詳しく、一般的なウォーターマーク検出アルゴリズムのどのような処理で含まれるかを知っていることが考えられる。このような場合、多数の選択対象データの中から、実行されそうな選択対象データを見つけ出すことが考えられる。このとき、もし、選択処理命令群が1つの選択パラメータに基づいて実行順序を決める処理であれば、不正解析者はその1つだけの選択パラメータの値を知ることができる。これを行うには、実行されそうな選択対象データに分岐するには、変遷処理命令群がどのような選択識別子を使っているかを逆算し、さらに、そのような選択識別子をもたらすには、選択処理命令群がどのような選択パラメータに用いて処理を行ったかを逆算すればよい。以降は、選択パラメータの値の変化、選択処理命令群の処理を追跡することで実行順序を知ることが出来る。
【0135】
しかし、本手法のように複数の選択パラメータを用いるのであれば、たまたま、実行されそうな選択対象データを1つ見つけ出しても、選択識別子から選択パラメータを逆算することはできない。
さらに、不正解析者が、たまたま、連続して実行される選択対象データが分かる場合が考えられる。このような場合に、不正解析者は、選択処理命令群の式1に対する入出力の組をより多く知ることができるようになるので、式1に用いる選択パラメータ用の変数の数を多くすることが、解析を困難にすることになる。
【0136】
更に、本実施例では、選択対象データに選択パラメータを更新する処理がある。よって、不正解析者が秘密保持プログラムと、秘密保持プログラムに与えられる入力値とを知っていたとしても、選択パラメータの値がどのように変わっていくかを、順に解析していかなければ、実際に選択対象が実行される順番を解析することができない。
また、従来、例えば、Switch文を用いて、実行順序を決定する場合、あるブロックの最後に、次の実行すべきブロックを示す値(Switch文にて用いられる値)が直接記述されている。本実施の形態では、3つの値からなる選択パラメータ群を用いて選択処理命令群を実行することにより、次に実行する選択対象データが決定される。このとき、正当な3つの初期値から、まず、1番目に実行される機能提供命令群が決定される。次に、更新処理命令群により更新された選択パラメータ群(1回目の更新選択パラメータ群)から、2番目に実行される機能提供命令群が決定される。n番目に実行される機能提供命令群は、3つの初期値からなる選択パラメータ群、1回目の更新選択パラメータ群、・・・、(n−1)回目の選択パラメータ群を、順次用いて選択処理命令群を実行することにより、決定される。ここで、nは1以上の整数である。より詳細には、更新処理命令群を正当な順序で実行することにより、正当に更新された選択パラメータ群を生成し、生成した選択パラメータ群を用いて択処理命令群を実行することにより、n番目に実行される機能提供命令群が決定される。本実施の形態では、選択パラメータ群を順次更新することにより、Switch文にて用いられる値を取得することができる。つまり、本実施の形態では、Switch文にて用いられる値をプログラム上では隠匿し、選択パラメータ群を順次更新することにより取得している。このように、隠匿したい情報を、いくつかの他の情報から取得することを分割秘密による難読化といい、本実施の形態における更新処理命令群が、分割秘密に相当している。
【0137】
2.第2の実施の形態
以下、本発明に係る第2の実施の形態としての秘密保持プログラム300及びプログラム難読化装置30について、図面を参照して説明する。
2.1 秘密保持システム2の概要
秘密保持システム2は、図10に示すように、プログラム難読化装置30と、プログラム実行装置40とから構成されている。
【0138】
プログラム難読化装置30は、実行順序を秘密にしたい難読化対象プログラムから秘密保持プログラム300を生成し、生成した秘密保持プログラム300をプログラム実行装置40へ配布する。
プログラム実行装置40は、プログラム難読化装置30から配布された秘密保持プログラム300を実行する。
【0139】
ここで、難読化対象プログラムは、命令群A、命令群B、命令群Cの3つの命令群から構成されており、命令群A、B、Cの順に実行することにより正しく動作するものとする。
2.2 秘密保持プログラム300の構造
ここでは、プログラム難読化装置30にて生成され、プログラム実行装置40にて実行される秘密保持プログラム300のプログラム構造について説明する。
【0140】
秘密保持プログラム300は、2以上の秘密情報を用いて処理を行うプログラムである。秘密情報は、不正解析者に対して解析されたくない情報である。例えば、秘密保持プログラム300は、秘密情報である複数のサブ鍵を用いて暗号処理を行うプログラムである。このようなプログラムにおいて複数の秘密情報を隠蔽したいという要求がある。ここでは、命令群A、B、Cのそれぞれが、秘密情報を有しているものとする。
【0141】
秘密保持プログラム300は、前処理命令群310、選択処理命令群320、主要処理命令群340、選択対象データ350〜356からなり、これらが図11に示す順番に配置されている。
秘密保持プログラム300は、呼出元のプログラムから、選択パラメータ群の初期値となる32ビットの入力値in1、in2、in3および秘密情報を用いた処理で使用するパラメータを受け取り、秘密情報を用いた処理を行うプログラム命令群である。秘密保持プログラムの処理では、選択処理命令群320での処理に用いる複数の選択パラメータの各値(ここでは、3つの値)を保持する32ビットの変数である第1〜第3の選択パラメータ用変数、選択識別子を保持する32ビットの変数である選択識別子用変数、また変遷処理命令群390〜392で算出される秘密情報を格納する32ビットの変数である秘密情報用変数を用いる。ここで、選択パラメータは、選択対象データ350、351、・・・、356から1の選択対象データを決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子である。
【0142】
ここでは、秘密保持プログラムが実際に使用される際に呼出元のプログラムから受け取る入力値in1、in2、in3は値「1」、「2」、「3」であるとする。
秘密保持プログラム300は2以上の秘密情報を用いた処理を行うプログラム命令群であり、本実施例では命令群A、B、Cのそれぞれが有する秘密情報を、第1〜第3の秘密情報とし、それぞれの値を「100」、「200」、「300」とする。
【0143】
2.2.1 前処理命令群310
前処理命令群310は、後述の選択処理命令群320で用いる選択パラメータ群の初期値を算出するプログラム命令群である。ここで、選択パラメータ群は、第1、第2及び第3の選択パラメータ用変数からなる。
前処理命令群310の処理は、上記第1の実施の形態にて示す前処理命令群110と同様のほぼ同様の処理であるが、前処理命令群110の最後は、選択処理命令群120分岐するプログラム命令群であるのに対し、前処理命令群310の最後は、主要処理命令群340へ分岐するプログラム命令群である点が異なる。
【0144】
2.2.2 選択処理命令群320
選択処理命令群320は、選択パラメータ群に基づき、選択対象データ350〜356から1つを選択し選択識別子とするプログラム命令群である。
選択処理命令群320の処理は、選択処理命令群120と同様とほぼ同等の処理であるが、選択処理命令群320はサブルーチンである点で異なる。
【0145】
具体的には、選択処理命令群120は、当該命令群の処理の最後で変遷処理命令群へ分岐するプログラム命令を有するのに対し、選択処理命令群320はプログラム関数であり、選択処理命令群320の最後ではこの関数を呼び出した呼出元に分岐する点が異なる。
なお、ここでは、選択処理命令群120と同様に、式1を用いて選択識別子を算出するものとする。
【0146】
2.2.3 選択対象データ350〜356
選択対象データ350〜356は、更新処理命令群にて読み出されるデータである。
具体的には、選択対象データ350〜356は、例えば、配列データであって、C言語の場合は、以下のような配列である。

variable_140[7]={1、2、3、4、5、6、7};

この配列は、後述の変遷処理命令群390〜392にて用いられる配列であり、この配列と前処理命令群310で選択パラメータに設定する初期値に依存して変遷処理命令群390〜392がどのようなプログラム命令群になるかが決まる。
【0147】
2.2.4 主要処理命令群340
主要処理命令群340は、秘密情報を用いて処理を行うプログラム命令群である。
主要処理命令群340は、機能提供命令群360〜362、選択処理命令群呼出命令370〜372、更新処理命令群380〜382、及び変遷処理命令群390〜392からなるプログラム命令群であり、各命令群は、図11に示す位置に配置されている。
【0148】
(1)機能提供命令群360〜362
機能提供命令群360は、秘密情報を用いた処理を行うプログラム命令群である。秘密情報の値を用いるプログラム命令は、秘密情報用変数を用いた処理として記述されている。つまり、秘密情報が予め秘密情報用変数に変換されている。もし、秘密情報用変数の値が第1の秘密情報の値「100」であれば、機能提供命令群360は、本来の処理を行うプログラム命令群である。
【0149】
機能提供命令群361も同様なプログラム命令群であり、秘密情報用変数に格納された値が秘密情報2の値が「200」であれば、機能提供命令群361は、本来の処理を行うプログラム命令群である。
機能提供命令群362も同様なプログラム命令群であり、秘密情報用変数に格納された値が秘密情報3の値が「300」であれば、機能提供命令群362は、本来の処理を行うプログラム命令群である。
【0150】
なお、各機能提供命令群に含まれる秘密情報は、予め秘密情報用変数に変換されている。
(2)選択処理命令群呼出命令370〜372
選択処理命令群呼出命令370〜372は、選択処理命令群320を呼び出すプログラム命令群である。
【0151】
(3)更新処理命令群380〜382
更新処理命令群380は、選択識別子に対応する選択対象データの値を読み出す処理を行って、読み出した値を用いて選択パラメータ群の値を更新する処理を行うプログラム命令群である。
具体的には、更新処理命令群380は、まず、選択識別子用変数の値が、0、1、・・・、6の場合にそれぞれ、選択対象データ350、351、・・・、356に格納されている値を読み出す。
【0152】
次に、更新処理命令群380は、読み出した値に基づき、選択パラメータ群の更新を行う。ここでは、更新処理命令群380は、第2の選択パラメータの値を第3の選択パラメータに格納し、第1の選択パラメータの値を第2の選択パラメータに格納し、第1の選択パラメータに読み出した値を格納する。
例えば、C言語のプログラム命令で、更新処理を記載すると

(第3の選択パラメータ変数) =(第2の選択パラメータ変数);
(第2の選択パラメータ変数)=(第1の選択パラメータ変数);
(第1の選択パラメータ変数)= variable_140[(選択識別子用変数)];」
で表されるプログラム命令群になる。
【0153】
なお、更新処理命令群381〜382は、更新処理命令群380と同様の構成であるので、ここでの説明は省略する。
(4)変遷処理命令群390〜392
変遷処理命令群390〜392は、選択パラメータ変数の値に基づいて秘密情報用変数の値を決定する処理である。
【0154】
具体的には、変遷処理命令群390〜392は、選択パラメータ変数に格納する値(秘密情報)を算出し、算出した値を秘密情報用変数に格納するプログラム命令群である。
以下に、変遷処理命令群390〜392の動作の詳細について説明する。
(4−1)変遷処理命令群390
変遷処理命令群390は、第1〜第3選択パラメータ用変数を用いた演算を行い、第1の秘密情報の値を算出し、算出した値を秘密情報用変数に格納する処理を行うプログラム命令である。
【0155】
例えば、変遷処理命令群390は、P4、P5、P6を互いに素な素数とし、「P4×(第1の選択パラメータ用変数)+P5×(第2の選択パラメータ用変数)+P6×(第3の選択パラメータ用変数)+(定数1)」を算出し、算出した値を秘密情報用変数に格納する処理を行うプログラム命令群である。なお演算子「×」は掛け算を表す。ここでは、P4、P5、P6をそれぞれ値「2」、「3」、「5」、とした場合、式2「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数1)」を算出し、算出した値を秘密情報用変数に格納する処理である。
【0156】
以下、定数1について説明する。
秘密保持プログラム300では、変遷処理命令群390が実行されるまでには、前処理命令群310、選択処理命令群呼出命令370、選択処理命令群320、更新処理命令群380が、この順序で実行されている。なお、前処理命令群310、選択処理命令群呼出命令370、選択処理命令群320、及び更新処理命令群380を実行する際には、呼出元のプログラムから受け取る入力値in1、in2、in3の値をそれぞれ値「1」、「2」、「3」として実行する。その他の呼出元のプログラムから受ける入力値は任意の値であってよい。
【0157】
このとき、選択処理命令群320は、式1「2×(第1の選択パラメータ用変数(=1))+3×(第2の選択パラメータ用変数(=2))+5×(第3の選択パラメータ用変数(=3)) MOD 7」により選択識別子の値は「2」となり、更新処理命令群380が選択対象データ350〜356から取得する値は「3」となり、第1〜第3の選択パラメータ変数の更新後の値は、「3」、「1」、「2」となる。
【0158】
定数1は、このようにして得られた第1〜第3の選択パラメータ変数の値を式2に代入して得られる秘密情報用変数の値が、第1の秘密情報の値「100」になるように、予め設定された値であり、ここでは、81となる。
(4−2)変遷処理命令群391
同様に、変遷処理命令群392は、「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数2)」からなる命令群である。
【0159】
以下、定数2の値について説明する。
秘密保持プログラム300では、変遷処理命令群391が実行されるまでには、前処理命令群310、選択処理命令群呼出命令370、選択処理命令群320、更新処理命令群380、変遷処理命令群390、機能提供命令群360、選択処理命令群呼出命令371、選択処理命令群320、更新処理命令群381が、この順序で実行されている。
【0160】
このとき、更新処理命令群381にて取得される第1〜第3の選択パラメータ変数の値は、「6」、「3」、「1」となる。上記と同様の方法にて定数2を算出すると、値「174」となる。
(4−3)変遷処理命令群392
同様に、変遷処理命令群392は、「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数3)」からなる命令群である。
【0161】
秘密保持プログラム300では、変遷処理命令群392が実行されるまでには、前処理命令群310、選択処理命令群呼出命令370、選択処理命令群320、更新処理命令群380、変遷処理命令群390、機能提供命令群360、選択処理命令群呼出命令371、選択処理命令群320、更新処理命令群381、変遷処理命令群391、機能提供命令群361、選択処理命令群呼出命令372、選択処理命令群320、及び更新処理命令群382、が、この順序で実行されている。
【0162】
このとき、更新処理命令群382にて取得される第1〜第3の選択パラメータ変数の値は、「6」、「6」、「3」となる。上記と同様の方法にて定数3を算出すると、値「255」となる。
2.3 秘密保持プログラム300の実行
プログラム実行装置40が、秘密保持プログラム300を正常系で実行した場合の処理について、図12に示す流れ図を用いて説明する。
【0163】
秘密保持プログラム300は、前処理命令群310の処理を行う(ステップS300)。具体的には、前処理命令群310は、入力値in1、in2、in3として、それぞれ値「1」、「2」、「3」を受け取り、第1〜3の選択パラメータ用変数にそれぞれ値「1」、「2」、「3」を格納する処理を行い、選択処理命令群呼出命令370へ分岐する。
【0164】
次に、秘密保持プログラム300は、選択処理命令群呼出命令370の処理を行う(ステップS305)。具体的には、選択処理命令群呼出命令370は、選択処理命令群320の呼出を行う。
次に、秘密保持プログラム300は、受け取った入力値「1」、「2」、「3」を用いて、選択処理命令群320の処理を行う(ステップS310)。具体的には、選択処理命令群320は、式1「2×(第1の選択パラメータ用変数(=1))+3×(第2の選択パラメータ用変数(=2))+5×(第3の選択パラメータ用変数(=3)) MOD 7」により値「2」を算出し、算出した値「2」を選択識別子用変数に格納する。
【0165】
秘密保持プログラム300は、更新処理命令群380の処理を行う(ステップS315)。具体的には、更新処理命令群380は、選択識別子用変数の値「2」により、選択対象データ352の値「3」を読み出す。更新処理命令群380は、第2の選択パラメータの値「2」を第3の選択パラメータに格納し、第1の選択パラメータの値「1」を第2の選択パラメータに格納し、第1の選択パラメータに読み出した値「3」を格納する。
【0166】
秘密保持プログラム300は、更新処理命令群380にて生成した選択パラメータ群(第1〜第3の選択パラメータ)を用いて変遷処理命令群390の処理を行う(ステップS320)。具体的には、変遷処理命令群390は、式2「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数1)」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「100」が格納される。
【0167】
秘密保持プログラム300は、秘密情報変数に格納された値に基づいて、機能提供命令群360の処理を行う(ステップS325)。具体的には、機能提供命令群360は、難読化対象プログラムにおける命令群Aを実行する。
次に、秘密保持プログラム300は、選択処理命令群呼出命令371の処理を行う(ステップS330)。具体的には、選択処理命令群呼出命令371は、選択処理命令群320の呼出を行う。
【0168】
次に、秘密保持プログラム300は、第1〜第3の選択パラメータの値「3」、「1」、「2」を用いて、選択処理命令群320の処理を行う(ステップS335)。具体的には、選択処理命令群320は、式1「2×(第1の選択パラメータ用変数(=3))+3×(第2の選択パラメータ用変数(=1))+5×(第3の選択パラメータ用変数(=2)) MOD 7」により値「5」を算出し、算出した値「5」を選択識別子用変数に格納する。
【0169】
秘密保持プログラム300は、更新処理命令群381の処理を行う(ステップS340)。具体的には、更新処理命令群381は、選択識別子用変数の値「5」により、選択対象データ355の値「6」を読み出す。更新処理命令群381は、第2の選択パラメータの値「1」を第3の選択パラメータに格納し、第1の選択パラメータの値「3」を第2の選択パラメータに格納し、第1の選択パラメータに読み出した値「6」を格納する。
【0170】
秘密保持プログラム300は、更新処理命令群381にて生成した選択パラメータ群(第1〜第3の選択パラメータ)を用いて変遷処理命令群391の処理を行う(ステップS345)。具体的には、変遷処理命令群391は、式2「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数2)」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「200」が格納される。
【0171】
秘密保持プログラム300は、秘密情報変数に格納された値に基づいて、機能提供命令群361の処理を行う(ステップS350)。具体的には、機能提供命令群361は、難読化対象プログラムにおける命令群Bを実行する。
次に、秘密保持プログラム300は、選択処理命令群呼出命令372の処理を行う(ステップS355)。具体的には、選択処理命令群呼出命令372は、選択処理命令群320の呼出を行う。
【0172】
次に、秘密保持プログラム300は、第1〜第3の選択パラメータの値「6」、「3」、「1」を用いて、選択処理命令群320の処理を行う(ステップS360)。具体的には、選択処理命令群320は、式1「2×(第1の選択パラメータ用変数(=6))+3×(第2の選択パラメータ用変数(=3))+5×(第3の選択パラメータ用変数(=1)) MOD 7」により値「5」を算出し、算出した値「5」を選択識別子用変数に格納する。
【0173】
秘密保持プログラム300は、更新処理命令群382の処理を行う(ステップS365)。具体的には、更新処理命令群382は、選択識別子用変数の値「5」により、選択対象データ355の値「6」を読み出す。更新処理命令群382は、第2の選択パラメータの値「3」を第3の選択パラメータに格納し、第1の選択パラメータの値「6」を第2の選択パラメータに格納し、第1の選択パラメータに読み出した値「6」を格納する。
【0174】
秘密保持プログラム300は、更新処理命令群382にて生成した選択パラメータ群(第1〜第3の選択パラメータ)を用いて変遷処理命令群392の処理を行う(ステップS370)。具体的には、変遷処理命令群392は、式2「2×(第1の選択パラメータ用変数)+3×(第2の選択パラメータ用変数)+5×(第3の選択パラメータ用変数)+(定数3)」を用いて、秘密情報用変数に格納する値を算出し、算出した値を秘密情報変数に格納する。なお、ここでは、秘密情報変数には「300」が格納される。
【0175】
秘密保持プログラム300は、秘密情報変数に格納された値に基づいて、機能提供命令群362の処理を行う(ステップS375)。具体的には、機能提供命令群362は、難読化対象プログラムにおける命令群Cを実行する。
2.4 プログラム難読化装置30
ここでは、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム300を生成するプログラム難読化装置30について述べる。秘密保持プログラム300において、機能提供命令群360〜362、変遷処理命令群390〜392以外の各部は、どのような難読化対象プログラムに対しても共通して用いることができる。ここでは、機能提供命令群、変更処理命令群の生成について中心に述べる。
【0176】
プログラム難読化装置30は、図13に示すように、入力部400と、機能提供命令群生成部401と、変遷処理命令群生成部402と、秘密保持プログラム生成部403とから構成されている。
プログラム難読化装置30は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置30は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0177】
2.4.1 入力部400
難読化対象のプログラムと、秘密保持プログラム300を正常系にて実行する際、秘密保持プログラム300に与える3つの初期値(ここでは、「1」、「2」、「3」)と、秘密情報の位置を示す位置情報(ここでは、3個の秘密情報「100」、「200」、「300」が出現する位置を示す情報)とを受け付ける。
【0178】
2.4.2 機能提供命令群生成部401
機能提供命令群生成部401は、入力部400にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割し機能提供命令群を生成する。なお、難読化対象プログラムに無条件飛び越し、条件飛び越しが含まれる場合には、飛び越しを行うプログラム命令と飛び越し先のプログラム命令は同じブロックに含まれるように分割を行う。また、秘密情報の値を用いた処理を行うプログラム命令は、それぞれ異なるブロックに含まれるようにブロックを構成する。
【0179】
ここでは、難読化対象プログラムが3つの秘密情報の値を用いた処理であるとし、分割した各部に含まれる命令数が出来るだけ均等になるように3つのブロックに分割し、3つの機能提供命令群を生成する。生成した機能提供命令群は、元となったプログラム命令群が難読化対象プログラムにおいて始まりの方にあった順に機能提供命令群1〜3とする。
2.4.3 変遷処理命令群生成部402
変遷処理命令群生成部402は、定数が未決定である式2を含む変遷処理命令群を、機能提供命令群生成部401にて生成した機能提供命令群の個数分生成する。
【0180】
ここでは、変遷処理命令群生成部402は、定数が未決定である式2を含む変遷処理命令群を3個生成する。
2.4.4 秘密保持プログラム生成部403
秘密保持プログラム生成部403は、複数の機能提供命令群、及び機能提供命令群と同数の変遷処理命令群を用いて、前処理命令群310、選択処理命令群320、選択処理命令群呼出命令370〜372、更新処理命令群380〜382、及び選択対象データ350〜351を生成することにより秘密保持プログラム300を生成する。
【0181】
秘密保持プログラム生成部403は、図13に示すように、プログラム記憶部410を有している。
プログラム記憶部410は、生成された各命令群及び選択対象データを記憶する領域を有している。
秘密保持プログラム生成部403は、機能提供命令群生成部401にて生成された複数の機能提供命令群を取得し、取得した複数の機能提供命令群をプログラム記憶部410に格納する。
【0182】
秘密保持プログラム生成部403は、変遷処理命令群生成部402にて生成された、機能提供命令群の個数と同数の変遷処理命令群を取得し、取得した複数の変遷処理命令群をプログラム記憶部410に格納する。
(1)前処理命令群310の生成
秘密保持プログラム生成部403は、呼び出し元のプログラムから32ビットの入力値in1、in2、in3を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータ用変数に格納する第1の前処理プログラム命令群と、選択処理命令群呼出命令に分岐する第2の前処理プログラム命令群とからなり、これらを順に行う前処理命令群310を生成する。
【0183】
秘密保持プログラム生成部403は、生成した前処理命令群310をプログラム記憶部410へ格納する。
(2)選択処理命令群320の生成
秘密保持プログラム生成部403は、選択パラメータ群に基づき、選択対象データ350〜356から1つを選択し選択識別子とする選択処理命令群320を生成する。
【0184】
なお、選択処理命令群320の処理は、選択処理命令群120と同様とほぼ同等の処理であるが、選択処理命令群320はサブルーチンである点で異なる。具体的には、選択処理命令群120は、当該命令群の処理の最後で変遷処理命令群へ分岐するプログラム命令を有するのに対し、選択処理命令群320はプログラム関数であり、選択処理命令群320の最後ではこの関数を呼び出した呼出元に分岐する点が異なる。ここでは、選択処理命令群120と同様に、式1を用いて選択識別子を算出するものとする。
【0185】
秘密保持プログラム生成部403は、生成した選択処理命令群320をプログラム記憶部410へ格納する。
(3)選択処理命令群呼出命令370〜372の生成
秘密保持プログラム生成部403は、選択処理命令群320を呼び出す選択処理命令群呼出命令370〜372を生成する。
【0186】
秘密保持プログラム生成部403は、生成した選択処理命令群呼出命令370〜372をプログラム記憶部410へ格納する。
(4)更新処理命令群380〜382の生成
秘密保持プログラム生成部403は、選択識別子に対応する選択対象データの値を読み出す処理を行って、読み出した値を用いて選択パラメータ群の値を更新する処理を行う更新処理命令群380〜382を生成する。
【0187】
秘密保持プログラム生成部403は、生成した更新処理命令群380〜382をプログラム記憶部410へ格納する。
(5)選択対象データ350〜356の生成
秘密保持プログラム生成部403は、更新処理命令群380〜382にて読み出されるデータである選択対象データ350〜356を生成する。秘密保持プログラム生成部403は、生成した選択対象データ350〜356をプログラム記憶部410へ格納する。
【0188】
具体的には、選択対象データ350〜356は、例えば、配列データであって、C言語の場合は、以下のような配列である。

variable_140[7]={1、2、3、4、5、6、7};

秘密保持プログラム生成部403による上記動作により、本発明における選択対象データをデータとして扱うことができる。
【0189】
(6)秘密保持プログラム300の生成
秘密保持プログラム生成部403は、プログラム記憶部410にて記憶されている前処理命令群310、選択処理命令群320、機能提供命令群360〜362、選択処理命令群呼出命令370〜372、更新処理命令群380〜382、変遷処理命令群390〜392及び選択対象データ350〜356を、図11に示す順番に配置することにより、変遷処理命令群390〜392に含まれる各定数が未決定である秘密保持プログラム300aを生成する。
【0190】
次に、秘密保持プログラム生成部403は、入力部400にて受け取った初期値(「1」、「2」、「3」)を用いて、生成した秘密保持プログラム300aを、更新処理命令群380による処理まで実行する。その後、秘密保持プログラム生成部403は、変遷処理命令群390の実行時に、入力部400にて受け取った秘密情報「100」を用いて、定数1を決定し、決定した定数1を、変遷処理命令群390に含まれる式2へ代入する。
【0191】
秘密保持プログラム生成部403は、次に、更新処理命令群381による処理まで実行する。その後、秘密保持プログラム生成部403は、変遷処理命令群391の実行時に、入力部400にて受け取った秘密情報「200」を用いて、定数2を決定し、決定した定数2を、変遷処理命令群391に含まれる式2へ代入する。
秘密保持プログラム生成部403は、次に、更新処理命令群382による処理まで実行する。その後、秘密保持プログラム生成部403は、変遷処理命令群392の実行時に、入力部400にて受け取った秘密情報「300」を用いて、定数3を決定し、決定した定数3を、変遷処理命令群392に含まれる式2へ代入する。
【0192】
これにより、秘密保持プログラム生成部403は、変遷処理命令群390〜392に含まれる各定数が決定された秘密保持プログラム300を生成することができる。
秘密保持プログラム生成部403は、選択処理命令群呼出命令370〜372、更新処理命令群380〜382、変遷処理命令群390〜392を配置し、各定数を決定し、対応する変遷処理命令群の式2へ代入することにより、各命令群を適切な配置位置へ挿入することができる。
【0193】
秘密保持プログラム生成部403は、入力部400にて受け取った位置情報に基づいて、秘密情報を秘密情報用変数へと変換する。これにより、生成する秘密保持プログラムを、秘匿すべき秘密情報を予め変換した秘密変数を用いる処理とすることができる。
2.4.5 プログラム難読化装置30の動作
ここでは、プログラム難読化装置30の動作について、図14にて示す流れ図を用いて説明する。
【0194】
プログラム難読化装置30の入力部400は、難読化対象プログラムと、秘密保持プログラム300を正常系にて実行する際、秘密保持プログラムに与える3つの初期値(ここでは、「1」、「2」、「3」)と、秘密情報の位置を示す位置情報(ここでは、3個の秘密情報「100」、「200」、「300」の位置を示す情報)とを受け付ける(ステップS400)。
【0195】
機能提供命令群生成部401は、入力部400にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割して複数の機能提供命令群(ここでは、機能提供命令群360〜362)を生成する(ステップS405)。
変遷処理命令群生成部402は、定数が未決定である式2を含む変遷処理命令群を、ステップS405にて生成した機能提供命令群の個数分生成する(ステップS410)。ここでは、変遷処理命令群生成部402は、定数が未決定である式2を含む変遷処理命令群390〜392を生成する。
【0196】
秘密保持プログラム生成部403は、前処理命令群310を生成する(ステップS415)。
秘密保持プログラム生成部403は、選択処理命令群320を生成する(ステップS420)。
秘密保持プログラム生成部403は、生成した機能提供命令群の数と同数の選択処理命令群呼出命令370〜372を生成する(ステップS425)。
【0197】
秘密保持プログラム生成部403は、生成した機能提供命令群の数と同数の更新処理命令群380〜382を生成する(ステップS430)。
秘密保持プログラム生成部403は、選択対象データ350〜356を生成する(ステップS435)。
秘密保持プログラム生成部403は、生成した前処理命令群310、選択処理命令群320、機能提供命令群360〜362、選択処理命令群呼出命令370〜372、更新処理命令群380〜382、変遷処理命令群390〜392及び選択対象データ350〜356の配置を決定し、秘密保持プログラム300aを生成する(ステップS440)。
【0198】
秘密保持プログラム生成部403は、ステップS400にて受け取った3つの初期値、及び3つの秘密情報と、秘密保持プログラム300aとを用いて、未決定である各定数を決定、及び各秘密情報を秘密情報用変数へと変換し、秘密保持プログラム300を生成する(ステップS445)。
2.5 変形例
なお、本発明を上記第2の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【0199】
(1)上記第2の実施の形態では、秘密情報を算出する算出式として式2を用いたが、これに限定されない。秘密情報を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
(2)上記第2の実施の形態では、第1の実施の形態と同様に、選択識別子を算出する算出式として式1を用いたが、これに限定されない。選択識別子を算出する算出式は、選択パラメータ用変数を用いる他の式であっても構わない。
【0200】
また、選択識別子用変数に初期値を設定しておき、選択識別子用変数を用いた式であっても構わない。また、選択処理命令群に、選択処理命令群が呼び出された回数を数えるカウンター用変数を設けておき、カウンター用変数をも用いた式であっても構わない。
また、カウンター用変数は、選択処理命令群以外でカウンターの値を上げる処理を行ってもよい。
【0201】
(3)上記第2の実施の形態において、機能提供命令群の数を3つとしたが、これに限定されない。機能提供命令群の数は、幾つであってもよい。
(4)上記第2の実施の形態において、選択パラメータの数を3としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式2は、「p1×(第1の選択パラメータ用変数)+p2×(第2の選択パラメータ用変数)+・・・+pn×(第nの選択パラメータ用変数)+定数値」となる(nは2以上の整数)。なお、p1、p2、・・・、pnは互いに素である素数である。また、選択パラメータの更新時には、第i−1のパラメータに格納されている値を第iのパラメータに格納する。このとき、第nのパラメータ、第n−1のパラメータ、・・・、第2のパラメータの順に格納する。また、第1のパラメータには、選択識別子に対応する選択対象データから読み出した値を格納する。ここで、iは2以上n以下の整数である。
【0202】
また、入力値の初期値を「1」、「2」、「3」としたがこの値でなくてもよい。
また、入力値等を32ビットの値としたが、32ビットより短いビット数であってもよいし、32ビットより長いビット数であってもよい。
(5)上記第2の実施の形態において、選択情報パラメータの初期値は、秘密保持プログラムに与えられた値としている構成を、前処理部等で、秘密保持プログラム外のプログラムやプログラムを実行する機器が有する機能を用いて決定する値としてもよい。
【0203】
(6)秘密保持プログラムが秘密情報を持つ場合に、秘密情報の値を選択パラメータ用変数、選択識別子用変数を用いて算出する処理に置き換えても構わない。
(7)上記第2の実施の形態のプログラム難読化装置30において、選択対象データの数や選択パラメータの数は、必ずしも固定の値である必要はなく、別の値であってもよい。
【0204】
また、これらの値を、プログラム難読化装置に入力として与えてもよい。
(8)上記第2の実施の形態において、ブロックの分割の分割方法として、ここでは簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。なお、制御構造の解析については、コンパイラの分野で公知であるため説明は省略する。
【0205】
(9)上記第2実施の形態において、プログラム難読化装置30は、式2における各定数を決定した後に、秘密情報を秘密情報用変数に変換したが、これに限定されない。プログラム難読化装置30は、複数の機能提供命令群の生成時に、秘密情報を秘密情報用変数に変換してもよい。つまり、プログラム難読化装置30は、式2における各定数を決定する前に、秘密情報を秘密情報用変数に変換してもよい。この場合、プログラム難読化装置30は、各秘密情報を、一時的に記憶し、式2における各定数を決定する際には、一時的に記憶している秘密情報を用いる。
【0206】
(10)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
2.6 まとめ
上記第2の実施の形態では、選択対象の実行順序が、選択パラメータの初期値によって決定するので、プログラムのみを見て選択パラメータの初期値を知らない不正解析者に対し、選択対象データの実行順序の解析を困難にすることが出来る。
【0207】
更に、第2の実施の形態では、更新処理命令群に選択パラメータを更新する処理がある。よって、不正解析者が秘密保持プログラムと、秘密保持プログラムに与えられる入力値とを知っていたとしても、選択パラメータの値がどのように変わっていくかを、順に解析していかなければ、実際に選択対象が実行される順番を解析することができない。
3.第3の実施の形態
以下、本発明に係る第3の実施の形態としての秘密保持プログラム500、プログラム難読化装置50及び秘密処理装置60について、図面を参照して説明する。
【0208】
非特許文献2及び第1の実施の形態の難読化手法では、正しい手順においては、各ブロックが1度ずつしか実行されない。このことを不正解析者が知っていた場合、効率的な解析を行うことが可能となる。
例えば、第1の実施の形態において、プログラムの正しい初期値の組み合わせを知らない不正解析者が、初期値の組み合わせを「0」、「0」、「0」と仮定した場合、秘密保持プログラム100は、まず、式1を実行すると選択識別子「0」を取得し、選択対象データ143へ分岐する。そして、更新処理命令群163を実行することにより、各選択パラメータの値はそれぞれ、「1」、「0」、「0」となる。秘密保持プログラム100は、さらに、更新された値「1」、「0」、「0」を用いて、式1を実行すると選択識別子「2」を取得し、選択対象データ142へ分岐する。そして、更新処理命令群162を実行することにより、各選択パラメータの値はそれぞれ、「6」、「1」、「0」となる。秘密保持プログラム100は、さらに、更新された値「6」、「1」、「0」を用いて、式1を実行すると選択識別子「1」を取得し、各選択パラメータは、「3」、「6」、「1」に更新される。秘密保持プログラム100は、値「3」、「6」、「1」を用いて、式1を実行すると選択識別子「1」を取得することになる。これは、選択対象データ141が2回実行されることになる。
【0209】
もし、不正解析者が同じブロックが重複して実行されることがないことを知っていたならば、この時点で選択対象データ141が重複して実行される初期値の組み合わせを「0」、「0」、「0」と仮定する実行手順は間違いであったことを知ることができる。この場合、その後のプログラムの解析を続けてウォーターマーク除去ツールを作成するまでもなく、この仮定が間違っていたことが分かり、効率的な解析を行うことが出来る。すなわち、上記全数攻撃にかかる時間を短くすることができる。
【0210】
そこで、本実施の形態では、どのような初期値の組み合わせを用いても、同じブロックが重複して実行されることない秘密保持システム3を提供する。
3.1 秘密保持システム3の概要
秘密保持システム3は、図15に示すように、プログラム難読化装置50と、秘密処理装置60とから構成されている。
【0211】
プログラム難読化装置50は、実行順序を隠蔽したい難読化対象プログラムから秘密保持プログラム500を生成し、生成した秘密保持プログラム500を秘密処理装置60へ配布する。
秘密処理装置60は、プログラム難読化装置50から配布された秘密保持プログラム500を実行する。
【0212】
3.2 秘密保持プログラム500の構造
秘密保持プログラム500の構造について説明する。秘密保持プログラム500は、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されないように、難読化されたプログラムである。
秘密保持プログラム500は、図16に示すように、前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530、選択対象データ540、541、・・・、546からなり、これらが図16に示す順番に配置されている。
【0213】
また、選択対象データ540〜546はそれぞれ、選択対象主要命令群550〜556、更新処理命令群560〜566、分岐命令群570〜576からなり、これらは図16に示す順番に配置されている。各命令部は、1以上のプログラム命令からなるプログラム命令群である。選択対象主要命令群550〜556は、このプログラムが提供する機能(例えばウォーターマーク検出の機能)の処理の一部を示すプログラム命令群であるか、あるいは、提供する機能とは無関係で正常系の実行時には実行されない命令群である。ここで、正常系とは、デバッガ等を用いてプログラムカウンタや選択パラメータを強制的に変更するなどの特別な操作を行わずに秘密保持プログラム500を実行する場合のことをいう。
【0214】
難読対象プログラムは、例えば、図17に示すコントロールフローのプログラムを実行するプログラムである。ここで、図17における第1機能提供命令群601、第2機能提供命令群602、第3機能提供命令群603は、プログラム命令の集合であり、図17に示すフローで実行された場合に適切な結果を出力する命令群である。しかしながら、これをそのままの順番で実行すると解析が容易となるため、秘密保持プログラム500においてはこの実行順序を解析されにくくする難読化が施されている。すなわち、秘密保持プログラム500は複数の選択対象データ540〜546のいずれかに第1機能提供命令群601、第2機能提供命令群602、第3機能提供命令群603が含まれるように難読化されている。
【0215】
ここでは、選択対象データ545、546、543に、それぞれ第1機能提供命令群601、第2機能提供命令群602、第3機能提供命令群603が含まれているものとし、正常系の実行時には、選択対象データ545、546、543が順に選択されて実行されるものとして説明を続ける。また、第1〜第3機能提供命令群が割り当てられていない選択対象データ540、541、542、544は、正常系では実行されることのない選択対象データである。これらは、正しい実行順序を知らない不正解析者が全数攻撃により解析を行う際には実行される場合がある選択対象データであり、不正解析者が第1〜第3の機能提供命令群を得にくくするために組み込まれている。以下では、このような命令群を偽装機能提供命令群と呼ぶ。
【0216】
ここで、秘密保持プログラム500のコントロールフローの一例を、図18に示す。秘密保持プログラム500は、このコントロールフローにて示すように、まず、前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530を順次実行し、その後、変遷処理命令群530に基づいて、選択対象データ540〜546の何れかが実行される。秘密保持プログラム500は、この処理を、選択対象データ543が実行されるまで、繰り返す。秘密保持プログラム500は、変遷処理命令群130が何らかの分岐を行うことは分かっても、選択対象データが実行される順番は分からないような構造になっている。
【0217】
ここで、秘密保持プログラム500の具体例としてC言語にて記述した秘密保持プログラム500aを、図19に示す。
プログラム命令群510aは前処理命令群510に対応し、プログラム命令群520aは選択処理命令群520に対応し、プログラム命令群525aは管理情報更新命令群525に対応し、プログラム命令群530aは変遷処理命令群530に対応している。また、プログラム命令群540a、543a、545a、546aのそれぞれは、選択対象データ540、543、545、546と対応している。
【0218】
プログラム命令群550a、553a、555a、556aのそれぞれは、選択対象主要命令群550、553、555、556と対応している。プログラム命令群560a、563a、565a、566aのそれぞれは、更新処理命令群560、563、565、566と対応している。また、プログラム命令群570a、573a、575a、576aのそれぞれは、分岐命令群570、573、574、576と対応している。なお、選択対象データ541、542、544に対応する具体例は、図面の都合上記述していない。
【0219】
また、図20において、図19に示すプログラムの処理の流れを具体的に示す。
秘密保持プログラム500は、呼出元のプログラムから、入力値in_1、in_2および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の前処理を行うプログラム命令群である。ここで、入力値in_1およびin_2は、選択処理命令群520での処理に用いる選択パラメータCP_1およびCP_2の初期値であるものとする。本実施の形態においては、選択対象データの数が7つであるため、in_1およびin_2は、7未満の非負整数であるものとして説明する。
【0220】
ここで、秘密保持プログラム500は、選択パラメータCP_1、CP_2を示す変数として「cp_1」、「cp_2」を、選択識別子swVarを示す変数として「sv」を用いているものとする。なお、選択パラメータは、選択対象データ540、541、・・・、546から1の選択対象を決定する際に、使用されるパラメータであり、選択識別子は、選択対象データを一意に識別する識別子であり、次に実行すべき選択対象データを特定する情報である。
【0221】
以下、図18の各ブロックと、図20の各ブロックとの対応関係を説明する。
図20おいては、図18の前処理命令群510は、ブロック650に記載の「cp_1=1;cp_2=2;tb[7]=0;」に相当する。選択処理命令群520は、ブロック651に記載の「label A:sv=(cp_1+cp_2*2)%7;while(tb[sv]==1){sv=(++sv)%7;}」に相当する。また、管理情報更新命令群525は、ブロック652に記載の「tb[sv]=1;」に相当し、変遷処理命令群530は、ブロック653に記載の「switch(sv)」に相当し、選択対象データ540〜546は選択対象データ660〜666に相当している。
【0222】
また、図16に示す更新処理命令群560〜566は、選択対象データ660〜666に含まれるそれぞれの「cp_1=cp2;cp2_sv;」に相当する。また、第1〜第3機能提供命令群のそれぞれは、「a=b=2;」、「a*b;」、[a−−;]に相当し、それぞれは選択対象データ665、666、663に含まれている。したがって、偽装機能提供命令群は、選択対象データ660、661、662、664に含まれる「a=1、a=2;」「a*=b;b+=a;」「b−−;」「a=b/a」である。
【0223】
また、分岐命令群570〜572及び574〜586は、「goto label A;」に相当し、分岐命令群573は、「return;」に相当する。
それぞれの命令群の具体的な動作については以下で詳しく説明する。
3.2.1 前処理命令群510
前処理命令群510は、選択処理命令群520で用いる選択パラメータ群の初期値を算出するプログラム命令群である。
【0224】
前処理命令群510は、秘密保持プログラム500が起動された際に、最初に実行されるプログラム命令群である。
前処理命令群510は、具体的には、呼び出し元のプログラムから入力値in_1、in_2を受け取り、受け取った値を選択パラメータ群の初期値として選択パラメータCP_1〜CP_2に格納する命令群と、選択対象データの個数と同数の管理情報の初期化命令とからなるプログラム命令群である。ここで、管理情報のそれぞれは、選択対象データと対応しており、対応する選択対象データが実行されたか否かを管理している。
【0225】
ここでは、前処理命令群510は、選択パラメータCP_1〜CP_2にそれぞれ、in_1、in_2の値を格納する処理を行う。また、正常系の実行時には、入力値in_1、in_2として値「1」、「2」が与えられるものとする。
前処理命令群510は、管理情報の初期化として、秘密処理装置60が有する管理情報を初期化する。ここでは、管理情報は、6個の配列からなり、前処理命令群510は、これら全ての値に未実行を示す「0」を代入することにより、管理情報の初期化を行っている。
【0226】
ここで、前処理命令群510は、図20におけるブロック650に記載の「cp_1=in_1;cp_2=in_2;tb[7]=0;」に相当する。
3.2.2 選択処理命令群520
選択処理命令群520は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群である。
【0227】
以下、選択処理命令群520が選択識別子を算出する処理について説明する。なお、以下の説明では、選択対象データの数をNNという記号で表す。
まず、選択処理命令群520は、値NNと、値NNと互いに素な整数であるp1及びp2とを用いた式3「p1×(選択パラメータCP_1)+p2×(選択パラメータCP_2) mod NN」により、仮の選択識別子を算出する。ここで演算子「×」は掛け算を表す。また、p1とNNと互いに素とはp1とNNの最大公約数が1であることを示す。ここでは、p1、p2、及びNNをそれぞれ、「1」、「2」、及び「7」とする。
【0228】
次に、選択処理命令群520は、式3の結果を仮の選択識別子swVarとして選択識別子用変数svに格納する。続いて、選択処理命令群520は、svが示す選択対象データが既に実行されているか否か判断する。
svが示す選択対照データが未実行であると判断する場合には、選択処理命令群520は、svの値を変更せず、選択識別子の値を現在のsvの値に決定する。
【0229】
svが示す選択対象データが既に実行されていると判断する場合は、選択処理命令群520は、算出した値以降で直近の未実行の選択対象データを検索する。ここで、算出した値以降の全ての選択対象データが既に実行済みであった場合には、選択処理命令群520は、最初の選択対象データから順に未実行の選択対象データを検索する。
選択処理命令群520は、検索により見つかった選択対象データの番号を選択識別子用変数svに格納する。このような処理を行うことにより、算出した値に対応する選択対象データが既に実行されている場合でも、未実行の選択対象データが常に選択されることとなり、正常系の実行時であるか否かに関わらず、常に異なる対象データが実行されることとなる。
【0230】
ここで、選択処理命令群520は、図20におけるブロック651に記載の「sv=(cp_1+cp_2*2)%7;while(tb[sv]==1){sv=(++sv)%7;}」に相当する。
3.2.3 管理情報更新命令群525
管理情報更新命令群525は、選択処理命令群520で選択した選択対象データに対応する管理情報を、「実行済み」を示す状態に更新するプログラム命令群である。具体的には、図20におけるブロック652に記載の「tb[sv]=1;」に相当する。
【0231】
例えば、選択処理命令群520の動作の結果、選択識別子用変数svの値が「5」になった場合には、管理情報更新命令群525は、選択対象データ545に対応する管理情報tb[5]の値を、未実行を示す「0」から実行済みを示す「1」へと更新する。
3.2.4 変遷処理命令群530
変遷処理命令群530は、選択処理命令群520で選択した選択識別子に基づき、いずれかの選択対象データ540〜546に分岐する処理を行うプログラム命令群である。具体的には、選択識別子用変数svの値が、0、1、・・・、6の場合にそれぞれ、選択対象データ540、541、・・・、546への分岐を行うプログラム命令群である。
【0232】
具体例として、秘密保持プログラム500が記述されるプログラムがC言語のプログラムであり、選択対象データ540、541、・・・、546の先頭に、それぞれラベル「label_140:」、「label_141:」、・・・、「label_146:」が記述されている場合には、変遷処理命令群530は以下のようなプログラム命令となる。
【0233】

switch(sv){
case 0: goto label_140;
case 1: goto label_141;
・・・
case 6: goto label_146;


3.2.5 選択対象データ540〜546
選択対象データ540〜546は、変遷処理命令群530により分岐してきた際に、実行されるプログラム命令群である。
【0234】
選択対象データ540〜546は、それぞれ、選択対象主要命令群550〜556、更新処理命令群560〜566、分岐命令群570〜576からなるプログラム命令群である。
選択対象主要命令群550〜556は、各選択対象データにおいて行うべき処理を示すプログラム命令群である。具体的には、例えば、選択対象データ660に記載の「a=1;b=2;」がこれに当たる。
【0235】
更新処理命令群560〜566は、選択パラメータ群に含まれる各値の更新を行うプログラム命令群である。ここでは、一例として、選択パラメータ変数cp_2に格納されている値を選択パラメータ変数cp_1に代入し、選択パラメータ変数cp_2に、選択識別子用変数svの値を代入している。具体的には、図20における選択対象データ660〜666のそれぞれに含まれる「cp_1=cp2;cp_2=sv;」がこれに当たる。
【0236】
分岐命令群570〜576は、それぞれ選択対象データ540〜546の外にある選択処理命令群520へ分岐するプログラム命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群のいずれかである。
ここで、最後に実行されるべき第3機能提供命令群を含む選択対象データ543の分岐命令群573は、プログラム呼び出し元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる分岐命令群は、選択処理命令群120へ分岐するプログラム命令群である。具体的には、図20における選択対象データ660〜666のそれぞれに含まれる「goto label A;」、又は「return」がこれに当たる。
【0237】
3.3 秘密処理装置60
ここでは、秘密保持プログラム500を実行する秘密処理装置60について述べる。
秘密処理装置60は、図21に示すように、制御部700と記憶部701とから構成されている。
秘密処理装置60は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、秘密処理装置60は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0238】
3.3.1 記憶部701
記憶部701は、図21に示すように、第1プログラム記憶部702、第2プログラム記憶部703、管理情報保持部704、及び選択パラメータ群保持部705を有している。
(1)第1プログラム記憶部702
第1プログラム記憶部702は、秘密保持プログラムに含まれる複数の選択対象データを記憶している。ここで、選択対象データは、秘密情報を用いた処理の手順を示す情報であり、具体的にはプログラム命令の集合等である。これらの選択対象データは、制御部700からの指示に応じていずれかが選択され、秘密処理装置60により選択された選択対象データに示される手順が実行される。また、選択対象データは、秘密情報を用いた演算の正しい手順を分割したもの、又は正常系では実行されることのない偽装の秘密情報を用いた演算を含むものである。
【0239】
なお、ここでは、第1プログラム記憶部702には、選択対象データ540、541、・・・、546の計7つが記憶されているとするが、この数が7つに限られるものではないことは言うまでもない。
(2)第2プログラム記憶部703
第2プログラム記憶部703は、秘密保持プログラムに含まれる複数の選択対象データ以外のプログラム命令を記憶している。
【0240】
具体的には、第2プログラム記憶部703は、秘密保持プログラム500に含まれる前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530を記憶している。
(3)管理情報保持部704
管理情報保持部704は、各選択対象データのそれぞれに対して、選択対象データの実行及び未実行の情報を管理する管理情報を保持している。
【0241】
管理情報保持部704は、図22に示すように、管理情報テーブルT700を有している。
管理情報テーブルT700は、選択対象データの個数からなり、選択対象データのそれぞれに対応する管理情報を記憶する領域を有している。
管理情報テーブルT700に含まれる管理情報710〜716のそれぞれは、順に、選択対象データ540〜546に対応している。
【0242】
管理情報710〜716格納される初期値は、未実行であることを示す値「0」である。
選択対象データが制御部700により選択されると、対応する管理情報は、制御部700により値「0」から実行済であることを示す値「1」へと更新される。
(4)選択パラメータ群保持部705
選択パラメータ群保持部705は、選択パラメータCP_1、CP_2からなる選択パラメータ群を保持する。
【0243】
3.3.2 制御部700
制御部700は、秘密処理装置60全体の動作を制御し、秘密情報を用いた処理(秘密保持プログラム)を解析が困難になるように実行する。
制御部700は、図23に示すように、全体処理部720、前処理部721、選択処理部722、管理情報更新部723、変遷処理部724、及び更新処理部725を有している。
【0244】
なお、制御部700は、これらの構成要素を別個の構成として備えるのではなく、制御部700が随時これらの構成要素それぞれの機能を果たすものとしてもよい。
(1)前処理部721
前処理部721は、秘密保持プログラムが起動された際に、最初に動作する。
前処理部721は、第2プログラム記憶部703から前処理命令群に含まれる1以上のプログラム命令を、全体処理部720を介して、読み出し、読み出した1以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【0245】
具体的には、前処理部721は、まず、呼出元のプログラムからの入力値in_1、in_2を、選択パラメータCP_1及びCP_2の初期値として取得し、取得した選択パラメータCP_1及びCP_2を、全体処理部720を介して選択パラメータ群保持部705へ格納する。次に、前処理部721は、管理情報保持部704の初期化を行う。つまり、管理情報テーブルT700に含まれる各管理情報の値を「0」に設定する。
【0246】
(2)選択処理部722
選択処理部722は、選択パラメータを用いて選択識別子swVarを決定する。
選択処理部722は、第2プログラム記憶部703から選択処理命令群に含まれる1以上のプログラム命令を、全体処理部720を介して、読み出し、読み出した1以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【0247】
具体的には、選択処理部722は、選択パラメータ群保持部705に格納されている選択パラメータCP_1及びCP_2と、選択処理命令群に含まれる式3とを用いて、仮の選択識別子を算出する。選択処理部722は、管理情報テーブルT700を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する。
実行済であると判定する場合には、選択処理部722は、未実行の選択対象データを示す識別子を取得し、取得した値を選択識別子swVarとする。
【0248】
未実行であると判定する場合には、選択処理部722は、算出した仮の選択識別子を、選択識別子swVarとする。
このような処理を行うことにより、選択処理部722は、選択識別子swVarとして、常に未実行の選択対象データに対応する値を取得することができる。すなわち、選択パラメータの初期値がどのような値であっても同一の選択対象データが重複して実行されることはなくなるため、不正解析者による解析を困難にすることができる。
【0249】
(3)管理情報更新部723
管理情報更新部723は、選択処理部722にて選択された選択対象データに対応する管理情報を更新する。
管理情報更新部723は、第2プログラム記憶部703から管理情報命令群に含まれる以上のプログラム命令を、全体処理部720を介して、読み出し、読み出した1以上のプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【0250】
具体的には、管理情報更新部723は、管理情報テーブルT700に含まれる複数の管理情報のうち、選択処理部722にて取得された選択識別子swVarに対応する管理情報を、値「0」から値「1」へと更新する。
例えば、図22において、選択処理部722が選択識別子swVarの値を「5」とした場合には、管理情報更新部723は、選択対象データ545に対応する管理情報715の値を「1」に更新する。
【0251】
(4)変遷処理部724
変遷処理部724は、選択処理部722で選択された選択識別子swVarに基づき、複数の選択対象データのうち、分岐先の選択対象データを決定し、決定した選択対象データに含まれる選択対象主要命令群を実行する。
変遷処理部724は、第2プログラム記憶部703から変遷処理命令群に含まれる1以上のプログラム命令を、全体処理部720を介して、読み出し、読み出したプログラム命令を秘密保持プログラムの構造に基づいて、順次実行する。
【0252】
具体的には、変遷処理部724は、選択処理部722で選択された選択識別子swVarに基づき、複数の選択対象データのうち、分岐先の選択対象データを決定する。
変遷処理部724は、決定した選択対象データに含まれる選択対象主要命令群を、全体処理部720を介して、読み出し、読み出した選択対象主要命令群を実行する。
(5)更新処理部725
更新処理部725は、選択された選択対象データに含まれる選択対象主要命令群が実行された後に、選択パラメータの値を更新する処理を行う。
【0253】
更新処理部725は、選択された選択対象データに含まれる更新処理命令群を、全体処理部720を介して第1プログラム記憶部702から、読み出し、読み出した更新処理命令群を実行する。
具体的には、更新処理部725は、選択パラメータ群保持部705に格納されている選択パラメータCP_1及びCP_2と、選択識別子とを用いて、選択パラメータCP_1及びCP_2の更新を行う。更新方法については、上述しているので、ここでの説明は省略する。
【0254】
(6)全体処理部720
全体処理部720は、制御部700に含まれる各構成部の動作の制御を行う。
全体処理部720は、秘密保持プログラムの実行開始時には、前処理部721、選択処理部722、管理情報更新部723、変遷処理部724、更新処理部725の順に動作するように制御する。
【0255】
全体処理部720は、選択対象データに含まれる分岐命令群に基づいて、秘密保持プログラムの終了の制御、及び選択処理部722、管理情報更新部723、変遷処理部724、更新処理部725の順に動作するように制御のいずれかを行う。
具体的には、全体処理部720は、選択された選択対象データに含まれる分岐命令群を、全体処理部720を介して第1プログラム記憶部702から、読み出す。
【0256】
全体処理部720は、読み出した分岐命令群が、選択処理命令群への分岐を示すプログラム命令群である場合には、選択処理部722、管理情報更新部723、変遷処理部724、更新処理部725の順に動作するように制御する。
全体処理部720は、読み出した分岐命令群が、プログラム呼出元に制御を戻す処理のプログラム命令群である場合には、全体処理部720は、秘密保持プログラムを終了し、秘密保持プログラムの呼び出し元に制御を戻す。
【0257】
3.3.3 秘密処理装置60の動作
ここでは、秘密処理装置60の動作を、図24にて示す流れ図を用いて説明する。
秘密処理装置60の前処理部721は、呼出元のプログラム若しくは外部装置等からの入力値in_1、in_2を、選択パラメータCP_1及びCP_2の初期値として取得し、取得した選択パラメータCP_1及びCP_2を、全体処理部720を介して選択パラメータ群保持部705へ格納し、管理情報保持部704の管理情報テーブルT700の初期化を行う(ステップS500)。
【0258】
また、前処理部721は、必要であれば、記憶部701上に第1プログラム記憶部702、第2プログラム記憶部703、管理情報保持部704、選択パラメータ群保持部705に用いる領域を確保し、各領域に記憶される値の初期化を行う。
選択処理部722は、選択パラメータ群保持部705に格納されている選択パラメータCP_1及びCP_2と、選択処理命令群に含まれる式3とを用いて、仮の選択識別子を算出する(ステップS505)。
【0259】
選択処理部722は、管理情報テーブルT700を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する(ステップS510)。
実行済であると判定する場合には(ステップS510における「YES」)、選択処理部722は、仮の選択識別子を更新する(ステップS515)。ここで、ステップS510およびS515の具体例は、図20におけるブロック651に含まれる「while(tb[sv]==1){sv=(++sv)%7;」等である。この例では、tb[sv]の値が1(実行済みを示す)である限り、svをインクリメントしていくことにより、未実行の選択対象データに相当する選択識別子を探索している。
【0260】
未実行であると判定する場合には(ステップS510における「NO」)、選択処理部722は、算出した仮の選択識別子を、選択識別子swVarとする。管理情報更新部723は、管理情報テーブルT700に含まれる複数の管理情報のうち、選択識別子swVarに対応する管理情報を、値「0」から値「1」へと更新する(ステップS520)。
変遷処理部724は、選択識別子swVarに基づき、複数の選択対象データのうち、分岐先の選択対象データを取得し、取得した選択対象データに含まれる選択対象主要命令群を実行する(ステップS525)。
【0261】
更新処理部725は、選択パラメータ群保持部705に格納されている選択パラメータCP_1及びCP_2と、選択識別子とを用いて、選択パラメータCP_1及びCP_2の更新を行う(ステップS530)。
全体処理部720は、選択された選択対象データに含まれる分岐命令群がプログラムの終了を示すか否かを判断する(ステップS535)。
【0262】
分岐命令群がプログラムの終了を示すと判断する場合には(ステップS535における「YES」)、全体処理部720は、秘密保持プログラムを終了し、秘密保持プログラムの呼び出し元に制御を戻す。
分岐命令群がプログラムの終了を示さないと判断する場合には(ステップS535における「NO」)、つまり、分岐命令群が、選択処理命令群への分岐を示すと判断する場合には、全体処理部720は、ステップS505へ戻る。
【0263】
ステップS535は、具体的には、選択された選択対象データに含まれる分岐命令群が選択処理命令群に分岐する命令群(例えば、goto文)である場合には、判断結果を「NO」とし、分岐命令群がプログラムの終了を示す命令群(例えば、return文)である場合には、判断結果を「YES」とする。
3.4 プログラム難読化装置50
ここでは、実行順序を隠蔽したい難読化対象プログラムから、秘密保持プログラム500を生成するプログラム難読化装置50について述べる。
【0264】
プログラム難読化装置50は、図25に示すように、プログラム記憶部800、入力部801、機能提供命令群生成部802、偽装機能提供命令群生成部803、配置順序決定部804、管理命令群生成部805、秘密保持プログラム生成部806、及び出力部807から構成されている。
プログラム難読化装置50は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置50は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0265】
3.4.1 プログラム記憶部800
プログラム記憶部800は、当該装置で生成した各命令群、及び選択対象データを記憶するための領域を有している。
3.4.2 入力部801
入力部801は、難読化対象となるプログラム、及び生成した秘密保持プログラムに与える2つの初期値を受け付ける。
【0266】
3.4.3 機能提供命令群生成部802
機能提供命令群生成部802は、入力部801にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割する。機能提供命令群生成部802は、分割した各ブロックを、機能提供命令群とする。これにより、機能提供命令群生成部802は、入力部801にて受け付けた難読化対象プログラムから複数の機能提供命令群を生成することができる。
【0267】
機能提供命令群生成部802は、複数のブロックに分割する際に、難読化対象プログラムに条件飛び越しを行うプログラム命令が含まれる場合には、機能提供命令群生成部802は、その条件飛び越しを行うプログラム命令と複数ある飛び越し先のプログラム命令とが全て同じブロックに含まれるように分割を行う。このように分割することで、機能提供命令群生成部802は、一つのブロックからの分岐先を必ず一つのブロックにすることが出来る。
【0268】
また、入力プログラムに無条件飛び越しを行うプログラム命令がある場合には、機能提供命令群生成部802は、その無条件飛越を行うプログラム命令と飛び越し先のプログラム命令とは同じブロックになるように分割を行う。このように分割することで、機能提供命令群生成部802は、一つのブロックに対する分岐元を必ず一つのブロックにすることが出来る。
【0269】
ここで、「条件飛び越しを行う命令」とは、所定の条件に従ってプログラム命令を飛ばすような命令であり、具体的には、「if(a==0) goto labelA;」等であるこの場合、変数aがゼロであるという条件が満たされた場合に、labelAへとプログラム命令の飛び越しを行う。また、「無条件飛び越しを行う命令」とは、常にプログラム命令を飛ばす命令であり、具体的には「goto labelA;」等である。この場合、特に変数の値等に関わらず、常にlabelAへの飛び越しが行われる。
【0270】
ここでは、機能提供命令群生成部802は、3つの機能提供命令群に分割したものとする。この場合におけるコントロールフローグラフは、図17と同様になる。すなわち、前述したように飛び越し命令の飛び越し元と飛び越し先とが1つのブロックに含まれるよう分割しているので、生成されるブロックのコントロールフローグラフは、分岐のないコントロールフローとなる。ここでは、コントロールフローの始点となるブロックから順番に、各ブロックを構成するプログラム命令群を第1、第2及び第3機能提供命令群とする。
【0271】
3.4.4 偽装機能提供命令群生成部803
偽装機能提供命令群生成部803は、入力部801にて受け付けた難読化対象プログラムを元に、複数の偽装機能提供命令群を生成する。
偽装機能提供命令群生成部803は、例えば、難読化対象プログラムが記述されているプログラミング言語のプログラム命令をランダムに組み合わせた偽装機能提供命令群を生成する。
【0272】
なお、難読化対象プログラムに含まれているプログラム命令のみを用いてランダムあるいは手動で偽装機能提供命令群を生成しても構わないし、入力プログラム内にない命令を適当に生成しても構わない。また、プログラミング言語が、C言語、Java(登録商標)言語などのコンパイル処理を行うプログラミング言語である場合には、コンパイルが通るように入力プログラムで使われている変数を用いて偽装機能提供命令群を生成する。また、入力プログラムで使われていない変数を偽装機能提供命令群に含める場合には、難読化後のプログラムにそのような変数の宣言を追加することによりコンパイルに失敗しないようにする。
【0273】
ここでは、偽装機能提供命令群生成部803は、4つの偽装機能提供命令群を生成したものとして説明を続ける。
3.4.5 管理命令群生成部805
管理命令群生成部805、秘密保持プログラム500のうち、難読化対象プログラムに依存しないプログラム命令群を生成する。すなわち、図16の秘密保持プログラム500を例にすると、難読化対象プログラムに依存して変化するのは、難読化対象プログラムの手順を分割したものである選択対象主命令群である150〜156であるため、管理命令群生成部805は、その他の命令群を生成する。
【0274】
具体的には、管理命令群生成部805は、前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530、1個の更新処理命令群、分岐先が選択処理命令群を示すプログラム命令群からなる第1の分岐命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群からなる第2の分岐命令群を生成する。
このとき、管理命令群生成部805は、機能提供命令群生成部802にて生成された複数の機能提供命令群の個数(ここでは、3個)と、偽装機能提供命令群生成部803にて生成された複数の偽装機能提供命令群の個数(ここでは、4個)とを取得し、その合計値を算出する。管理命令群生成部805は、算出した合計値(ここでは、7)と同数のラベル名を生成する。管理命令群生成部805は、選択処理命令群520に含まれる式3が取り得る値のそれぞれに対して、分岐先として、生成したラベル名を対応付けることにより、変遷処理命令群530を生成する。
【0275】
管理命令群生成部805は、生成した各ラベル名のみからなる選択対象データを生成する。ここでは、管理命令群生成部805は、7個の選択対象データ540〜546を生成する。
ここで、管理命令群生成部805は、生成した前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530、1個の更新処理命令群、第1の分岐命令群、及び第2の分岐命令群をプログラム記憶部800へ格納する。
【0276】
また、管理命令群生成部805は、生成した各ラベル名のみからなる選択対象データ540〜546をもプログラム記憶部800へ格納する。
3.4.6 配置順序決定部804
配置順序決定部804は、生成した機能提供命令群(ここでは、3つの機能提供命令群)、および偽装機能提供命令群(ここでは、4つの偽装機能提供命令群)をどのような順序で選択対象主要命令群550〜556に割り当てるのかを決定する。具体的には、配置順序決定部804は、選択対象主要命令群550〜556のいずれに第1〜第3機能提供命令群を配置するかを決め、残り4つの選択対象主要命令群のいずれに偽装機能提供命令群を配置するかを決める。
【0277】
配置順序決定部804は、上述した式3を予め記憶している。ここでは、式3におけるp1、p2、及びNNをそれぞれ、「1」、「2」、及び「7」とする。
なお、ここでは、後述する管理命令群生成部805にてラベル名からなる選択対象主要命令群550〜556が生成されているものとする。
配置順序決定部804は、入力部801にて受け付けた2つの選択パラメータの初期値と、予め記憶している式3を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
【0278】
なお、入力部801にて2つの初期値として、選択パラメータCP_1(=1)、CP_2(=2)を受け付けたものとする。以下に配置の決定方法の一例について説明する。
配置順序決定部804は、図26に示すように、制御部850、選択処理部851、管理情報更新部852、更新処理部853及び管理情報保持部854を備えている。以下、配置順序決定部804の各構成要素についての詳細を説明する。
【0279】
(1)管理情報保持部854
管理情報保持部854は、管理情報テーブルT800を有している。管理情報テーブルT800のデータ構造は、管理情報保持部704が有する管理情報テーブルT700のデータ構造と同様であるので、ここでの説明は省略する。
なお、ここでは、管理情報テーブルT800に格納される値「1」は、対応する選択対象データには、機能提供命令群が配置されていることを示し、値「0」は、対応する選択対象データには、機能提供命令群が配置されていないことを示す。
【0280】
また、管理情報テーブルT800の各管理情報の初期値は「0」である。
これにより、機能提供命令群が配置された位置(配置された選択対象データ)を記憶することができる。
(2)制御部850
制御部850は、選択パラメータ群を記憶するパラメータ記憶領域を有している。
【0281】
制御部850は、入力部801にて受け付けた選択パラメータの初期値CP_1及びCP_2(ここでは、それぞれ「1」、「2」)をパラメータ記憶領域に記憶する。
制御部850は、選択処理部851、管理情報更新部852、及び更新処理部853の動作を制御する。
制御部850は、後述する選択処理部851が有する式3が取り得る値、つまり、式3にて取り得る選択識別子の値それぞれと、プログラム記憶部800にて記憶されている選択対象データとの対応付けを行う。
【0282】
制御部850は、生成された第i番目の機能提供命令群を機能提供命令群生成部802から取得する。制御部850は、取得した第i番目の機能提供命令群を、選択処理部851にて取得された選択識別子に基づいて、プログラム記憶部800にて記憶され、対応する選択対象データへ挿入する。ここで、iは1以上m以下の整数である。また、制御部850は、第i番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【0283】
制御部850は、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない1の偽装機能提供命令群を偽装機能提供命令群生成部803から取得する。制御部850は、取得した偽装機能提供命令群を、第i機能提供命令群、又は偽装機能提供命令群が挿入されていない1の選択対象データに挿入する。制御部850は、この動作を、全ての偽装機能提供命令群に対して行う。
【0284】
これにより、制御部850は、各選択対象データに、第i機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部850による第i番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
(3)選択処理部851
選択処理部851は、上述した式3を予め記憶している。
【0285】
選択処理部851は、パラメータ記憶領域に記憶されている選択パラメータCP_1、及びCP_2を取得する。
選択処理部851は、取得したCP_1及びCP_2と、予め記憶している式3とを用いて、仮の選択識別子を算出する。選択処理部851は、管理情報テーブルT800を用いて、算出した仮の選択識別子に対応する選択対象データが配置済であるか否かを判定する。
【0286】
配置済であると判定する場合には、選択処理部851は、未配置の選択対象データを示す識別子を取得し、取得した値を選択識別子swVarとする。
未配置であると判定する場合には、選択処理部851は、算出した仮の選択識別子を、選択識別子swVarとする。
選択処理部851の動作と、制御部850による第i番目の機能提供命令群を選択処理部851にて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
【0287】
(4)管理情報更新部852
管理情報更新部852は、管理情報テーブルT800に含まれる複数の管理情報のうち、選択処理部851にて取得された選択識別子swVarに対応する管理情報を、値「0」から値「1」へと更新する。
(5)更新処理部853
更新処理部853は、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部851にて取得された選択識別子とを用いて、選択パラメータCP_1及びCP_2の更新を行う。なお、更新方法は、上述しているので、ここでの説明は省略する。
【0288】
更新処理部853は、更新した選択パラメータ群を、制御部850のパラメータ記憶領域へ上書きする。
3.4.7 秘密保持プログラム生成部806
秘密保持プログラム生成部806は、プログラム記憶部800にて記憶されている更新処理命令群を、選択対象データのそれぞれに対して、選択対象主要命令群の次に位置するように挿入する。これにより、秘密保持プログラム生成部806は、選択対象データのそれぞれに対して、更新処理命令群560〜566を生成することができる。管理命令群生成部805による更新処理命令群の生成の動作と、秘密保持プログラム生成部806による上記動作とにより、更新処理命令群560〜566を適切な配置先へ挿入することができる。
【0289】
秘密保持プログラム生成部806は、第m番目の機能提供命令群(つまり、正常系にて最後に実行される機能提供命令群)が挿入された選択対象データに対して、管理命令群生成部805にて生成された第2の分岐命令群を、更新処理命令群の次に位置するように挿入する。このとき、秘密保持プログラム生成部806は、第m番目の機能提供命令群の最後にプログラム呼出元に制御を戻す処理のプログラム命令が含まれている場合には、そのプログラム命令を削除する、若しくは、第2の分岐命令群を挿入しない。
【0290】
秘密保持プログラム生成部806は、他の選択対象データに対して、管理命令群生成部805にて生成された第1の分岐命令群を、更新処理命令群の次に位置するように挿入する。これにより、秘密保持プログラム生成部806は、選択対象データ540〜546を生成することができる。
秘密保持プログラム生成部806は、プログラム記憶部800にて記憶されている各命令群を配置し、秘密保持プログラム500を生成する。すなわち、管理命令群生成部805は、生成した各命令群を図16に示す順序に配置する。
【0291】
3.4.8 出力部807
出力部807は、生成した秘密保持プログラムを、秘密処理装置60へ出力する。
3.4.9 プログラム難読化装置50の動作
(1)動作概要
ここでは、プログラム難読化装置50の動作概要について、図27に示す流れ図を用いて説明する。
【0292】
入力部801は、難読化対象となるプログラム、及び生成した秘密保持プログラムに与える2つの初期値を受け付ける(ステップS600)。
機能提供命令群生成部802は、入力部801にて受け付けた難読化対象プログラムを1以上のプログラム命令からなる複数のブロックに分割する(ステップS605)。
偽装機能提供命令群生成部803は、入力部801にて受け付けた難読化対象プログラムを元に、複数の偽装機能提供命令群を生成する(ステップS610)。
【0293】
管理命令群生成部805は、前処理命令群510、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530、1個の更新処理命令群、分岐先が選択処理命令群を示すプログラム命令群からなる第1の分岐命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群からなる第2の分岐命令群、及びラベル名のみからなる複数の選択対象データを生成する(ステップS615)。なお、選択対象データの個数は、機能提供命令群の個数と偽装機能提供命令群の個数の合計値と同一である。
【0294】
配置順序決定部804は、選択パラメータ群と、予め記憶している式3を用いて、機能提供命令群および偽装機能提供命令群の配置先を決定する(ステップS620)。
秘密保持プログラム生成部806は、管理命令群生成部805にて生成された更新処理命令群を用いて、選択対象データのそれぞれに対する更新処理命令群560〜566を生成する。秘密保持プログラム生成部806は、第1及び第2の分岐命令群を用いて、選択対象データ540〜546を生成する。秘密保持プログラム生成部806は、生成された各命令群を配置し、秘密保持プログラム500を生成する(ステップS625)。
【0295】
出力部807は、生成した秘密保持プログラムを、秘密処理装置60へ出力する(ステップS630)。
(2)配置決定処理
ここでは、図27のステップS620にて示す配置決定処理の動作について、図28に示す流れ図を用いて説明する。
【0296】
制御部850は、カウンタiに「1」を設定し、選択パラメータ群の初期値をパラメータ記憶領域へ格納する。制御部850は、選択識別子の値それぞれと、プログラム記憶部800にて記憶されている選択対象データとの対応付けを行う(ステップS700)。ここで、カウンタiは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第1の機能提供命令群から順番に配置順序を決定していく。
【0297】
選択処理部851は、パラメータ記憶領域に記憶されている選択パラメータCP_1、及びCP_2を取得する。選択処理部851は、取得したCP_1及びCP_2と、予め記憶している式3とを用いて、仮の選択識別子を算出する(ステップS705)。例えば、選択パラメータCP_1〜CP_2の値が「1」、「2」である場合には、式3の値は「1×1+2×2 MOD 7=5」になる。
【0298】
選択処理部851は、管理情報テーブルT800を用いて、算出した仮の選択識別子に対応する管理情報の値が「1」であるか否かを判定する(ステップS710)。
「1」あると判定する場合には(ステップS710における「YES」)、選択処理部851は、仮の選択識別子を更新し(ステップS715)、ステップS710へ戻る。具体的には、選択処理部851は、算出した仮の選択識別子が「5」であり、値「5」に対応する管理情報の値が「1」である場合には、仮の選択識別子「5」以降の直近に値「6」を仮の選択識別子とする。
【0299】
「1」でないと判定する場合には(ステップS710における「NO」)、選択処理部851は、算出した仮の選択識別子を、選択識別子swVarとし、制御部850は、第i番目の機能提供命令群を、選択処理部851にて取得された選択識別子swVarに基づいて、対応する選択対象データへ挿入する(ステップS720)。例えばcont =1 で、選択識別子の値が「5」であった場合には、第1機能提供命令群が、選択対象データ545に配置されることとなる。
【0300】
管理情報更新部852は、管理情報テーブルT800に含まれる複数の管理情報のうち、選択処理部851にて取得された選択識別子swVarに対応する管理情報を、値「0」から値「1」へと更新する(ステップS725)。例えば、選択識別子の値が「5」であった場合には、管理情報保持部854の管理情報テーブルT800において、選択対象データ545に対応する管理情報を未配置から配置済みに変える。
【0301】
更新処理部853は、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部851にて取得された選択識別子とを用いて、選択パラメータCP_1及びCP_2の更新を行う。更新処理部853は、更新した選択パラメータ群を、制御部850のパラメータ記憶領域へ上書きする(ステップS730)。例えば、選択パラメータの値が「1」「2」で選択識別子の値が「5」であった場合は、選択パラメータの値を「2」、「5」にする。
【0302】
制御部850は、カウンタiに値「1」を加算する(ステップS735)。
制御部850は、カウンタiが機能提供命令群の個数より大きいか否かを判定する(ステップS740)。
大きくないと判定する場合には(ステップS740における「NO」)、制御部850は、ステップS705に戻り、選択処理部851の動作を制御する。
【0303】
大きいと判定する場合には(ステップS740における「YES」)、制御部850は、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない1以上の選択対象データの何れかが配置先となるように、配置先を決定する(ステップS745)。例えば、選択対象データ540、541、542、544が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【0304】
3.5 まとめ
第3の実施の形態における秘密処理装置60の選択処理部722、及び秘密保持プログラム500の選択処理命令群520では、複数の選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。これにより、秘密処理装置60や秘密保持プログラム500が同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはないため、効率的に解析を行うことが困難になる。
【0305】
プログラム難読化装置50は、難読化対象プログラムを、秘密処理装置60にて実行される秘密保持プログラムへと変換することができる。これにより、同じプログラム命令群を重複して実行することのないことを知っている不正解析者が、変換後のプログラムに対して、選択パラメータ群の初期値を変えての全数探索を行ったとしても、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことができない。そのため、入力プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【0306】
3.6 変形例1
上記にて示すプログラム難読化装置50は、配置順序決定部804を、以下に示す配置順序決定部804a(図示せず)に置き換えてもよい。
他の構成要素については、上記と同様であるためここでの説明は省略する。
なお、本変形例1では、プログラム難読化装置50は、難読化対象プログラムのみを、入力部801にて受け付ける。
【0307】
3.6.1 配置順序決定部804a
配置順序決定部804と配置順序決定部804aとの違いは、前者は、選択パラメータ用の初期値を決めてから機能提供命令群を配置する位置を決定する方法であったのに対し、後者は1番〜p番目(pは選択パラメータの数)までの機能提供命令群を配置する位置を決めてから選択パラメータ用変数の初期値を決定し、p+1番目以降の機能提供命令群を配置する位置を決定することである。
【0308】
配置順序決定部804aは、制御部850a、選択処理部851a、管理情報更新部852a、更新処理部853a及び管理情報保持部854aを備えている。以下、配置順序決定部804aの各構成要素についての詳細を説明する。
(1)管理情報保持部854a
管理情報保持部854aは、管理情報保持部854と同様であるためここでの説明は省略する。なお、以降において必要であれば、管理情報テーブルT800を用いて説明する。
【0309】
(2)制御部850a
制御部850aは、選択パラメータの個数p(ここでは、2個)を予め記憶している。
制御部850aは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部850aは、後述する選択処理部851aが有する式3が取り得る値、つまり、式3にて取り得る選択識別子の値それぞれと、プログラム記憶部800にて記憶されている選択対象データとの対応付けを行う。
【0310】
制御部850aは、1〜p番目の機能提供命令群を配置する位置を、ランダムに設定する。例えば、制御部850aは、選択対象データ540〜546のいずれに第1の機能提供命令群を配置するかを乱数を用いて決定し、次に、第1の機能提供命令群が配置されていない選択対象データのいずれに第2の機能提供命令群を配置するかを乱数を用いて決定する。以下、同様に機能提供命令群が配置されていない選択対象データのいずれに機能提供命令群K(K=3・・・m)を配置するかを乱数を用いて決定する。
【0311】
制御部850aは、第1〜p番目の機能提供命令群それぞれの配置先に対応する管理情報の値を「0」から「1」へと更新する。制御部850aは、更新された管理情報テーブルT800と、第1〜p番目の機能提供命令群それぞれの配置先に係る情報と、選択識別子を算出する算出式とを用いて、p個の初期値を算出する。制御部850aは、算出したp個の初期値を、表示部(図示せず)を用いて表示することにより、ユーザに通知する。
【0312】
制御部850aは、算出したp個の初期値をパラメータ記憶領域に格納する。
制御部850aは、選択処理部851a、管理情報更新部852a、及び更新処理部853aの動作を制御する。
制御部850aは、第i番目の機能提供命令群を、選択処理部851aにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する。ここで、iは(p+1)以上m以下の整数であり、mは機能提供命令群の個数である。また、制御部850aは、第i番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。なお、選択処理部851aについては後述する。
【0313】
制御部850aは、機能提供命令群が挿入されていない1以上の選択対象データのそれぞれに対して、生成された複数の偽装機能提供命令群のうち1の偽装機能提供命令群を挿入する。ここで、1度挿入された偽装機能提供命令群は、他の選択対象データには挿入されない。
<初期値算出方法の具体例>
初期値算出方法の具体例を以下に示す。ここでは、選択パラメータ数p=2とし、選択対象データ540〜546、式3を用いる。また、第1番目の機能提供命令群は、選択対象データ545に配置され、第2の機能提供命令群は、選択対象データ546に配置されているとする。
【0314】
制御部850aは、まず、選択対象データ545の処理が終了した時点での選択パラメータの値CP_1及びCP_2を取得する。以下にその取得について説明する。選択対象データ545の更新処理命令群165は、「cp_1=cp_2;cp_2=sv;」であるため、選択パラメータCP_1(プログラム中の変数cp_1に相当)には、選択パラメータCP_2に設定されている値が代入される。そして、選択パラメータCP_2(プログラム中の変数cp_2に相当)には、選択識別子の値(プログラム中の変数svに相当)の値が代入される。なお、この時点での選択識別子は第1の機能提供命令群が配置される選択対象データ545の識別子(すなわち、5)である。その後、上記のように値が代入された選択パラメータを用いて、選択識別子が計算しなおされる。ここまでをまとめると、第1の選択パラメータの値は選択パラメータCP_2の初期値となり、第2の選択パラメータの値は、第1の機能提供命令群が配置された選択対象データの識別子となる。本変形例1では、第2の機能提供命令群を配置する位置を選択対象データ546としているので、式3により算出される仮の選択識別情報は、「5」又は「6」となる。なぜなら、式3の値が「6」であれば未実行の選択対象データ546が選択され、式3の値が「5」であれば選択済みの選択対象データ545は選択されずに、それ以降の直近にある未実行の選択対象データ546が選択されるからである。
【0315】
ここで、式3の値が「5」であるためには、「1×(選択パラメータCP_1)+2×5 MOD 7 =5」である必要があり、これを解くと選択パラメータCP_1の値が「2」となる。同様に、式の値が「6」であるためには、「1×(選択パラメータCP_1)+2×5 MOD7 =6」である必要があり、これを解くと選択パラメータCP_1の値が「3」となる。一般にp1とNNとが互いに素であるとき、全ての自然数Aに対して、「p1×Y MOD NN = A」を満たすYが存在する。よって、選択パラメータCP_1の値を決定することができる。
【0316】
よって、選択パラメータCP_2の初期値は「2」または「3」のいずれかになる。制御部850aは、選択パラメータCP_2の初期値は「2」または「3」のいずれかを選択する。
以下では、制御部850aは、選択パラメータCP_2の初期値として「2」を選択したものとして説明を続ける。
【0317】
次に、制御部850aは、選択パラメータCP_1の初期値を決定する。
第1の機能提供命令群を配置した選択対象データ545が選択されるためには、式3によって算出される仮の選択識別子が「5」である必要がある。なお、この時点では全選択対象データが未実行であるため、式の値が選択対象データ545を直接示す「5」以外の値を取ることはできない。よって「1×(選択パラメータCP_1)+2×(選択パラメータCP_2) MOD 7 =5」である必要がある。さらに、選択パラメータCP_2の初期値は先ほど算出した通り「2」であり、管理情報更新命令群125が最初に実行される時点では、選択パラメータCP_2の値は、その初期値である。この値を、式3に代入すると、「1×(選択パラメータCP_1)+2×2 MOD 7 =5」となる。これを解くと選択パラメータCP_1の値は「1」となる。この時点では、選択パラメータCP_1の値は初期値のままであるので、選択パラメータCP_1の初期値が「1」となる
これにより、第1及び第2の選択パラメータの初期値「1」、「2」が算出されることになる。
【0318】
(3)選択処理部851a
選択処理部851aは、選択処理部851と同様であるため、ここでの説明は省略する。
(4)管理情報更新部852a
管理情報更新部852aは、管理情報更新部852と同様であるため、ここでの説明は省略する。
【0319】
(5)更新処理部853a
更新処理部853aは、更新処理部853と同様であるため、ここでの説明は省略する。
3.6.2 変形例1のプログラム難読化装置の動作
(1)動作概要
変形例1のプログラム難読化装置の動作は、図27にて示すステップS615と、配置決定処理(ステップS620)との間に、初期値算出処理を追加することで、秘密保持プログラムを生成することができる。
【0320】
(2)初期値算出処理
ここでは、初期値算出処理の動作について、図29にて示す流れ図を用いて説明する。
制御部850aは、第1〜p番目の機能提供命令群を配置する位置を、ランダムに設定する(ステップS800)。
制御部850aは、第1〜p番目の機能提供命令群それぞれの配置先に対応する管理情報の値を「0」から「1」へと更新する(ステップS805)。
【0321】
制御部850aは、j=p〜1までの間、ステップS815からステップS825を繰り返す(ステップS810)。
制御部850aは、第jの選択パラメータの初期値を算出し(ステップS815)、算出した第jの選択パラメータの初期値をパラメータ記憶領域へ格納する(ステップS820)。
【0322】
繰り返しの終了後、制御部850aは、算出した第1〜pの選択パラメータの初期値を表示する(ステップS830)。
3.6.2 変形例1の効果
本変形例1のプログラム難読化装置は、難読化対象プログラムを第1の実施の形態に示したような秘密保持プログラムへと変換することができる。これにより、同じプログラム命令群を重複して実行することのないことを知っている不正解析者が、変換後の秘密保持プログラムに対して、選択パラメータ群の初期値を変えての全数探索を行ったとしても、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことができない。そのため、難読化対象プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【0323】
なお、本変形例1のプログラム難読化装置は、第1〜pの機能提供命令群の配置先を決定した後、配置決定処理にて、再度、第1〜pの機能提供命令群の配置先を決定している。この場合、予め決定した配置先の選択識別子が算出されるように、各選択パラメータの初期値が算出されているので、配置決定処理にて決定された第1〜pの機能提供命令群の配置先は、予め決定した配置先と同じになる。
【0324】
ここで、本変形例1のプログラム難読化装置は、第1〜pの機能提供命令群の配置先を決定した後、配置決定処理にて、再度、第1〜pの機能提供命令群の配置先を決定しなくてもよい。この場合、制御部850aは、第1〜pの機能提供命令群を順次実行した後の、各選択パラメータの値を算出し、算出した各値をパラメータ記憶領域へ格納し、それ以降における選択処理部851、管理情報更新部852、及び更新処理部853の動作を制御する。このとき、図28に示す配置決定処理を実行する際には、ステップS600をi=p+1に変更する。これにより、プログラム難読化装置は、すでに配置先が決定している第1〜pの機能提供命令群に対する位置決定処理を省略して、配置決定処理にて、第p+1以降の機能提供命令群の配置先を決定することができる。
【0325】
3.7 変形例2
変形例2では、機能提供命令群1〜3を図30に示す順序で実行する秘密処理装置について説明する。すなわち、この秘密処理装置は正常系の実行時に同じ選択対象データの手順を重複して実行することがある秘密処理装置である。変形例2の秘密処理装置は、第3の実施の形態の選択処理部722を、図31に図示する選択処理部722bに置き換えることにより実現される。
【0326】
3.7.1 選択処理部722b
選択処理部722bは、選択対象データの選択が行われた回数をカウントするカウンタを有し、カウンタの値に応じて、選択識別子の決定方法を変化させる。
以下、第3の実施の形態と同様の選択識別子の決定方法、すなわち、未実行の選択対対象データを示す選択識別子が得られるまで選択識別子の更新を行う決定方法を「第一の決定方法」と呼ぶ。また、選択識別子の値を、A回目(B=1、2、・・・6)に決定した選択識別子の値と同一のものとする決定方法をする「第二の決定方法」と呼ぶ。
【0327】
以下、選択処理部722bは、図31に示すように決定方法保持部750b、選択履歴保持部751b、カウンタ752b、制御部753bを有している。
(1)決定方法保持部750b
決定方法保持部750bは、図31に示すように、決定方法テーブルT1000を有している。
【0328】
決定方法テーブルT1000は、選択回数と決定方法とからなる組を1以上記憶するための領域を有している。
選択回数は、選択対象データの選択回数を示し、決定方法は、その回数の場合における選択識別子の決定方法を示している。
値「0」が決定方法に設定されている場合には、選択識別子の決定方法が第一の決定方法であることを示し、値「0」以外の値「A」が決定方法に設定されている場合には、選択識別子の決定方法が第二の決定方法であることを示す。値「A」が設定されている場合には、A回目に選択された値と同一の選択識別子を取得することを示す。
【0329】
例えば、選択回数と決定方法とからなる組が、「1、0」である場合には、1回目に選択する選択対象データを決定する選択識別子は、第一の決定方法を用いて決定されることを表している。また、選択回数と決定方法とからなる組が、「3、1」である場合には、3回目に選択する選択対象データを決定する選択識別子は、第二の決定方法を用いて決定され、1回目に決定された値と同一の選択識別子とすることを表している。
【0330】
(2)選択履歴保持部751b
選択履歴保持部751bは、過去に決定された選択識別子を、決定された時点におけるカウンタの値と対応付けて保持している。
(3)カウンタ752b
カウンタ752bは、現在行おうとしているの選択対象データの選択が何回目の選択であるのかをカウントする。カウンタ752bの初期値は1であり、選択を行うたびにカウンタ752bの値をインクリメントする。
【0331】
(4)制御部753b
制御部753bは、カウンタ752bの値と、決定方法テーブルT1000とを用いて、選択識別子の決定方法を決定する。具体的には、カウンタ752bの値が「1」である場合には、制御部753bは、決定方法テーブルT1000の選択回数が「1」に対応する決定方法「0」を取得する。制御部753bは、取得した決定方法が「0」であるので、選択識別子の決定方法は、第一の決定方法であると決定する。なお、取得した決定方法の値が「0」以外である場合には、制御部753bは、選択識別子の決定方法は、第二の決定方法であると決定する。
【0332】
制御部753bは、決定した決定方法が第一の決定方法である場合には、選択処理命令群520を実行する場合と同様の処理により選択識別子を選択する。
制御部753bは、決定した決定方法が第二の決定方法である場合には、取得した値「A」を用いて、A回目に決定された選択識別子を選択履歴保持部751bから取得する。
制御部753bは、カウンタ752bが示す値と決定された選択識別子とを選択履歴保持部751bに格納する。制御部753bはカウンタ1340の値を1カウントアップする。
【0333】
3.7.2 秘密処理装置の動作
変形例2における秘密処理装置の動作は、図24にて示すステップS500に、カウンタ752bのカウンタcountに初期値「1」を設定する処理を追加する。
その後、以下に示す識別子算出処理を行い、その後、ステップS520以降を行う。ステップS535における判断が「YES」の場合には処理を終了し、「NO」である場合には、識別子算出処理に戻る。
【0334】
以下に、識別子算出処理の動作について、図32にて示す流れ図を用いて説明する。
なお、ここでは、選択パラメータの数が2個であるとし、選択識別子を算出する式は、式3を用いる。また、必要があれば、第3の実施の形態にて示す構成部を用いて説明する。
制御部753bは、カウンタ752bの値と、決定方法テーブルT1000とを用いて、選択識別子の決定方法を決定する(ステップS850)。
【0335】
制御部753bは、決定した決定方法が第一の決定方法であるか否かを判断する(ステップS855)
第一の決定方法であると判断する場合には(ステップS855における「YES」)、制御部753bは、選択パラメータ群保持部705に格納されている選択パラメータCP_1及びCP_2と、選択処理命令群に含まれる式3とを用いて、仮の選択識別子を算出する(ステップS860)。
【0336】
制御部753bは、管理情報テーブルT700を用いて、算出した仮の選択識別子に対応する選択対象データが実行済であるか否かを判定する(ステップS865)。
制御部753bは、実行済であると判定する場合には(ステップS865における「YES」)、制御部753bは、仮の選択識別子を更新する(ステップS870)。
未実行であると判定する場合には(ステップS865における「NO」)、制御部753bは、カウンタ752bが示す値と決定された選択識別子とを選択履歴保持部751bに格納し(ステップS880)、カウンタ1340の値countをインクリメントする(ステップS885)。
【0337】
第二の決定方法であると判断する場合には(ステップS855における「NO」)、制御部753bは、決定方法テーブルT1000か取得した決定方法の値「A」を用いて、A回目に決定された選択識別子を選択履歴保持部751bから取得し(ステップS875)、ステップS880以降の動作を行う。
3.7.3 変形例2の効果
変形例2における選択処理部722bは、図31にて示す決定方法テーブルT1000では、3、4、6番目に実行する選択対象データを選択する際に、選択済みの選択対象データから1つを選択している。よって、難読化対象プログラムが同じ選択対象データを重複して実行することを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれ、効率的に間違った初期値を見つけ出していくことができない。そのため、難読化対象プログラムを、不正な解析を効率的に短時間で行うことを阻止できるプログラムへと変換することができるという効果がある。
【0338】
3.8 変形例3
ここでは、ループを有し、ループ内のプログラム命令群が実行される回数が固定の回数である難読化対象プログラムから秘密保持プログラムを生成するプログラム難読化装置50cである。本変形例3では、一例として、難読化対象プログラムのコントロールフローを図33に示す。このプログラムにはループ構造が2箇所あり、それぞれのループ内のプログラム命令が実行される回数は2回である。
【0339】
以下、図33に示す難読化対象プログラムを用いて説明する。
3.8.1 プログラム難読化装置50c
プログラム難読化装置50cは、図34にて示すように、プログラム記憶部800c、入力部801c、機能提供命令群生成部802c、偽装機能提供命令群生成部803c、配置順序決定部804c、管理命令群生成部805c、秘密保持プログラム生成部806c、出力部807、及び選択処理命令群生成部808cから構成されている。
【0340】
プログラム難読化装置50cは、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置50cは、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0341】
なお、プログラム難読化装置50cは、難読化対象プログラムから3つの機能提供命令群を取得するものとする。また、プログラム難読化装置50cで生成される秘密保持プログラムの構造は、上記にて示す秘密保持プログラム500の構造と同一であるものとし、以下の説明において、必要であれば、秘密保持プログラム500で用いた符号を用いて説明する。
【0342】
(1)プログラム記憶部800c
プログラム記憶部800cは、上記第3の実施の形態にて示すプログラム記憶部800と同様であるため、説明は省略する。
(2)入力部801c
入力部801cは、上記第3の実施の形態にて示す入力部801と同様であるため、説明は省略する。
【0343】
なお、入力部801cが受け取る難読化対象プログラムは、ループを有し、ループ内のプログラム命令群が実行される回数が予め定められているプログラムである。
(3)機能提供命令群生成部802c
機能提供命令群生成部802cは、入力部801cにて受け取った難読化対象プログラムから、複数の機能提供命令群を生成する。
【0344】
機能提供命令群生成部802cは、例えば、入力部801cが図33に示す難読化対象プログラムを受け取ると、ループ内に存在する2つのプログラム命令群(ここでは、ステップS905で実行されるプログラム命令群1と、ステップS925で実行されるプログラム命令群2)のそれぞれに対して、上記にて示す機能提供命令群生成部802と同様に動作を行って、複数の機能提供命令群を生成する。ここでは、機能提供命令群生成部802cは、プログラム命令群1を分割して2つの機能提供命令群(以下、機能提供命令群1、2という。)を生成し、プログラム命令群2から、1つの機能提供命令群(以下、機能提供命令群3という。)を生成する。
【0345】
図33に示すコントロールフローを、生成した3つの機能提供命令群に置き換えたコントロールフローを、図35に示す。
ステップS905で実行されるプログラム命令群1が、ステップS906で実行される機能提供命令群1と、ステップS907で実行される機能提供命令群2とに置き換わり、ステップS925で実行されるプログラム命令群2が、ステップS926で実行される機能提供命令群3に置き換わっている。なお、プログラム命令群2と機能提供命令群3とは同一のものである。
【0346】
(4)偽装機能提供命令群生成部803c
偽装機能提供命令群生成部803cは、上記にて示す偽装機能提供命令群生成部803と同様であるため、説明は省略する。
(5)選択処理命令群生成部808c
選択処理命令群生成部808cは、変形例2に示した選択処理部722bをコンピュータ等に実現させるプログラム命令群を生成する。
【0347】
選択処理命令群生成部808cは、まず、決定方法保持部750bが有する決定方法テーブルT1000を生成する。
選択処理命令群生成部808cは、図35にて示すコントロールフローから、ループを展開したプログラムのコントロールフローを生成する。具体的には、図35において、ループ内のプログラム命令である第1及び第2機能提供命令群をループが実行される回数分すなわち、2回展開し、第3機能提供命令群も同様に2回展開する。図36に各機能提供命令群を展開したプログラムのコントロールフローを示す。
【0348】
次に、選択処理命令群生成部808cは、ループを展開したプログラムのコントロールフローを元に、決定方法保持部750bに保持する決定方法を生成する。
図36のコントロールフローにおいて、ステップS950〜S975はそれぞれ、1〜6番目に実行されるブロックである。このコントロールフローにおいて3番目に実行される機能提供命令群1は1番目に実行される機能提供命令群1と同じである。よって、選択処理命令群生成部808cは、決定方法テーブルT1000の選択回数「3」に対応する決定方法には値「1」を設定する。同様に、選択処理命令群生成部808cは、決定方法テーブルT1000の選択回数「4」、「6」のそれぞれに対応する決定方法には値「2」、「5」を設定する。
【0349】
また、図36のコントロールフロー上では存在しないが、ループを展開した後のコントロールフロー上でも一度しか現れないブロックを選択する際の選択識別子の決定方法は、未配置の選択対象データより選択するという決定方法とする。
このようにして、選択処理命令群生成部808cは、決定方法保持部750bにて保持する決定方法テーブルT1000を生成する。具体的には、選択処理命令群生成部808cは、コンピュータ上に、決定方法テーブルT1000のデータ構造を持たせるようなプログラム命令群を生成する。これにより、e回目の選択識別子が、未実行の選択対象データを示す選択識別子となる決定方法を用いる場合には「e、0」の組を持ち、f回目に決定した選択識別子と同一のものとする場合には「e、f」の組を持つような決定方法テーブルT1000が実現できる。
【0350】
また、選択処理命令群生成部808cは、さらに、選択履歴保持部751b、カウンタ752bおよび制御部753bをコンピュータ上に実現するプログラム命令群も生成する。ここで、選択履歴保持部751bを実現するプログラム命令群は、選択識別子をカウンタの値と対応付けて記憶するような命令群である。カウンタ752bを実現するプログラム命令群は、初期値を「1」とし、1インクリメントするカウンタを示す命令群である。また、制御部753bを実現する命令群は、変形例2にて説明した動作を実現するプログラム命令群である。以下において、カウンタ示す命令群及び、制御部753bを実現する命令群をあわせて決定方法制御命令群という。
【0351】
これにより、選択処理命令群生成部808cは、選択処理部722bを動作させるためのプログラム命令群を生成することができる。
選択処理命令群生成部808cは、生成した各命令群をプログラム記憶部800cへ格納する。
(6)配置順序決定部804c
配置順序決定部804cは、生成した機能提供命令群(ここでは、3つの機能提供命令群)、および偽装機能提供命令群(ここでは、4つの偽装機能提供命令群)をどのような順序で選択対象主要命令群550〜556に割り当てるのかを決定する。具体的には、配置順序決定部804cは、選択対象主要命令群550〜556のいずれに第1〜第3機能提供命令群を配置するかを決め、残り4つの選択対象主要命令群のいずれに偽装機能提供命令群を配置するかを決める。
【0352】
配置順序決定部804cは、上述した式3を予め記憶している。ここでは、式3におけるp1、p2、及びNNをそれぞれ、「1」、「2」、及び「7」とする。
配置順序決定部804cは、入力部801cにて受け付けた2つの選択パラメータの初期値と、予め記憶している式3を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
【0353】
なお、入力部801cにて2つの初期値として、選択パラメータCP_1(=1)、CP_2(=2)を受け付けたものとする。以下に配置の決定方法の一例について説明する。
配置順序決定部804cは、図37に示すように、制御部850c、選択処理部851c、管理情報更新部852c、更新処理部853c及び管理情報保持部854cを備えている。以下、配置順序決定部804cの各構成要素についての詳細を説明する。
【0354】
<管理情報保持部854c>
管理情報保持部854cは、管理情報保持部854と同様であるので、説明は省略する。なお、以降において必要であれば、管理情報テーブルT800を用いて説明する。
これにより、機能提供命令群が配置された位置(配置された選択対象データ)を記憶することができる。
【0355】
<制御部850c>
制御部850cは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部850cは、入力部801cにて受け付けた選択パラメータの初期値CP_1及びCP_2(ここでは、それぞれ「1」、「2」)をパラメータ記憶領域に記憶する。
制御部850cは、選択処理部851c、管理情報更新部852c、及び更新処理部853cの動作を制御する。
【0356】
制御部850cは、後述する選択処理部851cが有する式3が取り得る値、つまり、式3にて取り得る選択識別子の値それぞれと、プログラム記憶部800cにて記憶されている選択対象データとの対応付けを行う。
制御部850cは、生成された第i番目の機能提供命令群を機能提供命令群生成部802cから取得する。制御部850cは、取得した第i番目の機能提供命令群を、選択処理部851cにて取得された選択識別子に基づいて、プログラム記憶部800cにて記憶され、対応する選択対象データへ挿入する。ここで、iは1以上m以下の整数である。また、制御部850cは、第i番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【0357】
制御部850cは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない1の偽装機能提供命令群を偽装機能提供命令群生成部803から取得する。制御部850cは、取得した偽装機能提供命令群を、第i機能提供命令群、又は偽装機能提供命令群が挿入されていない1の選択対象データに挿入する。制御部850cは、この動作を、全ての偽装機能提供命令群に対して行う。
【0358】
これにより、制御部850cは、各選択対象データに、第i機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部850cによる第i番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
<選択処理部851c>
選択処理部851cは、上述した式3を予め記憶している。
【0359】
選択処理部851cは、図36にて示すコントロールフロー及び選択処理命令群生成部808cにて生成された選択処理部722bを動作させるためのプログラム命令群に基づいて、各機能提供命令群の配置先を決定する。
選択処理部851cは、図36にて示すコントロールフローにより、t回目に実行される第iの機能提供命令群を取得する。ここで、tは、1以上6以下の整数であり、iは1以上3以下の整数である。
【0360】
選択処理部851cは、選択処理命令群生成部808cにて生成された決定方法テーブルT1000を用いて、選択回数「t」に対応する決定方法を取得する。
決定方法が「0」である場合には、選択処理部851cは、上記にて示す選択処理部851と同様の動作により、選択識別子swVarを取得する。選択処理部851cは、取得した選択識別子swVarと、第iの機能提供命令群とを対応付ける。これにより、制御部850cは、第iの機能提供命令群を、対応する選択識別子swVarにて示される選択対象データに挿入することができる。
【0361】
決定方法が「0」以外の値である場合には、選択処理部851cは、t+1回目に実行される第jの機能提供命令群を取得し、上記の動作を行う。
選択処理部851cの動作と、制御部850cによる第i番目の機能提供命令群を選択処理部851cにて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
【0362】
<管理情報更新部852c>
管理情報更新部852cは、管理情報更新部852と同様であるので、説明は省略する。
<更新処理部853c>
更新処理部853cは、更新処理部853と同様であるため、説明は省略する。
【0363】
(7)管理命令群生成部805c
管理命令群生成部805cは、上記にて示す管理命令群生成部805と同様であるため説明は省略する。
(8)秘密保持プログラム生成部806c
秘密保持プログラム生成部806cは、プログラム記憶部800cにて記憶されている各命令群を配置し、秘密保持プログラムを生成する。すなわち、管理命令群生成部805cが生成した命令群と、選択処理命令群生成部808cが生成した命令群と、配置順序決定部804cにて生成された選択対象データとを図38のような順序に配置し、秘密保持プログラム1800を生成する。管理命令群生成部805cによる更新処理命令群の生成の動作と、秘密保持プログラム生成部806cによる上記動作とにより、各命令群を適切な配置位置へ挿入することができる。
【0364】
なお、選択処理命令群生成部808cが生成する決定方法制御命令群580以外の他の命令群の位置については、特に明示していないが、例えば前処理命令群510の中等に含ませることで、実行開始時に必要な領域を確保したり、決定方法保持部750bを例えばメモリ上に生成したりすることができる。
さらに、秘密保持プログラム生成部806cは、選択対象主要命令群550〜556に対し、機能提供命令群生成部802cが生成した複数の機能提供命令群および偽装機能提供命令群生成部803cが生成した複数の偽装機能提供命令群を、配置順序決定部804cが決定した順序に対応するように配置する。
【0365】
(9)出力部807c
出力部807cは、上記にて示す出力部807と同様であるので、説明は省略する。
3.8.2 プログラム難読化装置50cの動作
ここでは、プログラム難読化装置50cの動作について説明する。
プログラム難読化装置50cの動作は、基本的には、プログラム難読化装置50と同様である。以下に、図27にて示す流れ図を用いて、プログラム難読化装置50の動作と異なる点を中心に説明する。
【0366】
ステップS620は、配置順序決定部804cにより実行される。
また、図27にて示す流れ図において、選択処理命令群生成部808cが動作するステップを加える。選択処理命令群生成部808cを動作させるステップは、配置順序決定部804cによる配置順序を決定する前、つまりステップS620より前であれば、どの位置でもよい。
【0367】
3.8.3 変形例3の効果
本変形例3のプログラム難読化装置50cは、難読化対象プログラムを第3の実施の形態にて示すような秘密保持プログラムへと変換することができる。ここで、第3の実施の形態にて示すプログラム難読化装置50とは異なり、ループのあるプログラムで難読化することができるため、より多種の入力プログラムに対して、難読化を施すことができる。
【0368】
3.9 変形例4
変形例4にて示すプログラム難読化装置は、第3の実施の形態のプログラム難読化装置によるプログラムの難読化に加え、さらに、定数を含むプログラム命令を、その定数を含まないプログラム命令に置き換える難読化を追加する装置である。
3.9.1 変形例4のプログラム難読化装置
ここで、プログラム難読化装置は、機能提供命令群を構成するプログラム命令に含まれる第一の定数を「(第1の選択パラメータ)+(第2の選択パラメータ)+(第二の定数)」に置き換える。例えば、機能提供命令群1にプログラム命令「b=a+30」が含まれており、機能提供命令群1が実行される際の第1及び第2選択パラメータそれぞれの値が「1」、「2」である場合に、「b=a+30」を「b=a+(選択パラメータCP_1)+(選択パラメータCP_2)+27」に置き換える。
【0369】
以下、このような変換を行うプログラム難読化装置を説明する。
変形例4では、第3の実施の形態で示す配置順序決定部804の変わりに配置順序決定部804d(図示せず)を用いる。配置順序決定部804dは、第3の実施の形態で説明した構成要素に加え、プログラム命令変更部810dを有する。
プログラム命令変更部810dは、上述したように入力プログラム中の定数を「(第1の選択パラメータ)+(第2の選択パラメータ)+(第二の定数)」に置き換える処理を行う。具体的には、配置順序決定部804dが現在見ている各機能提供命令群について、定数を含むプログラム命令が含まれている場合に、パラメータ記憶領域に格納されている第1及び第2の選択パラメータを取得する。プログラム命令変更部810dは、取得した第1及び第2の選択パラメータを用いて、その定数を「(第1の選択パラメータ)+(第2の選択パラメータ)+(第二の定数)」に置き換えていく処理を行う。
【0370】
ここで、第二の定数は、第一の定数から第1及び第2の選択パラメータのそれぞれの値を減算することにより算出される。
3.9.2 動作
以下、変形例4のプログラム難読化装置の動作を、配置順序決定部804dの処理の流れを中心に図39を用いて説明する。なお、変形例4のプログラム難読化装置の動作は、配置順序決定部804dの動作以外は第3の実施の形態と同様である。
【0371】
配置順序決定部804dは、カウンタcountに「1」を設定し、パラメータ記憶領域に選択パラメータ群の初期値を格納する(ステップS1000)。
配置順序決定部804dは、パラメータ記憶領域に記憶されている選択パラメータCP_1、及びCP_2を取得する。配置順序決定部804dは、取得したCP_1及びCP_2と、予め記憶している式3とを用いて、仮の選択識別子を算出する(ステップS1005)。
【0372】
配置順序決定部804dは、第count番目の機能提供命令群の配置先を決定する(ステップS1010)。具体的には、配置順序決定部804dは、図28にて示すステップS710、S715、S720を行う。
配置順序決定部804dは、第count番目の機能提供命令群に定数を含むプログラム命令が存在するか否かを判断する(ステップS1015)。
【0373】
存在すると判断する場合には(ステップS1015における「YES」)、配置順序決定部804dは、定数を含むプログラム命令を取得し、取得したプログラム命令に含まれる定数及びパラメータ記憶領域に格納されている第1及び第2の選択パラメータを用いて第二の定数を算出する(ステップS1020)。配置順序決定部804dは、取得したプログラム命令に含まれる定数を、第1及び第2の選択パラメータと、算出した第二の定数とに置き換える(ステップS1025)。例えば、配置順序決定部804dは、「b=a+30」を「b=a+(選択パラメータ1)+(選択パラメータ2)+27」に置き換える。なお、配置順序決定部804dは、ステップS1020及びS1025の動作を、第count番目の機能提供命令群に存在する定数を含むプログラム命令全てに対して行う。
【0374】
配置順序決定部804dは、パラメータ記憶領域にて記憶されている選択パラメータ群と、選択処理部851にて取得された選択識別子とを用いて、選択パラメータCP_1及びCP_2の更新を行い、更新した選択パラメータ群を、パラメータ記憶領域へ上書きする(ステップS1030)。
配置順序決定部804dは、管理情報テーブルT800に含まれる複数の管理情報のうち、取得された選択識別子swVarに対応する管理情報を、値「0」から値「1」へと更新する(ステップS1035)。
【0375】
配置順序決定部804dは、カウンタcountに値「1」を加算する(ステップS1040)。
配置順序決定部804dは、カウンタcountが機能提供命令群の個数より大きいか否かを判定する(ステップS1045)。
大きくないと判定する場合には(ステップS1045における「NO」)、配置順序決定部804dは、ステップS1005に戻る。
【0376】
大きいと判定する場合には(ステップS1045における「YES」)、配置順序決定部804dは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない1以上の選択対象データの何れかが配置先となるように、配置先を決定する(ステップS1050)。
第count番目の機能提供命令群に定数を含むプログラム命令が存在しないと判断する場合には(ステップS1015における「NO」)、配置順序決定部804dは、ステップS1030以降を行う。
【0377】
なお、ここでは、定数を置き換える置換式を「(選択パラメータ1)+(選択パラメータ2)+(第二の定数)」としているが、他の式であっても構わない。その場合は式「(置換式)=(第一の定数)」から第二の定数を求める式を作成し、その式を用いて、第二の定数を算出してもよい。また、置換式は固定である必要はなく、置き換えを行うたびに別々のものを用いても構わない。
【0378】
また、なお、説明に用いた難読化対象プログラムは一例であって、そのコントロールフローやループの回数、その他の制御構造はこれに限るものではない。
3.9.3 変形例4の効果
本変形例4のような変換を行えば、第3の実施の形態で行った難読化に加え、生成されたプログラム中の定数の値を直接見ることが出来なくなり、さらに解析が困難になる。特に、秘密情報である鍵の値等を本変形例4によって、直接見ることが出来なくすることで、秘密情報の値の解析を困難にすることが出来る。
【0379】
3.10 その他の変形例
なお、本発明を上記第3の実施の形態、及び変形例1〜4に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
(1)上記第3の実施の形態において、選択識別子の算出式を「1×(選択パラメータCP_1)+2×(選択パラメータCP_2) MOD 7」としているが、これに限定されない。何らかの形で選択識別子の候補を算出できる式であれば他の式であっても構わない。
【0380】
(2)上記第3の実施の形態において、選択パラメータ群の更新処理(更新処理命令群)が、選択対象データ540〜546に埋め込まれているが(例えば、図20における選択対象データ660の「cp_1=cp_2;cp_2=sv;」など)、これに限定されない。秘密保持プログラムは、更新処理命令群を選択対象データ540〜546の実行後に参照する構成でもよい。
【0381】
(3)また、図20では、図24にて示すステップS535における判断は明示的には行っておらず、正常系の実行において最後に実行される選択対象データ543の実行後に処理を終了する構成としているが、これに限定されない。秘密保持プログラムは、実行された選択対象データが処理の最後に実行すべき選択対象データであるかの判断処理を選択対象データから独立した形で実行してもよい。
【0382】
(4)さらに、上記第3の実施の形態では、選択パラメータを更新することにより間接的に選択対象識別子を更新しているが、これに限定されない。秘密保持プログラムは、選択識別子を直接更新する構成としてもよい。この場合は、図24にて示すステップS530において選択識別子の更新を行い、ステップS535における判断結果が「NO」である場合には、ステップS510へ戻る。
【0383】
(5)上記第3の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
(6)上記第3の実施の形態において、プログラム難読化装置は、難読化対象プログラムを、秘密保持プログラムに変換する際に、入力部にて選択パラメータの初期値を受け取ったが、これに限定されない。プログラム難読化装置は、選択パラメータの初期値は定められているものとし、予め記憶していてもよい。
【0384】
(7)上記第3の実施の形態では、機能提供命令群が3つ、偽装機能提供命令群が4つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は1個以上であればよい。
(8)上記第3の実施の形態では、選択対象部の数、選択パラメータの数、選択識別子の計算式を、固定して秘密保持プログラムを生成する場合について述べたが、これらの値や式を必ずしも固定の値である必要はなく、別の値や式であってもよい。これらの値や式は、例えば、プログラム難読化装置に入力として与えられる構成であってもよいし、全数攻撃を用いて攻撃を行う際の全数に基づいて決定する構成であってもよい。なお、入力として与えられる構成である場合には、生成される秘密保持プログラム500が正しくコンピュータ上で動作することを保証するためには、選択識別子の計算式は、その計算結果が常に選択対象データの数以下であるような式が望ましい。また、この式は不正解析者による解析を困難にするため、選択パラメータの値に応じて算出される値が大きく変動するような式が望ましい。
【0385】
また、選択パラメータの初期値は、難読化対象となるプログラム毎にランダムな値であるとしてもよい。これにより、仮に不正解析者が正しい選択パラメータの初期値を得ることができたとしても、他のプログラムに対してはその初期値を適用することができなくなる。
(9)上記第3の実施の形態では、ブロックの分割は、簡単な方法について説明したが、この方法に限定するものではなく、ブロックの分割の仕方に応じた制御構造の解析を行い、ブロックの分割の仕方に応じた機能提供命令群を生成すればよい。
【0386】
(10)上記第3の実施の形態では、秘密処理装置60を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
(11)上記第3の実施の形態において、秘密処理装置60は、図24のステップS535の判断結果により、処理の終了又は継続の判断を行っているが、これに限定されない。
【0387】
秘密処理装置60は、図24のステップS535にて示す判断の代わりに、分割後ブロックの個数と同一の選択処理データが選択されたか否かを判断してもよい。
この場合の、秘密保持プログラム500eの具体例を図40の流れ図にて示す。図40にて示すプログラムの流れ図は、図18の各ブロックをC言語で記述した具体例である。
図40における値「i」は、選択対象データの選択回数を示す。ブロック651eに含まれる条件式「if (i > 3) then return;」により、秘密保持プログラム500eの終了、及び処理の継続が制御されている。つまり、選択回数が3より大きい場合には、秘密処理装置60は、秘密保持プログラム500eの実行を終了し、3以下の場合には、秘密保持プログラム500eの実行を継続する。ここで、条件式に含まれる値「3」は分割後ブロックの数と同一の値である。
【0388】
また、選択対象データに含まれる分岐命令群は、選択処理命令群に分岐する分岐命令に統一されている。
これにより、正常系の実行において最後に実行される選択対象データを、見つけ出すことは困難になる。
また、条件式「if (i > 3) then return;」に含まれる値を、分割後ブロックの数と同一とすることで、正条系の動作において最後に実行される選択対象データ(例えば、第3の機能提供命令群)を実行後に、常に秘密保持プログラム500eの動作が終了することが保証されている。
【0389】
(12)上記第3の実施の形態において、選択パラメータの数を2としたが、これに限定されない。選択パラメータの数は複数個であればよい。
この場合の式3は、「p1×(第1の選択パラメータ用変数)+p2×(第2の選択パラメータ用変数)+・・・+pn×(第nの選択パラメータ用変数) mod NN」となる(nは2以上の整数)。なお、NNとp1、p2、・・・、pnとは互いに素である整数である。また、選択パラメータの更新時には、第iのパラメータに格納されている値を第i−1のパラメータに格納する。このとき、第1のパラメータ、第2のパラメータ、・・・、第n−1のパラメータの順に格納する。また、第nのパラメータには、選択対象データの選択に使用した選択識別子の値を格納する。ここで、iは2以上n以下の整数である。
【0390】
(13)上記第3の実施の形態において、プログラム難読化装置50は、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入した後に、前処理命令群、選択処理命令群、変遷処理命令群、及び複数の選択対象データの配置を決定して秘密保持プログラムを生成したが、これに限定されない。
【0391】
プログラム難読化装置50は、前処理命令群、選択処理命令群、変遷処理命令群、及びラベル名のみからなる複数の選択対象データの配置先を決定して、その後、ラベル名のみからなる複数の選択対象データのそれぞれに、選択対象主要命令群、更新処理命令群、及び分岐命令群を挿入して秘密保持プログラムを生成してもよい。
(14)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【0392】
4.第4の実施の形態
以下、本発明に係る第4の実施の形態としての秘密保持プログラム2000、プログラム難読化装置1010及び秘密処理装置1020について、図面を参照して説明する。
なお、システムの構成は、第3の実施の形態にて示す構成と同様であるため、説明は省略する。
【0393】
秘密処理装置1020は、第3の実施の形態にて示す秘密処理装置60と同様に、秘密情報を用いた装置である。
秘密処理装置1020と、第3の実施の形態にて示す秘密処理装置60とは、構成要素は同じであるが、各部の処理がそれぞれ異なっている。以下では、各部の処理の説明が中心となるため、説明を簡単にするために、コンピュータ上で実行されることで秘密処理装置を実現する秘密保持プログラム2000の説明をもって、秘密処理装置の説明に替える。ここで、秘密処理装置1020の構成と秘密保持プログラム2000の各部との対応関係は第3の実施の形態と同様である。
【0394】
4.1 秘密保持プログラム2000
秘密保持プログラム2000の全体構成図を図41に示す。以下では秘密保持プログラム2000の詳細について、図41を参照しながら説明していく。ここで、第3の実施の形態の秘密保持プログラム500と同様の部分については、同一の符号を付け、説明を省略する。
【0395】
秘密保持プログラム2000は、第3の実施の形態にて示す秘密保持プログラム500と同様、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されないように、難読化されたプログラムである。
秘密保持プログラム2000は、第3の実施の形態と同様の管理情報更新命令群525、変遷処理命令群530と、第3の実施の形態と異なる前処理命令群2010、選択処理命令群2020、選択対象データ2040、2041、・・・、2046とを備え、これらが図41に示す順番に配置されている。各部の具体的な説明は後述する。
【0396】
選択対象データ2040〜2046はそれぞれ、第3の実施の形態と同様の選択対象主要命令群550〜556、第3の実施の形態と異なる更新処理命令群2060〜2066と分岐命令群2070〜2076とからなり、これらは図41に示す順番に配置されている。各部は1以上のプログラム命令からなるプログラム命令群である。
秘密保持プログラム2000は、呼出元のプログラムから、3つの入力値in_1、in_2、in_3および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の処理を行うプログラム命令群である。なお、in_k(kはインデックス)は(7−k)未満の非負整数である。なお、選択対象データをここでは、2040〜2046の7つとしているが、これに限らない。選択対象データの個数をn+1個としてもよい。ここで、nは自然数である。このとき、in_kは(n+1−k)未満の非負整数である。また、入力値の個数は、in_1、in_2、in_3の3つとしているが、これに限らない。m(mはn+1以下の自然数)個であってもよい。
【0397】
秘密保持プログラム2000の処理では、選択処理命令群2020での処理に用いる選択パラメータ群の選択パラメータCP_1、CP_2、CP_3と選択パラメータインデックスCPIと、選択識別子を保持する選択識別子用変数を用いる。
ここでは、秘密保持プログラム2000が正常系の実行時に呼出元のプログラムから受け取る入力値in_1、in_2、in_3は値「2」、「4」、「3」であるとする。本実施の形態で提供する秘密保持プログラム2000は、呼出元のプログラムから受け取る値を用いれば、(選択対象主要命令群を含む)選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、(選択対象主要命令群を含む)選択対象データの実行順序を知ることが困難なプログラムである。
【0398】
4.1.1 前処理命令群2010
前処理命令群2010は、選択処理命令群2020で用いる選択パラメータ群を設定するプログラム命令群である。なお、選択パラメータ群は、選択パラメータCP_1、選択パラメータCP_2、選択パラメータCP_3と、選択パラメータインデックスCPIからなる。これらの選択パラメータCP_1〜CP_3は、非負整数値であり、選択パラメータインデックスCPIは自然数である。
【0399】
前処理命令群2010は、秘密保持プログラム2000が起動された際に、最初に実行されるプログラム命令群である。呼び出し元のプログラムから入力値in_1、in_2、in_3を受け取り、受け取った3つの値それぞれを選択パラメータ群の選択パラメータCP_1、選択パラメータCP_2、選択パラメータCP_3にそれぞれ格納し、選択パラメータ群の選択パラメータインデックスCPIを値「1」に設定するプログラム命令群を含む。正常系の実行時には、in_1、in_2、in_3は値「2」、「4」、「3」であり、選択パラメータCP_1〜CP_3にそれぞれ値「2」、「4」、「3」を格納する処理を行う。なお、選択パラメータは、入力値in_1、in_2、・・・の個数(本実施の形態では3個)だけ存在する。
【0400】
4.1.2 選択処理命令群2020
選択処理命令群2020は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群を含む。なお、選択識別子は、第3の実施の形態と同様、変遷処理命令群の実行時に使用する値である。
選択処理命令群が選択識別子を算出する処理では、まず、選択パラメータ群の選択パラメータインデックスCPIに対し、選択パラメータ群の選択パラメータCP_CPIを選択する(すなわち、CPI=1の場合には、選択パラメータCP_1を選択する)。
【0401】
次に、秘密処理装置1020が有する管理情報を用いて、未実行の選択対象データの中でCP_CPI番目の選択対象データを選択する。選択した選択対象データの番号を選択識別子用変数に格納する。ここで、選択対象データの番号は1からではなく、0から順に数える。例えば、選択対象データ2040が未実行であり、CP_CPI=0である場合は、選択対象データ2040を選択し、選択識別子用変数には0が格納される。
【0402】
4.1.3 選択対象データ2040〜2046
選択対象データ2040〜2046は、変遷処理命令群530による分岐後に、いずれかが実行されるプログラム命令群である。
選択対象データ2040〜2046は、それぞれ、第3の実施の形態と同様の選択対象主要命令群150〜156と、第3の実施の形態と異なる更新処理命令群2060〜2066と分岐命令群2070〜2076とを含むプログラム命令群である。
【0403】
本実施の形態では、正常系での実行時には、選択対象主要命令群552、555、554の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群552、555、554のそれぞれには、第1〜第3の機能提供命令群が入る。また、選択対象主要命令群550、551、553、556には、偽装機能提供命令群が入る。
【0404】
(1)更新処理命令群2060〜2066
更新処理命令群2060〜2066は、次回の選択時に用いる選択パラメータ群の値の更新を行うプログラム命令群である。具体的には、更新処理命令群2060〜2066は、選択パラメータインデックスCPIをインクリメントする。これにより、選択処理命令群2020は、選択時に用いる選択パラメータを直接指定する。
【0405】
(2)分岐命令群2070〜2076
分岐命令群2070〜2076は、それぞれ選択対象データ2040〜2046の外にある選択処理命令群2020へ分岐するプログラム命令群、及びプログラム呼出元に制御を戻す処理のプログラム命令群の何れかからなる。
第3の機能提供命令群を含む選択対象データ2044に含まれる分岐命令群2074は、プログラム呼び出し元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる選択対象外への分岐命令群は、選択処理命令群2020へ分岐するプログラム命令群である。
【0406】
4.1.4 動作
(1)秘密保持プログラム2000の実行時の動作
ここでは、秘密保持プログラム2000を実行した場合の秘密処理装置1020の動作と秘密処理装置60の動作との異なる点を、図24を用いて説明する。
秘密処理装置1020の動作は、図24に示すステップS500、ステップS505、ステップS530の動作を以下の動作に変更する。
【0407】
本実施の形態では、ステップS500を、選択パラメータの初期値を、機能提供命令群の数と同じだけ取得、選択パラメータインデックスCPIの値の初期化、及び前処理の実行を行うように変更する。
本実施の形態では、ステップS505を、選択識別子を、選択パラメータインデックスCPIが示す番号を持つ選択パラメータを選択することにより選択するように変更する。例えば、選択パラメータインデックスCPIが「1」の場合は選択パラメータCP_1を選択する。
【0408】
本実施の形態では、ステップS530を、選択パラメータインデックスCPIの値をインクリメントするように変更する。
(2)動作の具体例
以下、本実施の形態における秘密保持プログラム2000の動作の具体例を、図42を用いて説明する。
【0409】
ここでは、上述したように、選択対象主要命令群552、555、554のそれぞれに、第1〜第3の機能提供命令群が含まれ、選択対象主要命令群550、551、553、556には、偽装機能提供命令群が含まれており、正常系での実行時には、選択対象主要命令群552、555、554の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【0410】
秘密保持プログラム2000は、前処理命令群2010の処理を行う(ステップS2000)。具体的には、秘密保持プログラム2000の前処理命令群2010は、呼出元のプログラムから、入力値in1、in2、in3として、それぞれ値「2」、「4」、「3」を受け取り、第1〜3の選択パラメータ用変数にそれぞれ値「2」、「4」、「3」を格納する処理、及び選択パラメータインデックスCPIを値「1」に初期化する処理を行い、選択処理命令群2020へ分岐する。
【0411】
秘密保持プログラム2000は、選択処理命令群2020の処理を行う(ステップS2005)。具体的には、選択処理命令群2020は、選択パラメータインデックスCPIに格納されている値に基づいて、1つの選択パラメータを取得する。選択処理命令群2020は、取得した選択パラメータに基づいて、複数の選択対象データうち1の選択対象データを選択する。ここでは、選択パラメータインデックスCPIは1であるため、選択処理命令群2020は、選択パラメータCP_1(=2)を取得する。選択処理命令群2020は、秘密処理装置1020が有する管理情報により、未実行の選択対象データ(2040、2041、2042、2043、2044、2045、2046)の中で、CP_1(=2)番目に配置された選択対象データ2042を選択する。選択処理命令群2020は、選択識別子用変数に値「2」を格納する。
【0412】
秘密保持プログラム2000は、管理情報更新命令群525の処理を行う(ステップS2010)。具体的には、管理情報更新命令群525は、選択識別子用変数「2」に対応する選択対象データ2042の管理情報を実行済みに更新する。
秘密保持プログラム2000は、変遷処理命令群530の処理を行う(ステップS2015)。具体的には、変遷処理命令群530は、選択識別子用変数「2」に対応する選択対象データ2042に分岐する処理を行う。
【0413】
秘密保持プログラム2000は、選択対象データ2042に含まれる選択対象主要命令群552の処理を行う(ステップS2020)である。具体的には、選択対象データ2042は、このプログラムが提供する機能の一部である第1機能提供命令群に相当する処理を行う。
秘密保持プログラム2000は、更新処理命令群2062の処理を行う(ステップS2025)。具体的には、更新処理命令群2062は、選択パラメータ群の選択パラメータインデックスCPIをインクリメントする。ここでは、選択パラメータインデックスCPIの値が「1」であったものが「2」になる。
【0414】
秘密保持プログラム2000は、分岐命令群2072の処理を行う(ステップS2030)。具体的には、分岐命令群2072は、選択処理命令群2020へ分岐する処理を行う。
秘密保持プログラム2000は、選択処理命令群2020の処理を行う(ステップS2035)。具体的には、選択パラメータインデックスCPIに格納された値は「2」であるため、選択処理命令群2020は、選択パラメータCP_2(=4)を取得する。選択処理命令群2020は、秘密処理装置1020が有する管理情報により、未実行の選択対象データ(2040、2041、2043、2044、2045、2046)の中で、CP_2(=4)番目に配置された選択対象データ2045を選択する。選択処理命令群2020は、選択識別子用変数に値「5」を格納する。
【0415】
秘密保持プログラム2000は、管理情報更新命令群525の処理を行う(ステップS2040)。具体的には、管理情報更新命令群525は、選択識別子用変数「5」に対応する選択対象データ2045の管理情報を実行済みに更新する。
秘密保持プログラム2000は、変遷処理命令群530の処理を行う(ステップS2045)。具体的には、変遷処理命令群530は、選択識別子用変数「5」に対応する選択対象データ2045に分岐する処理を行う。
【0416】
秘密保持プログラム2000は、選択対象データ2045に含まれる選択対象主要命令群555の処理を行う(ステップS2050)。具体的には、選択対象データ2045は、このプログラムが提供する機能の一部である第2機能提供命令群に相当する処理を行う。
秘密保持プログラム2000は、更新処理命令群2065の処理を行う(ステップS2055)。具体的には、更新処理命令群2065は、選択パラメータ群の選択パラメータインデックスCPIをインクリメントする。ここでは、選択パラメータインデックスの値が「2」であったものが「3」になる。
【0417】
秘密保持プログラム2000は、分岐命令群2075の処理を行う(ステップS2060)。具体的には、分岐命令群2075は、選択処理命令群2020へ分岐する処理を行う。
秘密保持プログラム2000は、選択処理命令群2020の処理を行う(ステップS2065)。具体的には、選択パラメータインデックスCPIに格納された値は「3」であるため、選択処理命令群2020は、選択パラメータCP_3(=3)を取得する。選択処理命令群2020は、秘密処理装置1020が有する管理情報により、未実行の選択対象データ(2040、2041、2043、2044、2046)の中で、CP_3(=3)番目に配置された選択対象データ2044を選択する。選択処理命令群2020は、選択識別子用変数に値「4」を格納する。
【0418】
秘密保持プログラム2000は、管理情報更新命令群525の処理を行う(ステップS2070)。具体的には、管理情報更新命令群525は、選択識別子用変数「4」に対応する選択対象データ2044の管理情報を実行済みに更新する。
秘密保持プログラム2000は、変遷処理命令群530の処理を行う(ステップS2075)。具体的には、変遷処理命令群530は、選択識別子用変数「4」に対応する選択対象データ2044に分岐する処理を行う。
【0419】
秘密保持プログラム2000は、選択対象データ2044に含まれる選択対象主要命令群554の処理を行う(ステップS2080)。具体的には、選択対象データ2044は、このプログラムが提供する機能の一部である第3機能提供命令群に相当する処理を行う。
秘密保持プログラム2000は、更新処理命令群2064の処理を行う(ステップS2085)。具体的には、更新処理命令群2064は、選択パラメータ群の選択パラメータインデックスCPIをインクリメントする。ここでは、選択パラメータインデックスの値が「3」であったものが「4」になる。
【0420】
秘密保持プログラム2000は、分岐命令群2074の処理を行う(ステップS2090)。具体的には、分岐命令群2074は、秘密保持プログラム2000の呼び出し元に分岐する処理を行う。
4.2 プログラム難読化装置1010
プログラム難読化装置1010は、図43にて示すように、プログラム記憶部800f、入力部801f、機能提供命令群生成部802f、偽装機能提供命令群生成部803f、配置順序決定部804f、管理命令群生成部805f、秘密保持プログラム生成部806f、及び出力部807fから構成されている。
【0421】
プログラム難読化装置1010は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置1010は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0422】
なお、プログラム記憶部800f、入力部801f、機能提供命令群生成部802f、偽装機能提供命令群生成部803f、管理命令群生成部805f、秘密保持プログラム生成部806f、及び出力部807fのそれぞれは、第3の実施の形態にて示すプログラム記憶部800、入力部801、機能提供命令群生成部802、偽装機能提供命令群生成部803、管理命令群生成部805、秘密保持プログラム生成部806、及び出力部807と同様であるため、説明は省略する。
【0423】
配置順序決定部804と、配置順序決定部804fとの違いは、前者は選択パラメータの初期値と選択識別子を求めるための計算式を用いて選択識別子を算出したが、後者は選択パラメータの初期値を用い、計算式を用いないことである。
以下、配置順序決定部804fについて説明する。
また、配置順序決定部804fは、図示していないが、制御部850f、選択処理部851f、管理情報更新部852f、更新処理部853f、及び管理情報保持部854fを有している。これら構成要素の接続関係は、図26にて示す配置順序決定部804の構成要素の接続関係と同じである。
【0424】
配置順序決定部804fは、選択パラメータの初期値を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。
なお、本実施の形態では、第3の実施の形態と同様に、入力部801fにて選択パラメータの初期値を受け付けるものとし、選択パラメータCP_1〜CP_3の初期値は「2」、「4」、「3」であるとする。
【0425】
(1)管理情報保持部854f
管理情報保持部854fは、管理情報保持部854と同様であるため、説明は省略する。なお、以降、必要であれば、管理情報テーブルT800を用いて説明する。
これにより、機能提供命令群が配置された位置(配置された選択対象データ)を記憶することができる。
【0426】
(2)制御部850f
制御部850fは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部850fは、入力部801fにて受け付けた選択パラメータの初期値CP_1、CP_2、及びCP_3(ここでは、それぞれ「2」、「4」、「3」)をパラメータ記憶領域に記憶する。
【0427】
また、処理開始時には、制御部850fは、選択パラメータインデックスCPIに初期値「1」を設定し、パラメータ記憶領域に記憶する。
制御部850fは、選択処理部851f、管理情報更新部852f、及び更新処理部853fの動作を制御する。
制御部850fは、選択識別子の値それぞれと、プログラム記憶部800fにて記憶されている選択対象データとの対応付けを行う。
【0428】
制御部850fは、生成された第i番目の機能提供命令群を機能提供命令群生成部802fから取得する。制御部850fは、取得した第i番目の機能提供命令群を、選択処理部851fにて取得された選択識別子に基づいて、プログラム記憶部800fにて記憶され、対応する選択対象データへ挿入する。ここで、iは1以上m以下の整数である。また、制御部850fは、第i番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【0429】
制御部850fは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない1の偽装機能提供命令群を偽装機能提供命令群生成部803fから取得する。制御部850fは、取得した偽装機能提供命令群を、第i機能提供命令群、又は偽装機能提供命令群が挿入されていない1の選択対象データに挿入する。制御部850fは、この動作を、全ての偽装機能提供命令群に対して行う。
【0430】
これにより、制御部850fは、各選択対象データに、第i機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部850fによる第i番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
(3)選択処理部851f
選択処理部851fは、パラメータ記憶領域に記憶されている選択パラメータインデックスCPIを取得し、取得したCPIに基づいて、選択パラメータCP_kを取得する。ここで、kは1以上3以下の数である。
【0431】
選択処理部851fは、取得したCP_kの値と管理情報テーブルT800を用いて、選択識別子を取得する。
選択識別子の取得方法について、以下に説明する。
選択処理部851fは、管理情報テーブルT800において値が「0」であるものを上位から順に、0番目、1番目、・・・・とし、取得したCP_kの値と一致する管理情報を取得する。選択処理部851fは、取得した管理情報に対応する選択対象データの選択識別子を取得する。
【0432】
選択処理部851fの動作と、制御部850fによる第i番目の機能提供命令群を選択処理部851fにて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
(4)管理情報更新部852f
管理情報更新部852fは、管理情報更新部852と同様であるので、説明は省略する。
【0433】
(5)更新処理部853f
更新処理部853fは、パラメータ記憶領域にて記憶されている選択パラメータインデックスCPIを更新する。つまり、パラメータ記憶領域にて記憶されている選択パラメータインデックスCPIに1をインクリメントする。
4.3 プログラム難読化装置1010の動作
プログラム難読化装置1010の動作は、図27にて示すステップS620の処理を、以下に示す配置決定処理に置き換えることで、秘密保持プログラムを生成する。
【0434】
4.3.1 配置決定処理
ここでは、配置決定処理の動作について、図44に示す流れ図を用いて説明する。
制御部850fは、カウンタiに「1」、選択パラメータインデックスCPIに初期値「1」を設定し、選択パラメータインデックスCPI及び選択パラメータCP_1、CP_2、CP_3の各初期値「2」、「4」、「3」をパラメータ記憶領域へ格納する。制御部850fは、選択識別子の値それぞれと、選択対象データとの対応付けを行う(ステップS2500)。ここで、カウンタiは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第1の機能提供命令群から順番に配置順序を決定していく。
【0435】
選択処理部851fは、選択パラメータインデックスCPIを取得し、取得したCPIに基づいて、選択パラメータCP_kを取得する。選択処理部851fは、取得したCP_kの値と管理情報テーブルT800を用いて、選択識別子を取得する(ステップS2505)。ここで、kは1以上3以下の数である。例えば、選択処理部851fは、選択パラメータインデックスCPIが「1」である場合には、選択パラメータCP_1(=2)を取得し、取得したCP_1と管理情報テーブルT800とを用いて、選択識別子「2」を取得する。
【0436】
制御部850fは、第i番目の機能提供命令群を、選択処理部851fにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する(ステップS2510)。例えばcont =1で、選択識別子の値が「2」であった場合には、第1機能提供命令群が、選択対象データ2042に配置されることとなる。
管理情報更新部852fは、管理情報テーブルT800に含まれる複数の管理情報のうち、選択処理部851fにて取得された選択識別子に対応する管理情報を、値「0」から値「1」へと更新する(ステップS2515)。例えば、選択識別子の値が「2」であった場合には、管理情報保持部854fの管理情報テーブルT800において、選択対象データ2042に対応する管理情報を未配置から配置済みに変える。
【0437】
更新処理部853fは、パラメータ記憶領域にて記憶されている選択パラメータインデックスCPIに1をインクリメントして、選択パラメータインデックスCPIの値を更新し、更新結果をパラメータ記憶領域へ上書きする(ステップS2520)。
制御部850fは、カウンタiに値「1」を加算する(ステップS2525)。
制御部850fは、カウンタiが機能提供命令群の個数より大きいか否かを判定する(ステップS2530)。
【0438】
大きくないと判定する場合には(ステップS2530における「NO」)、制御部850fは、ステップS2505に戻り、選択処理部851fの動作を制御する。
大きいと判定する場合には(ステップS2530における「YES」)、制御部850fは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない1以上の選択対象データの何れかが配置先となるように、配置先を決定する(ステップS2535)。例えば、選択対象データ2040、2041、2043、2046が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【0439】
4.4 変形例
(1)上記第4の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
(2)上記第4の実施の形態では、機能提供命令群が3つ、偽装機能提供命令群が4つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は1個以上であればよい。
【0440】
(3)上記第4の実施の形態では、秘密処理装置1020を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
(4)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
4.5 第4の実施の形態の効果
本実施の形態では、選択処理命令群2020では選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。よって、難読化対象データが同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはなく、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことが困難になる。
【0441】
また、本実施の形態では、機能提供命令群の数と同じだけの入力値を用意し、各入力値に対応する選択対象データを選択している。このような実装による効果を、具体例を交えながら、以下に述べる。上述した例では機能提供命令群の数は3つであるため、入力値in_1、in_2、in_3により、選択対象データを選択している。本実施の形態の秘密保持プログラム2000では、始めに6以下の非負整数in_1(7種類存在)を用いて、7種類の選択対象データ2040〜2046のいずれかを選択する。ここで、括弧内の“7種類存在”は、不正解析者が設定しうるin_1の値が7種類存在するという意味である。次に5以下の非負整数in_2(6種類存在)を用いて、6種類の未実行の選択対象データ(選択対象データ2040〜2046からin_1で選択された選択対象データを除いたもの)のいずれかを選択する。さらに4以下の非負整数in_3(5種類存在)を用いて、5種類の未実行の選択対象データ(選択対象データ2040〜2046からin_1及びin_2で選択された選択対象データを除いたもの)を選択する。このように一意に選択対象データを選択することにより、入力値に対して選択対象データの選択するバリエーションが減らず、攻撃者が全数攻撃するときの組合せ数を減らすことがない。
【0442】
5.第5の実施の形態
以下、本発明に係る第5の実施の形態としての秘密保持プログラム2200、プログラム難読化装置3010及び秘密処理装置3020について、図面を参照して説明する。
なお、システムの構成は、第3の実施の形態にて示す構成と同様であるため、説明は省略する。
【0443】
秘密処理装置3020は、第3の実施の形態にて示す秘密処理装置60と同様に、秘密情報を用いた装置である。
秘密処理装置3020と、第3の実施の形態にて示す秘密処理装置60とは、構成要素は同じであるが、各部の処理がそれぞれ異なっている。以下では、各部の処理の説明が中心となるため、説明を簡単にするために、コンピュータ上で実行されることで秘密処理装置を実現する秘密保持プログラム2200の説明をもって、秘密処理装置の説明に替える。ここで、秘密処理装置3020の構成と秘密保持プログラム2200の各部との対応関係は第3の実施の形態と同様である。
【0444】
5.1 秘密保持プログラム2200
秘密保持プログラム2200の全体構成図を図45に示す。以下では秘密保持プログラム2200の詳細について、図45を参照しながら説明していく。ここで、第3の実施の形態の秘密保持プログラム500と同様の部分については、同一の符号を付け、説明を省略する。
【0445】
秘密保持プログラム2200は、第3実施の形態の秘密保持プログラム500と同様、プログラムに含まれるプログラム命令群がどのような実行順序で実行されるかを、不正解析者に解析されたくないプログラムである。
秘密保持プログラム2200は、管理情報更新命令群525、変遷処理命令群530と、第3の実施の形態と異なる前処理命令群2210、選択処理命令群2220、選択対象データ2240、2241、・・・、2246とを含み、これらが図45に示す順番に配置されている。
【0446】
選択対象データ2240〜2246はそれぞれ、第3の実施の形態と同様の選択対象主要命令群550〜556、第3の実施の形態と異なる更新処理命令群2260〜2266と分岐命令群2270〜2276と、とからなり、これらは図45に示す順番に配置されている。各命令群は1以上のプログラム命令からなるプログラム命令群である。
秘密保持プログラム2200は、呼出元のプログラムから、2つの入力値in_1、in_2および、このプログラムが提供する機能の処理を行う際に使用するパラメータを受け取り、このプログラムが提供する機能の処理を行うプログラム命令群である。なお、in_k(kはインデックス)は(7−k)未満の非負整数である。なお、選択対象データをここでは、2240〜2246の7つとしているが、これに限らない。選択対象データの個数をn+1個としてもよい。ここで、nは自然数である。このとき、in_kは(n+1−k)未満の非負整数である。また、入力値in_1、in_2の数は2つとしているが、これに限らない。m(mはn+1以下の自然数)個であってもよい。
【0447】
秘密保持プログラム2200の処理では、後述の選択処理命令群2220での処理に用いる選択パラメータ群の選択パラメータCP_1、CP_2とモジュラス値NNと、後述の選択識別子を保持する選択識別子用変数を用いる。
ここでは、秘密保持プログラム2200が正常系の実行時に呼出元のプログラムから受け取る入力値in_1、in_2は値「2」、「4」であるとする。本実施の形態で提供する秘密保持プログラム2200は、呼出元のプログラムから受け取る値を用いれば、(選択対象主要命令群を含む)選択対象データを正しい順番に実行できるプログラムであって、呼出元のプログラムから受け取る値を知ることができない不正解析者にとっては、(選択対象主要命令群を含む)選択対象データの実行順序を知ることが困難なプログラムである。
【0448】
5.1.1 前処理命令群2210
前処理命令群2210は、選択処理命令群2220で用いる選択パラメータ群を設定するプログラム命令群である。なお、選択パラメータ群は、選択パラメータCP_1、選択パラメータCP_2と、モジュラス値NNからなる。これらの選択パラメータCP_1、CP_2は、非負整数値であり、モジュラス値NNは自然数である。
【0449】
前処理命令群2210は、秘密保持プログラム2200が起動された際に、最初に実行されるプログラム命令群である。呼び出し元のプログラムから入力値in_1、in_2を受け取り、前処理命令群2210は、受け取った値を選択パラメータ群の選択パラメータCP_1、選択パラメータCP_2にそれぞれ格納し、選択パラメータ群のモジュラス値NNを7に設定するプログラム命令群と、選択処理命令群2220に分岐するプログラム命令群とからなり、これらは順に行われるプログラム命令群である。正常系の実行時には、in_1、in_2は値「2」、「4」であり、前処理命令群2210は、選択パラメータCP_1、CP_2にそれぞれ値「2」、「4」を格納する処理を行う。なお、選択パラメータは、入力値in_1、in_2、・・・の個数(本実施の形態では2個)だけ存在する。また、本実施の形態では、モジュラス値の初期値は選択対象データの数に合わせて7としている。
【0450】
5.1.2 選択処理命令群2220
選択処理命令群2220は、選択パラメータ群を用いて、選択識別子を算出するプログラム命令群と、変遷処理命令群530に分岐するプログラム命令群からなり、これらは順に行われるプログラム命令群である。なお、選択識別子は、第3の実施の形態と同様に変遷処理命令群530で使用する値である。
【0451】
選択処理命令群2220が選択識別子を算出する処理では、まず、選択パラメータ群の選択パラメータCP_1、CP_2とモジュラス値NNに対し、p1、p2をNNと互いに素な整数とし、式20「p1×(選択パラメータCP_1)+p2×(選択パラメータCP_2) mod NN」を算出し、算出結果をINDに設定する。以降の説明において、INDは選択識別子を示す。ここで、p1とNNと互いに素とはp1とNNの最大公約数が1であることを示す。また、演算子「×」は掛け算を表す。次に、秘密処理装置3020が有する管理情報を用いて、未実行の選択対象データの中でIND番目の選択対象データを選択する。選択した選択対象データの番号を選択識別子用変数に格納する。ここで、選択対象データの番号は1からではなく、0から順に数える。したがって、もし、選択対象データ2240が未実行であり、IND=0である場合は、選択対象データ2240を選択し、選択識別子用変数は0となる。
【0452】
本実施の形態では、p1、p2をそれぞれ、値「1」、「2」とし、式20を「1×(選択パラメータCP_1)+2×(選択パラメータCP_2) mod NN」とする。
5.1.3 選択対象データ2240〜2246
選択対象データ2240〜2246は、変遷処理命令群530により分岐してきた際に、実行されるプログラム命令群である。
【0453】
選択対象データ2240〜2246は、それぞれ、第3の実施の形態と同様の選択対象主要命令群550〜556と、第3の実施の形態と異なる更新処理命令群2260〜2266と分岐命令群2270〜2276とからなるプログラム命令群である。
本実施例では、正常系での実行時には、選択対象主要命令群553、555、554の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。すなわち、選択対象主要命令群553、555、554のそれぞれには、第3の実施の形態における第1機能提供命令群、第2機能提供命令群、及び第3機能提供命令群が入り、選択対象主要命令群550、551、552、556には第3の実施の形態と同様の偽装機能提供命令群が入るものとする。
【0454】
(1)更新処理命令群2260〜2266
更新処理命令群2260〜2266は、選択パラメータ群の値の更新を行うプログラム命令群である。選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_2に、選択識別子用変数に格納されている値を代入し、選択パラメータ群のモジュラス値をデクリメントする。なお、ここでは選択パラメータの数が2つであるが、m個の場合は、選択パラメータCP_mの値を選択パラメータCP_(m−1)に代入し、選択パラメータCP_(m−1)の値を選択パラメータCP_(m−2)に代入し、・・・、選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_mに、選択識別子用変数に格納されている値を代入し、モジュラス値をデクリメントする。また、モジュラス値をデクリメントした場合には、デクリメントされたモジュラス値は、p1、p2と互いに素になる必要はない。
【0455】
(2)分岐命令群2270〜2276
分岐命令群2270〜2276は、それぞれ選択対象データ2240〜2246の外にある選択処理命令群520へ分岐するプログラム命令群や、プログラム呼出元に制御を戻す処理のプログラム命令群である。第3機能提供命令群を含む選択対象データ2244に含まれる分岐命令群2274は、プログラムの呼出元に制御を戻す処理のプログラム命令群であり、他の選択対象データに含まれる分岐命令群は、選択処理命令群520へ分岐するプログラム命令群である。
【0456】
5.1.4 動作
ここでは、秘密保持プログラム2200を実行した場合の秘密処理装置3020の動作と、秘密処理装置60の動作との異なる点を、図24を用いて説明する。
秘密処理装置3020の動作は、図24に示すステップS500、ステップS505、ステップS530の動作を以下の動作に変更する。
【0457】
本実施の形態では、ステップS500を、選択パラメータの初期化お呼び前処理の実行に加え、モジュラス値NNの初期化も行うように変更する。ここで、モジュラス値の初期値は選択対象データの数と同一とする。
本実施の形態では、ステップS505を、選択パラメータ群に含まれるモジュラス値NNを取得し、式20と、取得したモジュラス値NNとを用いて選択識別子を算出するように変更する。なお、ここでのNNは選択対象データの数ではなく、モジュラス値である。
【0458】
本実施の形態では、ステップS530を、選択パラメータの更新に加え、モジュラス値NNをデクリメントするように変更する。
(2)動作の具体例
以下、本実施の形態における秘密保持プログラム2200の動作の具体例を、図46を用いて説明する。
【0459】
ここでは、上述したように、選択対象主要命令群553、555、554のそれぞれに、第1〜第3の機能提供命令群が含まれ、選択対象主要命令群550、551、552、556には、偽装機能提供命令群が含まれており、正常系での実行時には、選択対象主要命令群553、555、554の順番で実行されることで、この秘密保持プログラムが提供する機能の処理を行う。
【0460】
秘密保持プログラム2200は、前処理命令群2210の処理を行う(ステップS3000)。具体的には、前処理命令群2210は、選択パラメータCP_1、CP_2のそれぞれに、値「2」、「4」を格納し、モジュラス値NNに値「7」を設定する。
秘密保持プログラム2200は、選択処理命令群2220の処理を行う(ステップS3005)。具体的には、選択処理命令群2220は、式20、選択パラメータCP_1(=2)、CP_2(=4)、及びモジュラス値NN(=7)を用いて、値INDを算出する。ここでは、算出される値INDは、「1×2+2×4 mod 7=3」となる。秘密処理装置3020が有する管理情報より、未実行の選択対象データ(2240、2241、2242、2243、2244、2245、2246)の中で3番目の選択対象データ2243を選択する。選択識別子用変数の値は「3」となる。
【0461】
秘密保持プログラム2200は、管理情報更新命令群525の処理を行う(ステップS3010)。具体的には、管理情報更新命令群525は、選択識別子用変数「3」に対応する選択対象データ2243の管理情報を実行済みに更新する。
秘密保持プログラム2200は、変遷処理命令群530の処理を行う(ステップS3015)。具体的には、変遷処理命令群530は、選択識別子変数「3」に対応する選択対象データ2243に分岐する処理を行う。
【0462】
秘密保持プログラム2200は、選択対象データ2243に含まれる選択対象主要命令群553の処理を行う(ステップS3020)。具体的には、選択対象データ2243は、プログラムが提供する機能の一部である第1機能提供命令群に相当する処理を行う。
秘密保持プログラム2200は、更新処理命令群2263の処理を行う(ステップS3025)。具体的には、更新処理命令群2263は、選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_2に、選択識別子用変数の値を代入する。ここでは、選択パラメータCP_1、CP_2のそれぞれの値が「2」、「4」であったものが、「4」、「3」になる。さらに、モジュラス値NNをデクリメントする。ここでは、モジュラス値NNが「7」であったものが「6」になる。
【0463】
秘密保持プログラム2200は、分岐命令群2273の処理を行う(ステップS3030)。具体的には、分岐命令群2273は、選択処理命令群2220へ分岐する処理を行う。
秘密保持プログラム2200は、選択処理命令群2220の処理を行う(ステップS3035)。具体的には、選択処理命令群2220は、式20、選択パラメータCP_1(=4)、CP_2(=3)、及びモジュラス値NN(=6)を用いて、値INDを算出する。ここでは、算出される値INDは、「1×4+2×3 mod 6=4」となる。秘密処理装置3020が有する管理情報より、未実行の選択対象データ(2240、2241、2242、2244、2245、2246)の中で4番目の選択対象データ2245を選択する。選択識別子用変数の値は「5」となる。
【0464】
秘密保持プログラム2200は、管理情報更新命令群525の処理を行う(ステップS3040)。具体的には、管理情報更新命令群525は、選択識別子用変数「5」に対応する選択対象データ2245の管理情報を実行済みに更新する。
秘密保持プログラム2200は、変遷処理命令群530の処理を行う(ステップS3045)。具体的には、変遷処理命令群530は、選択識別子変数「5」に対応する選択対象データ2245に分岐する処理を行う。
【0465】
秘密保持プログラム2200は、選択対象データ2245に含まれる選択対象主要命令群555の処理を行う(ステップS3050)。具体的には、選択対象データ2245は、プログラムが提供する機能の一部である第2機能提供命令群に相当する処理を行う。
秘密保持プログラム2200は、更新処理命令群2265の処理を行う(ステップS3055)。具体的には、更新処理命令群2265は、選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_2に、選択識別子用変数の値を代入する。ここでは、選択パラメータCP_1、CP_2のそれぞれの値が「4」、「3」であったものが、「3」、「5」になる。さらに、モジュラス値NNをデクリメントする。ここでは、モジュラス値NNが「6」であったものが「5」になる。
【0466】
秘密保持プログラム2200は、分岐命令群2275の処理を行う(ステップS3060)。具体的には、分岐命令群2275は、選択処理命令群2220へ分岐する処理を行う。
秘密保持プログラム2200は、選択処理命令群2220の処理を行う(ステップS3065)。具体的には、選択処理命令群2220は、式20、選択パラメータCP_1(=3)、CP_2(=5)、及びモジュラス値NN(=5)を用いて、値INDを算出する。ここでは、算出される値INDは、「1×3+2×5 mod 5=3」となる。秘密処理装置3020が有する管理情報より、未実行の選択対象データ(2240、2241、2242、2244、2246)の中で3番目の選択対象データ2244を選択する。選択識別子用変数の値は「4」となる。
【0467】
秘密保持プログラム2200は、管理情報更新命令群525の処理を行う(ステップS3070)。具体的には、管理情報更新命令群525は、選択識別子用変数「4」に対応する選択対象データ2244の管理情報を実行済みに更新する。
秘密保持プログラム2200は、変遷処理命令群530の処理を行う(ステップS3075)。具体的には、変遷処理命令群530は、選択識別子変数「4」に対応する選択対象データ2244に分岐する処理を行う。
【0468】
秘密保持プログラム2200は、選択対象データ2244に含まれる選択対象主要命令群554の処理を行う(ステップS3080)。具体的には、選択対象データ2244は、プログラムが提供する機能の一部である第3機能提供命令群に相当する処理を行う。
秘密保持プログラム2200は、更新処理命令群2264の処理を行う(ステップS3085)。具体的には、更新処理命令群2264は、選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_2に、選択識別子用変数の値を代入する。ここでは、選択パラメータCP_1、CP_2のそれぞれの値が「3」、「5」であったものが、「5」、「4」になる。さらに、モジュラス値NNをデクリメントする。ここでは、モジュラス値NNが「5」であったものが「4」になる。
【0469】
秘密保持プログラム2200は、分岐命令群2274の処理を行う(ステップS3090)。具体的には、分岐命令群2274は、秘密保持プログラム2200の呼び出し元に分岐する処理を行う。
5.2 プログラム難読化装置3010
プログラム難読化装置3010は、図47にて示すように、プログラム記憶部800g、入力部801g、機能提供命令群生成部802g、偽装機能提供命令群生成部803g、配置順序決定部804g、管理命令群生成部805g、秘密保持プログラム生成部806g、及び出力部807gから構成されている。
【0470】
プログラム難読化装置3010は、具体的には、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記RAM又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、プログラム難読化装置3010は、その機能を達成する。つまり、前記マイクロプロセッサは、前記コンピュータプログラムに含まれる各命令を1個ずつ読み出し、読み出した命令を解読し、解読結果に従って動作する。
【0471】
なお、プログラム記憶部800g、入力部801g、機能提供命令群生成部802g、偽装機能提供命令群生成部803g、管理命令群生成部805g、秘密保持プログラム生成部806g、及び出力部807gのそれぞれは、第3の実施の形態にて示すプログラム記憶部800、入力部801、機能提供命令群生成部802、偽装機能提供命令群生成部803、管理命令群生成部805、秘密保持プログラム生成部806、及び出力部807と同様であるため、説明は省略する。
【0472】
配置順序決定部804と、配置順序決定部804gとの違いは、選択識別子を求めるための計算式が異なることと、後者において計算式のモジュラス値が変化していくことである。
以下、配置順序決定部804gについて説明する。
また、配置順序決定部804gは、図示していないが、制御部850g、選択処理部851g、管理情報更新部852g、更新処理部853g、及び管理情報保持部854gを有している。これら構成要素の接続関係は、図26にて示す配置順序決定部804の構成要素の接続関係と同じである。
【0473】
配置順序決定部804gは、選択パラメータの初期値と選択識別子の計算式を用いて、実際にどのような順序で選択識別子が算出されるのかを確認することにより、機能提供命令群および偽装機能提供命令群が配置されるべき選択対象主要命令群を決定する。なお、本実施の形態では、入力部801gにて選択パラメータの初期値を受け付けるものとし、選択パラメータCP_1〜CP_2の初期値は「2」、「4」であるとする。
【0474】
(1)管理情報保持部854g
管理情報保持部854gは、管理情報保持部854と同様であるため、説明は省略する。なお、以降、必要であれば、管理情報テーブルT800を用いて説明する。
これにより、機能提供命令群が配置された位置(配置された選択対象データ)を記憶することができる。
【0475】
(2)制御部850g
制御部850gは、選択パラメータ群を記憶するパラメータ記憶領域を有している。
制御部850gは、入力部801gにて受け付けた選択パラメータの初期値CP_1、及びCP_2(ここでは、それぞれ「2」、「4」)をパラメータ記憶領域に記憶する。
また、処理開始時には、制御部850gは、モジュラス値NNに初期値「7」を設定し、パラメータ記憶領域に記憶する。
【0476】
制御部850gは、選択処理部851g、管理情報更新部852g、及び更新処理部853gの動作を制御する。
制御部850gは、選択処理部851gが有する式20が取り得る値、つまり、式20にて取り得る選択識別子の値それぞれと、プログラム記憶部800gにて記憶されている選択対象データとの対応付けを行う。
【0477】
制御部850gは、生成された第i番目の機能提供命令群を機能提供命令群生成部802gから取得する。制御部850gは、取得した第i番目の機能提供命令群を、選択処理部851gにて取得された選択識別子に基づいて、プログラム記憶部800gにて記憶され、対応する選択対象データへ挿入する。ここで、iは1以上m以下の整数である。また、制御部850gは、第i番目の機能提供命令群と、挿入先の選択対象データとの対応付けを一時的に記憶している。
【0478】
制御部850gは、生成された複数の偽装機能提供命令群のうち選択対象データに挿入されていない1の偽装機能提供命令群を偽装機能提供命令群生成部803gから取得する。制御部850gは、取得した偽装機能提供命令群を、第i機能提供命令群、又は偽装機能提供命令群が挿入されていない1の選択対象データに挿入する。制御部850gは、この動作を、全ての偽装機能提供命令群に対して行う。
【0479】
これにより、制御部850gは、各選択対象データに、第i機能提供命令群、又は偽装機能提供命令群が挿入することができる。
制御部850gによる第i番目の機能提供命令群を取得する動作により、配置対象となる機能提供命令群を選択することができる。
(3)選択処理部851g
選択処理部851gは、パラメータ記憶領域に記憶されている選択パラメータCP_1、CP_2、及びモジュラス値NNを取得し、取得した各値と、式20とを用いて、値INDを算出する。
【0480】
選択処理部851gは、算出した値INDと管理情報テーブルT800を用いて、選択識別子を取得する。
選択識別子の取得方法について、以下に説明する。
選択処理部851gは、管理情報テーブルT800において値が「0」であるものを上位から順に、0番目、1番目、・・・・とし、算出したINDの値と一致する管理情報を取得する。選択処理部851gは、取得した管理情報に対応する選択対象データの選択識別子を取得する。
【0481】
選択処理部851の動作と、制御部850による第i番目の機能提供命令群を選択処理部851にて取得された選択識別子に基づき選択対象データに挿入する動作とにより、機能提供命令群を適切な配置先へ配置することができる。
(4)管理情報更新部852g
管理情報更新部852gは、管理情報更新部852と同様であるので、説明は省略する。
【0482】
(5)更新処理部853g
更新処理部853gは、パラメータ記憶領域にて記憶されている選択パラメータCP_1、CP_2、及びモジュラス値NNを更新する。
ここでは、更新処理部853gは、選択パラメータCP_2の値を選択パラメータCP_1に代入し、選択パラメータCP_2に、選択識別子用変数の値を代入し、それぞれに選択パラメータの値を更新する。更新処理部853gは、更新した選択パラメータCP_1及びCP_2を、制御部850gのパラメータ記憶領域へ上書きする。更新処理部853gは、モジュラス値NNの値をデクリメントし、その結果を、制御部850gのパラメータ記憶領域へ上書きする。
【0483】
5.3 プログラム難読化装置3010の動作
プログラム難読化装置3010の動作は、図27にて示すステップS620の処理を、以下に示す配置決定処理に置き換えることで、秘密保持プログラムを生成する。
5.3.1 配置決定処理
ここでは、配置決定処理の動作について、図48に示す流れ図を用いて説明する。
【0484】
制御部850gは、カウンタiに「1」、モジュラス値NNに初期値「7」を設定し、選択パラメータ群に含まれる選択パラメータCP_1、CP_2及び、モジュラス値NNの各初期値「2」、「4」、「7」をパラメータ記憶領域へ格納する。制御部850gは、選択識別子の値それぞれと、選択対象データとの対応付けを行う(ステップS3500)。ここで、カウンタiは、現在着目している機能提供命令群が何番目に実行されるべきであるかを表す。すなわち、ここでは、第1の機能提供命令群から順番に配置順序を決定していく。
【0485】
選択処理部851g、パラメータ記憶領域に記憶されている選択パラメータCP_1、CP_2、及びモジュラス値NNを取得し、取得した各値と、式20とを用いて、値INDを算出する。選択処理部851gは、算出した値INDと管理情報テーブルT800を用いて、選択識別子を取得する(ステップS3505)。例えば、選択パラメータCP_1〜CP_2の値が「2」、「4」であり、モジュラス値NNが「7」である場合には、式20の値は「1×2+2×4 MOD 7=3」になる。選択処理部851gは、管理情報テーブルT800より、未実行の選択対象データ(2240、2241、2242、2243、2244、2245、2246)の中で3番目の選択対象データ2243を選択する。選択識別子用変数の値は「3」となる。ここで、「未実行」とは、機能提供命令群が選択対象データに配置されていないことを示す。また、「実行済」とは、機能提供命令群が選択対象データに配置済であることを示す。
【0486】
制御部850gは、第i番目の機能提供命令群を、選択処理部851gにて取得された選択識別子に基づいて、対応する選択対象データへ挿入する(ステップS3510)。例えばcont =1で、選択識別子の値が「3」であった場合には、第1機能提供命令群が、選択対象データ2243に配置されることとなる。
管理情報更新部852gは、管理情報テーブルT800に含まれる複数の管理情報のうち、選択処理部851gにて取得された選択識別子に対応する管理情報を、値「0」から値「1」へと更新する(ステップS3515)。例えば、選択識別子の値が「3」であった場合には、管理情報保持部854gの管理情報テーブルT800において、選択対象データ2243に対応する管理情報を未配置から配置済みに変える。
【0487】
更新処理部853gは、パラメータ記憶領域にて記憶されている選択パラメータCP_1及びCP_2を更新し、更新結果をパラメータ記憶領域へ上書きする(ステップS3520)。更新方法は、上述しているのでここでの説明は省略する。例えば、選択パラメータCP_1及びCP_2のそれぞれの値が「2」、「4」で選択識別子の値が「3」であった場合は、選択パラメータCP_1及びCP_2のそれぞれの値を「4」、「3」にする。
【0488】
更新処理部853gは、モジュラス値NNをデクリメントし、その結果をパラメータ記憶領域へ上書きする(ステップS3525)。
制御部850gは、カウンタiに値「1」を加算する(ステップS3530)。
制御部850gは、カウンタiが機能提供命令群の個数より大きいか否かを判定する(ステップS3535)。
【0489】
大きくないと判定する場合には(ステップS3535における「NO」)、制御部850gは、ステップS3505に戻り、選択処理部851gの動作を制御する。
大きいと判定する場合には(ステップS3535における「YES」)、制御部850gは、複数の偽装機能提供命令群のそれぞれに対して、機能提供命令群が挿入されていない1以上の選択対象データの何れかが配置先となるように、配置先を決定する(ステップS3540)。例えば、選択対象データ2240、2241、2242、2246が未実行であれば、偽装機能提供命令群を配置する位置をそれらに決定し、各偽装提供命令群を挿入する。
【0490】
5.4 変形例
(1)上記第5の実施の形態では、秘密保持プログラムは、選択パラメータの初期値として、呼び出し元からの入力値を格納したが、これに限定されない。秘密保持プログラムは、ネットワーク上の他の機器から取得する値を選択パラメータの初期値に代入する構成でもよいし、プログラム実行装置が保持する他のプログラムを実行した結果得られる出力値を選択パラメータの初期値に代入する構成でもよい
(2)上記第5の実施の形態では、機能提供命令群が3つ、偽装機能提供命令群が4つの場合を示したが必ずしもこの数である必要はない。機能提供命令群は複数個、偽装機能提供命令群は1個以上であればよい。
【0491】
(3)上記第5の実施の形態では、秘密処理装置3020を上述の通りプログラムを用いたプログラム実行装置の形で実現しているが、これに限られるものではなくハードウェア的な実装を行ってもよい。
(4)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
5.5 第5の実施の形態の効果
本実施の形態では、選択処理命令群2220では選択対象データのうち、未実行の選択対象データの中からのみ、次に選択する選択対象データを決定している。よって、難読化対象データが同じ選択対象データを重複して実行することがないことを知っている不正解析者が、選択パラメータ群の初期値を変えての全数探索を行ったとしても、いずれの初期値を代入した場合にも選択対象データが重複して選ばれることはなく、重複するか否かに基づいて効率的に間違った初期値を見つけ出していくことが困難になる。
【0492】
また、本実施の形態では、入力値in_1、in_2により、一意に選択対象データを選択していく。その理由を以下で述べる。始めに6以下の非負整数in_1(7種類存在)を用いて、7種類の選択対象データ2240〜2246のいずれかを選択する。次に5以下の非負整数in_2(6種類存在)を用いて、6種類の未実行の選択対象データ(選択対象データ2240〜2246からin_1で選択された選択対象データを除いたもの)のいずれかを選択する。入力のin_k(k=1、2)の取りうる種類と、選択対象データの選択しうる種類が同じであるため、これらの選択はin_1、in_2を用いて一意に決定する。したがって、入力値in_1、in_2により、一意に選択対象データを選択する。このように一意に選択対象データを選択することにより、入力値に対して選択対象データの選択するバリエーションが減らず、攻撃者が全数攻撃するときの組合せの数を減らすことがない。
【0493】
6.変形例
上記に説明した実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。
(1)上記第3の実施の形態の選択処理命令群が選択識別子を算出する処理で使用する式は、式3「p1×(選択パラメータCP_1)+p2×(選択パラメータCP_2) mod NN」としているが、これに限らない。例えば、この式は、選択パラメータCP_1の値を固定したときに、選択パラメータCP_2の値と式の計算結果が1対1となる条件を満たせばよい。式3では、選択パラメータCP_2がNN未満の値であれば、p2とNNが互いに素であるため、取りうる選択パラメータCP_2がNN種類存在すれば、それに対応して、p2×(選択パラメータCP_2) mod NNもNN種類存在する。
【0494】
また、第5の実施の形態においても同様に、選択識別子の算出式を、式20としているが、これに限らない。例えば、この式は、選択パラメータCP_1の値を固定したときに、選択パラメータCP_2の値と式の計算結果が1対1となる条件を満たせばよい。
(2)各実施の形態の動作において、選択対象主要命令群と変遷処理命令群は順番を入れ替えてもよい。また、第3の実施の形態において、更新処理命令群560〜566は、選択対象データ540〜546に含まれる構成となっているが、管理情報更新命令群525の後にひとつだけ配置する構成であっても構わない。また、選択処理命令群520、管理情報更新命令群525、変遷処理命令群530の3つの命令群はそれぞれ一つである構成だが、各選択対象データに含まれる分岐命令群570から576のぞれぞれの代わりに前記3つの命令群を配置する構成であっても構わない。
【0495】
また、第4及び第5の実施の形態においても同様である。
(3)各命令群は、必ずしも独立した命令群である必要はなく、複数の命令群が提供する機能を組み合わせた手段とする構成であっても構わない。
(4)第3、第4及び第5の実施の形態では、実行済みの選択対象データに相当する選択識別子が算出された場合、未実行の選択識別子に対応する直近の値を算出するという方法を取っているが、この計算方法に限られるものではない。例えば、選択識別子をランダムに計算し、対応する選択対象データが実行されているか否かの確認を繰り返していく計算方法などでもよい。このようにすると、不正解析者による解析はより困難となる。
【0496】
(5)上記各実施の形態および変形例における、機能提供命令群、偽装機能提供命令群、管理命令群の生成順序は上述した順序に限るものではない。各ステップは、生成した各命令群を用いて秘密保持プログラムを生成するステップまでに終了していれば、どのような順序で実行されても構わない。例えば、偽装機能提供命令群と機能提供命令群の生成順序を逆にするなどしても構わない。
【0497】
(6)各実施の形態の説明にて挙げた数値は全て一例であり、その数値に限るものではない。例えば、選択対象データの数や初期値の数をより増やしてもよいし、初期値の数値を別のものとしてもよい。
初期値の数を増やすことで解析をさらに困難にすることができる。
(7)第1の実施の形態において、秘密保持プログラムは、1以上の偽装機能提供命令群を含むとしたが、これに限定されない。
【0498】
秘密保持プログラムは、偽装機能提供命令群を含まなくてもよい。
また、第3、第4及び第5の実施の形態においても同様に、秘密保持プログラムは、偽装機能提供命令群を含まなくてもよい。
(8)上記の各実施の形態の秘密処理装置や秘密保持プログラムでは、いずれもプログラムを分割して生成した命令群を選択対象データとしていたが、これに限られるものではなく、何らかの順序をもって使用された場合に正当な結果を得られるような情報であればどのようなものでも構わない。具体的な例としては、複数の暗号鍵により順序をもった多重の暗号化を行うような場合には、その暗号鍵それぞれを選択対象データとして扱うことなどが考えられる。また、秘密保持プログラムについても同様である。
【0499】
(9)上記の各実施の形態の秘密処理装置や秘密保持プログラムでは、いずれも選択パラメータの初期値を受け取り、内部でその値を更新していく構成を取っているが、これに限られるものではない。具体的には、秘密処理装置等の外部で選択パラメータの値を更新し、秘密処理装置等は更新後の値を受け取るようにしてもよい。また、予め秘密処理装置による処理が終了するまでに用いる選択パラメータの全てを配列によるデータとして受け取って、それに従った動作をするとしてもよい。また、秘密保持プログラムについても同様である。
【0500】
(10)第1の実施の形態において、選択識別子の算出方法として、第3の実施の形態にて示す方法、第4の実施の形態にて示す方法、及び第5の実施の形態にて示す方法の何れかを用いてもよい。
(11)上記第1の実施の形態において、プログラム難読化装置10は、ブロックの配置位置に対応する値を、式1を用いて算出したが、これに限定されない。
【0501】
プログラム難読化装置10は、ブロックを配置するアドレスを算出する算出式を用いてもよい。このとき、プログラム実行装置20は、前記算出式を用いて、次に実行するブロックのアドレスを算出する。
なお、第3、第4、及び第5の実施の形態においても同様に、プログラム難読化装置は、ブロックを配置するアドレスを算出する算出式を用いてもよい。
【0502】
(12)本発明における「変数」は、特定の言語における変数に限定されるのではなく、レジスタ、キャッシュ、RAM、HDD、その他の書き換え可能なメモリに記憶した内容、及びそれらのメモリに記載された値によって指定された位置に記憶された内容であってもよい。
(13)上記第1の実施の形態において、更新処理命令群は、選択対象主要命令群の直後に配置されたが、これに限定されない。選択対象主要命令群の中に挿入してもよい。
【0503】
ここでは、選択主要命令群に含まれる1以上のプログラム命令群のうち最後に位置するプログラム命令群の直後に更新処理命令群を配置することも、選択対象主要命令群の中に挿入するという。
選択主要命令群に含まれる1以上のプログラム命令群のうち最後に位置するプログラム命令群の直後に更新処理命令群が挿入されることは、選択対象主要命令群の直後に配置されることと同等である。
【0504】
(14)上記実施の形態において、選択パラメータの更新を行う場合に、選択パラメータに、前回算出された選択識別子そのものを代入したが、これに限定されない。
算出された選択識別子に演算を施して、その演算結果を用いて選択パラメータの更新を行ってもよい。例えば、A=(算出された選択識別子の値)+1とし、Aの値を選択パラメータに代入してもよい。他の例として、A=(算出された選択識別子の値)×3とし、Aの値を選択パラメータに代入してもよい。
【0505】
または、2つ前に選択された選択対象データ等、過去の何れかの時点で処理された選択対象データを示す選択識別子の値を代入してもよい。すなわち、過去に選択された選択対象データを示す選択識別子が反映されるのであればどのような代入の仕方でもよい。ここで、過去の何れかの時点で処理された選択対象データを示す選択識別子とは、現在選択されている選択対象データを示す選択識別子をも含む。
【0506】
例えば、前回算出された選択対象データを示す選択識別子と、2回以上過去に算出された選択対象データを示す選択識別子を用いて、選択パラメータを更新してもよい。具体的には、A=(前回算出された選択識別子)+(2回前に算出された選択識別子)とし、Aの値を選択パラメータに代入してもよい。
(15)本発明における命令群とは、1以上の命令からなるものとする。つまり、本発明における命令群は、1の命令からなる場合も含まれる。
【0507】
(16)上記第1の実施の形態において、複数の選択パラメータ全てを用いて、選択識別子を算出したが、これに限定されない。
複数の選択パラメータのうち1以上の選択パラメータを用いて選択識別子を算出してもよい。例えば、3つの選択パラメータA、B、Cのうち、ある選択識別子を算出する際には、選択パラメータA、Bを用い、他の選択識別子を算出する際には、選択パラメータA、Cを用いてもよい。
【0508】
なお、第2の実施の形態、第3の実施の形態、第4の実施の形態、及び第5に実施の形態においても同様に、複数の選択パラメータのうち1以上の選択パラメータを用いて選択識別子を算出してもよい。
(17)上記第2の実施の形態において、各選択対象データには1のデータが格納されていたが、これに限定されない。
【0509】
各選択対象データに格納されるデータの個数は、1以上であればよい。
(18)上記第2の実施の形態において、選択パラメータの更新の際に、選択識別子の値を更新対象の選択パラメータに代入したが、これに限定されない。
選択識別子の値に演算を施して、その演算結果を更新対象の選択パラメータに代入してもよい。例えば、選択識別子の値に、定数を加算し、加算結果を更新対象の選択パラメータに代入する。
【0510】
なお、第3の実施の形態、第4の実施の形態、及び第5に実施の形態においても同様に、選択識別子の値に演算を施して、その演算結果を更新対象の選択パラメータに代入してもよい。
また、第2の実施の形態において、プログラム難読化装置は、秘密保持プログラムを生成する際に、秘密情報を秘密情報用変数へ変換したがこれに限定されない。
【0511】
秘密情報用変数を含む演算式に変換してもよい。例えば、秘密情報を、秘密情報用変数と定数との和の演算式に変換してもよい。
(19)上記の各装置を構成する構成要素の一部または全部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムLSIは、その機能を達成する。なお、ここでは、システムLSIとしたが、集積度の違いにより、IC、LSI、スーパーLSI、ウルトラLSIと呼称されることもある。また、集積回路化の手法はLSIに限るものではなく、専用回路又は汎用プロセサで実現してもよい。LSI製造後に、プログラムすることが可能なFPGA(Field Programmable Gate Array)や、LSI内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【0512】
さらには、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて構成要素の集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
(20)上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なICカードまたは単体のモジュールから構成されているとしてもよい。前記ICカードまたは前記モジュールは、マイクロプロセッサ、ROM、RAMなどから構成されるコンピュータシステムである。前記ICカードまたは前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ICカードまたは前記モジュールは、その機能を達成する。このICカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【0513】
(21)本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるディジタル信号であるとしてもよい。
(22)また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD−ROM、MO、DVD、DVD−ROM、DVD−RAM、BD(Blu−ray Disc)、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記ディジタル信号であるとしてもよい。
【0514】
(23)また、本発明は、前記コンピュータプログラムまたは前記ディジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
(24)また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【0515】
(25)また、前記プログラムまたは前記ディジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記ディジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
(26)これらの実施の形態及び変形例の組合せであってもよい。
【産業上の利用可能性】
【0516】
本発明にかかる秘密処理装置、秘密保持プログラムは、暗号鍵などの秘密情報を扱う処理を行う場合に不正解析者による攻撃を困難にすることができるため、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行う装置等の分野で有用である。
また、本発明にかかるプログラム難読化装置は、暗号鍵などの秘密情報を扱うプログラムを、より解析が困難な形に変換することができるので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等の分野において有用である。
【0517】
また、上記にて示したプログラム難読化装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。
【図面の簡単な説明】
【0518】
【図1】秘密保持システム1の構成を示すブロック図である。
【図2】秘密保持プログラム100の構造を示す図である。
【図3】秘密保持プログラム100の具体的なプログラムを示す図である。
【図4】秘密保持プログラム100を正常系で実行した場合の処理の動作を示す流れ図である。
【図5】プログラム難読化装置10の構成を示すブロック図である。
【図6】秘密保持プログラム生成部203の構成を示すブロック図である。
【図7】プログラム難読化装置10の動作概要を示す流れ図である。
【図8】選択対象データの生成処理の動作を示す流れ図である。図9に続く。
【図9】選択対象データの生成処理の動作を示す流れ図である。図8から続く。
【図10】秘密保持システム2の構成を示すブロック図である。
【図11】秘密保持プログラム300の構造を示す図である。
【図12】秘密保持プログラム300を正常系で実行した場合の処理の動作を示す流れ図である。
【図13】プログラム難読化装置30の構成を示すブロック図である。
【図14】プログラム難読化装置30の動作概要を示す流れ図である。
【図15】秘密保持システム3の構成を示すブロック図である。
【図16】秘密保持プログラム500の構造を示す図である。
【図17】難読対象プログラムのコントロールフローを示す図である。
【図18】秘密保持プログラム500の各ブロックを模式的に記述した図である。
【図19】秘密保持プログラム500の具体的なプログラムを示す図である。
【図20】秘密保持プログラム500の各ブロックをC言語で記述した具体例を示す図である。
【図21】秘密処理装置60の構成を示すブロック図である。
【図22】管理情報テーブルT700のデータ構造の一例を示す図である。
【図23】制御部700の構成を示すブロック図である。
【図24】秘密処理装置60の動作を示す流れ図である。
【図25】プログラム難読化装置50の構成を示すブロック図である。
【図26】配置順序決定部804の構成を示すブロック図である。
【図27】プログラム難読化装置50の動作概要を示す流れ図である。
【図28】配置決定処理の動作を示す流れ図である。
【図29】初期値算出処理の動作を示す流れ図である。
【図30】機能提供命令群1〜3の実行順序を示す図である。
【図31】選択処理部722bの構成を示すブロック図である。
【図32】選択識別子取得処理の動作を示す流れ図である。
【図33】難読化対象プログラムのコントロールフローを示す図である。
【図34】プログラム難読化装置50cの構成を示すブロック図である。
【図35】図33に示すコントロールフローを、生成した3つの機能提供命令群に置き換えたコントロールフローを示す図である。
【図36】各機能提供命令群を展開したプログラムのコントロールフローを示す図である。
【図37】配置順序決定部804cの構成を示すブロック図である。
【図38】秘密保持プログラム1800の構造を示す図である。
【図39】配置順序決定部804dの動作を示す流れ図である。
【図40】秘密保持プログラム500eの各ブロックをC言語で記述した具体例を示す図である。
【図41】秘密保持プログラム2000の構造を示す図である。
【図42】秘密保持プログラム2000の動作の具体例を示す流れ図である。
【図43】プログラム難読化装置1010の構成を示すブロック図である。
【図44】配置決定処理の動作を示す流れ図である。
【図45】秘密保持プログラム2200の構造を示す図である。
【図46】秘密保持プログラム2200の動作の具体例を示す流れ図である。
【図47】プログラム難読化装置3010の構成を示すブロック図である。
【図48】配置決定処理の動作を示す流れ図である。
【符号の説明】
【0519】
1 秘密保持システム
10 プログラム難読化装置
20 プログラム実行装置
100 秘密保持プログラム
200 入力部
201 機能提供命令群生成部
202 偽装機能提供命令群生成部
203 秘密保持プログラム生成部
2 秘密保持システム
30 プログラム難読化装置
40 プログラム実行装置
300 秘密保持プログラム
400 入力部
401 機能提供命令群生成部
402 変遷処理命令群生成部
403 秘密保持プログラム生成部
3 秘密保持システム
50 プログラム難読化装置
60 秘密処理装置
500 秘密保持プログラム
700 制御部
701 記憶部
702 第1プログラム記憶部
703 第2プログラム記憶部
704 管理情報保持部
705 選択パラメータ群保持部
800 プログラム記憶部
801 入力部
802 機能提供命令群生成部
803 偽装機能提供命令群生成部
804 配置順序決定部
805 管理命令群生成部
806 秘密保持プログラム生成部
807 出力部
1010 プログラム難読化装置
1020 秘密処理装置
2000 秘密保持プログラム
2200 秘密保持プログラム
3010 プログラム難読化装置
3020 秘密処理装置

Claims (38)

  1. オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置であって、
    オリジナルプログラムを取得するプログラム取得手段と、
    所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、
    複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、
    前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段と
    を備えることを特徴とするプログラム変換装置。
  2. 前記所定の順序は、前記複数の選択パラメータに所定の初期値を与えて、前記選択処理命令群及び前記更新処理命令群の実行を繰り返すことにより、順次算出される選択識別子の順序である
    ことを特徴とする請求項1に記載のプログラム変換装置。
  3. 前記複数の選択対象データのそれぞれは、1個以上のデータからなる
    ことを特徴とする請求項2に記載のプログラム変換装置。
  4. 前記オリジナルプログラムは、秘匿すべき秘密情報を有し、
    前記選択処理命令群生成手段は、
    前記複数の選択パラメータを用いる第1の演算式により前記選択識別子を算出する命令群からなる選択処理命令群を生成し、
    前記更新処理命令群生成手段は、
    算出された前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新する更新処理命令群を生成し、
    前記プログラム変換装置は、さらに、
    更新した複数の選択パラメータを用いた第2の演算式により、前記秘密情報と同一の値を算出する変遷処理命令群を生成する変遷処理命令群生成手段を備え、
    前記秘密保持プログラム生成手段は、
    生成された変遷処理命令群を、前記更新処理命令群の配置位置と、前記秘密情報の配置位置との間へ配置し、及び前記秘密情報を前記変遷処理命令群で算出する処理に置換する
    ことを特徴とする請求項3に記載のプログラム変換装置。
  5. プログラム変換装置は、さらに、
    前記オリジナルプログラムを、1つ以上のブロックに分割する分割手段を備え、
    前記複数の選択対象データのそれぞれは、異なるブロックを含む
    ことを特徴とする請求項2に記載のプログラム変換装置。
  6. 前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記更新処理命令群生成手段は、
    前記複数の選択対象データのそれぞれに対して、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、定数値を第1の選択パラメータに格納する更新処理命令群を生成する
    ことを特徴とする請求項5に記載のプログラム変換装置。
  7. 前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記演算式は、
    前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、選択識別子を算出し、
    Piとモジュロ値Nとは、互いに素である
    であることを特徴とする請求項6に記載のプログラム変換装置。
  8. 選択対象データ生成手段は、
    現時点までに前記演算式にて算出された選択識別子それぞれを記憶する記憶部と、
    1つのブロックに対して、1つの値を選択し、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、選択した値を第1の選択パラメータに格納して、前記演算式を実行する実行部と、
    算出された算出値と同一の選択識別子が前記記憶部に記憶されているか否かを判断する判断部と、
    判断結果が否定的である場合には、前記選択された1つの値を、前記1つのブロックに対する前記定数値と決定し、前記1つのブロックを算出された算出値が示す選択対象データに格納する格納部と、
    判断結果が肯定的である場合には、前記定数値が決定され、1つのブロックが選択対象データに格納されるまでの間、前記実行部と前記判断部とによる処理を繰り返すように制御する繰返制御部とを備え、
    前記選択対象データ生成手段による処理は、全てのブロックに対して実行される
    ことを特徴とする請求項5に記載のプログラム変換装置。
  9. 前記選択処理命令群生成手段は、
    未実行である選択対象データを示す識別子を、常に取得する選択処理命令群を生成する
    ことを特徴とする請求項5に記載のプログラム変換装置。
  10. 前記選択処理命令群生成手段は、
    未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する選択処理命令群を生成する
    ことを特徴とする請求項9に記載のプログラム変換装置。
  11. 前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
    前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記選択処理命令群生成手段は、
    前記配列テーブルと、
    前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する前記演算式と、
    前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行う取得プログラム命令群とを生成し、
    前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含み、
    Piとモジュロ値Nとは互いに素である
    ことを特徴とする請求項10に記載のプログラム変換装置。
  12. 前記更新処理命令群生成手段は、
    第j(jは2以上n以下の整数)の選択パラメータに格納されている値を第j−1の選択パラメータへ格納し、前記選択処理命令群にて取得された前記真の選択識別子を第nの選択パラメータへ格納する前記更新処理命令群を生成する
    ことを特徴とする請求項11に記載のプログラム変換装置。
  13. 前記演算式は、1つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記1つのパラメータを取得する第1取得プログラム命令群であり、
    前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
    前記選択処理命令群生成手段は、
    前記第1取得プログラム命令群と、
    前記配列テーブルと、
    前記配列テーブルのうち未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第1取得プログラム命令群にて取得されたパラメータの値にて示される順序に配置された選択識別子を取得する第2取得プログラム命令群とを生成し、
    前記選択処理命令群は、前記第1取得プログラム命令群と、前記配列テーブルと、前記第2取得プログラム命令群とを含む
    ことを特徴とする請求項10に記載のプログラム変換装置。
  14. 前記更新処理命令群生成手段は、
    前記インデックスの値をインクリメントする前記更新処理命令群を生成する
    ことを特徴とする請求項13に記載のプログラム変換装置。
  15. 前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれかの状態を示す配列テーブルであり、
    前記選択処理命令群生成手段は、
    前記配列テーブルと、
    前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す値を算出する前記演算式と、
    前記配列テーブルと同一のテーブルテーブル内において、未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する取得プログラム命令群とを生成し、
    前記選択処理命令群は、前記配列テーブルと、前記演算式と、前記取得プログラム命令群とを含む
    ことを特徴とする請求項10に記載のプログラム変換装置。
  16. 前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記秘密保持プログラム生成手段は、さらに、
    前記複数のブロックのそれぞれが選択対象データに含まれた後、ブロックを含まない1つ以上の選択対象データに、1つ以上のプログラム命令を含む偽装ブロックを挿入する
    ことを特徴とする請求項5に記載のプログラム変換装置。
  17. 処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置であって、
    複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理実行手段と、
    前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、
    前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返す
    ことを特徴とする秘密処理装置。
  18. 前記複数の選択対象データのそれぞれは、1個以上のデータからなる
    ことを特徴とする請求項17に記載の秘密処理装置。
  19. 前記秘密処理は、秘匿すべき秘密情報を用いる代わりに、所定の処理を施して前記秘密情報を算出する処理であり、
    前記選択処理実行手段は、
    前記複数の選択パラメータを用いる演算式により前記選択識別子を算出し、
    前記更新処理実行手段は、
    前記選択識別子にて示される選択対象データの値に基づいて、前記複数の選択パラメータを更新し、
    前記秘密処理装置は、さらに、
    更新した複数の選択パラメータを用いた前記所定の処理により、前記秘密情報と同一の値を算出する変遷処理実行手段を備える
    ことを特徴とする請求項18に記載の秘密処理装置。
  20. 前記秘密処理は、外部装置により1つ以上のブロックに分割されたオリジナルプログラムを実行する処理であり、
    前記ブロックは1つ以上のプログラム命令を含み、
    前記複数の選択対象データのそれぞれは、異なるブロックを含む
    ことを特徴とする請求項17に記載の秘密処理装置。
  21. 前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記更新処理実行手段は、
    前記複数の選択対象データのそれぞれに対して、第j−1(jは2以上n以下の整数)の選択パラメータに格納されている値を第jの選択パラメータへ格納し、定数値を第1の選択パラメータに格納し、
    前記定数値は、前記演算式を用いて、次に実行される選択対象データを示す選択識別子が算出されるように、前記外部装置が前記秘密保持プログラム生成時に予め設定した値である
    ことを特徴とする請求項20に記載の秘密処理装置。
  22. 前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記演算式は、
    前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、選択識別子を算出し、
    Piとモジュロ値Nとは、互いに素である
    であることを特徴とする請求項21に記載の秘密処理装置。
  23. 前記選択処理実行手段は、
    未実行である選択対象データを示す識別子を、常に取得する
    ことを特徴とする請求項20に記載の秘密処理装置。
  24. 前記選択処理実行手段は、
    未実行である選択対象データを示す識別子を、前記複数の選択対象データのそれぞれについて実行済であるか否かを示す管理情報を用いて取得する
    ことを特徴とする請求項23に記載の秘密処理装置。
  25. 前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
    前記選択処理実行手段は、
    前記配列テーブルを保持し、
    前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、
    前記選択処理実行手段は、
    前記算出式にて算出された前記仮の選択識別子が示す選択対象データが、前記配列テーブルにおいて未実行であることを示す場合には、前記仮の選択識別子を次に実行すべきブロックを含む選択対象データを示す真の選択識別子とし、実行済であることを示す場合には、未実行である選択対象データを取得するまで予め決められた選択順序に基づき仮の選択識別子の取得を行い、
    Piとモジュロ値Nとは互いに素である
    ことを特徴とする請求項24に記載の秘密処理装置。
  26. 前記更新処理実行手段は、
    第j(jは2以上n以下の整数)の選択パラメータに格納されている値を第j−1の選択パラメータへ格納し、前記選択処理実行手段にて取得された前記真の選択識別子を第nの選択パラメータへ格納する
    ことを特徴とする請求項25に記載の秘密処理装置。
  27. 前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
    前記選択処理実行手段は、
    前記配列テーブルを保持し、
    1つの選択パラメータを示すインデックスを用いて、前記複数の選択パラメータから前記1の選択パラメータを取得する前記演算式を実行する第1取得部と、
    前記配列テーブルのうち未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記第1取得部にて取得された選択パラメータの値にて示される順序に配置された選択識別子を取得する第2取得部とを含む
    ことを特徴とする請求項24に記載の秘密処理装置。
  28. 前記更新処理実行手段は、
    前記インデックスの値をインクリメントする
    ことを特徴とする請求項27に記載の秘密処理装置。
  29. 前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    前記複数の選択パラメータは、第1から第nの選択パラメータであり、
    前記管理情報は、前記複数の選択対象データのそれぞれに対して、現時点における実行済若しくは未実行のいずれの状態を示す配列テーブルであり、
    前記選択処理実行手段は、
    前記配列テーブルを保持し、
    前記演算式は、前記第1から第nの選択パラメータのそれぞれに対して、Pi×第iの選択パラメータ(iは1以上n以下の整数)を算出し、算出した結果それぞれを加算し、加算結果に、前記所定の数をモジュロ値Nとするモジュロ演算を施し、次に実行すべきブロックを含む選択対象データを示す仮の選択識別子を算出する演算式であり、
    前記選択処理実行手段は、
    前記配列テーブルと同一のテーブルテーブル内において、未実行である1つ以上の選択対象データを示す選択識別子の配列順序に基づいて、前記演算式にて算出された前記値にて示される順序に配置された選択識別子を取得する
    ことを特徴とする請求項24に記載の秘密処理装置。
  30. 前記秘密処理は、前記外部装置により前記オリジナルプログラムから生成された秘密保持プログラムを実行する処理であり、
    前記選択対象データの個数は、前記ブロックの個数以上からなる所定の数であり、
    ブロックを含まない1つ以上の選択対象データには、1つ以上のプログラム命令を含む偽装ブロックが含まれ、
    前記秘密保持プログラムは、前記オリジナルプログラムより分割された各ブロックと、1つ以上の偽装ブロックとを含む
    ことを特徴とする請求項20に記載の秘密処理装置。
  31. オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置で用いられる変換方法であって、
    オリジナルプログラムを取得するプログラム取得ステップと、
    所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成ステップと、
    複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成ステップと、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成ステップと、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成ステップと、
    前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成ステップと
    を含むことを特徴とする変換方法。
  32. オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置で用いられる変換プログラムであって、
    コンピュータに対して、
    オリジナルプログラムを取得するプログラム取得ステップと、
    所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成ステップと、
    複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成ステップと、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成ステップと、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成ステップと、
    前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成ステップと
    を実行させることを特徴とする変換プログラム。
  33. 前記変換プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項32に記載の変換プログラム。
  34. 処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置で用いられる秘密処理方法であって、
    複数の選択パラメータのそれぞれに値を代入する前処理実行ステップと、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行ステップと、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理実行ステップと、
    前記選択処理実行ステップにて取得された選択識別子が示す選択対象データを処理する選択対象データ実行ステップと
    を含むことを特徴とする秘密処理方法。
  35. 実行順序が定まった複数の選択対象データを含み、解析が困難な秘密保持プログラムを実行する秘密処理装置で用いられる秘密処理プログラムであって、
    コンピュータに対して、
    複数の選択パラメータのそれぞれに値を代入する前処理実行ステップと、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行ステップと、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理実行ステップと、
    前記選択処理実行ステップにて取得された選択識別子が示す選択対象データを処理する選択対象データ実行ステップと
    を実行させることを特徴とする秘密処理プログラム。
  36. 前記秘密処理プログラムは、コンピュータ読み取り可能な記録媒体に記録されていることを特徴とする請求項35に記載の秘密処理プログラム。
  37. オリジナルプログラムから秘密保持プログラムを生成するプログラム変換装置の集積回路であって、
    オリジナルプログラムを取得するプログラム取得手段と、
    所定の順序で処理することにより、前記オリジナルプログラムと同一の実行結果を出力し、異なる選択識別子が対応付けられる複数の選択対象データを生成する選択対象データ生成手段と、
    複数の選択パラメータそれぞれに値を代入する前処理命令群を生成する前処理命令群生成手段と、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する命令群を含む選択処理命令群を生成する選択処理命令群生成手段と、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理命令群を生成する更新処理命令群生成手段と、
    前記前処理命令群と前記選択処理命令群と前記更新処理命令群と前記複数の選択対象データとを含み、前記選択処理命令群を実行する処理と、前記選択処理命令群により取得される選択識別子が示す選択対象データを処理する処理と、前記更新処理命令群を実行する処理とを繰り返す秘密保持プログラムを生成する秘密保持プログラム生成手段と
    を備えることを特徴とする集積回路。
  38. 処理順序が定まった複数の選択対象データを処理することにより、秘匿すべき秘密処理を実行する秘密処理装置の集積回路であって、
    複数の選択パラメータのそれぞれに値を代入する前処理実行手段と、
    前記複数の選択パラメータを用いた演算式に基づいて、次に処理される選択対象データを示す選択識別子を取得する選択処理実行手段と、
    選択パラメータの値に、過去に処理された選択対象データを示す選択識別子、又は前記選択パラメータに過去に代入された1つ以上の選択パラメータの値のうち少なくとも1つの選択パラメータの値を反映させる更新処理実行手段と、
    前記選択処理実行手段にて取得された選択識別子が示す選択対象データを処理する選択対象データ実行手段とを備え、
    前記秘密保持プログラムの終了とみなすまで、前記選択処理実行手段と、更新処理実行手段と、選択対象データ実行手段とによる処理を繰り返す
    ことを特徴とする集積回路。
JP2007514686A 2005-04-21 2006-04-21 プログラム変換装置及び秘密保持プログラム Active JP4235243B2 (ja)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
JP2005124115 2005-04-21
JP2005124115 2005-04-21
JP2005379128 2005-12-28
JP2005379128 2005-12-28
PCT/JP2006/308454 WO2006115217A1 (ja) 2005-04-21 2006-04-21 プログラム変換装置及び秘密保持プログラム

Publications (2)

Publication Number Publication Date
JPWO2006115217A1 JPWO2006115217A1 (ja) 2008-12-18
JP4235243B2 true JP4235243B2 (ja) 2009-03-11

Family

ID=37214832

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007514686A Active JP4235243B2 (ja) 2005-04-21 2006-04-21 プログラム変換装置及び秘密保持プログラム

Country Status (3)

Country Link
US (1) US20090217008A1 (ja)
JP (1) JP4235243B2 (ja)
WO (1) WO2006115217A1 (ja)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2006115219A1 (ja) * 2005-04-21 2006-11-02 Matsushita Electric Industrial Co., Ltd. プログラム難読化装置及び難読化方法
JP5300294B2 (ja) * 2008-03-25 2013-09-25 パナソニック株式会社 処理装置、難読化装置、プログラムおよび集積回路
EP2388730A1 (en) * 2010-05-17 2011-11-23 Nagravision S.A. Method for generating software code
US20130097431A1 (en) * 2011-10-18 2013-04-18 Paul Marion Hriljac Systems and methods of source software code modification
FR3011354A1 (fr) * 2013-10-01 2015-04-03 Commissariat Energie Atomique Procede d'execution par un microprocesseur d'un code binaire polymorphique d'une fonction predeterminee
US9600672B1 (en) * 2014-12-04 2017-03-21 Amazon Technologies, Inc. Dynamic function switching
US20160328539A1 (en) * 2015-05-05 2016-11-10 Nxp B.V. Obscuring Software Code With Split Variables
US11079909B2 (en) * 2016-12-23 2021-08-03 Salesforce.Com, Inc. Macro building tool with an information pane and a macro building pane for compiling an ordered macro and determining data dependency

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2267419B (en) * 1992-05-29 1996-11-27 Toshiba Kk Data processing apparatus
CA2293650C (en) * 1997-06-09 2012-09-25 Christian Sven Collberg Obfuscation techniques for enhancing software security
US6061449A (en) * 1997-10-10 2000-05-09 General Instrument Corporation Secure processor with external memory using block chaining and block re-ordering
JP3824121B2 (ja) * 1999-04-01 2006-09-20 株式会社日立製作所 暗号データの復号化処理方法および装置
US7430670B1 (en) * 1999-07-29 2008-09-30 Intertrust Technologies Corp. Software self-defense systems and methods
WO2001056221A2 (en) * 2000-01-31 2001-08-02 Vdg Inc. Block encryption method and schemes for data confidentiality and integrity protection
JP2002244989A (ja) * 2001-02-20 2002-08-30 Nec Corp デバイスドライバ作動方法
CA2348355A1 (en) * 2001-05-24 2002-11-24 Cloakware Corporation General scheme of using encodings in computations
US7895643B2 (en) * 2002-03-16 2011-02-22 Trustedflow Systems, Inc. Secure logic interlocking
US7383443B2 (en) * 2002-06-27 2008-06-03 Microsoft Corporation System and method for obfuscating code using instruction replacement scheme
JP2004265194A (ja) * 2003-03-03 2004-09-24 Matsushita Electric Ind Co Ltd 情報処理装置、および情報処理方法
US7346160B2 (en) * 2003-04-23 2008-03-18 Michaelsen David L Randomization-based encryption apparatus and method
EP1733502B1 (fr) * 2004-03-29 2009-09-30 Stmicroelectronics Sa Processeur d'execution d'un algorithme de type aes
US7885405B1 (en) * 2004-06-04 2011-02-08 GlobalFoundries, Inc. Multi-gigabit per second concurrent encryption in block cipher modes
US7330982B1 (en) * 2004-06-14 2008-02-12 Avaya Technology Corp. Secured automated process for signed, encrypted or validated content generation
CN1977531A (zh) * 2004-06-28 2007-06-06 松下电器产业株式会社 程序生成装置、程序测试装置、程序执行装置及信息处理系统
JP4549303B2 (ja) * 2005-02-07 2010-09-22 株式会社ソニー・コンピュータエンタテインメント パイプラインを用いてメッセージ認証コードを提供する方法および装置

Also Published As

Publication number Publication date
JPWO2006115217A1 (ja) 2008-12-18
US20090217008A1 (en) 2009-08-27
WO2006115217A1 (ja) 2006-11-02

Similar Documents

Publication Publication Date Title
JP4235243B2 (ja) プログラム変換装置及び秘密保持プログラム
JP4806402B2 (ja) プログラム難読化装置及び難読化方法
JP2012512443A (ja) コードの難読化のための方法及び装置
US6577982B1 (en) Model-based testing via combinatorial designs
US7739511B2 (en) Systems and methods for watermarking software and other media
KR101183432B1 (ko) 다수의 필드를 갖는 데이터를 안전하게 하기 위한 방법,시스템 및 컴퓨터-액세스가능 매체
Chatzikonstantinou et al. Evaluation of cryptography usage in android applications
US8225077B2 (en) Obfuscation device for generating a set of obfuscated instructions, processing device, method, program, and integrated circuit thereof
US7210126B2 (en) Using identifiers and counters for controlled optimization compilation
JP6533583B2 (ja) モデル結託防止用透かし
JP6904043B2 (ja) 未知のプログラムバイナリのための入力発見
US10613842B2 (en) Simplifying a control flow graph based on profiling data
Pham et al. Towards systematic and dynamic task allocation for collaborative parallel fuzzing
CN104572262A (zh) 一种任务执行方法和装置
Mycroft et al. Unavoidable trees in tournaments
CN100565541C (zh) 程序变换装置和变换方法
Kähkönen et al. Testing programs with contextual unfoldings
CN114254400B (en) Method and system for defending overflow attack of stack buffer based on dynamic shadow stack
JP2021068097A (ja) 脆弱性分析装置
Anckaert et al. Covert communication through executables
JP5356583B2 (ja) 半導体記憶装置
CN108897994B (zh) 隐藏导入表的方法、装置、存储介质和计算机设备
KR20090072620A (ko) 메모리 해킹 차단 방법 및 시스템
Williams Oblivious remote data access made practical
CN117668934A (zh) 一种基于大数据的区块链数据存储方法和装置

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20081010

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20081118

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20081212

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111219

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Ref document number: 4235243

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111219

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121219

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121219

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131219

Year of fee payment: 5