(57)【要約】【課題】コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法を得る。【解決手段】プログラムを記憶装置から取得するステップと、プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、ジャンプ命令挿入ステップで新たなジャンプ命令を挿入したプログラムを、直前に暗号化した命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、をコンピュータに実行させ、連鎖暗号化ステップでは、暗号化する命令と、直前に暗号化した命令との排他的論理和をとった上で当該命令を暗号化し、暗号化する命令の直前の命令が条件分岐命令または無条件ジャンプ命令であった場合、当該命令の暗号化に際し、直前の命令を暗号化に利用することに代えて所定の初期値を暗号化に利用する。【選択図】図１
2009169489.tif 000002
【特許請求の範囲】
【請求項１】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、
前記プログラムを記憶装置から取得するステップと、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、
前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、直前に暗号化した命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、
を前記コンピュータに実行させ、
前記連鎖暗号化ステップでは、
暗号化する命令と、直前に暗号化した命令との排他的論理和をとった上で当該命令を暗号化し、
暗号化する命令の直前の命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の暗号化に際し、
直前の命令を暗号化に利用することに代えて所定の初期値を暗号化に利用する
ことを特徴とする暗号化方法。
【請求項２】
条件分岐命令または無条件ジャンプ命令を複数の命令に分割するジャンプ命令分割ステップを有する
ことを特徴とする請求項１に記載の暗号化方法。
【請求項３】
前記ジャンプ命令分割ステップでは、
条件分岐命令または無条件ジャンプ命令を、
ダミー命令と、分割前のジャンプ命令とに分割する
ことを特徴とする請求項２に記載の暗号化方法。
【請求項４】
前記ジャンプ命令分割ステップでは、
条件分岐命令または無条件ジャンプ命令を、
ハッシュ値を含む任意ビット列と、分割前のジャンプ命令とに分割する
ことを特徴とする請求項２に記載の暗号化方法。
【請求項５】
請求項１ないし請求項４のいずれかに記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
その暗号化されたプログラムを、直前に復号化した命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
を前記コンピュータに実行させ、
前記連鎖復号化ステップでは、
暗号化に対応する復号化を行って得た命令と、直前に復号化対象であった命令との排他的論理和をとることで当該命令を復号化し、
復号化する命令の直前に復号化対象であった命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の復号化に際し、
直前の命令を復号化に利用することに代えて前記初期値を復号化に利用する
ことを特徴とする復号化方法。
【請求項６】
請求項２ないし請求項４のいずれかに記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
その暗号化されたプログラムを、直前に復号化した命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
前記連鎖復号化ステップで復号化して得た命令の順序が正しいか否かを判定する順序判定ステップと、
を有し、
前記連鎖復号化ステップでは、
暗号化に対応する復号化を行って得た命令と、直前に復号化対象であった命令との排他的論理和をとることで当該命令を復号化し、
復号化する命令の直前に復号化対象であった命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の復号化に際し、
直前の命令を復号化に利用することに代えて前記初期値を復号化に利用し、
前記順序判定ステップでは、
前記連鎖復号化ステップで復号化して得た命令が分割されたジャンプ命令である場合、
分割されたジャンプ命令が分割時の順序で得られたときに限り、当該ジャンプ命令の復号結果を出力する
ことを特徴とする復号化方法。
【請求項７】
分割されたジャンプ命令以外の命令を投入した場合と、分割されたジャンプ命令を分割時の順序で投入した場合と、に限り正しく遷移する状態遷移器を設けておき、
前記順序判定ステップでは、
前記連鎖復号化ステップで復号化して得た命令を前記状態遷移器に逐次投入し、
前記状態遷移器が正しく遷移した場合に限り、当該ジャンプ命令の復号結果を出力する
ことを特徴とする請求項６に記載の復号化方法。
【請求項８】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを暗号化する装置であって、
前記プログラムを記憶装置から取得する手段と、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入部と、
前記ジャンプ命令挿入部が新たなジャンプ命令を挿入した前記プログラムを、直前に暗号化した命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化部と、
を備え、
前記連鎖暗号化部は、
暗号化する命令と、直前に暗号化した命令との排他的論理和をとった上で当該命令を暗号化し、
暗号化する命令の直前の命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の暗号化に際し、
直前の命令を暗号化に利用することに代えて所定の初期値を暗号化に利用する
ことを特徴とする暗号化装置。
【請求項９】
条件分岐命令または無条件ジャンプ命令を複数の命令に分割するジャンプ命令分割部を備える
ことを特徴とする請求項８に記載の暗号化装置。
【請求項１０】
前記ジャンプ命令分割部は、
条件分岐命令または無条件ジャンプ命令を、
ダミー命令と、分割前のジャンプ命令とに分割する
ことを特徴とする請求項９に記載の暗号化装置。
【請求項１１】
前記ジャンプ命令分割部は、
条件分岐命令または無条件ジャンプ命令を、
ハッシュ値を含む任意ビット列と、分割前のジャンプ命令とに分割する
ことを特徴とする請求項９に記載の暗号化装置。
【請求項１２】
請求項１ないし請求項４のいずれかに記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
その暗号化されたプログラムを、直前に復号化した命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
を備え、
前記連鎖復号化部は、
暗号化に対応する復号化を行って得た命令と、直前に復号化対象であった命令との排他的論理和をとることで当該命令を復号化し、
復号化する命令の直前に復号化対象であった命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の復号化に際し、
直前の命令を復号化に利用することに代えて前記初期値を復号化に利用する
ことを特徴とする復号化装置。
【請求項１３】
請求項２ないし請求項４のいずれかに記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
その暗号化されたプログラムを、直前に復号化した命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号化部が復号化して得た命令の順序が正しいか否かを判定する順序判定部と、
を備え、
前記連鎖復号化部は、
暗号化に対応する復号化を行って得た命令と、直前に復号化対象であった命令との排他的論理和をとることで当該命令を復号化し、
復号化する命令の直前に復号化対象であった命令が条件分岐命令または無条件ジャンプ命令であった場合、
当該命令の復号化に際し、
直前の命令を復号化に利用することに代えて前記初期値を復号化に利用し、
前記順序判定部は、
前記連鎖復号化部が復号化して得た命令が分割されたジャンプ命令である場合、
分割されたジャンプ命令が分割時の順序で得られたときに限り、当該ジャンプ命令の復号結果を出力する
ことを特徴とする復号化装置。
【請求項１４】
分割されたジャンプ命令以外の命令を投入した場合と、分割されたジャンプ命令を分割時の順序で投入した場合と、に限り正しく遷移する状態遷移器を備え、
前記順序判定部は、
前記連鎖復号化部が復号化して得た命令を前記状態遷移器に逐次投入し、
前記状態遷移器が正しく遷移した場合に限り、当該ジャンプ命令の復号結果を出力する
ことを特徴とする請求項１３に記載の復号化装置。
【請求項１５】
請求項１ないし請求項４のいずれかに記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
その暗号化されたプログラムを、直前に復号化した命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号部が復号化して得た命令を補正する連鎖補正部と、
を備え、
前記連鎖復号部は、
暗号化に対応する復号化を行って得た命令と、直前に復号化対象であった命令との排他的論理和をとることで当該命令を復号化する復号部を備え、
前記復号部は、
複数の命令を並行的に復号化できるよう複数並列に設けられるとともに、前段の復号化結果を復号化に利用できるように多段接続されており、
前記連鎖補正部は、
前段で復号化対象であった命令が条件分岐命令または無条件ジャンプ命令であった場合に、前記連鎖復号部の復号化結果と、前段の復号化前の命令との排他的論理和をとり、さらにその結果と前記初期値との排他的論理和をとって出力する補正部を備え、
前記補正部は、
前記連鎖復号部の復号化結果を並行的に補正できるよう複数並列に設けられるとともに、前段の復号化結果を補正に利用できるように多段接続されている
ことを特徴とする復号化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号化方法および装置、復号化方法および装置に関するものである。
【背景技術】
【０００２】
コンピュータのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）上で実行されるプログラムを解析して不正にその内容を取得する攻撃手法として、ＣＰＵとメモリの間のデータバスに直接プローブを当て、ロジックアナライザを用いてＣＰＵの実行する命令や、レジスタにロードされるデータなどを解析する、タンパリング攻撃というものがある。
また、このタンパリング攻撃に対する対策として、データバス上を暗号化する、ｏｎ  ｔｈｅ  ｆｌｙ暗号という技術がある。また、バス暗号化のための専用プロセッサも開発されている。
【０００３】
ｏｎ  ｔｈｅ  ｆｌｙ暗号では、１命令または１ワードのデータを１ブロックとして独立に暗号化を行う。この場合、暗号ブロックと平文ブロックは１対１に対応付けられ、暗号化強度はさほど高くない。
【０００４】
一方、通常のメッセージ暗号化では、暗号ブロックが次のブロックの暗号化に用いられる暗号ブロック連鎖を行う場合があり、この場合は暗号ブロックと平文ブロックは１対１には対応せず、上述の１対１に対応する場合と比較して、既知平文攻撃や選択暗号文攻撃に対する暗号化強度が高くなる。
【０００５】
上述のｏｎ  ｔｈｅ  ｆｌｙ暗号において、暗号ブロック連鎖が行われないのは、暗号化対象の特性による。
コンピュータプログラムに対するタンパリング攻撃への対策として行われるｏｎ  ｔｈｅ  ｆｌｙ暗号の暗号化対象は、攻撃対象となるコンピュータプログラムである。
コンピュータプログラムは、一般的な平文メッセージと異なり、条件分岐や繰り返し処理などが内在しており、各暗号ブロックの復号順序が一意に定められない。したがって、暗号ブロック連鎖のように暗号化時と復号化時の順序が一意である必要がある手法は、適用することができないのである。
【０００６】
上述の課題に関し、下記非特許文献１では、暗号ブロック連鎖を行うことに代えて、暗号ブロックの保存先であるメモリのアドレスをランダム化したり、そのアドレスを鍵として用いたりすることで、解読を困難にする手法が記載されている。
また、下記非特許文献２では、上述の非特許文献１に記載の技術の他、種々の耐タンパリング化手法について解説されている。
【０００７】
【非特許文献１】Ｍａｒｋｕｓ  Ｇ．Ｋｕｈｎ，”Ｃｉｐｈｅｒ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅａｒｃｈ  Ａｔｔａｃｋ  ｏｎ  ｔｈｅ  ＢＵＳ−Ｅｎｃｒｙｐｔｉｏｎ  Ｓｅｃｕｒｉｔｙ  Ｍｉｃｒｏｃｏｎｔｒｏｌｌｅｒ  ＤＳ５００２ＦＰ”，ＩＥＥＥ  ＴＲＡＮＳＡＣＴＩＯＮＳ  ＯＮ  ＣＯＭＰＵＴＥＲＳ，ＶＯＬ．４７，ＮＯ．１０，ｐｐ．１１５３−１１５７，ＯＣＴＯＢＥＲ  １９９８
【非特許文献２】門田暁人，Ｃｌａｒｋ  Ｔｈｏｍｂｏｒｓｏｎ，”ソフトウェアプロテクションの技術動向（後編）−ハードウェアによるソフトウェア耐タンパー化技術”，情報処理，Ｖｏｌ．４６，Ｎｏ．５，ｐｐ．５５８−５６３，２００５．５
【発明の開示】
【発明が解決しようとする課題】
【０００８】
上述の非特許文献１に記載の技術は、Ｋｕｈｎが弱点を発見している。
Ｋｕｈｎは、適当なビット列を暗号化された命令としてＣＰＵに入力し、そのときのＣＰＵの挙動を観察することを繰り返し、暗号文命令と平文命令の対応テーブルを作った。そして、そのテーブルを元に、ＣＰＵからパラレルポートへメモリ上の全データを書き出す暗号化プログラムを得ることができた。
パラレルポートに出力されたデータは暗号化されていないため、平文と暗号文の対応表が作成可能であるということを利用したものである。
【０００９】
上述の弱点の原因は、暗号ブロックと平文が１対１に対応しているため、選択暗号文攻撃によって、所望の動作をする暗号化された状態のプログラムが得られることにある。
これを回避する１つの手法として、暗号ブロック連鎖を行うことが挙げられるが、先に説明したように、コンピュータプログラムを暗号化する際には、暗号ブロック連鎖を行うことができない。
そのため、コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法および装置、その復号化方法および装置が望まれていた。
【課題を解決するための手段】
【００１０】
本発明に係る暗号化方法は、演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、前記プログラムを記憶装置から取得するステップと、前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、直前に暗号化した命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、を前記コンピュータに実行させ、前記連鎖暗号化ステップでは、暗号化する命令と、直前に暗号化した命令との排他的論理和をとった上で当該命令を暗号化し、暗号化する命令の直前の命令が条件分岐命令または無条件ジャンプ命令であった場合、当該命令の暗号化に際し、直前の命令を暗号化に利用することに代えて所定の初期値を暗号化に利用するものである。
【発明の効果】
【００１１】
本発明に係る暗号化方法によれば、暗号化を行う前に、条件分岐命令または無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入しておき、通常の命令は連鎖的に暗号化し、ジャンプ命令に関しては所定の初期値を暗号化に用いる。
そのため、条件分岐命令や無条件ジャンプ命令が存在する場合でも、これらのジャンプ先命令を暗号化する際には、所定の初期値が用いられていることが分かっているので、復号順序が一意でないことは問題にならない。
したがって、条件分岐命令や無条件ジャンプ命令が存在するコンピュータプログラムの暗号化に際しても、暗号ブロック連鎖を適用することができる。
【発明を実施するための最良の形態】
【００１２】
実施の形態１．
図１は、本発明の実施の形態１に係る暗号化装置１００の機能ブロック図である。
暗号化装置１００は、ジャンプ先アドレス収集部１１０、ジャンプ命令収集部１２０、ジャンプ命令挿入部１３０、鍵保持部１４１、暗号化部１４２、排他的論理和演算器１４３、遅延部１５０、初期ベクトル記憶部１６０、初期化判定部１７０を備える。
また、図１では、暗号化装置１００の周辺構成として、オリジナルコードメモリ３００、変換コードメモリ４００、命令メモリ５００を併せて記載した。
【００１３】
ジャンプ先アドレス収集部１１０は、オリジナルコードメモリ３００に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令のジャンプ先アドレスを取得する。
なお、ここでいうプログラムコードとは、ＣＰＵの実行命令形式、または少なくとも実行単位がＣＰＵの実効命令形式と等しい形式に変換されているものをいう。具体的には、マシンコードやアセンブラコードが相当する。以下同様である。
【００１４】
ジャンプ命令収集部１２０は、オリジナルコードメモリ３００に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令が存在する箇所を取得する。
ジャンプ命令挿入部１３０は、後述の図４で説明する手順により、オリジナルコードメモリ３００に格納されているプログラムコードに新たなジャンプ命令を挿入し、変換コードメモリ４００に格納する。ただし、挿入時にジャンプ命令収集部１２０を参照してすでに無条件ジャンプ命令や条件分岐命令が存在していることが分かった場合には挿入をしないとしても良い。
【００１５】
鍵保持部１４１は、暗号化鍵を保持する。
暗号化部１４２は、鍵保持部１４１が保持している暗号化鍵を用いて暗号化を行う。
遅延部１５０は、後述の図２で説明する構成を備えており、入力された命令を、次の命令が入力されたときに出力する。即ち、先に入力された命令を、１ステップ遅れて出力する機能を備える。
排他的論理和演算器１４３は、変換コードメモリ４００と遅延部１５０より入力値を受け取り、その排他的論理和を暗号化部１４２に出力する。
【００１６】
初期ベクトル記憶部１６０は、後述の図４で説明する暗号化処理を行うための初期値（以後、初期ベクトルＩＶと呼ぶ）を格納している。
初期化判定部１７０は、変換コードメモリ４００よりジャンプ命令挿入後のプログラムコードを取得し、条件分岐命令や無条件ジャンプ命令を検出すると、遅延部１５０にＩＶ上書き信号を出力する。このときの動作は、後述の図４で説明する。
【００１７】
オリジナルコードメモリ３００は、暗号化前のプログラムコードを格納している。
変換コードメモリ４００は、ジャンプ命令挿入後のプログラムコードを格納する。
命令メモリ５００は、暗号化後のプログラムコードを格納する。
【００１８】
図２は、遅延部１５０の機能ブロック図である。
遅延部１５０は、第１レジスタ１５１、マルチプレクサ１５２、第２レジスタ１５３を備える。
第１レジスタ１５１は、暗号化部１４２が出力する暗号化された命令を１命令分格納する。先に第１レジスタ１５１に格納されていた命令は、第２レジスタ１５３にコピーされる。
マルチプレクサ１５２は、第２レジスタ１５３に出力すべき命令を、第１レジスタ１５１から受け取るか、それとも初期ベクトル記憶部１６０が格納している初期ベクトルＩＶにするかを切り替える。切り替えは、初期化判定部１７０が出力するＩＶ上書き信号の入力を契機に行われる。
第２レジスタ１５３は、マルチプレクサ１５２が出力する命令を受け取り、１命令分格納する。
なお、第２レジスタ１５３には、初期値として初期ベクトルＩＶが格納される。
【００１９】
本実施の形態１における「連鎖暗号化部」は、暗号化部１４２、遅延部１５０がこれに相当する。また、「初期値」は、初期ベクトルＩＶがこれに相当する。
【００２０】
ジャンプ先アドレス収集部１１０、ジャンプ命令収集部１２０、ジャンプ命令挿入部１３０、暗号化部１４２、排他的論理和演算器１４３、遅延部１５０、初期化判定部１７０は、これらの機能を実現する回路デバイスのようなハードウェアで構成することもできるし、ＣＰＵやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
鍵保持部１４１、初期ベクトル記憶部１６０は、フラッシュＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）のような記憶装置で構成することができる。これらを一体的に構成することもできる。
【００２１】
以上、本実施の形態１に係る暗号化装置１００の構成について説明した。
次に、暗号化装置１００の暗号化動作について説明する。
【００２２】
図１の構成の下では、プログラムコードの命令Ｉjは、下記（式１）により暗号命令Ｃjに暗号化される。
【数１】
2009169489.tif 000003
【００２３】
上記（式１）は、命令Ｉjの暗号化に際し、先の命令の暗号化結果であるＣj-1が用いられることを示している。即ち、暗号化部１４２は、上記（式１）を用いた暗号ブロック連鎖を行うものである。
しかし、先に説明したように、プログラムコードを暗号化すると、条件分岐や無条件ジャンプが発生した時点で、暗号の連鎖が途切れてしまう。
【００２４】
例えば、Ｉ1−＞Ｉ2−＞Ｉ3−＞Ｉ4−＞Ｉ5という命令列を暗号化して、Ｃ1−＞Ｃ2−＞Ｃ3−＞Ｃ4−＞Ｃ5という暗号命令列を得たとする。この暗号命令列を復号化して実行するとき、例えば暗号命令Ｃ2の復号を行うためには、Ｃ1が復号化処理部に入力されなければならない。
しかし、もしプログラムがＩ1−＞Ｉ2−＞Ｉ5−＞Ｉ3−＞Ｉ4というように、２番目の命令Ｉ2から５番目の命令Ｉ5へジャンプしている場合、暗号命令Ｃ5の復号を行うためには、Ｃ2が復号化処理部に入力されていなければならないが、Ｃ5の暗号化にはＣ4が用いられているため、正しい復号化を行うことができない。
そこで、本実施の形態１では、暗号化に際し以下のルールを設け、暗号化前にプログラムコードの変換を行う。
【００２５】
＜暗号化ルール＞
（１）プログラムコードの暗号化を行う前に、条件分岐命令または無条件ジャンプ命令のジャンプ先となる可能性のある命令（命令ｓと呼ぶ）の直前に、命令ｓへジャンプするジャンプ命令を、あらかじめ追加挿入しておく。
（２）既にジャンプ先の直前に無条件ジャンプ命令がある場合には、同様にジャンプ命令を挿入してもよいし、挿入を省略してもよい。
【００２６】
次に、図１の構成の下で上記暗号化ルールがどのように実現されるかを説明する。上記ルールにより暗号ブロック連鎖が可能となる理由については、後述の復号化処理の説明の際に、併せて説明する。
【００２７】
図３は、上記暗号化ルールに基づく変換を行う前のプログラムコードとその実行イメージを示すものである。ここでは読み易さの観点から、アセンブラコードを例にした。
図３（ａ）は変換前のアセンブラコードで、命令Ｉ1〜Ｉ9を有する。
命令Ｉ3では、条件分岐命令「ｊｎｅ：ｊｕｍｐ  ｉｆ  ｎｏｔ  ｅｑｕａｌ」が実行される。また、命令Ｉ5では、無条件ジャンプ命令「ｊｍｐ：ｊｕｍｐ」が実行される。
図３（ａ）のプログラムコードにおいて、ジャンプ先の候補となるのは、命令Ｉ3で条件を満たしたときのジャンプ先である命令Ｉ6と、命令Ｉ5の無条件ジャンプ先である命令Ｉ8である。
【００２８】
ジャンプ先アドレス収集部１１０は、オリジナルコードメモリ１００より図３（ａ）のプログラムコードを読み取り、上述のジャンプ先となる命令の位置を取得する。
また、ジャンプ命令収集部１２０は、オリジナルコードメモリ１００より図３（ａ）のプログラムコードを読み取り、条件分岐命令や無条件ジャンプ命令の位置を取得する。
【００２９】
図４は、ジャンプ命令挿入後のプログラムコードとその暗号化結果を示すものである。
図４（ａ）はジャンプ命令挿入後のプログラムコード、図４（ｂ）はその暗号化後のプログラムコードを示す。以下、各図の内容について、図１の構成と関連付けながら説明する。
【００３０】
ジャンプ命令挿入部１３０は、条件分岐命令や無条件ジャンプ命令のジャンプ先の候補となる命令の直前（１命令前）に、直下の命令へジャンプする無条件ジャンプ命令を新たに挿入する。
図４（ａ）の例では、ジャンプ先の候補となるのは命令Ｉ6と命令Ｉ8であるので、これらの直前に、直下の命令へジャンプする無条件ジャンプ命令を挿入することになる。
ただし、命令Ｉ6の直前には既に無条件ジャンプ命令Ｉ5が存在しているので、挿入は省略してよい。ここでは、命令Ｉ8の直前にのみ、無条件ジャンプ命令Ｘ1を挿入する。
【００３１】
次に、図４（ｂ）を参照しながら、図４（ａ）のプログラムコードを暗号化する処理の過程を、図１の構成と関連付けてステップを追って説明する。
【００３２】
（１）遅延部１５０の初期化
遅延部１５０の第２レジスタ１５３には、初期値として、初期ベクトルＩＶを格納しておく。
（２）暗号化処理の開始
ジャンプ命令挿入部１３０は、図４（ａ）で説明したジャンプ命令挿入後のプログラムコードを、変換コードメモリ４００に格納する。以後、変換コードメモリ４００より図４（ａ）のプログラムコードが１命令ずつ取り出され、暗号化が行われる。
【００３３】
（３）１番目の命令の暗号化
初期化判定部１７０は、変換コードメモリ４００より命令Ｉ1を取得する。命令Ｉ1は１番目の命令であるため、初期化判定部１７０はＩＶ上書き信号を出力する。
遅延部１５０のマルチプレクサ１５２にＩＶ上書き信号が入力されると、マルチプレクサ１５２の切替部は初期ベクトル記憶部１６０の側に倒れ、初期ベクトルＩＶが入力される。次に、第２レジスタ１５３に格納してあった初期ベクトルＩＶが、排他的論理和演算器１４３に出力される。
排他的論理和演算器１４３は、変換コードメモリ４００より命令Ｉ1を取得し、また遅延部１５０より初期ベクトルＩＶを取得して、これらの排他的論理和を求め、暗号化部１４２に出力する。
暗号化部１４２は、排他的論理和演算器１４３の出力を、暗号化鍵Ｋを用いて暗号化し、暗号命令Ｃ1を出力する。これは、図４（ｂ）の１行目の演算に相当する。
暗号命令Ｃ1は、命令メモリ５００に格納されるとともに、遅延部１５０の第１レジスタ１５１に格納される。
【００３４】
（４）暗号化処理の継続
以後、図示しないプログラムカウンタが１つずつインクリメントされ、ステップ（３）と同様の手順により、命令Ｉ2以降の暗号化が行われる。
なお、初期化判定部１７０は、入力される命令が条件分岐命令または無条件ジャンプ命令であるときは、ＩＶ上書き信号を出力する。例えば、命令Ｉ３の暗号化を行う際には、同命令が条件分岐命令であるため、Ｉ3暗号化後、ＩＶ上書き信号を出力する。
ＩＶ上書き信号の出力により、第２レジスタ１５３には初期ベクトルＩＶが格納されるので、次の命令Ｉ4の暗号化を行う際には、初期ベクトルＩＶが用いられることになる。
【００３５】
（５）条件分岐命令または無条件ジャンプ命令の次の命令の暗号化
次に、本実施の形態１の暗号化処理の特徴である、ジャンプ命令の次の命令を暗号化する際の処理について説明する。ここでは、命令Ｉ4の暗号化を例に取り説明する。
排他的論理和演算器１４３に命令Ｉ4が入力される前の時点では、遅延部１５０の第１レジスタ１５１には命令Ｃ3が格納されている。
排他的論理和演算器１４３は、命令Ｉ4を変換コードメモリ４００より取得し、また第２レジスタ１５３に格納されている初期ベクトルＩＶを取得して、これらの排他的論理和を求め、暗号化部１４２に出力する。
暗号化部１４２は、排他的論理和演算器１４３の出力を、暗号化鍵Ｋを用いて暗号化し、暗号命令Ｃ4を出力する。これは、図４（ｂ）の４行目の演算に相当する。
暗号命令Ｃ4は、命令メモリ５００に格納されるとともに、遅延部１５０の第１レジスタ１５１に格納される。
次の命令Ｉ5を暗号化する際には、暗号命令Ｃ4が用いられる。これは、図４（ｂ）の５行目の演算に相当する。
【００３６】
（６）挿入したジャンプ命令とその次の命令の暗号化
図４（ａ）で新たに挿入した無条件ジャンプ命令Ｘ1は、直前の暗号命令Ｃ7を用いて暗号化されることになる。
次の命令Ｉ8を暗号化する際には、直前に暗号化対象であった命令が、無条件ジャンプ命令Ｘ1であるため、ステップ（５）と同様に、初期ベクトルＩＶを用いて暗号化されることになる。これは、図４（ｂ）の９行目の演算に相当する。
【００３７】
このように、本実施の形態１に係る暗号化装置１００では、条件分岐命令や無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令を挿入しておく。
そして、暗号化する命令の直前の命令が条件分岐命令や無条件ジャンプ命令であったときは、その暗号化に際し、直前の命令を用いることに代えて、初期ベクトルＩＶが用いられる。
したがって、条件分岐命令や無条件ジャンプ命令がどの命令にジャンプするのか一意に定まらない場合であっても、ジャンプ先の命令は初期ベクトルＩＶを用いて暗号化されることが常に確定しているので、暗号ブロックの連鎖が途切れることはない。
【００３８】
以上、暗号化装置１００の暗号化動作について説明した。
次に、暗号化装置１００が暗号化したプログラムコードの復号化について説明する。
【００３９】
図５は、本実施の形態１に係る復号化装置２００の機能ブロック図である。
復号化装置２００は、鍵保持部２４１、復号化部２４２、排他的論理和演算器２４３、遅延部２５０、初期ベクトル記憶部２６０、初期化判定部２７０を備える。
また、図５では、復号化装置２００の周辺構成として、命令メモリ５００、ＣＰＵ６００を併せて記載した。
【００４０】
鍵保持部２４１は、復号化鍵を保持する。
復号化部２４２は、鍵保持部２４１が保持している復号化鍵を用いて復号化を行う。
排他的論理和演算器２４３は、復号化部２４２と遅延部２５０より入力値を受け取り、その排他的論理和を、初期化判定部２７０とＣＰＵ６００に出力する。
遅延部２５０、初期ベクトル記憶部２６０、初期化判定部２７０の機能は、暗号化装置１００が備える同名の各部と概ね同様であるため、これらの説明は、後述の復号化処理の説明で併せて行う。
なお、遅延部２５０は、図２の構成と同様に、第１レジスタ２５１、マルチプレクサ２５２、第２レジスタ２５３を備えているものとする。
ＣＰＵ６００は、復号化されたプログラムコードを実行する。
【００４１】
本実施の形態１における「連鎖復号化部」は、復号化部２４２、遅延部２５０がこれに相当する。
【００４２】
復号化部２４２、排他的論理和演算器２４３、遅延部２５０、初期化判定部２７０は、これらの機能を実現する回路デバイスのようなハードウェアで構成することもできるし、ＣＰＵやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
鍵保持部２４１、初期ベクトル記憶部２６０は、フラッシュＲＯＭのような記憶装置で構成することができる。これらを一体的に構成することもできる。
【００４３】
図５の構成の下では、プログラムコードの暗号命令Ｃjは、下記（式２）により元の命令Ｉjに復号化される。
【数２】
2009169489.tif 000004
【００４４】
上記（式２）は、暗号命令Ｃjの復号化に際し、先の命令の復号化結果であるＣj-1が用いられることを示している。即ち、復号化部２４２は、上記（式２）を用いて、連鎖的に復号化を行うものである。
しかし、暗号化装置１００が暗号化を行う際に、一部の命令の暗号化に初期ベクトルＩＶが用いられているため、この部分に関しては特別な処理をしなければならない。
【００４５】
図６は、暗号化後のプログラムコードとその復号化結果を示すものである。
図６（ａ）は暗号化後のプログラムコード、図６（ｂ）はその復号化後のプログラムコードを示す。以下、図６（ｂ）を参照しながら、図６（ａ）のプログラムコードを復号化する処理の過程を、図５の構成と関連付けてステップを追って説明する。
【００４６】
（１）遅延部２５０の初期化
遅延部２５０の第２レジスタ２５３には、初期値として、初期ベクトルＩＶを格納しておく。
【００４７】
（２）１番目の命令の復号化
復号化部２４２は、命令メモリ５００より暗号命令Ｃ1を取得し、復号化鍵Ｋを用いて復号化する。復号結果として、命令Ｉ1と初期ベクトルＩＶの排他的論理和が得られ、排他的論理和演算器２４３に出力される。
また、暗号命令Ｃ1は、遅延部２５０にも出力され、第１レジスタ２５１に格納される。
排他的論理和演算器２４３は、復号化部２４２の復号結果を取得し、また、遅延部２５０の第２レジスタ２５３より初期ベクトルＩＶを取得して、これらの排他的論理和を求める。その結果として、初期ベクトルＩＶが相殺され、命令Ｉ1が得られる。
以上の処理は、図６（ｂ）の１行目の演算に相当する。
命令Ｉ1は、初期化判定部２７０とＣＰＵ６００に出力される。
【００４８】
（３）復号化処理の継続
以後、図示しないプログラムカウンタが１つずつインクリメントされ、ステップ（２）と同様の手順により、暗号命令Ｃ2以降の復号化が行われる。
遅延部２５０の機能により、直前に復号化対象であった暗号命令が、１ステップ遅れて排他的論理和演算器２４３に入力され、暗号化時と逆の手順で復号が行われる。
【００４９】
（４）条件分岐命令または無条件ジャンプ命令の復号化
次に、本実施の形態１の復号化処理の特徴である、条件分岐命令または無条件ジャンプ命令を復号化する際の処理について説明する。ここでは、暗号命令Ｃ3の復号化を例に取り説明する。
復号化部２４２〜排他的論理和演算器２４３の処理により、暗号命令Ｃ3が復号化されて命令Ｉ3が得られると、この命令Ｉ3は、初期化判定部２７０に出力される。
初期化判定部２７０は、命令Ｉ3が条件分岐命令であることを検知し、ＩＶ上書き信号を出力する。
遅延部２５０のマルチプレクサ２５２にＩＶ上書き信号が入力されると、マルチプレクサ２５２の切替部は初期ベクトル記憶部２６０の側に倒れ、初期ベクトルＩＶが入力される。これにより、第２レジスタ２５３には初期ベクトルＩＶが格納されるので、次の暗号命令を復号化する際には、初期ベクトルＩＶが用いられることになる。
【００５０】
（５）条件分岐命令または無条件ジャンプ命令の次の命令の復号化
ステップ（４）に続いて、暗号命令Ｃ4を復号化する処理を説明する。
暗号命令Ｃ4は、遅延部２５０と復号化部２４２に入力される。復号化部２４２は、暗号命令Ｃ4の復号化を行う。
排他的論理和演算器２４３は、復号化部２４２より復号結果を取得し、また、遅延部２５０の第２レジスタ２５３より初期ベクトルＩＶを取得して、これらの排他的論理和を求める。その結果として、初期ベクトルＩＶが相殺され、命令Ｉ4が得られる。
以上の処理は、図６（ｂ）の４行目の演算に相当する。
次の命令を復号化する際には、暗号命令Ｃ4が用いられる。
【００５１】
（６）挿入したジャンプ命令とその次の命令の復号化
図４（ａ）で新たに挿入した無条件ジャンプ命令Ｘ1の暗号命令ＣＸ1は、直前の暗号命令Ｃ7を用いて復号化されることになる。
次の暗号命令Ｃ8を復号化する際には、直前に復号化対象であった命令が、無条件ジャンプ命令Ｘ1の暗号命令ＣＸ1であるため、ステップ（５）と同様に、初期ベクトルＩＶを用いて復号化されることになる。これは、図６（ｂ）の９行目の演算に相当する。
【００５２】
このように、本実施の形態１に係る復号化装置２００は、復号の結果得られた命令を初期化判定部２７０に出力し、初期化判定部２７０は、その命令が条件分岐命令または無条件ジャンプ命令であるときは、ＩＶ上書き信号を出力する。
これにより、次の命令の復号化は、初期ベクトルＩＶを用いて行われることになる。
したがって、ジャンプ先となる命令を暗号化する際に、初期ベクトルＩＶを用いて暗号化を行ったことに対応して、条件分岐命令または無条件ジャンプ命令の次の命令は、必ず初期ベクトルＩＶを用いて復号化されることになる。
【００５３】
即ち、本実施の形態１に係る暗号化装置１００と復号化装置２００は、暗号ブロック連鎖を行いながらも、連鎖が途切れる可能性のある命令に関しては例外を設けることで、連鎖が途切れないように配慮しているのである。
これにより、プログラムコードのように、復号化の順序が一意に定まらない暗号化対象であっても、暗号ブロック連鎖を行って暗号強度を高めることができる。
【００５４】
本実施の形態１において、「暗号化」と呼ぶとき、暗号化部１４２が行う狭義の暗号化と、排他的論理和演算まで含めた広義の暗号化とがある。以上の説明では、特に両者を明示的に区別せずに用いているが、暗号化を行う主体をもって区別している。
例えば、暗号化部１４２が行う暗号化処理は狭義の暗号化を指し、排他的論理和演算まで含めた最終的な暗号結果を指すときは、広義の暗号化を指している。
復号化に関しても、同様に狭義の復号化と広義の復号化があるが、両者はその実行主体によって区別される。
以後の実施の形態においても同様である。
【００５５】
以上のように、本実施の形態１によれば、暗号化装置１００は、暗号化に先立ち、ジャンプ先となる可能性のある命令の直前に、そのジャンプ先命令へジャンプする無条件ジャンプ命令を追加挿入しておき、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際には、初期ベクトルＩＶを用いる。
これにより、条件分岐命令または無条件ジャンプ命令と、その次の命令との暗号化が、一定の暗号ルールに準じて行われることが確定するため、暗号ブロック連鎖を行っても、復号化に際して連鎖が途切れることはない。
したがって、従来は困難であった、ｏｎ  ｔｈｅ  ｆｌｙ暗号における暗号ブロック連鎖が、一定の暗号ルールの下で可能となるのである。
【００５６】
実施の形態２．
実施の形態１では、条件分岐命令や無条件ジャンプ命令を含むプログラムコードに対して、一定のルールの下で暗号ブロック連鎖を行う手法を説明した。
本発明の実施の形態２では、実施の形態１で説明した手法に加え、攻撃者が暗号化された状態のプログラムコードを特定し難くする手法について説明する。
【００５７】
まず、実施の形態１の手法を用いた場合、攻撃者が暗号化された状態のプログラムコードを特定するために、どの程度の工数を要するかを検討する。
【００５８】
実施の形態１の手法では、初期ベクトルＩＶを用いて暗号化を行った場合、元の命令Ｉと暗号命令Ｃは、１対１の対応関係を有することになる。初期ベクトルＩＶを用いた暗号化は固定的であるため、暗号ブロック連鎖は行われていないからである。
したがって、この暗号命令Ｃと、Ｃから続くジャンプ命令Ｉjmpの暗号命令Ｃjmpとのセットが攻撃者に分かってしまうと、攻撃者はＣとＣjmpのセットを繰り返すことで、暗号文の状態で任意のプログラムを作成することができてしまう。
【００５９】
次に、上記の攻撃手法に要する工数を検討する。
初期ベクトルＩＶが用いられていることが分かるという条件の下で、攻撃者が初期ベクトルＩＶを用いたＭ個の暗号命令｛Ｃ1，Ｃ2，・・・ＣM｝と、それに対応する平文命令Ｉを、例えばＫｕｈｎと同じ手法で調べることができるとする。
このＭ組の暗号命令と平文命令のペアを求める工数（＝Ｔ1）と、各ペアの暗号命令Ｃjを用いて暗号化されたジャンプ命令Ｃjmp,jを探す工数（＝Ｔ2）の和（Ｔ1＋Ｔ2）が、求める工数となる。
ただしＭはオペコードの数ではなく、オペコードとパラメータの組合せでなる命令数である。言い換えると、同じオペコードでもパラメータが異なると、異なる命令とみなすことにする。
【００６０】
（１）Ｔ1の算出
適当なビット列をＣＰＵに入力し、ＣＰＵの挙動から、そのビット列が平文命令Ｉjの（初期ベクトルＩＶを用いた）暗号命令Ｃjであることを確認するために要する時間をτとする。
最初の命令は初期ベクトルＩＶを用いた暗号命令であるので、先に述べた操作を、ＣＰＵリセットを行いながら繰り返すことで、ＩjとＣjの組を特定していく。ピンポイントで探し出すことは不可能なので、全てのビット列を入力してＩjとＣjの組を特定することにする。
この場合、Ｔ1は下記（式３）で求められる。
【数３】
2009169489.tif 000005
【００６１】
非特許文献１によれば、ある暗号命令を入力して、ＣＰＵの挙動から実行された命令を特定するのに要する時間は、１／３００秒とされる。これが上述のτに相当する。
命令長ｂ＝３２ビットである場合、Ｔ1＝２32×１／３００≒５．５ヶ月の時間をかければ、必ず全ての命令を特定できることが分かる。
【００６２】
（２）Ｔ2の算出
Ｍ個の命令それぞれに対して、そこから続く暗号ジャンプ命令を探す工数がＴ2である。
ただし、１つの命令に続くジャンプ命令は、全ての命令メモリのアドレスにジャンプできるようにしたいので（ピンポイントでジャンプ先を絞れないため）、ジャンプ先アドレスの数（＝Ｓとする）だけ存在する。
この場合、Ｔ2は下記（式４）で求められる。
【数４】
2009169489.tif 000006
【００６３】
Ｓは命令メモリのアドレス空間であり、Ｓ＝２bとしてみると、Ｔ1＋Ｔ2＝２bτ（１＋Ｍ）となる。
さらに、Ｍについて基本命令数２０とし、パラメータのバリエーションを含めてＭ＝１２７と仮定し、さらにτ＝１／３００とした場合、Ｔ1＋Ｔ2＝２b+7τと表すことができる。ｂ＝３２である場合、Ｔ1＋Ｔ2≒２年となる。
【００６４】
ただし、８ビットマイコンに関して上記計算方法を適用すると、ｂ＝８であるから、Ｔ1＋Ｔ2≒２分となる。これは十分現実的な時間オーダーであり、攻撃者が暗号化された状態の命令を特定できる可能性が十分に考えられると言える。
【００６５】
そこで、本実施の形態２では、上記の課題を解決するために、ジャンプ命令を複数の命令で構成することにし、暗号命令の解読を困難にすることを図る。以下、本実施の形態２に係る暗号化・復号化の手法を説明する。
【００６６】
図７は、本実施の形態２に係る暗号化装置１００の機能ブロック図である。
本実施の形態２に係る暗号化装置１００は、実施の形態１の図１で説明した構成に加えて、新たにジャンプ命令分割部１８０を備える。その他の構成は図１と概ね同様であるため、同じ符号を付し、差異点のみを説明する。
【００６７】
ジャンプ命令挿入部１３０は、ジャンプ命令挿入後のプログラムコードを、ジャンプ命令分割部１８０に出力する。
ジャンプ命令分割部１８０は、ジャンプ命令挿入部１３０が新たに追加挿入したジャンプ命令を、複数の命令に分割する。詳細は、後述の図８で説明する。
【００６８】
ジャンプ命令分割部１８０は、その機能を実現する回路デバイスのようなハードウェアで構成することもできるし、ＣＰＵやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
【００６９】
次に、本実施の形態２における暗号化のルールについて説明する。
本実施の形態２では、暗号化に際し実施の形態１で説明したルールに加えて以下のルールを新たに設け、暗号化前にプログラムコードの変換を行う。
【００７０】
＜暗号化ルール＞
（３）条件分岐命令または無条件ジャンプ命令は、複数の命令に分割する。分割手法は任意のものでよいが、ジャンプ先や分岐条件などのパラメータを含め、分割前の命令に必ず復元できるような、可逆的な分割手法を用いるものとする。
【００７１】
本実施の形態２では、分割手法の１例として、２つのダミー命令を追加する手法を用いるものとし、以下の説明を行う。
条件分岐命令または無条件ジャンプ命令は、２つのダミー命令（ＯＰコードはＮＯＰ）と、分割前の条件分岐命令または無条件ジャンプ命令と、の３命令に分割される。
ここでいう条件分岐命令または無条件ジャンプ命令には、ジャンプ命令挿入部１３０が新たに追加挿入したジャンプ命令も含まれる。
【００７２】
図８は、上記暗号化ルールに基づく変換前のプログラムコードとその実行イメージを示すものである。実施の形態１で説明した図３と同様に、アセンブラコードを例にした。
図８（ａ）は分割前のアセンブラコードで、命令Ｉ1〜Ｉ9に加え、ジャンプ命令挿入部１３０が新たに挿入した無条件ジャンプ命令Ｘ1を有する。
図８（ｂ）は分割後のアセンブラコードで、ジャンプ命令分割部１８０により、条件分岐命令Ｉ3、無条件ジャンプ命令Ｉ5およびＸ1が、それぞれ元のジャンプ命令を含む３つの命令に分割されている。
【００７３】
図９は、ジャンプ命令分割後のプログラムコードとその暗号化結果を示すものである。
図９（ａ）はジャンプ命令分割後のプログラムコード、図９（ｂ）はその暗号化後のプログラムコードを示す。
本実施の形態２に係る暗号化装置１００の暗号化動作は、ジャンプ命令が複数の命令に分割されている点を除いて、実施の形態１で説明したものと同様であるため、説明を省略する。
【００７４】
以上、暗号化装置１００の暗号化動作について説明した。
次に、暗号化装置１００が暗号化したプログラムコードの復号化について説明する。
【００７５】
図１０は、本実施の形態２に係る復号化装置２００の機能ブロック図である。
図１０の構成は、実施の形態１の図５で説明した構成と類似しているが、図５では排他的論理和演算器２４３の出力が初期化判定部２７０とＣＰＵ６００に出力されているのに対し、図１０の構成では、初期化判定部２７０にのみ出力されている点が異なる。
排他的論理和演算器２４３の出力をＣＰＵ６００に出力すべきか否かは、初期化判定部２７０が判定する。判定手法については、後述の図１１で説明する。
その他の構成は図５と同様であるため、説明を省略する。
【００７６】
図１１は、初期化判定部２７０の機能ブロック図である。
初期化判定部２７０は、判定部２７１、ハッシュ値記憶部２７２、第１記憶スロット２７３、第２記憶スロット２７４、ハッシュ関数処理部２７５、初期化実行部２７６を備える。
【００７７】
判定部２７１は、排他的論理和演算器２４３から平文命令を受け取り、これがジャンプ命令であるか否かを判定する。ジャンプ命令でなければそのままＣＰＵ６００と第１記憶スロット２７３に出力し、ジャンプ命令であれば後述の判定を行う。
ハッシュ値記憶部２７２は、暗号化装置１００のジャンプ命令分割部１８０が追加する２つのダミー命令の連結ハッシュ値を保持している。このハッシュ値は、暗号化装置１００と復号化装置２００の間で共通にしておく。
【００７８】
第１記憶スロット２７３と第２記憶スロット２７４は、１命令分の記憶領域を備えており、判定部２７１より出力される命令を、この順番に１命令ずつ記憶する。第１記憶スロット２７３に新たな命令が出力されると、先に第１記憶スロット２７３に格納されていた命令は第２記憶スロット２７４にコピーされる。
ハッシュ関数処理部２７５は、第１記憶スロット２７３と第２記憶スロット２７４に格納されている命令の連結ハッシュ値を計算し、判定部２７１に出力する。
初期化実行部２７６は、判定部２７１の指示に基づき、遅延部２５０へＩＶ上書き信号を出力する。
【００７９】
本実施の形態２における「順序判定部」は、初期化判定部２７０がこれに相当する。
【００８０】
次に、初期化判定部２７０の動作について説明する。
【００８１】
（１）判定部２７１は、排他的論理和演算器２４３から復号化済みの平文命令を受け取って、その命令が条件分岐命令または無条件ジャンプ命令であるか否かを判定する。条件分岐命令または無条件ジャンプ命令でなければ、その命令をそのままＣＰＵ６００へ出力するとともに、第１記憶スロット２７３に格納する。
【００８２】
（２）排他的論理和演算器２４３から受け取った命令が条件分岐命令または無条件ジャンプ命令である場合は、以下のような判定を行う。
【００８３】
（２．１）暗号化装置１００が暗号化処理を行う際に、図８で説明した手順に従って、条件分岐命令または無条件ジャンプ命令の前には２つのダミー命令が追加されているから、この時点で第１記憶スロット２７３と第２記憶スロット２７４には、ともにダミー命令が格納されているはずである。
【００８４】
（２．２）そこで、判定部２７１は、第１記憶スロット２７３と第２記憶スロット２７４に格納されている命令の連結ハッシュ値を、ハッシュ関数処理部２７５より取得し、ハッシュ値記憶部２７２に格納されている値と比較する。
【００８５】
（２．３）両者が一致すれば、その条件分岐命令または無条件ジャンプ命令は、正しい順序で復号されたものであり、攻撃者が介在していない正規の条件分岐命令または無条件ジャンプ命令であると判定できる。両者が一致しない場合は、攻撃者が介在している可能性がある。
【００８６】
（２．４）判定部２７１は、上記ステップ（２．３）で正規の条件分岐命令または無条件ジャンプ命令であると判定したときは、その命令をＣＰＵ６００および第１記憶スロット２７３に出力するとともに、初期化実行部２７６にＩＶ上書き信号を出力するよう指示する。
正規の命令でないと判定したときは、異常報知を行うなど、適宜対処する。例えば、鍵Ｋを消去する、ＣＰＵ６００をロックする、メモリの内容をフラッシュする、などが考えられる。
【００８７】
以上の動作により、本実施の形態２では、条件分岐命令または無条件ジャンプ命令の周辺の暗号化・復号化が、実施の形態１と比較して複雑化され、また攻撃者による不正な暗号文命令の入力を検知する仕組みを備えた。
これにより、実施の形態１では暗号文と元の平文の対応関係が１対１となっていたジャンプ命令周辺の暗号化・復号化に関し、暗号強度を強化し、攻撃者に対する耐性を高め、より安全な暗号化装置１００と復号化装置２００を提供することができる。
【００８８】
本実施の形態２による攻撃者耐性の向上について、以下に検討しておく。
本実施の形態２では、ジャンプ命令を３つの命令に分割した。この状態で、攻撃者が暗号化された状態のプログラムを書くことに関し検討する。
【００８９】
まず、初期ベクトルＩＶを用いた暗号命令Ｃjがどの平文命令に対応するかは既知であるとする。
攻撃者がすべきことは、任意の初期ベクトルＩＶを用いた暗号命令の後に暗号文でジャンプ命令を置くことである。これができれば、ＩＶを用いた暗号命令−＞暗号ジャンプ命令−＞ＩＶを用いた暗号命令−＞・・・と繰り返すことにより、暗号文の状態でプログラムを書くことができる。
そこで、Ｎ個の命令文のそれぞれにつながる暗号ジャンプ命令を特定する工数を検討する。
【００９０】
（１）Ｔ1の算出
Ｔ1は実施の形態１と変わらないので、上述の（式３）で求められる。
【００９１】
（２）Ｔ2の算出
Ｔ2については、１つ目と２つ目のダミーコードが正解していることが必要で、さらに３つ目のコードが任意のアドレスにジャンプするジャンプ命令となる暗号文を探さなければならない。
ただし、１つ目のダミー命令の直前の暗号命令の値に依存して１つ目のダミーコードが変化し、その暗号ダミーコードに依存して２つ目のダミーコードが変化し、さらに２つ目の暗号ダミーコードに依存してジャンプ命令が変化し、さらにジャンプ先を２b通り探さなければならない。
【００９２】
一見、Ｍ個の暗号命令に続く１つ目のダミーコードを探してダミーコードを特定した上で、２つ目のダミーコードを探して特定して、・・・とすれば上手くいくようにも思えるが、そもそもＣＰＵの挙動から暗号命令に対する平文命令を特定しようとしているので、ダミーコードも無意味なビット列も判別がつかない。
したがって、ある命令から続くジャンプ命令の探索空間は２b×２b×Ｓとなり、Ｔ2は下記（式５）で求められる。
【数５】
2009169489.tif 000007
【００９３】
以上より、Ｔ1＋Ｔ2を求めると、下記（式６）となる。
【数６】
2009169489.tif 000008
さらに、ジャンプ命令の分割数をκとすると、下記（式７）となる。
【数７】
2009169489.tif 000009
【００９４】
仮に、ｂ＝８、τ＝１／３００、Ｍ＝１２７、Ｓ＝２8とし、κ＝３のときは、Ｔ1＋Ｔ2はおよそ２．７ヶ月となる。κ＝４ではおよそ５８年、κ＝５ではおよそ１５０００年、κ＝７ではおよそ１０億年となる。
このように、本実施の形態２では、ジャンプ命令を複数に分割することにより、攻撃者が暗号命令を特定することを困難にすることが可能となり、暗号強度が増すのである。
【００９５】
実施の形態３．
実施の形態２では、条件分岐命令や無条件ジャンプ命令を複数の命令に分割することにより、暗号命令の特定を困難にし、暗号強度を高める手法を説明した。
本発明の実施の形態３では、条件分岐命令や無条件ジャンプ命令の分割手法に関し、実施の形態２と異なる例を説明する。
【００９６】
まず、暗号化装置１００の動作について説明する。
本実施の形態３に係る暗号化装置１００の構成は、実施の形態２の図７で説明したものと同様であるが、ジャンプ命令分割部１８０の分割動作が異なる。分割動作は次の図１２で説明する。
【００９７】
図１２は、ジャンプ命令分割部１８０が生成する分割命令の構成図である。
ジャンプ命令分割部１８０は、以下のルールに従って、条件分岐命令または無条件ジャンプ命令を、複数の命令に分割する。
【００９８】
（１）命令の分割数は３とする。
（２）第１の分割命令の１番目の領域はＯＰコード部、２番目の領域は任意のビット列、３番目の領域は２番目の領域の鍵付ハッシュ値で構成する。鍵はあらかじめジャンプ命令分割部１８０内に保持しておく。ＯＰコード部は、あらかじめ定められたビット列であるとする。
（３）第２の分割命令も、第１の分割命令と同様に構成する。
（４）第３の分割命令は、分割前のジャンプ命令とする。
【００９９】
本実施の形態３に係る暗号化装置１００の暗号化動作は、ジャンプ命令の分割に係る図１２の動作を除いて、実施の形態２で説明したものと同様であるため、説明を省略する。
【０１００】
以上、暗号化装置１００の暗号化動作について説明した。
次に、暗号化装置１００が暗号化したプログラムコードの復号化について説明する。
【０１０１】
図１３は、本実施の形態３に係る復号化装置２００が備える初期化判定部２７０の機能ブロック図である。
本実施の形態３に係る復号化装置２００の構成は、初期化判定部２７０を除いて実施の形態２の図１０で説明したものと同様であるため、以下では初期化判定部２７０の構成のみを説明する。
【０１０２】
初期化判定部２７０は、初期化実行部２７６、状態デコード部２７７、オートマトン部２７８を備える。
初期化実行部２７６は、状態デコード部２７７の指示に基づき、遅延部２５０へＩＶ上書き信号を出力する。
状態デコード部２７７は、排他的論理和演算器２４３から平文命令を受け取り、オートマトン部２７８に投入する。また、オートマトン部２７８の状態を取得し、その内容に基づき、ＣＰＵ６００への出力や初期化実行部２７６への指示を行う。詳細は後述する。
オートマトン部２７８は、以下に説明する状態Ｓ0〜ＳEMGを備える状態遷移器であり、状態デコード部２７７から受け取る平文命令に基づき、状態遷移を行う。
【０１０３】
（状態Ｓ0）
オートマトン部２７８の初期状態である。第１の分割命令を受け取ると、状態Ｓ1へ遷移する。条件分岐命令、無条件ジャンプ命令、第２の分割命令、第３の分割命令を受け取ると、状態ＳEMGへ遷移する。
（状態Ｓ1）
第２の分割命令を受け取ると、状態Ｓ2へ遷移する。それ以外の命令を受け取ると、状態ＳEMGへ遷移する。
（状態Ｓ2）
第３の分割命令を受け取ると、状態Ｓ3へ遷移する。それ以外の命令を受け取ると、状態ＳEMGへ遷移する。
（状態Ｓ3）
無条件に状態Ｓ0へ遷移する。
（状態ＳEMG）
分割されたジャンプ命令の順序が異常であることを示す状態である。
【０１０４】
状態デコード部２７７は、排他的論理和演算器２４３から平文命令を受け取る毎に、その平文命令をオートマトン部２７８に渡し、状態遷移を命令する。また、状態遷移の結果をオートマトン部２７８より取得する。次に、オートマトン部２７８より取得した状態に応じて、以下の処理を行う。
【０１０５】
（状態Ｓ0）
排他的論理和演算器２４３から受け取った平文命令をＣＰＵ６００に出力する。
（状態Ｓ1）〜（状態Ｓ2）
ＮＯＰ命令をＣＰＵ６００に出力する。
（状態Ｓ3）
排他的論理和演算器２４３から受け取った条件分岐命令または無条件ジャンプ命令をＣＰＵ６００に出力するとともに、初期化実行部２７６に、ＩＶ上書き信号を出力するよう指示する。
（状態ＳEMG）
異常報知を行うなど、適宜対処する。例えば、鍵Ｋを消去する、ＣＰＵ６００をロックする、メモリの内容をフラッシュする、などが考えられる。
【０１０６】
なお、分割した命令に、分割前の命令のパラメータが分散して埋め込まれているようなときは、状態Ｓ1〜状態Ｓ2で状態デコード部２７７がこれらを抽出しておいてもよい。
【０１０７】
次に、初期化判定部２７０の動作例を、図１２で説明したハッシュ値の照合と併せて説明する。
【０１０８】
（１）オートマトン部２７８は、初期状態では状態Ｓ0にある。
（２）状態デコード部２７７は、第１の分割命令を受け取ると、同命令の認証子と、ランダムビット列から正しい鍵を用いてハッシュ計算した値とを比較し、認証子が正しいか否かを検証する。ハッシュ計算のための鍵は、あらかじめ状態デコード部２７７にて、ジャンプ命令分割部１８０と共通のものを保持しておく。
【０１０９】
（３）状態デコード部２７７が、ステップ（２）の検証に成功し、かつＯＰコードが第１の分割命令のものであることが確認できた場合に限り、オートマトン部２７８は状態Ｓ1に遷移する。これ以外の場合は、状態ＳEMGに遷移する。第２の分割命令についても、同様に処理される。
（４）状態Ｓ3では、状態デコード部２７７が受け取った条件分岐命令または無条件ジャンプ命令は、そのままＣＰＵ６００に出力され、オートマトン部２７８は状態Ｓ0に戻る。
【０１１０】
以上の実施の形態２〜３では、ジャンプ命令の分割数は３としたが、これは１例であり、任意の分割数としてよい。
【０１１１】
以上のように、本実施の形態３によれば、ジャンプ命令挿入部１３０が追加挿入したジャンプ命令は、鍵付ハッシュ値を含む複数の命令に分割されて暗号化され、復号化時は、鍵付ハッシュ値の検証に加え、オートマトン部２７８による状態遷移に基づく検証が行われるので、実施の形態２と同様に暗号化強度を高めることができる。
【０１１２】
また、本実施の形態３によれば、分割した命令をハッシュ計算により検証するので、新たに追加挿入されたダミーコードは、いわばメッセージ認証と同様の手順により検証されることになり、ダミーコードの構成を固定的にする必要がなくなる。
したがって、ダミーコードの構成は可変にすることができるので、攻撃者が暗号命令を特定することがより困難になり、暗号強度を高めることができる。
【０１１３】
また、本実施の形態３によれば、オートマトン部２７８が備える状態遷移器により、分割されたジャンプ命令の検証を行うので、状態遷移器の状態構成を適宜変更することで、単にダミーコードを２つ挿入するのみの分割だけでなく、任意の分割手法に対応することができ、分割命令の構成を柔軟に可変することができる。
これにより、攻撃者が暗号命令を特定することをさらに困難にし、暗号強度を高めることができる。
なお、本実施の形態３では、説明の簡易の観点から、実施の形態２と同様にダミーコードを２つ挿入した例を採用したことを付言しておく。
【０１１４】
実施の形態４．
本発明の実施の形態４では、復号モジュールを並列化することで、復号処理のスループットを高める構成について説明する。暗号化の手法は、実施の形態１〜３のいずれかで説明したものと同様であるため、説明を省略する。
【０１１５】
図１４は、本実施の形態４に係る復号化装置２００の機能ブロック図である。
図１４において、復号化部２４４は、１６個の復号器Ｄを並列に接続し、１６個の命令Ｉjを並行的に復号できるように構成されている。各段の復号器の復号結果は、前段の復号器の復号結果との排他的論理和がとられ、最終的な復号結果Ｑjとして出力される。
ただし、１段目の復号器に関しては、遅延部２５０より初期ベクトルＩＶが出力され、これとの排他的論理和がとられる。
図１４のように、１６個の命令を並行的に復号すると、復号処理のパフォーマンスが向上する。
【０１１６】
一方で、条件分岐命令や無条件ジャンプ命令のジャンプ先に関しては、暗号化の際に、初期ベクトルＩＶとの排他的論理和をとった上で暗号化されているため、復号化後は初期ベクトルＩＶとの排他的論理和をとらなければならないところ、図１４の構成では、常に前段の復号結果が排他的論理和に用いられるので、正しい復号結果が得られない。
そこで、図１４の構成では、さらに初期化補正部２８０を設け、復号結果を補正して整合性を保っている。
以下、初期化補正部２８０による補正処理に関して説明する。
【０１１７】
初期化補正部２８０は、その機能を実現する回路デバイスのようなハードウェアで構成することもできるし、ＣＰＵやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
【０１１８】
図１５は、初期化補正部２８０の機能ブロック図である。以下、図１５を用いて初期化補正部２８０の動作を説明する。
まず、命令メモリ５００より１６個の暗号命令｛Ｃi，Ｃi+1，・・・，Ｃi+15｝が読み出され、復号化部２４４に入力されて、並行的に復号化される。この時点では、１段前の暗号命令が、排他的論理和の演算に用いられるため、正しく復号化されない。
【０１１９】
例えば、暗号命令Ｃi+10に対応する平文命令Ｉi+10で初めて条件分岐命令「ｊｎｅ」が現れたものとする。この場合、Ｃi+10までは正しく復号化されるが、次のＣi+11では正しい復号化が行われない。
Ｃi+11は、条件分岐命令の次の命令であるため、初期ベクトルＩＶを用いて暗号化されており、したがって復号化時は、復号器Ｄで復号を行った後、初期ベクトルＩＶとの排他的論理和をとらなければならない。
しかるに、図１４の復号化部２４４では、前段の暗号命令Ｃi+10との排他的論理和がとられるように構成されているため、復号結果Ｑi+11は、下記（式８）のようになり、正しく復号されていないことが分かる。
【数８】
2009169489.tif 000010
【０１２０】
そこで、初期化補正部２８０は、条件分岐命令や無条件ジャンプ命令が入力されたことを検出すると、次の段の入力に対し、前段の暗号命令と初期ベクトルＩＶを重畳的に排他的論理和演算するように構成されている。
まず、前段の暗号命令の排他的論理和を重畳することで、復号化部２４４内で加えられた前段の暗号命令の排他的論理和をキャンセルし、さらに初期ベクトルＩＶの排他的論理和を重畳することで、正しい復号結果を得る。
以下、図１５の構成と対比しながら、上述のＣi+11の例を用いて、動作を説明する。
【０１２１】
（１）初期化補正部２８０の１１段目の入力にＱi+10（＝Ｉi+10＝条件分岐命令）が入力されると、図１５中のジャンプ命令判定部がこれを検出し、１２段目のマルチプレクサを、上段側に切り替える。
【０１２２】
（２）１２段目の１つ目の排他的論理和演算器では、前段の暗号命令Ｃi+10を用いて、下記（式９）の演算が行われる。
【数９】
2009169489.tif 000011
【０１２３】
（３）１２段目の２つ目の排他的論理和演算器では、初期ベクトルＩＶを用いて、下記（式１０）の演算が行われ、その結果が１２段目の最終出力となる。
【数１０】
2009169489.tif 000012
【０１２４】
本実施の形態４における「連鎖補正部」は、初期化補正部２８０がこれに相当する。
また、「補正部」は、図１５中のジャンプ命令判定部、マルチプレクサ、排他的論理和演算器がこれに相当する。
また、「復号部」は、復号化部２４４が備える復号器Ｄ、排他的論理和演算器がこれに相当する。
【０１２５】
以上のように、本実施の形態４によれば、復号化部２４４は、１６個の復号器を並列に設け、１６個の命令を平行的に復号化できるので、復号化処理のパフォーマンスが大幅に向上し、併せてＣＰＵ６００が暗号命令を実行するパフォーマンスも向上する。
【０１２６】
また、本実施の形態４では、復号処理を１６個平行して行うことに伴う復号時のずれを初期化補正部２８０で補正しているので、暗号化時に初期ベクトルＩＶを用いる例外的な処理を行っていたとしても、これを自動的に検出して補正することができ、復号化処理のパフォーマンスを自在に向上させることができる。
【０１２７】
実施の形態５．
実施の形態４では、ＣＰＵは非パイプライン動作を前提としている。もしパイプライン動作を行うのであれば、初期化判定はＣＰＵ内でジャンプ命令が実行されたときに行われる必要がある。
この場合の復号化装置２００の機能ブロック図は、図１６のようになる。
【０１２８】
実施の形態６．
図１７は、本発明の実施の形態６に係る暗号化装置１００の機能ブロック図である。
本実施の形態６に係る暗号化装置１００は、実施の形態１の図１で説明したものと概ね同様の構成を備えるが、暗号化手順が実施の形態１と異なっているため、これに伴って各部の接続関係が変更されている。
以下、本実施の形態６における暗号化手順と併せて、暗号化装置１００の構成と動作を説明する。
【０１２９】
暗号化部１４２は、暗号化鍵として、１つ前の暗号化対象であった命令と、鍵保持部１４１が保持している鍵との排他的論理和を用いる。これを暗号化式で表すと、下記（式１１）のようになる。
【数１１】
2009169489.tif 000013
【０１３０】
上記（式１１）の暗号化処理を実現するため、暗号化部１４２は、変換コードメモリ４００と接続されて暗号化対象の命令Ｉjを受け取るとともに、排他的論理和演算器１４３と接続され、上述の暗号化鍵を受け取るように構成されている。
また、排他的論理和演算器１４３には、鍵保持部１４１と遅延部１５０が接続され、１つ前の暗号化対象であった命令と、鍵保持部１４１が保持している鍵とを受け取り、これらの排他的論理和を求めて、最終的に用いる暗号化鍵として暗号化部１４２に出力するように構成されている。
【０１３１】
なお、その他の構成と動作は、実施の形態１で説明したものと同様であるため、説明を省略する。
【０１３２】
図１８は、本実施の形態６におけるジャンプ命令挿入後のプログラムコードとその暗号化結果を示すものである。
実施の形態１の図４で説明したものと暗号化式が異なるが、直前に暗号化対象であった命令を用いて暗号化を行う連鎖的な暗号化処理が行われる点では、実施の形態１と共通している。ジャンプ命令の後の暗号化に初期ベクトルＩＶを用いる点も共通である。
【０１３３】
図１９は、本実施の形態６に係る復号化装置２００の機能ブロック図である。
本実施の形態６に係る復号化装置２００は、実施の形態１の図５で説明したものと概ね同様の構成を備えるが、暗号化手順が実施の形態１と異なることに伴って復号化手順が異なるため、各部の接続関係が変更されている。
以下、本実施の形態６における復号化手順と併せて、復号化装置２００の構成と動作を説明する。
【０１３４】
復号化部２４２は、復号化鍵として、１つ前の復号化対象であった命令と、鍵保持部２４１が保持している鍵との排他的論理和を用いる。これを復号化式で表すと、下記（式１２）のようになる。
【数１２】
2009169489.tif 000014
【０１３５】
上記（式１２）の復号化処理を実現するため、復号化部２４２は、命令メモリ５００と接続されて復号化対象の命令Ｃjを受け取るとともに、排他的論理和演算器２４３と接続され、上述の復号化鍵を受け取るように構成されている。
また、排他的論理和演算器２４３には、鍵保持部２４１と遅延部２５０が接続され、１つ前の復号化対象であった命令と、鍵保持部２４１が保持している鍵とを受け取り、これらの排他的論理和を求めて、最終的に用いる復号化鍵として復号化部２４２に出力するように構成されている。
【０１３６】
なお、その他の構成と動作は、実施の形態１で説明したものと同様であるため、説明を省略する。
【０１３７】
図２０は、本実施の形態６における暗号化後のプログラムコードとその復号化結果を示すものである。
実施の形態１の図６で説明したものと復号化式が異なるが、直前に復号化対象であった命令を用いて復号化を行う連鎖的な復号化処理が行われる点では、実施の形態１と共通している。ジャンプ命令の後の復号化に初期ベクトルＩＶを用いる点も共通である。
【０１３８】
以上のように、本実施の形態６によれば、実施の形態１と同様に連鎖的な暗号化と復号化を行うことができるので、実施の形態１と同様の効果を発揮することができる。
【０１３９】
実施の形態７．
実施の形態６で説明した暗号化と復号化の手順は、実施の形態２〜３のように、ジャンプ命令を分割する構成においても適用可能である。
この場合における暗号化装置１００と復号化装置２００の構成は、実施の形態２〜３と実施の形態６の組み合わせであるため、説明を省略し、ジャンプ命令を分割した後の暗号化手順のみ簡単に説明する。
【０１４０】
図２１は、本実施の形態７におけるジャンプ命令分割後のプログラムコードとその暗号化結果を示すものである。
実施の形態２の図９で説明したものと暗号化式が異なるが、直前に暗号化対象であった命令を用いて暗号化を行う連鎖的な暗号化処理が行われる点では、実施の形態２〜３と共通している。ジャンプ命令の後の暗号化に初期ベクトルＩＶを用いる点も共通である。
【０１４１】
以上のように、本実施の形態７によれば、実施の形態２〜３と同様に分割後のジャンプ命令に対して連鎖的な暗号化と復号化を行うことができるので、実施の形態２と同様の効果を発揮することができる。
【０１４２】
実施の形態８．
実施の形態６で説明したような暗号化手順を採用した場合において、実施の形態４で説明したような並列復号化を実現しようとすると、実施の形態４で説明したものとは異なる補正手順が必要となる。
そこで、本実施の形態８では、実施の形態６の暗号化手順に対応した並列復号化の手順について説明する。
【０１４３】
図２２は、本実施の形態８に係る復号化装置２００の機能ブロック図である。
図２２において、復号化部２４４は、１６個の復号器Ｄを並列に接続し、１６個の命令Ｉjを並行的に復号できるように構成されている。各段の復号器が使用する復号化鍵は、前段の復号器の復号結果と鍵保持部２４１が保持する鍵との排他的論理和が用いられ、最終的な復号結果Ｑjとして出力される。
ただし、１段目の復号器に関しては、遅延部２５０より初期ベクトルＩＶが出力され、これと鍵保持部２４１が保持する鍵との排他的論理和がとられる。
【０１４４】
図２３は、本実施の形態８における初期化補正部２８０の機能ブロック図である。以下、図２３を用いて初期化補正部２８０の動作を説明する。
まず、命令メモリ５００より１６個の暗号命令｛Ｃi，Ｃi+1，・・・，Ｃi+15｝が読み出され、復号化部２４４に入力されて、並行的に復号化される。この時点では、１段前の暗号命令が、復号化鍵を定めるための排他的論理和の演算に用いられるため、正しく復号化されない。
【０１４５】
例えば、暗号命令Ｃi+10に対応する平文命令Ｉi+10で初めて条件分岐命令「ｊｎｅ」が現れたものとする。この場合、Ｃi+10までは正しく復号化されるが、次のＣi+11では正しい復号化が行われない。
Ｃi+11は、条件分岐命令の次の命令であるため、初期ベクトルＩＶを用いて暗号化されており、したがって復号化時は、初期ベクトルＩＶとの排他的論理和をとった復号化鍵を用いて復号器Ｄで復号を行わなければならない。
しかるに、図２２の復号化部２４４では、前段の暗号命令Ｃi+10との排他的論理和がとられるように構成されているため、復号結果Ｑi+11は、下記（式１３）のようになり、初期ベクトルが用いられていないため、正しく復号されていないことが分かる。
【数１３】
2009169489.tif 000015
【０１４６】
そこで、本実施の形態８における初期化補正部２８０は、条件分岐命令や無条件ジャンプ命令が入力されたことを検出すると、次の段の入力に対し、以下の演算を行うように構成されている。
【０１４７】
（１）前段の暗号命令と暗号化鍵Ｋの排他的論理和をとり、その鍵で再暗号化して、いったん復号化前の状態に戻す。
（２）復号化鍵Ｋと初期ベクトルＩＶの排他的論理和をとり、その鍵で復号化を行う。
【０１４８】
以下、図２３の構成と対比しながら、上述のＣi+11の例を用いて、動作を説明する。
【０１４９】
（１）初期化補正部２８０の１１段目の入力にＱi+10（＝Ｉi+10＝条件分岐命令）が入力されると、図２３中のジャンプ命令判定部がこれを検出し、１２段目のマルチプレクサを、上段側に切り替える。
【０１５０】
（２）１２段目の１つ目の暗号器Ｅでは、前段の暗号命令Ｃi+10を用いて、下記（式１４）の演算が行われる。
【数１４】
2009169489.tif 000016
【０１５１】
（３）１２段目の２つ目の排他的論理和演算器では、初期ベクトルＩＶを用いて、下記（式１５）の演算が行われ、その結果が１２段目の最終出力となる。
【数１５】
2009169489.tif 000017
【０１５２】
なお、以上の説明では、暗号化鍵Ｋと復号化鍵Ｋが同じであることを前提としたが、暗号化鍵と復号化鍵が異なる場合には、図２３の鍵Ｋを入力する部分で、暗号化装置１００が用いたものと同じ暗号化鍵を入力するように構成しておく必要がある。
【０１５３】
以上のように、本実施の形態８によれば、実施の形態６で説明したような暗号化手順を採用した場合において、実施の形態４で説明したような並列復号化を行うことができ、復号化のパフォーマンスが向上する。
【０１５４】
実施の形態９．
実施の形態８では、ＣＰＵは非パイプライン動作を前提としている。もしパイプライン動作を行うのであれば、初期化判定はＣＰＵ内でジャンプ命令が実行されたときに行われる必要がある。
この場合の復号化装置２００の機能ブロック図は、図２４のようになる。
【０１５５】
実施の形態１０．
以上の実施の形態１〜９では、非特許文献１で行われているようなアドレスバスのハッシュ化は行っていないが、これを行うように構成してもよい。
この場合、アドレスバスを流れるアドレスをハッシュ関数でハッシュ化し、命令メモリ５００へ暗号命令を格納する位置を、ハッシュ化されたアドレスとしておく。
復号化時は、命令メモリ５００のアドレスを、同じハッシュ関数を用いて特定し、暗号化時と同じ順番で暗号命令を取り出して、復号化を行う。
【０１５６】
実施の形態１１．
以上の実施の形態１〜１０では、暗号化装置１００と復号化装置２００は、別個の装置であるものとして説明したが、両者の構成は共通する部分が多いため、暗号化装置１００と復号化装置２００を一体的に構成してもよい。
例えば、遅延部、初期化判定部、初期化ベクトル記憶部などの機能は、暗号化時と復号化時で同様であるため、これらは共通化することができる。
暗号化部と復号化部は、処理内容が暗号と復号で処理内容が異なるため、別個に設ける必要がある。初期化補正部２８０は、復号時のみに必要となる。
その他の構成に関しても、必要に応じて適宜共通化することもできる。
【０１５７】
実施の形態１２．
以上の実施の形態１〜１１において、暗号化装置１００や復号化装置２００の中を流れるデータのうち、暗号化されていないデータが流れる部分に関しては、直接プローブを当てるなどのタンパリング攻撃を行うことができないよう、耐タンパ領域に物理的に格納するようにしてもよい。
例えば、図１の各機能部のうち、命令メモリ５００以外の領域は、全て耐タンパ領域に格納するようにしてもよい。
このようにすることで、攻撃に対する耐性をさらに高めることができる。
【図面の簡単な説明】
【０１５８】
【図１】実施の形態１に係る暗号化装置１００の機能ブロック図である。
【図２】遅延部１５０の機能ブロック図である。
【図３】暗号化ルールに基づく変換を行う前のプログラムコードとその実行イメージを示すものである。
【図４】ジャンプ命令挿入後のプログラムコードとその暗号化結果である。
【図５】実施の形態１に係る復号化装置２００の機能ブロック図である。
【図６】暗号化後のプログラムコードとその復号化結果を示すものである。
【図７】実施の形態２に係る暗号化装置１００の機能ブロック図である。
【図８】暗号化ルールに基づく変換前のプログラムコードとその実行イメージを示すものである。
【図９】ジャンプ命令分割後のプログラムコードとその暗号化結果である。
【図１０】実施の形態２に係る復号化装置２００の機能ブロック図である。
【図１１】初期化判定部２７０の機能ブロック図である。
【図１２】ジャンプ命令分割部１８０が生成する分割命令の構成図である。
【図１３】実施の形態３に係る復号化装置２００が備える初期化判定部２７０の機能ブロック図である。
【図１４】実施の形態４に係る復号化装置２００の機能ブロック図である。
【図１５】初期化補正部２８０の機能ブロック図である。
【図１６】実施の形態５に係る復号化装置２００の機能ブロック図である。
【図１７】実施の形態６に係る暗号化装置１００の機能ブロック図である。
【図１８】実施の形態６におけるジャンプ命令挿入後のプログラムコードとその暗号化結果を示すものである。
【図１９】実施の形態６に係る復号化装置２００の機能ブロック図である。
【図２０】実施の形態６における暗号化後のプログラムコードとその復号化結果を示すものである。
【図２１】実施の形態７におけるジャンプ命令分割後のプログラムコードとその暗号化結果を示すものである。
【図２２】実施の形態８に係る復号化装置２００の機能ブロック図である。
【図２３】実施の形態８における初期化補正部２８０の機能ブロック図である。
【図２４】実施の形態９に係る復号化装置２００の機能ブロック図である。
【符号の説明】
【０１５９】
１００  暗号化装置、１１０  ジャンプ先アドレス収集部、１２０  ジャンプ命令収集部、１３０  ジャンプ命令挿入部、１４１  鍵保持部、１４２  暗号化部、１４３  排他的論理和演算器、１５０  遅延部、１５１  第１レジスタ、１５２  マルチプレクサ、１５３  第２レジスタ、１６０  初期ベクトル記憶部、１７０  初期化判定部、１８０  ジャンプ命令分割部、２００  復号化装置、２４１  鍵保持部、２４２  復号化部、２４３  排他的論理和演算器、２４４  復号化部、２５０  遅延部、２６０  初期ベクトル記憶部、２７０  初期化判定部、２７１  判定部、２７２  ハッシュ値記憶部、２７３  第１記憶スロット、２７４  第２記憶スロット、２７５  ハッシュ関数処理部、２７６  初期化実行部、２７７  状態デコード部、２７８  オートマトン部、２８０  初期化補正部、３００  オリジナルコードメモリ、４００  変換コードメモリ、５００  命令メモリ、６００  ＣＰＵ、７００  ジャンプ命令復元部。
【図１】
2009169489.tif 000018
【図２】
2009169489.tif 000019
【図３】
2009169489.tif 000020
【図４】
2009169489.tif 000021
【図５】
2009169489.tif 000022
【図６】
2009169489.tif 000023
【図７】
2009169489.tif 000024
【図８】
2009169489.tif 000025
【図９】
2009169489.tif 000026
【図１０】
2009169489.tif 000027
【図１１】
2009169489.tif 000028
【図１２】
2009169489.tif 000029
【図１３】
2009169489.tif 000030
【図１４】
2009169489.tif 000031
【図１５】
2009169489.tif 000032
【図１６】
2009169489.tif 000033
【図１７】
2009169489.tif 000034
【図１８】
2009169489.tif 000035
【図１９】
2009169489.tif 000036
【図２０】
2009169489.tif 000037
【図２１】
2009169489.tif 000038
【図２２】
2009169489.tif 000039
【図２３】
2009169489.tif 000040
【図２４】
2009169489.tif 000041