(57)【要約】【課題】整数値に限らず、その適用範囲が広く、かつ、条件分岐の解析が困難なプログラム難読化方法およびプログラムを提供することを目的とする。【解決手段】ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるとともに、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加し、制御変数を符号化する。更に、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成する。【選択図】図１
2008090668.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法であって、
プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、
前記制御変数を符号化する第２のステップと、
非自明な関係式を用いて、架空の条件分岐を生成する第３のステップと、
を備えたことを特徴とするプログラム難読化方法。
【請求項２】
前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、
該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、
前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、
ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、
前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、
を備えたことを特徴とする請求項１に記載のプログラム難読化方法。
【請求項３】
前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、
を備えたことを特徴とする請求項１または請求項２に記載のプログラム難読化方法。
【請求項４】
前記第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成することを特徴とする請求項１から請求項３のいずれかに記載のプログラム難読化方法。
【請求項５】
プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法をコンピュータに実行させるためのプログラムであって、
プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、
前記制御変数を符号化する第２のステップと、
非自明な関係式を用いて、架空の条件分岐を生成する第３のステップと、
を備えたことを特徴とするプログラム。
【請求項６】
前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、
該切り出したブロックの実行順序を制御するための制御変数を宣言するステップと、
前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、
ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、
前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、
を備えたことを特徴とする請求項５に記載のプログラム。
【請求項７】
前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択する第ステップと、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、
を備えたことを特徴とする請求項５または請求項６に記載のプログラム。
【請求項８】
前記第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成することを特徴とする請求項５から請求項７のいずれかに記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法およびプログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵等、利用者に対して秘密にすべき情報が含まれる場合がある。一方で、ソフトウェアを解析するための技術（ＲＥ：Ｒｅｖｅｒｓｅ  Ｅｎｇｉｎｅｅｒｉｎｇ）も数多く開発されているのが現状である。このため、これらの技術によりソフトウェアが解析されると、不正な者に秘密情報が入手されるという脅威が考えられる。
【０００３】
こうした脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。例えば、変数の符号化によるソフトウェアの難読化として、ソースコード中の変数を線形変換により符号化する方法が提案されている（例えば、非特許文献１参照。）。この方法では、単一の変数ｘを線形変換により、変数Ｘ（＝ａｘ＋ｂ）を符号化することで、ソフトウェアの解析を難しくすることを意図するものであり、ここでは、線形変換の際に用いる整数ａ，ｂが秘密鍵となる。また、この方法では、ソースコード中の変数の値や演算を隠蔽することを目的としている。
【０００４】
また、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する技術も開示されている（例えば、特許文献１参照。）。更に、非特許文献２には、解析困難な条件分岐を構成する方法が開示されている。また、非特許文献２には、条件式の特殊性に着目し、パターンマッチングによって、Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅを検出するという試みについても開示されている。
【非特許文献１】佐藤他、信学技報、Ｖｏｌ．ＩＴ‐２００２−４９，ｐｐ．１３−１８，Ｍａｒ．２００２“データの符号化と演算子の変換によるプログラムの難読化手法”
【非特許文献２】Ｇｅｎｅｖｉｅｖｅ  Ａｒｂｏｉｔ、“Ａ  Ｍｅｔｈｏｄ  ｆｏｒ  Ｗａｔｅｒｍａｒｋｉｎｇ  Ｊａｖａ  Ｐｒｏｇｒａｍ  Ｖｉａ  Ｏｐａｑｕｅ  Ｐｒｅｄｉｃａｔｅｓ、”Ｐｒｏｃ．ｏｆ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｍｍｅｒｃｅ  Ｒｅｓｅａｒｃｈ（ＩＣＥＣＲ−５）、２００２年
【特許文献１】特開２００６−７９３４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記の非特許文献１に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。
【０００６】
また、上記の特許文献１に開示された技術においては、プログラムに含まれる整数値を符号化の対象としているため、算術演算をほとんど含まないプログラムや実数型のみの変数のみが使われているプログラムに対しては、効果が小さいという問題がある。
【０００７】
更に、非特許文献２に開示された方式は、整数論に基づいて、常に真、または、常に偽となる条件文を作成しているため、こうした条件分岐を自動的に生成することは困難であり、また、生成された条件分岐が不自然な形態をなしているという問題がある。
【０００８】
更に、非特許文献２には、常に真となる条件文として、１）７ｙ２−１≠ｘ２、２）３｜（ｘ３−ｘ）、３）Σ（１＋３＋・・・＋２ｘ−１）＝ｘ２、４）２｜ｘ∨８｜（ｘ２−１）、５）２｜ｒｏｕｎｄ（ｘ２／２）（ただし、ｒｏｕｎｄ（ｘ）はｘを超えない最大の整数）の５つの条件文が例示されているが、これらの条件文が常に真となることは、以下のように証明することができる。
【０００９】
すなわち、上記の「７ｙ２−１≠ｘ２」については、背理法により、７ｙ2−１＝ｘ2となるような、ｘ，ｙが存在すると仮定し、ｘが偶数のとき、ｘ2は偶数となるため、７ｙ2は奇数となり、結局、ｙは奇数でなければならない。ここで、ｘ＝２ｍ、ｙ＝２ｎ−１と表すと（ここで、ｍ，ｎは整数）、上式は、２８ｎ2−２８ｎ＋６＝４ｍ2となる。しかしながら、右辺は４で割り切れるのに対し、左辺は４で割り切れない。よって不適となる。一方で、ｘが奇数のとき、ｘ2も奇数となる。したがって、７ｙ2は偶数となり、結局、ｙ2も偶数でなければならない。ここで、ｘ＝２ｋ−１、ｙ＝２ｌと表すと（ここで、ｋ、ｌは整数）、上式は、２８ｌ2−１＝４ｋ2−４ｋ＋１となる。ゆえに、２８ｌ2−２＝４ｋ2−４ｋとなる。しかしながら、この場合も、右辺は４で割り切れるのに対し、左辺は４で割り切れない。よって不適となる。以上の考察により、すべての整数ｘ、ｙに対し、７ｙ2−１≠ｘ2となることから、上記の「７ｙ２−１≠ｘ２」なる条件文は、常に真となることが証明できる。
【００１０】
次に、上記の「３｜（ｘ３−ｘ）」については、ｘ3−ｘ＝（ｘ−１）ｘ（ｘ＋１）であるので、連続する３つの整数の積は３で割り切れる。したがって、「３｜（ｘ３−ｘ）」なる条件文は、常に真となることが証明できる。また、上記の「Σ（１＋３＋・・・＋２ｘ−１）＝ｘ２」については、(与式)= Σk=1x（２ｋ−１）＝２ｘ（ｘ＋１）／２−ｘ＝ｘ2＋ｘ−ｘ＝ｘ2となるため、与えられた等式は常に成立する。したがって、「Σ（１＋３＋・・・＋２ｘ−１）＝ｘ２」なる条件文は、常に真となることが証明できる。
【００１１】
また、上記の「２｜ｘ∨８｜（ｘ２−１）」については、ｘが偶数のとき、ｘ∨８も偶数となることから、２|ｘ∨８。一方、ｘが奇数のとき、ｘ2も奇数であることから、２|（ｘ2−１）。したがって、すべてのｘに対し、２|ｘ∨８|（ｘ2−１）が成り立つことから、「２｜ｘ∨８｜（ｘ２−１）」なる条件文は、常に真となることが証明できる。更に、上記の「２｜ｒｏｕｎｄ（ｘ２／２）」については、ｘが偶数のとき、ｘ＝２ｍと表すと（ｍは整数）、ｒｏｕｎｄ(ｘ2／２)＝２ｍ2となり、与式が成立する。一方で、ｘが奇数のとき、ｘ＝２ｎ−１と表すと（ｎは整数）、ｒｏｕｎｄ(ｘ2／２)=４ｎ2−４ｎとなり、与式が成立する。したがって、「２｜ｒｏｕｎｄ（ｘ２／２）」なる条件文は、常に真となることが証明できる。
【００１２】
このように、非特許文献２に記載された条件文は、不正な攻撃者が、その条件文が常に真であるのか、あるいは、常に偽であるのかを数論により証明することができるという問題がある。
【００１３】
そこで、本発明は、上述の課題に鑑みてなされたものであり、整数値に限らず、その適用範囲が広く、かつ、条件分岐の解析が困難なプログラム難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明は、上記の課題を解決するために以下の事項を提案している。
【００１５】
（１）本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法であって、プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、前記制御変数を符号化する第２のステップと、非自明な関係式を用いて、架空の条件分岐を生成する第３のステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００１６】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。そして、非自明な関係式を用いて、架空の条件分岐を生成する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができる。また、不正な攻撃者にとって、条件分岐の解析が困難なプログラムを生成することができる。
【００１７】
（２）本発明は、（１）のプログラム難読化方法について、前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００１８】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定する方法として、ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、切り出したブロックを並列に並べ、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加する。
【００１９】
（３）本発明は、（１）または（２）のプログラム難読化方法について、前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００２０】
この発明によれば、符号化を施すｎ個（但し、ｎは正整数）の変数を任意に選択し、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の制御変数を符号化する。
【００２１】
したがって、プログラム中のｎ個の制御変数を線形変換により同時にｍ個の制御変数に符号化するため、プログラム中で用いられている制御変数の個数を秘匿すると同時に、制御変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【００２２】
（４）本発明は、（１）から（３）のプログラム難読化方法について、前記第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成することを特徴とするプログラム難読化方法を提案している。
【００２３】
この発明によれば、第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成する。したがって、架空の条件分岐が、一般的な条件分岐と類似の形態、すなわち、特殊な演算を用いない形態となっているため、他の条件分岐と比較しても、不正な攻撃者に対して不自然に写ることがない。また、特殊な演算を用いない形態となっているため、ツールを用いて、自動的に条件分岐を生成することができる。
【００２４】
（５）本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法をコンピュータに実行させるためのプログラムであって、プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、前記制御変数を符号化する第２のステップと、非自明な関係式を用いて、架空の条件分岐を生成する第３のステップと、を備えたことを特徴とするプログラムを提案している。
【００２５】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができ、こうした処理をプログラムにより自動的に実行することができる。また、不正な攻撃者にとって、条件分岐の解析が困難なプログラムを生成することができる。
【００２６】
（６）本発明は、（５）のプログラムについて、前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、を備えたことを特徴とするプログラムを提案している。
【００２７】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定する方法として、ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、切り出したブロックを並列に並べ、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加する。
【００２８】
（７）本発明は、（５）または（６）のプログラムについて、前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、を備えたことを特徴とするプログラムを提案している。
【００２９】
この発明によれば、符号化を施すｎ個（但し、ｎは正整数）の変数を任意に選択し、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の制御変数を符号化する。
【００３０】
したがって、プログラム中のｎ個の制御変数を線形変換により同時にｍ個の制御変数に符号化するため、プログラム中で用いられている制御変数の個数を秘匿すると同時に、制御変数間の参照および代入関係も秘匿することができ、こうした処理をプログラムにより自動的に実行することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【００３１】
（８）本発明は、（５）から（７）のプログラムについて、前記第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成することを特徴とするプログラムを提案している。
【００３２】
この発明によれば、第３のステップが、架空の条件分岐として一般的な条件分岐と類似の形態で、常に真と判定される条件式あるいは、常に偽と判定される条件式を生成する。したがって、架空の条件分岐が、一般的な条件分岐と類似の形態、すなわち、特殊な演算を用いない形態となっているため、他の条件分岐と比較しても、不正な攻撃者に対して不自然に写ることがない。また、特殊な演算を用いない形態となっているため、ツールを用いて、自動的に条件分岐を生成することができる。
【発明の効果】
【００３３】
本発明によれば、プログラムに制御変数を導入して、その変数を符号化の対象とすることから、直接符号化できる変数を含まないプログラムに対しても、耐性の高いソフトウェアの難読化を実現することができるという効果がある。
【００３４】
また、本発明によれば、架空の条件分岐に特殊な演算を利用しないため、他の条件分岐と比較しても、不正な攻撃者に対して不自然に写ることがないという効果がある。また、本発明によれば、特殊な演算を用いない形態となっているため、ツールを用いて、自動的に条件分岐を生成することができるという効果がある。
【００３５】
また、本発明によれば、数論を用いた構成方法とは異なり、条件文の判定部分のみで、その真偽を判定することが不可能であるといった効果がある。
【００３６】
更に、本発明の技術を用いることにより、各種サービスにおけるセキュリティを向上させることができる。具体的には、Ｊａｖａ（登録商標）やＢｒｅｗ（登録商標）等のソフトウェアに関する著作権を保護するとともに、不正にプログラムの解析を試みる不正な者への情報漏えいを的確に防止できるという効果がある。
【発明を実施するための最良の形態】
【００３７】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【００３８】
＜処理フロー＞
まず、図１および図３から図７を用いて、本発明の実施形態に係るプログラム難読化方法の一般的な処理について説明する。
【００３９】
まず、図３に示すように、ソースコード（プログラム）に含まれる連続する命令を、ブロック（図中、Ｂ１；、Ｂ２；、Ｂ３；）として切り出す（ステップＳ１０１）。次に、ブロックの実行順番を制御するための制御変数（図４に示す「ｉｎｔ  ｃ」）を宣言する（ステップＳ１０２）。
【００４０】
更に、各ブロック（図３のＢ１；、Ｂ２；、Ｂ３；）に、制御変数がとるべき値（図５に示すＢ１；に対しては「５」、Ｂ２；に対しては「９」、Ｂ３；に対しては「４」）を割り当てる（ステップＳ１０３）。
【００４１】
次に、図６に示すように、ｓｗｉｔｃｈ文またはｉｆ文を用いて、各ブロックを並列に並べる（ステップＳ１０４）。なお、条件分岐命令の判定文では、制御変数の値と、ステップＳ１０３において各ブロックに割り当てられた値が等しいかどうかが判定され、制御変数の値と等しい値が割り当てられたブロックの先頭に制御が移る。
【００４２】
更に、図７に示すように、制御変数の値を次に実行されるブロックに割り当てられた値に書き換える処理（図７に示す、ブロックＢ１；におけるｃ＝９、ブロックＢ２；におけるｃ＝４）を各ブロックの最後に追加する（ステップＳ１０５）。そして、制御変数を符号化する処理を行う（ステップＳ１０６）。なお、ここで、符号化された制御変数が、非自明な関係を満たすように、符号化後の制御変数の個数を符号化前の制御変数の個数よりも多くする必要がある。
【００４３】
更に、非自明な関係式を用いて、架空の条件分岐を作成する（ステップＳ１０７）。ここで、非自明な関係式を用いた架空の条件分岐とは、例えば、符号化された制御変数がｘｘ、ｙｙ、ｚｚであり、非自明な関係式がｘｘ＾ｙｙ＾ｚｚ＝０であるときに、式ｉｆ（ｘｘ＾ｙｙ＾ｚｚ＝＝０）のように、常に真と判定される条件文、または、式ｉｆ（ｘｘ＾ｙｙ＾ｚｚ＝＝５）のように、常に偽となる条件文である。
【００４４】
＜制御変数の符号化処理＞
次に、図２を用いて、制御変数の符号化処理について説明する。
【００４５】
まず、プログラムの中から、難読化の対象として符号化を施すｎ個（ｎは整数数）の制御変数を任意に選択する。この操作で選ばれたｎ個の制御変数をｘ１，ｘ２・・・，ｘｎとする。（ステップＳ２０１）。
【００４６】
次に、ｍ×ｎ型行列Ａ、ｍ次元ベクトルｃを任意に生成し、これらを秘密鍵とする（ステップＳ２０２）。但し、ｍは、ｍ≧ｎなる正整数である。
【００４７】
更に、生成した行列Ａおよびベクトルｃを用いて以下の変換式（１）を定義する（ステップＳ２０３）。
【００４８】
【数１】
2008090668.tif 000003
【００４９】
ここで、Ｘ１，Ｘ２，・・・，Ｘｍは、難読化後のソフトウェアで用いられる符号化されたｍ個の制御変数である。
【００５０】
上記した変換式をｎ個の制御変数ｘ１，ｘ２，・・・，ｘｎに関するｍ本の連立方程式と見なし、それぞれの制御変数について上記連立方程式を解く。その結果、それぞれの制御変数ｘ１，ｘ２，・・・，ｘｎに関して以下の（２）で示す復号式が成立する（ステップＳ２０４）。
【００５１】
【数２】
2008090668.tif 000004
【００５２】
この復号式により、元のプログラム中のそれぞれの制御変数ｘ１，ｘ２，・・・，ｘｎの値を復号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍを用いて表すことが可能になる。
この手順では、ｍ本の連立方程式から、ｎ個の制御変数ｘ１，ｘ２・・・ｘｎの値を求める。このため、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍの間には、ｍ−ｎ個の自明でない以下の関係式（３）が成り立つことになる。
【００５３】
【数３】
2008090668.tif 000005
【００５４】
この自明でない関係式を用いることにより、上記の復号式における各制御変数Ｘ１，Ｘ２，・・・，Ｘｍの係数を可変とすることができる。
【００５５】
次に、プログラム中で用いられている制御変数ｘ１，ｘ２，・・・，ｘｎを以下の規則に従い、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍで置き換える（ステップＳ２０５）。具体的には、アルゴリズム中の制御変数ｘｉに対する代入命令ｘｉ←ｕを、以下の演算式（４）で示されるように、制御変数Ｘ１，Ｘ２，・・・ＸＭに対する代入命令に置き換える。
【００５６】
【数４】
2008090668.tif 000006
【００５７】
この代入命令が実行されると、符号化されたｍ個全ての制御変数Ｘ１，Ｘ２，・・・Ｘｍが、同時に変更される。つまり、プログラム中で参照されている制御変数ｘｊを、ステップＳ２０４の処理で求めた復号式ｘｊ（Ｘ１，Ｘ２，・・・Ｘｍ）を用いて、制御変数Ｘ１，Ｘ２，・・・Ｘｍの式に置き換える。
【００５８】
後処理として、符号化された制御変数Ｘ１，Ｘ２，・・・，Ｘｍへの初期値を与える。また、連続する制御変数Ｘ１，Ｘ２，・・・Ｘｍへの代入命令のマージを行う（ステップＳ２０６）。
【００５９】
具体的には、上記したステップＳ２０５の処理により、プログラム中の制御変数ｘ１，ｘ２，・・・，ｘｎは、全てＸ１，Ｘ２，・・・，Ｘｍで置き換えられる。これらの制御変数の初期値は、自明でない関係式ｆ１，ｆ２，・・・ｆｍ‐ｎを満たす任意の整数とする。
【００６０】
また、ステップＳ２０５の処理により生成された、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍへの代入命令の中で、連続するものをマージする。
【００６１】
プログラムの解析が十分に困難であると判定されれば、難読化処理を終了する（ステップＳ２０７の「ＹＥＳ」）。一方、さらなる難読化が必要であると判定されれば（ステップＳ２０７の「ＮＯ」）、ステップＳ２０１からステップＳ２０６までの処理を繰り返し実行する。
【００６２】
＜具体的なプログラムを例示した処理の流れ＞
以下、具体的なプログラムを例示し、本実施形態に係るプログラム難読化方法の処理の流れについて、図８から図１５を用いて説明する。なお、図８は、本実施形態に係るプログラム難読化方法により処理を行う元のソースコードを示している。
【００６３】
まず、図８に示す処理前のソースコードについて、連続する命令を図９に示すように、「／＊ブロック１＊／」、「／＊ブロック２＊／」、「／＊ブロック３＊／」として分割する処理を行う。
【００６４】
次に、図１０に示すように、「ｉｎｔ  ｃ１、ｃ２；」という制御変数の宣言を追加する処理を行う。更に、図１１に示すように、「／＊ブロック１＊／」には、「／＊ｃ１＝５；ｃ２＝３＊／」、「／＊ブロック２＊／」には、「／＊ｃ１＝９；ｃ２＝２＊／」、「／＊ブロック３＊／」には、「／＊ｃ１＝４；ｃ２＝６＊／」という各ブロックにおいて、制御変数が取るべき値を割り付ける。そして、図１２に示すように、ｉｆ文を用いて、各ブロックを並列に並べることにより、制御構造を平坦化したソースコードを作成する。
【００６５】
そして、図１３に示すように、各ブロックの末尾に、「ｃ１＝ｃ２＝３；」および「ｃ１＋＝２；」、「ｃ１＝ｃ１＋ｃ２＋１；」および「ｃ２＋＋；」、「ｃ１＝＝ｃ２；」および「ｃ２＝＝９；」、「ｃ１＝ｃ２＋＋；」および「ｃ２――；」という制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を追加したソースコードを作成する。そして、上記の符号化処理（図２参照）を行うことにより、図１４に示す制御変数ｃ１、ｃ２をｄ１、ｄ２、ｄ３に符号化したソースコードが得られる。
【００６６】
更に、これに、自明でない関係式「ｄ１＾ｄ２＾ｄ３＝０」等を用いて、条件分岐を変換することにより、図１５に示すソースコードが得られる。
【００６７】
以上、説明したように、本実施形態によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができる。また、非自明な関係式を用いて架空の条件分岐を付加することによって、不正な攻撃者にとって、条件分岐の解析が困難なプログラムを生成することができる。
【００６８】
なお、説明した本実施形態は、演算装置もしくはコンピュータにより実現されるものであり、特に、コンピュータにおいては、上述のステップＳ１０１からステップＳ１０６で実行される処理およびその手順をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行することによって本発明のプログラム難読化方法を実現することができる。ここでいうコンピュータとは、ＯＳや周辺装置等のハードウェアを含む。
【００６９】
また、「コンピュータ」は、ＷＷＷ（Ｗｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂ）システムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。また、「コンピュータ読み取り可能な記録媒体」フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。更に、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のシステムやクライアントとなるコンピュータシステム内部の揮発性メモリ（ＲＡＭ）のように、一定時間プログラムを保持しているものも含むものとする。
【００７０】
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
【００７１】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。更に、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００７２】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【００７３】
【図１】本実施形態に係る処理フローである。
【図２】本実施形態に係る制御変数の符号化処理を示すフローである。
【図３】ソースコードに含まれる連続する命令をブロックとして切り出す処理の概念図である。
【図４】ソースコードの実行順序を制御するための制御変数を宣言する処理の概念図である。
【図５】各ブロックに制御変数として取るべき値を割当てる処理の概念図である。
【図６】ｓｗｉｔｃｈ文またはｉｆ文を用いて、各ブロックを並列に並べる処理の概念図である。
【図７】制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を各ブロックの最後に追加する処理の概念図である。
【図８】本実施形態に係る処理を行う前のソースコードを示す図である。
【図９】連続する命令をブロック１、２、３に分割したソースコードを示す図である。
【図１０】制御変数の宣言を追加したソースコードを示す図である。
【図１１】各ブロックに制御変数の取るべき値を割当てたソースコードを示す図である。
【図１２】制御構造を平坦化したソースコードを示す図である。
【図１３】制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を各ブロックの末尾に追加したソースコードを示す図である。
【図１４】制御変数を符号化したソースコードを示す図である。
【図１５】自明でない関係式「ｄ１＾ｄ２＾ｄ３＝０」を用いて、条件分岐を変換したソースコードを示す図である。
【図１】
2008090668.tif 000007
【図２】
2008090668.tif 000008
【図３】
2008090668.tif 000009
【図４】
2008090668.tif 000010
【図５】
2008090668.tif 000011
【図６】
2008090668.tif 000012
【図７】
2008090668.tif 000013
【図８】
2008090668.tif 000014
【図９】
2008090668.tif 000015
【図１０】
2008090668.tif 000016
【図１１】
2008090668.tif 000017
【図１２】
2008090668.tif 000018
【図１３】
2008090668.tif 000019
【図１４】
2008090668.tif 000020
【図１５】
2008090668.tif 000021