説明

命令レベルのソフトウェア暗号化のための方法及び装置

【課題】背景技術の欠点の少なくとも一部を解消するソフトウェア暗号化ソリューションを提供することである。
【解決手段】実行時に命令ごとに復号される、コンパイルされたコンピュータコード命令を暗号化する方法である。コンピュータコード命令は、暗号化された命令がその命令の値と、先行する命令の値と、擬似乱数とに依存するように、チェイニングモードを用いて暗号化される。2つ以上の先行する命令からその命令に至ることがあるので、その2つ以上の先行する命令に、暗号化された命令の復号時に用いる乱数補償値を関連づけ、暗号化された命令の復号により先行する命令がどれであっても結果が同じになるようにする。暗号化装置と、復号装置及び復号方法と、暗号化されたコンパイルされたコンピュータコード命令を格納するデジタルサポート媒体も提供する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソフトウェアに関し、特にソフトウェアの暗号化と、プロセッサにおけるその復号及び実行とに関する。
【背景技術】
【0002】
このセクションは、以下に説明して特許を請求する本発明の様々な態様に関連する様々な態様の技術を読者に紹介することを意図するものである。この説明は、本発明の様々な態様の理解を容易にする背景情報を読者に提供する役に立つと思われる。従って、言うまでもなくこれらの記載は上記を考慮して読むべきであり、先行技術として認める(admissions of prior art)ものではない。
【0003】
ソフトウェアコードを暗号化により保護し、そのソフトウェアコードを実行時のみに命令ごとに復号する技術は、従来、例えば特許文献1及び特許文献2により知られている。これらのシステムの欠点は、比較的容易にハッカーが命令を変更して何をしているか知ってしまうことである。
【0004】
この欠点を解消するため、特許文献3は、コードの基本ブロック(basic blocks)をスクランブルして、シグネチャ(signature)を生成することによりインテグリティ(integrity)を確保することを提案している。このソリューションの欠点は、インテグリティを考慮しないでハッキングされたシステムでは、そのシステムをハックしようとするとき、まだ命令を置き換えることが可能だということである。
【0005】
それゆえ言うまでもなく、背景技術の欠点の少なくとも一部を解消するソフトウェア暗号化ソリューションが必要である。本発明はかかるソリューションを提供するものである。
【特許文献1】米国特許公報第5,386,469号
【特許文献2】米国特許公報第6,345,359号
【特許文献3】米国特許出願公開第2005/108507号
【発明の概要】
【0006】
第1の態様では、本発明は、複数の分岐命令とラベル命令とを含む、コンパイルされたコンピュータコード命令のセットを暗号化して、実行時に命令ごとに復号する、コンパイルされたコンピュータコード命令の暗号化されたセットを求める方法に関する。前記コンパイルされたコンピュータコード命令のセットの実行は前記複数の分岐命令の各々から前記ラベル命令に直接続く。暗号化されたラベル命令が少なくとも前記ラベル命令の値と、前記複数の分岐命令の選択された分岐命令の値に依存するように、チェイン化(chained)された暗号関数を用いて前記ラベル命令を暗号化する。前記ラベル命令の直前に前記複数の分岐命令のどれが実行されても、実行時に同じ結果となるように、前記複数の分岐命令のうちの前記選択された分岐命令以外の少なくとも1つの分岐命令の各々に、前記暗号化されたラベル命令の復号の調整に用いる補償値を関連づける。
【0007】
第1の好ましい実施形態において、前記ラベル命令の暗号化は、前記ラベル命令と関連づけられた擬似乱数にさらに依存する。
【0008】
第2の好ましい実施形態において、コード鍵と、前記擬似乱数を生成する命令のオフセットとの関数として前記擬似乱数を生成する。
【0009】
第3の好ましい実施形態において、前記ラベル命令の値と前記複数の分岐命令のうちの前記選択した分岐命令の値とは、それぞれのオプコード部分の値である。
【0010】
第4の好ましい実施形態において、前記暗号化は、前記ラベル命令の値と、前記複数の分岐命令のうちの選択された分岐命令の値との排他的論理和をとることにより実行される。
【0011】
第2の態様において、本発明は、チェイン化された暗号関数を用いて暗号化された、コンパイルされたコンピュータコード命令のセットを復号する方法に関する。コンパイルされたコンピュータコード命令の実行時、実行される関数の補償値と後続の暗号化された関数を求める。後続の暗号化された関数は、コンパイルされたコンピュータコード命令の実行時に、実行される関数に続くものである。前記後続の暗号化関数の擬似乱数を求める。前記チェイン化された暗号化関数に対応する暗号化関数を用いて前記後続の暗号化された命令を復号する。前記暗号化関数は少なくとも前記後続の暗号化された命令と、前記実行された命令と、前記擬似乱数と、前記補償値とから後続の関数を生成する。
【0012】
第1の好ましい実施形態において、コード鍵と、後続の暗号化された関数のオフセットとの関数として擬似乱数を生成する。
【0013】
第2の好ましい実施形態において、暗号化された関数は暗号化されたオプコードと、もしあれば暗号化されていないパラメータとを含み、前記実行された関数と前記後続の暗号化された関数のオプコードの部分のみを復号に用いる。
【0014】
第3の好ましい実施形態において、前記後続の暗号化された命令の値と、前記実行された関数の値と、前記擬似乱数と、前記補償値の排他的論理和をとることにより復号を行う。
【0015】
第3の態様では、本発明は、複数の分岐命令とラベル命令とを含むコンパイルされたコンピュータコード命令のセットを暗号化して、実行時に命令ごとに復号する、コンパイルされたコンピュータコード命令の暗号化されたセットを求める装置に関する。前記コンパイルされたコンピュータコード命令のセットの実行は前記複数の分岐命令の各々から前記ラベル命令に直接続く。この装置は、暗号化されたラベル命令が少なくとも前記ラベル命令の値と、前記複数の分岐命令の選択された分岐命令の値に依存するように、チェイン化された暗号関数を用いて前記ラベル命令を暗号化し、前記ラベル命令の直前に前記複数の分岐命令のどれが実行されても、実行時に、同じ結果となるように、前記複数の分岐命令のうちの前記選択された分岐命令以外の少なくとも1つの分岐命令の各々に、前記暗号化されたラベル命令の復号の調整に用いる補償値を関連づけるように構成されたプロセッサを含む。
【0016】
第4の態様において、本発明は、チェイン化された暗号関数を用いて暗号化された、コンパイルされたコンピュータコード命令のセットを復号する装置に関する。この装置は、コンパイルされたコンピュータコード命令の実行時に、実行する関数の補償値を求め、前記コンパイルされたコンピュータコード命令の実行中に実行される関数に続く、後続の暗号化された関数を求め、前記後続の暗号化された関数の擬似乱数を求め、前記チェイン化された暗号化関数に対応する暗号化関数を用いて前記後続の暗号化された命令を復号するように構成されたプロセッサを含む。前記暗号化関数は少なくとも前記後続の暗号化された命令と、前記実行された命令と、前記擬似乱数と、前記補償値とから後続の関数を生成するように構成されたプロセッサを有する。
【0017】
第5の態様において、本発明は、コンピュータにおいて実行したとき、本発明の第2の態様による方法を実行するコンピュータコード命令を含むデジタルサポート媒体に関する。
【図面の簡単な説明】
【0018】
添付した図面を参照して、限定的でない例示により、本発明の好ましい特徴をここに説明する。
【図1】本発明の好ましい実施形態による、一般的なチェイニングモード暗号化方式を示す図である。
【図2】本発明の好ましい実施形態による、命令の暗号化法を詳細に示す図である。
【図3】本発明の好ましい実施形態を用いて暗号化したジャンプを有するコードの例を示す図である。
【図4】本発明の好ましい実施形態による、コード暗号化及び復号システムを示す図である。
【発明を実施するための形態】
【0019】
本発明は、暗号化とその後の復号とによる、コンパイルしたソフトウェアコード命令のソフトウェアの保護を提案するものである。この説明を目的として、ハイレベルのコード命令は少なくとも下記の1つよりなる:
−ベーシックブロック(basic block)、すなわち常に順次に実行される一組のマシンレベル命令。ベーシックブロックがジャンプまたはそれと同様の命令を含む場合、最後のマシンレベルの命令である。これは、次のマシンレベルの命令は、通常はコードが実行された時に決まるからである。
【0020】
−ラベル。これはジャンプ命令の行き先と言える。ベーシックブロックがラベルを含む場合、そのラベルは常に最初の命令として現れる。
【0021】
図1は、本発明の好ましい実施形態による、一般的なチェイニングモード(chaining mode)暗号化方式を示す図である。通常、命令は、その命令と乱数とその前の命令との排他的論理和(XOR)をとることにより暗号化される。図1に示した例では、3つの命令を暗号化しているだけであるが、これをより多数(または少数)の場合に一般化できることは言うまでもない。
【0022】
暗号化する命令である命令1、命令2、命令3を左端から第1列に示した。第2列は擬似乱数であり、命令ごとに異なることが好ましい。これらの擬似乱数は秘密鍵を用いたストリーム暗号102により提供される擬似乱数ストリームである。秘密鍵はコンパイルされた各コードに対して一意的であることが好ましい。ストリーム暗号は原始的な暗号(cryptographic primitives)であり、RC4やSalsaは非限定的な例である。ストリーム暗号として効果的に動作するように、カウンタモードのAES(AES−CTR)等のブロック暗号を用いることもできる。
【0023】
第3列は前に暗号化された命令の値である。ただし、命令1には前の命令がないので、その替わりに初期化ベクトルIVを用いている。第4列は結果として得られた暗号化機能である。
【0024】
図から分かるように、命令1は擬似乱数1及び初期化ベクトルIVと排他的論理和(XOR)され、暗号化命令1すなわち{命令1}となる。しかし、命令2は、擬似乱数2及び命令1とXORされ、暗号化命令2すなわち{命令2}となる。その他の命令も、擬似乱数及び前の命令とXORされ、同様に暗号化される。
【0025】
当業者には言うまでもないことであるが、図1に示したチェイニングモード(chaining mode)は基本ブロックの暗号化にはうまく機能する。しかし、それ以外には使えない。例えばジャンプ命令などで複数の場所から来られる命令は、前の命令が複数あり、これらは互いに異なるからである。このため、1つの場合、すなわち「正しい」前の命令から後の命令に来た場合にのみ正しく復号することができる。
【0026】
しかし、本発明は、コード全体をチェイン化することができる。このために、少なくとも一部(場合によっては全部)の命令に乱数補償値(compensator)を関連づける(associate)。この乱数補償値を用いて次の命令を暗号化及び復号する。後で説明するように、これらの乱数補償値により、前の命令がどれであっても命令を正しく暗号化できる。念のために言っておくと、乱数補償値は通常はランダムではないが、擬似乱数を補償する値である。
【0027】
例えば、命令I14には2つの前の命令I13とIとがあり得ると仮定する。各先行命令には乱数補償値C13とCがそれぞれ関連付けられている。
【0028】
乱数補償値が無い場合、命令I13からチェイン化された命令I14の暗号化は、次の通りである:
【0029】
【数1】

ここで、
[外1]

はXOR(排他的論理和)演算を示し、中括弧は暗号化された命令を示す。
【0030】
同様に、命令Iからチェイニングする場合の命令I14の暗号化は、次の通りである:
【0031】
【数2】

(多くの場合のように)IとI13とが異なれば、{I14}が取り得る値は2つある。乱数補償値C13とCは、{I14}の暗号値を同じにするために用いる。式は以下のようになる:
【0032】
【数3】

上の2つの式の結果が同じになるようにするには、右辺が等しくなければならない。すなわち、
【数4】

この式を簡単にすると、
【数5】

この式は、
[外2]

である場合に、暗号化結果が同じになることを意味している。
【0033】
乱数補償値は、ランダムコレクションテーブル(RCT)に格納され、見出しには好ましくは暗号化されたバイナリコードが設けられる。
【0034】
コードの復号はそのコードを実行する直前に行うのが好ましい。プロセッサ420は、秘密鍵を入力としたストリーム暗号202を用いて、各命令を復号する正しい擬似乱数値を生成できる。乱数補償値がある場合、命令Iから命令I14の復号は、次の通りである:
【0035】
【数6】

また、命令I13から命令I14の復号は、次の通りである:
【0036】
【数7】

2つの式は同じ復号結果I14を与える。
【0037】
図2は、本発明の好ましい実施形態による、命令の暗号化法を詳細に示す図である。ソフトウェアコードをコンパイルするとき、コンパイラはジャンプを実行する命令に関する情報を提供する。この情報を用いて、コンパイルしたコードを暗号化する。
【0038】
図1に示したように、命令2は、先行する命令1及び擬似乱数とXORをとることにより暗号化され、暗号化命令{命令2}となる。
【0039】
図2は、擬似乱数の生成を詳細に示す図である。擬似乱数は(図1の場合と同様に、好ましくはRC4、Salsa、またはAES−CTRである)ストリーム暗号202により生成される。ストリーム暗号202は、入力として、コード鍵と命令オフセット206とを用いる。RCT204も命令オフセット206を入力として用い、乱数補償値Cを生成する。命令2の暗号化が補正(correction)を必要としない場合(これは命令2がラベルではない場合である)、RCT204には、命令オフセット206に関連づけられた情報は無いことが好ましい。
【0040】
命令オフセット206はストリーム暗号202に情報を提供し、1つの命令に対して毎回同じ乱数値が生成されるようにする。当業者には言うまでもないが、かかる命令オフセットは、図1では必要ない。コードブロックは所定の順序で生成されるからである。一方、図2ではコードをジャンプすることが許される。すなわち、7番目に実行される命令は、必ずしもコードの7番目の命令ではない。
【0041】
言うまでもなく、どのジャンプ命令の乱数補償値もゼロに設定し、コードの完全なチェイニングを可能とするように、補正すべき命令の乱数補償値の計算を必要に応じて繰り返すことが可能である。
【0042】
図3は、本発明の好ましい実施形態を用いて暗号化したジャンプを有するコードの例を示す図である。図から分かるように、最後の命令Iには異なる2つの命令IとIとから行かれる。暗号化命令{命令8}が先行する命令にかかわらず同じになるようにするため、
[外3]

となるようにする。簡単のため、図3には、命令を暗号化するのに用いる乱数Riは示していない。
【0043】
を設定すると、C
[外4]

として計算できる。一方、Cを設定すると、C
[外5]

として計算できる。すでに述べたように、どちらの乱数補償値を設定するかは通常は問題ではなく、重要なことは、可能性のあるすべての先行命令から来る命令を復号できることである。
【0044】
乱数補償値の値は上記のRCTテーブルに格納される。
【0045】
図4は、本発明の好ましい実施形態による、コード暗号化及び復号システム400を示す図である。システム400は、コンパイルされたバイナリコード「コード」を受け取り、暗号化するように構成された暗号化装置410を有する。暗号化装置410は、前記のように、バイナリコードをスクランブルするように構成されている。暗号化装置410は、スクランブルされたコード{コード}Kが対象とする(intended)プロセッサ420の公開鍵Kpubを格納し、秘密コード鍵Kを生成する。この秘密コード鍵は毎回変わる(すなわち、コードごとに異なる)ことが好ましい。公開鍵Kpubは対象とする装置(または複数の装置)に対して一意的である。ストリーム暗号は秘密鍵Kを用いて、ランダムストリームを生成する。秘密鍵Kは、安全に送信するため、公開鍵Kpubを用いて暗号化され、暗号化された秘密鍵{K}Kpubとなる。{K}Kpubには、好ましくはそのヘッダに、バイナリコードが提供される。
【0046】
暗号化装置410は、1つ以上のプロセッサで実施され、またはコードをコンパイルするように構成されたコンパイラを含み、さらに少なくとも1つの通信部とメモリとをさらに含む装置の一部で実施される。暗号化装置410は、コンパイルされたコードを分析し、暗号化するのに必要なラベル等の情報を見つけるように構成されている。
【0047】
暗号化装置410は、スクランブルされたコード{コード}Kと暗号化された秘密鍵{K}Kpubとを、同じチャネルまたは別々のチャネルを介して、プロセッサ420に送信するようにさらに構成されている。言うまでもなく、スクランブルされたコード{コード}Kは、暗号化された秘密鍵{K}Kpubといっしょに、またはそれ無しに、CD−ROM等のデジタルサポート媒体430で、または任意の適切なデジタル配信ネットワーク(例えば、インターネット、LAN、UMTS)で配信してもよい。
【0048】
プロセッサ420はバイナリコードヘッダから暗号化された秘密鍵{K}Kpubを取り出す。プロセッサ420は、好ましくは、公開鍵に対応する秘密鍵Kprivを用いて{K}Kpubを復号するように構成された暗号プロセッサ421を有する。秘密鍵Kprivは好ましくはセキュアな(不正操作できない)記憶場所に格納される。暗号プロセッサは、秘密鍵Kを用いて、スクランブルされたコード{コード}Kをデスクランブル(descramble)し、バイナリコードを求めるように構成されている。命令がデスクランブルされると、このバイナリコードは、キャッシュ423に送られ、キャッシュ423からさらに第2のプロセッサ(CPU)424に送られ、実行される。プロセッサ420は、RCTを格納するように構成されたメモリ(RAM)422をさらに有する。
【0049】
本システムと方法は通常のプロセッサを用いて実施してもよいが、言うまでもなく、いわゆる暗号プロセッサ(crypto-processor)を用いるとより安全になり有利である。
【0050】
上記の説明では、命令が暗号化されていると説明した。当業者には言うまでもなく、命令の長さはいわゆるオプコード(opcode)に付随(associated)する変数の数により変化し得る。
【0051】
第1の変形例では、各命令のオプコードのみを暗号化し、変数は暗号化しない。
【0052】
第2の変形例では、暗号化に用いる擬似乱数を最も長い命令と同じ長さにする。そうすれば、オプコードを最初に復号して、そのオプコードにリンクされている変数の長さを知ることができる。次に、第2のパスで、変数を復号する。第2の変形例を用いて命令をチェイン化するため、現在の命令と比較して先行する命令の方が長ければ、その先行する命令を現在の命令の長さに切り捨てる(truncate)。しかし、先行する命令の方が短ければ(または長さが同じなら)、切り捨ては必要ない。
【0053】
当業者には言うまでもなく、問題となる命令に先だってどの命令が実行されても、暗号化値が同じになるように乱数補償値を計算した場合に、命令を暗号化するのに用いる擬似乱数を、その命令自体またはそれに先行する命令に付随させることが可能である。
【0054】
明細書、特許請求の範囲、及び図面に開示した各特徴は、独立に設けることもできるし、適切に組み合わせて設けることもできる。ハードウェアで実施されると説明した機能はソフトウェアでも実施できるし、その逆の場合もある。
【0055】
特許請求の範囲に示す参照符号は例示であり、請求項の範囲を限定するものではない。

【特許請求の範囲】
【請求項1】
複数の分岐命令とラベル命令とを含むコンパイルされたコンピュータコード命令のセットを暗号化して、実行時に命令ごとに復号する、コンパイルされたコンピュータコード命令の暗号化されたセットを求める方法であって、
前記コンパイルされたコンピュータコード命令のセットの実行は前記複数の分岐命令の各々から前記ラベル命令に続き、
前記方法は一装置において、
暗号化されたラベル命令が少なくとも前記ラベル命令の値と、前記複数の分岐命令の選択された分岐命令の値に依存するように、チェイン化された暗号関数を用いて前記ラベル命令を暗号化する段階と、
前記ラベル命令の直前に前記複数の分岐命令のどれが実行されても、実行時に、同じ結果となるように、前記複数の分岐命令のうちの前記選択された分岐命令以外の少なくとも1つの分岐命令の各々に、前記暗号化されたラベル命令の復号の調整に用いる補償値を関連づける段階と、
を含む方法。
【請求項2】
前記ラベル命令の暗号化は、前記ラベル命令と関連づけられた擬似乱数にさらに依存する、請求項1に記載の方法。
【請求項3】
コード鍵と、前記擬似乱数を生成する命令のオフセットとの関数として前記擬似乱数を生成する段階をさらに含む、請求項2に記載の方法。
【請求項4】
前記ラベル命令の値と前記複数の分岐命令のうちの前記選択した分岐命令の値とは、それぞれのオプコード部分の値である、請求項1に記載の方法。
【請求項5】
前記暗号化は、前記ラベル命令の値と、前記複数の分岐命令のうちの選択された分岐命令の値との排他的論理和をとることにより実行される、請求項1に記載の方法。
【請求項6】
チェイン化された暗号関数を用いて暗号化された、コンパイルされたコンピュータコード命令のセットを復号する方法であって、
前記コンパイルされたコンピュータコード命令の実行時に、一装置において、
実行した関数の補償値を求める段階と、
前記コンパイルされたコンピュータコード命令の実行中に実行された関数に続く、後続の暗号化関数を求める段階と、
前記後続の暗号化関数の擬似乱数を求める段階と、
前記チェイン化された暗号化関数に対応する暗号化関数を用いて前記後続の暗号化された命令を復号する段階であって、前記暗号化関数は少なくとも前記後続の暗号化された命令と、前記実行された命令と、前記擬似乱数と、前記補償値とから後続の関数を生成する、復号する段階と、を含む方法。
【請求項7】
コード鍵と、前記後続の暗号化された関数のオフセットとの関数として前記擬似乱数を生成する段階をさらに含む、請求項6に記載の方法。
【請求項8】
暗号化された関数は暗号化されたオプコードと、もしあれば暗号化されていないパラメータとを含み、前記実行された関数と前記後続の暗号化された関数のオプコードの部分を復号に用いる、請求項6に記載の方法。
【請求項9】
前記後続の暗号化された命令の値と、前記実行された関数の値と、前記擬似乱数と、前記補償値の排他的論理和をとることにより復号を行う、請求項6に記載の方法。
【請求項10】
複数の分岐命令とラベル命令とを含む、コンパイルされたコンピュータコード命令のセットを暗号化して、実行時に命令ごとに復号する、コンパイルされたコンピュータコード命令の暗号化されたセットを求める装置であって、
前記コンパイルされたコンピュータコード命令のセットの実行は前記複数の分岐命令の各々から前記ラベル命令に直接続き、
暗号化されたラベル命令が少なくとも前記ラベル命令の値と、前記複数の分岐命令の選択された分岐命令の値に依存するように、チェイン化された暗号関数を用いて前記ラベル命令を暗号化し、
前記ラベル命令の直前に前記複数の分岐命令のどれが実行されても、実行時に、同じ結果となるように、前記複数の分岐命令のうちの前記選択された分岐命令以外の少なくとも1つの分岐命令の各々に、前記暗号化されたラベル命令の復号の調整に用いる補償値を関連づけるように構成されたプロセッサを有する装置。
【請求項11】
チェイン化された暗号関数を用いて暗号化された、コンパイルされたコンピュータコード命令のセットを復号する装置であって、
前記コンパイルされたコンピュータコード命令の実行時に、
実行した関数の補償値を求め、
前記コンパイルされたコンピュータコード命令の実行中に実行された関数に続く、後続の暗号化関数を求め、
前記後続の暗号化関数の擬似乱数を求め、
前記チェイン化された暗号化関数に対応する暗号化関数を用いて前記後続の暗号化された命令を復号する段階であって、前記暗号化関数は少なくとも前記後続の暗号化された命令と、前記実行された命令と、前記擬似乱数と、前記補償値とから後続の関数を生成するように構成されたプロセッサを有する装置。
【請求項12】
コンピュータにおいて実行したとき、請求項6乃至9いずれか一項の方法を実行するコンピュータコード命令を含むデジタルサポート媒体。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate


【公開番号】特開2010−140473(P2010−140473A)
【公開日】平成22年6月24日(2010.6.24)
【国際特許分類】
【外国語出願】
【出願番号】特願2009−261037(P2009−261037)
【出願日】平成21年11月16日(2009.11.16)
【出願人】(501263810)トムソン ライセンシング (2,848)
【氏名又は名称原語表記】Thomson Licensing 
【住所又は居所原語表記】1−5, rue Jeanne d’Arc, 92130 ISSY LES MOULINEAUX, France
【Fターム(参考)】