(57)【要約】【課題】暗号化済みのプログラムコードの一部分を破壊して実行するという攻撃により暗号化対象のプログラムコードが復元されることを防止する。【解決手段】暗号化部２４は、暗号化対象の平文のプログラムコードを暗号化鍵により暗号化する。ハッシュ値計算部２６は、暗号化済みのプログラムコードのハッシュ値を計算する。種情報生成部２８は、そのハッシュ値とその暗号化鍵に対応する復号鍵とから、復号鍵に対応する種情報を計算する。配布用プログラム生成部３０は、暗号化済みのプログラムコードと種情報とを含んだ配布用プログラムを生成する。配布用プログラムを受け取ったコンピュータは、その配布用プログラムを実行する際、その中に含まれる暗号化済みのプログラムコードのハッシュ値を計算し、そのハッシュ値と種情報とから復号鍵を生成し、その復号鍵を用いてそのプログラムコードを復号し、その復号結果を実行する。【選択図】図２
2011123229.tif 000002
【特許請求の範囲】
【請求項１】
暗号化対象のプログラムコードを、暗号化鍵を用いて暗号化することにより、暗号化済みコードを生成する暗号化手段と、
前記暗号化済みコードを含むデータの特徴値を計算する特徴値計算手段と、
前記暗号化鍵で暗号化されたプログラムコードを復号するための復号鍵と前記特徴値とに基づき、前記復号鍵を求めるための種情報を計算する種情報計算手段と、
前記暗号化手段が生成した暗号化済みコードと、前記種情報計算手段が計算した前記種情報と、を含んだ配布用プログラムを生成する生成手段と、
を備えるプログラムコード暗号化装置。
【請求項２】
前記生成手段は、前記配布用プログラムとして、当該配布用プログラムに含まれる前記暗号化済みコードを含むデータから前記特徴値を計算するための特徴値計算コードと、当該特徴値計算コードが計算した前記特徴値と、当該配布用プログラムに含まれる前記種情報と、に基づき前記復号鍵を計算するための復号鍵計算コードと、前記復号鍵計算コードが計算した前記復号鍵を用いて前記暗号化済みコードを復号するための復号コードと、を更に含むプログラムを生成する、ことを特徴とする請求項１に記載のプログラムコード暗号化装置。
【請求項３】
前記特徴値計算手段は、前記暗号化済みコードと、前記復号コードの少なくとも一部と、を含むデータの特徴値を計算し、
前記特徴値計算コードは、前記配布用プログラムに含まれる前記暗号化済みコードと前記復号コードの少なくとも一部とを含むデータの特徴値を計算するためのコードである、
ことを特徴とする請求項１又は２に記載のプログラムコード暗号化装置。
【請求項４】
コンピュータを、
暗号化対象のプログラムコードを、暗号化鍵を用いて暗号化することにより、暗号化済みコードを生成する暗号化手段、
前記暗号化済みコードを含むデータの特徴値を計算する特徴値計算手段、
前記暗号化鍵で暗号化されたプログラムコードを復号するための復号鍵と前記特徴値とに基づき、前記復号鍵を求めるための種情報を計算する種情報計算手段、
前記暗号化手段が生成した暗号化済みコードと、前記種情報計算手段が計算した前記種情報と、を含んだ配布用プログラムを生成する生成手段、
として機能させるためのプログラム。
【請求項５】
平文プログラムコードを暗号化鍵により暗号化した結果である暗号化済みコードと、
前記暗号化鍵に対応する復号鍵の計算のために用いられる種情報と、
前記暗号化済みコードから特徴値を計算する処理をコンピュータに実行させるための特徴値計算コードと、
前記特徴値計算コードの実行により計算された特徴値と前記種情報とに基づき復号鍵を計算する処理を前記コンピュータに実行させるための復号鍵計算コードと、
前記復号鍵計算コードにより計算された前記復号鍵と前記暗号化に対応する復号演算とにより、前記暗号化済みコード復号する処理、を前記コンピュータに実行させるための復号コードと、
を備え、前記復号コードの実行による前記暗号化済みコードの復号結果が前記コンピュータにより実行されるようにしたプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムコード暗号化装置及びプログラムに関する。
【背景技術】
【０００２】
プログラムコード内に含まれる秘密を秘匿するため、または、プログラムコードを改竄されないようにするために、ハードディスクやＲＯＭ（リード・オンリー・メモリ）などに保存されるプログラムコードの一部分を暗号化しておくことが行われている。この方式では、プログラムコードを起動してからその暗号化された部分を実行するまでの間にその部分を復号し、復号した部分を実行する方法がとられる。
【０００３】
また、特許文献１には、ソフトウェアデバッガによる動的なソフトウェア解析を不可能にするために、各々対応する処理コードを暗号化した暗号化コードをその実行時に相互に解除する第１及び第２のプログラムで構築する方法が開示されている。
【０００４】
また、特許文献２には、暗号化されたプログラムコードと、その暗号化されたプログラムコードを復号する復号ルーチンと、を含んだプログラムが開示されている。コンピュータがこのプログラムを実行する場合、まず復号ルーチンを実行することで、暗号化されたプログラムコードを復号し、その復号結果のプログラムコードを実行する。また、この文献には、プログラムのうち、復号ルーチンなどを含んだ部分のハッシュ値やチェックサム値などの情報を暗号化鍵として、暗号化対象のプログラムコードを暗号化することで、暗号化されたプログラムコードを生成することが開示されている（特に段落０１２１〜０１２３）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００１−３１８７８６号公報
【特許文献２】特開２００５−１６５９１９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明は、暗号化済みのプログラムコードの一部分を破壊又は改ざんして実行するという攻撃により暗号化対象の平文のプログラムコードが復元されることを防止することを目的とする。
【課題を解決するための手段】
【０００７】
請求項１に係る発明は、暗号化対象のプログラムコードを、暗号化鍵を用いて暗号化することにより、暗号化済みコードを生成する暗号化手段と、前記暗号化済みコードを含むデータの特徴値を計算する特徴値計算手段と、前記暗号化鍵で暗号化されたプログラムコードを復号するための復号鍵と前記特徴値とに基づき、前記復号鍵を求めるための種情報を計算する種情報計算手段と、前記暗号化手段が生成した暗号化済みコードと、前記種情報計算手段が計算した前記種情報と、を含んだ配布用プログラムを生成する生成手段と、を備えるプログラムコード暗号化装置である。
【０００８】
請求項２に係る発明は、前記生成手段は、前記配布用プログラムとして、当該配布用プログラムに含まれる前記暗号化済みコードを含むデータから前記特徴値を計算するための特徴値計算コードと、当該特徴値計算コードが計算した前記特徴値と、当該配布用プログラムに含まれる前記種情報と、に基づき前記復号鍵を計算するための復号鍵計算コードと、前記復号鍵計算コードが計算した前記復号鍵を用いて前記暗号化済みコードを復号するための復号コードと、を更に含むプログラムを生成する、ことを特徴とする請求項１に記載のプログラムコード暗号化装置である。
【０００９】
請求項３に係る発明は、前記特徴値計算手段は、前記暗号化済みコードと、前記復号コードの少なくとも一部と、を含むデータの特徴値を計算し、前記特徴値計算コードは、前記配布用プログラムに含まれる前記暗号化済みコードと、前記特徴値計算コード、前記復号鍵計算コード又は前記復号コードのうちの少なくとも一部と、を含むデータの特徴値を計算するためのコードである、ことを特徴とする請求項１又は２に記載のプログラムコード暗号化装置である。
【００１０】
請求項４に係る発明は、コンピュータを、暗号化対象のプログラムコードを、暗号化鍵を用いて暗号化することにより、暗号化済みコードを生成する暗号化手段、前記暗号化済みコードを含むデータの特徴値を計算する特徴値計算手段、前記暗号化鍵で暗号化されたプログラムコードを復号するための復号鍵と前記特徴値とに基づき、前記復号鍵を求めるための種情報を計算する種情報計算手段、前記暗号化手段が生成した暗号化済みコードと、前記種情報計算手段が計算した前記種情報と、を含んだ配布用プログラムを生成する生成手段、として機能させるためのプログラムである。
【００１１】
請求項５に係る発明は、平文プログラムコードを暗号化鍵により暗号化した結果である暗号化済みコードと、前記暗号化鍵に対応する復号鍵の計算のために用いられる種情報と、前記暗号化済みコードから特徴値を計算する処理をコンピュータに実行させるための特徴値計算コードと、前記特徴値計算コードの実行により計算された特徴値と前記種情報とに基づき復号鍵を計算する処理を前記コンピュータに実行させるための復号鍵計算コードと、前記復号鍵計算コードにより計算された前記復号鍵と前記暗号化に対応する復号演算とにより、前記暗号化済みコード復号する処理、を前記コンピュータに実行させるための復号コードと、を備え、前記復号コードの実行による前記暗号化済みコードの復号結果が前記コンピュータにより実行されるようにしたプログラムである。
【発明の効果】
【００１２】
請求項１、４又は５に係る発明によれば、暗号化済みのプログラムコードの一部分を破壊又は改ざんして実行するという攻撃により暗号化対象の平文のプログラムコードが復元されることを防止することができる。
【００１３】
請求項２に係る発明によれば、配布先のコンピュータが、特徴値計算コード、復号鍵計算コード又は復号コードを有していない場合でも、実行可能な配布用プログラムを作成することができる。
【００１４】
請求項３に係る発明によれば、特徴値計算コード、復号鍵計算コード又は復号コードのうちの一部が改ざんされた場合でも、平文のプログラムコードが復元されるのを防止することができる。
【図面の簡単な説明】
【００１５】
【図１】従来のブロック暗号又はストリーム暗号方式では平文のプログラムコードが解読される可能性があることを説明するための図である。
【図２】実施形態のプログラムコード暗号化装置の一例を示す図である。
【図３】種情報の計算方式を説明するための図である。
【図４】配布用プログラムのデータ構造の一例を示す図である。
【図５】種情報から復号鍵を計算する方式を説明するための図である。
【発明を実施するための形態】
【００１６】
一般に、暗号化のアルゴリズムは、様々な大きさのデータを対象とするため、その設計および実装のしやすさから、ブロック暗号や、ストリーム暗号が用いられることが多い。しかしコードを暗号化して保護していても、暗号化して保護されたプログラムコードの一部を破壊しておき実行すると、ブロック暗号では破壊したブロックだけについて、ストリーム暗号では破壊したビットだけについては復号が失敗するが、その他の部分については復号が成功してしまう。
【００１７】
例えば、ブロック暗号方式のＣＢＣ(Cipher Block Chaining)モードでは、暗号化されたコード１０の一部を意図的に破壊した場合（図１の（ａ））、破壊されたブロック１２とその次に復号されるブロックは正しく復号できないが、復号の進む方向に関して破壊されたブロックの前のブロック群１４や、後ろのブロック群１６は正しい平文が復号されてしまう（図１の（ｂ））。これは、ＣＢＣモードでは、周知のように、復号対象の暗号文ブロックが、当該ブロックとその次のブロックにしか影響を与えないためである。
【００１８】
このように部分的に復号が失敗した復号結果のコードを実行した場合、正しく復号されたブロック群１４が正しく実行された後、破壊された部分１２の所でプログラムが暴走し、一時停止する。この一時停止したときにメモリを見ると、復号されたコードが、破壊された部分１２を除いて、読むことが可能である（図１の（ｃ））。このような処理を、破壊する場所を変化させて複数回行うと、正しい平文のコードをすべて取得することも可能である。
【００１９】
なお、以上の流れにおけるプログラムの暴走と一時停止は、オペレーティングシステムの機能によるものである。したがって、上述の性質を用いた攻撃は、デバッガ検出技術を用いてデバッガ上でのプログラム実行を阻止する構成をとったとしても、阻止し得ない。
【００２０】
このような攻撃に対し、この実施形態では、暗号化されたプログラムコード（暗号化済みコードと呼ぶ）の特徴を表す特徴値を用いる。より詳しくは、その特徴値をその暗号化済みコードの復号のための復号鍵に作用させることで、復号鍵の元になる種情報を計算し、計算結果の種情報を暗号化済みコードと対応づけて、ユーザに配布する。
【００２１】
暗号化済みコードの特徴値としては、暗号化済みコードを改ざんすると値が変化するものを用いる。例えば、ハッシュ値やチェックサム値などがその代表例である。以下では、特徴値としてハッシュ値を計算する場合を代表例にとって説明するが、他の種類の特徴値を用いてももちろんよい。
【００２２】
暗号化済みコードと種情報の配布を受けたユーザのコンピュータがその暗号化済みコードを実行する場合、暗号化済みコードから特徴値を計算する。そして、その特徴値と種情報から復号鍵を計算し、その復号鍵により暗号化済みコードを復号し、復号により得られる平文のプログラムコードを実行する。ここで、仮に暗号化済みコードに対し、一部の破壊や、デバッグ解析のためのコード追加などといった改ざんが加えられると、計算される特徴値が本来の値から変化するため、特徴値と種情報から計算される復号鍵が誤ったものになり、その復号鍵による暗号化済みコードの復号結果は、元の平文のプログラムコードとはまったく異なったものとなる。
【００２３】
このような原理に従ったプログラムコード暗号化装置の一例を図２に示す。この装置は、対象プログラム入力部２０、暗号化鍵生成部２２、暗号化部２４、ハッシュ値計算部２６、種情報生成部２８及び配布用プログラム生成部３０を備える。
【００２４】
対象プログラム入力部２０は、ユーザ（プログラムを配布しようとする者）から、配布対象、すなわち暗号化対象の平文のプログラムコードの入力を受け付ける。
【００２５】
暗号化鍵生成部２２は、その平文のプログラムコードを暗号化するための暗号化鍵を、例えば乱数などに基づき公知の演算により生成する。非対称暗号方式（暗号化と復号にそれぞれ異なる鍵情報を用いる方式。例えば公開鍵暗号方式）を用いる場合、暗号化鍵生成部２２は、生成した暗号化鍵に対応する復号鍵も合わせて生成する。対象暗号方式を用いる場合には、生成された暗号化鍵が復号鍵としても機能する。なお、あらかじめ定めた固定的な暗号化鍵を用いる方式を採用する場合には、暗号化鍵生成部２２はなくてもよい。
【００２６】
暗号化部２４は、暗号化鍵生成部２２が生成した暗号化鍵（あるいはあらかじめ定められた固定の暗号化鍵）を用いて、平文のプログラムコードを暗号化する。そして、暗号化部２４は、平文プログラムコードの暗号化結果である、暗号化済みコードを出力する。暗号化部２４が用いる暗号アルゴリズム、暗号化処理方式などは、特に限定されるものではなく、従来公知の、或いはこれから開発されるどの暗号アルゴリズム、暗号化処理方式を用いてもよい。
【００２７】
ハッシュ値計算部２６は、暗号化済みコードのハッシュ値を計算する。ハッシュ値計算部２６がハッシュ値の計算に用いる演算アルゴリズム又はハッシュ関数は、特に限定されるものではなく、MD5やSHA-1、SHA-2等といった公知のもの、あるいはこれから開発される関数等、どのようなものを用いてもよい。
【００２８】
種情報生成部２８は、暗号化部２４が暗号化対象の平文プログラムコードの暗号化に用いた暗号化鍵に対応する復号鍵（例えば、暗号化鍵生成部２２が生成したもの）と、ハッシュ値計算部２６が計算した暗号化済みコードのハッシュ値と、を用いて、復号鍵の元になる種情報を計算する。すなわち、種情報生成部２８は、復号鍵のデータと暗号化済みコードのハッシュ値とを２つの入力データとし、それら２つの入力データに対してあらかじめ定められた演算処理（第１の演算とよぶ）を行うことで、種情報を生成する。種情報は、復号鍵とは異なるデータであり、且つ、暗号化済みコードのハッシュ値と組み合わせることで復号鍵を計算することができるデータである。種情報の算出に用いる第１の演算は、暗号化済みコードのハッシュ値と種情報とに対して、その第１の演算との間であらかじめ定められた関係のある第２の演算を行うと、その暗号化済みコードの復号のための復号鍵が算出される演算である。そして、第１の演算としては、衝突困難性を持つ演算、すなわち、復号鍵の値が同じであってもハッシュ値が変われば算出する種情報の値が必ず変化する演算を用いる。なお、ここでいう「必ず変化する」とは、厳密に必ず変化することを意味するものではなく、ハッシュ関数の場合と同様、実用的にみて必ず変化すると見なせるという意味である。ここで、第２の演算は、例えば、第１の演算の逆演算である。すなわちこの場合、第１の演算は、ハッシュ値と種情報に対して当該第１の演算の逆演算を施すと復号鍵が算出される、という条件を満たす演算である。
【００２９】
種情報を求めるための前述の第１の演算としては、例えばビットごとの排他的論理和（ＸＯＲ）演算を用いることができる。この場合、復号鍵を求めるための前述の第２の演算もまた、ビットごとの排他的論理和演算である。また、第１の演算として、ハッシュ値を復号鍵で暗号化する暗号化演算を用いてもよい。この場合、復号鍵を求めるための第２の演算は、ハッシュ値を種情報により復号する演算であり、この演算はその暗号化演算に対応する演算内容である。なお、第１の演算は、以上に例示したものに限られるものではなく、上述の条件を満たすものであれば、どのようなものを用いてもよい。
【００３０】
配布用プログラム生成部３０は、暗号化済みコードと、復号鍵に対応する種情報と、を含んだ配布用プログラムを生成する。生成された配布用プログラムは、様々な配布先ユーザに配布され、それら配布先で実行される。
【００３１】
次に、図３を参照して、このプログラムコード暗号化装置での種情報の生成方式を説明する。この例は、暗号化部２４で対称暗号方式のアルゴリズムを用いる場合の例である。この例では、暗号化部２４が、平文である暗号化対象のプログラムコード４０を、暗号化鍵４２を用いて暗号化することで、暗号化済みコード４４を生成する。ハッシュ値計算部２６は、この暗号化済みコード４４のハッシュ値４６を計算する。種情報生成部２８は、次の演算により種情報４８を計算する。
【００３２】
（種情報） ＝ （暗号化鍵） operator （ハッシュ値）
【００３３】
ここで、「operator」は、第１の演算を表す演算子である。なお、この例では、暗号化鍵自体が、暗号化済みコードを復号するための復号鍵として機能する。非対称暗号方式を用いる場合は、暗号化鍵の代わりに、その暗号化鍵に対応する復号鍵とハッシュ値とから、第１の演算により種情報４８を計算すればよい。
【００３４】
なお、第１の演算は、上に例示したような１つの演算子で表されるものに限らない。暗号化鍵（＝復号鍵）とハッシュ値とを入力とする他の関数であってもよい。
【００３５】
次に、図４を参照して、配布用プログラム生成部３０が生成する配布用プログラムファイル１００の一例を説明する。
【００３６】
配布用プログラムファイル１００は、例えばオブジェクトファイル形式のファイルであり、オブジェクトヘッダ１１０、コードセクション１２０及びデータセクション１３０を含んでいる。
【００３７】
オブジェクトヘッダ１１０は、当該プログラムファイル１００のヘッダ情報を記述したセクションである。また、コードセクション１２０は、コンピュータが実行するプログラムコードが含まれるセクションである。このセクションは、書き込み、読み出し及び実行が可能なセクションである。暗号化済みコード１２７もコードセクション１２０に含まれる。データセクション１３０は、コードセクション１２０に含まれる復号等のためのコードの実行において用いられる種情報４８などのデータが含まれるセクションである。
【００３８】
この例において、データセクション１３０には、コードセクション１２０内で暗号化済コード１２７が含まれる範囲を示す暗号化範囲情報と、暗号化済みコード１２７のハッシュ値を計算するために用いるハッシュ用初期ベクタと、復号処理に用いる暗号用初期ベクタと、種情報生成部２８が生成した種情報４８と、パディング情報とを含んでいる。暗号用初期ベクタは、暗号化部２４がブロック暗号又はストリーム暗号の暗号利用モードを用いて平文プログラムコードを暗号化した際に用いた初期ベクタである。ハッシュ用初期ベクタは、ブロック暗号又はストリーム暗号の仕組みを用いてハッシュ値を演算する場合に用いる初期ベクタである。初期ベクタが不要なハッシュ値算出方式を用いる場合、ハッシュ用初期ベクタは不要である。パディング情報は、暗号化やハッシュ値計算にブロック暗号方式を用いる場合に、暗号化対象の平文のプログラムコードのデータサイズをブロックのサイズの整数倍にするために追加するダミーデータである。暗号化範囲情報、ハッシュ用初期ベクタ、暗号用初期ベクタ、及びパディング情報は、暗号化部２４及びハッシュ値計算部２６から取得すればよい。
【００３９】
コードセクション１２０は、復号範囲取得コード１２１、ハッシュ用初期ベクタ取得コード１２２、ハッシュ計算コード１２３、復号鍵生成コード１２４、暗号用初期ベクタ取得コード１２５、復号コード１２６、及び暗号化済みコード１２７を含んでいる。
【００４０】
復号範囲取得コード１２１は、コードセクション１２０から、復号すべき範囲を特定する情報、すなわち暗号化範囲情報、を取得するための処理を表すプログラムコードである。ハッシュ用初期ベクタ取得コード１２２は、コードセクション１２０からハッシュ用初期ベクタを取得するための処理を表すプログラムコードである。
【００４１】
ハッシュ計算コード１２３は、復号範囲取得コード１２１の実行により取得された情報が示す範囲のデータ、すなわち暗号化済みコード１２７、のハッシュ値を計算するための処理を表すプログラムコードである。ハッシュ計算コード１２３が表すハッシュ計算処理は、ハッシュ値計算部２６が行う計算と同じものである。なお、この例では、ハッシュ計算コード１２３は、そのハッシュ値の計算の初期ベクタとして、ハッシュ用初期ベクタ取得コードの実行により取得されたハッシュ用初期ベクタを用いる。
【００４２】
復号鍵生成コード１２４は、データセクション１３０内の種情報と、ハッシュ計算コード１２３の実行により計算されるハッシュ値と、に対して、前述の第２の演算（例えば種情報生成部２８が実行する演算の逆演算）を行うという処理を表すプログラムコードである。コンピュータが復号鍵生成コード１２４を実行することにより、暗号化済みコード１２７の復号のための復号鍵が求められる。
【００４３】
暗号用初期ベクタ取得コード１２５は、データセクション１３０から、暗号用初期ベクタを取得するための処理を表すプログラムコードである。復号コード１２６は、復号範囲取得コード１２１の実行により取得された情報が示す範囲のデータ、すなわち暗号化済みコード１２７を復号するための処理を表すプログラムコードである。復号コード１２６は、復号鍵生成コード１２４の実行により求められた復号鍵を用いて、暗号化済みコード１２７を復号する。復号コード１２６で用いられる復号アルゴリズムは、暗号化部２４の暗号化アルゴリズムに対応するものである。
【００４４】
コードセクション１２０のうち、暗号化済みコード１２７の領域には、暗号化部２４による暗号化の前、及び、復号コード１２６の実行による復号の後は、元の平文のプログラムコードが置かれることになる。
【００４５】
一例として、プログラム作成者は、コードセクション１２０のプログラムコード群を表すソースコードを作成し、それをコンパイラによりコンパイルする。これにより、領域１２７に暗号化対称の平文のプログラムコードを含んだオブジェクトコードが得られる。この時点では、データセクション１３０のうち、ハッシュ用初期ベクタ、暗号用初期ベクタ、種情報、パディング情報は未定である。このコンパイル結果のオブジェクトコードを、この実施形態の暗号化装置に入力すると、暗号化部２４がそのオブジェクトコードのうち、暗号化範囲情報が示す範囲にある平文コードを暗号化する。これにより暗号化済みコード１２７が生成される。そして、暗号化部２４、ハッシュ値計算部２６、及び種情報生成部２８により、ハッシュ用初期ベクタ、暗号用初期ベクタ、種情報、パディング情報の値が決定され、データセクション１３０に書き込まれる。このような処理により、図４に例示した配布用プログラムファイル１００が完成する。この配布用プログラムが、配布先の各ユーザに配布される。
【００４６】
配布先ユーザのコンピュータでこの配布用プログラムファイル１００が呼び出されると、そのファイル１００がそのコンピュータのメインメモリ上にロードされる。コンピュータは、メインメモリ上にロードされたコードセクション１２０に含まれる各コード１２１〜１２７をその並び順に従って先頭から順番に実行していく。この実行の流れを、図５も更に参照して説明する。
【００４７】
すなわち、コンピュータは、まず復号範囲取得コード１２１を実行して、データセクション１３０の暗号化範囲情報に基づきコードセクション１２０中で復号すべき範囲を特定する。次に、ハッシュ用初期ベクタ取得コード１２２を実行してハッシュ用初期ベクタを取得し、更にハッシュ計算コード１２３を実行して、ハッシュ用初期ベクタを用いて、復号すべき範囲にある暗号化済みコード１２７（図５では暗号化済みのプログラムコード４４）のハッシュ値４６を計算する。次に、復号鍵生成コード１２４を実行して、そのハッシュ値４６と、データセクション１３０内の種情報４８とから、復号鍵４２を計算する。この計算は、例えば、以下のようなものである。
【００４８】
（復号鍵） ＝ （ハッシュ値） 逆operator （種情報）
【００４９】
ここで、「逆operator」は、種情報の計算に用いた前述の演算「operator」の逆演算である。対称暗号方式を用いている場合、計算される復号鍵は、暗号化鍵と等しい。なお、この復号鍵算出のための演算は、上に例示したような１つの演算子で表されるものに限らない。種情報とハッシュ値とを入力とする他の関数であってもよい。
【００５０】
次に、暗号用初期ベクタ取得コード１２５を実行してデータセクション１３０から暗号用初期ベクタを取得し、更に復号コード１２６を実行して、暗号化済みコード１２７を、その復号鍵４２により復号する。復号結果である平文のプログラムコード４０は、メインメモリ上の、暗号化済みコード１２７の領域に上書きされる。この復号処理の後、コンピュータは、その平文プログラムコード４０を実行する。
【００５１】
なお、配布用プログラムファイル１００には、復号結果の平文のプログラムコードの実行完了後、その平文のプログラムコードをメモリから削除する処理を指示するコードが含まれていてもよい。
【００５２】
また、以上では、ブロック暗号方式を例にとって説明したが、ストリーム暗号方式に同様の方式を適用してもよい。ブロック暗号方式では、暗号化の単位がブロックであったが、ストリーム暗号方式では暗号化の単位がビット又はバイトになる。
【００５３】
攻撃者が、以上に説明した配布用プログラムファイル１００の中の暗号化済みコード１２７の一部を破壊又は改ざんした場合、そのプログラムファイル１００を実行すると、計算されるハッシュ値４６が正しい値とは異なった値となる。このように誤ったハッシュ値と、種情報４８と、を用いて復号鍵を計算すると、計算結果の復号鍵も誤ったものとなる。そして、誤った復号鍵を用いて暗号化済みコード１２７を復号すると、その復号の結果は元の平文のプログラムコードとはまったく異なったものとなり、元の平文プログラムコードは一部たりとも再現されない。コンピュータが、その誤った復号結果を実行しようとしても、実行することはできない。
【００５４】
暗号化済みコードの保護のためにハッシュを利用する場合、一般的には、暗号化済みコードとそのハッシュ値とを配布用プログラムに含めることが考えられる。この場合、配布先のコンピュータが配布用プログラムを実行する際、その中に含まれる暗号化済みコードのハッシュ値を計算し、その計算結果が配布用プログラム内のハッシュ値に一致するか否かにより、改ざんの有無を確認する。そして、改ざんがない場合にのみ、暗号化済みコードの復号及び実行の処理に進むことになる。このように、一般的なハッシュの利用の仕方では、ハッシュにより改ざんの有無を確認し、改ざんがない場合に復号に進むという条件分岐を含んだ制御用のプログラムが、配布用プログラム中に含まれることになる。このような条件分岐を含むプログラムの場合、暗号化済みコードに対して一部破壊などの改ざんを行った場合でも、コード解析により条件分岐のコード部分を特定して削除してしまうことにより、その改ざん後の暗号化済みコードを復号して実行することができてしまう。
【００５５】
これに対し、この実施形態の方式では、配布用プログラムファイル１００のコードセクション１２０内の復号処理のためのプログラムコード群１２１〜１２６には、そのような条件分岐は含まれない。したがって、条件分岐を削除するという攻撃は通用しない。
【００５６】
以上の例では、種情報４８の計算のために、暗号化済みコード１２７（図５では符号１４４）のハッシュ値を用いたが、これは一例に過ぎない。この代わりに、暗号化済みコード１２７と、復号処理のためのプログラムコード群１２１〜１２６のうちのあらかじめ定めた一部とを含んだ範囲のコードのハッシュ値を計算し、そのハッシュ値と復号鍵とから種情報４８を計算するようにしてもよい。この場合、暗号化済みコード１２７、又は復号処理のためのプログラムコード群１２１〜１２６のうちハッシュ値の計算の範囲に含まれる部分に改ざんがなされると、復号鍵の計算結果が誤ったものとなり、暗号化済みコード１２７が正しく復号できなくなる。なお、この場合、配布用プログラムファイル１００のデータセクション１３０には、ハッシュ値の計算範囲を示す情報を含めておけばよい。
【００５７】
また、復号処理のためのコード群１２１〜１２６があらかじめ配布先のコンピュータに存在することが想定できる場合には、配布用プログラムファイル１００には、それらコードを呼び出すためのプログラムが含まれていれば足りる。
【００５８】
以上に例示したプログラムコード暗号化装置は、一つの例では、汎用のコンピュータに上述の処理を表すプログラムを実行させることにより実現される。ここで、コンピュータは、例えば、ハードウエアとして、ＣＰＵ等のマイクロプロセッサ、ランダムアクセスメモリ（ＲＡＭ）およびリード・オンリー・メモリ（ＲＯＭ）等のメモリ（一次記憶）、ＨＤＤ（ハードディスクドライブ）コントローラを経由して接続されたＨＤＤ、各種Ｉ／Ｏ（入出力）インタフェース等が、バスを介して接続された回路構成を有する。バスには、ローカルエリアネットワーク等のネットワークに接続するためのネットワークインタフェースが接続されていてもよい。また、そのバスに対し、例えばＩ／Ｏインタフェース経由で、ＣＤやＤＶＤなどの可搬型ディスク記録媒体に対する読み取り及び／又は書き込みのためのディスクドライブ、フラッシュメモリなどの各種規格の可搬型の不揮発性記録媒体に対する読み取り及び／又は書き込みのためのメモリリーダライタなどが接続されてもよい。上に例示した各機能モジュールの処理内容が記述されたプログラムがＣＤやＤＶＤ等の記録媒体を経由して、又はネットワーク等の通信手段経由で、ハードディスクドライブ等の固定記憶装置に保存され、コンピュータにインストールされる。インストールされたプログラムがＲＡＭに読み出されＣＰＵ等のマイクロプロセッサにより実行されることにより、上に例示した装置の機能が実現される。
【符号の説明】
【００５９】
２０  対象プログラム入力部、２２  暗号化鍵生成部、２４  暗号化部、２６  ハッシュ値計算部、２８  種情報生成部、３０  配布用プログラム生成部。
【図１】
2011123229.tif 000003
【図２】
2011123229.tif 000004
【図３】
2011123229.tif 000005
【図４】
2011123229.tif 000006
【図５】
2011123229.tif 000007