(57)【要約】  幾つかの実施形態が、コンピュータプログラムのセキュリティーを改善する保護変換の選択のために構成されたコンパイルデバイス１００に関する。コンパイルデバイスが、データフローグラフの部分に保護変換を割当て、少なくともセキュリティーターゲット及び／又はパフォーマンスターゲットを満たすデータフローグラフ及び割当てられた保護変換からコンピュータプログラム表現のコンパイル結果を取得するように構成される。
2021515314.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムのセキュリティーを改善する保護変換の選択のためのコンパイルデバイスであって、前記コンパイルデバイスが、
コンピュータプログラム表現を受信する入力インターフェースと、
プロセッサ回路とを備え、前記プロセッサ回路が、
前記コンピュータプログラム表現からデータフローグラフの表現を取得することと、
前記データフローグラフの部分に前記保護変換を割当てることであって、前記保護変換が、利用可能な前記保護変換のリストから選択される、割当てること、
前記データフローグラフ及び割当てられた前記保護変換に対するパフォーマンスレベル及びセキュリティーレベルを特定すること、及び
前記パフォーマンスレベル及び前記セキュリティーレベルがセキュリティーターゲット及び／又はパフォーマンスターゲットを満たしている場合、前記保護変換を前記割当てることを終了すること、を繰り返し行うことと、
少なくとも前記セキュリティーターゲット及び／又は前記パフォーマンスターゲットを満たす前記データフローグラフ及び割当てられた前記保護変換から前記コンピュータプログラム表現のコンパイル結果を取得することと、
を行う、コンパイルデバイス。
【請求項２】
利用可能な前記保護変換の前記リストにおける前記保護変換が、関連するセキュリティーレベルをもち、
前記コンパイルデバイスは、前記関連するセキュリティーレベルが前記セキュリティーターゲットを達成するように選択された前記データフローグラフの部分に初期保護変換を割当て、特定された前記パフォーマンスレベルが前記パフォーマンスターゲット未満である場合、１つ又は複数の割当てられた前記保護変換が、より低い関連するセキュリティーレベルを伴う前記保護変換に変更され、及び／又は、
前記コンパイルデバイスは、前記関連するセキュリティーレベルが前記セキュリティーターゲット未満であるように選択された前記データフローグラフの部分に初期保護変換を割当て、特定された前記パフォーマンスレベルが前記パフォーマンスターゲットより上である場合、１つ又は複数の割当てられた前記保護変換が、より高い関連するセキュリティーレベルを伴う前記保護変換に変更される、
請求項１に記載のコンパイルデバイス。
【請求項３】
利用可能な前記保護変換が、エッジに対する１つ又は複数の変数保護、及び／又は、前記データフローグラフのノードに対する演算保護を含む、
請求項１又は２に記載のコンパイルデバイス。
【請求項４】
前記プロセッサ回路が、前記データフローグラフにおける１つ又は複数のエッジ及び／又はノードに対する１つ又は複数の前記セキュリティーターゲットを取得し、前記セキュリティーターゲットが、前記データフローグラフにおける１つ又は複数の前記エッジ及び／又は前記ノードに対して取得された前記セキュリティーターゲットから取得される、
請求項１から３のいずれか一項に記載のコンパイルデバイス。
【請求項５】
前記保護変換が、
変数の符号化及び復号された前記変数に対する平文の演算実行と、
変数の符号化及び符号化された前記変数に対する符号化された演算実行と、
変数及び／又は演算に適用される準同形暗号化と、
定時間実行演算と、
のうちの１つ又は複数を含む、
請求項１から４のいずれか一項に記載のコンパイルデバイス。
【請求項６】
前記データフローグラフの部分が、複数の符号化領域のうちの前記符号化領域に割当てられ、同じ前記符号化領域に割当てられた前記データフローグラフの部分が、同じ前記保護変換に割当てられる、
請求項１から５のいずれか一項に記載のコンパイルデバイス。
【請求項７】
前記セキュリティーターゲットが、
機密性と完全性とを含むセキュリティータイプ、
ホワイトボックス、サイドチャネルタイム、サイドチャネル電力を含む攻撃タイプ、及び／又は、
高い、中程度、ベストエフォートを含む攻撃労力、
に対するターゲットを含む、
請求項１から６のいずれか一項に記載のコンパイルデバイス。
【請求項８】
前記パフォーマンスレベルが、前記データフローグラフにおける複数の種類の演算の数をカウントすることと、前記データフローグラフにおける複数の種類の前記演算が、割当てられた前記保護変換に従って、符号化された演算により置換されたときの想定されるコストを取得することとにより特定される、
請求項１から７のいずれか一項に記載のコンパイルデバイス。
【請求項９】
前記セキュリティーターゲットが、入力変数と秘密変数とを示し、
前記セキュリティーレベルが、
前記入力変数及び前記秘密変数の異なる値に対する前記コンピュータプログラムの複数回の実行を実現すること、前記コンピュータプログラムの実行中に前記入力変数に依存する前記コンピュータプログラムの少なくとも１つの変数の値を記録すること、並びに／又は、前記少なくとも１つの変数に対して実施される演算の演算時間を記録することと、
割当てられた前記保護変換を伴わない前記秘密変数と記録された前記値又は前記演算時間との間の相関を演算することと、
により推定される、
請求項１から８のいずれか一項に記載のコンパイルデバイス。
【請求項１０】
前記プロセッサ回路が、前記保護変換を適用する前に演算を組み合わせる、
請求項１から９のいずれか一項に記載のコンパイルデバイス。
【請求項１１】
前記データフローグラフにおける演算ノードが、関連する符号化メモリ要求を含み、
前記プロセッサ回路が、最小の関連する前記符号化メモリ要求から最大まで、前記演算ノードに対して異なる符号化を導入し、最大メモリ量が割当てられるまで符号化された前記演算ノードにメモリを割当てる、
請求項１から１０のいずれか一項に記載のコンパイルデバイス。
【請求項１２】
コンピュータプログラムのセキュリティーを改善する保護変換の選択のためのコンパイル方法であって、前記コンパイル方法が、
コンピュータプログラム表現を受信するステップと、
前記コンピュータプログラム表現からデータフローグラフの表現を取得するステップと、
前記データフローグラフの部分に前記保護変換を割当てるステップであって、前記保護変換が、利用可能な前記保護変換のリストから選択される、割当てるステップ、
前記データフローグラフ及び割当てられた前記保護変換に対するパフォーマンスレベル及びセキュリティーレベルを特定するステップ、及び、
前記パフォーマンスレベル及び前記セキュリティーレベルがセキュリティーターゲット及び／又はパフォーマンスターゲットを満たしている場合、前記保護変換を前記割当てるステップを終了するステップ、を繰り返し行うステップと、
少なくとも前記セキュリティーターゲット及び／又は前記パフォーマンスターゲットを満たす前記データフローグラフ及び割当てられた前記保護変換から、前記コンピュータプログラム表現のコンパイル結果を取得するステップと、
を有する、コンパイル方法。
【請求項１３】
請求項１２に記載の方法を実施することをプロセッサシステムにさせる命令を表す一時的な、又は非一時的なデータを含む、コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイルデバイス、コンパイル方法、及びコンピュータ可読媒体に関する。
【背景技術】
【０００２】
プログラムにより使用又は処理されるデータは、高い価値をもち得る。例えば、所与の機能を実装することを可能にする機械学習アルゴリズムは、機械学習工程中に学習された、例えば機械学習モデルの非常に特有の重みを使用する。プログラムのリバースエンジニアリングがそれらの重みを明らかにし得る結果、機械学習アルゴリズムを訓練するために使用されるデータにアクセスすることも、訓練工程を実現する演算能力も必要とせずに、攻撃者はアルゴリズムの機能を簡単に複製し、又は改善し得る。同様に、幾つかのアプリケーションは例えば秘密の暗号鍵といった秘密のデータを使用して演算する。権限の無い使用からそれらの鍵を保護することは重要である。
【０００３】
秘密情報を明らかにするリバースエンジニアリングからコンピュータプログラムを保護する様々な手法が存在する。例えば、様々な知られた難読化方法が、コンピュータプログラムにおけるデータフローを追うことを困難にする。
【０００４】
更に、データであって、そのデータに対してコンピュータプログラムが作用するデータ、例えば変数に符号化が適用される。このような保護されたプログラムをリバースエンジニアリングすることを試みる攻撃者は、プログラムがどのデータに作用するかを知らない。例えば、様々なホワイトボックス符号化が使用される。例えば、完全準同形暗号化が、アルゴリズムを保護するために使用され得る。しかし、プログラムに対するこれらの符号化技術の自動的な適用はリスクを抱えている。
【０００５】
しかし、プログラムに対するこれらの技術の直接的な適用は単純ではない。一方で、プログラム全体に対する符号化の適用が、大きいパフォーマンス上のペナルティーをもたらし得るのに対し、安全性のより低い符号化の適用は、セキュリティーのリスクをもたらし得る。
【０００６】
知られたコンパイラが米国特許出願第２００３２２１１２１（Ａ１）号において説明されている。知られたコンパイラは、改ざん及びリバースエンジニアリングからソフトウェアを保護する。観測可能な演算が元のソフトウェアコードの意図から解離させられるように、プログラムのデータフローが変換される。意図は、コードの実行を観察することによりデータフローを理解及び復号することが困難であると攻撃者が気付くことである。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
保護されたプログラムに使用される保護を自動的に決定する、又は少なくともそれに役立つデバイス及び方法を提供することが有益である。
【課題を解決するための手段】
【０００８】
これらの、及び／又は他の目的を達成するために、コンピュータプログラムのセキュリティーを改善する保護変換の選択のために構成されたコンパイルデバイスが提案される。コンパイルデバイスは、
−  コンピュータプログラム表現を受信するように構成された入力インターフェースと、
−  プロセッサ回路とを備え、前記プロセッサ回路は、
−  コンピュータプログラム表現からデータフローグラフの表現を取得することと、
−  データフローグラフの部分に保護変換を割当てることであって、保護変換が、利用可能な保護変換のリストから選択される、割当てること、
−  データフローグラフ（２００）及び割当てられた保護変換に対するパフォーマンスレベル及びセキュリティーレベルを特定すること、及び、
−  パフォーマンスレベル及びセキュリティーレベルが、セキュリティーターゲット及び／又はパフォーマンスターゲットを満たしている場合、保護変換を割当てることを終了すること、を繰り返し行うことと、
−  少なくともセキュリティーターゲット及び／又はパフォーマンスターゲットを満たすデータフローグラフ及び割当てられた保護変換からコンピュータプログラム表現のコンパイル結果を取得することと、
を行うように構成されている。
【０００９】
利用可能な様々なタイプの保護変換が存在し、その保護変換のうちの幾つかは他より良い保護を与え、その保護変換のうちの幾つかは他より多くのリソースを要求し、例えば、それらはより良く、又はより悪く実施する。異なる保護変換が試みられ、パフォーマンス及びセキュリティーに対して評価されるので、改善された選択が行われる。
【００１０】
コンパイルデバイスは電子デバイスであり、例えば、コンパイルデバイスは、コンピュータ、サーバー、デスクトップコンピュータ、ラップトップなどである。コンパイルデバイスは、他のプログラミングツール、又は更なるコンパイルデバイス、例えばリンカーなどと組み合わされる。
【００１１】
本明細書において説明されているコンパイル方法は、広範囲の実用的な用途に適用されてよい。このような実用的な用途は、暗号処理用途、例えば、デジタルメッセージの暗号化、暗号解読、及び認証の難読化を有する。例えば、コンパイル方法は、独自アルゴリズム、例えば学習アルゴリズム、画像処理、音声処理などの難読化に適用される。
【００１２】
本発明による方法は、コンピュータ実装方法としてコンピュータにおいて、若しくは、専用ハードウェアにおいて、又は、両方の組合せとして実装される。本発明による方法のための実行可能コードは、コンピュータプログラムプロダクトに格納される。コンピュータプログラムプロダクトの例として、メモリデバイス、光記憶デバイス、集積回路、サーバー、オンラインソフトウェアなどが挙げられる。好ましくは、コンピュータプログラムプロダクトは、プログラムプロダクトがコンピュータにおいて実行されたときに本発明による方法を実施するためのコンピュータ可読媒体に記憶された非一時的プログラムコードを含む。
【００１３】
好ましい実施形態において、コンピュータプログラムは、コンピュータプログラムがコンピュータにおいて動作させられたときに本発明による方法のすべてのステップを実施するように適応されたコンピュータプログラムコードを含む。好ましくは、コンピュータプログラムは、コンピュータ可読媒体において具現化される。
【００１４】
本発明の別の一態様は、コンピュータプログラムをダウンロードに利用可能にする方法を提供する。コンピュータプログラムが、例えばＡｐｐｌｅのＡｐｐ  Ｓｔｏｒｅ、ＧｏｏｇｌｅのＰｌａｙ  Ｓｔｏｒｅ、又はＭｉｃｒｏｓｏｆｔのＷｉｎｄｏｗｓ  Ｓｔｏｒｅにアップロードされるとき、及び、コンピュータプログラムがこのようなストアからのダウンロードのために利用可能であるとき、この態様が使用される。
【００１５】
本発明の更なる詳細、態様、及び実施形態は、図面を参照しながら、単なる例示として説明される。図中の要素は簡潔かつ明確であるように描かれており、一定の縮尺で描かれているとは限らない。図中、既に説明されている要素に対応した要素が、同じ参照符号を付されている場合がある。
【図面の簡単な説明】
【００１６】
【図１ａ】コンパイルデバイスの一実施形態の例を概略的に示す図である。
【図１ｂ】コンパイルデバイスの一実施形態の例を概略的に示す図である。
【図１ｃ】コンパイルデバイスの一実施形態の例を概略的に示す図である。
【図２ａ】データフローグラフの一実施形態の例を概略的に示す図である。
【図２ｂ】データフローグラフの一実施形態の例を概略的に示す図である。
【図３ａ】利用可能な保護変換のリストにおける保護変換の選択を最適化する方法を示す図である。
【図３ｂ】利用可能な保護変換のリストにおける保護変換の選択を最適化する方法を示す図である。
【図４ａ】データ符号化及び復号システムの一実施形態の例を概略的に示す図である。
【図４ｂ】データ暗号化及び暗号解読システムの一実施形態の例を概略的に示す図である。
【図５】符号化されたソフトウェアの一実施形態の例を概略的に示す図である。
【図６】コンパイル方法の一実施形態の例を概略的に示す図である。
【図７ａ】一実施形態によるコンピュータプログラムを含む書き込み可能部分を含むコンピュータ可読媒体を概略的に示す図である。
【図７ｂ】一実施形態によるプロセッサシステムの表現を概略的に示す図である。
【発明を実施するための形態】
【００１７】
本発明は、多くの異なる形態をとる実施形態を許容するとともに、本開示が本発明の原理の例とみなされるのであり、示される、及び説明される特定の実施形態に本発明を限定することを意図したものではないという理解のもとに、１つ又は複数の特定の実施形態が図面に示され、本明細書において詳細に説明される。
【００１８】
以下、理解のために、動作中における実施形態の要素が説明される。しかし、それぞれの要素により実施されるように説明される機能を実施するように、それぞれの要素が構成されていることが明らかとなる。
【００１９】
更に、本発明は実施形態に限定されず、本発明は、本明細書において説明されている、又は、相互に異なる従属請求項に記載されている新しい特徴又は特徴の組合せの各々に内在する。
【００２０】
ここまでに示されているように、権限の無いリバースエンジニアリングからコンピュータソフトウェアを保護する多くの理由が存在する。例えば、ソフトウェアは、暗号処理演算、例えば、暗号化／暗号解読演算又は署名演算を表現する。暗号処理演算に必要な秘密情報を秘密のまま維持する要望が存在する。ソフトウェアは、独自アルゴリズム、例えば、（訓練された）ニューラルネットワーク、画像処理アルゴリズムなどを更に備えてよい。ソフトウェアに組み込まれたノウハウを秘密のまま維持する要望が存在する。これを行う１つのアプローチが、符号化すること、例えばソフトウェアにおいて使用されるデータを暗号化することである。符号化されたデータは、適切に適応されたソフトウェア演算子により演算される。例えば、論理演算又は算術演算などが、例えばテーブルとして、又は有限体上の多項式として符号化されるので、論理演算又は算術演算などが符号化されたデータに作用し得る。このような演算は、ホワイトボックス暗号法の分野において知られている。しかし、これらの技術は、暗号法以外にも同様に適用され得る。符号化されたデータに対して演算するために、データを符号化すること、及び、テーブルを使用することの例が、Ｓ．Ｃｈｏｗらによる「Ｗｈｉｔｅ−ｂｏｘ  Ｃｒｙｐｔｏｇｒａｐｈｙ  ａｎｄ  ａｎ  ＡＥＳ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ」に記載されている。
【００２１】
様々なタイプのソフトウェアにデータの符号化を適用することに大きい将来性が存在するので、データの符号化を自動化する要望が存在する。しかし、これがそれほど簡単ではないことが分かった。実施形態は、符号化される変数及び演算を自動的に決定するシステム及び方法を説明している。
【００２２】
想定される使用例が図４ａに示される。図４ａは、ノード４１０、例えばコンピュータ、及び、異なるソフトウェア／ハードウェアブロックへの符号化の想定されるディストリビューションを示す。ノード４１０は、データ生成器４２０、例えばセンサーを備える。ノード４１０は、生成器４２０により生成されたデータにアルゴリズムを適用し、アルゴリズム４３２及び４３３が示されている。例えば、アルゴリズム４３２は、信号処理アルゴリズムであり、アルゴリズム４３３は、秘密鍵を使用したＡＥＳ暗号化である。リバースエンジニアリングされることから独自の信号処理アルゴリズムを保護することが目標とされる。暗号化の秘密鍵が攻撃者により取得されることから暗号化、例えばＡＥＳ暗号化を保護することが目標とされる。これらの目標を達成するために、ノード４１０は、データであって、そのデータにノード４１０が演算をするデータの符号化を使用する。３つの異なる符号化、すなわち、符号化４８１、符号化４８２、及び符号化４８３が示される。この場合において、ノード４１０の出力は、符号化４８３に従って符号化される。概して、これが必須というわけではなく、出力は、符号化されていなくてよく、例えば、この場合、ＡＥＳのもとでのみ暗号化される。ノード４１０の出力は、例えばサーバーにおいて動作するソフトウェア４６０により更に処理される。本例において、ソフトウェア４６０は、例えば入来データを復号するために、少なくとも部分的に符号化４８３を使用するが、符号化されないデータに対して部分的に動作してもよい。
【００２３】
別の例が図４ｂに示される。昨年中に、完全準同形スキーム及び符号化スキームに大幅な進展があった。準同形スキームを使用することが符号化されたデータに対する演算をより簡単にする。最初に、２００９年にＧｅｎｔｒｙにより完全準同形暗号化スキームが提案された。このようなＦＨＥスキームは、両方の基本的な代数的演算、すなわち加算及び乗算を順守している。それ以降、多くの他のスキームが提案されている。Ｓｉｍｐｌｅ  Ｅｎｃｒｙｐｔｅｄ  Ａｒｉｔｈｍｅｔｉｃ  Ｌｉｂｒａｒｙ（ＳＥＡＬ）が、適切に設計された、及びドキュメント化された準同形暗号化ライブラリを提供することを目的とした実用的なライブラリである。ＳＥＡＬ自体はＲＬＷＥ問題に依存したＦＶ準同形暗号化スキームを使用する。任意の（完全）準同形暗号化スキームにおいて、３つの鍵、すなわち、
−  平文を暗号文に暗号化するために使用される公開鍵
−  暗号化された領域において演算（例えば乗算）を実施するために使用される評価鍵
−  ユーザーが出力を暗号解読することを可能にする秘密鍵
が関与する。
【００２４】
想定される使用例が図４ｂに示される。図４ｂは、ノード４１０、例えばコンピュータ、及び、異なるソフトウェア／ハードウェアブロックへの、符号化／復号、暗号化／暗号解読関数、及び、秘密鍵／公開鍵／評価鍵のディストリビューションを示す。ノード４１０は、データ生成器４２０、例えばセンサーを備える。データ生成器は公開鍵ｐｕｂＫを使用してデータを暗号化する。ソフトウェア４３０は、評価鍵（ｅｖａｌｋ）を使用して暗号化された領域においてソフトウェア上で演算を実施する。場合によっては複数の評価鍵を使用する、複数のアルゴリズムが存在する。演算の結果はクラウド４５０において動作するソフトウェア４６０に送信される。例えば、ソフトウェア４６０は、セキュア環境において動作するという信頼性がある。ソフトウェア４６０は、暗号解読アルゴリズム４６２を適用することにより演算結果を暗号解読する。例えば、暗号解読は、何らかのセキュア要素４７２に記憶された秘密鍵を使用する。したがって、ソフトウェア４３０は、暗号化されたデータに対して少なくとも部分的に動作する。
【００２５】
（Ｆ）ＨＥが使用される場合、３要素の組（秘密鍵、公開鍵、評価鍵）が生成され、異なるソフトウェア及びハードウェアコンポーネントにわたってディストリビューションされ得る。例えば、次のとおりである。
−  公開鍵は、データを生成することを担当するソフトウェア／ハードウェア要素にディストリビューションされ得る。この鍵に対して保護は要求されない。
−  評価鍵は、データを処理することを担当するソフトウェア／ハードウェアコンポーネントにディストリビューションされ得る。この鍵に対して保護は要求されない。一実施形態において、この鍵は、暗号解読が実現可能であるように、生成されるノイズが十分小さい限り使用される。
−  秘密鍵は、入力データを暗号解読することを担当するソフトウェアに結び付けられたセキュア要素に配備され得る。
【００２６】
別の用途が図５に示される。図５は、符号化された領域における演算の表現を概略的に示す。ホワイトボックス暗号法の分野から生まれた符号化スキームが、アルゴリズム及びそのデータのリバースエンジニアリングをより困難にするために設計されている。符号化は、例えば、（ｉ）ニブル、（ｉｉ）剰余数系、又は（ｉｉｉ）代数変換などに基づき得る。図５は、符号化された領域において実現される演算の抽象的表現を示す。整数環（Ｒ，＋，＊）上の評価関数ｆ（）の代わりにＲの元が、変換Ｔ（）により異なる領域Ａに変換され、その結果、同じ関数ｆ（）が、Ａにおいて表現される元と、代替的な演算
【数１】
2021515314.tif 000003
とに基づいて実施され得る。この実施はＦ（）と表記される。このようなスキームは、Ｔ（）が、データを暗号化するための公開鍵の使用を表現し得、Ｆ（）において実現される演算が、符号化された演算及び何らかのタイプの評価鍵を関与させ、及び、逆変換が秘密鍵の使用に等しいという意味で、（Ｆ）ＨＥスキームとある程度同様である。しかし、ホワイトボックス暗号法では、コード自体に変換Ｔ（）及びＴ−１（）の使用をマージさせることが通常である。抽出の困難さは、例えば、それらを実装する大きいテーブルなどをリバースエンジニアリングすることの困難さに依存する。
【００２７】
一実施形態において、コンパイラは、プログラムＰを自動的に生成するように構成され、その中で、コンピュータプログラム、その変数、及び／又はその処理されたデータが保護される。例えば、コンパイルされたプログラムの部分は、暗号化された領域において実行する。これは、プログラマーが多くの場合、平文領域においてプログラムをコーディングし、後においてのみ、プログラマーは、暗号化された領域においてこのようなプログラムを実行することに興味を示すので、有益である。暗号化された領域におけるプログラムＰの生成は、コンパイラにより実現される。
【００２８】
図１ａは、コンパイルデバイス１００の一実施形態の例を概略的に示す。
【００２９】
コンパイルデバイス１００は、コンピュータプログラム表現を受信するように構成された入力インターフェース１１０を備える。コンパイルデバイス１００は、コンピュータプログラムのセキュリティーを改善するように保護変換を選択するように構成される。例えば、コンピュータプログラムは、高レベルコンピュータプログラムにより、例えばＣ、Ｐａｓｃａｌ、Ｃ＃などにより表現され、例えば記述される。例えば、コンピュータプログラム表現は、ソースコードである。コンピュータプログラム表現は、例えばマクロを実行することにより、又はコンピュータコードをパースすることによりコンピュータプログラムコードを前処理するように構成される別のコンパイルデバイスの出力である。例えば、コンピュータプログラムコード表現は、高レベルコンピュータコードのデータフローグラフの表現である。コンピュータプログラム表現は、コンパイラ中間言語に従ったものであってもよい。
【００３０】
入力インターフェース１１０は、通信インターフェースである。コンパイルデバイス１００は、（図１ａに示されていない）コンピュータネットワークを介して他のコンピュータデバイスと通信する。コンピュータネットワークは、インターネット、イントラネット、ＬＡＮ、ＷＬＡＮなどである。コンピュータネットワークは、インターネットである。コンピュータネットワークは、全体的に、又は部分的に有線であってよく、及び／又は、全体的に、又は部分的に無線であってもよい。例えば、コンピュータネットワークは、Ｅｔｈｅｒｎｅｔ接続を含む。例えば、コンピュータネットワークは、例えば、Ｗｉ−Ｆｉ、ＺｉｇＢｅｅなど無線接続を含む。コンパイルデバイスは、必要に応じて他のデバイスと通信するように、例えばコンピュータプログラム表現を受信するように構成された接続インターフェースを備える。例えば、接続インターフェースは、コネクタ、例えば有線コネクタ、例えば、Ｅｔｈｅｒｎｅｔコネクタ、又は、無線コネクタ、例えばアンテナ、例えばＷｉ−Ｆｉ、４Ｇ又は５Ｇアンテナを備える。コンピュータプログラム表現は、電子的形態により受信される。
【００３１】
コンパイルデバイスの実行は、プロセッサ回路において実装され、その例が本明細書に示される。図１ａは、プロセッサ回路の機能ユニットである機能ユニットを示す。例えば、図１ａは、プロセッサ回路の可能な機能的体系の設計図として使用される。プロセッサ回路は図１ａにおけるユニットとは別に図示されていない。例えば、図１ａに示される機能ユニットは、デバイス１００に、例えばデバイス１００の電子メモリに記憶された、及び、デバイス１００のマイクロプロセッサにより実行可能なコンピュータ命令において全体的に、又は部分的に実装されてよい。ハイブリッド型の実施形態において、機能ユニットは、ハードウェア、例えばコプロセッサにおいて部分的に、及び、デバイス１００に記憶された、及び、デバイス１００において実行されるソフトウェアにおいて部分的に実装される。図１ｂは、コンパイルデバイス１００の可能な実施形態を示す。図１ｂは、入力インターフェース１１０、プロセッサ回路１６０、及びメモリ１６１を備えるコンパイルデバイス１００を示す。メモリ１６１は、データ及び／又は命令ストレージに対して使用される。
【００３２】
図１ａに戻る。コンパイルデバイス１００は、例えば入力インターフェース１１０から受信されたコンピュータプログラム表現を記憶するためのストレージ１２０を備える。ストレージ１２０は、例えばデータフローグラフなどの中間表現を記憶するために使用される。
【００３３】
コンパイルデバイス１００は、パース部１３０、オプティマイザー部１４０、及びコンパイルユニット１５０を備える。パース部１３０は、データフローパーサー１３２及び符号化分析器１３４を備える。パース部１３０及び符号化分析器１３４は、コンピュータプログラム表現からデータフローグラフの表現を一緒に取得し、データフローグラフにおけるノードの少なくとも一部が、符号化されるとして、又は、符号化されないとしてマーキングされる。例えば、データフローパーサー１３２は、コンピュータプログラム表現からデータフローグラフを取得するように構成される。符号化分析器１３４は、セキュリティーターゲット及び／又はパフォーマンスターゲットをデータフローグラフの１つ又は複数の部分に関連付けるように構成される。
【００３４】
例えば、コンピュータプログラムのコンパイルフラグ又は他の注釈が規定され、これを通してユーザーが、プログラムをコンパイルする前に保護又はパフォーマンス目標を設定し得る。一実施形態において、コンパイラは、プログラムを分析してプログラムの中間表現を取得し、繰り返して、パフォーマンスを推定し、及び／又は、想定されるセキュリティーレベルを推定する。パフォーマンスの推定は、例えば演算をカウントすることにより静的に、又は、例えばプログラムをシミュレーションすることにより動的に行われる。セキュリティーの推定は、例えばそれぞれのセキュリティー手段に関連した固定のセキュリティーレベルを参照することにより静的に、又は、プログラムのシミュレーションに自動化された攻撃を適用することにより動的に行われる。例えばコンパイルフラグを通してユーザーにより設定された目標を達成する異なるタイプの符号化及び保護が適用されるまで、又は、ターゲットとされるコンパイルフラグが実行不可能であるとシステムが判定するまで繰り返しが行われる。
【００３５】
すべてのデータが同等に重要というわけではないので、セキュリティー目標は重要である。例えば、暗号処理データ、例えば鍵データは、アルゴリズムの難読化に対する符号化より高いセキュリティーレベルを必要とする。注釈は、例えば、変数、関数、マクロなどのプログラム構築前のプラグマとして含まれ得る。
【００３６】
一実施形態において、コンパイルデバイスは、どのノードが保護されるか、例えば符号化されるか、どのノードが符号化されることを必要としないかを特定する。更に、中間表現、例えばデータフローグラフが、符号化されるノード及び符号化されないノードのディストリビューションを改善するように補正される。ノードに、保護される、例えば符号化される、及び保護されない、例えば符号化されないことを割当てる特定の有益な手法は、同じ出願人により出願された欧州特許出願（代理人整理番号２０１７ＰＦ０２４５２）の方法を使用することである。例えばプログラムにおいて符号化される変数及び演算を自動的に決定することが開示されている。これは、プログラムの中間表現において危険な状況を探索することにより実行される。攻撃者がコードフローなどを簡単にトレースすることができないように、コード複製及び演算の後方伝播により危険な状況が解決される。
【００３７】
符号化分析器１３４の出力は、どの変数が保護されなければならないか、どの変数がプログラムにおいて保護されてはならないかを含み、更に、符号化分析器１３４は、変数に対するセキュリティーターゲット及び／又はパフォーマンスターゲットを指定する。後者は、セキュリティーターゲット及び／又はパフォーマンスターゲットをデータフローグラフの部分に関連付けることにより表される。
【００３８】
符号化分析器１３４は、パフォーマンス／セキュリティー目標をどれほど最良に達成するかを指定することを必要としない。異なるタイプの保護、例えば符号化がセキュリティーとパフォーマンスとに関連した異なるトレードオフを含むので、保護を選択することは取るに足らないタスクではない。多くの場合、より秘密性の高い符号化は、より高いＣＰＵ又はメモリ要求を要求する。更に、異なるタイプの符号化は、より多い、又は、より少ないいわゆるコピーファイネットワーク、例えばプログラムにおけるデータムのフローのみに関連した部分に適用され得るが、これは、コンパイル中の演算パフォーマンスに影響を与え、及び、実行中のリソース、特にプログラムサイズに影響を与える。
【００３９】
例えば、データフローグラフは、静的単一代入（ＳＳＡ）形成である。これは、分析及び最適化を実施するためのコード表現としてソフトウェアコンパイラにより使用されるよく知られた、一般的な、及び効果的なフローエクスポーズドフォームである。静的単一代入に基づく効果的なアルゴリズムが、定数伝播、冗長演算検出、デッドコード除去、誘導変数除去、及び他の要求を解決するために発展してきた。
【００４０】
特にＳＳＡ形式でデータフローグラフを取得するための、効果的なアルゴリズム、及び、データフローグラフに基づいてコンピュータプログラムを最適化及び／又はコンパイルすることが知られている。好ましい実施形態が静的単一代入に関連して説明される。標準的なコンパイラに対する背景を提供する標準的な参考文献は、「Ａｄｖａｎｃｅｄ  Ｃｏｍｐｉｌｅｒ  Ｄｅｓｉｇｎ  ＆  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ」、１９９７、Ｓｔｅｖｅｎ  Ｍｕｃｈｎｉｃｋ著（ＩＳＢＮ  １−５５８６０−３２０−４）である。
【００４１】
したがって、部分的なコンパイルの後に、静的単一代入（ＳＳＡ）プロパティをもつデータフローグラフの表現が取得され、すなわち、各変数が厳密に１回だけ代入され、及び、各変数が使用される前に各変数が規定される。このグラフにおいて、エッジは（一時的な）変数でありノードは、演算（＋、−、＊、…）、メモリアクセス（＊ｐ＝…）などである。
【００４２】
ＳＳＡ形式によるデータフローグラフの例が図２ａに示される。実際には、データフローグラフは、遥かに大きく、この場合、図２ａは、より大きいデータフローグラフの細部とみなされる。データフローグラフは、プログラム全体のデータフローグラフである必要はないが、例えばライブラリ、ルーチン、基本ブロックなどといった部分のデータフローグラフである。
【００４３】
ＳＳＡグラフ、特にＳＳＡグラフ２００は、コンピュータプログラムコードの中間形式、例えばソースコードを表す、あるタイプのデータフローグラフである。ＳＳＡグラフは有向である。（ノードとも呼ばれる）ＳＳＡグラフの頂点は演算を表す。ＳＳＡグラフのエッジは、例えば仮想レジスタ、又はメモリ、例えばメモリの選択された部分が挙げられるデータホルダー、例えばレジスタを表す。図２ａは、コンピュータプログラム（フラグメント）に対応した例示的なＳＳＡグラフを示す。本明細書において図形的に示されているＳＳＡグラフは、コンパイルデバイス１００の電子メモリにおいてデータ構造体として表されることに留意されたい。
【００４４】
ＳＳＡグラフにおける２タイプのノードは特別なもの、すなわち、コピーノード及びファイノードである。ＳＳＡグラフは、入来値を１つ又は複数のノードにディストリビューションするコピーノードを含む。図２ａは、１つのこのようなコピーノード、すなわちコピーノード２１４を示す。ファイ演算は、グラフにおける制御フローによりもたらされるデータ選択を実装するために使用される。例えば、ｚ＝ファイ（ａ，ｂ）は、ａに対する最新の代入が、ｂに対する最新の代入より最近である場合、ａがｚに代入されなければならないことを意味する。ｂに対して逆のことが言える。例示的なグラフ２００は、２つのファイノード、すなわちファイノード２１２及びファイノード２１６を含む。好ましくは、ファイノードがある種の符号化により保護される場合、同じ符号化スキームに従ってすべての入力が符号化されることを確実なものとすることが望ましい。
【００４５】
パース及びＳＳＡ変換（必要な場合）の後に、結果として得られるデータフローグラフは、ファイノード及びコピーノードのみからなるサブグラフ、又はサブネットワーク−いわゆるコピーファイネットワーク−を含む。このようなサブグラフの境界は、例えば算術演算、メモリ演算などの異なるタイプのステートメントを使用して、ノードにより表される。後者は、演算ノードと呼ばれる。
【００４６】
実行中にライブ状態である、及び、複数のソース及び複数のターゲットを含むデータムは、コピーファイネットワークとしてＳＳＡデータフローグラフにおいて視認可能である。したがって、データフローがＳＳＡフォーマットである場合、コピーファイネットワークとして複数のソース及び複数のターゲットを使用してデータムが識別される。しかし、これが必須というわけではない。例えば、異なるタイプのデータフローグラフは、複数のソース及び複数のターゲットを使用してデータムを識別する異なる手法をとる。本明細書において説明されている好ましい実施形態は、ＳＳＡ型データフローグラフを使用するので、本明細書ではコピーファイネットワーク、又はコピーファイサブグラフが引き続き参照される。
【００４７】
データフローグラフ２００は、３つのノードを含むコピーファイネットワーク２１０を示す。図２ａにおける他のノードは、他の演算を表す。例えば、ノード２２２及び２３４は、インクリメント演算、例えば「ｉ：＝ｊ＋１」を表す。例えば、ノード２２４は、メモリからの読み出しの演算を表す。例えば、ノード２２６は、パラメータ入力、例えばパラメータからルーチンへの入力を表す。例えば、ノード２３６は、算術演算を表す。コピーファイネットワークにおけるノードは、図２ａにおいて斑点パターンを付してマーキングされている。図２ａは、コピーファイネットワークの入力側におけるノード２２０、及び、コピーファイネットワークの出力側におけるノード２３０を示す。
【００４８】
符号化分析器１３４は、符号化されるとして、又は、符号化されないとして、データフローグラフにおけるノードをマーキングし、セキュリティーターゲット及び／又はパフォーマンスターゲットを更に関連付ける。例えば、これは、例えばデータフローグラフに対するパーシングと一緒に、コンパイルパスにおいて実行される。フロー制御演算、例えば、コピー又はファイノードはマーキングされることを必要としない。オプティマイザー部１４０は、例えば更にマーキングするとして、特定の保護変換をデータフローグラフの部分に更に関連付ける。
【００４９】
符号化される、又は、符号化されないとしての、ノードの、及び特定の保護変換のマーキングは、コンパイルユニット１５０により後で使用される。例えば、コンパイルユニット１５０は、符号化されないノードに作用するようにネイティブな演算を使用する。例えば、インクリメント演算は、例えばマシン「ＩＮＣ」命令により、コンパイルユニット１５０により実装され得る。符号化された演算に対して、コンパイルユニット１５０は、符号化された演算を使用し、例えば、演算を実施するようにライブラリがコールされる。例えば、コンパイルユニットは、符号化されたインクリメントを実施するために「ＥＮＣ＿ＩＮＣ（）」演算をコールする。符号化された関数は、符号化されたデータを受信して、符号化されたデータを出力する。例えば、符号化された演算は、テーブルとして、又は有限体上の多項式として実装される。
【００５０】
プログラム、その変数、及び／又は、処理されたデータを保護するために、暗号化された領域において実行されるプログラムＰを自動的に生成する工程を含むことが望ましい。例えば、プログラマーは、平文領域においてプログラムを記述する。後においてのみ、プログラマーは、暗号化された領域においてプログラムを実行することに興味を示す。自動的に、又は、手動により、又は、部分的に手動により／部分的に自動的にノードをマーキングすることにより、コンパイラユニット１５０は正しい符号化された、又は符号化されない関数をコールするために必要な情報を含む。更に、これらのことに多くの注意を払わなくても、プログラムの開発は行われ得る。
【００５１】
例えば、一実施形態において、コンパイルデバイスは、符号化領域の数ｎを選択し、符号化領域の数に演算を区切る。数を増やすことは、例えばホワイトボックス攻撃に対するセキュリティーを高めるが、数を増やすことは、プログラムのフットプリントを増やすことにもなる。
【００５２】
符号化される、又は、符号化されないとしてノードをマーキングすることは、符号化ルールに従って行われる。例えば、ルールベースは、幾つかのノードが符号化されないことを要求する。例えば、メモリアクセス、外部関数コール、及びパラメータに対応したノードは、符号化されないとしてマーキングされる。例えば、一実施形態において、幾つかのノードが、ルールに従って符号化されないとしてマーキングされ、残りのすべてのノードが、符号化されるとマーキングされる。
【００５３】
例えば、一実施形態において符号化に対する制約はインターフェースに由来し、例えば、コンピュータコードは使用される符号化に適合しないデバイス、メモリ、又は、他のソフトウェアとインターフェース接続しなければならない。符号化に対する制約は、使用されるコンパイルユニット又はライブラリにおける制約に由来する場合もある。例えば、幾つかの演算は、例えば浮動小数点数に対する演算など、符号化された形態においてサポートされない。
【００５４】
例えば、一実施形態において、２ステップアプローチが使用される。例えばメモリアクセス、外部関数コールなどに対応したものといった、幾つかのノードは、ルールに従って符号化されないものでなければならない。他のすべてのノードは、最初に、符号化されるとしてマーキングされる。更なるルール、例えばヒューリスティックに従って、幾つかのノードは、それらが最初に符号化されていた場合でも、符号化されないとしてマーキングされる。例えば、パース後に幾つかの演算が暗号化された形態において実施されることができないこと、例えばライブラリがそれらをサポートしていないことが判明する。例えば、幾つかのノードは、浮動小数点数に対する演算に対応するが、符号化された浮動小数点演算が利用可能ではない場合がある。コンパイルユニットが警告又は出力ログなどを出力することにより、プログラマーは、どの演算が符号化された形態において実施されるか、及び、どの演算が符号化された形態において実施されないかを検証し得る。一実施形態において、プログラマーは、コンピュータプログラム表現にコンパイラディレクティブを挿入する。例えば、ソースコードにおいてプログラマーは、どの変数が符号化されるか、又は、どの変数が符号化されないかを示す。一実施形態において、コピーファイノードを除くすべてのノードが、符号化される、又は符号化されないとマーキングされる。
【００５５】
一実施形態において、パース部１３０は、更に、符号化に適応するために、例えばファイノードが複数の異なる符号化を受信することを回避するために、又は、危険なことが知られているデータフローグラフにおけるサブグラフを回避するために、データフローグラフを修正する。
【００５６】
コンパイルデバイス１００は、オプティマイザー部１４０を備える。オプティマイザー部１４０は、データフローグラフの部分に保護変換を割当てるように構成される。例えば、デバイス１００は、利用可能な保護変換のリストを含み、利用可能な保護変換のリストから、オプティマイザー部１４０は保護変換を選択する。
【００５７】
オプティマイザー部１４０は、パフォーマンス分析器１４２とセキュリティー分析器１４４とを備える。パフォーマンス分析器１４２は、データフローグラフ２００及び割当てられた保護変換に対するパフォーマンスレベルを特定するように構成される。パフォーマンスは、典型的には、時間パフォーマンスに関連しているが、サイズパフォーマンス、例えばコンパイルされたプログラムのサイズに関連していてもよい。パフォーマンスのハイブリッド型の定義も可能である。
【００５８】
パフォーマンスレベルが特定され得る幾つかの手法が存在する。例えば、パフォーマンス分析器１４２は、データフローグラフにおける複数のタイプの演算の数をカウントして、データフローグラフにおける複数のタイプの演算が、割当てられた保護変換に従って、符号化された演算により置換されるときの想定されるコストを取得するように構成される。
【００５９】
例えば、パフォーマンス分析器１４２は、データフローグラフ２００におけるノードの数、及び、それらのノードが実施する演算タイプをカウントする。各保護手段は、利用可能な保護手段のリストと一緒に記憶される関連するパフォーマンス上のペナルティーを伴う。例えば、パフォーマンス分析器１４２は、インクリメント演算である１５個のノードが存在することを特定し、そのうちの１０個が、インクリメント演算をＥＮＣ＿ＩＮＣテーブル参照により置換することにより符号化され、そのうちの２つが、マスクされるが平文データに対して演算し、及び、そのうちの３つが保護されない。関連するパフォーマンスは、それぞれ、例えば、１．６、０．４及び０．１であり、合計で１０＊１．６＋２＊０．４＋３＊０．１＝１７．１となる。代替的に、パフォーマンス上のペナルティーが推定され、この場合においては、それぞれ、１．５、０．３及び０であり、合計で１０＊１．５＋２＊０．３＝１５．６となる。これは、ループを考慮しないが、演算により被るパフォーマンス上のペナルティーの粗い推定を取得するのに十分である。
【００６０】
より高度な実施形態において、例えば、コンパイル時にループが実行される回数を推定することにより、又は、例示的な入力に対してコンピュータプログラムをシミュレーションすることにより、ループが考慮される。例えば、シミュレーションが中間表現に対して、例えばデータフローグラフに対して直接行われ、又は、一時的なコンパイルが、例えばプロファイラーを使用して、シミュレーションを目的として実施される。一実施形態において、シミュレーションが例示的な入力データに対して行われた後、ノードが実行される回数が記録され、例えばプロファイル化される。次に、記録された実行回数が、静的なパフォーマンスレベルを量るために使用される。例えば、上記の例を続けることにより、ノードのうちの１つが、１０回実行されるが、残りのものは一度だけ実行される。この場合において、前者のノードはパフォーマンスレベルを演算するときに１０倍大きい重みを受け取る。
【００６１】
どのノードが符号化されるか、及びどのノードが符号化されないかを特定した後、保護手段、例えば、符号化、及び、符号化間の変換が、データフローグラフに挿入される。変換を挿入することがデータフローグラフを有効に維持し、すなわち、符号化された、及び／又は符号化されない演算を含むデータフローグラフにおいて、プログラムは変換無しでは適切に動作しない。
【００６２】
オプティマイザー部１４０は、データフローグラフ２００及び割当てられた保護変換に対するセキュリティーレベルを判定するように構成されたセキュリティー分析器１４４を備える。セキュリティーレベルは、データフローグラフ全体、又は、そのサブグラフのレベルにおいて演算されてよいが、個々のノード及び／又はエッジのレベルにおいて演算されてもよい。例えば、一実施形態において、セキュリティーターゲットは、データフローグラフにおける１つ又は複数のエッジ及び／又はノードに割当てられる。セキュリティーターゲットは、データフローグラフにおける１つ又は複数のエッジ及び／又はノードに対して取得されたセキュリティーターゲットから取得される。セキュリティーレベルを推定することは、パフォーマンスレベルを推定することと同様の手法により行われる。例えば、個々のノード及び／又はエッジのセキュリティーレベルを追加する。典型的には、ノードが実行される想定される回数を使用してノードを量ることは必要とされない。
【００６３】
セキュリティーレベルは、所望の保護のタイプを示す。例えば、セキュリティーターゲットが、セキュリティータイプを含む。セキュリティータイプの例は、機密性及び完全性を含む。前者では、攻撃者は変数の平文値を取得することが可能であってはならないのに対し、後者では、攻撃者は値を変更することが可能であってはならない。変更された値は検出されるが、演算の最終結果がランダム化される限り、それが発生することを可能にされてもよい。例えば、後者は、例えば一定値又は変数の関数といったチェック値と一緒に変数を符号化することにより達成される。チェック値が正しい限り、それは変数を使用した演算に影響を与えないが、チェック値が正しくない場合、それが影響を与えるので、攻撃者が変更を加えた後は、後の演算が歪曲される。例えば、国際特許出願ＷＯ２０１５０８２２１２（Ａ１）、「Ａ  ｃｏｍｐｕｔｉｎｇ  ｄｅｖｉｃｅ  ｆｏｒ  ｉｔｅｒａｔｉｖｅ  ａｐｐｌｉｃａｔｉｏｎ  ｏｆ  ｔａｂｌｅ  ｎｅｔｗｏｒｋｓ」を参照されたい。
【００６４】
セキュリティーターゲットは、攻撃タイプを更に含んでよい。攻撃タイプは、攻撃のタイプであって、コンパイラがその攻撃のタイプに対して保護をしなければならない攻撃のタイプを示す。例として、ソフトウェアが動作している間に攻撃者がソフトウェアに対する完全な読み出し及び書き込みアクセスが可能であるホワイトボックス、攻撃者が入力値及び出力値、及び、プログラム又はプログラムの一部が実行するのにかかる時間にアクセスすることが可能であるサイドチャネルタイム、攻撃者が入力値及び出力値、及び、プログラムが実行している間に消費される電力にアクセスすることが可能なサイドチャネル電力が挙げられる。サイドチャネル攻撃から保護するために、保護手段は、定時間又は定電力演算、又は、ランダム化ダミー演算の挿入を含み得る。
【００６５】
セキュリティーターゲットは、攻撃労力、例えば、攻撃者がプログラムを攻撃することに注ぎ込むと想定される労力の大きさを含み得る。例えば、攻撃労力は、高い、中程度、ベストエフォートであり得る。労力は、１００、１０、１などの数値としても表され得る。
【００６６】
例えば、符号化されたインクリメントＥＮＣ＿ＩＮＣによりインクリメント演算を置換することは、ホワイトボックスに対して中程度のセキュリティーレーティングをもたらし、定時間に対して高いレーティングをもたらす。しかし、インクリメントが他の演算と組み合わされた保護は、より高いホワイトボックスレーティングなどをもたらす。
【００６７】
より高度な実施形態において、セキュリティーレベルは自動化されたジェネリック攻撃を使用して推定される。ジェネリック攻撃は、プログラムの内部の知識情報無しで動作する攻撃である。攻撃のタイプなどの知識情報が必要とされないので、ジェネリック攻撃は、コンパイラ自体によるプログラムに対してさえも動作し得る。
【００６８】
例えば、一実施形態において、セキュリティーターゲットは、入力変数、及び秘密変数を示す。サイドチャネルタイプ演算に対して、秘密変数がプログラムにおいて観測可能な情報と相関しないか、ほとんどしないことが望ましい。相関に対して、プログラムの保護されていないバージョンにおける秘密変数が使用されるのに対し、観測可能な情報に対して、割当てられた保護手段を伴うプログラムが使用されることに留意されたい。
【００６９】
セキュリティーレベルは、次のことにより推定される。
−  秘密変数の異なる値に対して、及び、任意選択的に入力値の異なる値に対してコンピュータプログラムの複数回の実行を実現すること、観測可能なものの値、例えば、コンピュータプログラムの実行中に入力変数に依存するコンピュータプログラムの少なくとも１つの変数、例えば、実行を通して変数により引き受けられる値のシーケンスを記録すること、及び／又は、少なくとも１つの変数に対して実施される演算の演算時間、及び／又は、推定された電力消費などを記録すること。例えば、秘密値は、秘密鍵、又は秘密鍵の一部、例えば最初のバイトである。例えば、入力値は、秘密鍵を使用して暗号化される入力メッセージである。幾つかの変数が秘密鍵と相関する場合、それらの変数は、秘密鍵に関する情報を漏らし、これは望ましくないことである。
−  割当てられた保護変換を伴わない秘密変数と観測可能なもの、例えば記録された値又は演算時間などとの間の相関を演算すること。
【００７０】
観測可能なもの、例えば少なくとも１つの変数の間の相関が高い場合、秘密変数が観測可能な変数から推定されるので、セキュリティーは低い。相関が０に近いか、又は理想的に０である場合、セキュリティーはより高い。例えば、セキュリティーターゲットＡは、０．０１未満の相関と関連付けられ、セキュリティーターゲットＢは、０．１未満の相関と関連付けられる。セキュリティーターゲットＡは、サイドチャネル攻撃に対する、より良い耐性を与えるが、より高いパフォーマンスコストを要求する。
【００７１】
オプティマイザー部１４０は、パフォーマンスレベル及びセキュリティーレベルがセキュリティーターゲット及び／又はパフォーマンスターゲットを満たすまで、データフローグラフの部分への保護変換の割当てを繰り返すように構成される。例えば、割当てられた保護変換は、目標により適切に到達するように部分的に修正される。例えば、幾つかの変数に対して、保護変換は、より高いセキュリティーレベルを伴って使用され、他のものに対して、保護変換は、より低いセキュリティーレベルを伴って使用されることなどである。ターゲットに到達したとき、又は、目標に達することが不可能であるように思われるとき、例えば、ある長さの期間が満了した後に、オプティマイザー１４０は、保護変換の割当てを終了する。
【００７２】
オプティマイザー部１４０が最適化を実施する様々な手法が存在する。例えば、最適化は、例えば、まず、ユーザーにより示された変数が保護され、次に、小さい変数が大きい変数の前に保護されるなどの所定のシーケンスをたどる。代替的に、オプティマイザー１４０は、様々な最適化技術のうちの１つを使用してよい。例えば、オプティマイザー１４０は、ランダムウォークを実施し、及び、最良の選択を維持する。例えば、オプティマイザー１４０は、ユーザーのターゲットに最も大きく寄与するものを含む部分が最初に保護されるグリーディ最適化を実施する。例えば、オプティマイザー１４０は、ヒルクライム、シミュレーションによるアニーリング、タブー探索などを実施する。
【００７３】
例えば、使用される符号化の数は、予め数字ｎに固定される。次に、符号化され得る各演算子が、符号化領域にランダムに割当てられる。セキュリティーレベルが秘密鍵と変数との間の相関を演算することにより演算される。したがって、符号化領域への割当ては、相関を最小化するように、例えば、最大の相関、又は、すべての相関の総和を最小化するように、などのように、例えばヒルクライムなどの最適化方法に従って繰り返し変更される。
【００７４】
最後に、コンパイル部１５０は、少なくともセキュリティーターゲット及び／又はパフォーマンスターゲットを満たすデータフローグラフ及び割当てられた保護変換から、コンピュータプログラム表現のコンパイル結果を取得するように構成される。
【００７５】
図３ａは、利用可能な保護変換のリストにおける保護変換の選択を最適化する方法３０１を示す。本方法は、
−  関連するセキュリティーレベルがセキュリティーターゲットを達成するように選択されたデータフローグラフの部分に、初期保護変換を割当てること（３１１）であって、例えば、保護変換が、閾値より上のセキュリティーレベルをもつように選択され、又は、保護変換が、最高の（最良の）セキュリティーレベル変換であるように選択される、割当てること（３１１）と、
−  パフォーマンスレベルが特定されること（３１２）と、
−  特定されたパフォーマンスレベルがパフォーマンスターゲット３１３未満である場合、１つ又は複数の割当てられた保護変換がより低い関連するセキュリティーレベルを伴う保護変換に変更されること（３１４）とを有する。次に、本方法は、ターゲットに到達するまで繰り返される。
【００７６】
ターゲットに到達した場合、本方法が終了とされる（３１５）。
【００７７】
図３ｂは、利用可能な保護変換のリストにおける保護変換の選択を最適化する方法３０２を示す。本方法は、
−  関連するセキュリティーレベルがセキュリティーターゲット未満であるように選択されたデータフローグラフの部分に初期保護変換を割当てること（３２１）であって、例えば、保護変換が、閾値未満のセキュリティーレベルをもつように選択され、又は、保護変換が、最低の（最悪の）セキュリティーレベル変換であるように選択される、割当てること（３２１）と、
−  パフォーマンスレベルが特定されること（３２２）と、
−  特定されたパフォーマンスレベルがパフォーマンスターゲット３２３より上である場合、１つ又は複数の割当てられた保護変換が、より高い関連するセキュリティーレベルを伴う保護変換に変更されること（３２４）と、
を有する。次に、ターゲットに到達するまで、本方法が繰り返される。ターゲットに到達した場合、本方法が終了とされる（３２５）。コンパイルは、パフォーマンスレベルが依然としてパフォーマンスターゲットより上であった保護変換の最後の集合を使用して実施される。
【００７８】
方法３０１では、パフォーマンスターゲットが満たされるまで、セキュリティーが下げられる。方法３０２では、異なるアプローチが使用され、この場合、セキュリティーターゲットを最良に満たすように、パフォーマンスバジェットが消費される。所与の状況に対して方法３０１と方法３０２とのどちらが最良であるかは、所望のトレードオフに依存する。
【００７９】
例えばリストに含まれる割当てられ得る保護変換は、データフローグラフの、１つ又は複数の、エッジに対する変数保護、及び／又は、ノードに対する演算保護を含む。例えば、可能な変換は、以下を含む。
−  変数の符号化、及び、復号された変数に対する演算の平文実行。この状況では、ほとんどの場合、変数が符号化されるが、変数が演算される直前及び直後に復号される。符号化は、例えば、状態、例えばソルト値を含む、ランダムな全単射演算であり得る。符号化は、マスキング演算、例えば、ランダム値を加算、例えばＸＯＲをすることであってもよい。
−  変数の符号化、及び、符号化された変数に対する符号化された演算実行。この状況において、変数は符号化されるが、更に、符号化された形態において演算される。それは、演算を実施するために参照テーブル又は多項式などを要求するので、これは、概してより高価な演算である。
−  変数及び／又は演算に適用される準同形暗号化。
−  定時間実行演算。この場合、変数は符号化されることを必要としないが、それらに対して実施される演算は、それらの値に対して独立している。これは、演算が常に最悪時の時間をかけて実施することを意味する。
【００８０】
特定の保護手段を割当てることは、多くの場合、含意を含む。符号化されたデータに対して演算が実施される場合、これは、データが符号化された形態において利用可能でなければならないことを意味する。更なる演算がデータに対して実施される場合、それは同じ符号化によりデータを受け入れるように準備されなければならない。これは、データフローグラフに、あるタイプの符号化から別のタイプに変換する変換ノードを挿入することにより達成される。
【００８１】
これは、ノード及び／又はエッジを符号化領域に割当てることにより管理される。複数の符号化領域は確立される。同じ符号化領域に割当てられたデータフローグラフの部分が、同じ保護変換に割当てられる。典型的には、より多くの符号化領域を含むことは、セキュリティーに対して有益であるが、一方で、複数の符号化領域を含むことは、プログラムのフットプリントを増やす。
【００８２】
例えば、上述のソフトウェアにおいて指定された２つのアルゴリズムＡ及びＢが、下記の表において列１において説明されている関数ｆＡ及びｆＢにより実装されると仮定する。次の列２、３、及び４において、及び、それらの２つの関数の各々が異なるセキュリティー目標を伴う割当てられた２つの異なるＳＳＡネットワークであると仮定した場合、関数は、２つの参照テーブルにより置換されてよく（列２）、符号化／復号関数が適用され（列３）、符号化／復号関数の強度はターゲットセキュリティー目標に依存する。最終列において、テーブルが、実装された関数を更に難読化するために組み合わされ得る。後続のステップの各々が、セキュリティーを高め得るが、パフォーマンスも影響を受ける。したがって、アルゴリズムは、パフォーマンス要求を満たしながら、できる限り保護するためにそれらのステップを注意深く適用する。
【００８３】
【表１】
2021515314.tif 000004
【００８４】
一実施形態において、コンパイラデバイスは、以下の入力うちの１つ又は複数を受信する。
（ｉ）保護されるプログラム（例えばｃプログラム、又は中間プログラム表現、例えばデータフローグラフ）
（ｉｉ）保護されたプログラムのための１つ又は複数のパフォーマンス目標
（ｉｉｉ）プログラムの異なる部分におけるターゲットセキュリティーレベル
（ｉｖ）セキュリティー／パフォーマンス特性を伴う符号化及び保護の利用可能なタイプを含むリスト
【００８５】
コンパイラデバイスは、パフォーマンス要求（演算の数、演算タイプ）に従ってプログラム部分を分類するように構成され、及び、個々のパフォーマンス及びプログラム全体における全体的なリソース要求に従って異なるプログラム部分に対するパフォーマンスランクを出力する。これは、特定のオペランドを使用する各演算タイプをカウントすることと、符号化演算のコストが分かっている符号化された演算によりそれらの演算が置換されたときの想定されるコストを演算することとにより行われ得る。全体的なパフォーマンスは、ターゲットデバイスにおいて入力プログラムを実行することにより取得され得る。それを安全にした後のパフォーマンスは、プログラムの特定の部分を保護する追加的なコストを推定することにより取得し得る。パフォーマンス上のペナルティーは、（ＰｅｒｆｏｒｍａｎｃｅＰｌａｉｎ＋ＥｓｔｉｍａｔｅｄＰｅｒｆｏｒｍａｎｃｅＰａｒｔｓＰｒｏｇｒａｍＰｒｏｔｅｃｔｅｄ）／ＰｅｒｆｏｒｍａｎｃｅＰｌａｉｎ、のように計算される。
【００８６】
コンパイラデバイスは、例えば注釈、及び、実行されるデータ／演算のタイプにより指定されたセキュリティー要求に従ってネットワークを分類するように構成される。出力は、異なるプログラム部分において要求されるセキュリティーをランク付けするセキュリティーリストである。この優先順位付けは、ネットワークにおいて使用される演算タイプ、それらがどれくらい適切に保護され得るか、及び、ネットワークが他のものとどれくらい関連しているかを分析することにより実行され得る。
【００８７】
注釈は、例えば変数、関数、マクロなどのプログラム構築前にプラグマとして含まれ得る。注釈の選択肢は、
・タイプ：機密性、完全性、可用性
・攻撃：ホワイトボックス、サイドチャネルタイム、サイドチャネル電力
・労力：高い、中程度、ベストエフォート
を含む。
【００８８】
タイプは、有効な保護のタイプを意味する。機密性は、プラグマを使用して注釈付けされたプログラム部分を暗号化することを意味する。完全性は、プログラムが変更されることができないことを確実なものとする完全性チェックを含むことを意味する。可用性は、コードが実行されることを確実なものとするための能力を追加することを意味する。例えば、関数が少なくとも１回動作することを確実なものとするために関数を複製することによる。例えば、後者は、プログラムの残部を実行する前にユーザーが権限を与えられることを検証するために使用される。
【００８９】
攻撃とは、本明細書では、実施される、及び、適用されなければならない保護のタイプを決定する攻撃のタイプを意味する。ホワイトボックスとは、本明細書では、攻撃者がコード全体にアクセスすることが可能であり、すべてを観測／変更し得ることを意味する。したがって、結果として得られる実装体は、符号化又は暗号化された保護されたプログラムを出力しなければならない。サイドチャネルタイムとは、本明細書では、プログラムの実行時間を観測し、実行時間から情報を導出し得る攻撃者を意味する。したがって、保護されたプログラムは、実行時間が一定である（その結果、攻撃者が何も獲得しない）ようにされなければならず、又は、攻撃者が実際の実行時間を導出することができないように、実行に依存した十分大きいランダムな遅延を追加するようにされなければならない。サイドチャネル電力とは、本明細書において、攻撃者が電力トレースを観測し得ることを意味する。したがって、プログラムは、異なる電力要求を伴う命令が定電力消費の仮想化された命令（例えばテーブル参照）により置換されるようにされていなければならない。
【００９０】
労力とは、本明細書において、結果として得られる保護がどれだけ良くなければならないかを意味する。Ａ）高い：それが最良の利用可能なセキュリティーを提供することとする。Ｂ）中程度：それができる限り良いセキュリティーを提供しなければならない。セキュリティー無しというのは選択肢に無い。Ｃ）ベストエフォート：それはできる限り良いセキュリティーを提供しなければならないが、パフォーマンスの理由に起因して実行可能でない場合、平文実装も適切である。
【００９１】
注釈は強力であるが、プログラマーは、注釈を追加することを忘れる可能性がある。コンパイラは、例えば入力データが特定の定数と混合された演算部分をプログラム部分が含むか否かを更に分析し得る。このようなプログラム部分は、暗号化により保護する理想的な候補である。コンパイラシステムは、所与のプログラム部分が、入力に伴う時間依存性をもたらす入力変数に依存した演算を実施するか否かを更に分析し得る。このようなプログラム部分は、サイドチャネルタイミング攻撃からの保護のために理想的である。コンパイラシステムは、このような部分が保護されない場合、警告をトリガーして、プログラマーに警報を出し得る。代替的に、コンパイラは、コンパイラがより高いレベルの保護を自動的に適用し得るように、コンパイルフラグ（例えば−ｐ１、−ｐ２、−ｐ３）を使用して拡張され得る。
【００９２】
プログラム入力を分析することが行われた後、コンパイラデバイスは、最適化及びターゲット保護レベルに応じて、使用される符号化及び保護を決定する。
−  セキュリティーに対する最適化の場合：
・最良のタイプの符号化／保護を各プログラム部分に割当て、パフォーマンス（メモリ／ＣＰＵ）を推定する。
・（パフォーマンスがパフォーマンス目標より悪い）間、｛より簡単な符号化／保護をより低いセキュリティーニーズを伴うプログラム部分に適用する｝
・結果として得られる保護が要求されるものより低い場合、コンパイラシステムは、状況からプログラマーに警報を出すように警告をトリガーしなければならない。
−  パフォーマンスに対する最適化の場合：
・最も実行性のあるタイプの符号化又は保護を各プログラム部分に割当て、パフォーマンス（メモリ／ＣＰＵ）を推定する。
・（パフォーマンスがパフォーマンス目標より良い）間、｛より高いセキュリティーニーズを伴うネットワークにより安全な符号化を適用する｝
・結果として得られる保護が、要求されるものより低い場合、コンパイラシステムは、状況からプログラマーに警報を出すように警告をトリガーしなければならない。
【００９３】
一実施形態において、コンパイラデバイスは、プログラムの中間表現を取得し、この場合において、使用される注釈に応じて、
・機密性のために、各変数が２つのラベルに割当てられ、第１のものが、使用される符号化のタイプを規定し、第２のものが、符号化領域を規定する。
・完全性のために、プログラム部分は、完全性チェックを判定する拡張されたブロックである。
・可用性のために、高い可用性を要望するプログラム部分はｎ回反復される。コピーの各々が、それらを無効化する攻撃者のタスクを困難にするように、プログラムの異なる位置に配置される。
・ホワイトボックス攻撃に対して、攻撃者が変数を理解することができないように符号化されるように変数が表記されなければならない。
・サイドチャネルタイミング攻撃に対して、サイドチャネルタイミング攻撃を受けやすいプログラム部分及び変数は、定時間において実行されるようにマーキングされなければならず、又は、大きい実行に依存したタイミングノイズが追加される。定時間は、演算及びメモリアクセスが定時間でなければならないことを意味する。実行に依存したタイミングノイズのために、プログラム部分は、ランダムなデータに依存して大きい時間変動性を導入するブロックを伴って拡張される。
・サイドチャネル電力攻撃に対して、異なる電力要求を伴う命令は、定電力消費を伴う仮想化された演算により置換される。
【００９４】
最後に、符号化及び保護が相応に割当てられる。例えば：
−  符号化の場合：
・コンパイルが１つのデバイスに対するものである場合、データがそのデバイスを通して符号化されることを特定する。
・コンパイルが複数のデバイスに対するものである場合、連続したデバイスの入力／出力データインターフェースが同じ符号化を使用しなければならないことを特定する。任意選択的に、デバイス生成データにおける対称暗号化アルゴリズム（例えばＡＥＳ）、及び、デバイス消費データにおける対応した符号化された対称暗号解読アルゴリズム（例えばＡＥＳ）の符号化された実装を含むことによりコードを拡張する。
−  （Ｆ）ＨＥの場合：
・コンパイルが１つのデバイスに対するものである場合、入力データが暗号化されなければならないこと、及び、デバイスを通した演算が暗号化された領域において実施されなければならないことを特定する。ノイズが過度に増えた場合、データを暗号解読するために使用される秘密鍵を記憶したセキュア要素との通信を関与させ、及び、場合によっては、別のネットワークに割当てられた公開鍵を使用して、更に再度それを暗号化する。
・コンパイルが異なるデバイスに対するものである場合、データは暗号化されなければならず、演算は暗号化された領域において実施されなければならない。暗号解読は、受信デバイスにおいて行われるのみである。
−  可用性保護が要求される場合：
・コンパイルがマルチコアＣＰＵに対するものである場合、異なるコアに反復されたプログラム部分の各々の実行を割当てる。
・コンパイルがマルチデバイスシステムに対するものである場合、反復されるプログラム部分の各々の実行を、異なるデバイスに割当てる。
−  サイドチャネル電力保護の場合、プログラムが実行されるプロセッサにおける異なる命令の電力消費を分析し、それらの命令を定電力消費の参照テーブルに変換する。
−  定時間を使用したサイドチャネルタイム保護の場合、プログラムが実行されるプロセッサにおける異なる命令、及びメモリアクセスに対する時間要求を分析し、それらの命令を定時間アクセスの参照テーブルに変換する。
【００９５】
コンパイルを実施するために、コンパイラデバイスは、例えば部分１４０又は１５０において、符号化／復号及び保護を生成するように、及び、取得されたラベルに従って各プログラム部分にそれらを適用するように構成される。
【００９６】
図１ｃは、コンパイルデバイス１０１の一実施形態の例を概略的に示す。コンパイルデバイス１０１は、コンパイルデバイス１０１が保護変換を適用する前に演算を組み合わせるように構成されることを除いて、コンパイルデバイス１００と同様である。例えば、コンパイルデバイス１０１は例えば、それに対して構成されたオプティマイザー部１４０における組合せ部１４５を備える。
【００９７】
コンパイルデバイス１００と同様に、コンパイルデバイス１０１は、保護され得る変数を検出するように構成されるが、組合せデバイス１４５は、検出された変数に作用する演算を選択するように、及びそれらの演算を組み合わせるように構成される。組み合わされた演算は、上述のように保護され得る。例えば、組み合わされた演算は、例えば参照テーブルに、又は、多項式として符号化され得る。
【００９８】
コンパイルデバイス１０１は、例えばＣＰＵペナルティー及びメモリペナルティーなどの、入力パフォーマンス目標に従った保護のためのパラメータを最適化する方法を更に使用する。
【００９９】
一実施形態において、保護される各演算は、それ自体の符号化領域に割当てられる。すべての選択された関数がテーブル参照に変換され、ある符号化から次のものに変換するように、それらの間に全単射が導入される。一実施形態において、少なくとも２つの演算が同じ符号化を使用して保護され、したがって、ある符号化から次のものに変換するために、それらの間の全単射が必要とされない。符号化の数を減らすことは、演算が再使用され得る可能性を高め、要求される参照テーブルの数を減らすなどする。
【０１００】
一実施形態において、コンパイルデバイス１００は、３つの段階で構成される。
１．保護され得る変数を検出する
２．ステートメントを組み合わせる
３．ｎ個の符号化を適用し、ステートメントを参照テーブルに変換する
【０１０１】
３つの段階に基づいて、コンパイラシステムは、上述のパスに対してパラメータを最適化するために、例えばＣＰＵペナルティー及びメモリペナルティーを入力パフォーマンス目標として採用する最適化アルゴリズムを適用し得る。
【０１０２】
例えば、段階１では、保護され得る変数は、以下のように検出され得る。すなわち、これらの要求、すなわち、
１．ｖが、参照テーブルに変換され得るステートメントにおいて使用されること、
２．ｖが、符号化を明らかにすることなく符号化され得ること、
を満たす場合に、変数ｖが保護され得る。
【０１０３】
相応のサイズの参照テーブルに変換され得る割当てにおいて変数ｖが使用される場合、変数ｖが保護され得る。このような参照テーブルのサイズを測定するために、ｖが使用されるプログラムの中間表現が入力として採用される。この中間表現は、ＳＳＡプロパティを含む。
【０１０４】
以下のフラグメント、すなわち、
（１）ｉｎｐｕｔ１＝ファイ（ａ，ｂ）；
（２）ｉｎｐｕｔ２＝ｃ；
（３）出力＝ｇ（ｉｎｐｕｔ１，ｉｎｐｕｔ２）；
を考慮する。
【０１０５】
代入ステートメント、例えば（３）において、ビットで表した総入力サイズｓは、この手法により、すなわち、
【数２】
2021515314.tif 000005
により規定され得る。
【０１０６】
関数ｒａｎｇｅは適切に表される入力により要求されるビット数を返すことに留意されたい。この関数は、単に入力のタイプを返す別の関数により更に置換され得る。代入ステートメントの、ビットで表した入力サイズは、代入の左側を実装する参照テーブルが含むエントリーｅの数を示す。ｅ＝２ｓである。言い換えると、ｅは、代入ステートメントの左側を実装する参照テーブルのサイズの標示を与える。大きい値のｓを伴うステートメントに対して、結果として得られる参照テーブルのサイズは、プログラムを、実際に実装される、及び実行されるには過度に大きいものにする。例えば、パフォーマンスターゲットは、参照テーブルのために使用され得るメモリ量に対する制限を設定する。したがって、要求１は、ｓの最大許容値に制約を課し、したがって、保護されたプログラムの全体のサイズに影響を与える生成された参照テーブルのサイズに制約を課す。
【０１０７】
変数ｖを保護するために使用される符号化が参照テーブルにマージされ得る場合、変数ｖが保護され得る。これが当てはまるか否かを判定するために、ｖを使用及び生成するステートメントが分析されなければならない。一例として、（ステートメントがＳＳＡにおけるものである）次の関数の保護が考慮され得る。
ｆｕｎｃｔｉｏｎ  ｆ（ｂ，ｃ）  ｛
（１）  ａ  ＝  ｇ（ｂ，ｃ）；
（２）  ｘ  ＝  ｈ（ｃ）；
（３）  ｄ  ＝  ｙ（ａ）；
（４）  ｅ  ＝  ｘ；
（５）  ｚ  ＝  ｉ（ｄ，ｅ）；
（６）  ｒｅｔｕｒｎ  ｚ；
｝
【０１０８】
許容される要求より上からの最大総入力サイズｓが１６［ビット］であると仮定する。変数ｃが１８［ビット］のサイズをもち、すべての他の変数が８［ビット］のレンジをもつと仮定する。本例において、ｂ、ｃ、及びｚは関数の引数及び戻り値であるので、ｂ、ｃ、及びｚは保護されることができない。関数のシグネチャ又はａｐｉは、保護されていないコードとのインターフェースであるので、平文のまま維持される必要がある。ａ及びｘは、（符号化を安全に統合し得る）参照テーブルに変換されることができないステートメントの左側にあるので、変数ａ、ｘ、及びｅは、保護されることができない。しかし、変数ｄは、以下の理由により保護され得る。
・変数ｄは、（符号化を安全に統合し得る）参照テーブルに変換され得るステートメント（３）の左側にある。
・変数ｄは、（復号を安全に統合し得る）参照テーブルに変換され得るステートメント（５）の右側において使用される。
【０１０９】
コンパイルデバイス１０１、例えば組合せ部１４５は、演算を組み合わせるように構成される。例えば、段階２において、保護され得る変数が識別された後に、ステートメントが組み合わされる。例えば、組合せ部１４５は、機能的に後のステートメント、例えば、あるものの出力変数が次のものの入力であるステートメントを特定するように構成される。後のステートメントは、１つのステートメントに組み合わされる。
【０１１０】
結果として得られるステートメントの最大変数サイズが、前のセクションにおいて規定された最大サイズ未満であるとき、結果として得られるステートメントの、左側の変数は、更に保護され得る。
【０１１１】
例えば、以下のプログラムと１６［ビット］の最大変数サイズとを仮定する。
（１）ａ＝ｂ＋ｃ／／ｂ及びｃは４ビットのレンジをもち、ａは５ビットのレンジをもつ。
（２）ｆ＝ｄ＊ａ／／ｄ及びｅは４ビットのレンジをもち、ｆは８ビットのレンジをもつ。
（３）ｈ＝ａ−ｆ／／ａは５ビットのレンジをもち、ｆは８ビットのレンジをもち、ｈは１３ビットのレンジをもつ。
【０１１２】
したがって、ライン１、ライン２、及びライン３における３つのステートメントは、まず、１つのステートメント、すなわち、ｈ＝（ｂ＋ｃ）−（ｄ＊（ｂ＋ｃ））＝（１−ｄ）＊（ｂ＋ｃ）に組み合わされ得る。
【０１１３】
結果として得られるステートメントの入力及び／又は出力変数に符号化を適用すること、及び、結果として得られるステートメントを符号化された参照テーブルに変換することは、リバースエンジニアリングからの、及びホワイトボックス攻撃からの保護を大幅に改善することに留意されたい。複数の基本演算により構成される関数を実装する符号化された参照テーブルをリバースエンジニアリングするために必要な労力は、単純な算術関数のみを実装する符号化された参照テーブルをリバースエンジニアリングするために必要な労力より大きいので、これは有効である。
【０１１４】
上記の例において結果として得られる総入力変数サイズは、４＋４＋４＝１２［ビット］であり、したがって、ステートメントは、１つの符号化された参照テーブルに変換され得ることに更に留意されたい。符号化の厳密な導入は、第３の段階の一部であり、例えば、次の段階において符号化を導入した後である。ステートメントを組み合わせるための前述のアプローチは速度の観点から有益である。
【０１１５】
段階３において、符号化及び変換ステートメントが適用され、参照テーブルが形成される。この時点において、以下の入力、すなわち、（１）保護され得る変数の集合、及び（２）パフォーマンス／セキュリティー制約の集合が利用可能である。例えば、（２）は、プログラム（又はプログラムの一部）に適用され得る符号化の最大数である。（２）は、適用され得る符号化の最大数をメモリ量から導出することが可能であるように、プログラムにより要求されるメモリ量である。
【０１１６】
この例の可能な実施態様は、以下のとおりである。
−  ｎ＝０：任意の数の符号化が使用され得る。典型的には、各変数を保護するために、異なる符号化が使用される。
−  ｎ＝１：プログラム全体において（変数サイズごとに）同じ符号化が使用される。
−  ｎ＝２：プログラム全体において（変数サイズごとに）２つの異なる符号化が使用され得る。
−  ｎ＝…：…
【０１１７】
サイズが変数サイズに一致する必要があるので、符号化の数は変数サイズごとであることに留意されたい。入力が与えられると、次に、コンパイラシステムは保護され得る各変数に符号化を割当てる。ｎ＝０である場合、各変数は異なる符号化を使用する。他のｎの選択肢の場合、コンパイラシステムは、異なる代替例を使用し得る。最も簡単なものは、変数ｊ（ｍｏｄ  ｎ）に符号化ｉを適用することである。例えば、次のとおりである。
【０１１８】
【表２】
2021515314.tif 000006
【０１１９】
別の選択肢は、ランダム化された手法により符号化を割当てることであり、例えばＶａｒ  ｊ←Ｅｎｃ＿ｉ、であり、ここで、ｉ←ｒａｎｄｏｍ（ｎ）である。
【０１２０】
変数が異なるレンジ（又はタイプ）をもつ場合、演算（例えば、＋、−、ＸＯＲ、…）が同じであるときでも、異なる符号化が同様に適用されることに更に留意されたい。この場合、同じ関数が複数のステートメントの左側に存在する場合、異なる符号化を伴う異なる参照テーブルが生成されるので、多数の符号化を使用することは、サイズの大幅な増加につながることに更に留意されたい。
【０１２１】
メモリペナルティーが与えられた場合、コンパイラシステムは、以下のことを行い得る。
１．現在のマシンにおいてコンパイルされた後に、平文プログラムに対するメモリパフォーマンスを取得する。
２．入力ペナルティーに基づいて、コンパイラシステムは、入力パラメータに従って、保護されたプログラムにおいて可能にされるメモリの絶対的な増加を取得し得る。
３．メモリの絶対的な増加に基づいて、コンパイラシステムは、次に、メモリ制約内においてプログラムに適合した要求される符号化を演算し得る。
【０１２２】
例えば、最大メモリ増加量が１０ＫＢである場合、２バイト長の入力変数に依存した関数を符号化することは、２＾１６／１０２４＝６４ＫＢのメモリを要求するので実行可能でない。しかし、８ビット変数に依存した関数を符号化することは、２＾８／１０２４＝２５６Ｂのメモリを要求するので実現可能である。
【０１２３】
ＣＰＵ及びメモリの絶対的な増加に基づいて、コンパイラシステムは、次に、すべての変数が異なる符号化を使用している場合、符号化され得る変数の最大サイズを演算し得ることに更に留意されたい。変数を特定する工程は、（プログラムの中間表現において）プログラムをスキャンして、小から大まで変数及び関数をランク付けすることである。変数がランク付けされた後に、コンパイラシステムは、（小さいものから始めて）ｘ個の変数を符号化するように決定された後に残されたメモリ量を演算することを開始する。メモリバジェットが利用可能でないとき、工程が終了する。
【０１２４】
ＣＰＵパフォーマンスに対する最適化工程も同様である。しかし、この場合、目標は、テーブル参照の数を最小化することであり、したがって、目標は、できる限り多くマージすることができるように、すべての符号化を適用することを開始することである。ＣＰＵパフォーマンスが要求されるものより良い間、コンパイラシステムは消費されるメモリをチェックする。メモリが過度に高い場合、コンパイラシステムは最大の入力のものから始めて、メモリ要求が満たされるまで、符号化されたテーブルを次第にアンマージする。
【０１２５】
例えばＣＰＵペナルティー及びメモリペナルティーを入力パフォーマンス目標として採用することにより、上述のパスに対してパラメータを最適化することが可能である。例えば、コンパイルデバイス１０１は、最適化アルゴリズムを適用し得る。この最適化工程のために異なる可能性が存在する。例えば、コンパイルデバイス１０１は、次のために構成され、すなわち、
まず、導入され得る様々なサイズの符号化の最大数を特定する。これは、例えばプログラムの中間表現においてプログラムをスキャンすること、及びコピーファイネットワークをサイズに基づいてグループに分類すること、及び、例えば、それらをカウントすることにより行われ得る。コピーファイネットワークは、コピー又はファイステートメントのみにより構成されたプログラムグラフ表現のサブネットワークである。これは、コピーファイネットワークにおけるすべての変数が同じレンジをもつこと、及び、コピーファイネットワークにおいて、データに対してどのような操作も実施されないことを意味する。
【０１２６】
例えば、各グループは、プログラムに存在する各変数レンジ（例えば８ビット、１６ビット、３２ビット）に対してコピーファイネットワークの数を含む。これは、プログラムにおける保護可能な変数の各レンジをそのレンジに対するコピーファイネットワークの数にマッピングするリストを返す。例えば、下記のリストＬは、レンジ８ビットの４５個のコピーファイネットワーク、レンジ１２ビットの２３個のコピーファイネットワーク、及び、レンジ１６ビットの７６個のコピーファイネットワークが存在することを意味する。Ｌ＝［［８，４５］，［１２，２３］，［１６，７６］］
【０１２７】
コピーファイネットワークの境界におけるすべてのデータ操作ブロックにおいて同じ符号化が使用される必要がある。特に、コピーファイネットワークの各ソースノードに同じ符号化が適用されなければならないとともに、符号化逆射がコピーファイネットワークの各宛先ノードに適用されなければならないことが確認され得る。これは図２ｂの例示的なデータフローグラフに示されている。図２ｂにおいて、２４１及び２４２はコピーファイネットワークであり、２４３はデータ操作ブロック、例えば演算子であり、２４４は符号化であり、２４５はコピーファイネットワークにおけるエレメントであり、文字ｇ及びｆは符号化を表す。図２ｂの右側において、データフローグラフにおいて符号化が適用されている。
【０１２８】
次に、プログラムは、利用可能なメモリに対してプログラム強度を最大化する符号化の数を導出する必要がある。コピーファイネットワークを通るデータ操作ブロックからの出力は、そのデータを消費するデータ操作ブロックにおいて反転されることを必要とするので、適用可能な符号化の最大数は、プログラムに含まれるコピーファイネットワークの数に常に等しいことに留意されたい。この最適化ステップは、幾つかの手法で行われ得る。第１のものは、最小レンジのコピーファイネットワークのすべてのデータ操作ブロックに対して第１の新しい符号化を導入し、それらのすべてが導入されたときにのみ次のレンジに移動し、最大メモリ量が割当てられるまで移動することである。例えば、上記の例においてまず、８ビットのコピーファイネットワークにおける変数に対して符号化を生成し、次に、タイプ１２ビットに対する符号化の生成に移動し、更に続く。第２の方法は、最大サイズのレンジ（上記の例では、サイズ１６ビット）から始まり、すべての要求される符号化が演算されるまで、最大サイズのレンジに対してそれらを生成し続け、次に、次のタイプのより小さいサイズ（この場合において、１２ビット）に移動することである。第３の方法は、連続した手法により利用可能なデータレンジの各々に対して符号化を追加することである。上記の例では、サイズ８ビットに対する符号化から始まり、次に、サイズ１２ビットの符号化に対して別のものを追加し、次に、サイズ１６ビットの符号化に対して別のものを追加し、次に、サイズ８ビットから再開する…。すべての利用可能なメモリが割当てられたときに、この工程は終了する。
【０１２９】
例えば、データフローグラフにおける演算ノードは、関連する符号化メモリ要求を含む。例えば、演算子は、有限体上の多項式の形態をとる、又は、参照テーブルの形態をとる符号化された演算子として実装される。関連する符号化メモリ要求は、２の、入力の総ビットサイズ乗に、演算子の出力におけるビット数を乗じたものである。演算子のうちの幾つかは、このサイズに基づいて符号化されることができず、例えば、それは閾値より大きい。符号化のために利用可能なメモリサイズに基づいて、コンパイルデバイスは、どの符号化、及び／又は、幾つの符号化を適用するかを決定し得る。例えば、コンパイルデバイスは、最小の関連するサイズから始まり、符号化のために利用可能なメモリが枯渇するまで、異なる符号化を割当てる。
【０１３０】
例えば、コンパイルデバイスは、まず、各変数サイズに１つの符号化を適用する。メモリが依然として符号化のために利用可能である場合、メモリは、最小から最大まで割当てられる。
【０１３１】
例えば、コンパイルデバイスが、まず、例えばユーザーにより、又は、分析部１３０などにより、高セキュリティーとして識別された各変数サイズに異なる符号化を適用する。次に、１つの符号化が各変数サイズに適用される。メモリが依然として符号化のために利用可能である場合、メモリは、最小から最大まで割当てられる。
【０１３２】
これらの方法は、基礎レベルの符号化が達成されることを確実なものとした後に、異なる符号化が、より小さい変数に集中させられるという利点をもつ。より小さい変数は、より大きい変数に比べると、符号化のために要求するメモリが遥かに少ないので、より小さい変数は使用される異なる符号化の数を増やす。攻撃者は少数ではなく多くの異なる符号化を扱う必要があるので、この技法は、例えば、難読化目的のために有用である。
【０１３３】
符号化は、場合によってはソルト又は状態値を伴って全単射に基づく。例えば、特定のタイプに属する変数が（ｍ個の異なる素数に対する）ｍ個の元からなるＲＮＳにおいてまず符号化され、次に、全単射が元の各々に適用される剰余数系（ＲＮＳ）に基づく代替的な符号化も使用され得る。
【０１３４】
異なる公開鍵及び異なる評価鍵が異なるタイプの変数を評価するために使用されるように、符号化が完全準同形暗号化に基づいていてもよい。
【０１３５】
コンパイルデバイス１００又は１０１の様々な実施形態において、通信インターフェース又は入力インターフェースは、様々な代替例から選択される。例えば、インターフェースは、ローカルエリアネットワーク又は広域ネットワーク、例えば、インターネットへのネットワークインターフェース、内部又は外部データストレージへのストレージインターフェース、キーボード、アプリケーションインターフェース（ＡＰＩ）などである。
【０１３６】
コンパイルデバイスは、例えば、１つ又は複数のボタン、キーボード、ディスプレイ、タッチスクリーンなどのよく知られた要素を含むユーザーインターフェースを含む。ユーザーインターフェースは、コンパイル作業などを実施するためにユーザー対話に適応するように構成される。
【０１３７】
ストレージ１２０は、電子メモリ、例えばフラッシュメモリ、又は、磁気メモリ、例えばハードディスクなどとして実装される。ストレージ１２０は、ストレージ１２０を一緒に構成する複数の独立したメモリを備える。ストレージ１２０は、一時的なメモリ、例えばＲＡＭである。一時的なストレージ１２０の場合、ストレージ１２０は、例えば、任意選択的なネットワーク接続を介してそれらを取得することにより使用前にデータを取得する幾つかの手段を含む。
【０１３８】
典型的には、コンパイルデバイス１００及び１０１は、デバイス１００及び１０１に記憶された適切なソフトウェアを実行するマイクロプロセッサを備え、例えば、そのソフトウェアは、対応するメモリ、例えば、（別々には示されていない）揮発性メモリ、例えばＲＡＭ、又は、不揮発性メモリ、例えばフラッシュにダウンロード及び／又は記憶されたものである。代替的に、デバイス１００及び１０１は、プログラム可能論理部、例えばフィールドプログラム可能ゲートアレイ（ＦＰＧＡ）において全体的に、又は部分的に実装される。デバイス１００及び１０１は、いわゆる特定用途向け集積回路（ＡＳＩＣ）、例えば、それらの特定の使用のためにカスタマイズされた集積回路（ＩＣ）として全体的に、又は部分的に実装される。例えば、回路は、例えば、ハードウェア記述言語、例えば、Ｖｅｒｉｌｏｇ、ＶＨＤＬなどを使用してＣＭＯＳにおいて実装される。
【０１３９】
一実施形態において、コンパイルデバイスは、入力インターフェース回路、ストレージ回路、パース部回路、データフローパーサー回路、符号化分析器回路、オプティマイザー部回路、パフォーマンス分析器回路、セキュリティー分析器回路、コンパイルユニット回路を備える。デバイス１００は、追加的な回路、例えば組合せ部回路を備える。回路は、本明細書において説明されている対応するユニットを実装する。回路は、プロセッサ回路及びストレージ回路であってよく、プロセッサ回路は、ストレージ回路において電子的に表された命令を実行する。
【０１４０】
プロセッサ回路は、例えば複数のサブプロセッサ回路として分散された手法により実装されてよい。ストレージは、複数の分散したサブストレージにわたって分散される。メモリの一部又はすべては、電子メモリ、磁気メモリなどである。例えば、ストレージは、揮発性の、及び不揮発性の部分を含む。ストレージの一部は、読み出し専用である。
【０１４１】
図６は、コンパイル方法６００の一実施形態の例を概略的に示す。コンパイル方法６００は、コンピュータプログラムのセキュリティーを改善する保護変換の選択のために構成される。コンパイル方法６００は、
−  コンピュータプログラム表現を受信すること（６１０）と、
−  コンピュータプログラム表現からデータフローグラフ２００表現を取得すること（６２０）と、
−  データフローグラフの部分に保護変換を割当てること（６３０）であって、保護変換が、利用可能な保護変換のリストから選択される、割当てること（６３０）、
−  データフローグラフ２００及び割当てられた保護変換に対するパフォーマンスレベル及びセキュリティーレベルを特定すること（６４０）、及び、
−  パフォーマンスレベル及びセキュリティーレベルが、セキュリティーターゲット及び／又はパフォーマンスターゲットを満たしている場合、保護変換を割当てることを終了することであって、例えば、方法６００は、割当てること（６３０）に向かう、又は、取得すること（６６０）に向かう条件分岐６５０を含む、終了すること、を繰り返し行うことと、
−  少なくともセキュリティーターゲット及び／又はパフォーマンスターゲットを満たすデータフローグラフ及び割当てられた保護変換からコンピュータプログラム表現のコンパイル結果を取得すること（６６０）と、
を有する。
【０１４２】
当業者に明らかなように、方法を実行する多くの異なる手法が可能である。例えば、ステップの順序は変えられ得、又は、幾つかのステップは並行して実行されてよい。更に、ステップ間に他の方法ステップが挿入されてよい。挿入されたステップは、例えば本明細書において説明されている方法の改良例を表してよく、又は本方法に無関係であってよい。更に、所与のステップは、次のステップが始められる前に完全に終えられないものであってよい。
【０１４３】
本発明による方法は、プロセッサシステムが方法６００を実施することをもたらすための命令を含むソフトウェアを使用して実行されてよい。ソフトウェアは、システムの特定のサブエンティティにより行われるステップのみを有する。ソフトウェアは、例えばハードディスク、フロッピー、メモリ、光ディスクなどの適切な記憶媒体に記憶されてよい。ソフトウェアは、有線により、又は無線により、又はデータネットワーク、例えばインターネットを使用して信号として送信されてよい。ソフトウェアは、ダウンロードのために、及び／又は、サーバーにおける遠隔使用のために利用可能とされてよい。本発明による方法は、本方法を実施するようにプログラム可能論理部、例えばフィールドプログラム可能ゲートアレイ（ＦＰＧＡ）を形成するように構成されたビットストリームを使用して実行されてよい。
【０１４４】
本発明は、本発明を実施するように適応されたコンピュータプログラム、特に担体上の、又は担体内のコンピュータプログラムにも及ぶことが理解される。プログラムは、例えば部分的にコンパイルされた形態のソースコード、オブジェクトコード、コード中間ソース、及びオブジェクトコードの形態であってよく、又は、本発明による方法の実施態様における使用に適した任意の他の形態であってよい。コンピュータプログラムプロダクトに関する一実施形態は、記載されている方法のうちの少なくとも１つの処理ステップの各々に対応したコンピュータ実行可能命令を含む。これらの命令は、サブルーチンに再分割されてよく、及び／又は、静的に、又は動的にリンクされる１つ又は複数のファイルに記憶されてよい。コンピュータプログラムプロダクトに関する別の実施形態は、記載されるシステム及び／又は製品のうちの少なくとも１つの手段の各々に対応したコンピュータ実行可能命令を含む。
【０１４５】
図７ａは、コンピュータプログラム１０２０を含む書き込み可能部分１０１０を含むコンピュータ可読媒体１０００を示し、コンピュータプログラム１０２０は、一実施形態による、プロセッサシステムにコンパイル方法を実施させるための命令を含む。コンピュータプログラム１０２０は、物理的なマークとして、又は、コンピュータ可読媒体１０００の磁化によりコンピュータ可読媒体１０００において具現化されてよい。しかし、任意の他の適切な実施形態も更に考えられる。更に、本例ではコンピュータ可読媒体１０００が光ディスクとして示されるが、コンピュータ可読媒体１０００は、任意の適切なコンピュータ可読媒体、例えばハードディスク、ソリッドステートメモリ、フラッシュメモリなどであってよく、書き込み不能であるか、又は書き込み可能であってよいことが理解される。コンピュータプログラム１０２０は、コンパイルの方法をプロセッサシステムに実施させるための命令を含む。
【０１４６】
図７ｂは、コンパイルデバイスの一実施形態によるプロセッサシステム１１４０の概略図を示す。プロセッサシステムは１つ又は複数の集積回路１１１０を備える。１つ又は複数の集積回路１１１０のアーキテクチャが図７ｂに概略的に示されている。回路１１１０は、一実施形態による方法を実行するように、及び／又はそのモジュール又はユニットを実装するようにコンピュータプログラムコンポーネントを動作させるための処理ユニット１１２０、例えばＣＰＵを備える。回路１１１０は、プログラミングコード、データなどを記憶するためのメモリ１１２２を備える。メモリ１１２２の一部が読み出し専用であってよい。回路１１１０は、通信要素１１２６、例えば、アンテナ、コネクタ、又はその両方などを備える。回路１１１０は、本方法において規定される処理の一部又はすべてを実施するための専用集積回路１１２４を備える。プロセッサ１１２０、メモリ１１２２、専用ＩＣ１１２４、及び通信要素１１２６は、バスなどの相互接続体１１３０を介して互いに接続される。プロセッサシステム１１１０は、アンテナ及び／又はコネクタをそれぞれ使用した接触及び／又は非接触通信のために構成される。
【０１４７】
例えば、一実施形態において、プロセッサシステム１１４０、例えばコンパイルデバイスは、プロセッサ回路とメモリ回路とを備えてよく、プロセッサはメモリ回路に記憶されたソフトウェアを実行するように構成される。例えば、プロセッサ回路は、Ｉｎｔｅｌ  Ｃｏｒｅ  ｉ７プロセッサ、ＡＲＭ  Ｃｏｒｔｅｘ−Ｒ８などである。一実施形態において、プロセッサ回路は、ＡＲＭ  Ｃｏｒｔｅｘ  Ｍ０である。メモリ回路は、ＲＯＭ回路、又は不揮発性メモリ、例えばフラッシュメモリである。メモリ回路は、揮発性メモリ、例えばＳＲＡＭメモリである。後者の場合において、デバイスは、ソフトウェアを提供するために構成された不揮発性ソフトウェアインターフェース、例えばハードドライブ、ネットワークインターフェースなどを備える。
【０１４８】
上述の実施形態は本発明を限定するのではなく例示すること、及び、当業者が多くの代替的な実施形態を設計することができることに留意されなければならない。
【０１４９】
特許請求の範囲において、括弧内に位置するいずれの参照符号も、請求項を限定すると解釈されてはならない。「備える（含む、有する、もつ）」という動詞及びその活用形の使用は、請求項に記載された要素及びステップ以外の要素及びステップの存在を否定するわけではない。単数形の要素は、複数のこのような要素の存在を否定するわけではない。本発明は、幾つかの区別される要素を備えるハードウェアにより、及び適切にプログラムされたコンピュータにより実装されてよい。幾つかの手段を列挙したデバイスの請求項において、これらの手段のうちの幾つかが同じ１つのハードウェア物品により具現化されてよい。単に特定の手段が相互に異なる従属請求項に記載されているということが、利点を得るためにこれらの手段の組合せが使用不可能なことを示すわけではない。
【０１５０】
特許請求の範囲において、括弧内の参照符号は、例示的な実施形態の図面における参照符号を表し、又は、実施形態の式を表すことにより、請求項を理解しやすくしている。これらの参照符号は、請求項を限定すると解釈されてはならない。
【符号の説明】
【０１５１】
（図１ａ〜図２ｂ、図４ａ〜図５、及び図７ａ〜図７ｂにおける符号の説明）
１００  コンパイルデバイス
１１０  入力インターフェース
１２０  ストレージ
１３０  パース部
１３２  データフローパーサー
１３４  符号化分析器
１４０  オプティマイザー部
１４２  パフォーマンス分析器
１４４  セキュリティー分析器
１４５  組合せ部
１５０  コンパイルユニット
１６０  プロセッサ回路
１６１  メモリ
２００  データフローグラフ
２１０  コピーファイサブグラフ
２１２〜２１６  コピー又はファイノード
２２０、２３０  ノード
２２２〜２２６  ノード
２３２〜２３６  ノード
２４１、２４２  コピーファイネットワーク
２４３  データ操作ブロック
２４４  符号化
２４５  コピーファイネットワークにおけるエレメント
４１０  ノード
４２０  データ生成器（例えばセンサー）
４２２  符号化及び暗号化（公開鍵：ｐｕｂＫ）
４３０  ソフトウェア
４３２  アルゴリズム
４３３  アルゴリズム
４４０  ハードウェア
４５０  クラウド
４６０  ソフトウェア（セキュア環境）
４６２  暗号解読及び復号
４７０  ハードウェア
４７２  セキュア要素（秘密鍵：ｐｋ）
４８１〜４８３  符号化
１０００  コンピュータ可読媒体
１０１０  書き込み可能部分
１０２０  コンピュータプログラム
１１１０  集積回路
１１２０  処理ユニット
１１２２  メモリ
１１２４  専用集積回路
１１２６  通信要素
１１３０  相互接続体
１１４０  プロセッサシステム
【図１ａ】
2021515314.tif 000007
【図１ｂ】
2021515314.tif 000008
【図１ｃ】
2021515314.tif 000009
【図２ａ】
2021515314.tif 000010
【図２ｂ】
2021515314.tif 000011
【図３ａ】
2021515314.tif 000012
【図３ｂ】
2021515314.tif 000013
【図４ａ】
2021515314.tif 000014
【図４ｂ】
2021515314.tif 000015
【図５】
2021515314.tif 000016
【図６】
2021515314.tif 000017
【図７ａ】
2021515314.tif 000018
【図７ｂ】
2021515314.tif 000019
【国際調査報告】
2021515314.tif 000020
2021515314.tif 000021
2021515314.tif 000022