(57)【要約】【課題】プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成する疑似乱数生成装置及び方法、並びに、プログラムの解析を困難にするプログラム難読化装置及び方法を提供すること。【解決手段】疑似乱数生成装置１０は、疑似乱数生成プログラムを実行する仮想マシン２０を起動し、仮想マシン２０は、疑似乱数生成プログラムの少なくとも一部の実行命令を、命令変換表３２に基づいて変換し、変換した実行命令を実行する。プログラム難読化装置４０は、命令変換表３２を作成し、作成した命令変換表３２を組み入れた仮想マシンソフトウェアを作成すると共に、命令変換表３２に基づいて変換したプログラムを作成し、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。【選択図】図１
2015114964.tif 000002
【特許請求の範囲】
【請求項１】
疑似乱数を生成する疑似乱数生成装置であって、
疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する起動手段を備え、
前記仮想マシンは、
前記疑似乱数生成プログラムを記憶するプログラム記憶手段と、
プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表と、
前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御手段とを備える、
疑似乱数生成装置。
【請求項２】
前記仮想マシンは、
前記起動手段によって起動されると、前記命令変換表における実行命令の対応付けを変更する変更手段を、さらに備える請求項１に記載の疑似乱数生成装置。
【請求項３】
前記仮想マシンは、
前記疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表と、
前記疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、前記変数変換表に基づいて変換し、変換した変数値を前記変数に記憶させる変数制御手段とを、さらに備える請求項１又は２に記載の疑似乱数生成装置。
【請求項４】
請求項１に記載の疑似乱数生成装置が実行する方法であって、
前記起動手段が、前記疑似乱数生成プログラムを実行する仮想マシンを起動する起動ステップと、
前記仮想マシンの前記実行制御手段が、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御ステップと、
を備える方法。
【請求項５】
仮想マシン上で動作するプログラムを難読化するプログラム難読化装置であって、
プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成手段と、
前記変換表作成手段によって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成手段と、
プログラムを前記命令変換表に基づいて変換するプログラム変換手段と、
前記仮想マシンソフトウェア作成手段によって作成された前記仮想マシンソフトウェアと、前記プログラム変換手段によって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布手段と、
を備えるプログラム難読化装置。
【請求項６】
前記仮想マシンソフトウェア作成手段は、前記命令変換表を仮想マシンソフトウェアに組み入れることに替えて、前記命令変換表をダウンロードするように、仮想マシンソフトウェアに組み入れる、請求項５に記載のプログラム難読化装置。
【請求項７】
請求項５に記載のプログラム難読化装置が実行する方法であって、
前記変換表作成手段が、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成ステップと、
前記仮想マシンソフトウェア作成手段が、前記変換表作成ステップによって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成ステップと、
前記プログラム変換手段が、プログラムを前記命令変換表に基づいて変換するプログラム変換ステップと、
前記配布手段が、前記仮想マシンソフトウェア作成ステップによって作成された前記仮想マシンソフトウェアと、前記プログラム変換ステップによって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布ステップと、
を備える方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法に関する。
【背景技術】
【０００２】
従来より、シミュレーション実験やゲーム等に利用される乱数の生成について、様々な生成法が開示されている。例えば、真の乱数生成法として、原子核崩壊等を活用する自然乱数生成法がある。また、時刻等をシードとしてプログラムを用いて生成する疑似乱数生成法がある。
【０００３】
非特許文献１は、高品質の疑似乱数を高速に生成する疑似乱数生成器を開示する。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】Ｍ．  Ｍａｔｓｕｍｏｔｏ  ａｎｄ  Ｔ．  Ｎｉｓｈｉｍｕｒａ，  Ｍｅｒｓｅｎｎｅ  ｔｗｉｓｔｅｒ：  Ａ  ６２３−ｄｉｍｅｎｓｉｏｎａｌｌｙ  ｅｑｕｉｄｉｓｔｒｉｂｕｔｅｄ  ｕｎｉｆｏｒｍ  ｐｓｅｕｄｏｒａｎｄｏｍ  ｎｕｍｂｅｒ  ｇｅｎｅｒａｔｏｒ，  ＡＣＭ  Ｔｒａｎｓ．  ｏｎ  Ｍｏｄｅｌｉｎｇ  ａｎｄ  Ｃｏｍｐｕｔｅｒ  Ｓｉｍｕｌａｔｉｏｎｓ，  １９９８．
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、原子核崩壊等を活用する方法では、特別な装置を必要とし、装置が高価であるという問題点があった。また、プログラムによる疑似乱数を生成する方法では、プログラムが解析された場合、乱数の生成手法が明らかとなり、乱数性が損なわれる（攻撃者にとって予測可能となる）可能性があった。さらに、プログラムの解析を防ぐ手法として難読化が考案されているが、逆コンパイルにより、元のソースコードに近いコードが復元されるような状況では、十分な安全性を有していなかった。
【０００６】
そこで、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成する装置が求められている。また、プログラムの解析を困難にする装置が求められている。
【０００７】
本発明は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成する疑似乱数生成装置及び方法、並びに、プログラムの解析を困難にするプログラム難読化装置及び方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、コンピュータ上で疑似乱数を生成する手法であって、次のような特徴を有する。
（ａ）プログラムは、ある固定の疑似乱数生成ロジックを持つ。
（ｂ）プログラムは、ある仮想マシン（ＶＭ）上で実行される。
（ｃ）仮想マシンは、起動時にランダムに命令変換表を作成し、プログラムの実行命令を命令変換表に基づいて変換して実行する。
（ｄ）また、特定の変数についても、仮想マシン上において乱数を足し合わせる等の変形を行い実行する。なお、命令変換表を作成するための乱数や、変数についての乱数は、仮想マシンが従来方式により生成する。
（ｅ）命令変換表を固定とすることで、環境ごとに異なる指紋データを生成可能である。すなわち、命令変換表自体又は生成した疑似乱数自体が各環境の識別子として活用できる。これにより、実行環境の検証データ（どの実行環境で実行されたかの証拠データ）を生成することができる。
（ｆ）また、命令変換表を固定としその表を秘匿して保管することで、プログラムを見ただけではその動作を解析することができない難読化手法を実現する。
（ｇ）さらに、上記の難読化手法において、仮想マシンが命令変換表を動的にダウンロードする手法を具備することにより安全性を向上させることができる。
（ｈ）さらに、上記の難読化手法において、サーバ上から命令変換表を削除することで、プログラムを正しく実行できなくすることができるようになる。
【０００９】
具体的には、以下のような解決手段を提供する。
（１）  疑似乱数を生成する疑似乱数生成装置であって、疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する起動手段を備え、前記仮想マシンは、前記疑似乱数生成プログラムを記憶するプログラム記憶手段と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表と、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御手段とを備える、疑似乱数生成装置。
【００１０】
（１）の構成によれば、（１）に係る疑似乱数生成装置は、疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する。仮想マシンは、疑似乱数生成プログラムを記憶するプログラム記憶手段と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表とを備え、疑似乱数生成プログラムの少なくとも一部の実行命令を、命令変換表に基づいて変換し、変換した実行命令を実行する。
【００１１】
すなわち、疑似乱数生成プログラムは、疑似乱数生成装置の仮想マシン上で、少なくとも一部の実行命令が命令変換表に基づいて変換されて実行される。
したがって、（１）に係る疑似乱数生成装置は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【００１２】
（２）  前記仮想マシンは、前記起動手段によって起動されると、前記命令変換表における実行命令の対応付けを変更する変更手段を、さらに備える（１）に記載の疑似乱数生成装置。
【００１３】
したがって、（２）に係る疑似乱数生成装置は、疑似乱数生成プログラムの実行命令について、変換の対応付けを変更するので、疑似乱数生成プログラムが解析されても乱数性がより損なわれない疑似乱数を生成することができる。
【００１４】
（３）  前記仮想マシンは、前記疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表と、前記疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、前記変数変換表に基づいて変換し、変換した変数値を前記変数に記憶させる変数制御手段とを、さらに備える（１）又は（２）に記載の疑似乱数生成装置。
【００１５】
したがって、（３）に係る疑似乱数生成装置は、疑似乱数生成プログラムの実行において変数値を変換して記憶させるので、疑似乱数生成プログラムが解析されても乱数性がより損なわれない疑似乱数を生成することができる。
【００１６】
（４）  （１）に記載の疑似乱数生成装置が実行する方法であって、前記起動手段が、前記疑似乱数生成プログラムを実行する仮想マシンを起動する起動ステップと、前記仮想マシンの前記実行制御手段が、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御ステップとを備える、方法。
【００１７】
したがって、（４）に係る方法は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【００１８】
また、以下のようなプログラム難読化装置によりプログラムの難読化を実現することができる。
（ａ）固定の命令変換表又は変数変換表を作成し、仮想マシンソフトウェアに安全な形で埋め込んでおく。仮想マシンソフトウェアは解析されないものとする。
（ｂ）保護したいプログラムを固定の命令変換表又は変数変換表に基づいて変換する。その後、この変換されたプログラムや仮想マシンは、利用者のもとに配布される。
（ｃ）プログラムは、命令変換表又は変数変換表が埋め込まれた仮想マシン（ＶＭ）上で実行される。不正者が変換されたプログラムを解析しようとした場合、命令変換表又は変数変換表によりプログラムが変更されているため、命令変換表又は変数変換表を知らない攻撃者は解析できない。一方で、命令変換表又は変数変換表を内蔵した仮想マシンソフトウェアでは、各演算命令が命令変換表又は変数変換表により元の形に変換されて実行されるため、変換前のプログラムの動作と同じ動作をすることが保証される。
（ｄ）なお、命令変換表又は変数変換表を動的に安全にダウンロード（例えば、管理するサーバからダウンロード）する機構を仮想マシンソフトウェアに具備すれば、当該プログラム実行時のみ動的に命令変換表又は変数変換表をダウンロードして実行することができるため、仮想マシンソフトウェアを解析されたとしても命令変換表又は変数変換表が漏洩することは無い。また、この仕組みを応用することにより、命令変換表又は変数変換表を削除（例えば、管理するサーバから削除）してしまえばダウンロードできなくなるため、プログラムを実行できなくすることができるようになる。
【００１９】
具体的には、以下のような解決手段を提供する。
（５）  仮想マシン上で動作するプログラムを難読化するプログラム難読化装置であって、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成手段と、前記変換表作成手段によって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成手段と、プログラムを前記命令変換表に基づいて変換するプログラム変換手段と、前記仮想マシンソフトウェア作成手段によって作成された前記仮想マシンソフトウェアと、前記プログラム変換手段によって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布手段と、を備えるプログラム難読化装置。
【００２０】
すなわち、（５）に係るプログラム難読化装置は、プログラムを命令変換表に基づいて変換し、命令変換表を仮想マシンソフトウェアに組み入れ、変換したプログラムと仮想マシンソフトウェアとを配布する。
したがって、（５）に係るプログラム難読化装置は、プログラムの解析を困難にすることができる。
【００２１】
（６）  前記仮想マシンソフトウェア作成手段は、前記命令変換表を仮想マシンソフトウェアに組み入れることに替えて、前記命令変換表をダウンロードするように、仮想マシンソフトウェアに組み入れる、（５）に記載のプログラム難読化装置。
【００２２】
したがって、（６）に係るプログラム難読化装置は、プログラムの解析をさらに困難にすることができる。
【００２３】
（７）  （５）に記載のプログラム難読化装置が実行する方法であって、前記変換表作成手段が、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成ステップと、前記仮想マシンソフトウェア作成手段が、前記変換表作成ステップによって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成ステップと、前記プログラム変換手段が、プログラムを前記命令変換表に基づいて変換するプログラム変換ステップと、前記配布手段が、前記仮想マシンソフトウェア作成ステップによって作成された前記仮想マシンソフトウェアと、前記プログラム変換ステップによって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布ステップと、を備える方法。
【００２４】
したがって、（７）に係る方法は、プログラムの解析を困難にすることができる。
【発明の効果】
【００２５】
本発明によれば、プログラム解析に対して安全な疑似乱数生成や、実行環境の検証機能、プログラムの難読化を実現することができる。
【図面の簡単な説明】
【００２６】
【図１】本発明の一実施形態に係る疑似乱数生成装置の構成を示す図である。
【図２】本発明の一実施形態に係る疑似乱数生成装置の命令変換表の例を示す図である。
【図３】本発明の一実施形態に係る疑似乱数生成装置の変数変換表の例を示す図である。
【図４】本発明の一実施形態に係る疑似乱数生成装置の処理を示すフローチャートである。
【図５】本発明の一実施形態に係る疑似乱数生成装置の仮想マシンの処理を示すフローチャートである。
【図６】本発明の一実施形態に係るプログラム難読化装置の構成を示す図である。
【図７】本発明の一実施形態に係るプログラム難読化装置の処理を示すフローチャートである。
【発明を実施するための形態】
【００２７】
疑似乱数生成装置１０は、ＣＰＵのアーキテクチャ（例えば、仮想化支援機能を備えるＣＰＵ）や、仮想マシンソフトウェアによって、リソース（例えば、ハードディスクやメモリの記憶領域、物理的あるいは論理的に内部の情報を読み取られることに対する耐性の高い、ＩＣカード等の耐タンパデバイス等）を割り当てて、仮想マシン２０を作動させることができる。
仮想マシン２０は、コンピュータの動作をエミュレートするソフトウェアであり、割り当てられたリソースを管理し、プログラムを実行する。
疑似乱数生成プログラムは、常に仮想環境である仮想マシン２０を介して、実行環境のリソースを活用し演算をコンピュータに実行させる。
【００２８】
疑似乱数生成装置１０が実行する実行手順は、以下の通りである。
１．仮想マシン２０の起動時にランダムに命令変換表３２を作成する。例えば、加算、減算、乗算、除算の各命令をランダムに並び替え、プログラムが加算を実行しようとしたときには、仮想マシン２０がローカル環境に対して、乗算を実行するように命令し、結果をプログラムに返す、等の処理を行う。また、特定の変数についても、変数変換表３３を用意し、仮想マシン２０が生成した乱数を加算する等の処理を変数変換表３３にて定義しておく。これらの命令変換表３２及び変数変換表３３を作成するための乱数は、仮想マシン２０が従来方式により生成してよい。
２．プログラムは、ある特定の演算を実行することで疑似乱数を生成する。適当なシードを入力として、仮想マシン２０を経由して演算を実行するが、その際、仮想マシン２０の起動時に生成した命令変換表３２及び変数変換表３３により命令の変換及び変数変換が実行され、そのまま計算した値とは別の値が演算結果として得られる。
３．仮想マシン２０を起動するごとに命令変換表３２及び変数変換表３３を作り直せば、演算は毎回異なることとなり、毎回異なる疑似乱数が生成される。一方で、攻撃者は、プログラムを解析しても、疑似乱数生成の挙動が予測できず、攻撃することができない。
４．また、固定の命令変換表３２及び変数変換表３３を仮想マシンソフトウェアに埋め込んでおけば、一種のフォレンジックデータとして活用することも可能である。すなわち、生成した疑似乱数を見れば、プログラムがどの環境で実行されたのかを特定することができる。
以上の効果により、安全な疑似乱数生成を実現する。本機能は、単に疑似乱数生成だけではなく鍵生成等様々な応用が可能である。
【００２９】
以下、本発明の実施形態について図に従ってさらに説明する。図１は、本発明の一実施形態に係る疑似乱数生成装置１０の構成を示す図である。
疑似乱数生成装置１０は、起動手段１１を備える。
【００３０】
起動手段１１は、疑似乱数生成プログラムを実行する仮想マシン２０を起動する。具体的には、起動手段１１は、仮想マシンソフトウェアの機能によって、仮想マシン２０を起動する。
【００３１】
仮想マシン２０は、プログラム記憶手段３０と、秘匿記憶領域３１と、命令変換表３２と、変数変換表３３と、変更手段２１と、実行制御手段２２と、変数制御手段２３とを備える。仮想マシン２０は、割り当てられたリソース（メモリや、耐タンパデバイス等）上に、プログラム記憶手段３０と、秘匿記憶領域３１と、命令変換表３２と、変数変換表３３とを設ける。各手段ごとに説明する。
【００３２】
プログラム記憶手段３０は、疑似乱数を生成するための疑似乱数生成プログラムを記憶する。疑似乱数生成プログラムは、所定の疑似乱数生成ロジックを有するプログラムである。
【００３３】
秘匿記憶領域３１は、一定のアクセス権がないとアクセスできないように管理されている領域である。後述する命令変換表３２及び変数変換表３３は、秘匿記憶領域３１上に設けられる。
【００３４】
命令変換表３２は、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する。具体的には、後述する図２で示すように、命令変換表３２は、疑似乱数生成プログラムにおける、例えば演算命令等の実行命令と、その実行命令とは異なる、例えば別の演算命令である変換命令とを対応付けて記憶する。
【００３５】
変数変換表３３は、疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する。具体的には、後述する図３で示すように、変数変換表３３は、疑似乱数生成プログラムで用いられる変数に、変換方法（例えば、記憶される変数値に乱数を加算する等）を対応付けて記憶する。
【００３６】
変更手段２１は、起動手段１１によって起動されると、命令変換表３２における実行命令の対応付けを変更する。具体的には、変更手段２１は、起動手段１１によって起動されるごとに、乱数に基づいて命令変換表３２における実行命令と変換命令との対応付けを変更する。さらに、変更手段２１は、起動手段１１によって起動されるごとに、乱数に基づいて変数変換表３３における変数と変換方法との対応付けを変更するとしてもよい。なお、この場合の乱数は、仮想マシン２０によって従来方式により生成されるとしてよい。
【００３７】
実行制御手段２２は、疑似乱数生成プログラムの実行命令を、命令変換表３２に基づいて変換し、変換した実行命令を実行する。具体的には、実行制御手段２２は、疑似乱数生成プログラムを実行中に、命令変換表３２に記憶されている実行命令をフェッチすると、命令変換表３２に基づいて変換して実行する。
さらに、実行制御手段２２は、疑似乱数生成プログラムを実行中に、特定の命令から特定の命令までの間（例えば、疑似乱数生成プログラムには出現しないはずのＩ／Ｏ命令等の命令をフェッチした後から、次にＩ／Ｏ命令等をフェッチするまでの間）でのみ、命令変換表３２に記憶されている実行命令をフェッチすると、命令変換表３２に基づいて変換して実行するとしてもよい。
【００３８】
変数制御手段２３は、疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、変数変換表３３に基づいて変換し、変換した変数値を変数に記憶させる。具体的には、変数制御手段２３は、疑似乱数生成プログラムを実行中にフェッチした命令の変数について、変数変換表３３に記憶されている変数に対応する変換方法に基づいて、記憶させる変数値を変換し（例えば、従来方式により生成した乱数値を加え）、変換した変数値を変数に記憶させる。さらに、変数制御手段２３は、実行制御手段２２と同様に、特定の命令から特定の命令までの間でのみ、変数変換表３３に基づいて変数値を変換するとしてもよい。
【００３９】
このように、疑似乱数生成装置１０は、仮想マシン２０において、疑似乱数生成プログラムによって疑似乱数を生成し、かつ、その疑似乱数生成プログラムが解析されても乱数性が損なわれない（すなわち、攻撃者にとって予測不可能な）疑似乱数を生成する。
【００４０】
図２は、本発明の一実施形態に係る疑似乱数生成装置１０の命令変換表３２の例を示す図である。図２の例が示すように、命令変換表３２は、実行命令と変換命令とを対応付けて記憶する。実行命令は、例えば、疑似乱数生成プログラムにおいて出現する実行命令である。変換命令は、実行命令とは異なる命令である。例えば、命令変換表３２は、演算命令（例えば、「＋」）を別の演算命令（例えば、「×」）に対応付け、特定の入出力命令（例えば、「ｐｒｉｎｔ」）を別の演算命令（例えば、「２乗」）に対応付ける。
【００４１】
図３は、本発明の一実施形態に係る疑似乱数生成装置１０の変数変換表３３の例を示す図である。図３の例が示すように、変数変換表３３は、変数と変換方法とを対応付けて記憶する。変数は、例えば、疑似乱数生成プログラムにおいて出現する変数である。変換方法は、変数に記憶される変数値についての変換方法である。
例えば、変数変換表３３の例に基づいて、変数制御手段２３は、疑似乱数生成プログラムで用いられる変数１に記憶させる変数値を、変数１に対応する「＋」によって、変数値に乱数（従来方式により生成した乱数）を加算し、加算した変数値を変数１に記憶させる。
【００４２】
図４は、本発明の一実施形態に係る疑似乱数生成装置１０の処理を示すフローチャートである。疑似乱数生成装置１０は、コンピュータ及びその周辺装置が備えるハードウェア並びに該ハードウェアを制御するソフトウェアによって構成され、以下の処理は、制御部（例えば、ＣＰＵ）が所定のソフトウェアに従い実行する処理である。
【００４３】
ステップＳ１０１において、ＣＰＵ（起動手段１１）は、仮想マシン２０を起動する。
【００４４】
図５は、本発明の一実施形態に係る疑似乱数生成装置１０の仮想マシン２０の処理を示すフローチャートである。仮想マシン２０は、疑似乱数生成装置１０の仮想マシンソフトウェアによって、リソースが割り当てられて起動される。
【００４５】
ステップＳ２０１において、ＣＰＵ（変更手段２１）は、命令変換表３２及び変数変換表３３の対応付けをランダムに変更する。
【００４６】
ステップＳ２０２において、ＣＰＵ（実行制御手段２２、変数制御手段２３）は、疑似乱数生成プログラムを命令変換表３２及び変数変換表３３に基づいて変換し、実行する。
【００４７】
ステップＳ２０３において、ＣＰＵは、生成した疑似乱数を出力する。
【００４８】
＜プログラム難読化装置＞
図６は、本発明の一実施形態に係るプログラム難読化装置４０の構成を示す図である。プログラム難読化装置４０は、変換表作成手段４１と、仮想マシンソフトウェア作成手段４２と、プログラム変換手段４３と、配布手段４４とを備える。各手段ごとに説明する。
【００４９】
変換表作成手段４１は、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表３２を作成する。さらに、変換表作成手段４１は、変数変換表３３をも作成するとしてもよい。
【００５０】
仮想マシンソフトウェア作成手段４２は、変換表作成手段４１によって作成された命令変換表３２を、仮想マシンソフトウェアに組み入れて、命令変換表３２を組み入れた仮想マシンソフトウェアを作成する。さらに、仮想マシンソフトウェア作成手段４２は、作成された変数変換表３３をも組み入れるとしてもよい。
【００５１】
さらに、仮想マシンソフトウェア作成手段４２は、命令変換表３２を仮想マシンソフトウェアに組み入れることに替えて、命令変換表３２をダウンロードするように、仮想マシンソフトウェアに組み入れるとしてもよい。また、仮想マシンソフトウェア作成手段４２は、変数変換表３３をもダウンロードするように組み入れるとしてもよい。
ダウンロードが組み入れられると、仮想マシン２０は、例えば、命令変換表３２及び変数変換表３３を安全に管理するサーバ（図示せず）から、命令変換表３２及び変数変換表３３をダウンロードする。
【００５２】
プログラム変換手段４３は、プログラムを命令変換表３２に基づいて変換する。さらに、プログラム変換手段４３は、プログラムを変数変換表３３に基づいて変換するとしてもよい。
【００５３】
配布手段４４は、仮想マシンソフトウェア作成手段４２によって作成された仮想マシンソフトウェアと、プログラム変換手段４３によって変換されたプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。プログラムを実行する装置は、命令変換表３２及び変数変換表３３に基づいてプログラムを元の形に変換し、実行する。
【００５４】
図７は、本発明の一実施形態に係るプログラム難読化装置４０の処理を示すフローチャートである。プログラム難読化装置４０は、コンピュータ及びその周辺装置が備えるハードウェア並びに該ハードウェアを制御するソフトウェアによって構成され、以下の処理は、制御部（例えば、ＣＰＵ）が所定のソフトウェアに従い実行する処理である。
【００５５】
ステップＳ３０１において、ＣＰＵ（変換表作成手段４１）は、命令変換表３２及び変数変換表３３を作成する。
【００５６】
ステップＳ３０２において、ＣＰＵ（仮想マシンソフトウェア作成手段４２）は、ステップＳ３０１において作成された命令変換表３２及び変数変換表３３を組み入れた仮想マシンソフトウェアを作成する。
【００５７】
ステップＳ３０３において、ＣＰＵ（プログラム変換手段４３）は、プログラムを命令変換表３２及び変数変換表３３に基づいて変換する。
【００５８】
ステップＳ３０４において、ＣＰＵ（配布手段４４）は、ステップＳ３０２において作成された仮想マシンソフトウェアと、ステップＳ３０３において変換されたプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。
【００５９】
本実施形態によれば、疑似乱数生成装置１０は、疑似乱数生成プログラムを実行する仮想マシン２０を起動する。仮想マシン２０は、疑似乱数を生成するための疑似乱数生成プログラムを記憶するプログラム記憶手段３０と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表３２と、疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表３３とを備え、疑似乱数生成プログラムの少なくとも一部の実行命令及び少なくとも一部の変数に記憶される変数値を、命令変換表３２及び変数変換表３３に基づいて変換し、変換した実行命令を実行し、変換した変数値を記憶させる。さらに、疑似乱数生成装置１０において、仮想マシン２０は、起動されるごとに、命令変換表３２及び変数変換表３３における対応付けをランダムに変更する。したがって、疑似乱数生成装置１０は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【００６０】
本実施形態によれば、プログラム難読化装置４０は、命令変換表３２及び変数変換表３３を作成し、作成した命令変換表３２及び変数変換表３３を組み入れた仮想マシンソフトウェアを作成すると共に、プログラムを命令変換表３２及び変数変換表３３に基づいて変換し、作成した仮想マシンソフトウェアと、変換したプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。さらに、プログラム難読化装置４０は、命令変換表３２及び変数変換表３３をダウンロードするように、仮想マシンソフトウェアに組み入れる。
したがって、プログラム難読化装置４０は、プログラムの解析を困難にすることができる。
【００６１】
以上、本発明の実施形態について説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態に記載されたものに限定されるものではない。
【符号の説明】
【００６２】
１０    疑似乱数生成装置
１１    起動手段
２０    仮想マシン
２１    変更手段
２２    実行制御手段
２３    変数制御手段
３０    プログラム記憶手段
３１    秘匿記憶領域
３２    命令変換表
３３    変数変換表
４０    プログラム難読化装置
４１    変換表作成手段
４２    仮想マシンソフトウェア作成手段
４３    プログラム変換手段
４４    配布手段
【図１】
2015114964.tif 000003
【図２】
2015114964.tif 000004
【図３】
2015114964.tif 000005
【図４】
2015114964.tif 000006
【図５】
2015114964.tif 000007
【図６】
2015114964.tif 000008
【図７】
2015114964.tif 000009