(57)【要約】【課題】秘密データやアルゴリズムを読み取りにくくするとともに、スタックメモリの覗き見によるプログラムの秘密データの取得も困難にでき、さらには、一般的なプログラムに対して適用することができる難読化手法によりプログラムを難読化する。【解決手段】プログラム中のデータを符号化規則Ｃ（ａ，ｂ）＝ａｘ＋ｂを用いて符号化するデータ符号化部３３と、データ符号化部３３によって符号化された符号化データを含む演算式の各演算子に、演算子変換規則Ｒ（ａ，ｂ）〜Ｒ１０（ａ，ｂ）を適用することにより演算式を符号化演算式に変換する演算式変換部３４と、符号化演算式を復号化規則Ｄ（ａ，ｂ）を用いて復号化演算式とする復号化処理部３５とを備える。【選択図】      図２
2005049925.tif 000002
【特許請求の範囲】
【請求項１】
データ及びそのデータを演算する演算式を含むプログラムを難読化するプログラム難読化装置であって、
前記データを予め定められた符号化規則に基づいて符号化データに変換する符号化手段と、
前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換する演算式変換手段と、
前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換する復号化手段とを備え、
前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、
前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とするプログラム難読化装置。
【請求項２】
前記データは複数種類のデータを含み、
前記データ符号化手段によって符号化されるデータを前記複数種類のデータから決定するデータ決定手段をさらに備え、
前記演算式変換手段は、前記データ決定手段によって決定されたデータを含む演算式を前記演算子変換規則で変換することを特徴とする請求項１記載のプログラム難読化装置。
【請求項３】
前記符号化規則は、線形変換式Ｘ＝ａｘ＋ｂで表され（ａ，ｂは定数）、
前記演算子変換規則は、式（１）〜（１０）で表され、
前記復号化規則は、式（１１）で表されることを特徴とする請求項１又は２記載のプログラム難読化装置。
Ｘ＋Ｙ→Ｘ＋Ｙ−ｂ                                                                        ・・・式（１）
Ｘ−Ｙ→Ｘ−Ｙ＋ｂ                                                                        ・・・式（２）
Ｘ＊Ｙ→（Ｘ＊Ｙ−ｂ＊（Ｘ＋Ｙ−ｂ−ａ））／ａ                                ・・・式（３）
Ｘ／Ｙ→（ａ＊Ｘ＋ｂ＊Ｙ−ｂ＊（ｂ＋ａ））／（Ｙ−ｂ）                ・・・式（４）
Ｘ＋ｙ→Ｘ＋ａ＊ｙ                                                                        ・・・式（５）
Ｘ−ｙ→Ｘ−ａ＊ｙ                                                                        ・・・式（６）
ｙ−Ｘ→ａ＊ｙ−Ｘ＋２＊ｂ                                                        ・・・式（７）
ｙ＊Ｘ→ｙ＊Ｘ−ｂ＊ｙ＋ｂ                                                        ・・・式（８）
Ｘ／ｙ→（Ｘ−ｂ）／ｙ＋ｂ                                                        ・・・式（９）
ｙ／Ｘ→（ａ＊ａ＊ｙ）／（Ｘ−ｂ）＋ｂ                                                ・・・式（１０）
Ｘ→（Ｘ−ｂ）／ａ                                                                        ・・・式（１１）
但し、ｘ及びｙは符号化されていないデータを表し、Ｘ及びＹはそれぞれｘ及びｙを前記符号化規則で符号化した符号化データを示す。
【請求項４】
前記ａ及びｂを決定することにより前記符号化規則を決定する符号化規則決定手段をさらに備えることを特徴とする請求項３記載のプログラム難読化装置。
【請求項５】
データ及びそのデータを演算する演算式を含むプログラムを難読化する処理をコンピュータに実行させるプログラム難読化プログラムであって、
前記コンピュータを、
前記データを予め定められた符号化規則に基づいて符号化データに変換する符号化手段と、
前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換する演算式変換手段と、
前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換する復号化手段として機能させるとともに、
前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、
前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とするプログラム難読化プログラム。
【請求項６】
データ及びそのデータを演算する演算式を含むプログラムを難読化するプログラム難読化方法であって、
コンピュータが、前記データを予め定められた符号化規則に基づいて符号化データに変換するステップと、
コンピュータが、前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換するステップと、
コンピュータが、前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換するステップとを備え、
前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、
前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とするプログラム難読化方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、解析が困難なコンピュータプログラムを作成する技術に関する。
【０００２】
【従来の技術】
近年、プログラムの解析防止を目的として、プログラムを難読化する方式が多数提案されている。難読化（ｏｂｆｕｓｃａｔｉｏｎ）とは、与えられたプログラムを、人間にとって理解や解析が困難である複雑な（読みにくい）プログラムに変換する技術であり、曖昧化、混乱化とも呼ばれる。
【０００３】
プログラムは数多くの構文要素から構成されるため、それぞれの構文要素に対して異なる難読化の方式が存在しうる。そのため、従来提案されている難読化の方式も非常に多岐にわたっている。例えば、プログラム中のシンボリックな情報（変数名や手続き名）を人間にとって意味のない文字列に置換する方式（特許文献１）、プログラム中の制御構造を複雑にする方式（非特許文献１，２，３）、実行結果に影響を与えないダミーコードをプログラム中に挿入する方式（非特許文献４，５）、手続き（関数）の分割や結合を行う方式（非特許文献６，７，８）、プログラム中のデータを符号化する方式（特許文献２，非特許文献４、９）、符号化したデータを含む演算式から正規の演算値を得るための演算式の取り扱い方を示したもの（非特許文献１０）、プログラム中の複数のデータ（変数）を合成し，別の複数のデータ（変数）として再構成する方式（非特許文献１１）等が公表されている。
【０００４】
さらに、近年、プログラム実行中にスタックメモリに格納されるデータを覗き見することによりプログラムに含まれる秘密データを取得する手法が公表されている（非特許文献１２）。
【０００５】
【特許文献１】
Ｕｎｉｔｅｄ  Ｓｔａｔｅｓ  Ｐａｔｅｎｔ，  Ｎｏ．６，１０２，９６６．
【特許文献２】
特表２００２−５１４３３３  ”ソフトウェアセキュリティを増強するための混乱化技術”
【非特許文献１】
Ｃ．  Ｃｏｌｌｂｅｒｇ  ａｎｄ  Ｃ．  Ｔｈｏｍｂｏｒｓｏｎ，  ”Ｗａｔｅｒｍａｒｋｉｎｇ，  ｔａｍｐｅｒ−ｐｒｏｏｆｉｎｇ，  ａｎｄ  ｏｂｆｕｓｃａｔｉｏｎ  −  Ｔｏｏｌｓ  ｆｏｒ  ｓｏｆｔｗａｒｅ  ｐｒｏｔｅｃｔｉｏｎ，”  ＩＥＥＥ  Ｔｒａｎｓａｃｔｉｏｎｓ  ｏｎ  Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ，  Ｖｏｌ．２８，  Ｎｏ．６，  ２００２．
【非特許文献２】
門田暁人，  高田義広，  鳥居宏次，  ”プログラムの難読化法の提案”，  第５１回情報処理学会全国大会，  ｐｐ．４−２６３−４−２６４，  Ｓｅｐ．  １９９５．
【非特許文献３】
門田暁人，高田義広，鳥居宏次，”ループを含むプログラムを難読化する手法の提案，”  電子情報通信学会論文誌，Ｖｏｌ．Ｊ８０−Ｄ−Ｉ，  Ｎｏ．７，ｐｐ．６６４−６５２，１９９７．
【非特許文献４】
Ｃ．  Ｃｏｌｌｂｅｒｇ，  Ｃ．  Ｔｈｏｍｂｏｒｓｏｎ，  ａｎｄ  Ｄ．  Ｌｏｗ，”Ａ  ｔａｘｏｎｏｍｙ  ｏｆ  ｏｂｆｕｓｃａｔｉｎｇ  ｔｒａｎｓｆｏｒｍａｔｉｏｎｓ，”  Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ  ｏｆ  Ｄｅｐｔ．  ｏｆ  Ｃｏｍｐｕｔｅｒ  Ｓｃｉｅｎｃｅ，  Ｕｎｉｖｅｒｓｉｔｙ  ｏｆ  Ａｕｃｋｌａｎｄ，  Ｎｏ．１４８，  Ｎｅｗ  Ｚｅａｌａｎｄ，  １９９７．
【非特許文献５】
Ｃ．  Ｃｏｌｌｂｅｒｇ，  Ｃ．  Ｔｈｏｍｂｏｒｓｏｎ，  ａｎｄ  Ｄ．  Ｌｏｗ，  ”Ｍａｎｕｆａｃｔｕｒｉｎｇ  ｃｈｅａｐ，  ｒｅｓｉｌｉｅｎｔ，  ａｎｄ  ｓｔｅａｌｔｈｙ  ｏｐａｑｕｅ  ｃｏｎｓｔｒｕｃｔｓ，”  Ｉｎ  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＡＣＭ  ＳＩＧＰＬＡＮ−ＳＩＧＡＣＴ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｐｒｉｎｃｉｐｌｅｓ  ｏｆ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｌａｎｇｕａｇｅｓ  （ＰＯＰＬ’９８），  Ｓａｎ  Ｄｉｅｇｏ，  Ｃａｌｉｆｏｒｎｉａ，  １９９８．
【非特許文献６】
小木曽俊夫，  刑部裕介，  双紙正和，  宮地充子，  ”手続き間呼び出しの関係に着目した難読化手法の提案とその評価，”  暗号と情報セキュリティシンポジウム（ＳＣＩＳ２００２），Ｎｏ．  ６Ｃ−１，２００２．
【非特許文献７】
刑部裕介，双紙正和，  宮地充子，  ”オブジェクト指向言語の難読化の提案，”  電子情報通信学会技術報告，  Ｎｏ．  ＩＳＥＣ０２−６，  ２００２．
【非特許文献８】Ｈ．Ｇｏｔｏ，  Ｍ．Ｍａｍｂｏ，  Ｈ．Ｓｈｉｚｕｙａ，  Ｙ．Ｗａｔａｎａｂｅ，”Ｅｖａｌｕａｔｉｏｎ  ｏｆ  ｔａｍｐｅｒ−ｒｅｓｉｓｔａｎｔ  ｓｏｆｔｗａｒｅ  ｄｅｖｉａｔｉｎｇ  ｆｒｏｍ  ｓｔｒｕｃｔｕｒｅｄ  ｐｒｏｇｒａｍｍｉｎｇ  ｒｕｌｅｓ，”  Ｉｎ  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  Ａｕｓｔｒａｌａｓｉａｎ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ  ａｎｄ  Ｐｒｉｖａｃｙ  （ＡＣＩＳＰ２００１），  Ｌｅｃｔｕｒｅ  Ｎｏｔｅｓ  ｉｎ  Ｃｏｍｐｕｔｅｒ  Ｓｃｉｅｎｃｅ，  Ｖｏｌ．２１１９，  ｐｐ．１４５−１５８，  ２００１．
【非特許文献９】
Ｃ．  Ｃｏｌｌｂｅｒｇ，  Ｃ．  Ｔｈｏｍｂｏｒｓｏｎ，  Ｄ．  Ｌｏｗ，  ”Ｏｂｆｕｓｃａｔｉｏｎ  ｔｅｃｈｎｉｑｕｅｓ  ｆｏｒ  ｅｎｈａｎｃｉｎｇ  ｓｏｆｔｗａｒｅ  ｓｅｃｕｒｉｔｙ，”  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ａｐｐｌｉｃａｔｉｏｎ  Ｐｕｂｌｉｓｈｅｄ  ｕｎｄｅｒ  ｔｈｅ  Ｐａｔｅｎｔ  Ｃｏｏｐｅｒａｔｉｏｎ  Ｔｒｅａｔｙ  （ＰＣＴ），  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｐｕｂｌｉｃａｔｉｏｎ  Ｎｕｍｂｅｒ：  ＷＯ  ９９／０１８１５，  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｐｕｂｌｉｃａｔｉｏｎ  Ｄａｔａ：  １４  Ｊａｎｕａｒｙ  １９９９．
【非特許文献１０】
Ｔ．  Ｓａｎｄｅｒ  ａｎｄ  Ｃ．  Ｔｓｃｈｕｄｉｎ，  ”Ｔｏｗａｒｄｓ  Ｍｏｂｉｌｅ  Ｃｒｙｐｔｏｇｒａｐｈｙ”，  Ｉｎ  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ＩＥＥＥ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｓｅｃｕｒｉｔｙ  ａｎｄ  Ｐｒｉｖａｃｙ，  Ｏａｋｌａｎｄ，  Ｃａｌｉｆｏｒｎｉａ，  Ｍａｙ  １９９８．
【非特許文献１１】
Ｆｒｉｔｚ  Ｈｏｈｌ，  ”Ａｎ  ａｐｐｒｏａｃｈ  ｔｏ  ｓｏｌｖｅ  ｔｈｅ  ｐｒｏｂｌｅｍ  ｏｆ  ｍａｌｉｃｉｏｕｓ  ｈｏｓｔｓ，”  Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ  ｏｆ  Ｆａｋｕｌｔａｅｔ  Ｉｎｆｏｒｍａｔｉｋ，  Ｕｎｉｖｅｒｓｉｔａｅｔ  Ｓｔｕｔｔｇａｒｔ，  Ｇｅｒｍａｎｙ，  ＴＲ−１９９７−０３，  Ｍａｒｃｈ  １９９７．
【非特許文献１２】
赤井健一郎，  三澤学，  松本勉，  ”ランタイムデータ探索型耐タンパー性評価法，”  情報処理学会論文誌，  Ｖｏｌ．４３，  Ｎｏ．８，  ｐｐ．２４４７−２４５７，  ２００２．
【０００６】
【発明が解決しようとする課題】
しかしながら、非特許文献１〜３，５〜８，１１及び特許文献１の方式は、いずれもプログラム中のデータを符号化していないため、プログラム中のデータを隠蔽したい場合に役立たない。また、非特許文献１２の手法を用いてスタックメモリを覗き見した場合、プログラムに含まれる秘密データが取得される危険性がある。また、データを符号化する方式である特許文献２及び非特許文献４，１０では、制御変数ｉを符号化する簡単な例が示されているだけであり、制御変数ｉ以外のデータを符号化することが示されていないため、一般的なプログラムに適用することができないという問題がある。さらに、符号化されたデータを含む演算式の取り扱い方を示した非特許文献１０の手法は、特定の演算式（多項式で表される演算）にしか適用することができず、一般的なプログラムに適用することができないという問題がある。
【０００７】
本発明の目的は、プログラムを読んだときに秘密データやアルゴリズムを読み取りにくくするとともに、スタックメモリの覗き見によるプログラムの秘密データの取得も困難にでき、さらには、一般的なプログラムに対して適用することができる難読化手法によりプログラムを難読化することができるプログラム難読化装置、プログラム難読化プログラム及びプログラム難読化方法を提供することを目的とする。
【０００８】
【課題を解決するための手段】
本発明のプログラム難読化装置は、データ及びそのデータを演算する演算式を含むプログラムを難読化するプログラム難読化装置であって、前記データを予め定められた符号化規則に基づいて符号化データに変換する符号化手段と、前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換する演算式変換手段と、前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換する復号化手段とを備え、前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とする。
【０００９】
この構成によれば、プログラム中のデータは、予め定められた符号化規則によって符号化データされ、符号化データを含む演算式は、その符号化規則に対応する演算子変換規則によって各演算子が変換され、符号化演算式に変換される。この演算子変換規則は、第１の演算値＝第２の演算値を符号化規則で符号化した値、となるように演算子を変換するものである。
【００１０】
したがって、符号化されたデータ及び符号化演算式を含むプログラムを実行した場合、スタックメモリを覗き見しても、元のデータがスタックメモリに格納されず、また、演算式も元の演算式とは異なる式となっているため、スタックメモリの覗き見によるプログラムに含まれる秘密データの取得を困難にすることができる。さらに、演算子変換規則は、少なくとも加算、減算、乗算及び除算の演算子のそれぞれに対応する演算子変換規則を備えているため、加算、減算、乗算及び除算等の演算子からなる一般的な演算式を含むようなプログラムを難読化することができる。
【００１１】
また、前記データは複数種類のデータを含み、前記演算式は複数種類の演算式を含み、前記データ符号化手段によって符号化されるデータを前記複数のデータから決定するデータ決定手段をさらに備え、前記演算式変換手段は、前記データ決定手段によって決定されたデータを含む演算式を前記演算子変換規則で変換することが好ましい。
【００１２】
この構成によれば、プログラム中に複数種類のデータが存在する場合、そのいずれか、又は全てを符号化することができる。符号化されるデータの種類が多いほど、プログラムは解析が困難となるため、プログラムの解析をより困難化することができる。一方、全てのデータを符号化するのではなく、解読されたくないデータのみを符号化することにより、符号化に費やされる計算量を減少させ、処理の高速化を図ることができる。
【００１３】
また、前記符号化規則はＸ＝ａｘ＋ｂで表され（ａ，ｂは定数）、前記演算子変換規則は、式（１）〜（１０）で表され、前記復号化規則は、式（１１）で表されることが好ましい。
【００１４】
Ｘ＋Ｙ→  Ｘ＋Ｙ−ｂ                                                                    ・・・式（１）
Ｘ−Ｙ→Ｘ−Ｙ＋ｂ                                                                        ・・・式（２）
Ｘ＊Ｙ→（Ｘ＊Ｙ−ｂ＊（Ｘ＋Ｙ−ｂ−ａ））／ａ                                ・・・式（３）
Ｘ／Ｙ→（ａ＊Ｘ＋ｂ＊Ｙ−ｂ＊（ｂ＋ａ））／（Ｙ−ｂ）・・・式（４）
Ｘ＋ｙ→Ｘ＋ａ＊ｙ                                                                        ・・・式（５）
Ｘ−ｙ→Ｘ−ａ＊ｙ                                                                        ・・・式（６）
ｙ−Ｘ→ａ＊ｙ−Ｘ＋２＊ｂ                                                        ・・・式（７）
ｙ＊Ｘ→ｙ＊Ｘ−ｂ＊ｙ＋ｂ                                                        ・・・式（８）
Ｘ／ｙ→（Ｘ−ｂ）／ｙ＋ｂ                                                        ・・・式（９）
ｙ／Ｘ→（ａ＊ａ＊ｙ）／（Ｘ−ｂ）＋ｂ                                                ・・・式（１０）
Ｘ→（Ｘ−ｂ）／ａ                                                                        ・・・式（１１）
但し、ｘ及びｙは符号化されていないデータを表し、Ｘ及びＹはｘ及びｙをそれぞれ前記符号化規則で符号化した符号化データを示す。
【００１５】
この構成によれば、ａｘ＋ｂというような線形変換式で表される簡略的な処理でデータを符号化することができる。
【００１６】
また、前記ａ及びｂを決定することにより前記符号化規則を決定する符号化規則決定手段をさらに備えることが好ましい。この構成によれば、変換式の定数であるａ及びｂを定めるという簡略化された処理により、符号化規則を決定することができる。ここで、ａ及びｂの決定は、本装置が決定してもよいし、ユーザが本装置にａ及びｂの値を入力することにより決定してもよい。
【００１７】
本発明に係るプログラム難読化プログラムは、データ及びそのデータを演算する演算式を含むプログラムを難読化する処理をコンピュータに実行させるプログラム難読化プログラムであって、前記コンピュータを、前記データを予め定められた符号化規則に基づいて符号化データに変換する符号化手段と、前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換する演算式変換手段と、前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換する復号化手段として機能させるとともに、前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とする。
【００１８】
本プログラム難読化方法は、データ及びそのデータを演算する演算式を含むプログラムを難読化するプログラム難読化方法であって、コンピュータが、前記データを予め定められた符号化規則に基づいて符号化データに変換するステップと、コンピュータが、前記符号化規則に対応する演算子変換規則を用いて前記演算式に含まれる演算子を変換することにより前記演算式を符号化演算式に変換するステップと、コンピュータが、前記符号化規則に対応する復号化規則を用いて前記演算式に含まれる演算子を変換することにより前記符号化演算式を復号化演算式に変換するステップとを備え、前記演算子変換規則は、少なくとも加算、減算、乗算及び除算のそれぞれの演算子に対応する演算子変換規則を備え、前記符号化データを前記符号化演算式に代入したときに得られる第１の演算値及び符号化されていないデータを前記演算式に代入したときに得られる第２の演算値の関係が、第１の演算値＝第２の演算値を前記符号化規則で符号化した値、となるように演算子を変換し、前記復号化規則は、前記復号化演算式に前記符号化データを代入したときに得られる第３の演算値が前記第２の演算値となるように演算子を変換することを特徴とする。
【００１９】
【発明の実施の形態】
以下、本発明の一実施の形態によるプログラム難読化装置について図面を参照しながら説明する。図１は、本発明の一実施の形態によるプログラム難読化装置のハードウェア構成を示すブロック図である。
【００２０】
図１に示すプログラム難読化装置は、通常のコンピュータから構成され、入力装置１、ＲＯＭ（リードオンリメモリ）２、ＣＰＵ（中央演算処理装置）３、ＲＡＭ（ランダムアクセスメモリ）４、外部記憶装置５、表示装置６及び記録媒体駆動装置７を備えている。各ブロックは内部のバスに接続され、このバスを介して種々のデータ等が入出力され、ＣＰＵ３の制御の下、種々の処理が実行される。
【００２１】
入力装置１は、キーボード、マウス等から構成され、操作者が種々のデータ及び操作指令等を入力するために使用される。
【００２２】
ＲＯＭ２には、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ／Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）等のシステムプログラム等が記憶されている。外部記憶装置５は、ハードディスクドライブ等から構成され、所定のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）及び後述するプログラム難読化プログラム等が記憶されている。ＲＡＭ４は、ＣＰＵ３の作業領域等として用いられる。
【００２３】
記録媒体駆動装置７は、ＣＤ−ＲＯＭドライブ、フレキシブルディスクドライブ等から構成される。なお、プログラム難読化プログラムを、ＣＤ−ＲＯＭ、フレキシブルディスク等のコンピュータ読み取り可能な記録媒体８に記録し、記録媒体駆動装置７により記録媒体８からプログラム難読化プログラムを読み出して外部記憶装置５にインストールして実行するようにしてもよい。また、プログラム難読化装置が通信装置等を備え、プログラム難読化プログラムが通信ネットワークを介して接続された他のコンピュータに記憶されている場合、当該コンピュータからネットワークを介してプログラム難読化プログラムをダウンロードして実行するようにしてもよい。
【００２４】
表示装置６は、液晶表示装置、ＣＲＴ（陰極線管）等から構成され、ＣＰＵ３の制御の基、種々の画像を表示する。
【００２５】
図２は、ＣＰＵ３が備える機能を示したブロック図である。ＣＰＵ３は、符号化規則決定部３１、データ決定部３２、データ符号化部３３、演算式変換部３４及び復号化処理部３５を機能的に備えており、これらの機能は、ＣＰＵ３がプログラム難読化プログラムを実行することによって実現される。
【００２６】
符号化規則決定部３１は、プログラムのデータｘを符号化規則により変換するための符号化規則を決定する。本実施形態では、データｘは、Ｘ＝ａｘ＋ｂによって線形変換されてＸに符号化されるため、符号化規則決定部３１は、定数ａ及びｂを決定することにより、符号化規則を決定する。ここで、符号化規則決定部３１は、定数ａ及びｂをランダムに決定してもよいし、オペレータによって入力装置１から入力されたデータを定数ａ及びｂとしてもよい。なお、ａ，ｂはともに整数であり、ａ≧１である。
【００２７】
データ決定部３２は、プログラム中の複数種類のデータの中から符号化するデータを決定する。ここで、データ決定部３２は、符号化するデータをランダムに決定してもよいし、オペレータによって入力装置１を介して指定されたデータを符号化するデータとして決定してもよい。
【００２８】
データ符号化部３３は、データ決定部３２が決定したデータを、符号化規則決定部３１が決定した符号化規則を用いて符号化する。本実施形態では、符号化規則は、ａｘ＋ｂで表されるため、データ符号化部３３は、データ決定部３２によって決定されたデータｘに、Ｘ＝ａｘ＋ｂの演算を施すことでデータｘを符号化データＸに符号化する。
【００２９】
演算式変換部３４は、符号化されたデータを含む演算式の全ての演算子に対し、以下に示す演算子変換規則１〜１０を優先順に適用して演算式を符号化演算式に変換する。ここで、優先順とは、一般的な多項式に用いられる演算式の優先順（演算順）と同じ順序である。例えば、式中、左に位置する演算子の方が右に位置する演算子よりも先に演算され、乗算及び除算は加算及び減算よりも先に演算される。
変換規則１  Ｒ１（ａ，ｂ）：Ｘ＋Ｙ→Ｘ＋Ｙ−ｂ
変換規則２  Ｒ２（ａ，ｂ）：Ｘ−Ｙ→Ｘ−Ｙ＋ｂ
変換規則３  Ｒ３（ａ，ｂ）：Ｘ＊Ｙ→（Ｘ＊Ｙ−ｂ＊（Ｘ＋Ｙ−ｂ−ａ））／ａ
変換規則４  Ｒ４（ａ，ｂ）：Ｘ／Ｙ→（ａ＊Ｘ＋ｂ＊Ｙ−ｂ＊（ｂ＋ａ））／（Ｙ−ｂ）
変換規則５  Ｒ５（ａ，ｂ）：Ｘ＋ｙ→Ｘ＋ａ＊ｙ
変換規則６  Ｒ６（ａ，ｂ）：Ｘ−ｙ→Ｘ−ａ＊ｙ
変換規則７  Ｒ７（ａ，ｂ）：ｙ−Ｘ→ａ＊ｙ−Ｘ＋２＊ｂ
変換規則８  Ｒ８（ａ，ｂ）：ｙ＊Ｘ→ｙ＊Ｘ−ｂ＊ｙ＋ｂ
変換規則９  Ｒ９（ａ，ｂ）：Ｘ／ｙ→（Ｘ−ｂ）／ｙ＋ｂ
変換規則１０  Ｒ１０（ａ，ｂ）：ｙ／Ｘ→（ａ＊ａ＊ｙ）／（Ｘ−ｂ）＋ｂ
【００３０】
ここに示した符号化規則Ｃ（ａ，ｂ）及び演算子変換規則Ｒ（ａ，ｂ）は、ａ，ｂに関して１対１に対応している。つまり、符号化規則Ｃ（ａ，ｂ）のａ，ｂを決定した段階で演算子変換規則Ｒ（ａ，ｂ）も決定されることとなる。したがって、符号化規則Ｃ（２，１）を用いてデータを符号化した後、演算子変換規則Ｒ（３，２）を用いて演算子を変換することはできない。つまり、Ｃ（２，１）を用いてデータを符号化した後は、Ｒ（２，１）を用いる必要がある。
【００３１】
なお、上記の大文字で示す「Ｘ」及び「Ｙ」には符号化されたデータが格納されることを示し、小文字で示す「ｘ」及び「ｙ」は符号化されていないデータが格納されることを示している。例えば、「Ｘ＋ｙ」は演算子＋の両側の値のうち、「Ｘ」には符号化されたデータが格納され、「ｙ」には符号化されていないデータが格納されていることを示している。また、変換規則１〜１０のａ及びｂの値は、符号化規則決定部３１によって決定されたａ及びｂの値と同じ値が用いられる。これにより、符号化演算式に符号化データＸを代入して得られた演算結果（第１の演算値Ｚ１）と、変換前の演算式に符号化されていないデータｘを代入したときに得られる演算結果（第２の演算値Ｚ２）とは、Ｚ１＝Ｚ２＊ａ＋ｂの関係、すなわち、符号化規則決定部３１で決定された符号化規則の関係を有することとなる。なお、第２の演算値Ｚ２は、演算式の正規の演算結果である。
【００３２】
復号化処理部３５は、第１の演算値Ｚ１が、第２の演算値Ｚ２となるような復号化規則を用いて、符号化演算式を復号化演算式に変換する。あるいは、第１の演算値Ｚ１を引数として第２の演算値Ｚ２を得る命令文をプログラム中に追加する。したがって、復号化演算式に符号化データを代入することにより得られた第３の演算値は、第３の演算値＝第２の演算値となる。本実施形態では、演算子変換規則がａｘ＋ｂであるため、復号化規則は以下の関係式で表される。
復号化規則：Ｄ（ａ，ｂ）：Ｘ→（Ｘ−ｂ）／ａ
【００３３】
次に、本プログラム難読化装置の処理の概要を簡単な例を用いて説明する。プログラム中のデータｘ＝１０、ｙ＝２０と演算ｘ＊ｙ＝２００に対して、ｘのみを符号化する場合を考える。符号化規則としてＣ（２，１）を用いると、
Ｘ＝２＊１０＋１＝２１
によりｘ＝１０はＸ＝２１に符号化される。
このとき、Ｘとｙとの積Ｘ＊ｙは、変換規則８を用いて、次のように変換される。
Ｘ＊ｙ→ｙ＊Ｘ−ｙ＋１＝２０＊２１−２０＋１＝４０１
これは、もとのデータの積ｘ＊ｙ＝２００に符号化規則を適用したものとなっている。そして、復号化規則Ｄ（２，１）、つまり符号化の逆変換を行えば、元のデータ演算結果が得られることとになる。
（４０１−１）／２＝２００
【００３４】
図３は、本プログラム難読化装置の処理を示したフローチャートである。また、図４は、難読化されるプログラムの一例を示した図であり、（ａ）は難読化前のプログラムを示し、（ｂ）はｐ＝１に関して難読化されたプログラムを示している。
【００３５】
（ａ）に示すプログラムは、Ｃ言語で記述されたプログラムであり、４個のデータから２個のデータを選ぶ場合の組み合わせの数（ｃｏｍｂｉｎａｔｉｏｎ）を計算するプログラムである。すなわち、ｉを１から２まで変化させてｐ＝ｐ＊（ｎ−ｉ＋１）／ｉを計算するプログラムである。以下、図３のフローチャートに従って、図４（ａ）のプログラムを難読化する処理を説明する。
【００３６】
まず、ステップＳ１において、符号化規則決定部３１は、Ｘ＝ａｘ＋ｂの定数ａ及びｂを特定することにより符号化規則Ｃ（ａ，ｂ）を決定する。以下、（ａ，ｂ）＝（２，１）、すなわち、符号化規則Ｃ（ａ，ｂ）として２ｘ＋１が決定されたものとする。
【００３７】
ステップＳ２において、データ決定部３２は、符号化するデータを決定する。本フローチャートの例では、ｐ＝１を符号化するデータとして決定している。ここで、符号化規則決定部３１は、符号化するデータとして、ｐ以外のｎ及びｉのうちのいずれか１つ、ｐ、ｎ及びｉのうちいずれか２つ、又は、ｐ、ｎ及びｉの全てを符号化するデータとして決定してもよい。
【００３８】
ただし、図４の例では、ｐ＝ｐ＊（ｎ−ｉ＋１）／ｉという式を含むため、ｎ又はｉの符号化がｐにも影響を与える。そのため、ｐに関する符号化は、必ず行うことが求められる。すなわち、ｎ，ｉのうちいずれか１つのみを、あるいは、ｎ，ｉの２つのみを符号化した場合では、正しい結果は得られない。
【００３９】
ステップＳ３において、データ符号化部３３は、ステップＳ１で決定されたデータを、ステップＳ２で決定された符号化規則を用いて符号化し符号化データＸとする。この場合、図４（ｂ）に示すように、ｐ＝１に２＊１＋１（＝３）の演算が施され、ｐ＝１が符号化規則Ｃ（２，１）によって符号化データとされている。これにより、データが隠蔽化される。
【００４０】
ステップＳ４において、演算式変換部３４は、符号化データＸを含む演算式（図４の例ではｐ＝ｐ＊（ｎ−ｉ＋１）／ｉ）の演算子に対し、演算規則１〜１０を適用して演算式を符号化演算式Ｅ２に変換する。これにより演算式が隠蔽化される。
【００４１】
図５は、図４（ａ）に示す演算式Ｅ１に演算子変換規則が適用される処理を示したフローチャートである。まず、ステップＳ４１において、アンダーラインで示すｐ＊（ｎ−ｉ＋１）に対し、ｐをＸ、ｎ−ｉ＋１をｙとして、変換規則８（ｙ＊Ｘ→ｙ＊Ｘ−ｙ＋１）が適用され、ｐ＊（ｎ−ｉ＋１）がｐ＊（ｎ−ｉ＋１）−（ｎ−ｉ＋１）＋１に変換される。
【００４２】
ステップＳ４２において，アンダーラインで示す（ｐ＊（ｎ−ｉ＋１）−（ｎ−ｉ＋１）＋１）／ｉに対し、ｐ＊（ｎ−ｉ＋１）−（ｎ−ｉ＋１）＋１をＸ、ｉをｙとして、変換規則９（Ｘ／ｙ→（Ｘ−１）／ｙ＋１）が適用され、（ｐ＊（ｎ−ｉ＋１）−（ｎ−ｉ＋１）＋１）／ｉが（ｐ−１）＊（ｎ−ｉ＋１）／ｉ＋１に変換される。
【００４３】
以上、ステップＳ４１、Ｓ４２の変換処理によって、図４（ａ）で示す演算式Ｅ１は、図４（ｂ）で示す符号化演算式Ｅ２に変換される。この段階で、符号化演算式Ｅ２にｐ＝３を代入したときに得られる第１の演算値Ｚ１は、演算式Ｅ１にｐ＝１を代入したときの演算値である第２の演算値Ｚ２に対し、Ｚ２＝２＊Ｚ１＋１の関係を有している。
【００４４】
図３に示すステップＳ５において、復号化処理部３５は、復号化される必要のある符号化されたデータを復号化する。図４（ａ）の例では、プログラムの４行目に演算式Ｅ１の演算結果を表示する命令文Ｉ１があるため、復号化が必要となる。したがって、この命令文Ｉ１のアンダーラインで示すｐをＸとして、復号化規則を適用し、ｐを（ｐ−１）／２と変更することにより、復号化を行っている。これにより、演算式Ｅ１にｐ＝１を代入したときの演算値である第２の演算値（正規の演算値）を得ることができる。
【００４５】
ステップＳ６において、全てのデータについて符号化が終了しているか否かが判断され、全てのデータについて符号化が終了している場合（ステップＳ６でＹＥＳ）処理が終了され、全てのデータについて処理が終了していない場合（ステップＳ６でＮＯ）、ステップＳ３に戻る。図４（ａ）の例では、ｐのみを符号化しているため、ステップＳ６でＹＥＳと判断され、処理が終了される。
【００４６】
次に、本プログラム難読化装置による効果について説明する。図６は、本プログラム難読化装置の効果を説明するための図であり、（ａ）は難読化される前のプログラムを示し、（ｂ）は難読化されたプログラムを示し、（ｃ）は（ａ）のトレース結果を示し、（ｄ）は（ｂ）のトレース結果を示している。（ａ）に示すプログラムは、ｉを１から３まで変化させて、ｐ＝ｋ＊（ｐ＊ｉ）を計算するプログラムである。このプログラムを符号化規則Ｃ（２，１）及び演算子変換規則Ｒ（２，１）を用いてｉ，ｐ，ｋに関して難読化すると、演算式ｐ＝ｋ＊（ｐ＊ｉ）は、ｐ＝（（ｋ−１）（ｐ＊ｉ―ｐ−ｉ＋３）−２＊ｋ＋６）／４に変換される。また、ｐ＝１はｐ＝３に、ｋ＝１０はｋ＝２１に、ｉ＝１〜３はｉ＝３〜７に符号化され、また、ｉ＋＋（ｉ＝ｉ＋１）は演算子変換規則５によってｉ＋＝２（ｉ＝ｉ＋２）へ変換される。
【００４７】
図６（ａ）に示すデータｉ（＝１〜３）に関してトレースすると、ｐ＝１０，２００，６０００が得られる（（ｃ）参照）。図６（ｂ）に示す演算式をｉ（＝３〜７）に関してトレースすると、ｐ＝２１，４０１，１２００１が得られる（（ｄ）参照）。したがって、（ｂ）のプログラムを実行した場合、コンピュータのスタックメモリ上に、符号化される前のｐ，ｋ，ｉの値が直接現れないいため、スタックメモリを解析しても、元のプログラムに含まれるデータを取得することは困難となる。なお、（ｄ）のｉ＝７の場合のｐ（＝１２００１）を復号化規則Ｄ（２，１）を用いて復号化すると、６０００（＝（１２００１−１）／２）となり、正規の値が得られる。
【００４８】
なお上記実施形態では、１つのデータ（ｐ）について符号化規則Ｃ（２，１）を用いて１回だけ符号化しているが、これに限定されず、１つのデータに対して複数回符号化規則Ｃ（２，１）を適用してデータを変換してもよい。例えば、ｎ＝５２について、符号化規則Ｃ（２，１）を３回適用すると、ｎ＝５２は１回目の符号化で１０５、２回目の符号化で２１１、３回目の符号化で４２３と符号化される。この場合、ｎを含む演算式は、ｎが符号化される毎に演算子変換規則Ｒ（２，１）を用いてｎに関して変換してやればよい。
【００４９】
【発明の効果】
請求項１、６、７記載の発明によれば、データを符号化するとともにそのデータを含む演算式を変換するため、プログラムを読んでも秘密データやアルゴリズムを読み取るのが困難になるとともに、スタックメモリに格納されたデータを解析しても、元のプログラムに含まれる秘密データを取得することを困難にすることができる。また、各種演算子に対応する演算子変換規則を用いているため、加算、減算、除算及び乗算等の演算子からなる一般的な演算式を含むプログラムを難読化することができる。
【００５０】
請求項２記載の発明によれば、プログラム中に複数種類のデータが存在する場合、そのいずれか又は複数を符号化することができる。
【００５１】
請求項３記載の発明によれば、プログラムの解読をより困難にすることができる。
【００５２】
請求項４記載の発明によれば、データを簡略的に符号化することができる。
【００５３】
請求項５記載の発明によれば、変換式の定数を定めるだけで、符号化規則を決定することができる。
【図面の簡単な説明】
【図１】本発明の一実施の形態によるプログラム難読化装置のハードウェア構成を示すブロック図である。
【図２】ＣＰＵが備える機能を示したブロック図である。
【図３】本プログラム難読化装置の処理を示したフローチャートである。
【図４】難読化されるプログラムの一例を示した図であり、（ａ）は難読化前のプログラムを示し、（ｂ）はｐ＝１に関して難読化されたプログラムを示している。
【図５】図４に示す演算式に演算子変換規則が適用される処理を説明するための図である。
【図６】本プログラム難読化装置の効果を説明するための図であり、（ａ）は難読化される前のプログラムを示し、（ｂ）は難読化されたプログラムを示し、（ｃ）は（ａ）のトレース結果を示し、（ｄ）は（ｂ）のトレース結果を示している。
【符号の説明】
１  入力装置
２  ＲＯＭ
３  ＣＰＵ
４  ＲＡＭ
５  外部記憶装置
６  表示装置
７  記録媒体駆動装置
８  記録媒体
３１  符号化規則決定部
３２  データ決定部
３３  データ符号化部
３４  演算式変換部
３５  復号化処理部
【図１】
2005049925.tif 000003
【図２】
2005049925.tif 000004
【図３】
2005049925.tif 000005
【図４】
2005049925.tif 000006
【図５】
2005049925.tif 000007
【図６】
2005049925.tif 000008