(57)【特許請求の範囲】
【請求項１】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化装置であって、
データ変換用クラスを定義するデータ変換用クラス定義手段と、
前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数、ｘ１、ｘ２、・・・、ｘｎ）選択する選択手段と、
前記選択されたｎ個の任意型の変数をそれぞれｍ個（ｍは、ｍ≧ｎの正の整数）の固定長のデータに分割する分割手段と、
前記選択されたｎ個の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記分割したｍ個の固定長のデータに対応したｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）に変換するための符号化式を定義する符号化式定義手段と、
前記定義したｍ個の符号化式をｍ個の方程式からなる連立方程式とみなし、この連立方程式を前記選択したｎ個の任意型の変数それぞれについて解くことにより前記選択したｎ個の任意型の変数に対応した独立な符号化式を導出し、前記選択されたｎ個の任意型の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）を用いて表すことにより、前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）の間で成り立つｍ−ｎ個の非自明な関係式を導出する導出手段と、
前記符号化式および復号式を用いて、前記ソフトウェアから符号化の対象とするために選択したｎ個の任意型の変数を符号化変数に置換する置換手段と、
該符号化変数に初期値を与え、連続する代入命令をマージするマージ手段と、
を備えたことを特徴とするソフトウェアの難読化装置。
【請求項２】
前記符号化変数に対する復号処理において、命令列を変更することを特徴とする請求項１に記載のソフトウェアの難読化装置。
【請求項３】
前記符号化式定義手段が、前記ｍとｎとを用いて、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する生成手段を備え、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義することを特徴とする請求項１に記載のソフトウェアの難読化装置。
【請求項４】
前記任意型の変数が、整数型変数および倍精度浮動小数型変数であることを特徴とする請求項１に記載のソフトウェアの難読化装置。
【請求項５】
前記オブジェクト指向言語がｊａｖａ言語であることを特徴とする請求項１に記載のソフトウェアの難読化装置。
【請求項６】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法であって、
データ変換用クラスを定義する第１のステップと、
前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数、ｘ１、ｘ２、・・・、ｘｎ）選択する第２のステップと、
前記選択されたｎ個の任意型の変数をそれぞれｍ個（ｍは、ｍ≧ｎの正の整数）の固定長のデータに分割する第３のステップと、
前記選択されたｎ個の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記分割したｍ個の固定長のデータに対応したｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）に変換するための符号化式を定義する第４のステップと、
前記定義したｍ個の符号化式をｍ個の方程式からなる連立方程式とみなし、この連立方程式を前記選択したｎ個の任意型の変数それぞれについて解くことにより前記選択したｎ個の任意型の変数に対応した独立な符号化式を導出し、前記選択されたｎ個の任意型の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）を用いて表すことにより、前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）の間で成り立つｍ−ｎ個の非自明な関係式を導出する第５のステップと、
前記符号化式および復号式を用いて、前記ソフトウェアから符号化の対象とするために選択したｎ個の任意型の変数を符号化変数に置換する第６のステップと、
該符号化変数に初期値を与え、連続する代入命令をマージする第７のステップと、
を備えたことを特徴とするソフトウェアの難読化方法。
【請求項７】
前記第４のステップが、前記ｍとｎとを用いて、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する第８のステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する第９のステップとを備えたことを特徴とする請求項６に記載のソフトウェアの難読化方法。
【請求項８】
オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、
データ変換用クラスを定義する第１のステップと、
前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数、ｘ１、ｘ２、・・・、ｘｎ）選択する第２のステップと、
前記選択されたｎ個の任意型の変数をそれぞれｍ個（ｍは、ｍ≧ｎの正の整数）の固定長のデータに分割する第３のステップと、
前記選択されたｎ個の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記分割したｍ個の固定長のデータに対応したｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）に変換するための符号化式を定義する第４のステップと、
前記定義したｍ個の符号化式をｍ個の方程式からなる連立方程式とみなし、この連立方程式を前記選択したｎ個の任意型の変数それぞれについて解くことにより前記選択したｎ個の任意型の変数に対応した独立な符号化式を導出し、前記選択されたｎ個の任意型の変数（ｘ１、ｘ２、・・・、ｘｎ）を前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）を用いて表すことにより、前記ｍ個の符号化された変数（Ｘ１、Ｘ２、・・・、Ｘｍ）の間で成り立つｍ−ｎ個の非自明な関係式を導出する第５のステップと、
前記符号化式および復号式を用いて、前記ソフトウェアから符号化の対象とするために選択したｎ個の任意型の変数を符号化変数に置換する第６のステップと、
該符号化変数に初期値を与え、連続する代入命令をマージする第７のステップと、
をコンピュータに実行させるためのプログラム。
【請求項９】
前記第４のステップが、前記ｍとｎとを用いて、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する第８のステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する第９のステップとをコンピュータに実行させるための請求項８に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長の異なる複数の変数を同時に符号化してソフトウェアを難読化するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵など、利用者に対して秘密にすべき情報が含まれる場合がある。このような情報が外部に露呈すると、サービスの継続に大きな影響を及ぼす可能性が高い。そのため、例えば、著作権管理プログラムに含まれる鍵等は、保護すべきデータであり、こうした鍵の生成や廃棄などの鍵管理処理は、保護すべき処理内容である。
【０００３】
一方で、ソフトウェアを解析するための技術（ＲＥ：Ｒｅｖｅｒｓｅ  Ｅｎｇｉｎｅｅｒｉｎｇ）が数多く開発されている。このため、これらの技術によりソフトウェアが解析されると、不正者が秘密情報を入手するという脅威が考えられる。この脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。
【０００４】
例えば、ソフトウェアに含まれるデータを符号化することにより、ソフトウェアの解析を困難にする方式として、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する技術が知られている（例えば、特許文献１参照。）。
【０００５】
また、Ｃ言語の共用体を利用して、ソフトウェアに含まれる変数のうちバイト長が長い変数を共用体を用いて複数の変数に分割し、分割された変数を含むソフトウェアを変換することにより、ソフトウェアに含まれるバイト長の異なる複数の変数を同時に符号化してソフトウェアの解析を困難にすることも考えられる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−０７９３４７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１に記載の技術では、符号化の対象が同じバイト長の変数のみに制約されてしまう。そのため、例えば、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することは不可能であるという問題があった。
【０００８】
また、上記のように、Ｃ言語については、Ｃ言語の共用体を利用することにより、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することも可能であると考えられるが、オブジェクト指向言語では、共用体を利用することができないため、上記の技術では、オブジェクト指向言語で記述されたソフトウェアについて、バイト長が異なる整数型変数と倍精度浮動小数型変数を同時に符号化することは不可能であるという問題があった。
【０００９】
そこで、本発明は、上述の課題に鑑みてなされたものであり、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長の異なる複数の変数を同時に符号化してソフトウェアを難読化するソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、上記の課題を解決するために以下の事項を提案している。なお、理解を容易にするために、本発明の実施形態に対応する符号を付して説明するが、これに限定されるものではない。
【００１１】
（１）本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化装置であって、データ変換用クラスを定義するデータ変換用クラス定義手段（例えば、図１のクラス定義部１１０に相当）と、前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する選択手段（例えば、図１の選択部１２０に相当）と、前記選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する分割手段（例えば、図１の分割部１３０に相当）と、ｍ個（ｍ；正の整数）の符号化式を定義する符号化式定義手段（例えば、図１の符号化式定義部１４０に相当）と、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する導出手段（例えば、図１の式導出部１５０に相当）と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する置換手段（例えば、図１の置換部１６０に相当）と、該符号化変数に初期値を与え、連続する代入命令をマージするマージ手段（例えば、図１のマージ部１７０に相当）と、を備えたことを特徴とするソフトウェアの難読化装置を提案している。
【００１２】
この発明によれば、データ変換用クラス定義手段は、データ変換用クラスを定義する。選択手段は、ソフトウェアから符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する。分割手段は、選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する。符号化式定義手段は、ｍ個（ｍ；正の整数）の符号化式を定義する。導出手段は、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する。置換手段は、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換する。マージ手段は、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【００１３】
（２）本発明は、（１）のソフトウェアの難読化装置について、前記符号化変数に対する復号処理において、命令列を変更することを特徴とするソフトウェアの難読化装置を提案している。
【００１４】
この発明によれば、符号化変数に対する復号処理において、命令列を変更する。これにより、処理の正しさを保証し、かつ不正な第三者による処理の解析を防止することができる。
【００１５】
（３）本発明は、（１）のソフトウェアの難読化装置について、前記置換手段が、前記符号化変数にｍ−ｎの非自明な関係式を満たす任意の初期値を与えることを特徴とするソフトウェアの難読化装置を提案している。
【００１６】
この発明によれば、置換手段が、符号化変数にｍ−ｎの非自明な関係式を満たす任意の初期値を与える。これにより、不正な第三者によるソフトウェアの解析を困難にすることができる。
【００１７】
（４）本発明は、（１）のソフトウェアの難読化装置について、前記符号化式定義手段が、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する生成手段を備え、前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義することを特徴とするソフトウェアの難読化装置を提案している。
【００１８】
この発明によれば、生成手段が、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のｎ個の変数を線形変換により同時にｍ個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【００１９】
（５）本発明は、（１）のソフトウェアの難読化装置について、前記任意型の変数が、整数型変数および倍精度浮動小数型変数であることを特徴とするソフトウェアの難読化装置を提案している。
【００２０】
この発明によれば、任意型の変数が、整数型変数および倍精度浮動小数型変数である。つまり、本発明により、オブジェクト指向言語で記述されたソフトウェア内に、代表的なバイト長４バイトの整数型変数とバイト長８バイトの倍精度浮動小数型変数が含まれていても、これらの変数を同時に符号化することができる。
【００２１】
（６）本発明は、（１）のソフトウェアの難読化装置について、前記オブジェクト指向言語がｊａｖａ言語であることを特徴とするソフトウェアの難読化装置を提案している。
【００２２】
この発明によれば、オブジェクト指向言語がｊａｖａ言語である。したがって、最も代表的なｊａｖａ言語で記述されたソフトウェアにおいても、本発明を適用することができる。
【００２３】
（７）本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法であって、データ変換用クラスを定義する第１のステップ（例えば、図２のステップＳ１０１に相当）と、前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する第２のステップ（例えば、図２のステップＳ１０２に相当）と、前記選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する第３のステップ（例えば、図２のステップＳ１０３に相当）と、ｍ個（ｍ；正の整数）の符号化式を定義する第４のステップ（例えば、図２のステップＳ１０４に相当）と、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する第５のステップ（例えば、図２のステップＳ１０５に相当）と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第６のステップ（例えば、図２のステップＳ１０６に相当）と、該符号化変数に初期値を与え、連続する代入命令をマージする第７のステップ（例えば、図２のステップＳ１０７に相当）と、を備えたことを特徴とするソフトウェアの難読化方法を提案している。
【００２４】
この発明によれば、データ変換用クラスを定義し、ソフトウェアから符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する。次に、選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割し、ｍ個（ｍ；正の整数）の符号化式を定義して、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する。そして、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換し、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【００２５】
（８）本発明は、（７）のソフトウェアの難読化方法について、前記第４のステップが、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する第８のステップ（例えば、図３のステップＳ１４０１に相当）と、前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する第９のステップ（例えば、図３のステップＳ１４０２に相当）とを備えたことを特徴とするソフトウェアの難読化方法を提案している。
【００２６】
この発明によれば、第４のステップにおいて、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のｎ個の変数を線形変換により同時にｍ個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【００２７】
（９）本発明は、オブジェクト指向言語で記述されたソフトウェア内の複数の変数を符号化してソフトウェアを難読化するソフトウェアの難読化方法をコンピュータに実行させるためのプログラムであって、データ変換用クラスを定義する第１のステップ（例えば、図２のステップＳ１０１に相当）と、前記ソフトウェアから前記符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する第２のステップ（例えば、図２のステップＳ１０２に相当）と、前記選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する第３のステップ（例えば、図２のステップＳ１０３に相当）と、ｍ個（ｍ；正の整数）の符号化式を定義する第４のステップ（例えば、図２のステップＳ１０４に相当）と、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する第５のステップ（例えば、図２のステップＳ１０５に相当）と、前記符号化式および復号式を用いて、前記ソフトウェア内の変数を符号化変数に置換する第６のステップ（例えば、図２のステップＳ１０６に相当）と、該符号化変数に初期値を与え、連続する代入命令をマージする第７のステップ（例えば、図２のステップＳ１０７に相当）と、をコンピュータに実行させるためのプログラムを提案している。
【００２８】
この発明によれば、データ変換用クラスを定義し、ソフトウェアから符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する。次に、選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割し、ｍ個（ｍ；正の整数）の符号化式を定義して、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する。そして、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換し、符号化変数に初期値を与え、連続する代入命令をマージする。したがって、本発明においては、データ変換クラスを用いて、バイト長が異なる複数の変数を任意長のデータに分割して、これらを個別に符号化できるため、オブジェクト指向言語で記述されたソフトウェアにおいて、バイト長が異なる複数の変数を同時に符号化して、ソフトウェアの難読化を行うことができる。
【００２９】
（１０）本発明は、（９）のプログラムについて、前記第４のステップが、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成する第８のステップ（例えば、図３のステップＳ１４０１に相当）と、前記生成した行列およびベクトルを変換鍵として前記ｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する第９のステップ（例えば、図３のステップＳ１４０２に相当）とをコンピュータに実行させるためのプログラムを提案している。
【００３０】
この発明によれば、第４のステップにおいて、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正の整数）およびｍ次元の任意のベクトルを生成し、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の整数を符号化する符号化式を定義する。したがって、ソフトウェア中のｎ個の変数を線形変換により同時にｍ個の整数に符号化するため、ソフトウェア中で用いられている変数の個数を秘匿すると同時に、変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【発明の効果】
【００３１】
本発明によれば、オブジェクト指向言語で記述されたソフトウェアにおいて、任意のデータ長の変数、すなわち、すべての型の変数を符号化することができるという効果がある。また、本発明により、セマンティクスが異なる複数のデータをまとめて変換することにより、従来よりも安全性が向上するという効果がある。さらに、オブジェクト指向言語で記述されたソフトウェア内の各変数の初期値を任意の値で設定できるため、さらに、安全性が向上するという効果がある。
【図面の簡単な説明】
【００３２】
【図１】本発明の実施形態に係るソフトウェアの難読化装置の構成を示す図である。
【図２】本発明の実施形態に係るソフトウェアの難読化装置の処理を示す図である。
【図３】本発明の実施形態に係るソフトウェアの難読化装置の難読化の処理を示す図である。
【図４】本発明の実施例に係るデータ変換用クラスを定義するソースコードを例示する図である。
【図５】本発明の実施例に係る変換前のソースコードを例示する図である。
【図６】本発明の実施例に係る変換後のソースコードを例示する図である。
【発明を実施するための形態】
【００３３】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【００３４】
＜実施形態＞
以下、図１から図３を用いて、本発明の実施形態について説明する。
【００３５】
＜ソフトウェアの難読化装置の構成＞
本実施形態に係るソフトウェアの難読化装置は、図１に示すように、クラス定義部１１０と、選択部１２０と、分割部１３０と、符号化式定義部１４０と、式導出部１５０と、置換部１６０と、マージ部１７０とから構成されている。
【００３６】
クラス定義部１１０は、データ変換用クラスを定義する。選択部１２０は、ソフトウェアから符号化の対象となる任意型の変数をｎ個（ｎ；正の整数）選択する。分割部１３０は、選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する。
【００３７】
符号化式定義部１４０は、ｍ個（ｍ；正の整数）の符号化式を定義する。式導出部１５０は、ｎ個の独立な符号化式からｎ個の復号式およびｍ−ｎの非自明な関係式を導出する。置換部１６０は、符号化式および復号式を用いて、ソフトウェア内の変数を符号化変数に置換する。マージ部１７０は、符号化変数に初期値を与え、連続する代入命令をマージする。
【００３８】
＜ソフトウェアの難読化装置の処理＞
図２および図３を用いて、ソフトウェアの難読化装置の処理について説明する。なお、本実施形態においては、ｊａｖａ言語により記述されたソースコードを難読化する場合を例にとって説明する。また、以下では、ｄｏｕｂｌｅ型の変数ｌｏｎｇ＿ｄａｔとｉｎｔ型の変数とを同時に符号化する例について説明するが、これに限らず、その他のバイト長の変数も同様に、ｉｎｔ型のデータに分割して符号化することができる。
【００３９】
対象のｊａｖａ言語により記述されたソースコードにデータ変換用クラスの定義を追加する。また、このクラスのクラス変数を定義する。次に、対象のｊａｖａ言語により記述されたソースコードにｉｎｔ型変数ｉＨおよびｉＬの定義を追加する。これらの変数は、それぞれ変数ｌｏｎｇ＿ｄａｔの上位４バイトおよび下位４バイトを格納するために用いる。さらに、ｌｏｎｇ＿ｄａｔに対する代入命令ｌｏｎｇ＿ｄａｔ＝ｖａｌを下記、数１の代入命令に置換する。ここで、先に宣言したクラス変数をｄｉとする。
【００４０】
【数１】
0005627444.tif 000002
【００４１】
ソースコードの中から、難読化の対象として符号化を施すｎ個（ｎは整数数）の変数を任意に選択する。この操作で選ばれたｎ個の変数ｘ１，ｘ２…，ｘｎ，とする（ステップＳ１０２）。
【００４２】
次に、ステップＳ１０２において、選択されたｎ個の任意型の変数をそれぞれ固定長のデータに分割する（ステップＳ１０３）。さらに、ｍ個（ｍ；正の整数）の符号化式を定義する（ステップＳ１０４）。具体的には、図３に示すように、ｍ×ｎ型行列Ａ、ｍ次元ベクトルｃを任意に生成し、これらを秘密鍵とする（ステップＳ１０４１）。但し、ｍは、ｍ≧ｎなる正整数である。さらに、生成した行列Ａおよびベクトルｃを用いて以下の変換式数２を定義する。
【００４３】
【数２】
0005627444.tif 000003
【００４４】
ここで、Ｘ１，Ｘ２，…，Ｘｍは、難読化後のソフトウェアで用いられる符号化されたｍ個の変数である。
【００４５】
上記した変換式をｎ個の変数ｘ１，ｘ２，…，ｘｎに関するｍ本の連立方程式と見なし、それぞれの変数について解く。その結果、それぞれの変数ｘ１，ｘ２，…，ｘｎに関して以下の数３で示す復号式が成立する（ステップＳ１４０２）。
【００４６】
【数３】
0005627444.tif 000004
【００４７】
なお、変数ｌｏｇ＿ｄａｔに対する復号処理は、以下の数４に示す命令列を用いる。
【００４８】
【数４】
0005627444.tif 000005
【００４９】
ただし、数４において、ｄ＿ｉＨおよびｄ＿ｉＬは、それぞれｉｎｔ型変数ｉＨおよびｉＬに対する復号式である。
【００５０】
また、上記の符号化処理の過程においては、符号化変数に対して、初期値を設定する必要がある。本実施形態においては、符号化処理の過程で得られるｍ−ｎ個の非自明な関係式を満たす任意の値を符号化変数の初期値として設定することができる。これにより、攻撃者の解析コストが増大するという利点がある。
【００５１】
数３に示す復号式および数４に示す命令列によって、元のソースコード中のそれぞれの変数ｘ１，ｘ２，…，ｘｎの値を復号化された変数Ｘ１，Ｘ２，…Ｘｍを用いて表すことが可能になる。また、この手順では、ｍ本の連立方程式から、ｎ個の変数ｘ１，ｘ２…ｘｎの値を求める。このため、符号化された変数Ｘ１，Ｘ２，…Ｘｍの間には、ｍ−ｎ個の自明でない以下の関係式数５が成り立つことになる（ステップＳ１０５）。
【００５２】
【数５】
0005627444.tif 000006
【００５３】
この自明でない関係式を用いることにより、上記の復号式における各変数Ｘ１，Ｘ２，…，Ｘｍの係数を可変とすることができる。
【００５４】
次に、ソースコード中で用いられている変数ｘ１，ｘ２，…，ｘｎを以下の規則に従い、符号化された変数Ｘ１，Ｘ２，…Ｘｍで置き換える（ステップＳ１０６）。
（ａ）変数ｘｉへの代入命令への置き換え
ソースコード中の変数ｘｉに対する代入命令ｘｉ←ｕを、以下の演算式数６で示されるように、変数Ｘ１，Ｘ２，…ＸＭに対する代入命令に置き換える。
【００５５】
【数６】
0005627444.tif 000007
【００５６】
この代入命令が実行されると、符号化されたｍ個全ての変換Ｘ１，Ｘ２，…Ｘｍが、同時に変更される。
（ｂ）参照されている変数ｘｊの置き換え
プログラム中で参照されている変数ｘｊを、数３で示す復号式ｘｊ（Ｘ１，Ｘ２，…Ｘｍ）を用いて、変数Ｘ１，Ｘ２，…Ｘｍの式に置き換える。
【００５７】
後処理として、符号化された変数Ｘ１，Ｘ２，…，Ｘｍへの初期値を与える。また、連続する変数Ｘ１，Ｘ２，…Ｘｍへの代入命令のマージを行う（ステップＳ１０７）。
（ａ）符号化された変数への初期値代入
上記で示したステップＳ１０６の（ａ）、（ｂ）の処理により、ソースコード中の変数ｘ１，ｘ２，…，ｘｎは全てＸ１，Ｘ２，…，Ｘｍで置き換えられる。これらの変数の初期値は、自明でない関係式ｆ１，ｆ２，…ｆｍ−ｎを満たす任意の整数とする。
（ｂ）連続する代入命令のマージ
ステップＳ１０６の（ｂ）の処理により生成された、符号化された変数Ｘ１，Ｘ２，…Ｘｍへの代入命令の中で、連続するものをマージする。
【００５８】
最後に、ソフトウェアの解析が十分に困難であると判定されれば、難読化処理を終了する。さらなる難読化が必要であると判定されれば、ステップＳ１０３からステップＳ１０７までの処理を繰り返す。
【００５９】
したがって、本実施形態によれば、オブジェクト指向言語で記述されたソフトウェアにおいて、任意のデータ長の変数、すなわち、すべての型の変数を符号化することができる。また、本実施形態により、セマンティクスが異なる複数のデータをまとめて変換することにより、従来よりも安全性が向上する。さらに、オブジェクト指向言語で記述されたソフトウェア内の各変数の初期値を任意の値で設定できるため、さらに、安全性が向上する。
【００６０】
＜実施例＞
本実施例においては、区分求積により、関数ｆの区間［ａ、ｂ］における定積分を求める関数の変換例を示す。ここで、ｉｎｔ型変数ｃｎｔとｄｏｕｂｌｅ型変数ｓｕｍを符号化の対象変数とする。
【００６１】
また、図４は、データ変換用クラスを定義するソースコードを示しているが、この変換に用いたルールは、数７である。
【００６２】
【数７】
0005627444.tif 000008
【００６３】
図５は、変換前のソースコードを示し、図６は、上記実施形態に示した処理を上記変換ルールにより変換したソースコードを示している。
【００６４】
なお、ソフトウェアの難読化装置の処理をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをソフトウェアの難読化装置に読み込ませ、実行することによって本発明のソフトウェアの難読化装置を実現することができる。ここでいうコンピュータシステムとは、ＯＳや周辺装置等のハードウェアを含む。
【００６５】
また、「コンピュータシステム」は、ＷＷＷ（Ｗｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂ）システムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されても良い。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
【００６６】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００６７】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【００６８】
１１０；クラス定義部
１２０；選択部
１３０；分割部
１４０；符号化式定義部
１５０；式導出部
１６０；置換部
１７０；マージ部
【図１】
0005627444.tif 000009
【図２】
0005627444.tif 000010
【図３】
0005627444.tif 000011
【図４】
0005627444.tif 000012
【図５】
0005627444.tif 000013
【図６】
0005627444.tif 000014