説明

暗号化方法、復号化方法、暗号化装置、復号化装置

【課題】コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法を得る。
【解決手段】ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後にレジスタを初期化するステップと、ジャンプ命令挿入ステップで新たなジャンプ命令を挿入したプログラムを、レジスタに格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、暗号化したプログラムをレジスタに格納するステップと、をコンピュータに実行させ、連鎖暗号化ステップでは、レジスタに格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、暗号化方法および装置、復号化方法および装置に関するものである。
【背景技術】
【0002】
コンピュータのCPU(Central Processing Unit)上で実行されるプログラムを解析して不正にその内容を取得する攻撃手法として、CPUとメモリの間のデータバスに直接プローブを当て、ロジックアナライザを用いてCPUの実行する命令や、レジスタにロードされるデータなどを解析する、タンパリング攻撃というものがある。
また、このタンパリング攻撃に対する対策として、データバス上を暗号化する、on the fly暗号という技術がある。また、バス暗号化のための専用プロセッサも開発されている。
【0003】
on the fly暗号では、1命令または1ワードのデータを1ブロックとして独立に暗号化を行う。この場合、暗号ブロックと平文ブロックは1対1に対応付けられ、暗号化強度はさほど高くない。
【0004】
一方、通常のメッセージ暗号化では、暗号ブロックが次のブロックの暗号化に用いられる暗号ブロック連鎖を行う場合があり、この場合は暗号ブロックと平文ブロックは1対1には対応せず、上述の1対1に対応する場合と比較して、既知平文攻撃や選択暗号文攻撃に対する暗号化強度が高くなる。
【0005】
上述のon the fly暗号において、暗号ブロック連鎖が行われないのは、暗号化対象の特性による。
コンピュータプログラムに対するタンパリング攻撃への対策として行われるon the fly暗号の暗号化対象は、攻撃対象となるコンピュータプログラムである。
コンピュータプログラムは、一般的な平文メッセージと異なり、条件分岐や繰り返し処理などが内在しており、各暗号ブロックの復号順序が一意に定められない。したがって、暗号ブロック連鎖のように暗号化時と復号化時の順序が一意である必要がある手法は、適用することができないのである。
【0006】
上述の課題に関し、下記非特許文献1では、暗号ブロック連鎖を行うことに代えて、暗号ブロックの保存先であるメモリのアドレスをランダム化したり、そのアドレスを鍵として用いたりすることで、解読を困難にする手法が記載されている。
また、下記非特許文献2では、状態遷移器の遷移状態に基づき命令コードを置換する手法が記載されている。
また、下記非特許文献3では、上述の非特許文献1〜2に記載の技術の他、種々の耐タンパリング化手法について解説されている。
【0007】
【非特許文献1】Markus G.Kuhn,”Cipher Instruction Search Attack on the BUS−Encryption Security Microcontroller DS5002FP”,IEEE TRANSACTIONS ON COMPUTERS,VOL.47,NO.10,pp.1153−1157,OCTOBER 1998
【非特許文献2】A.Monden,A.Monsifrot,C.Thomborson,”Tamper−Resistant Software System Based on a Finite State Machine”,IEICE TRANS.FUNDAMENTALS,VOL.E88−A,No.1 pp.112−122,January 2005
【非特許文献3】門田暁人,Clark Thomborson,”ソフトウェアプロテクションの技術動向(後編)−ハードウェアによるソフトウェア耐タンパー化技術”,情報処理,Vol.46,No.5,pp.558−563,2005.5
【発明の開示】
【発明が解決しようとする課題】
【0008】
上述の非特許文献1に記載の技術は、Kuhnが弱点を発見している。
Kuhnは、適当なビット列を暗号化された命令としてCPUに入力し、そのときのCPUの挙動を観察することを繰り返し、暗号文命令と平文命令の対応テーブルを作った。そして、そのテーブルを元に、CPUからパラレルポートへメモリ上の全データを書き出す暗号化プログラムを得ることができた。
パラレルポートに出力されたデータは暗号化されていないため、平文と暗号文の対応表が作成可能であるということを利用したものである。
【0009】
上述の弱点の原因は、暗号ブロックと平文が1対1に対応しているため、選択暗号文攻撃によって、所望の動作をする暗号化された状態のプログラムが得られることにある。
これを回避する1つの手法として、暗号ブロック連鎖を行うことが挙げられるが、先に説明したように、コンピュータプログラムを暗号化する際には、暗号ブロック連鎖を行うことができない。
【0010】
また、上記非特許文献2に記載の技術は、命令コードの置換による暗号という手法であることから、平文空間、暗号文空間はともに高々数十個程度であり、十分な暗号強度が確保し難い。
【0011】
そのため、コンピュータプログラムの暗号化に際し、暗号ブロック連鎖を行うことのできる暗号化方法および装置、その復号化方法および装置が望まれていた。
【課題を解決するための手段】
【0012】
本発明にかかる暗号化方法は、演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、前記プログラムを取得するステップと、少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化するステップと、前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、を前記コンピュータに実行させ、前記連鎖暗号化ステップでは、前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化するものである。
【発明の効果】
【0013】
本発明に係る暗号化方法によれば、暗号化を行う前に、条件分岐命令または無条件ジャンプ命令のジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入しておき、通常の命令はレジスタに格納されている命令を利用して連鎖的に暗号化し、ジャンプ命令に関してはレジスタを所定の初期値で初期化してから暗号化に用いる。
そのため、条件分岐命令や無条件ジャンプ命令が存在する場合でも、これらのジャンプ先命令を暗号化する際には、所定の初期値が用いられていることが分かっているので、復号順序が一意でないことは問題にならない。
したがって、条件分岐命令や無条件ジャンプ命令が存在するコンピュータプログラムの暗号化に際しても、暗号ブロック連鎖を適用することができる。
【発明を実施するための最良の形態】
【0014】
実施の形態1.
図1は、本発明の実施の形態1に係る暗号化装置100の機能ブロック図である。
暗号化装置100は、ジャンプ先アドレス収集部110、ジャンプ命令収集部120、ジャンプ命令挿入部130、鍵保持部141、暗号化部142、排他的論理和演算器143、マルチプレクサ151、左シフトレジスタ152、初期ベクトル記憶部160、初期化判定部170を備える。
また、図1では、暗号化装置100の周辺構成として、オリジナルコードメモリ300、変換コードメモリ400、命令メモリ500を併せて記載した。
【0015】
ジャンプ先アドレス収集部110は、オリジナルコードメモリ300に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令のジャンプ先アドレスを取得する。
なお、ここでいうプログラムコードとは、CPUの実行命令形式、または少なくとも実行単位がCPUの実効命令形式と等しい形式に変換されているものをいう。具体的には、マシンコードやアセンブラコードが相当する。以下同様である。
【0016】
ジャンプ命令収集部120は、オリジナルコードメモリ300に格納されているプログラムコードより、条件分岐命令や無条件ジャンプ命令が存在する箇所を取得する。
ジャンプ命令挿入部130は、後述の図3で説明する手順により、オリジナルコードメモリ300に格納されているプログラムコードに新たなジャンプ命令を挿入し、変換コードメモリ400に格納する。ただし、挿入時にジャンプ命令収集部120を参照してすでに無条件ジャンプ命令や条件分岐命令が存在していることが分かった場合には挿入をしないとしても良い。
【0017】
鍵保持部141は、暗号化鍵を保持する。
暗号化部142は、鍵保持部141が保持している暗号化鍵を用いて暗号化を行う。
排他的論理和演算器143は、変換コードメモリ400と暗号化部142より入力値を受け取り、その排他的論理和をマルチプレクサ151と命令メモリ500に出力する。
【0018】
マルチプレクサ151は、左シフトレジスタ152に出力すべき命令を、暗号化部142から受け取るか、それとも初期ベクトル記憶部160が格納している初期ベクトルIVにするかを切り替える。切り替えは、初期化判定部170が出力するIV上書き信号の入力を契機に行われる。
【0019】
左シフトレジスタ152は、64ビットのサイズを有する左シフトレジスタで構成された記憶装置である。1回のシフトを行うごとに、格納しているビットが8ビット左にシフトし、空いた8ビットの領域に8ビットの命令を右側から入力することができる。
ここでは、左シフトレジスタ152の初期値は、8個の8ビット初期ベクトルIV1〜IV8であるものとする。
【0020】
初期ベクトル記憶部160は、後述の図4で説明する暗号化処理を行うための初期ベクトルIV1〜IV8を格納している。
初期化判定部170は、変換コードメモリ400よりジャンプ命令挿入後のプログラムコードを取得し、条件分岐命令や無条件ジャンプ命令を検出すると、同命令が暗号化された後に、マルチプレクサ151にIV上書き信号を出力する。このときの動作は、後述の図4で説明する。
【0021】
本実施の形態1における「連鎖暗号化部」は、暗号化部142、排他的論理和演算器143がこれに相当する。また、「初期値」は、初期ベクトルIV1〜IV8がこれに相当する。
【0022】
ジャンプ先アドレス収集部110、ジャンプ命令収集部120、ジャンプ命令挿入部130、暗号化部142、排他的論理和演算器143、マルチプレクサ151、初期化判定部170は、これらの機能を実現する回路デバイスのようなハードウェアで構成することもできるし、CPUやマイコン等の演算装置と、その動作を規定するソフトウェアとで構成することもできる。また、必要に応じて、外部の記憶装置を用いることもできるし、記憶回路を内在することもできる。
鍵保持部141、初期ベクトル記憶部160は、フラッシュROM(Read Only Memory)のような記憶装置で構成することができる。これらを一体的に構成することもできる。
【0023】
以上、本実施の形態1に係る暗号化装置100の構成について説明した。
次に、暗号化装置100の暗号化動作について説明する。
【0024】
図1の構成の下では、プログラムコードの命令Ijは、下記(式1)により暗号命令Cjに暗号化される。
【数1】

【0025】
また、左シフトレジスタ152が格納しているビット列は、下記(式2)で表される。
【数2】

【0026】
上記(式1)〜(式2)は、命令Ijの暗号化に際し、先の命令の暗号化結果であるCj-1が少なくとも一部で用いられることを示している。即ち、暗号化部142は、上記(式1)〜(式2)を用いた暗号ブロック連鎖を行うものである。
しかし、先に説明したように、プログラムコードを暗号化すると、条件分岐や無条件ジャンプが発生した時点で、暗号の連鎖が途切れてしまう。
【0027】
例えば、I1−>I2−>I3−>I4−>I5という命令列を暗号化して、C1−>C2−>C3−>C4−>C5という暗号命令列を得たとする。この暗号命令列を復号化して実行するとき、例えば暗号命令C2の復号を行うためには、C1が復号化処理部に入力されなければならない。
しかし、もしプログラムがI1−>I2−>I5−>I3−>I4というように、2番目の命令I2から5番目の命令I5へジャンプしている場合、暗号命令C5の復号を行うためには、C2が復号化処理部に入力されていなければならないが、C5の暗号化にはC4が用いられているため、正しい復号化を行うことができない。
そこで、本実施の形態1では、暗号化に際し以下のルールを設け、暗号化前にプログラムコードの変換を行う。
【0028】
<暗号化ルール>
(1)プログラムコードの暗号化を行う前に、条件分岐命令または無条件ジャンプ命令のジャンプ先となる可能性のある命令(命令sと呼ぶ)の直前に、命令sへジャンプするジャンプ命令を、あらかじめ追加挿入しておく。
(2)既にジャンプ先の直前に無条件ジャンプ命令がある場合には、同様にジャンプ命令を挿入してもよいし、挿入を省略してもよい。
【0029】
次に、図1の構成の下で上記暗号化ルールがどのように実現されるかを説明する。上記ルールにより暗号ブロック連鎖が可能となる理由については、後述の復号化処理の説明の際に、併せて説明する。
【0030】
図2は、上記暗号化ルールに基づく変換を行う前のプログラムコードとその実行イメージを示すものである。ここでは読み易さの観点から、アセンブラコードを例にした。
図2(a)は変換前のアセンブラコードで、命令I1〜I9を有する。
命令I3では、条件分岐命令「jne:jump if not equal」が実行される。また、命令I5では、無条件ジャンプ命令「jmp:jump」が実行される。
図2(a)のプログラムコードにおいて、ジャンプ先の候補となるのは、命令I3で条件を満たしたときのジャンプ先である命令I6と、命令I5の無条件ジャンプ先である命令I8である。
【0031】
ジャンプ先アドレス収集部110は、オリジナルコードメモリ100より図2(a)のプログラムコードを読み取り、上述のジャンプ先となる命令の位置を取得する。
また、ジャンプ命令収集部120は、オリジナルコードメモリ100より図2(a)のプログラムコードを読み取り、条件分岐命令や無条件ジャンプ命令の位置を取得する。
【0032】
図3は、ジャンプ命令挿入後のプログラムコードを示すものである。
ジャンプ命令挿入部130は、条件分岐命令や無条件ジャンプ命令のジャンプ先の候補となる命令の直前(1命令前)に、直下の命令へジャンプする無条件ジャンプ命令を新たに挿入する。
図3の例では、ジャンプ先の候補となるのは命令I6と命令I8であるので、これらの直前に、直下の命令へジャンプする無条件ジャンプ命令を挿入することになる。
ただし、命令I6の直前には既に無条件ジャンプ命令I5が存在しているので、挿入は省略してよい。ここでは、命令I8の直前にのみ、無条件ジャンプ命令X1を挿入する。
【0033】
図4は、ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ152の状態を示すものである。
図4(a)はプログラムコードの暗号化処理、図4(b)は各時点における左シフトレジスタ152の状態を示す。以下、図4を参照しながら、暗号化処理の過程を、図1の構成と関連付けてステップを追って説明する。
【0034】
(1)左シフトレジスタ152の初期化
左シフトレジスタ152には、初期値として、初期ベクトルIV1〜IV8(合計64ビット)を格納しておく。
(2)暗号化処理の開始
ジャンプ命令挿入部130は、図3で説明したジャンプ命令挿入後のプログラムコードを、変換コードメモリ400に格納する。以後、変換コードメモリ400より図3のプログラムコードが1命令ずつ取り出され、暗号化が行われる。
【0035】
(3)1番目の命令の暗号化
初期化判定部170は、変換コードメモリ400より命令I1を取得する。命令I1は条件分岐命令や無条件ジャンプ命令ではないため、初期化判定部170は何も出力しない。
暗号化部142は、左シフトレジスタ152に格納されているビット(DR(1))を取得して鍵保持部141が保持している暗号鍵で暗号化し、その上位8ビットを排他的論理和演算器143に出力する。
排他的論理和演算器143は、暗号化部142からの出力と、命令I1との排他的論理和を求め、これを命令I1の暗号命令C1として、マルチプレクサ151と命令メモリ500に出力する。
【0036】
(4)暗号化処理の継続
以後、図示しないプログラムカウンタが1つずつインクリメントされ、ステップ(3)と同様の手順により、命令I2以降の暗号化が行われる。
なお、初期化判定部170は、入力される命令が条件分岐命令または無条件ジャンプ命令であるときは、同命令が暗号化された後、IV上書き信号を出力する。例えば、命令I3の暗号化を行う際には、同命令が条件分岐命令であるため、I3暗号化後、IV上書き信号を出力する。
IV上書き信号の出力により、左シフトレジスタ152には初期ベクトルIV1〜IV8が格納されるので、次の命令I4の暗号化を行う際には、初期ベクトルIV1〜IV8が用いられることになる。
【0037】
(5)条件分岐命令または無条件ジャンプ命令の次の命令の暗号化
次に、本実施の形態1の暗号化処理の特徴である、ジャンプ命令の次の命令を暗号化する際の処理について説明する。ここでは、命令I4の暗号化を例に取り説明する。
暗号化部142は、左シフトレジスタ152に格納されているビット(DR(4))を取得して鍵保持部141が保持している暗号鍵で暗号化し、その上位8ビットを排他的論理和演算器143に出力する。
排他的論理和演算器143は、暗号化部142からの出力と、命令I4との排他的論理和を求め、これを命令I4の暗号命令C4として、マルチプレクサ151と命令メモリ500に出力する。
【0038】
このように、本実施の形態1に係る暗号化装置100では、条件分岐命令や無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令を挿入しておく。
そして、暗号化する命令の直前の命令が条件分岐命令や無条件ジャンプ命令であったときは、その暗号化に際し、直前の命令を用いることに代えて、初期ベクトルIV1〜IV8が用いられる。
したがって、条件分岐命令や無条件ジャンプ命令がどの命令にジャンプするのか一意に定まらない場合であっても、ジャンプ先の命令は初期ベクトルIV1〜IV8を用いて暗号化されることが常に確定しているので、暗号ブロックの連鎖が途切れることはない。
【0039】
以上、暗号化装置100の暗号化動作について説明した。
次に、暗号化装置100が暗号化したプログラムコードの復号化について説明する。
【0040】
図5は、本実施の形態1に係る復号化装置200の機能ブロック図である。
復号化装置200は、鍵保持部241、暗号化部242、排他的論理和演算器243、マルチプレクサ251、左シフトレジスタ252、初期ベクトル記憶部260、初期化判定部270を備える。
また、図5では、復号化装置200の周辺構成として、命令メモリ500、CPU600を併せて記載した。
【0041】
鍵保持部241は、暗号化鍵を保持する。
暗号化部242は、鍵保持部241が保持している暗号化鍵を用いて暗号化を行う。
排他的論理和演算器243は、命令メモリ500より復号化対象命令Cjを、暗号化部242より左シフトレジスタ252の格納ビットの暗号結果上位8ビットを受け取り、両者の排他的論理和を、初期化判定部270とCPU600に出力する。
マルチプレクサ251、左シフトレジスタ252、初期ベクトル記憶部260、初期化判定部270の機能は、暗号化装置100が備える同名の各部と概ね同様であるため、これらの説明は、後述の復号化処理の説明で併せて行う。
CPU600は、復号化されたプログラムコードを実行する。
【0042】
本実施の形態1における「連鎖復号化部」は、復号化部242、排他的論理和演算器243がこれに相当する。
【0043】
図5の構成の下では、プログラムコードの暗号命令Cjは、下記(式3)により元の命令Ijに復号化される。
【数3】

【0044】
また、左シフトレジスタ252が格納しているビット列は、(式2)と同様である。
【0045】
復号化装置200は、暗号化装置100が行う暗号化処理と同様の手順により、復号化を実施する。以下、復号化装置200が行う復号化処理について説明する。
【0046】
図6は、暗号化後のプログラムコードとその復号化処理を示すものである。
図6(a)はプログラムコードの復号化処理、図6(b)は各時点における左シフトレジスタ252の状態を示す。以下、図6を参照しながら、図6(a)のプログラムコードを復号化する処理の過程を、図5の構成と関連付けてステップを追って説明する。
【0047】
(1)左シフトレジスタ252の初期化
左シフトレジスタ252には、初期値として、初期ベクトルIV1〜IV8(合計64ビット)を格納しておく。
【0048】
(2)1番目の命令の復号化
暗号化部242は、左シフトレジスタ252に格納されているビット(DR(1))を取得して鍵保持部241が保持している暗号鍵で暗号化し、その上位8ビットを排他的論理和演算器243に出力する。
排他的論理和演算器243は、暗号化部242からの出力と、暗号命令C1との排他的論理和を求め、これを復号命令I1として、初期化判定部270とCPU600に出力する。
初期化判定部270は、排他的論理和演算器243が出力した命令I1を取得する。命令I1は条件分岐命令や無条件ジャンプ命令ではないため、初期化判定部270は何も出力しない。
【0049】
(3)復号化処理の継続
以後、図示しないプログラムカウンタが1つずつインクリメントされ、ステップ(2)と同様の手順により、暗号命令C2以降の暗号化が行われる。
なお、初期化判定部270は、入力される命令が条件分岐命令または無条件ジャンプ命令であるときは、IV上書き信号を出力する。例えば、暗号命令C3を復号化した命令I3は条件分岐命令であるため、IV上書き信号を出力する。
IV上書き信号の出力により、左シフトレジスタ252には初期ベクトルIV1〜IV8が格納されるので、次の暗号命令C4の復号化を行う際には、初期ベクトルIV1〜IV8が用いられることになる。
【0050】
(4)条件分岐命令または無条件ジャンプ命令の次の命令の暗号化
次に、本実施の形態1の復号化処理の特徴である、ジャンプ命令の次の命令を復号化する際の処理について説明する。ここでは、暗号命令C4の復号化を例に取り説明する。
暗号化部242は、左シフトレジスタ252に格納されているビット(DR(4))を取得して鍵保持部241が保持している暗号鍵で暗号化し、その上位8ビットを排他的論理和演算器243に出力する。
排他的論理和演算器243は、暗号化部242からの出力と、暗号命令C4との排他的論理和を求め、これを暗号命令C4の復号命令I4として、初期化判定部270とCPU600に出力する。
【0051】
このように、本実施の形態1に係る復号化装置200は、復号の結果得られた命令を初期化判定部270に出力し、初期化判定部270は、その命令が条件分岐命令または無条件ジャンプ命令であるときは、IV上書き信号を出力する。
これにより、次の命令の復号化は、初期ベクトルIV1〜IV8を用いて行われることになる。
したがって、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際に、初期ベクトルIV1〜IV8を用いて暗号化を行ったことに対応して、条件分岐命令または無条件ジャンプ命令の次の命令は、必ず初期ベクトルIV1〜IV8を用いて復号化されることになる。
【0052】
即ち、本実施の形態1に係る暗号化装置100と復号化装置200は、暗号ブロック連鎖を行いながらも、連鎖が途切れる可能性のある命令に関しては例外を設けることで、連鎖が途切れないように配慮しているのである。
これにより、プログラムコードのように、復号化の順序が一意に定まらない暗号化対象であっても、暗号ブロック連鎖を行って暗号強度を高めることができる。
【0053】
本実施の形態1において、「暗号化」と呼ぶとき、暗号化部142が行う狭義の暗号化と、排他的論理和演算まで含めた広義の暗号化とがある。以上の説明では、特に両者を明示的に区別せずに用いているが、暗号化を行う主体をもって区別している。
例えば、暗号化部142が行う暗号化処理は狭義の暗号化を指し、排他的論理和演算まで含めた最終的な暗号結果を指すときは、広義の暗号化を指している。
復号化について、および以後の実施の形態においても同様である。
【0054】
本実施の形態1において、暗号化部142は、左シフトレジスタ152が格納しているビットを暗号化してその上位8ビットを排他的論理和演算器143に出力するものとしたが、これは、入力命令のワード長が8ビットであるものと想定したことに対応したものである。
即ち、本実施の形態1において、暗号化部142の暗号関数のビット長と、暗号化対象である入力命令のワード長とは、必ずしも一致していなくともよく、したがって入力命令に対して十分長い鍵長を用いることができる。暗号化部242についても同様である。
【0055】
本実施の形態1において、暗号化部142は、左シフトレジスタ152が格納しているビットの暗号結果上位8ビットを出力するものとしたが、暗号化対象命令のワード長に合わせて適宜ビット数を変えてもよい。
また、暗号関数のビット長も、64ビットに限るものではなく、ビット数は長短いずれも可能である。
【0056】
以上のように、本実施の形態1によれば、暗号化装置100は、暗号化に先立ち、ジャンプ先となる可能性のある命令の直前に、そのジャンプ先命令へジャンプする無条件ジャンプ命令を追加挿入しておき、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際には、初期ベクトルIV1〜IV8を用いる。
これにより、条件分岐命令または無条件ジャンプ命令と、その次の命令との暗号化が、一定の暗号ルールに準じて行われることが確定するため、暗号ブロック連鎖を行っても、復号化に際して連鎖が途切れることはない。
したがって、従来は困難であった、on the fly暗号における暗号ブロック連鎖が、一定の暗号ルールの下で可能となるのである。
【0057】
また、本実施の形態1によれば、暗号化部142と242の暗号化処理に係る鍵長を命令ワード長よりも十分長くできるので、必要十分な鍵長に対して十分大きな平文空間と暗号文空間を確保できるようになる。
これにより、鍵長と命令ワード長が等しい暗号手法、例えば上記非特許文献1〜2に記載の技術と比較して、暗号強度を高めることができる。
【0058】
また、本実施の形態1によれば、ブロック暗号により暗号強度を高める手法と比較して以下の(1)〜(4)で説明する利点を有する。
【0059】
(1)例えば128ビットのブロック暗号の場合、ジャンプ命令によってあるブロックの最後の行にジャンプすることが起こると、一旦128ビットのブロックを読み出してから復号化を行う必要がある。
(2)そのため、命令の読み出しから実行まで時間がかかり、暗号命令の読み出し〜実行に係るスループットが低下する懸念がある。
【0060】
(3)一方、本実施の形態1によれば、ジャンプ命令が復号された直後に左シフトレジスタ152が初期ベクトルIV1〜IV8で初期化されており、次のサイクルから復号を再開することができる。
(4)そのため、ジャンプ命令が頻繁に実行されるプログラムでは、上述のブロック暗号と比較して、スループットの向上が期待できる。
【0061】
実施の形態2.
実施の形態1では、条件分岐命令または無条件ジャンプ命令の次の命令を暗号化する際には、初期ベクトルIV1〜IV8を用いて左シフトレジスタ152を初期化することを説明した。
しかし、条件分岐命令の条件に合致しないことにより、直下の命令が実行される場合には、プログラム実行順序のジャンプは行われないため、上記のような初期化を必ずしも行わなくともよい。
そこで、本発明の実施の形態2では、ジャンプが行われる場合のみ左シフトレジスタを初期化する構成と動作について説明する。
【0062】
図7は、本実施の形態2に係る暗号化装置100の機能ブロック図である。本実施の形態2に係る暗号化装置100の構成は、実施の形態1の図1で説明した構成と共通点が多いため、以下では実施の形態1との差異点を中心に説明する。
【0063】
ジャンプ先アドレス収集部110は、オリジナルコードメモリ300に格納されているプログラムコードのうち、条件分岐命令や無条件ジャンプ命令のジャンプ先となる可能性のあるアドレスを全て収集し、初期化判定部170に出力する。
初期化判定部170は、変換コードメモリ400より、暗号化対象命令と、その命令のアドレスとを取得する。暗号化対象命令のアドレスが、ジャンプ先アドレス収集部110より取得したアドレスの中に含まれている場合には、マルチプレクサ151にIV上書き信号を出力する。
【0064】
図8は、ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ152の状態を示すものである。ここでは、実施の形態1の図2〜図4で説明したものと同じプログラムコードを用いる。
図8(a)はプログラムコードの暗号化処理、図8(b)は各時点における左シフトレジスタ152の状態を示す。以下、図8を参照しながら、暗号化処理の過程における実施の形態1との差異点を説明する。
【0065】
図8に示すプログラムコードでは、以下に示す3つのジャンプ先がある。
(1)条件分岐命令である命令I3:命令I6
(2)無条件ジャンプ命令である命令I5:命令I8
(3)無条件ジャンプ命令である命令X1:命令I8
【0066】
この中で、条件分岐命令I3の条件を満たさなかった場合には、命令I4が実行されることになるが、これはプログラムコードをアドレス順番通りに実行することになり、ジャンプは行われないことになる。
そこで、命令I4を暗号化する際には、実施の形態1と異なり、左シフトレジスタ152を初期化しないようにする。
【0067】
具体的には、ジャンプ先アドレス収集部110は、条件分岐命令や無条件ジャンプ命令のジャンプ先となる可能性のあるアドレスとして、命令I6とI8のアドレスを収集しておき、初期化判定部170は、これに一致するアドレスの命令を暗号化するときのみ、マルチプレクサ151にIV上書き信号を出力する。
この動作によって、命令I4を暗号化する際には、左シフトレジスタ152は初期化されないことになる。
一方、命令I6とI8を暗号化する際には、左シフトレジスタ152は初期化ベクトルIV1〜IV8で初期化される。
【0068】
以上、暗号化装置100の暗号化動作について説明した。
次に、暗号化装置100が暗号化したプログラムコードの復号化について説明する。
【0069】
本実施の形態2に係る復号化装置200の構成は、実施の形態1の図5で説明したものと同様であるが、初期化判定部270の動作が実施の形態1と異なる。以下、初期化判定部270の動作を中心に説明する。
【0070】
初期化判定部270は、以下の(1)〜(2)に示す基準にしたがって、暗号化された条件分岐命令や無条件ジャンプ命令を復号化する。これら以外の復号化については、実施の形態1と同様である。
【0071】
(1)条件分岐命令の復号化
初期化判定部270は、復号化された条件分岐命令を受け取り、その命令によりジャンプが行われるか否かを判定する。
具体的には、図示しないプログラムカウンタの値を逐次取得してその変化に着目し、プログラムのアドレスが2以上インクリメントされるときはジャンプが行われ、1のみインクリメントされるときは条件に合致せずジャンプが行われないものと判定する、といった手法が考えられる。
【0072】
(2)無条件ジャンプ命令の復号化
初期化判定部270は、復号化された条件分岐命令を受け取ったときは、必ずジャンプが発生するものとして、マルチプレクサ251にIV上書き信号を出力する。
【0073】
図9は、暗号化後のプログラムコードとその復号化処理を示すものである。ここでは、実施の形態1の図5で説明したものと同じプログラムコードを用いる。
図9(a)はプログラムコードの復号化処理、図9(b)は各時点における左シフトレジスタ252の状態を示す。
【0074】
図9に示すように、初期化判定部270は、暗号命令C6とC8を復号化する際には、左シフトレジスタ252を初期化ベクトルIV1〜IV8で初期化する。
一方、暗号命令C4を復号化する際には、プログラムのアドレスがI3からI4に向かって1のみインクリメントする場合に該当するため、左シフトレジスタ252の初期化は行わない。
【0075】
以上のように、本実施の形態2によれば、条件分岐命令の条件に合致しないことにより条件分岐命令の直下の命令が実行されるときは、当該命令の暗号化や復号化に際し、左シフトレジスタを初期化する必要はない。
そのため、暗号ブロック連鎖が行われる部分が実施の形態1よりも多くなり、暗号強度がさらに増す効果がある。
【0076】
実施の形態3.
実施の形態1〜2で説明した暗号化・復号化手法は、いわゆるCFB(Cipher Feedback)モードを用いたものである。
一方、OFB(Output Feedback)モードを暗号化・復号化に用いることも考えられる。この場合でも、実施の形態1〜2と同様の効果を発揮することができる。
【0077】
OFBモードは、初期ベクトルから開始される乱数ストリームと平文の排他的論理和を取ることで暗号化を行う手法である。
本発明においてOFBモードを用いる場合、前回生成した乱数を用いて新たな乱数を生成することで乱数ストリームを生成するが、条件分岐命令や無条件ジャンプ命令の直後の命令に関しては、改めて初期ベクトルから開始される乱数を用いる。
【0078】
本実施の形態3のような暗号化・復号化手法により、実施の形態1〜2と同様の効果を発揮することができる。
【0079】
実施の形態4.
以上の実施の形態1〜3では、暗号化装置100と復号化装置200は、別個の装置であるものとして説明したが、両者の構成は共通する部分が多いため、暗号化装置100と復号化装置200を一体的に構成してもよい。
例えば、左シフトレジスタ、初期化判定部、初期化ベクトル記憶部などの機能は、暗号化時と復号化時で同様であるため、これらは共通化することができる。
暗号化部と復号化部は、処理内容が暗号と復号で処理内容が異なるため、別個に設ける必要がある。
その他の構成に関しても、必要に応じて適宜共通化することもできる。
【図面の簡単な説明】
【0080】
【図1】実施の形態1に係る暗号化装置100の機能ブロック図である。
【図2】暗号化ルールに基づく変換を行う前のプログラムコードとその実行イメージを示すものである。
【図3】ジャンプ命令挿入後のプログラムコードを示すものである。
【図4】ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ152の状態を示すものである。
【図5】実施の形態1に係る復号化装置200の機能ブロック図である。
【図6】暗号化後のプログラムコードとその復号化処理を示すものである。
【図7】実施の形態2に係る暗号化装置100の機能ブロック図である。
【図8】ジャンプ命令挿入後のプログラムコードの暗号化処理と、各命令を暗号化する時点における左シフトレジスタ152の状態を示すものである。
【図9】暗号化後のプログラムコードとその復号化処理を示すものである。
【符号の説明】
【0081】
100 暗号化装置、110 ジャンプ先アドレス収集部、120 ジャンプ命令収集部、130 ジャンプ命令挿入部、141 鍵保持部、142 暗号化部、143 排他的論理和演算器、151 マルチプレクサ、152 左シフトレジスタ、160 初期ベクトル記憶部、170 初期化判定部、200 復号化装置、241 鍵保持部、242 暗号化部、243 排他的論理和演算器、251 マルチプレクサ、252 左シフトレジスタ、260 初期ベクトル記憶部、270 初期化判定部、300 オリジナルコードメモリ、400 変換コードメモリ、500 命令メモリ、600 CPU。

【特許請求の範囲】
【請求項1】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、
入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、
前記プログラムを取得するステップと、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化するステップと、
前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、
前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、
を前記コンピュータに実行させ、
前記連鎖暗号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する
ことを特徴とする暗号化方法。
【請求項2】
請求項1に記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
前記連鎖復号化ステップで復号化した命令が条件分岐命令または無条件ジャンプ命令であった場合に前記記憶手段を初期化するステップと、
を前記コンピュータに実行させ、
前記連鎖復号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化方法。
【請求項3】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する方法であって、
入力したビット数だけ格納ビットをシフトする記憶手段を設けておき、
前記プログラムを取得するステップと、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先となり得る命令のアドレスを収集するジャンプ先収集ステップと、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入ステップと、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令のジャンプ先であった場合その命令を暗号化する前に前記記憶手段を初期化するステップと、
前記ジャンプ命令挿入ステップで新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化ステップと、
前記連鎖暗号化ステップで暗号化した前記プログラムを前記記憶手段に格納するステップと、
を前記コンピュータに実行させ、
前記連鎖暗号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化する
ことを特徴とする暗号化方法。
【請求項4】
請求項3に記載の暗号化方法で暗号化されたプログラムを、コンピュータを用いて復号化する方法であって、
暗号化された前記プログラムを取得するステップと、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化ステップと、
前記連鎖復号化ステップで復号化した命令が、無条件ジャンプ命令であった場合、または条件付ジャンプ命令であって当該条件に合致する場合に、前記記憶手段を初期化するステップと、
を前記コンピュータに実行させ、
前記連鎖復号化ステップでは、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化方法。
【請求項5】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを暗号化する装置であって、
入力したビット数だけ格納ビットをシフトする記憶手段と、
前記プログラムを取得する手段と、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、条件分岐命令または、無条件ジャンプ命令が無い場合には、当該ジャンプ先直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入部と、
暗号化対象命令の命令が条件分岐命令または無条件ジャンプ命令であった場合その命令を暗号化した後に前記記憶手段を初期化する初期化部と、
前記ジャンプ命令挿入部が新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化部と、
を備え、
前記連鎖暗号化部は、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化し、
暗号化した前記プログラムを前記記憶手段に格納する
ことを特徴とする暗号化装置。
【請求項6】
請求項1に記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号化部が復号化した命令が条件分岐命令または無条件ジャンプ命令であった場合に前記記憶手段を初期化する初期化部と、
を備え、
前記連鎖復号化部は、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化装置。
【請求項7】
演算装置に条件分岐命令または無条件ジャンプ命令の少なくとも一方を実行させるプログラムを、コンピュータを用いて暗号化する装置であって、
入力したビット数だけ格納ビットをシフトする記憶手段と、
前記プログラムを取得する手段と、
前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先となり得る命令のアドレスを収集するジャンプ先収集部と、
少なくとも前記プログラムの条件分岐命令と無条件ジャンプ命令のジャンプ先直前に、無条件ジャンプ命令が無い場合には、当該ジャンプ先の直前に、当該ジャンプ先へジャンプする命令を新たに挿入するジャンプ命令挿入部と、
暗号化対象命令が条件分岐命令または無条件ジャンプ命令のジャンプ先であった場合その命令を暗号化する前に前記記憶手段を初期化する初期化部と、
前記ジャンプ命令挿入部が新たなジャンプ命令を挿入した前記プログラムを、前記記憶手段に格納されている命令を暗号化に利用しながら連鎖的に暗号化する連鎖暗号化部と、
を備え、
前記連鎖暗号化部は、
前記記憶手段に格納されているビットの全部または一部を所定の暗号関数で暗号化したものと、暗号化対象命令との排他的論理和をとることで、当該命令を暗号化し、
暗号化した前記プログラムを前記記憶手段に格納する
ことを特徴とする暗号化装置。
【請求項8】
請求項3に記載の暗号化方法で暗号化されたプログラムを復号化する装置であって、
暗号化された前記プログラムを取得する手段と、
復号化対象命令を、前記記憶手段に格納されている命令を復号化に利用しながら連鎖的に復号化する連鎖復号化部と、
前記連鎖復号化部が復号化した命令が、無条件ジャンプ命令であった場合、または条件付ジャンプ命令であって当該条件に合致する場合に、前記記憶手段を初期化する初期化部と、
を備え、
前記連鎖復号化部は、
前記記憶手段に格納されているビットの全部または一部を前記暗号関数で暗号化したものと、復号化対象命令との排他的論理和をとることで、当該命令を復号化する
ことを特徴とする復号化装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2009−211292(P2009−211292A)
【公開日】平成21年9月17日(2009.9.17)
【国際特許分類】
【出願番号】特願2008−52251(P2008−52251)
【出願日】平成20年3月3日(2008.3.3)
【出願人】(000000295)沖電気工業株式会社 (6,645)
【Fターム(参考)】