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