説明

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

【課題】プログラム全体の計算効率の低下と計算可能範囲が減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化する符号化方法を提供することを目的とする。
【解決手段】プログラムから符号化の対象となる変数をn個(nは2以上の正の整数)選択し、選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する。n個の独立な符号化関数からなる符号化式をn個の変数について演算し、n個の変数に対応した符号化されたn個の変数を求め、この符号化されたn個の変数を用いて、符号化前のn個の変数を表し、次いで、符号化された変数に初期値を与え、連続する代入命令のマージを実行する。

【発明の詳細な説明】
【技術分野】
【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に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。さらに、上記の方法は、単一の変数を一次変数により符号化する方式であり、符号化された1つ変数に対して、対応する符号化前の変数が1つ存在する。このため、攻撃者が1つの変数の復号式を入手できれば、その変数に対する符号化を解くことができるという問題があった。
【0005】
上記の問題点に対して、プログラムに含まれる複数の変数を同時に符号化する難読化手法も考えられる。この方式の場合、1つの復号式には、符号化された変数が複数存在するため、単一の復号式からは、符号化前の変数と符号化された変数の関係を得ることはできない。このため、攻撃者が1つの変数の復号式を入手したとしても、その変数に対する符号化を解くことはできないという利点がある。
【0006】
しかし、上記の方式では、変数の符号化・復号の演算が複雑であり、難読化を適用することにより、プログラム全体の計算効率が大きく低下し、さらに、符号化による桁上がりが生じるために、計算可能範囲が小さくなる可能性があった。
【0007】
本発明は上記事情に鑑みてなされたものであり、プログラム全体の計算効率の低下と計算可能範囲の減少を防止しつつ、プログラムに含まれる秘密情報を秘匿化する符号化方法およびそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
上記した課題を解決するために本発明は、以下の事項を提案している。
請求項1に係る発明は、プログラム内の複数の変数を符号化する符号化方法であって、前記プログラムから符号化の対象となる変数をn個(nは正の整数)選択する第1のステップと、該選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する第2のステップと、該n個の独立な符号化関数からなる符号化式を前記選択したn個の変数について演算し、前記選択したn個の変数に対応した符号化されたm個の変数を求める第3のステップと、前記符号化されたm個の変数を用いて、前記選択したn個の変数を表す第4のステップと、該符号化された変数に初期値を与え、連続する代入命令のマージを実行する第5のステップとを、有することを特徴とする。
【0009】
請求項2に係る発明は、請求項1に記載の符号化方法について、前記第4のステップが、前記選択したn個の変数に対する代入命令を符号化されたm個の変数に対する代入命令に置き換えるステップと、前記選択したn個の変数のそれぞれを前記第3のステップで求めた符号化されたm個の変数に置き換えるステップと、をさらに有することを特徴とする。
【0010】
請求項3に係る発明は、請求項1に記載の符号化方法について、前記第5のステップが、前記符号化された変数にm−n個の自明でない関係式を満たす任意の値を初期値として与えることを特徴とする。
【0011】
請求項4に係る発明は、プログラム内の複数の変数を符号化する符号化装置に用いられるプログラムであって、前記プログラムを記憶装置に格納し、該格納したプログラムから符号化の対象となる変数をn個(nは正の整数)選択する第1のステップと、該選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する第2のステップと、演算装置により該n個の独立な符号化関数からなる符号化式を前記選択したn個の変数について演算し、前記選択したn個の変数に対応した符号化されたm個の変数を求める第3のステップと、前記符号化されたm個の変数を用いて、前記選択したn個の変数を表す第4のステップと、該符号化された変数に初期値を与え、連続する代入命令のマージを実行する第5のステップとを、有することを特徴とする。
【0012】
請求項5に係る発明は、請求項4に記載のプログラムについて、前記第4のステップが、前記選択したn個の変数に対する代入命令を符号化されたm個の変数に対する代入命令に置き換えるステップと、前記選択したn個の変数のそれぞれを前記第3のステップで求めた符号化されたm個の変数に置き換えるステップと、をさらに有することを特徴とする。
【0013】
請求項6に係る発明は、請求項4に記載のプログラムについて、前記第5のステップが、前記符号化された変数にm−n個の自明でない関係式を満たす任意の値を初期値として与えることを特徴とする。
【発明の効果】
【0014】
本発明によれば、元のソフトウェア中のn個の変数を、排他的論理和演算により同時にm個の変数に符号化するため、元のソフトウェア中で用いられている変数の個数、変数の初期値、変数が保持する値等を隠蔽することが可能であるという効果がある。また、変数の符号化に伴い、行われる演算も変更されるためプログラムに含まれるアルゴリズムも同時に隠蔽できるという効果がある。
【0015】
さらに、本発明によれば、複数の変数を同時に符号化するため、1つの変数の復号式が仮に、入手されたとしても、その変数を復号することはできないという効果がある。また、変数の符号化および復号ともに排他的論理和演算のみで行うことから、実行効率の低下が小さく、排他的論理和の演算が桁上がりを生じない演算であるため、変数の符号化により計算可能な範囲が制限されることがないという効果がある。
【発明を実施するための最良の形態】
【0016】
以下、図面を用いて本発明の実施形態について説明する。
図1は、本発明の実施形態に係わる符号化方法の概略手順を示すフローチャートである。
本発明の符号化方法は、プログラムから符号化の対象となるn個の変数を選択し、この変数に対して、m個の符号化式を定義し、この符号化式に含まれるn個の独立な式を解いて、n個の復号式を導出する。そして、導出された復号式を用いて、変数命令の符号化を行った後、後処理を行うことを特徴とするものであり、これを実現するために、図1に示されるように、各ステップを順次実行する。以下にステップ毎の詳細手順の説明を行う。
【0017】
(S1:符号化対象の選択)
まず、プログラムの中から、難読化の対象として符号化を施すn個(nは正の整数)の変数を任意に選択する。この操作で選ばれたn個の変数x_1,x_2…,x_n,とする。
(S2:符号化式の定義)
m個(ただし、mは正の整数であり、なおかつm≧nであるものとする)の復号式E_1、E_2、・・・、E_mを以下の数1のように定義する。ここで、X_1、X_2、・・・、X_mは、符号化された変数である。
【0018】
【数1】

【0019】
また、符号化関数E_1、E_2、・・・、E_mは、符号化前の変数x_1、x_2、・・・、x_nおよび任意の定数との排他的論理和をとったものである。つまり、復号式E_1は、C_1を定数とすると、数2のようになる。
【0020】
【数2】

【0021】
また、m個の符号化関数E_1、E_2、・・・、E_mは任意に定義することが可能であるが、m個の関数のうちn個の関数は独立である必要がある。
【0022】
ここで、n個の関数f_1、f_2、・・・、f_nが独立であるとは、関数f_1、f_2、・・・、f_nが従属でないということであり、n個の関数f_1、f_2、・・・、f_nが従属であるということは、f_(i_1)xor f_(i_2)xor ・・・f_(i_k)=Cとなるような正の整数列1≦i_1<i_2<・・・<i_k≦n(1≦k≦n)、および定数Cが存在すると定義する。
【0023】
上記のような符号化式を用いることにより,プログラムに含まれる変数x_1、x_2、・・・、x_nに対する代入命令を符号化された変数X_1、X_2、・・・、X_mに対する代入命令に置き換えることができる。
【0024】
(S3:復号式の導出)
上記S2で定義した符号化式に含まれるn個の独立な式を、連立方程式と見なし、変数x_1、x_2、・・・、x_nについて解き、以下、数3に示すようなn個の復号式を得る。復号式を用いることにより,プログラムに含まれる変数x_1、x_2、・・・、x_nに対する参照を、符号化された変数X_1、X_2、・・・、X_mに対する参照に置き換えることができる。
【0025】
【数3】

【0026】
ただし、復号関数D_1、D_2、・・・、D_nは、X_1、X_2、・・・、X_mおよび任意の定数のうちのいくつかの排他的論理和をとったものであり、S2で定義された符号化関数E_1、E_2、・・・、E_mに依存する。この得られたn個の復号式を残りのm−n個の方程式に代入することにより、m−n個の自明でない関係式が得られる。なお、ここで、自明でない関係式とは、符号化された変数X_1、X_2、・・・、X_mが満たすべき関係式である。この関係式を用いると、1つの変数の復号式を2^{m−n}通りに表現することができ、どの変数が復号されているかを特定することを難しくすることができる。
【0027】
(S4:変数命令の符号化)
プログラムで用いられている符号化前の変数x_1、x_2、・・・、x_n を以下の手順に従って、全て符号化された変数X_1、X_2、・・・、X_m に置き換える。
【0028】
(a)代入命令の符号化
符号化前の変数x_i に対する代入命令x_i←v を以下、数4に示される符号化された変数X_1、X_2、・・・、X_m に対する代入命令に置き換える。
【0029】
【数4】

【0030】
(b)参照されている変数の符号化
プログラム中で参照されている符号化前の変数x_iをS3で求めた復号式D_i(X_1、X_2、・・・、X_m)で置き換える。
【0031】
(S5:後処理)
後処理として、符号化された変数に初期値を与える。また、連続する代入命令のマージを行う。
【0032】
(a)符号化された変数への初期値代入命令の追加
符号化された変数X_1、X_2、・・・、X_mには、m−n個の自明でない関係式を満たす任意の値を初期値として代入する。
【0033】
(b)連続する代入命令のマージ
S4で生成された代入命令の中で、連続しているものをマージする。具体的には、数5のような連続する2命令は、数6のような1つの命令にマージされる。
【0034】
【数5】

【0035】
【数6】

【0036】
以上のS1からS5の処理を繰り返すことによって、プログラムを順次難しくしていくことができる(S6)。
【0037】
上記の処理を図2から図6を用いて、より具体的に説明する。
ここでは、図2に示される1からnまでの和を求めるプログラムの擬似コードを難読化する場合の処理手順を例にとって説明する。
まず、図2に示すプログラムに含まれる2つの変数x、yを符号化の対象として選択する。次に、数7に示す3つの符号化式を定義する。
【0038】
【数7】

【0039】
ここで、X、YおよびZは難読化後のプログラム中で用いられる符号化された変数であり、関数E_1、E_2およびE_3が符号化関数となる。また、符号化関数E_1とE_2とは独立である。
【0040】
次に、独立な符号化関数を含む2個の連立方程式を、変数x、yについて解く。ここでは、符号化関数E_1とE_2が独立であるので、数7の式(1)と式(2)を連立する。この結果、以下、数8で示す2つの復号式が得られる。なお、数8において、D_1およびD_2は復号関数である。
【0041】
【数8】

【0042】
また、得られた数8に示す復号式を、復号式の導出に用いられなかった数7の符号化式(3)に代入することにより、以下、数9に示す自明でない関係式が得られる。
【0043】
【数9】

【0044】
数9に示す自明でない関係式を利用することにより、変数x、yの符号式を以下、数10に示す2通りに表現することができる。
【0045】
【数10】

【0046】
次に、プログラムで用いられている元の変数xおよびyを以下の手順で、全て符号化された変数X、YおよびZに置き換える。
【0047】
(a)代入命令の符号化
変数xに対する代入命令x←uを以下、数11に示される符号化された代入命令に置き換える。また、変数yに対する代入命令をy←vを以下、数12に示される符号化された代入命令に置き換える。この結果、得られるプログラムの擬似コードを図3に示す。
【0048】
【数11】

【0049】
【数12】

【0050】
(b) 参照されている変数の符号化
プログラム中で参照されている変数xおよびyをそれぞれ復号式D_1(X、Y、Z)およびD_2(X、Y、Z)で置き換える。なお、数10に示すように、復号式の表現方法には2通りある。ここでは、任意の表現を選択して置き換える。この結果、得られるプログラムの擬似コードを図4に示す。
【0051】
次に、変数X、YおよびZに自明でない数9を満たす以下の初期値を与える。
X=110250890, Y=−2357829, Z=−2357829
この結果、得られるプログラムの擬似コードを図5に示す。そして、最後に、連続する代入命令のマージを行う。この最終的に得られるプログラムの擬似コードを図6に示す。このようにして、実際の処理においては、プログラムの難読化が実行される。
【0052】
ここまで、具体的な事例を用いて説明したが、符号化前のプログラムである図2と符号化後のプログラムである図6とを比較すると、プログラムの本質的な中身を変えることなく、難読化を行い、プログラム内の秘密情報を秘匿化できていることがわかる。
【0053】
以上、説明したように、本実施形態においては、元のソフトウェア中で用いられている変数の個数、変数の初期値、変数が保持する値等を隠蔽することが可能である。また、符号化、復号処理がともに排他的論理和演算のみで実行されるため、桁上がりの発生がない。したがって、実行効率の低下が小さく、計算可能な範囲が制限されることもない。
【0054】
なお、本発明によれば、CやJava(登録商標)など高級言語のソースコードから、携帯端末等で利用されているものを含む各種プロセッサの機械語まで、幅広いソフトウェアに適用可能である。
【0055】
また、上記した本発明の実施形態は、演算装置、もしくはコンピュータにより実現されるものであり、特に、後者によれば、S1〜S5のそれぞれで実行される手順を含むプログラムをコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行することによって本発明の符号化方法を実現するものである。ここでいうコンピュータとは、OSや周辺機器等のハードウェアを含む。
【0056】
また、「コンピュータ」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものであってもよい。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。更に、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のシステムやクライアントとなるコンピュータシステム内部の揮発性メモリ(RAM)のように、一定時間プログラムを保持しているものも含むものとする。
【0057】
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように情報を伝送する機能を有する媒体のことをいう。
【0058】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。
さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組
み合わせで実現できるもの、いわゆる差分ファイル(差分プログラム)であっても良い。
【0059】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこ
の実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれ
る。
【図面の簡単な説明】
【0060】
【図1】本発明の実施形態に係わる符号化方法の実行手順を示す図である。
【図2】符号化処理前のプログラムの擬似コードを示す図である。
【図3】代入命令の符号化を図2のプログラムに実行した場合の擬似コードを示す図である。
【図4】参照されている変数の符号化をさらに実行した場合の擬似コードを示す図である。
【図5】変数に初期値を与えた場合の擬似コードを示す図である。
【図6】すべての符号化処理を実行して最終的に得られる擬似コードを示した図である。

【特許請求の範囲】
【請求項1】
プログラム内の複数の変数を符号化する符号化方法であって、
前記プログラムから符号化の対象となる変数をn個(nは正の整数)選択する第1のステップと、
該選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する第2のステップと、
該n個の独立な符号化関数からなる符号化式を前記選択したn個の変数について演算し、前記選択したn個の変数に対応した符号化されたm個の変数を求める第3のステップと、
前記符号化されたm個の変数を用いて、前記選択したn個の変数を表す第4のステップと、
該符号化された変数に初期値を与え、連続する代入命令のマージを実行する第5のステップとを、
有することを特徴とする符号化方法。
【請求項2】
前記第4のステップが、前記選択したn個の変数に対する代入命令を符号化されたm個の変数に対する代入命令に置き換えるステップと、
前記選択したn個の変数のそれぞれを前記第3のステップで求めた符号化されたm個の変数に置き換えるステップと、
をさらに有することを特徴とする請求項1に記載の符号化方法。
【請求項3】
前記第5のステップが、前記符号化された変数にm−n個の自明でない関係式を満たす任意の値を初期値として与えることを特徴とする請求項1に記載の符号化方法。
【請求項4】
プログラム内の複数の変数を符号化する符号化装置に用いられるプログラムであって、
前記プログラムを記憶装置に格納し、該格納したプログラムから符号化の対象となる変数をn個(nは正の整数)選択する第1のステップと、
該選択したn個の変数と任意の定数との排他的論理和からなる符号化関数により、n個の独立した符号化関数を含むm個(mは正の整数であり、m≧n)の符号化式を定義する第2のステップと、
演算装置により該n個の独立な符号化関数からなる符号化式を前記選択したn個の変数について演算し、前記選択したn個の変数に対応した符号化されたn個の変数を求める第3のステップと、
前記符号化されたn個の変数を用いて、前記選択したn個の変数を表す第4のステップと、
該符号化された変数に初期値を与え、連続する代入命令のマージを実行する第5のステップとを、
をコンピュータに実行させるためのプログラム。
【請求項5】
前記第4のステップが、前記選択したn個の変数に対する代入命令を符号化されたm個の変数に対する代入命令に置き換えるステップと、
前記選択したn個の変数のそれぞれを前記第3のステップで求めた符号化されたn個の変数に置き換えるステップと、
をさらに有することを特徴とする請求項4に記載のプログラム。
【請求項6】
前記第5のステップが、前記符号化された変数にm−n個の自明でない関係式を満たす任意の値を初期値として与えることを特徴とする請求項4に記載のプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2007−79916(P2007−79916A)
【公開日】平成19年3月29日(2007.3.29)
【国際特許分類】
【出願番号】特願2005−266608(P2005−266608)
【出願日】平成17年9月14日(2005.9.14)
【出願人】(000208891)KDDI株式会社 (2,700)
【Fターム(参考)】