(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6203028
(24)【登録日】2017年9月8日
(45)【発行日】2017年9月27日
(54)【発明の名称】疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法
(51)【国際特許分類】
G06F 7/58 20060101AFI20170914BHJP
G06F 21/14 20130101ALI20170914BHJP
G06F 9/46 20060101ALI20170914BHJP
【FI】
G06F7/58 620
G06F21/14
G06F9/46 350
【請求項の数】7
【全頁数】13
(21)【出願番号】特願2013-258128(P2013-258128)
(22)【出願日】2013年12月13日
(65)【公開番号】特開2015-114964(P2015-114964A)
(43)【公開日】2015年6月22日
【審査請求日】2016年7月21日
(73)【特許権者】
【識別番号】000208891
【氏名又は名称】KDDI株式会社
(74)【代理人】
【識別番号】100106002
【弁理士】
【氏名又は名称】正林 真之
(74)【代理人】
【識別番号】100120891
【弁理士】
【氏名又は名称】林 一好
(72)【発明者】
【氏名】清本 晋作
(72)【発明者】
【氏名】三宅 優
【審査官】
山崎 誠也
(56)【参考文献】
【文献】
米国特許出願公開第2004/0003264(US,A1)
【文献】
特開2009−223778(JP,A)
【文献】
特開2003−140758(JP,A)
【文献】
国際公開第2007/091558(WO,A1)
【文献】
国際公開第2006/085595(WO,A1)
【文献】
特表2005−532622(JP,A)
【文献】
特開2011−221922(JP,A)
【文献】
特開2009−075720(JP,A)
【文献】
特開2009−265949(JP,A)
【文献】
特開2009−104589(JP,A)
【文献】
特開2007−304726(JP,A)
【文献】
特開2012−208655(JP,A)
【文献】
特開2012−133736(JP,A)
【文献】
特開2013−45277(JP,A)
【文献】
玉田 春昭,Java 言語を対象とした実行時多様化の試み,日本,[online],2012年 2月 2日,The Institute of Electronics, Information and Communication Engineers, [平成29年5月31日検索],インターネット<URL:http://tamadalab.github.io/papers/resources/tamada12scis.pdf>,URL,http://tamadalab.github.io/papers/resources/tamada12scis.pdf
【文献】
豊福 達也,乱数を用いた難読化手法の複雑な制御構造への適用に関する一考察,IPSJ SIG Technical Reports,日本,社団法人 情報処理学会,2005年 7月21日,p.213−220
【文献】
吉田 直樹,自己書換え型耐タンパー技術のスマートフォン環境における検証,電子情報通信学会技術研究報告,日本,一般社団法人電子情報通信学会,2013年 7月11日,Vol.113 No.138,p.19−26
【文献】
神▲崎▼ 雄一郎,命令のカムフラージュによるソフトウェア保護方法,電子情報通信学会論文誌,日本,社団法人電子情報通信学会,2004年 6月 1日,第J87−A巻 第6号,p.755−767
【文献】
石間 宏之,ソフトウェアの耐タンパー化技術,情報処理,日本,社団法人情報処理学会,2003年 6月15日,第44巻 第6号,p.622−627
(58)【調査した分野】(Int.Cl.,DB名)
G06F 7/58−7/72
G06F 9/46
G06F 21/14
(57)【特許請求の範囲】
【請求項1】
疑似乱数を生成する疑似乱数生成装置であって、
疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する起動手段を備え、
前記仮想マシンは、
前記疑似乱数生成プログラムを記憶するプログラム記憶手段と、
プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表と、
前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御手段とを備える、
疑似乱数生成装置。
【請求項2】
前記仮想マシンは、
前記起動手段によって起動されると、前記命令変換表における実行命令の対応付けを変更する変更手段を、さらに備える請求項1に記載の疑似乱数生成装置。
【請求項3】
前記仮想マシンは、
前記疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表と、
前記疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、前記変数変換表に基づいて変換し、変換した変数値を前記変数に記憶させる変数制御手段とを、さらに備える請求項1又は2に記載の疑似乱数生成装置。
【請求項4】
請求項1に記載の疑似乱数生成装置が実行する方法であって、
前記起動手段が、前記疑似乱数生成プログラムを実行する仮想マシンを起動する起動ステップと、
前記仮想マシンの前記実行制御手段が、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御ステップと、
を備える方法。
【請求項5】
仮想マシン上で動作するプログラムを難読化するプログラム難読化装置であって、
前記プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表又は、前記命令変換表及び前記プログラムで用いられる少なくとも一部の変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表を作成する変換表作成手段と、
前記変換表作成手段によって作成された前記命令変換表又は、前記命令変換表及び前記変数変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表又は、前記命令変換表及び前記変数変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成手段と、
前記プログラムを前記命令変換表又は、前記命令変換表及び前記変数変換表に基づいて変換するプログラム変換手段と、
前記仮想マシンソフトウェア作成手段によって作成された前記仮想マシンソフトウェアと、前記プログラム変換手段によって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布手段と、
を備えるプログラム難読化装置。
【請求項6】
前記仮想マシンソフトウェア作成手段は、前記命令変換表又は、前記命令変換表及び前記変数変換表を仮想マシンソフトウェアに組み入れることに替えて、前記命令変換表又は、前記命令変換表及び前記変数変換表をダウンロードするように、仮想マシンソフトウェアに組み入れる、請求項5に記載のプログラム難読化装置。
【請求項7】
コンピュータが実行するプログラム難読化方法であって、
前記コンピュータにより、
プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表又は、前記命令変換表及び前記プログラムで用いられる少なくとも一部の変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表を作成する変換表作成ステップと、
前記変換表作成ステップにおいて作成された前記命令変換表又は、前記命令変換表及び前記変数変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表又は、前記命令変換表及び前記変数変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成ステップと、
前記プログラムを前記命令変換表又は、前記命令変換表及び前記変数変換表に基づいて変換するプログラム変換ステップと、
前記仮想マシンソフトウェア作成ステップにおいて作成された前記仮想マシンソフトウェアと、前記プログラム変換ステップにおいて変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布ステップと、
を備えるプログラム難読化方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、疑似乱数生成装置及び方法、並びにプログラム難読化装置及び方法に関する。
【背景技術】
【0002】
従来より、シミュレーション実験やゲーム等に利用される乱数の生成について、様々な生成法が開示されている。例えば、真の乱数生成法として、原子核崩壊等を活用する自然乱数生成法がある。また、時刻等をシードとしてプログラムを用いて生成する疑似乱数生成法がある。
【0003】
非特許文献1は、高品質の疑似乱数を高速に生成する疑似乱数生成器を開示する。
【先行技術文献】
【非特許文献】
【0004】
【非特許文献1】M. Matsumoto and T. Nishimura, Mersenne twister: A 623−dimensionally equidistributed uniform pseudorandom number generator, ACM Trans. on Modeling and Computer Simulations, 1998.
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、原子核崩壊等を活用する方法では、特別な装置を必要とし、装置が高価であるという問題点があった。また、プログラムによる疑似乱数を生成する方法では、プログラムが解析された場合、乱数の生成手法が明らかとなり、乱数性が損なわれる(攻撃者にとって予測可能となる)可能性があった。さらに、プログラムの解析を防ぐ手法として難読化が考案されているが、逆コンパイルにより、元のソースコードに近いコードが復元されるような状況では、十分な安全性を有していなかった。
【0006】
そこで、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成する装置が求められている。また、プログラムの解析を困難にする装置が求められている。
【0007】
本発明は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成する疑似乱数生成装置及び方法、並びに、プログラムの解析を困難にするプログラム難読化装置及び方法を提供することを目的とする。
【課題を解決するための手段】
【0008】
本発明は、コンピュータ上で疑似乱数を生成する手法であって、次のような特徴を有する。
(a)プログラムは、ある固定の疑似乱数生成ロジックを持つ。
(b)プログラムは、ある仮想マシン(VM)上で実行される。
(c)仮想マシンは、起動時にランダムに命令変換表を作成し、プログラムの実行命令を命令変換表に基づいて変換して実行する。
(d)また、特定の変数についても、仮想マシン上において乱数を足し合わせる等の変形を行い実行する。なお、命令変換表を作成するための乱数や、変数についての乱数は、仮想マシンが従来方式により生成する。
(e)命令変換表を固定とすることで、環境ごとに異なる指紋データを生成可能である。すなわち、命令変換表自体又は生成した疑似乱数自体が各環境の識別子として活用できる。これにより、実行環境の検証データ(どの実行環境で実行されたかの証拠データ)を生成することができる。
(f)また、命令変換表を固定としその表を秘匿して保管することで、プログラムを見ただけではその動作を解析することができない難読化手法を実現する。
(g)さらに、上記の難読化手法において、仮想マシンが命令変換表を動的にダウンロードする手法を具備することにより安全性を向上させることができる。
(h)さらに、上記の難読化手法において、サーバ上から命令変換表を削除することで、プログラムを正しく実行できなくすることができるようになる。
【0009】
具体的には、以下のような解決手段を提供する。
(1) 疑似乱数を生成する疑似乱数生成装置であって、疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する起動手段を備え、前記仮想マシンは、前記疑似乱数生成プログラムを記憶するプログラム記憶手段と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表と、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御手段とを備える、疑似乱数生成装置。
【0010】
(1)の構成によれば、(1)に係る疑似乱数生成装置は、疑似乱数を生成するための疑似乱数生成プログラムを実行する仮想マシンを起動する。仮想マシンは、疑似乱数生成プログラムを記憶するプログラム記憶手段と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表とを備え、疑似乱数生成プログラムの少なくとも一部の実行命令を、命令変換表に基づいて変換し、変換した実行命令を実行する。
【0011】
すなわち、疑似乱数生成プログラムは、疑似乱数生成装置の仮想マシン上で、少なくとも一部の実行命令が命令変換表に基づいて変換されて実行される。
したがって、(1)に係る疑似乱数生成装置は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【0012】
(2) 前記仮想マシンは、前記起動手段によって起動されると、前記命令変換表における実行命令の対応付けを変更する変更手段を、さらに備える(1)に記載の疑似乱数生成装置。
【0013】
したがって、(2)に係る疑似乱数生成装置は、疑似乱数生成プログラムの実行命令について、変換の対応付けを変更するので、疑似乱数生成プログラムが解析されても乱数性がより損なわれない疑似乱数を生成することができる。
【0014】
(3) 前記仮想マシンは、前記疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表と、前記疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、前記変数変換表に基づいて変換し、変換した変数値を前記変数に記憶させる変数制御手段とを、さらに備える(1)又は(2)に記載の疑似乱数生成装置。
【0015】
したがって、(3)に係る疑似乱数生成装置は、疑似乱数生成プログラムの実行において変数値を変換して記憶させるので、疑似乱数生成プログラムが解析されても乱数性がより損なわれない疑似乱数を生成することができる。
【0016】
(4) (1)に記載の疑似乱数生成装置が実行する方法であって、前記起動手段が、前記疑似乱数生成プログラムを実行する仮想マシンを起動する起動ステップと、前記仮想マシンの前記実行制御手段が、前記疑似乱数生成プログラムの少なくとも一部の実行命令を、前記命令変換表に基づいて変換し、変換した実行命令を実行する実行制御ステップとを備える、方法。
【0017】
したがって、(4)に係る方法は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【0018】
また、以下のようなプログラム難読化装置によりプログラムの難読化を実現することができる。
(a)固定の命令変換表又は変数変換表を作成し、仮想マシンソフトウェアに安全な形で埋め込んでおく。仮想マシンソフトウェアは解析されないものとする。
(b)保護したいプログラムを固定の命令変換表又は変数変換表に基づいて変換する。その後、この変換されたプログラムや仮想マシンは、利用者のもとに配布される。
(c)プログラムは、命令変換表又は変数変換表が埋め込まれた仮想マシン(VM)上で実行される。不正者が変換されたプログラムを解析しようとした場合、命令変換表又は変数変換表によりプログラムが変更されているため、命令変換表又は変数変換表を知らない攻撃者は解析できない。一方で、命令変換表又は変数変換表を内蔵した仮想マシンソフトウェアでは、各演算命令が命令変換表又は変数変換表により元の形に変換されて実行されるため、変換前のプログラムの動作と同じ動作をすることが保証される。
(d)なお、命令変換表又は変数変換表を動的に安全にダウンロード(例えば、管理するサーバからダウンロード)する機構を仮想マシンソフトウェアに具備すれば、当該プログラム実行時のみ動的に命令変換表又は変数変換表をダウンロードして実行することができるため、仮想マシンソフトウェアを解析されたとしても命令変換表又は変数変換表が漏洩することは無い。また、この仕組みを応用することにより、命令変換表又は変数変換表を削除(例えば、管理するサーバから削除)してしまえばダウンロードできなくなるため、プログラムを実行できなくすることができるようになる。
【0019】
具体的には、以下のような解決手段を提供する。
(5) 仮想マシン上で動作するプログラムを難読化するプログラム難読化装置であって、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成手段と、前記変換表作成手段によって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成手段と、プログラムを前記命令変換表に基づいて変換するプログラム変換手段と、前記仮想マシンソフトウェア作成手段によって作成された前記仮想マシンソフトウェアと、前記プログラム変換手段によって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布手段と、を備えるプログラム難読化装置。
【0020】
すなわち、(5)に係るプログラム難読化装置は、プログラムを命令変換表に基づいて変換し、命令変換表を仮想マシンソフトウェアに組み入れ、変換したプログラムと仮想マシンソフトウェアとを配布する。
したがって、(5)に係るプログラム難読化装置は、プログラムの解析を困難にすることができる。
【0021】
(6) 前記仮想マシンソフトウェア作成手段は、前記命令変換表を仮想マシンソフトウェアに組み入れることに替えて、前記命令変換表をダウンロードするように、仮想マシンソフトウェアに組み入れる、(5)に記載のプログラム難読化装置。
【0022】
したがって、(6)に係るプログラム難読化装置は、プログラムの解析をさらに困難にすることができる。
【0023】
(7) (5)に記載のプログラム難読化装置が実行する方法であって、前記変換表作成手段が、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表を作成する変換表作成ステップと、前記仮想マシンソフトウェア作成手段が、前記変換表作成ステップによって作成された前記命令変換表を仮想マシンソフトウェアに組み入れて、前記命令変換表を組み入れた仮想マシンソフトウェアを作成する仮想マシンソフトウェア作成ステップと、前記プログラム変換手段が、プログラムを前記命令変換表に基づいて変換するプログラム変換ステップと、前記配布手段が、前記仮想マシンソフトウェア作成ステップによって作成された前記仮想マシンソフトウェアと、前記プログラム変換ステップによって変換されたプログラムとを、前記仮想マシンソフトウェアを組み込む装置であって前記変換されたプログラムを実行する装置に配布する配布ステップと、を備える方法。
【0024】
したがって、(7)に係る方法は、プログラムの解析を困難にすることができる。
【発明の効果】
【0025】
本発明によれば、プログラム解析に対して安全な疑似乱数生成や、実行環境の検証機能、プログラムの難読化を実現することができる。
【図面の簡単な説明】
【0026】
【
図1】本発明の一実施形態に係る疑似乱数生成装置の構成を示す図である。
【
図2】本発明の一実施形態に係る疑似乱数生成装置の命令変換表の例を示す図である。
【
図3】本発明の一実施形態に係る疑似乱数生成装置の変数変換表の例を示す図である。
【
図4】本発明の一実施形態に係る疑似乱数生成装置の処理を示すフローチャートである。
【
図5】本発明の一実施形態に係る疑似乱数生成装置の仮想マシンの処理を示すフローチャートである。
【
図6】本発明の一実施形態に係るプログラム難読化装置の構成を示す図である。
【
図7】本発明の一実施形態に係るプログラム難読化装置の処理を示すフローチャートである。
【発明を実施するための形態】
【0027】
疑似乱数生成装置10は、CPUのアーキテクチャ(例えば、仮想化支援機能を備えるCPU)や、仮想マシンソフトウェアによって、リソース(例えば、ハードディスクやメモリの記憶領域、物理的あるいは論理的に内部の情報を読み取られることに対する耐性の高い、ICカード等の耐タンパデバイス等)を割り当てて、仮想マシン20を作動させることができる。
仮想マシン20は、コンピュータの動作をエミュレートするソフトウェアであり、割り当てられたリソースを管理し、プログラムを実行する。
疑似乱数生成プログラムは、常に仮想環境である仮想マシン20を介して、実行環境のリソースを活用し演算をコンピュータに実行させる。
【0028】
疑似乱数生成装置10が実行する実行手順は、以下の通りである。
1.仮想マシン20の起動時にランダムに命令変換表32を作成する。例えば、加算、減算、乗算、除算の各命令をランダムに並び替え、プログラムが加算を実行しようとしたときには、仮想マシン20がローカル環境に対して、乗算を実行するように命令し、結果をプログラムに返す、等の処理を行う。また、特定の変数についても、変数変換表33を用意し、仮想マシン20が生成した乱数を加算する等の処理を変数変換表33にて定義しておく。これらの命令変換表32及び変数変換表33を作成するための乱数は、仮想マシン20が従来方式により生成してよい。
2.プログラムは、ある特定の演算を実行することで疑似乱数を生成する。適当なシードを入力として、仮想マシン20を経由して演算を実行するが、その際、仮想マシン20の起動時に生成した命令変換表32及び変数変換表33により命令の変換及び変数変換が実行され、そのまま計算した値とは別の値が演算結果として得られる。
3.仮想マシン20を起動するごとに命令変換表32及び変数変換表33を作り直せば、演算は毎回異なることとなり、毎回異なる疑似乱数が生成される。一方で、攻撃者は、プログラムを解析しても、疑似乱数生成の挙動が予測できず、攻撃することができない。
4.また、固定の命令変換表32及び変数変換表33を仮想マシンソフトウェアに埋め込んでおけば、一種のフォレンジックデータとして活用することも可能である。すなわち、生成した疑似乱数を見れば、プログラムがどの環境で実行されたのかを特定することができる。
以上の効果により、安全な疑似乱数生成を実現する。本機能は、単に疑似乱数生成だけではなく鍵生成等様々な応用が可能である。
【0029】
以下、本発明の実施形態について図に従ってさらに説明する。
図1は、本発明の一実施形態に係る疑似乱数生成装置10の構成を示す図である。
疑似乱数生成装置10は、起動手段11を備える。
【0030】
起動手段11は、疑似乱数生成プログラムを実行する仮想マシン20を起動する。具体的には、起動手段11は、仮想マシンソフトウェアの機能によって、仮想マシン20を起動する。
【0031】
仮想マシン20は、プログラム記憶手段30と、秘匿記憶領域31と、命令変換表32と、変数変換表33と、変更手段21と、実行制御手段22と、変数制御手段23とを備える。仮想マシン20は、割り当てられたリソース(メモリや、耐タンパデバイス等)上に、プログラム記憶手段30と、秘匿記憶領域31と、命令変換表32と、変数変換表33とを設ける。各手段ごとに説明する。
【0032】
プログラム記憶手段30は、疑似乱数を生成するための疑似乱数生成プログラムを記憶する。疑似乱数生成プログラムは、所定の疑似乱数生成ロジックを有するプログラムである。
【0033】
秘匿記憶領域31は、一定のアクセス権がないとアクセスできないように管理されている領域である。後述する命令変換表32及び変数変換表33は、秘匿記憶領域31上に設けられる。
【0034】
命令変換表32は、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する。具体的には、後述する
図2で示すように、命令変換表32は、疑似乱数生成プログラムにおける、例えば演算命令等の実行命令と、その実行命令とは異なる、例えば別の演算命令である変換命令とを対応付けて記憶する。
【0035】
変数変換表33は、疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する。具体的には、後述する
図3で示すように、変数変換表33は、疑似乱数生成プログラムで用いられる変数に、変換方法(例えば、記憶される変数値に乱数を加算する等)を対応付けて記憶する。
【0036】
変更手段21は、起動手段11によって起動されると、命令変換表32における実行命令の対応付けを変更する。具体的には、変更手段21は、起動手段11によって起動されるごとに、乱数に基づいて命令変換表32における実行命令と変換命令との対応付けを変更する。さらに、変更手段21は、起動手段11によって起動されるごとに、乱数に基づいて変数変換表33における変数と変換方法との対応付けを変更するとしてもよい。なお、この場合の乱数は、仮想マシン20によって従来方式により生成されるとしてよい。
【0037】
実行制御手段22は、疑似乱数生成プログラムの実行命令を、命令変換表32に基づいて変換し、変換した実行命令を実行する。具体的には、実行制御手段22は、疑似乱数生成プログラムを実行中に、命令変換表32に記憶されている実行命令をフェッチすると、命令変換表32に基づいて変換して実行する。
さらに、実行制御手段22は、疑似乱数生成プログラムを実行中に、特定の命令から特定の命令までの間(例えば、疑似乱数生成プログラムには出現しないはずのI/O命令等の命令をフェッチした後から、次にI/O命令等をフェッチするまでの間)でのみ、命令変換表32に記憶されている実行命令をフェッチすると、命令変換表32に基づいて変換して実行するとしてもよい。
【0038】
変数制御手段23は、疑似乱数生成プログラムで用いられる少なくとも一部の変数に記憶される変数値を、変数変換表33に基づいて変換し、変換した変数値を変数に記憶させる。具体的には、変数制御手段23は、疑似乱数生成プログラムを実行中にフェッチした命令の変数について、変数変換表33に記憶されている変数に対応する変換方法に基づいて、記憶させる変数値を変換し(例えば、従来方式により生成した乱数値を加え)、変換した変数値を変数に記憶させる。さらに、変数制御手段23は、実行制御手段22と同様に、特定の命令から特定の命令までの間でのみ、変数変換表33に基づいて変数値を変換するとしてもよい。
【0039】
このように、疑似乱数生成装置10は、仮想マシン20において、疑似乱数生成プログラムによって疑似乱数を生成し、かつ、その疑似乱数生成プログラムが解析されても乱数性が損なわれない(すなわち、攻撃者にとって予測不可能な)疑似乱数を生成する。
【0040】
図2は、本発明の一実施形態に係る疑似乱数生成装置10の命令変換表32の例を示す図である。
図2の例が示すように、命令変換表32は、実行命令と変換命令とを対応付けて記憶する。実行命令は、例えば、疑似乱数生成プログラムにおいて出現する実行命令である。変換命令は、実行命令とは異なる命令である。例えば、命令変換表32は、演算命令(例えば、「+」)を別の演算命令(例えば、「×」)に対応付け、特定の入出力命令(例えば、「print」)を別の演算命令(例えば、「2乗」)に対応付ける。
【0041】
図3は、本発明の一実施形態に係る疑似乱数生成装置10の変数変換表33の例を示す図である。
図3の例が示すように、変数変換表33は、変数と変換方法とを対応付けて記憶する。変数は、例えば、疑似乱数生成プログラムにおいて出現する変数である。変換方法は、変数に記憶される変数値についての変換方法である。
例えば、変数変換表33の例に基づいて、変数制御手段23は、疑似乱数生成プログラムで用いられる変数1に記憶させる変数値を、変数1に対応する「+」によって、変数値に乱数(従来方式により生成した乱数)を加算し、加算した変数値を変数1に記憶させる。
【0042】
図4は、本発明の一実施形態に係る疑似乱数生成装置10の処理を示すフローチャートである。疑似乱数生成装置10は、コンピュータ及びその周辺装置が備えるハードウェア並びに該ハードウェアを制御するソフトウェアによって構成され、以下の処理は、制御部(例えば、CPU)が所定のソフトウェアに従い実行する処理である。
【0043】
ステップS101において、CPU(起動手段11)は、仮想マシン20を起動する。
【0044】
図5は、本発明の一実施形態に係る疑似乱数生成装置10の仮想マシン20の処理を示すフローチャートである。仮想マシン20は、疑似乱数生成装置10の仮想マシンソフトウェアによって、リソースが割り当てられて起動される。
【0045】
ステップS201において、CPU(変更手段21)は、命令変換表32及び変数変換表33の対応付けをランダムに変更する。
【0046】
ステップS202において、CPU(実行制御手段22、変数制御手段23)は、疑似乱数生成プログラムを命令変換表32及び変数変換表33に基づいて変換し、実行する。
【0047】
ステップS203において、CPUは、生成した疑似乱数を出力する。
【0048】
<プログラム難読化装置>
図6は、本発明の一実施形態に係るプログラム難読化装置40の構成を示す図である。プログラム難読化装置40は、変換表作成手段41と、仮想マシンソフトウェア作成手段42と、プログラム変換手段43と、配布手段44とを備える。各手段ごとに説明する。
【0049】
変換表作成手段41は、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表32を作成する。さらに、変換表作成手段41は、変数変換表33をも作成するとしてもよい。
【0050】
仮想マシンソフトウェア作成手段42は、変換表作成手段41によって作成された命令変換表32を、仮想マシンソフトウェアに組み入れて、命令変換表32を組み入れた仮想マシンソフトウェアを作成する。さらに、仮想マシンソフトウェア作成手段42は、作成された変数変換表33をも組み入れるとしてもよい。
【0051】
さらに、仮想マシンソフトウェア作成手段42は、命令変換表32を仮想マシンソフトウェアに組み入れることに替えて、命令変換表32をダウンロードするように、仮想マシンソフトウェアに組み入れるとしてもよい。また、仮想マシンソフトウェア作成手段42は、変数変換表33をもダウンロードするように組み入れるとしてもよい。
ダウンロードが組み入れられると、仮想マシン20は、例えば、命令変換表32及び変数変換表33を安全に管理するサーバ(図示せず)から、命令変換表32及び変数変換表33をダウンロードする。
【0052】
プログラム変換手段43は、プログラムを命令変換表32に基づいて変換する。さらに、プログラム変換手段43は、プログラムを変数変換表33に基づいて変換するとしてもよい。
【0053】
配布手段44は、仮想マシンソフトウェア作成手段42によって作成された仮想マシンソフトウェアと、プログラム変換手段43によって変換されたプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。プログラムを実行する装置は、命令変換表32及び変数変換表33に基づいてプログラムを元の形に変換し、実行する。
【0054】
図7は、本発明の一実施形態に係るプログラム難読化装置40の処理を示すフローチャートである。プログラム難読化装置40は、コンピュータ及びその周辺装置が備えるハードウェア並びに該ハードウェアを制御するソフトウェアによって構成され、以下の処理は、制御部(例えば、CPU)が所定のソフトウェアに従い実行する処理である。
【0055】
ステップS301において、CPU(変換表作成手段41)は、命令変換表32及び変数変換表33を作成する。
【0056】
ステップS302において、CPU(仮想マシンソフトウェア作成手段42)は、ステップS301において作成された命令変換表32及び変数変換表33を組み入れた仮想マシンソフトウェアを作成する。
【0057】
ステップS303において、CPU(プログラム変換手段43)は、プログラムを命令変換表32及び変数変換表33に基づいて変換する。
【0058】
ステップS304において、CPU(配布手段44)は、ステップS302において作成された仮想マシンソフトウェアと、ステップS303において変換されたプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。
【0059】
本実施形態によれば、疑似乱数生成装置10は、疑似乱数生成プログラムを実行する仮想マシン20を起動する。仮想マシン20は、疑似乱数を生成するための疑似乱数生成プログラムを記憶するプログラム記憶手段30と、プログラムの実行命令と、その実行命令とは異なる命令とを対応付けて記憶する命令変換表32と、疑似乱数生成プログラムで用いられる変数と、その変数に記憶される変数値の変換方法とを対応付けて記憶する変数変換表33とを備え、疑似乱数生成プログラムの少なくとも一部の実行命令及び少なくとも一部の変数に記憶される変数値を、命令変換表32及び変数変換表33に基づいて変換し、変換した実行命令を実行し、変換した変数値を記憶させる。さらに、疑似乱数生成装置10において、仮想マシン20は、起動されるごとに、命令変換表32及び変数変換表33における対応付けをランダムに変更する。したがって、疑似乱数生成装置10は、プログラムによって疑似乱数を生成し、かつ、そのプログラムが解析されても乱数性が損なわれない疑似乱数を生成することができる。
【0060】
本実施形態によれば、プログラム難読化装置40は、命令変換表32及び変数変換表33を作成し、作成した命令変換表32及び変数変換表33を組み入れた仮想マシンソフトウェアを作成すると共に、プログラムを命令変換表32及び変数変換表33に基づいて変換し、作成した仮想マシンソフトウェアと、変換したプログラムとを、仮想マシンソフトウェアを組み込む装置であって変換されたプログラムを実行する装置に配布する。さらに、プログラム難読化装置40は、命令変換表32及び変数変換表33をダウンロードするように、仮想マシンソフトウェアに組み入れる。
したがって、プログラム難読化装置40は、プログラムの解析を困難にすることができる。
【0061】
以上、本発明の実施形態について説明したが、本発明は上述した実施形態に限るものではない。また、本発明の実施形態に記載された効果は、本発明から生じる最も好適な効果を列挙したに過ぎず、本発明による効果は、本発明の実施形態に記載されたものに限定されるものではない。
【符号の説明】
【0062】
10 疑似乱数生成装置
11 起動手段
20 仮想マシン
21 変更手段
22 実行制御手段
23 変数制御手段
30 プログラム記憶手段
31 秘匿記憶領域
32 命令変換表
33 変数変換表
40 プログラム難読化装置
41 変換表作成手段
42 仮想マシンソフトウェア作成手段
43 プログラム変換手段
44 配布手段