(57)【要約】【課題】コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法を得る。【解決手段】ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後にレジスタを初期化するステップと、ジャンプ命令挿入ステップで新たなジャンプ命令を挿入したプログラムを、レジスタに格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、暗号化したプログラムをレジスタに格納するステップと、をコンピュータに実行させ、連鎖暗号化ステップでは、レジスタに格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する。【選択図】図１
2009211292.tif 000002
【特許請求の範囲】
【請求項１】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、
入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、
前記プログラムを取得するステップと、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化するステップと、
前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、
前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、
を前記コンピュータに実行させ、
前記連鎖暗号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する
ことを特徴とする暗号化方法。
【請求項２】
請求項１に記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
前記連鎖復号化ステップで復号化した命令が条件分岐命令または無条件ジャンプ命令であった場合に前記記憶手段を初期化するステップと、
を前記コンピュータに実行させ、
前記連鎖復号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化方法。
【請求項３】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、
入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、
前記プログラムを取得するステップと、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先となり得る命令のアドレスを収集するジャンプ先収集ステップと、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令のジャンプ先であった場合その命令を暗号化する前に前記記憶手段を初期化するステップと、
前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、
前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、
を前記コンピュータに実行させ、
前記連鎖暗号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する
ことを特徴とする暗号化方法。
【請求項４】
請求項３に記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
前記連鎖復号化ステップで復号化した命令が、無条件ジャンプ命令であった場合、または条件付ジャンプ命令であって当該条件に合致する場合に、前記記憶手段を初期化するステップと、
を前記コンピュータに実行させ、
前記連鎖復号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化方法。
【請求項５】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを暗号化する装置であって、
入力したビット数だけ格納ビットをシフトする記憶手段と、
前記プログラムを取得する手段と、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入部と、
暗号化対象命令の命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化する初期化部と、
前記ジャンプ命令挿入部が新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化部と、
を備え、
前記連鎖暗号化部は、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化し、
暗号化した前記プログラムを前記記憶手段に格納する
ことを特徴とする暗号化装置。
【請求項６】
請求項１に記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号化部が復号化した命令が条件分岐命令または無条件ジャンプ命令であった場合に前記記憶手段を初期化する初期化部と、
を備え、
前記連鎖復号化部は、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化装置。
【請求項７】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する装置であって、
入力したビット数だけ格納ビットをシフトする記憶手段と、
前記プログラムを取得する手段と、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先となり得る命令のアドレスを収集するジャンプ先収集部と、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令が無い場合には、当該ジャンプ先の直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入部と、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令のジャンプ先であった場合その命令を暗号化する前に前記記憶手段を初期化する初期化部と、
前記ジャンプ命令挿入部が新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化部と、
を備え、
前記連鎖暗号化部は、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化し、
暗号化した前記プログラムを前記記憶手段に格納する
ことを特徴とする暗号化装置。
【請求項８】
請求項３に記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号化部が復号化した命令が、無条件ジャンプ命令であった場合、または条件付ジャンプ命令であって当該条件に合致する場合に、前記記憶手段を初期化する初期化部と、
を備え、
前記連鎖復号化部は、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号化方法および装置、復号化方法および装置に関するものである。
【背景技術】
【０００２】
コンピュータのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）上で実行されるプログラムを解析して不正にその内容を取得する攻撃手法として、ＣＰＵとメモリの間のデータバスに直接プローブを当て、ロジックアナライザを用いてＣＰＵの実行する命令や、レジスタにロードされるデータなどを解析する、タンパリング攻撃というものがある。
また、このタンパリング攻撃に対する対策として、データバス上を暗号化する、ｏｎ  ｔｈｅ  ｆｌｙ暗号という技術がある。また、バス暗号化のための専用プロセッサも開発されている。
【０００３】
ｏｎ  ｔｈｅ  ｆｌｙ暗号では、１命令または１ワードのデータを１ブロックとして独立に暗号化を行う。この場合、暗号ブロックと平文ブロックは１対１に対応付けられ、暗号化強度はさほど高くない。
【０００４】
一方、通常のメッセージ暗号化では、暗号ブロックが次のブロックの暗号化に用いられる暗号ブロック連鎖を行う場合があり、この場合は暗号ブロックと平文ブロックは１対１には対応せず、上述の１対１に対応する場合と比較して、既知平文攻撃や選択暗号文攻撃に対する暗号化強度が高くなる。
【０００５】
上述のｏｎ  ｔｈｅ  ｆｌｙ暗号において、暗号ブロック連鎖が行われないのは、暗号化対象の特性による。
コンピュータプログラムに対するタンパリング攻撃への対策として行われるｏｎ  ｔｈｅ  ｆｌｙ暗号の暗号化対象は、攻撃対象となるコンピュータプログラムである。
コンピュータプログラムは、一般的な平文メッセージと異なり、条件分岐や繰り返し処理などが内在しており、各暗号ブロックの復号順序が一意に定められない。したがって、暗号ブロック連鎖のように暗号化時と復号化時の順序が一意である必要がある手法は、適用することができないのである。
【０００６】
上述の課題に関し、下記非特許文献１では、暗号ブロック連鎖を行うことに代えて、暗号ブロックの保存先であるメモリのアドレスをランダム化したり、そのアドレスを鍵として用いたりすることで、解読を困難にする手法が記載されている。
また、下記非特許文献２では、状態遷移器の遷移状態に基づき命令コードを置換する手法が記載されている。
また、下記非特許文献３では、上述の非特許文献１〜２に記載の技術の他、種々の耐タンパリング化手法について解説されている。
【０００７】
【非特許文献１】Ｍａｒｋｕｓ  Ｇ．Ｋｕｈｎ，”Ｃｉｐｈｅｒ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅａｒｃｈ  Ａｔｔａｃｋ  ｏｎ  ｔｈｅ  ＢＵＳ−Ｅｎｃｒｙｐｔｉｏｎ  Ｓｅｃｕｒｉｔｙ  Ｍｉｃｒｏｃｏｎｔｒｏｌｌｅｒ  ＤＳ５００２ＦＰ”，ＩＥＥＥ  ＴＲＡＮＳＡＣＴＩＯＮＳ  ＯＮ  ＣＯＭＰＵＴＥＲＳ，ＶＯＬ．４７，ＮＯ．１０，ｐｐ．１１５３−１１５７，ＯＣＴＯＢＥＲ  １９９８
【非特許文献２】Ａ．Ｍｏｎｄｅｎ，Ａ．Ｍｏｎｓｉｆｒｏｔ，Ｃ．Ｔｈｏｍｂｏｒｓｏｎ，”Ｔａｍｐｅｒ−Ｒｅｓｉｓｔａｎｔ  Ｓｏｆｔｗａｒｅ  Ｓｙｓｔｅｍ  Ｂａｓｅｄ  ｏｎ  ａ  Ｆｉｎｉｔｅ  Ｓｔａｔｅ  Ｍａｃｈｉｎｅ”，ＩＥＩＣＥ  ＴＲＡＮＳ．ＦＵＮＤＡＭＥＮＴＡＬＳ，ＶＯＬ．Ｅ８８−Ａ，Ｎｏ．１  ｐｐ．１１２−１２２，Ｊａｎｕａｒｙ  ２００５
【非特許文献３】門田暁人，Ｃｌａｒｋ  Ｔｈｏｍｂｏｒｓｏｎ，”ソフトウェアプロテクションの技術動向（後編）−ハードウェアによるソフトウェア耐タンパー化技術”，情報処理，Ｖｏｌ．４６，Ｎｏ．５，ｐｐ．５５８−５６３，２００５．５
【発明の開示】
【発明が解決しようとする課題】
【０００８】
上述の非特許文献１に記載の技術は、Ｋｕｈｎが弱点を発見している。
Ｋｕｈｎは、適当なビット列を暗号化された命令としてＣＰＵに入力し、そのときのＣＰＵの挙動を観察することを繰り返し、暗号文命令と平文命令の対応テーブルを作った。そして、そのテーブルを元に、ＣＰＵからパラレルポートへメモリ上の全データを書き出す暗号化プログラムを得ることができた。
パラレルポートに出力されたデータは暗号化されていないため、平文と暗号文の対応表が作成可能であるということを利用したものである。
【０００９】
上述の弱点の原因は、暗号ブロックと平文が１対１に対応しているため、選択暗号文攻撃によって、所望の動作をする暗号化された状態のプログラムが得られることにある。
これを回避する１つの手法として、暗号ブロック連鎖を行うことが挙げられるが、先に説明したように、コンピュータプログラムを暗号化する際には、暗号ブロック連鎖を行うことができない。
【００１０】
また、上記非特許文献２に記載の技術は、命令コードの置換による暗号という手法であることから、平文空間、暗号文空間はともに高々数十個程度であり、十分な暗号強度が確保し難い。
【００１１】
そのため、コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法および装置、その復号化方法および装置が望まれていた。
【課題を解決するための手段】
【００１２】
本発明にかかる暗号化方法は、演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、前記プログラムを取得するステップと、少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化するステップと、前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、を前記コンピュータに実行させ、前記連鎖暗号化ステップでは、前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化するものである。
【発明の効果】
【００１３】
本発明に係る暗号化方法によれば、暗号化を行う前に、条件分岐命令または無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入しておき、通常の命令はレジスタに格納されている命令を利用して連鎖的に暗号化し、ジャンプ命令に関してはレジスタを所定の初期値で初期化してから暗号化に用いる。
そのため、条件分岐命令や無条件ジャンプ命令が存在する場合でも、これらのジャンプ先命令を暗号化する際には、所定の初期値が用いられていることが分かっているので、復号順序が一意でないことは問題にならない。
したがって、条件分岐命令や無条件ジャンプ命令が存在するコンピュータプログラムの暗号化に際しても、暗号ブロック連鎖を適用することができる。
【発明を実施するための最良の形態】
【００１４】
実施の形態１．
図１は、本発明の実施の形態１に係る暗号化装置１００の機能ブロック図である。
暗号化装置１００は、ジャンプ先アドレス収集部１１０、ジャンプ命令収集部１２０、ジャンプ命令挿入部１３０、鍵保持部１４１、暗号化部１４２、排他的論理和演算器１４３、マルチプレクサ１５１、左シフトレジスタ１５２、初期ベクトル記憶部１６０、初期化判定部１７０を備える。
また、図１では、暗号化装置１００の周辺構成として、オリジナルコードメモリ３００、変換コードメモリ４００、命令メモリ５００を併せて記載した。
【００１５】
ジャンプ先アドレス収集部１１０は、オリジナルコードメモリ３００に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令のジャンプ先アドレスを取得する。
なお、ここでいうプログラムコードとは、ＣＰＵの実行命令形式、または少なくとも実行単位がＣＰＵの実効命令形式と等しい形式に変換されているものをいう。具体的には、マシンコードやアセンブラコードが相当する。以下同様である。
【００１６】
ジャンプ命令収集部１２０は、オリジナルコードメモリ３００に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令が存在する箇所を取得する。
ジャンプ命令挿入部１３０は、後述の図３で説明する手順により、オリジナルコードメモリ３００に格納されているプログラムコードに新たなジャンプ命令を挿入し、変換コードメモリ４００に格納する。ただし、挿入時にジャンプ命令収集部１２０を参照してすでに無条件ジャンプ命令や条件分岐命令が存在していることが分かった場合には挿入をしないとしても良い。
【００１７】
鍵保持部１４１は、暗号化鍵を保持する。
暗号化部１４２は、鍵保持部１４１が保持している暗号化鍵を用いて暗号化を行う。
排他的論理和演算器１４３は、変換コードメモリ４００と暗号化部１４２より入力値を受け取り、その排他的論理和をマルチプレクサ１５１と命令メモリ５００に出力する。
【００１８】
マルチプレクサ１５１は、左シフトレジスタ１５２に出力すべき命令を、暗号化部１４２から受け取るか、それとも初期ベクトル記憶部１６０が格納している初期ベクトルＩＶにするかを切り替える。切り替えは、初期化判定部１７０が出力するＩＶ上書き信号の入力を契機に行われる。
【００１９】
左シフトレジスタ１５２は、６４ビットのサイズを有する左シフトレジスタで構成された記憶装置である。１回のシフトを行うごとに、格納しているビットが８ビット左にシフトし、空いた８ビットの領域に８ビットの命令を右側から入力することができる。
ここでは、左シフトレジスタ１５２の初期値は、８個の８ビット初期ベクトルＩＶ１〜ＩＶ８であるものとする。
【００２０】
初期ベクトル記憶部１６０は、後述の図４で説明する暗号化処理を行うための初期ベクトルＩＶ１〜ＩＶ８を格納している。
初期化判定部１７０は、変換コードメモリ４００よりジャンプ命令挿入後のプログラムコードを取得し、条件分岐命令や無条件ジャンプ命令を検出すると、同命令が暗号化された後に、マルチプレクサ１５１にＩＶ上書き信号を出力する。このときの動作は、後述の図４で説明する。
【００２１】
本実施の形態１における「連鎖暗号化部」は、暗号化部１４２、排他的論理和演算器１４３がこれに相当する。また、「初期値」は、初期ベクトルＩＶ１〜ＩＶ８がこれに相当する。
【００２２】
ジャンプ先アドレス収集部１１０、ジャンプ命令収集部１２０、ジャンプ命令挿入部１３０、暗号化部１４２、排他的論理和演算器１４３、マルチプレクサ１５１、初期化判定部１７０は、これらの機能を実現する回路デバイスのようなハードウェアで構成することもできるし、ＣＰＵやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
鍵保持部１４１、初期ベクトル記憶部１６０は、フラッシュＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）のような記憶装置で構成することができる。これらを一体的に構成することもできる。
【００２３】
以上、本実施の形態１に係る暗号化装置１００の構成について説明した。
次に、暗号化装置１００の暗号化動作について説明する。
【００２４】
図１の構成の下では、プログラムコードの命令Ｉjは、下記（式１）により暗号命令Ｃjに暗号化される。
【数１】
2009211292.tif 000003
【００２５】
また、左シフトレジスタ１５２が格納しているビット列は、下記（式２）で表される。
【数２】
2009211292.tif 000004
【００２６】
上記（式１）〜（式２）は、命令Ｉ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の暗号化を行う際には、同命令が条件分岐命令であるため、Ｉ3暗号化後、ＩＶ上書き信号を出力する。
ＩＶ上書き信号の出力により、左シフトレジスタ１５２には初期ベクトルＩＶ１〜ＩＶ８が格納されるので、次の命令Ｉ4の暗号化を行う際には、初期ベクトルＩＶ１〜ＩＶ８が用いられることになる。
【００３７】
（５）条件分岐命令または無条件ジャンプ命令の次の命令の暗号化
次に、本実施の形態１の暗号化処理の特徴である、ジャンプ命令の次の命令を暗号化する際の処理について説明する。ここでは、命令Ｉ4の暗号化を例に取り説明する。
暗号化部１４２は、左シフトレジスタ１５２に格納されているビット（ＤＲ（４））を取得して鍵保持部１４１が保持している暗号鍵で暗号化し、その上位８ビットを排他的論理和演算器１４３に出力する。
排他的論理和演算器１４３は、暗号化部１４２からの出力と、命令Ｉ4との排他的論理和を求め、これを命令Ｉ4の暗号命令Ｃ4として、マルチプレクサ１５１と命令メモリ５００に出力する。
【００３８】
このように、本実施の形態１に係る暗号化装置１００では、条件分岐命令や無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令を挿入しておく。
そして、暗号化する命令の直前の命令が条件分岐命令や無条件ジャンプ命令であったときは、その暗号化に際し、直前の命令を用いることに代えて、初期ベクトルＩＶ１〜ＩＶ８が用いられる。
したがって、条件分岐命令や無条件ジャンプ命令がどの命令にジャンプするのか一意に定まらない場合であっても、ジャンプ先の命令は初期ベクトルＩＶ１〜ＩＶ８を用いて暗号化されることが常に確定しているので、暗号ブロックの連鎖が途切れることはない。
【００３９】
以上、暗号化装置１００の暗号化動作について説明した。
次に、暗号化装置１００が暗号化したプログラムコードの復号化について説明する。
【００４０】
図５は、本実施の形態１に係る復号化装置２００の機能ブロック図である。
復号化装置２００は、鍵保持部２４１、暗号化部２４２、排他的論理和演算器２４３、マルチプレクサ２５１、左シフトレジスタ２５２、初期ベクトル記憶部２６０、初期化判定部２７０を備える。
また、図５では、復号化装置２００の周辺構成として、命令メモリ５００、ＣＰＵ６００を併せて記載した。
【００４１】
鍵保持部２４１は、暗号化鍵を保持する。
暗号化部２４２は、鍵保持部２４１が保持している暗号化鍵を用いて暗号化を行う。
排他的論理和演算器２４３は、命令メモリ５００より復号化対象命令Ｃjを、暗号化部２４２より左シフトレジスタ２５２の格納ビットの暗号結果上位８ビットを受け取り、両者の排他的論理和を、初期化判定部２７０とＣＰＵ６００に出力する。
マルチプレクサ２５１、左シフトレジスタ２５２、初期ベクトル記憶部２６０、初期化判定部２７０の機能は、暗号化装置１００が備える同名の各部と概ね同様であるため、これらの説明は、後述の復号化処理の説明で併せて行う。
ＣＰＵ６００は、復号化されたプログラムコードを実行する。
【００４２】
本実施の形態１における「連鎖復号化部」は、復号化部２４２、排他的論理和演算器２４３がこれに相当する。
【００４３】
図５の構成の下では、プログラムコードの暗号命令Ｃjは、下記（式３）により元の命令Ｉjに復号化される。
【数３】
2009211292.tif 000005
【００４４】
また、左シフトレジスタ２５２が格納しているビット列は、（式２）と同様である。
【００４５】
復号化装置２００は、暗号化装置１００が行う暗号化処理と同様の手順により、復号化を実施する。以下、復号化装置２００が行う復号化処理について説明する。
【００４６】
図６は、暗号化後のプログラムコードとその復号化処理を示すものである。
図６（ａ）はプログラムコードの復号化処理、図６（ｂ）は各時点における左シフトレジスタ２５２の状態を示す。以下、図６を参照しながら、図６（ａ）のプログラムコードを復号化する処理の過程を、図５の構成と関連付けてステップを追って説明する。
【００４７】
（１）左シフトレジスタ２５２の初期化
左シフトレジスタ２５２には、初期値として、初期ベクトルＩＶ１〜ＩＶ８（合計６４ビット）を格納しておく。
【００４８】
（２）１番目の命令の復号化
暗号化部２４２は、左シフトレジスタ２５２に格納されているビット（ＤＲ（１））を取得して鍵保持部２４１が保持している暗号鍵で暗号化し、その上位８ビットを排他的論理和演算器２４３に出力する。
排他的論理和演算器２４３は、暗号化部２４２からの出力と、暗号命令Ｃ1との排他的論理和を求め、これを復号命令Ｉ1として、初期化判定部２７０とＣＰＵ６００に出力する。
初期化判定部２７０は、排他的論理和演算器２４３が出力した命令Ｉ1を取得する。命令Ｉ1は条件分岐命令や無条件ジャンプ命令ではないため、初期化判定部２７０は何も出力しない。
【００４９】
（３）復号化処理の継続
以後、図示しないプログラムカウンタが１つずつインクリメントされ、ステップ（２）と同様の手順により、暗号命令Ｃ2以降の暗号化が行われる。
なお、初期化判定部２７０は、入力される命令が条件分岐命令または無条件ジャンプ命令であるときは、ＩＶ上書き信号を出力する。例えば、暗号命令Ｃ3を復号化した命令Ｉ3は条件分岐命令であるため、ＩＶ上書き信号を出力する。
ＩＶ上書き信号の出力により、左シフトレジスタ２５２には初期ベクトルＩＶ１〜ＩＶ８が格納されるので、次の暗号命令Ｃ4の復号化を行う際には、初期ベクトルＩＶ１〜ＩＶ８が用いられることになる。
【００５０】
（４）条件分岐命令または無条件ジャンプ命令の次の命令の暗号化
次に、本実施の形態１の復号化処理の特徴である、ジャンプ命令の次の命令を復号化する際の処理について説明する。ここでは、暗号命令Ｃ4の復号化を例に取り説明する。
暗号化部２４２は、左シフトレジスタ２５２に格納されているビット（ＤＲ（４））を取得して鍵保持部２４１が保持している暗号鍵で暗号化し、その上位８ビットを排他的論理和演算器２４３に出力する。
排他的論理和演算器２４３は、暗号化部２４２からの出力と、暗号命令Ｃ4との排他的論理和を求め、これを暗号命令Ｃ4の復号命令Ｉ4として、初期化判定部２７０とＣＰＵ６００に出力する。
【００５１】
このように、本実施の形態１に係る復号化装置２００は、復号の結果得られた命令を初期化判定部２７０に出力し、初期化判定部２７０は、その命令が条件分岐命令または無条件ジャンプ命令であるときは、ＩＶ上書き信号を出力する。
これにより、次の命令の復号化は、初期ベクトルＩＶ１〜ＩＶ８を用いて行われることになる。
したがって、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際に、初期ベクトルＩＶ１〜ＩＶ８を用いて暗号化を行ったことに対応して、条件分岐命令または無条件ジャンプ命令の次の命令は、必ず初期ベクトルＩＶ１〜ＩＶ８を用いて復号化されることになる。
【００５２】
即ち、本実施の形態１に係る暗号化装置１００と復号化装置２００は、暗号ブロック連鎖を行いながらも、連鎖が途切れる可能性のある命令に関しては例外を設けることで、連鎖が途切れないように配慮しているのである。
これにより、プログラムコードのように、復号化の順序が一意に定まらない暗号化対象であっても、暗号ブロック連鎖を行って暗号強度を高めることができる。
【００５３】
本実施の形態１において、「暗号化」と呼ぶとき、暗号化部１４２が行う狭義の暗号化と、排他的論理和演算まで含めた広義の暗号化とがある。以上の説明では、特に両者を明示的に区別せずに用いているが、暗号化を行う主体をもって区別している。
例えば、暗号化部１４２が行う暗号化処理は狭義の暗号化を指し、排他的論理和演算まで含めた最終的な暗号結果を指すときは、広義の暗号化を指している。
復号化について、および以後の実施の形態においても同様である。
【００５４】
本実施の形態１において、暗号化部１４２は、左シフトレジスタ１５２が格納しているビットを暗号化してその上位８ビットを排他的論理和演算器１４３に出力するものとしたが、これは、入力命令のワード長が８ビットであるものと想定したことに対応したものである。
即ち、本実施の形態１において、暗号化部１４２の暗号関数のビット長と、暗号化対象である入力命令のワード長とは、必ずしも一致していなくともよく、したがって入力命令に対して十分長い鍵長を用いることができる。暗号化部２４２についても同様である。
【００５５】
本実施の形態１において、暗号化部１４２は、左シフトレジスタ１５２が格納しているビットの暗号結果上位８ビットを出力するものとしたが、暗号化対象命令のワード長に合わせて適宜ビット数を変えてもよい。
また、暗号関数のビット長も、６４ビットに限るものではなく、ビット数は長短いずれも可能である。
【００５６】
以上のように、本実施の形態１によれば、暗号化装置１００は、暗号化に先立ち、ジャンプ先となる可能性のある命令の直前に、そのジャンプ先命令へジャンプする無条件ジャンプ命令を追加挿入しておき、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際には、初期ベクトルＩＶ１〜ＩＶ８を用いる。
これにより、条件分岐命令または無条件ジャンプ命令と、その次の命令との暗号化が、一定の暗号ルールに準じて行われることが確定するため、暗号ブロック連鎖を行っても、復号化に際して連鎖が途切れることはない。
したがって、従来は困難であった、ｏｎ  ｔｈｅ  ｆｌｙ暗号における暗号ブロック連鎖が、一定の暗号ルールの下で可能となるのである。
【００５７】
また、本実施の形態１によれば、暗号化部１４２と２４２の暗号化処理に係る鍵長を命令ワード長よりも十分長くできるので、必要十分な鍵長に対して十分大きな平文空間と暗号文空間を確保できるようになる。
これにより、鍵長と命令ワード長が等しい暗号手法、例えば上記非特許文献１〜２に記載の技術と比較して、暗号強度を高めることができる。
【００５８】
また、本実施の形態１によれば、ブロック暗号により暗号強度を高める手法と比較して以下の（１）〜（４）で説明する利点を有する。
【００５９】
（１）例えば１２８ビットのブロック暗号の場合、ジャンプ命令によってあるブロックの最後の行にジャンプすることが起こると、一旦１２８ビットのブロックを読み出してから復号化を行う必要がある。
（２）そのため、命令の読み出しから実行まで時間がかかり、暗号命令の読み出し〜実行に係るスループットが低下する懸念がある。
【００６０】
（３）一方、本実施の形態１によれば、ジャンプ命令が復号された直後に左シフトレジスタ１５２が初期ベクトルＩＶ１〜ＩＶ８で初期化されており、次のサイクルから復号を再開することができる。
（４）そのため、ジャンプ命令が頻繁に実行されるプログラムでは、上述のブロック暗号と比較して、スループットの向上が期待できる。
【００６１】
実施の形態２．
実施の形態１では、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際には、初期ベクトルＩＶ１〜ＩＶ８を用いて左シフトレジスタ１５２を初期化することを説明した。
しかし、条件分岐命令の条件に合致しないことにより、直下の命令が実行される場合には、プログラム実行順序のジャンプは行われないため、上記のような初期化を必ずしも行わなくともよい。
そこで、本発明の実施の形態２では、ジャンプが行われる場合のみ左シフトレジスタを初期化する構成と動作について説明する。
【００６２】
図７は、本実施の形態２に係る暗号化装置１００の機能ブロック図である。本実施の形態２に係る暗号化装置１００の構成は、実施の形態１の図１で説明した構成と共通点が多いため、以下では実施の形態１との差異点を中心に説明する。
【００６３】
ジャンプ先アドレス収集部１１０は、オリジナルコードメモリ３００に格納されているプログラムコードのうち、条件分岐命令や無条件ジャンプ命令のジャンプ先となる可能性のあるアドレスを全て収集し、初期化判定部１７０に出力する。
初期化判定部１７０は、変換コードメモリ４００より、暗号化対象命令と、その命令のアドレスとを取得する。暗号化対象命令のアドレスが、ジャンプ先アドレス収集部１１０より取得したアドレスの中に含まれている場合には、マルチプレクサ１５１にＩＶ上書き信号を出力する。
【００６４】
図８は、ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ１５２の状態を示すものである。ここでは、実施の形態１の図２〜図４で説明したものと同じプログラムコードを用いる。
図８（ａ）はプログラムコードの暗号化処理、図８（ｂ）は各時点における左シフトレジスタ１５２の状態を示す。以下、図８を参照しながら、暗号化処理の過程における実施の形態１との差異点を説明する。
【００６５】
図８に示すプログラムコードでは、以下に示す３つのジャンプ先がある。
（１）条件分岐命令である命令Ｉ3：命令Ｉ6
（２）無条件ジャンプ命令である命令Ｉ5：命令Ｉ8
（３）無条件ジャンプ命令である命令Ｘ1：命令Ｉ8
【００６６】
この中で、条件分岐命令Ｉ3の条件を満たさなかった場合には、命令Ｉ4が実行されることになるが、これはプログラムコードをアドレス順番通りに実行することになり、ジャンプは行われないことになる。
そこで、命令Ｉ4を暗号化する際には、実施の形態１と異なり、左シフトレジスタ１５２を初期化しないようにする。
【００６７】
具体的には、ジャンプ先アドレス収集部１１０は、条件分岐命令や無条件ジャンプ命令のジャンプ先となる可能性のあるアドレスとして、命令Ｉ6とＩ8のアドレスを収集しておき、初期化判定部１７０は、これに一致するアドレスの命令を暗号化するときのみ、マルチプレクサ１５１にＩＶ上書き信号を出力する。
この動作によって、命令Ｉ4を暗号化する際には、左シフトレジスタ１５２は初期化されないことになる。
一方、命令Ｉ6とＩ8を暗号化する際には、左シフトレジスタ１５２は初期化ベクトルＩＶ１〜ＩＶ８で初期化される。
【００６８】
以上、暗号化装置１００の暗号化動作について説明した。
次に、暗号化装置１００が暗号化したプログラムコードの復号化について説明する。
【００６９】
本実施の形態２に係る復号化装置２００の構成は、実施の形態１の図５で説明したものと同様であるが、初期化判定部２７０の動作が実施の形態１と異なる。以下、初期化判定部２７０の動作を中心に説明する。
【００７０】
初期化判定部２７０は、以下の（１）〜（２）に示す基準にしたがって、暗号化された条件分岐命令や無条件ジャンプ命令を復号化する。これら以外の復号化については、実施の形態１と同様である。
【００７１】
（１）条件分岐命令の復号化
初期化判定部２７０は、復号化された条件分岐命令を受け取り、その命令によりジャンプが行われるか否かを判定する。
具体的には、図示しないプログラムカウンタの値を逐次取得してその変化に着目し、プログラムのアドレスが２以上インクリメントされるときはジャンプが行われ、１のみインクリメントされるときは条件に合致せずジャンプが行われないものと判定する、といった手法が考えられる。
【００７２】
（２）無条件ジャンプ命令の復号化
初期化判定部２７０は、復号化された条件分岐命令を受け取ったときは、必ずジャンプが発生するものとして、マルチプレクサ２５１にＩＶ上書き信号を出力する。
【００７３】
図９は、暗号化後のプログラムコードとその復号化処理を示すものである。ここでは、実施の形態１の図５で説明したものと同じプログラムコードを用いる。
図９（ａ）はプログラムコードの復号化処理、図９（ｂ）は各時点における左シフトレジスタ２５２の状態を示す。
【００７４】
図９に示すように、初期化判定部２７０は、暗号命令Ｃ6とＣ8を復号化する際には、左シフトレジスタ２５２を初期化ベクトルＩＶ１〜ＩＶ８で初期化する。
一方、暗号命令Ｃ4を復号化する際には、プログラムのアドレスがＩ3からＩ4に向かって１のみインクリメントする場合に該当するため、左シフトレジスタ２５２の初期化は行わない。
【００７５】
以上のように、本実施の形態２によれば、条件分岐命令の条件に合致しないことにより条件分岐命令の直下の命令が実行されるときは、当該命令の暗号化や復号化に際し、左シフトレジスタを初期化する必要はない。
そのため、暗号ブロック連鎖が行われる部分が実施の形態１よりも多くなり、暗号強度がさらに増す効果がある。
【００７６】
実施の形態３．
実施の形態１〜２で説明した暗号化・復号化手法は、いわゆるＣＦＢ（Ｃｉｐｈｅｒ  Ｆｅｅｄｂａｃｋ）モードを用いたものである。
一方、ＯＦＢ（Ｏｕｔｐｕｔ  Ｆｅｅｄｂａｃｋ）モードを暗号化・復号化に用いることも考えられる。この場合でも、実施の形態１〜２と同様の効果を発揮することができる。
【００７７】
ＯＦＢモードは、初期ベクトルから開始される乱数ストリームと平文の排他的論理和を取ることで暗号化を行う手法である。
本発明においてＯＦＢモードを用いる場合、前回生成した乱数を用いて新たな乱数を生成することで乱数ストリームを生成するが、条件分岐命令や無条件ジャンプ命令の直後の命令に関しては、改めて初期ベクトルから開始される乱数を用いる。
【００７８】
本実施の形態３のような暗号化・復号化手法により、実施の形態１〜２と同様の効果を発揮することができる。
【００７９】
実施の形態４．
以上の実施の形態１〜３では、暗号化装置１００と復号化装置２００は、別個の装置であるものとして説明したが、両者の構成は共通する部分が多いため、暗号化装置１００と復号化装置２００を一体的に構成してもよい。
例えば、左シフトレジスタ、初期化判定部、初期化ベクトル記憶部などの機能は、暗号化時と復号化時で同様であるため、これらは共通化することができる。
暗号化部と復号化部は、処理内容が暗号と復号で処理内容が異なるため、別個に設ける必要がある。
その他の構成に関しても、必要に応じて適宜共通化することもできる。
【図面の簡単な説明】
【００８０】
【図１】実施の形態１に係る暗号化装置１００の機能ブロック図である。
【図２】暗号化ルールに基づく変換を行う前のプログラムコードとその実行イメージを示すものである。
【図３】ジャンプ命令挿入後のプログラムコードを示すものである。
【図４】ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ１５２の状態を示すものである。
【図５】実施の形態１に係る復号化装置２００の機能ブロック図である。
【図６】暗号化後のプログラムコードとその復号化処理を示すものである。
【図７】実施の形態２に係る暗号化装置１００の機能ブロック図である。
【図８】ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ１５２の状態を示すものである。
【図９】暗号化後のプログラムコードとその復号化処理を示すものである。
【符号の説明】
【００８１】
１００  暗号化装置、１１０  ジャンプ先アドレス収集部、１２０  ジャンプ命令収集部、１３０  ジャンプ命令挿入部、１４１  鍵保持部、１４２  暗号化部、１４３  排他的論理和演算器、１５１  マルチプレクサ、１５２  左シフトレジスタ、１６０  初期ベクトル記憶部、１７０  初期化判定部、２００  復号化装置、２４１  鍵保持部、２４２  暗号化部、２４３  排他的論理和演算器、２５１  マルチプレクサ、２５２  左シフトレジスタ、２６０  初期ベクトル記憶部、２７０  初期化判定部、３００  オリジナルコードメモリ、４００  変換コードメモリ、５００  命令メモリ、６００  ＣＰＵ。
【図１】
2009211292.tif 000006
【図２】
2009211292.tif 000007
【図３】
2009211292.tif 000008
【図４】
2009211292.tif 000009
【図５】
2009211292.tif 000010
【図６】
2009211292.tif 000011
【図７】
2009211292.tif 000012
【図８】
2009211292.tif 000013
【図９】
2009211292.tif 000014