説明

符号化方法およびそのプログラム

【課題】 元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する。
【解決手段】 プログラム中の変数を演算装置によって線形変換して符号化を施す符号化方法であって、符号化を施すn個(但し、nは正整数)の変数を任意に選択するステップと、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成するステップと、生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数に符号化するステップとを有する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラム中の変数を線形変換して符号化を施す、符号化方法およびそのプログラムに関する。
【背景技術】
【0002】
ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵など、利用者に対して秘密にすべき情報が含まれる場合がある。一方では、ソフトウェアを解析するための技術(RE:Reverse Engineering)が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【0003】
変数の符号化によるソフトウェアの難読化として、ソースコード中の変数を線形変換により符号化する方法が提案されている(例えば、非特許文献1参照)。この方法では、単一の変数xを線形変換により、変数X(=ax+b)に符号化することで、ソフトウェアの解析を難しくすることを意図するものである。ここでは、線形変換の際に用いる整数a,bが秘密鍵となる。この方法では、ソースコード中の変数の値や演算を隠蔽することを目的としている。
【非特許文献1】佐藤他、信学技報、Vol.IT‐2002−49,pp.13−18,Mar.2002“データの符号化と演算子の変換によるプログラムの難読化手法”
【発明の開示】
【発明が解決しようとする課題】
【0004】
前記した非特許文献1に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。
【0005】
本発明は上記事情に鑑みてなされたものであり、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する、符号化方法およびそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【0006】
上記した課題を解決するために本発明は、プログラム中の変数を演算装置によって線形変換して符号化を施す符号化方法であって、前記符号化を施すn個(但し、nは正整数)の変数を任意に選択するステップと、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成するステップと、前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化するステップと、を有することを特徴とする。
【0007】
また、本発明は、プログラム中の変数を線形変換して符号化を施す符号化装置に用いられるプログラムであって、前記符号化を施すn個(但し、nは正整数)の変数を任意に選択する処理と、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成する処理と、前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する処理と、をコンピュータに実行させることを特徴とする。
【発明の効果】
【0008】
本発明によれば、プログラム中のn個の変数を線形変換により同時にm個の整数に符号化するため、プログラム中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【発明を実施するための最良の形態】
【0009】
図1は、本発明実施形態に係わるの符号化方法の概略手順を示すフローチャートである。
本発明の符号化方法は、符号化を施すn個(但し、nは正の整数)の変数を任意に選択し、m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成して変換鍵とし、n個の変数を線形変換して同時にm個の整数に符号化することを特徴とするものであり、これを実現するために、図1に示されるように、符号化を施すn個の変数を選択する難読化対象選択処理(S11)からはじまり、秘密鍵の生成(S12)、変化式の定義(S13)、復号式の導出(S14)、変数の置換(S15)、後処理(S16)、判定(S17)の各ステップを順次実行する。以下にステップ毎の詳細手順の説明を行う。
【0010】
(S11:難読化対象の選択処理)
まず、プログラムの中から、難読化の対象として符号化を施すn個(nは整数数)の変数を任意に選択する。この操作で選ばれたn個の変数x1,x2…,xn,とする。
(S12:秘密鍵の生成処理)
ここでは、m×n型行列A、m次元ベクトルcを任意に生成し、これらを秘密鍵とする。但し、mは、m≧nなる正整数である。
【0011】
(S13:変換式の定義処理)
次に、生成した行列Aおよびベクトルcを用いて以下の変換式(1)を定義する。
【0012】
【数1】

【0013】
ここで、X1,X2,…,Xmは、難読化後のソフトウェアで用いられる符号化されたm個の変数である。
【0014】
(S14:復号式の導出処理)
上記した変換式をn個の変数x1,x2,…,xnに関するm本の連立方程式と見なし、それぞれの変数について解く。その結果、それぞれの変数x1,x2,…,xnに関して以下の(2)で示す復号式が成立する。
【0015】
【数2】

【0016】
この復号式により、元のプログラム中のそれぞれの変数x1,x2,…,xnの値が、復号化された変数X1,X2,…Xmを用いて表すことが可能になる。
この手順では、m本の連立方程式から、n個の変数x1,x2…xnの値を求める。このため、符号化された変数X1,X2,…Xmの間には、m‐n個の自明でない以下の関係式(3)が成り立つことになる。
【0017】
【数3】

【0018】
この自明でない関係式を用いることにより、上記の復号式における各変数X1,X2,…,Xmの係数を可変とすることができる。
【0019】
(S15:変数の置き換え処理)
プログラム中で用いられている変数x1,x2,…,xnを以下の規則に従い、符号化された変数X1,X2,…Xmで置き換える。
(a)変数xiへの代入命令への置き換え
アリゴリズム中の変数xiに対する代入命令xi←uを、以下の演算式(4)で示されるように、変数X1,X2,…XMに対する代入命令に置き換える。
【0020】
【数4】

【0021】
この代入命令が実行されると、符号化されたm個全ての変換X1,X2,…Xmが、同時に変更される。
(b)参照されている変数xjの置き換え
プログラム中で参照されている変数xjを、S14の処理で求めた復号式xj(X1,X2,…Xm)を用いて、変数X1,X2,…Xmの式に置き換える。
【0022】
(S16:後処理)
後処理として、符号化された変数X1,X2,…,Xmへの初期値を与える。また、連続する変数X1,X2,…Xmへの代入命令のマージを行う。
(a)符号化された変数への初期値代入
上記したS15(a)、(b)の処理により、プログラム中の変数x1,x2,…,xnは全てX1,X2,…,Xmで置き換えられる。これらの変数の初期値は、自明でない関係式f1,f2,…fm‐nを満たす任意の整数とする。
(b)連続する代入命令のマージ
S15(b)の処理により生成された、符号化された変数X1,X2,…Xmへの代入命令の中で、連続するものをマージする。
【0023】
(S17:判定処理)
プログラムの解析が十分に困難であると判定されれば、難読化処理を終了する。さらなる難読化が必要であると判定されれば、S11からS16までの処理を繰り返す。
【0024】
以下に、本発明の符号化方法をC言語で記述されたソースコードに適用した場合の具体的事例を引用して説明する。
図2は、入力された整数数nに対し、nの階乗を出力するプログラムのソースコードである。図2のプログラムの本質的な部分を取り出すと、図3に示すアルゴリズムになる。このアルゴリズムに対して本名発明を以下のように適用する。
【0025】
(S11:難読化対象の選択処理)
上記したアルゴリズム中では、3つの変数x,yおよびnが用いられている。ここでは、2つの変数x,yを符号化するものとする。
(S12:秘密鍵の生成処理)
ここでは、3×2型行列Aおよび3次元ベクトルcを秘密鍵とする。これは以下の式(5)で示される。
【0026】
【数5】

【0027】
(S13:変換式の定義処理)
生成した行列Aおよびベクトルcを用いて以下の変換式(6)が得られる。
【0028】
【数6】

【0029】
ここで、X,Y,Zは、難読化後のプログラムで用いられる符号化された変数である。
【0030】
(S14:復号式の導出処理)
S13の処理で定義した変数を2つの変数x,yに関する3本の連立方程式と見なし、それぞれの変数について解く。その結果、それぞれの変数に対する以下の復号式(7)が得られる。
【0031】
【数7】

【0032】
この復号式により、元のプログラムの変数x,yの値を、符号化された変数X,Y,Zを用いて表すことが可能になる。ここで、k1,k2は任意定数である。また、3本の連立方程式から2個の変数の値が求まるためには、符号化された変数X,Y,Zの間には1つの自明でない以下の関係式5X−13Y+14Z+45=0が成り立つ必要がある。
このため、2つの復号式x(X,Y,Z)、y(X,Y,Z)には、それぞれ任意定数k1,k2が含まれているが、一意にxおよびyが求まる。
【0033】
(S15:変数の置き換え処理)
アルゴリズム中で用いられている変数x,yを、以下の規則に従い、符号化されて変数X,Y,Zで置き換える。
(a)変数x,yに対する代入命令の置き換え
アルゴリズム中の変数x,yに対する代入命令x←u,y←uを、それぞれ以下の演算式(8)ように、変数X,Y,Zに対する代入命令に置き換える。
【0034】
【数8】

【0035】
この代入命令が実行されると、符号化された全ての変数X,Y,Zが、同時に変更される。アルゴリズム中では、図4に示すように、4個所で変数x,yに対する代入が行われている。これらの代入命令を、上記の符号化された変数X,Y,Zに対する代入命令で置き換えたアルゴリズムを図5に示す。
【0036】
(b)参照されている変数x,yの置き換え
プログラム中で参照されている変数x,yを、S14の処理で求めた復号式x=x(X,Y,Z)、y=y(X,Y,Z)を用いて、符号化された変数X,Y,Zに置き換える。この際、任意定数k1,k2には、具体的な任意の数値を代入しておく。
アルゴリズム中では、図6に示すように、7個所で変数xおよびyが参照されている。これからの参照されている変数x,yを、復号式を用いて変数X,Y,Zに置き換えると、図7のようなアルゴリズムが得られる。さらに、式を整理すれば図8のようなアルゴリズムが得られる。
以上のS15(a)、S15(b)の処理により、アルゴリズム中の変数x,yは全てX,Y,Zに置き置き換えられる。
【0037】
(S16:後処理)
後処理として、符号化された変数X,Y,Zへの初期値を与える。また、連続する代入命令のマージを行う。
(a)変数X,Y,Zへの初期値代入命令の追加
変数X,Y,Zには、自明でない関係5X−13Y+14Z+45=0を満たす任意の初期値を与える。ここでは、X,Y,Zにそれぞれ、初期値−7,4,3を与える。初期値が与えられたアルゴリズムを、図9に示す。
(b)連続する代入命令のマージ
S15(b)の処理により生成された、変数X,Y,Zに対する代入命令の中で、連続する命令をマージする。
図10に示すように、アルゴリズム中には、連続する変数X,Y,Zの代入命令が2個所ある。これらの命令をマージしたアルゴリズムを図11に示す。
【0038】
(S17:判定処理)
そして、アルゴリズムの解析が、十分に困難になっているかどうかを判定する。ここでは、十分に困難になっているものとし、難読化処理を終了する。最終的に得られるアルゴリズムは、図11のようになる。このアルゴリズムを実現するC言語のソースコードを図12に示す。難読化後のソースコードは、図2に示される難読化前のソースコードと比較し、可読性が著しく低下している。
【0039】
以上詳細に説明したように、本発明の符号化方法およびそのプログラムは、行列およびベクトルを秘密鍵として、複数の変数を同時に符号化することを特徴とするものであり、プログラム中のn個の変数を線形変換により同時にm個の整数に符号化するため、元のプログラムで用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。
なお、本発明によれば、CやJava(登録商標)など高級言語のソースコードから、携帯端末等で利用されているものを含む各種プロセッサの機械語まで、幅広いソフトウェアに適用可能である。
【0040】
なお、上記した本発明実施形態は、演算装置、もしくはコンピュータにより実現されるものであり、特に、後者によれば、S11〜A17のそれぞれで実行される手順を含むプログラムをコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行することによって本発明の符号化方法を実現するものである。ここでいうコンピュータとは、OSや周辺機器等のハードウェアを含む。
また、「コンピュータ」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものであってもよい。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。更に、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のシステムやクライアントとなるコンピュータシステム内部の揮発性メモリ(RAM)のように、一定時間プログラムを保持しているものも含むものとする。
【0041】
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0042】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【0043】
【図1】本発明実施形態に係わる符号化方法の実行手順を示す図である。
【図2】難読化前のソースコードの一例を示す図である。
【図3】難読化前のソースコードから抜き出した本質的なアルゴリズムを示す図である。
【図4】アルゴリズム中の変数x,yに対する代入命令を示す図である。
【図5】変数x,yに対する代入命令を、符号化された変数X,Y,Zに対する代入命令に置き換えたアルゴリズムを示す図である。
【図6】アルゴリズム中で参照されている変数x,yを示す図である。
【図7】参照されている変数x,yを符号化された変数X,Y,Zで置き換えたアルゴリズムを示す図である。
【図8】図7を整理したアルゴリズムを示す図である。
【図9】変数X,Y,Zへの初期値の代入命令を追加したアルゴリズムを示す図である。
【図10】連続する変数X,Y,Zへの代入命令を示す図である。
【図11】最終的に得られるアルゴリズムを示す図である。
【図12】難読化後のソースコードの一例を示す図である。

【特許請求の範囲】
【請求項1】
プログラム中の変数を演算装置によって線形変換して符号化を施す符号化方法であって、
前記符号化を施すn個(但し、nは正整数)の変数を任意に選択するステップと、
m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成するステップと、
前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化するステップと、
を有することを特徴とする符号化方法。
【請求項2】
プログラム中の変数を線形変換して符号化を施す符号化装置に用いられるプログラムであって、
前記符号化を施すn個(但し、nは正整数)の変数を任意に選択する処理と、
m×nの行列(但し、mは、m≧nの正整数)およびm次元の任意のベクトルを生成する処理と、
前記生成した行列およびベクトルを変換鍵として前記n個の変数を線形変換して同時にm個の整数を符号化する処理と、
をコンピュータに実行させるプログラム。


【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate


【公開番号】特開2006−79347(P2006−79347A)
【公開日】平成18年3月23日(2006.3.23)
【国際特許分類】
【出願番号】特願2004−262676(P2004−262676)
【出願日】平成16年9月9日(2004.9.9)
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】