(57)【特許請求の範囲】
【請求項１】
ホワイトボックス暗号法を用いて保護付きソフトウェアアプリケーションを生成する、コンピュータに実装される方法であって、
アプリケーションソースコードおよび抽象化されたホワイトボックス関数呼び出しを含む少なくとも１つの入力ソースファイルを受け取ることと、
各抽象化されたホワイトボックス関数呼び出しに対する暗号化ドメインパラメータを含むパラメータ化ファイルを受け取ることと、
各抽象化されたホワイトボックス関数呼び出しをその暗号化ドメインパラメータに従って定義するホワイトボックス呼び出し定義データを生成することと、
変換済みソースファイルおよび変換済みホワイトボックス呼び出し定義データをそれぞれ生成するように前記入力ソースファイルおよび前記ホワイトボックス呼び出し定義データに少なくとも１つのデータ変換を適用することと、
前記ホワイトボックス呼び出し定義データおよび前記変換済みホワイトボックス呼び出し定義データに従って各ホワイトボックス関数呼び出しに対するインスタンス固有のデータを含むデータ初期設定を生成することと、
を含む、方法。
【請求項２】
前記変換済みソースファイル、前記変換済みホワイトボックス定義データ、および前記データ初期設定をコンパイルすることと、実行可能ソフトウェアアプリケーションを提供するように結果として得られたコンパイル済みコードをホワイトボックスライブラリにリンクすることと、をさらに含む、請求項１に記載の方法。
【請求項３】
前記ホワイトボックス呼び出し定義データを生成することは、ホワイトボックス呼び出し定義ファイル、および、各ホワイトボックス関数呼び出しに対して選択されるパラメータを指定するホワイトボックスメタデータを生成することを含む、請求項１に記載の方法。
【請求項４】
前記変換済みホワイトボックス呼び出し定義データに前記少なくとも１つのデータ変換を適用することは、変換済みホワイトボックス呼び出し定義ファイル、および、選択されたパラメータに対して選択されるデータ変換を指定する変換メタデータを生成する、請求項３に記載の方法。
【請求項５】
前記データ初期設定を生成することは、前記ホワイトボックスメタデータおよび前記変換メタデータに従ってデータ初期設定ファイルを生成することを含む、請求項４に記載の方法。
【請求項６】
前記ホワイトボックス呼び出し定義データを生成することは、
データ変換エンジンによって理解される変換修飾子を含む前記ホワイトボックス呼び出し定義ファイルを生成することと、
前記暗号化ドメインパラメータおよび選択された前記データ変換を記述する前記変換メタデータを生成することと、
を含む、請求項４に記載の方法。
【請求項７】
前記ホワイトボックス呼び出し定義データを生成することは、ホワイトボックス実装アプリケーション・プロシージャル・インターフェイス（ＡＰＩ）を前記アプリケーションソースコードに接続するコード、および、ホワイトボックス実装ＡＰＩを別のホワイトボックス実装ＡＰＩに、これらのＡＰＩがやり取りをしなければならない場合に、接続するコードを自動に生成する、請求項１に記載の方法。
【請求項８】
前記ホワイトボックス関数呼び出しは、少なくとも１つの連鎖暗号化を呼び出す、請求項１に記載の方法。
【請求項９】
前記少なくとも１つの連鎖暗号化は、単一の操作として行われる、請求項８に記載の方法。
【請求項１０】
前記実行可能ソフトウェアアプリケーションの多様なインスタンスを生成することをさらに含む、請求項２に記載の方法。
【請求項１１】
前記多様なインスタンスを生成することは、前記実行可能ソフトウェアアプリケーションの各インスタンスに明白に異なる固定鍵を関連付けることを含む、請求項１０に記載の方法。
【請求項１２】
前記少なくとも１つのデータ変換は、ブロック暗号を含む、請求項１に記載の方法。
【請求項１３】
前記少なくとも１つのデータ変換は、非対称暗号を含む、請求項１に記載の方法。
【請求項１４】
プロセッサによって実行された場合に、前記プロセッサに請求項１から１３のいずれか一項に記載の方法を行わせるコンピュータ実行可能命令を記憶したコンピュータ可読媒体。
【請求項１５】
前記ホワイトボックス呼び出し定義データを生成することは、
データ変換エンジンによって理解される変換修飾子を含む少なくとも１つのホワイトボックス呼び出し定義ファイルを生成すること
を含む、請求項１に記載の方法。
【請求項１６】
前記ホワイトボックス呼び出し定義データを生成することは、
前記暗号化ドメインパラメータおよび／または選択された前記データ変換を記述する少なくとも１つの変換メタデータファイルを生成することと、
を含む、請求項１に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して暗号法に関する。より具体的には、本発明は、攻撃者が実行中のソフトウェアに対してフルアクセスおよび制御を有する環境において、安全に動作するように設計されたソフトウェアアプリケーションの開発に関する。
【背景技術】
【０００２】
ホワイトボックス暗号化ソフトウェアは、ホワイトボックス攻撃の文脈において、すなわち、ソフトウェアアプリケーションの少なくとも一部かつ潜在的には実装全体が、かかるソフトウェアがその上で実行されるプラットフォームの少なくともある程度の制御、かつ恐らくは完全な制御を有する攻撃者に対して潜在的にさらされる環境において、暗号化関数を行うソフトウェアである。
【０００３】
このような文脈は、例えば、テレビ番組、映画、音楽等が、放送を介するまたはＤＶＤプレイヤを介する従来のテレビジョン上ではなく、パーソナルコンピュータ（ＰＣ）または他の同様のコモディティコンピュータデバイス上に表示されるデジタル著作権管理（ＤＲＭ）といった暗号化アプリケーションに関連して発生する。このようなコモディティデバイスの多くの所有者は著作権法を遵守するが、中には、媒体コンテンツの違法コピーを製造および販売することによって、コンテンツの所有者に使用料を支払うことなくコンテンツを盗んでＰＣまたは同様のデバイス用の媒体から利益を得ようと試みる人がいる。ＰＣは特に無防備な環境であり、知識豊富な攻撃者は、デバイスの完全な制御を獲得して、実行中のソフトウェアを詳細に観察して、デバッガを用いてその実行を制御、停止、または修正することができ、また、悪用されうる挙動のパターンを求めて同じコードを繰り返し実行することができる。
【０００４】
ホワイトボックス暗号化ソフトウェアは、このような文脈において実行するように設計される。暗号化関数は、ホワイトボックス攻撃の文脈を対象とするが、この暗号化関数は、従来の暗号（cipher）も実装しうるが、攻撃者がソフトウェアの動作方法を理解することを防止するために、従来とは多いに異なった方法で実装する。例えば、通常、鍵は、部分評価によってホワイトボックス暗号化ソフトウェアの残りの部分に埋め込まれるか、または、符号化される。さらに、暗号の入力および出力テキストは、通常、符号化されて、それにより、ホワイトボックス暗号化実装に攻撃を開始する際に、その暗号の従来の実装に関する攻撃者の知識がそれほど役には立たないようにする。
【０００５】
従来は、ユーザは、ホワイトボックスライブラリツールにアクセスするために用いられるＡＰＩ呼び出しも含むユーザ定義ソフトウェア内に組み込まれうるセキュリティパラメータを決定かつ指定することが求められていた。つまり、従来では、ホワイトボックス暗号化操作は、構築済みのホワイトボックス実装をソフトウェア内に含め、そのインターフェイスデータ（例えば、暗号化（encryption）では、インターフェイスデータは、通常、鍵、プレーンテキスト入力、およびサイファテキスト出力を含む）を、Ｃｌｏａｋｗａｒｅ  ＴｒａｎｓｃｏｄｅｒＴＭといった難読化および／または改ざん防止ツールを用いて任意選択的に保護することによってソフトウェアアプリケーションに投入されてきている。暗号化機能（functionality）を採用するソフトウェア、それを実装するソフトウェア、鍵（または、公開鍵暗号法の場合には複数の鍵）、テキスト入力、およびテキスト出力を互いに正しく接続するための責任は暗号化機能を利用するプログラマ（プログラマ／ユーザ）にある。
【０００６】
どのステップもプログラマ／ユーザの制御下にあるので、人間が完全なパフォーマンスを期待してしまうことから来るあらゆる問題がある。プログラマ／ユーザが成功すると、結果として得られるのは、意図した通りの機能である。プログラマ／ユーザがステップを飛ばすとまたはステップを間違って行うと、機能は、意図したものとは全体的にまたは微妙に異なりうる。微妙に異なる場合ははるかに危険である。全体的なエラーは通常テスト時に見つけられるが、微妙なエラーは見落とし易いからである。
【０００７】
したがって、ホワイトボックス暗号化実装の出現によってＤＲＭコンテンツ配信システムをより実現可能としたが、それにも関わらず、この実装の、いわゆる、ペリクリプティック（peri-cryptic）（暗号化されていないテキストがホワイトボックス実装に入るまたは離れる）側面、および、インタークリプティック（inter-cryptic）（暗号化されたテキストが１つの暗号化形式から別の暗号化形式に移る）側面に大きな問題が残ることは明らかである。ホワイトボックス暗号または暗号化ハッシュ自体に加え、ホワイトボックス暗号または暗号化ハッシュがその中に駐在するソフトウェアの構築、かつ、システムが複数の暗号およびハッシュを採用する場合に、暗号化またはハッシュ化されたコンテンツが移動する情報パイプの「配管（plumbing）」を形成する様々な暗号化コンポーネント間の接続の構築を改善する必要があることを見出した。ソフトウェアのペリクリプティックおよびインタークリプティック部分は、従前は、知識が豊富なユーザによって詳細に手動で構築されなくてはならなかった。
【発明の概要】
【０００８】
ホワイトボックス暗号法を用いて保護付きソフトウェアアプリケーションを生成する、コンピュータによって実装される方法と、かかる方法を具現化するコンピュータプログラムプロダクトが提供される。かかる方法は、アプリケーションソースコードおよび抽象化されたホワイトボックス関数呼び出しを含む少なくとも1つの入力ソースファイルを受け取ることと、各抽象化されたホワイトボックス関数呼び出しに対する暗号化ドメインパラメータを含むパラメータ化ファイルを受け取ることとを含む。次に、各抽象化されたホワイトボックス関数呼び出しをその暗号化ドメインパラメータに従って定義するホワイトボックス呼び出し定義データが生成される。次に、変換済みソースファイルおよび変換済みホワイトボックス呼び出し定義データをそれぞれ生成するように入力ソースファイルおよびホワイトボックス呼び出し定義データに、ブロックまたは非対称暗号といった少なくとも１つのデータ変換が適用される。次に、ホワイトボックス呼び出し定義データおよび変換済みホワイトボックス呼び出し定義データに従って各ホワイトボックス関数呼び出しに対するインスタンス固有のデータを含むデータ初期設定が生成される。次に、変換済みソースファイル、変換済みホワイトボックス定義データ、およびデータ初期設定コードがコンパイルされ、実行可能ソフトウェアアプリケーションを提供するように結果として得られたコンパイル済みコードがホワイトボックスライブラリにリンクされる。ホワイトボックス呼び出し定義データは、ホワイトボックス実装アプリケーション・プロシージャル・インターフェイス（ＡＰＩ）をアプリケーションソースコードに接続するコード、および、ホワイトボックス実装ＡＰＩを別のホワイトボックス実装ＡＰＩに、これらのＡＰＩがやり取りをしなければならない場合に、接続するコードを自動に生成する。
【０００９】
この態様の実施形態では、ホワイトボックス呼び出し定義データは、ホワイトボックス呼び出し定義ファイル、および、各ホワイトボックス関数呼び出しに対して選択されるパラメータを指定するホワイトボックスメタデータを含むことができ、また、変換済みホワイトボックス呼び出し定義データに少なくとも１つのデータ変換を適用することは、変換済み弱いとボックス呼び出し定義ファイル、および、選択されたパラメータに対して転宅されるデータ変換を指定する変換メタデータを生成する。データ初期設定を生成することは、ホワイトボックスメタデータおよび変換メタデータに従ってデータ初期設定ファイルを生成することを含むことができる。
【図面の簡単な説明】
【００１０】
本発明の他の態様および特徴は、添付図面と共に本発明の具体的な実施形態の以下の説明を確認することにより当業者には明らかとなろう。
【００１１】
本発明の実施形態を、添付図面を参照しながらほんの一例として以下に説明する。
【図１】図１は、本発明の一実施形態によるホワイトボックス暗号法統合のための基本的な設計フロー図である。
【図２】図２は、本発明の一実施形態によるホワイトボックス暗号法のための拡張された設計フロー図である。
【図３】図３は、本発明の一実施形態による連鎖暗号化シナリオの図である。
【図４】図４は、本発明の一実施形態による、連鎖暗号化ＡＰＩが使用される連鎖暗号化シナリオの図である。
【図５】図５は、本発明の一実施形態およびその操作を示す略図である。
【図６】図６は、本発明の一実施形態によるロバストな実装を構築するためのステップを示す図である。
【発明を実施するための形態】
【００１２】
ホワイトボックス暗号化機能を採用するアプリケーションのペリクリプティックおよびインタークリプティック部分を構築するステップを自動化できる方法およびシステムが必要であることは明らかであり、それにより、現行のエラーが発生しやすいそのようなシステムを構築する方法をより信頼のおける自動化方法によって置換できるようにする。これを達成するために、上記の自動化システムに適合するようにアプリケーションの通常のイントラクリプティック部分（ホワイトボックス操作を実際に行う部分）が従来よりも柔軟性があるようになった実施形態が開示される。
【００１３】
このようなシステムの利点は、手書きでアセンブリコードを書くのではなく、コードをコンパイルすることによって達成される利点に類似する。理論上は、有能なプログラマは、手書きのアセンブリコードでアプリケーションを書くことができるべきである。しかし、実際には、手書きのアセンブリコードは非常にエラーを発生しやすく、また、コンパイラは、低水準の非常に詳細なソフトウェア構築レジームをよりはるかに自動化されたものに置換することによって、アセンブリコードレベルでは達成することのなかった複雑さを有するソフトウェアシステムを可能にする。
【００１４】
本出願の１つの態様は、ホワイトボックス実装のペリクリプティックおよびインタークリプティック側面が抽象化されかつ自動化されるシステムおよび方法を提供し、それにより、そのユーザが、ペリクリプティックおよびインタークリプティックの手書きのコードのソフトウェアによって達成することが以前は困難または実現不可能であった複雑さのレベルでホワイトボックス暗号化実装の使用を実装することを可能にし、同時に、手書きのアセンブリコードをＣ＋＋といった高水準言語のソースコードからコンパイルされたコードによって置換することによるさらに単純なプログラム利益と同様に、プログラマ／ユーザがホワイトボックス暗号法を作成することをはるかに簡単にすることによってホワイトボックス暗号法のより簡単な使用からも利益を得る。
【００１５】
この自動化の側面は、様々な形式の暗号化機能が表現される方法の単一化（unification）である。例えば、Ｃ＋＋といったコンパイラ型言語では、加算されるのが２つの整数であろうと、２つの浮動小数点数であろうと、２つの複素数であろうと、同じ統語型式が加算に用いられる。言語およびそのコンパイラは、実装がコンパイラに構築される（整数と浮動小数点数の場合）か、または標準ライブラリの一部（複素数の場合）であるか否かに関係なく、加算を概念として抽象化し、この概念は、その概念が用いられる各文脈に対して適切に実装される。同様の単一化を、本明細書において、ホワイトボックス暗号化操作についても開示する。各暗号化操作がその独自の一意のインターフェイスを有しまたその独自の一意の表現様式を必要とするならば、自動化はほとんど不可能であり、適切な選択をする責任の大部分は、必然的にプログラマ／ユーザになくてはならない。インターフェイスおよび表現様式が単一化されたのならば、システムは、特定の暗号を捨象（abstract away）し、かつ、各文脈の必要性に自動的に対処することができる。
【００１６】
したがって、セキュリティに関するパラメータを、ホワイトボックスライブラリツールにアクセスするために用いられるＡＰＩ呼び出しを含むユーザ定義ソフトウェアから切り離す実施形態が開示される。これにより、ユーザ定義ソフトウェアを変更する必要なく単にパラメータを変更することによって、アプリケーションに適用される保護のタイプおよびセキュリティレベルを簡単に変更することができる。このことは、セキュリティ実装およびコードを変更することができる、または、保護の追加のツールおよび／またはレベルを利用することができるフィールドアップグレード可能機能を可能にする。ハッカーがセキュリティを破る場合、このようなシステムは、パラメータを変更してアプリケーションをリコンパイルすることによって、ハッカーに対して新しいおよび／または追加の難関を与えることによって対応できる。
【００１７】
現在好適な実施形態は、各アプリケーションに対して多数のセキュリティ手段が可能である多くの様々なセキュリティ実装の使用を可能にする。このことは、１つの実装に対して成功する攻撃が、ホワイトボックス暗号法を採用する所与のソフトウェアアプリケーションのすべてのまたは多くの実装に対して成功する攻撃とはならないということを確実にするために有益である。
【００１８】
一般に、開示する実施形態は、ＡＰＩと、アプリケーションまたはファイルを暗号化する、難読化する、またはそうでなければ保護するために用いられるパラメータとを切り離すことを含む、ソフトウェアファイルにホワイトボックス暗号法を統合するための、コンピュータに実装される方法およびシステムを提供する。このような統合型開発スイートの特定の利点は、アプリケーション内で適用可能でありかつホワイトボックス暗号化実装によって理解されるデータ変換の使用を介した、暗号化アプリケーションと周辺のアプリケーションとの境界の保護である。
【００１９】
以下の記載において、説明の目的のために、本発明の十分な理解を提供するために多くの詳細を記載する。しかし、当業者であれば、これらの具体的な詳細は、本発明を実施するために必要ではないことは明らかであろう。他の場合では、周知の電気構造および回路を、本発明を曖昧としないためにブロック図型式で示す。例えば、本明細書に記載の本発明の実施形態がソフトウェアルーチン、ハードウェア回路、ファームウェア、またはこれらの組み合わせとして実装されるかどうかについては特定の記載はない。本発明の実施形態は、機械可読媒体（内部にコンピュータ可読プログラムコードが具現化されたコンピュータ可読媒体、プロセッサ可読媒体、またはコンピュータ使用可能媒体とも呼ばれる）内に記憶されたソフトウェアプロダクトとして提示されうる。機械可読媒体は、ディスケット、コンパクトディスク読み出し専用メモリ（ＣＤ−ＲＯＭ）、メモリデバイス（揮発性または不揮発性）、または、同様のストレージ機構を含む、磁気、光学、または電気ストレージ媒体を含む任意の好適な有形媒体であってよい。機械可読媒体は、様々なセットの命令、コードシーケンス、コンフィグレーション情報、または他のデータを含んでよく、これらは、実行される場合に、プロセッサに本発明の一実施形態による方法におけるステップを行わせる。当業者であれば、記載の発明を実施するために必要な他の命令および演算も機械可読媒体上に記憶されうることは理解できよう。機械可読媒体から実行されるソフトウェアは回路と連動して記載のタスクを行わせうる。
【００２０】
本文書全体に亘って、用語「ホワイトボックス」は接頭辞として頻繁に用いて、「ホワイトボックス呼び出し」、「ホワイトボックスライブラリ」、「ホワイトボックス関数」等のように用語を作成する。そのような接頭辞として用いられる場合、用語「ホワイトボックス」は、「ホワイボックス攻撃者に対するセキュリティを与えるように設計された暗号化実装」の省略表現である。同様に、用語「ホワイトボックス暗号法」は、それ自体が「ホワイトボックス攻撃者に対するセキュリティを与えるように設計された暗号化実装」の省略表現である。明確にするために、「ホワイトボックス」の接頭辞は、物（item）自体を指すことはなく、これは記載の実施形態はソフトウェア環境において機能するからである。これらの実施形態およびユーザのアプリケーションは、攻撃者が容易に理解できるものであると考えると、つまり、これらの実施形態およびユーザのアプリケーションはホワイトボックスである。実際には、これらの用語は、単なる他の省略表現である。例えば、「ホワイトボックスライブラリ」は、ホワイトボックス攻撃者に対するセキュリティを与える暗号化関数の実装を含むライブラリ、または、よりやや簡潔には、ホワイトボックス暗号法を含むライブラリである（ここでは、したがって、いかに「ホワイトボックスライブラリ」が二重の省略表現（double shorthand））であるかが分かる）。「ホワイトボックス関数」とは、ホワイトボックスライブラリにおける関数の１つである。「ホワイトボックス関数呼び出し」または単に「ホワイトボックス呼び出し」とは、ホワイトボックス関数に対する呼び出しである。他の用語も同様に解釈されるべきである。
【００２１】
記載の実施形態は、ホワイトボックス暗号法をソフトウェア開発スイートに統合する。図１を参照すると、非常に高いレベルでは、本発明によるアプリケーションへのホワイトボックス暗号法の統合には、ユーザが、ユーザのアプリケーション全体に亘る暗号化機能と、クリティカルセキュリティパラメータのフローとについて関数およびロバスト性に関する幾つかの選択をすることが含まれる。符号１００に示すように、ユーザは、抽象化された呼び出し（wbfunc(…)と示す）をホワイトボックスＡＰＩに追加して所望の暗号化機能を実装し、さらに、ユーザのコード全体にコマンドを追加してクリティカルセキュリティパラメータに必要な保護を特定する。幾つかのホワイトボックスツールおよびライブラリを用いて（ステップ１０２）ロバストコード１０４が作成され、このロバストコードはコンパイルされてホワイトボックスライブラリ１０８にリンクされて（ステップ１０６）、安全な方法で暗号化操作を行いかつアプリケーションのデータフロー全体に亘ってクリティカルセキュリティパラメータを保護する実行可能ファイル１０９が作成される。
【００２２】
しかし、概念上は、このプロセスを、ユーザが最初にユーザのアプリケーションにおいて暗号化機能および鍵のフローについて最も基本的な選択をしてかつそれを実装し、次に、関数型パラメータ（functional parameter）をさらに絞り込み、最終的にロバスト性を追加するステップを行う進化として理解した方が簡単である。各段階において、アプリケーションをビルドしかつテストする能力（ability）があり、最終的には、ユーザはロバストアプリケーションを調整しかつ任意選択的に各ビルドをパーソナライズする。この拡張された設計フローは、図２に示され、また、スタブビルド（stub build）１１０、スムーズビルド（smooth build）１１２、およびロバストビルド（robust build）１１４を含む。スタブビルド１１０およびスムーズビルド１１２は任意選択的であり、また、広義においてのみ説明する。これらの実装は、当業者には明らかであるように設計上の選択であり、また、本明細書では本発明によるホワイトボックスアプリケーション開発フローの一実施形態を説明する目的のためだけに説明する。
【００２３】
スタブビルド１１０では、ユーザは、ホワイトボックス関数呼び出しを適切なホワイトボックス暗号法ＡＰＩに追加して、対称暗号化、非対称暗号化、およびハッシュ法といった機能を追加して入力ソースファイル１００を作成する。ユーザは、ホワイトボックススタブライブラリ１１８内に定義されるホワイトボックス呼び出しのスタブ実装に対してユーザのプログラムをコンパイルかつリンクして（ステップ１１６）、スタブ実行ファイル１２０を生成し、スタブ実行ファイルは次にテストされて（ステップ１２２）、鍵のフローにおける基本的なエラーは当然ながらコンパイルおよびリンクエラーがないかチェックされる。スタブライブラリ１１８内に実装されるスタブ暗号化関数は単純だが、一致するパラメータが両関数に渡されていない限り復号化および暗号化が互いの逆になり得ないような方法で構築される。例えば、動的鍵復号化は、元のメッセージを回収するためには動的鍵暗号化と同じ鍵を用いなければならない。これらの鍵が同じでなければ、符号化エラーによって、スタブ復号化は、スタブ暗号化の結果を適切に復号化して元のメッセージを生成する可能性は低い。
【００２４】
スムーズビルド１１２では、ユーザは、幾つかの最初の、機能に関する選択をして各呼び出しをパラメータ化し、これらの選択を詳述するホワイトボックスパラメータ化ファイル１２４を作成する。ユーザは、次に、コード生成ツールを適用して（ステップ１２６）行った選択を適用し、スムーズバージョンのホワイトボックスライブラリ１３０内に定義されるホワイトボックス呼び出しのスムーズ実装に対してユーザのプログラムをコンパイルかつリンクする（ステップ１２８）。スムーズバージョンのホワイトボックスライブラリ１３０とは、単に、真のホワイトボックスライブラリと同じＡＰＩを実装するが、スムーズであるライブラリを指す。結果として得られるスムーズ実行ファイル１３２をテストして（ステップ１３４）、基本機能が正常に動いていることを確実にする。
【００２５】
ロバストビルド１１４では、ユーザは、ユーザの保護付きアプリケーションにおけるサイズ、速度、およびセキュリティのトレードオフに関する選択をする。ユーザは、以下に詳述するホワイトボックス暗号法ツールを適用し（ステップ１３６）、ロバストな変換済みコード１３８を生成する。ロバストな変換済みコード１３８は、次に、コンパイルされて、ホワイトボックスライブラリ１４４内のホワイトボックス呼び出しの安全な実装にリンクされて（ステップ１４０）、保護付き実行ファイル１４６が生成される。この保護付き実行ファイルは次にテストされて（ステップ１４７）、機能とセキュリティの両方を確実にする。ユーザは次に任意選択的に、より軽量のプロセスを用いて、個別化のためにデータの多くの多様なインスタンス１４９を生成する（ステップ１４８）。
【００２６】
ロバストビルドのプロセスおよびコンポーネントを、図５および図６を参照しながらより詳細に以下に説明する。図５はロバストビルドの簡易化した概観を示し、図６は以下に詳述する詳細な実装の一実施形態を示す。
【００２７】
図５の実施形態は、例えばソフトウェアアプリケーションファイルである保護付きファイルを生成するための３つのモジュール、すなわち、ホワイトボックスコード生成ツール（ｗｂｃｏｄｅｇｅｎ）１５０、データ変換エンジン（ｘｃｏｄｅ）１５２、およびホワイトボックスデータ生成ツール（ｗｂｄａｔａｇｅｎ）１５４を含む。ホワイトボックス暗号法の文脈では、データ変換エンジン１５２は、暗号化操作と周辺のコードとの境界を保護するために用いられる。特に、データ変換エンジン１５２は、暗号化操作への入力および暗号化操作からの出力にデータ変換を適用するように用いられる。ユーザが、ホワイトボックスパラメータ化ファイル１２４を介して変換が必要であることを指定すると、ｗｂｃｏｄｅｇｅｎ１５０は、ユーザによって指定された情報を、データ変換エンジン１５２が理解できる形式、すなわち、データ変数の修飾子および関数プロトタイプにする。データ変換エンジン１５２は次に指定された変換を適用して、どの変換が選択されたのかに関する情報をｗｂｄａｔａｇｅｎ１５４に渡す。
【００２８】
このことを達成するデータフローは、図５のハイレベルで示す。ホワイトボックスコード生成ツール１５０は、アプリケーションソースコードと抽象化されたホワイトボックス関数呼び出しを含む少なくとも１つの入力ソースファイル１００（ｕｓｅｒＣｏｄｅ）と、抽象化された各ホワイトボックス関数呼び出しに対する暗号化ドメインパラメータを含むパラメータ化ファイル１２４とを受信する。ホワイトボックスコード生成ツール１５０は、これらの入力を処理して、抽象化された各ホワイトボックス関数呼び出しをその暗号化ドメインパラメータに従ってかつデータ変換エンジン１５２によって理解される方法で定義するホワイトボックス呼び出し定義データ１５６（ｗｂ＿ｇｌｕｅ．ｃ）を生成する。データ変換エンジン１５２は次に１つ以上のデータ変換を入力ソースファイル１００およびホワイトボックス呼び出し定義データ１５６に適用して、変換済みソースファイル１６０および変換済みホワイトボックス呼び出し定義データ１５８（ｗｂ．ｘｗｂｍ）を生成する。データ生成ツール１５４は、次に変換済みホワイトボックス呼び出し定義データ１５８に応じて各ホワイトボックス関数呼び出しに対するインスタンス固有データを含むデータ初期設定（initializations）１６２（ｗｂ−ｇｌｕｅ  ｄａｔａ）を生成する。データ初期設定１６２および変換済みソースファイル１６０は、次にネイティブコンパイラを用いてコンパイルされて、ホワイトボックスライブラリにリンクされうる。
【００２９】
ホワイトボックスＡＰＩ
ユーザは、ユーザのアプリケーションにおいて暗号法が必要であることを確認すると、ユーザが行うＡＰＩへの各呼び出しについて２つの選択肢を有する。これらの選択肢は、ユーザのアプリケーションの基本的な鍵のフローを決定する。（１）行われるべき暗号化操作は何か？  可能な操作には、暗号化、復号化、署名、署名認証、ハッシュ法等が含まれる。（２）この呼び出しのための鍵はランタイムにおいてのみ利用可能であるのか、またはその前に利用可能となるのか？  セッション鍵またはコンテンツ鍵といった鍵は、通常、動的に生成されるか、または、非対称復号化の結果として計算される。このような鍵を動的であると広く呼ぶことにする。その一方で、ビルド時間において既知である、または、オフラインサブスクリプション／更新プロセスを介して得ることのできる鍵は、固定鍵と呼ぶ。当然ながらすべての鍵を動的に取り扱うこともできるが、固定鍵として取り扱える場合には、セキュリティ上の優位点がある。
【００３０】
上述の決定がなされると、ユーザアプリケーションコードを書き込んでかかる選択に適したＡＰＩを起動させることができる。入力ソースファイル１００であるユーザアプリケーションは、非常に最小限のＡＰＩを用いる、鍵スケジューリング、暗号化、復号化等の暗号化操作の起動を含むソースコード（例えばＣまたはＣ＋＋で表される）から構成される。サイファテキスト、プレーンテキスト、ｉｖ等といった鍵ユーザから提供されるデータは、パラメータとして、これらの起動に、関連する呼び出しを単一の暗号化ドメインにまとめるために用いられる数値定数ＩＤパラメータと共に渡される。１つの好適な実施形態では、ユーザアプリケーションコードは、ホワイトボックスタイプとマクロを定義するインクルードファイル１７０：ｘｃ／ｘｃ＿ｗｂ．ｈを含むことが必要とされる。すべての暗号化操作は、このインクルードファイル１７０からのマクロを使用して起動されることが可能である。好適には、ホワイトボックスインクルードファイル１７０（ｘｃ／ｘｃ＿ｗｂ．ｈ）は、あらゆる暗号タイプに対する暗号化操作のそれぞれに対して単一のマクロ定義を提供する。マクロは、パラメータとして、ユーザから供給されたパラメータの最小のセット（通常、プレーンテキスト／サイファテキストといったアプリケーションデータ）、（操作の暗号化ドメインを特定する）単一のＩＤパラメータ、およびオプションパラメータを受け取る。例えばブロック暗号の暗号化呼び出し（block cipher encrypt call）を以下に示す。なお、マクロ起動（ＸＣ＿Ｆｉｘｅｄ＿Ｋｅｙ＿Ｂｌｏｃｋ＿Ｃｉｐｈｅｒ＿Ｅｎｃｒｙｐｔ）は非常に抽象化されており、また、暗号化操作のために必要な実際のアプリケーションデータしか指定しないことに留意されたい。
【数１】
0005460699.tif 000002
【００３１】
ホワイトボックスインクルードファイル１７０（ｘｃ／ｘｃ＿ｗｂ．ｈ）は、ユーザアプリケーションコードの観点からホワイトボックスＡＰＩ全体を定義する。このＡＰＩは、アプリケーションコードにおける使用のために利用可能であるすべての抽象的な暗号化操作を定義する関数形式マクロの形式をとる。さらに、このインクルードファイル１７０は、こちらもマクロ定義の形式で、以下に示すホワイトボックスグルーファイルのコンテンツを記述する。以下の例示的なコードスニペットは、固定鍵、ブロック暗号の暗号化操作のための単一の抽象的なＡＰＩのハイレベルの詳細を示す。
【数２】
0005460699.tif 000003
【００３２】
多くの場合、暗号化関数は単独では行われない。代わりに、アプリケーションは、通常は階層構造にある一連の鍵を含み、暗号化操作は連鎖状にされ、階層構造において最下位の鍵はコンテンツを保護するために用いられ、より重要な鍵は下位の鍵を保護するために用いられる。階層構造の最上位では、１つ以上の「ルーツ・オブ・トラスト（roots of trust）」鍵があり、それらの開示は他の鍵すべてを、保護されていない状態にすることになり、したがって、完全なセキュリティ侵害がもたらされる。
【００３３】
階層構造の単純な一例としては、コンテンツ鍵と呼ばれるランダム鍵を用いたＡＥＳ暗号化を用いて保護される音楽ファイルといったコンテンツを有することである。コンテンツ鍵自体は、クライアント固有の公開鍵を用いたＲＳＡ暗号化を用いて保護される。その場合、ルーツ・オブ・トラストは、クライアントアプリケーションの一部である（しばしば固定の）ＲＳＡ秘密鍵である。この階層構造は図３に示す。概して、１つの暗号化操作の出力が、後続の暗号化操作への入力の１つになる任意のシナリオは、連鎖暗号化（chained encryption）と呼ばれる。連鎖暗号化の別の頻出例はトランスクリプション（transcription）である。トランスクリプションには、１つのアルゴリズムおよび鍵を用いて一部のコンテンツを復号化し、その後に別のアルゴリズムおよび鍵を用いてその同じコンテンツを直ぐに再暗号化することが含まれる。トランスクリプションは、しばしば、互いにやり取りする２つのプログラム間の境界かまたはソフトウェアとハードウェアとの境界において行われる。
【００３４】
これは、連鎖暗号化操作を単一の操作として考えると明白なセキュリティ上の利点である。すなわち、１つの操作から次の操作へ渡される値は、２つの操作間の境界において保護されていない状態になるのとは対照的にうまく隠される。この値を操作間の境界において変換することも当然実現可能でありかつ保護を提供するが、連鎖操作の真の混合は、適用できるセキュリティ技術においてより大きい柔軟性を提供し、したがってより優れた全体的な保護を提供する。
【００３５】
本明細書に記載するホワイトボックスインフラストラクチャおよびＡＰＩは、複数の連鎖暗号化シナリオをサポートするよう容易に拡張することができる。具体例を以下に示す。この例は、図３のクライアント側に対応し、ＲＳＡおよびＡＥＳ復号化を単一の連鎖復号化に組み合わせるよう修正されている。図４はこの変更を示す。なお、復号化されたコンテンツ鍵は図面に登場していない。この例は例示に過ぎない。
【数３】
0005460699.tif 000004
【００３６】
ホワイトボックスパラメータ化
ユーザは、その鍵のフローの妥当性を確認すると、各ホワイトボックス暗号法関数呼び出しをさらにパラメータ化するために一連の関数に関する選択をしなければならない。これらの質問の多くは暗号に固有であるが、幾つかの一般的な質問例は次の通りである。（１）どのアルゴリズムが必要か？  大抵の場合、使用するアルゴリズムは関連のある標準によって指定される。（２）必要な鍵のサイズは何か？  ここでは有効な選択はアルゴリズムに依存する。これらの決定は、ユーザによって提供されるホワイトボックスパラメータ化ファイル１２４内に保存され、ホワイトボックスパラメータ化ファイルは、次にユーザのソースコードと共に処理されて実行ファイルをビルドする。
【００３７】
暗号化操作の固有の側面についてユーザが選択をする（使用するアルゴリズムといった基本的なことから使用する鍵といった具体的なこと）主な機構は、ホワイトボックスパラメータ化ファイル１２４を介する。このファイルは、ユーザによって書き込まれ、ホワイトボックス関数への各呼び出しについて詳述する。一実施形態では、ホワイトボックスパラメータ化ファイル１２４の形式は、暗号化ドメインパラメータ名および暗号化ドメインパラメータ値から構成される行指向のテキストである。これらのパラメータ名／値の対（以下「暗号化ドメインパラメータ」または単に「パラメータ」と呼ぶ）は、個別のホワイトボックスパラメータ化レコードを作成するよう分類される。各レコードの始まりは、識別子（ＩＤ）パラメータの存在によって区切られ、次の識別子（またはエンド・オブ・ファイル）の発生において終了する。パラメータ化レコードの範囲において、任意の数の一意パラメータが列挙されてよい（任意のパラメータ名の重複はエラーである）。当業者であれば理解できるように、特定のパラメータが省略されてもまたデフォルト値を有してもよく、その一方で他のパラメータは必須でなければならない。いずれにせよ、個別のパラメータの範囲は、現在のパラメータ化レコードまでである。
【００３８】
ＩＤパラメータの値を用いてホワイトボックス呼び出しを特定する。したがって、次のことが好適である。
１．所与の呼び出しがパラメータ化ファイル１２４内の所与のレコードに一貫してマッピングされるように、ＩＤはリテラル整数定数である。
２．パラメータ化ファイル１２４内の所与のレコードが一意の呼び出しにマッピングされるように、各呼び出しには一意のＩＤが与えられる。この規則には次の例外があってもよい。
ａ．データを共有するように選択された呼び出しは同じＩＤが与えられなければならない。
ｂ．他の暗号に固有の例外。
【００３９】
各ＩＤについて、ホワイトボックスパラメータ化ファイル１２４はレコードを含み、このレコードは、かかるレコードに関連付けられた特定のパラメータが列挙され、１つのパラメータがファイルの１行に記載される。ホワイトボックスレコードのパラメータは、３つの広いカテゴリに分類することができる。
●カテゴリ化パラメータ。これらのパラメータは、ブロック暗号または非対称暗号、および、固定鍵対動的鍵といった、用いられるべき暗号化アルゴリズムのカテゴリを記述する。これらのパラメータは２つの目的を有する。第一に、これらのパラメータは、ユーザはレコードを見て対応するホワイトボックス呼び出しの挙動を正確に知ることができるという点でパラメータ化ファイルのレコードを自己充足型にする。第二に、これらのパラメータの仕様によってどのユーザ提供パラメータが期待されるのかを正確に決定されるので、これらのパラメータはエラーチェックを可能にする。
●関数型パラメータ（functional parameter）。これらのパラメータは、ラウンド数といった、用いられるべき暗号化アルゴリズムの特定の属性を記述し、ホワイトボックスＡＰＩにパラメータまたはオプションとして渡される（これは自動的に行われるのでエンドユーザにはトランスペアレントである）。なお、アルゴリズムは関数型パラメータ（例えば、アルゴリズム＝ＡＥＳ対アルゴリズム＝ＤＥＳ）であって、カテゴリ化パラメータとは見なされない。
●ロバスト性パラメータ。これらのパラメータは、選択されたパラメータに対する変換といった、ホワイトボックス起動のロバスト性特徴に関する特定の決定を記述する。
【００４０】
最上位のカテゴリ化パラメータはＦｕｎｃｔｉｏｎＴｙｐｅである。他の有効なカテゴリ化パラメータの他にまた関数型パラメータおよびロバスト性パラメータは、ＦｕｎｃｔｉｏｎＴｙｐｅに対して指定された値に依存する。以下の例は、ブロック暗号のための典型的なホワイトボックスパラメータ化エントリを示す。記載するパラメータの多くは暗号に固有であり、それらの意味はここには記載しない。
【数４】
0005460699.tif 000005
【００４１】
この時点で、ユーザは、幾つかのセキュリティに関する選択をしなければならない。可能な限り、ホワイトボックス暗号法関数に対する呼び出しへの入力および呼び出しからの出力は変換されるべきである。特にブロック暗号の場合、プレーンテキスト、サイファテキスト、（動的鍵関数用の）鍵、および（ＥＣＢ以外のモード用の）初期化ベクトルは変換されるべきである。一例として、セキュリティが高くなる順番で利用可能な変換のセットは、次の通りである。
【表１】
0005460699.tif 000006
【００４２】
好適には、あらゆるデータ変換を入力および出力に用いることができる。ユーザは、ホワイトボックスパラメータ化ファイル１２４内に入力および出力のための論理変換形式を指定しうる。例えば、ユーザは、所与のｉｄに対して、次のエントリ：ＰｌａｉｎＴｒａｎｓｆｏｒｍ  ｂｌｕｅを指定しうる。これは、所与のＩＤに対応する呼び出しのプレーンテキストが、「ブルー」論理変換形式を用いて変換されることを示す。すべての変換されるべき暗号入力および出力は、ホワイトボックスパラメータ化ファイル１２４内に適切なＴｒａｎｓｆｏｒｍエントリを有さなくてはならない。多くのホワイトボックス関数（最も注目すべきはホワイトボックスＡＥＳ）は、幾つか異なる方法で実装されることが可能である。暗号化形式として知られるこれらの方法のそれぞれは、サイズ、速度、およびセキュリティ間で異なるトレードオフがなされる。ユーザは、ホワイトボックスパラメータ化ファイル１２４内に記載される各論理変換形式に対してマッピングされる変換形式を提供する責任がある。これは、通常、コンフィグファイルを介して行われるが、コマンドライン上を直接供給されてもよい。
【００４３】
上述したように、ホワイトボックス呼び出しとパラメータ化ファイルレコードとの接続（したがって、コードおよびデータを含むインスタンス固有セット）は、ＩＤパラメータである。したがって、同じ関数への２つの呼び出しが、ＩＤパラメータについて同じ値を与えられる場合、これらの呼び出しは、同じホワイトボックスパラメータ化ファイルレコードを参照し、最終的には同じホワイトボックスライブラリ呼び出しに帰着することになり、それによりその呼び出しに関連付けられたデータを共有する。換言すれば、２つのホワイトボックス呼び出しがデータを共有するためには、これらの２つのホワイトボックス呼び出しには同じＩＤが与えられることができる。なお、共有されたデータは、これらの２つの呼び出しが同じ抽象化されたＡＰＩに対するものである場合、かつ、入力および出力へのデータ変換が同一である場合にのみ意味をなす。
【００４４】
ユーザが、ホワイトボックス暗号法呼び出しのデータを外部のどこに記憶すると選択しようとも、外部データを検索しそのデータを適切な形式にするために対応する呼び出しが追加されなければならない。例えば、固定鍵ブロック暗号の暗号化（fixed-key block cipher encrypt）例は、次の通りに向上しうる。
【００４５】
例示的な入力ソースファイルは次の通りである。
【数５】
0005460699.tif 000007
【００４６】
例示的なパラメータ化ファイル（ｗｂｉｎｆｏ．ｗｂｐ）は次の通りである。
【数６】
0005460699.tif 000008
【００４７】
ホワイトボックスコード生成
攻撃を阻止することの難しさの１つとしては、ホワイトボックス暗号化実装自体が鍵の代わりとなりうる点である。ホワイトボックスソフトウェア実装が部分評価によって鍵を埋め込み、復号化を実装する場合、そのアプリケーション全体を、復号化を行う鍵の代わりに用いることができる。つまり、どの暗号が実装されているかまた何が鍵であるのかを判断する代わりに、攻撃者は単にホワイトボックス復号化実装全体を抽出してそれを復号化に利用できてしまう。これは、ホワイトボックス暗号化を「スニッピングする（snipping）」または「コードリフティングする（code-lifting）」と言う。
【００４８】
そのような攻撃に対して防御する複雑さは、ホワイトボックス暗号法を使用するシステムのペリクリプティックおよびインタークリプティック側面を自動化するための利点の良い例を与える。例えば、ホワイトボックス暗号化実装は、データのアレイを使用する。「スニッピング」によって取り外すことが難しいこのようなアレイまたはテーブルを作るために、各テーブルを２つの部分に分割することができる。１つの部分は、ホワイトボックス実装以外のソフトウェア内のどこかにある実行可能コードのセグメントである。もう１つの部分は、コードセグメントの対応する部分の排他的論理和が取られると所望のテーブルをもたらす「ｘｏｒ」データを含む、同じサイズのデータテーブルである。これにより、ホワイトボックスコードは、必要なデータセグメントが存在する場合にのみ正しく実行するので、ホワイトボックスコードを盗む（lift）ことが困難となる。別の方法は、コードセグメントを、ホワイトボックス暗号化実装以外の他のアプリケーションデータによって置換し、それにより、ホワイトボックス実装以外のデータなしでは、内部のデータアレイは役に立たないようにする方法である。さらに別の方法では、データテーブルが、ホワイトボックス暗号法を使用するプログラム全体に亘る散在位置にアクセスするテーブルによって置換されうる。各データテーブルは、適切なデータ片が見つけられうるプログラムの残りの部分のコードまたはデータ全体に亘る多くの位置を指すポインタのテーブルによって置換される。つまり、元のテーブルはそれぞれ、所望の元のデータを含む位置を指すポインタのテーブルによって置換される。これらの方法は、実行可能なコードを編集し、元のテーブルを「ｘｏｒ」データと置換するかそうでなければテーブルを修正するために、ツール、および、アプリケーションの残りの部分のコンパイルされたバイナリコードへのアクセスを有する熟練プログラマが必要となる。ホワイトボックスコード生成ツール１５０は、このような方法を自動化し、かつ、「グルー」コードを生成して暗号化操作の境界における入力および出力が効果的に難読化されることを確実にする。
【００４９】
パラメータ化ファイル１２４が作成されると、ユーザは、パラメータ化ファイル１２４を構文解析し、ホワイトボックスライブラリへと適切な呼び出しをするホワイトボックス呼び出し定義ファイル１７２を生成するホワイトボックスコード生成ツール１５０を実行しなければならない。ホワイトボックスコード生成ツール１５０は、以下、ｗｂｃｏｄｅｇｅｎ１５０と呼ぶ。ｗｂｃｏｄｅｇｅｎ１５０は主に、ホワイトボックスパラメータ化ファイル１２４と共にユーザアプリケーションコード（特に、ホワイトボックス暗号化ＡＰＩへの呼び出しを含むファイル）を処理し、また、データ変換エンジン１５２によって理解される変換修飾子を含むホワイトボックス呼び出し定義データ（本明細書ではホワイトボックス呼び出し定義または「グルー」ファイルとも呼ぶ）を生成することに対して責任がある。ホワイトボックス呼び出し定義データは、ユーザアプリケーションに使用される高度に抽象化されたＡＰＩと、ホワイトボックスライブラリ内に与えられる低水準ホワイトボックスルーチンとの間をマッピングする「グルー」ルーチンの関数定義のセットを提供する。
【００５０】
ｗｂｃｏｄｅｇｅｎツール１５０は、ユーザのソースコードにおけるホワイトボックスＡＰＩの起動に基づいたホワイトボックスグルーコードの生成、および、ホワイトボックスパラメータ化ファイル１２４内に含まれる暗号化ドメインの記述に対して責任がある。ホワイトボックスグルーコードは、ユーザのソースコード内の高度に抽象化されたＡＰＩと、ホワイトボックスライブラリ暗号化操作の実際の起動との間のシムとして機能し、また、ホワイトボックスパラメータ化への変更がある場合にユーザソースコードを修正する必要がないことを確実にする。ｗｂｃｏｄｅｇｅｎ１５０は、処理速度を向上するためにプリプロセッサの拡張部として設計されてもよい。好適には、ｗｂｃｏｄｅｇｅｎ１５０は、データ変換エンジン１５２とは完全に別個である。
【００５１】
好適には、ｗｂｃｏｄｅｇｅｎ１５０は、ユーザアプリケーションコードをいかようにも修正せず、また、ｗｂｃｏｄｅｇｅｎ１５０が生成するホワイトボックスグルーファイルは、最終アプリケーションへとコンパイルかつリンクされることを意図する別個のソースファイル内にある。したがって、ｗｂｃｏｄｅｇｅｎ１５０は、ホワイトボックスパラメータ化ファイル１２４の検証ツールとしても機能することができる（パラメータ名が合法であり、パラメータ値が有効であることを確認し、また、あるレコード内の指定されたパラメータの整合性チェックをする）。最後に、ｗｂｃｏｄｅｇｅｎ１５０は、ユーザのアプリケーションコード（例えば、ブロック暗号操作の非対称暗号を参照するＩＤパラメータの仕様）においてホワイトボックス操作に対する明示的および黙示的パラメータエラーの両方を含むエラーを検出するために用いられてもよい。
【００５２】
ｗｂｃｏｄｅｇｅｎ１５０は、入力として、パラメータ化ファイル１２４およびホワイトボックス暗号法呼び出しを含む入力ソースファイル１００を受け取る。出力は、見出されたホワイトボックス暗号法のそれぞれに対する定義を含むホワイトボックス呼び出し定義ファイル１７２（ｕｓｅｒＣｏｄｅ−ｇｌｕｅ．ｃ）である。ツールはさらに、例えば「グルー」ルーチンの外部宣言（extern declarations）のセットである生成された関数のそれぞれに対するプロトタイプを含む、対応するホワイトボックスグルーヘッダ１７４または単にヘッダファイル（ｕｓｅｒＣｏｄｅ−ｇｌｕｅ．ｈ）を生成する。外部宣言は、ＩＤと基本暗号化操作との組み合わせについて１つある。ｗｂｃｏｄｅｇｅｎ１５０はさらに、各ホワイトボックス呼び出しに対して行った選択に関するメタデータを保持する出力ホワイトボックスメタデータファイル１７６を生成する。このメタデータは、以下に説明するデータ生成ツール１５４（ｗｂｄａｔａｇｅｎ）に渡される。
【００５３】
ユーザは、抽象化されたホワイトボックスＡＰＩの新しい起動でアプリケーションコードが更新されるか、または、ホワイトボックスパラメータ化ファイル１２４が修正されると常にｗｂｃｏｄｅｇｅｎ１５０を再実行することに対して責任がある。
【００５４】
上述したように、ｗｂｃｏｄｅｇｅｎツール１５０は、ホワイトボックスパラメータ化ファイル１２４と共にユーザのソースコードを処理すること、および、十分にパラメータ化された呼び出しへのユーザの抽象化されたホワイトボックスＡＰＩ起動を低水準ホワイトボックスライブラリルーチンに拡張することに対して責任がある。ｗｂｃｏｄｅｇｅｎツール１５０は、パラメータを受け取りかつ構文解析する最高水準のＰｅｒｌフロントエンド（またはドライバ）から構成されうる。Ｐｅｒｌフロントエンドも、パラメータ化ファイルのコンテンツの妥当性を確認し、行指向のテキストコンテンツにおける統語的／意味論的エラーをチェックし、パラメータ化ファイルのコンテンツをｗｂｃｏｄｅｇｅｎバックエンドが許容可能な形式に変換する。ｗｂｃｏｄｅｇｅｎバックエンドは、ユーザのソースコードを変換済みパラメータ化ファイルと共に処理することができる。
【００５５】
ｗｂｃｏｄｅｇｅｎバックエンドが行わなくてはならないことの大部分は、マクロ展開に非常に似ている。抽象化されたホワイトボックスＡＰＩの各起動は、ＩＤパラメータが起動名の一部とされる「マングル（mangled）」形式に拡張される。各ホワイトボックスＡＰＩ起動のソース位置は、別個のメタデータファイルに記録される。一意のマングルされた名前（すなわち、添付のＩＤパラメータを有するホワイトボックスＡＰＩ名）の最初の起動によって、実際の下にあるホワイトボックスライブラリ関数を起動する適切な関数定義の生成がトリガされる。様々な形式のパラメータ整合性チェックも行うことができ、また、エラーは、コンパイル／リンク／実行時間の前にユーザアプリケーションおよびパラメータ化ファイル１２４の正確さを確実にするために放出される。
【００５６】
コマンドラインパラメータ／オプション構文解析は、Ｐｅｒｌドライバによって行われることが可能である。Ｐｅｒｌドライバは、パラメータ値にサニティチェックを行い、また、ホワイトボックスパラメータ化ファイルプリプロセッサ／検証ツール（図示せず）を任意選択的に起動させることができる。ドライバは、次に、各コマンドライン指定ソースファイルに対してｗｂｃｏｄｅｇｅｎバックエンドを起動することができる。このアプローチの１つの複雑さは、特定の状態情報が、ｗｂｃｏｄｅｇｅｎバックエンドの起動間で持続しなければならない点である（具体的には、ｗｂｃｏｄｅｇｅｎバックエンドは、一意のグルーコード関数定義を適切に生成することの他に重複する起動を警告できるように、どのホワイトボックス操作／ＩＤの組み合わせが前に処理されたソースファイル内で既に見られているか把握する必要がある）。この問題を解決するために、ｗｂｃｏｄｅｇｅｎドライバは、各バックエンド起動に渡されかつ任意のそのような状態情報を含むテンポラリファイルを開くよう設定されることが可能である。このテンポラリファイルの存続期間は、ｗｂｃｏｄｅｇｅｎ１５０の１つの起動であり、ｗｂｃｏｄｅｇｅｎ１５０が終了する前に取り外されることが可能である。したがって、このファイルは、ユーザに完全に不可視である。
【００５７】
ホワイトボックスパラメータ化ファイルのフォーマット化が比較的複雑であること（パラメータはないにも関わらずある文脈ではあると暗示される、すなわち、パラメータはデフォルト値を有する）によって、または、他のパラメータ値との組み合わせにおいて違法でありうる。結果としては、ｗｂｃｏｄｅｇｅｎ１５０による構文解析の前に、パラメータ化ファイル１２４の前処理が実装されうる。前処理ツールは、Ｐｅｒｌ内に、当該言語の強力な正規表現によって書き込むことができる。ホワイトボックスパラメータ化検証ツール（図示せず）は、デフォルト値を有するレコードを明示的に挿入することによって欠けているデフォルトパラメータを取り扱い、また、パラメータ値が合法であり、かつ、パラメータの組み合わせが一貫していることを確認するように含められうる。同時に、ホワイトボックスパラメータ化プリプロセッサは、自由形式テキストＩＤレコードを適切なマクロ起動に変換することができる。
【００５８】
典型的な使用シナリオには、複数の入力ソースファイル１００と単一のホワイトボックスパラメータ化ファイル１２４のアプリケーションビルドが含まれ、したがって、（単一のホワイトボックスパラメータ化ファイル１２４と共にホワイトボックスＡＰＩへの呼び出しを含むあらゆるソースファイルを、入力として、受け取る）ｗｂｃｏｄｅｇｅｎ１５０の１つの起動があることを暗示する。しかし、設計において、アプリケーションを、それぞれその独自のホワイトボックスパラメータ化ファイル１２４（またはすべてのモジュールに共通の単一ホワイトボックスパラメータ化ファイル１２４）を有する幾つかのモジュールに分割することと、これらのモジュールのそれぞれを対応するｗｂｃｏｄｅｇｅｎ１５０の起動によって処理することを妨げるものは何もない。
【００５９】
１つのデベロッパがｗｂｃｏｄｅｇｅｎ１５０を実行すると、他のデベロッパはそれを他のデベロッパのビルドの一部として再実行する必要がない。代わりに、デベロッパは、上述したような生成されたヘッダファイル１７４を含み、また、生成されたファイルをビルドスクリプトに追加することができる。この時点で、アプリケーションをコンパイルおよびリンクしたい人は誰でもネイティブコンパイルツールさえ持っていればよい。
【００６０】
ホワイトボックスデータ変換
コード生成ツール１５０が実行されると、ホワイトボックス呼び出しに対する入力および出力を保護するためにデータ変換を行うことが望ましい。図中、ｘｃｏｄｅと示すデータ変換エンジン１５２は、この関数（本明細書では「トランスコーディング」とも言う）を入力ソースファイル１００とホワイトボックス関数呼び出し定義を含むグルーコードに対して行う。Ｃｌｏａｋｗａｒｅ  ＴｒａｎｓｃｏｄｅｒＴＭといったデータ変換エンジン１５２を用いて、記載した実装において、データ変換を用いてホワイトボックス機能を提供する。このデータ変換の出力は、隠され（cloaked）または難読化された変換済みソースファイル１８０（ｕｓｅｒＣｏｄｅ．ｃｌｏａｋｅｄ．ｃ）と、隠されまたは難読化された呼び出し定義ファイル１８２（ｕｓｅｒＣｏｄｅ−ｇｌｕｅ．ｃｌｏａｋｅｄ．ｃ）と、外部変換メタデータを含むファイル１８４（グルーメタデータ）である。生成された変換メタデータファイル１８４は、ホワイトボックスグルー関数に対して選択されたパラメータのデータ変換選択を記述する。
【００６１】
ホワイトボックス暗号法実装は、アプリケーションデータについての変換（例えば、暗号化のためのプレーン、復号化のための暗号、加えて、必要に応じて鍵およびＩＶ）は、ホワイトボックス呼び出しの範囲外で適用されていると想定し、また、これらの変換を初期ステップにおいて安全に取り除く。同様に、出力変数についての変換（例えば、暗号化のための暗号、復号化のためのプレーン）は、暗号化操作の最終ステップにおいて安全に適用され、データ変換エンジン１５２は、これらの変数におけるデータは変換されていると想定する。
【００６２】
データ変換エンジン１５２の機能は、本文書の範囲外であるが、概して、変数を難読化または隠すようにデータ変換を適用し、データに特に暗号化操作である数学操作を適用して、それにより、データが攻撃者に可視ではなくかつクリティカルアセットに損害を与える情報を明らかにしないように確実にすることであると理解される。データ変換エンジン１５２はさらに制御フロー変換を適用してアプリケーションのプログラムフローを偽装することもでき、それにより、攻撃者がアプリケーションの操作を静的または動的にトレースすることを非常に困難にしうる。データ変換エンジン１５２は、ソースコードを数学的に修正されたソースコードに変換するユーティリティと見なされうる。変換済みアプリケーションは、関数的には元のアプリケーションと同一であるが、リバースエンジニアリングおよび改ざん攻撃に対する耐性が高い。保護付きアプリケーションは、専用ハードウェアまたは追加のソフトウェアを必要とすることなくオープンコンピュータプラットフォーム上で信頼性が高く実行される。
【００６３】
データ変換エンジン１５２はさらに、ホワイトボックス暗号法をコード変換とリンクして、個別の技術だけの場合よりもはるかに安全である統合型および層状の保護を与える。ホワイトボックス暗号法は、その詳細も本記載の範囲外であるが、ハッカーが完全な詳細で暗号化操作を観察できる環境において、攻撃者が暗号化鍵を入手すること（または非対称「公開鍵」暗号法の場合には、秘密鍵を入手すること）、または、鍵の代用となりうる何かを入手することを阻止するような方法で標準暗号化アルゴリズムを実装する。ホワイトボックス暗号法は、ＲＳＡおよびＡＥＳといった暗号を実装して、暗号化操作時であっても、確実にクリティカル鍵データが露呈しないにする。
【００６４】
データ変換およびホワイトボックス暗号法実装の例は、以下の特許文書に見出すことができる。「TAMPER RESISTANT SOFTWARE ENCODING AND ANALYSIS」なる名称の米国特許公開第２００４／０２３６９５５‐Ａ１号、「SOFTWARE CONDITIONAL ACCESS SYSTEM」なる名称の米国特許公開第２００５／００３９０２５‐Ａ１号、「METHOD AND SYSTEM FOR SECURE ACCESS」なる名称の米国特許第７，３２５，１４１号、「METHOD AND SYSTEM FOR SUSTAINABLE DIGITAL WATERMARKING」なる名称の米国特許公開第２００５／００２１９６６‐Ａ１号、「SECURE METHOD AND SYSTEM FOR BIOMETRIC VERIFICATION」なる名称の米国特許公開第００５／０１３８３９２‐Ａ１号、「SECURE METHOD AND SYSTEM FOR COMPUTER PROTECTION」なる名称の米国特許公開第２００４／０２６８３２２‐Ａ１号、「SECURE METHOD AND SYSTEM FOR HANDLING AND DISTRIBUTING DIGITAL MEDIA」なる名称の米国特許公開第２００５／００２１９８９‐Ａ１号、「SYSTEM AND METHOD FOR OBSCURING BIT-WISE AND TWO’S COMPLEMENT INTEGER COMPUTATIONS IN SOFTWARE」なる名称の米国特許公開第２００５／０１６６１９１‐Ａ１号、「SYSTEM AND METHOD FOR PROTECTING COMPUTER SOFTWARE FROM A WHITE BOX ATTACK」なる名称の米国特許公開第２００６／０１４０４０１‐Ａ１号、「SYSTEM AND METHOD FOR PROTECTING COMPUTER SOFTWARE FROM A WHITE BOX ATTACK」なる名称の米国特許公開第２００４／０１３９３４０‐Ａ１号、「SYSTEM AND METHOD OF FOILING BUFFER-OVERFLOW AND ALIEN-CODE ATTACKS」なる名称の米国特許公開第００３／０１７２２９３‐Ａ１号、「SYSTEM AND METHOD OF HIDING CRYPTOGRAPHIC PRIVATE KEYS」なる名称の米国特許公開第２００５／０００２５３２‐Ａ１号、「TAMPER RESISTANT SOFTWARE-CONTROL FLOW ENCODING」なる名称の米国特許第６，７７９，１１４号、「TAMPER RESISTANT SOFTWARE ENCODING」なる名称の米国特許第６，５９４，７６１号、「TAMPER RESISTANT SOFTWARE ENCODING」なる名称の米国特許第６，８４２，８６２号、「TAMPER RESISTANT SOFTWARE-MASS DATA ENCODING」なる名称の米国特許第７，３５０，０８５号。これらの内容は、本明細書に参考としてその全体をすべて組み込むものとする。
【００６５】
ホワイトボックスデータ生成
ホワイトボックス暗号法関数に対して一意に識別された呼び出しのそれぞれは関連データを有し、この関連データは、かかる呼び出しに対してなされた関数およびセキュリティに関する選択に基づいて生成されなければならない。このデータを生成するホワイトボックスデータ生成ツール１５４は、以下、ｗｂｄａｔａｇｅｎ１５４と呼ぶ。
【００６６】
ｗｂｄａｔａｇｅｎツール１５４は、ホワイトボックス呼び出し用のインスタンス固有データの初期設定を、ホワイトボックスライブラリにより必要とされる初期化されたテーブルデータの形式に生成することに対して責任がある。ユーザアプリケーション内のどこかで暗号化操作に使用される各暗号化ドメインは、このテーブルデータの生成を必要とする。初期化されたデータの正確な値は、ユーザのソースコードの任意の変換によって生成される、ユーザの暗号化データ（プレインテキスト／サイファテキスト等）の変換に依存する。例えば、異なる呼び出し（たとえ同じ関数型パラメータを有するものであっても）は、異なる鍵を使用し、その入力および出力に異なる変換を有する可能性が高い。さらに、ランダムな実装選択が、各ホワイトボックス呼び出しに対してツールチェーンによってなされる。ｗｂｄａｔａｇｅｎ１５４は、これらのすべての選択肢をカプセル化する実装固有のデータを生成する。
【００６７】
起動時、このデータは、鍵および変換にとらわれないホワイトボックスライブラリコード（ｘｃ＿ｗｂ．ｘｌｉｂ）に渡される。ｗｂｃｏｄｅｇｅｎ１５０が既にソースコードを分析して任意の必要情報をホワイトボックスメタデータ１７６に書き込んでいることが予想されるので、ｗｂｄａｔａｇｅｎ１５４はユーザアプリケーションコード自体を処理する必要はない。
【００６８】
ｗｂｄａｔａｇｅｎツール１５４は、入力として、ｗｂｃｏｄｅｇｅｎ１５０によって生成されたホワイトボックスメタデータ１７６と、（グルーコードが変換された場合に）データ変換エンジン１５２によって作成された外部変換またはグルーメタデータ１８４とを受け取る。この情報は、ｗｂｄａｔａｇｅｎ１５４に、どの暗号化操作がユーザアプリケーションコード内に見出されたのか、これらの操作に対してホワイトボックスパラメータ化ファイル内のどの暗号化パラメータが指定されたのか、また、実パラメータとして渡されるユーザデータにどのデータ変換が適用されたのかを伝える。ｗｂｄａｔａｇｅｎツール１５４は、ホワイトボックスデータを定義するコードと、任意選択的にエクスポートデータファイル１８６を生成する。
【００６９】
ｗｂｄａｔａｇｅｎ１５４の出力は、パラメータ化ファイル１２４内の各レコードに対応するデータを含むデータ初期設定ファイル１８８（ｕｓｅｒＣｏｄｅ＿ｄａｔａ．ｃ）である。データ初期設定ファイル１８８は、各ホワイトボックス呼び出しに対するインスタンス固有のデータをカプセル化するデータ変数のセット（「データ初期設定」）を含む。データ値はもこのファイルに記憶されるか、または、パラメータ化ファイル１２４内のユーザによって指定される1つ以上の出力ファイルに記憶される。生成されるべきデータがすべてエクスポートデータである場合、ｗｂｄａｔａｇｅｎ１５４は、実際に、コンパイルおよびリンク後に実行させることが可能である。ｗｂｄａｔａｇｅｎ１５４を、単独のデベロッパによって埋め込みデータ（および任意選択的にエクスポートデータ）を生成するように実行させることが可能である。この時点で、アプリケーションをコンパイルおよびリンクしたい人は誰でもネイティブコンパイルツールさえ持っていればよい。
【００７０】
ホワイトボックステーブルデータパラメータの定義がｗｂｄａｔａｇｅｎ１５４によって生成されるが、グルーコードは、必要に応じて、これらの定義が実パラメータとしてホワイトボックスライブラリ呼び出しに渡されることを確実にしなければならない。特に留意されたいのは、例示的なホワイトボックスインクルードファイル１７０に関連して上述したサブインクルーデッドファイル（ｘｃ＿ｗｂ＿ｂｃ＿ｆｋ＿ａｅｓ＿ｔａｂｌｅｓ．ｈ．等）である。これらのファイルは、ホワイトボックス暗号化操作の各可能な変形に対する仮パラメータを詳細に定義し、また、ホワイトボックスグルーファイル１７２、１７４におけるテキストのバルクを生成するように用いられる。これらのサブインクルードファイルは、好適には、ホワイトボックスライブラリコード自体も生成するプログラムによって自動生成される。このようにして、完全形式の低水準ホワイトボックスＡＰＩへの依存の多くが自動的に維持される。
【００７１】
ｗｂｄａｔａｇｅｎ１５４は、一般に、抽象化されたホワイトボックスＡＰＩの新しい起動でアプリケーションコードが更新されるか、または、ホワイトボックスパラメータ化ファイル１２４が修正されるか、または、アプリケーションコードが変換されると常に再実行される。
【００７２】
変換済みコードのコンパイルおよびリンク
トランスコード済みまたは変換済みコードをコンパイルおよびリンクするために、ユーザアプリケーションコードをコンパイルするために用いられる同じネイティブツーリングコンパイラ１９０を用いて、変換済みソースファイル１８０（ｕｓｅｒＣｏｄｅ．ｃｌｏａｋｅｄ．ｃ）と、変換済みホワイトボックス呼び出し定義ファイル１８２（ｕｓｅｒＣｏｄｅ−ｇｌｕｅ．ｃｌｏａｋｅｄ．ｃ）と、データ初期設定ファイル（ｕｓｅｒＣｏｄｅ−ｄａｔａ．ｃ）をコンパイルして、オブジェクトファイル１９２を生成し、また、リンカー１９４（ｘｌｉｎｋ）によってホワイトボックスライブラリ１９６（ｘｃ＿ｗｂ．ｌｉｂ）に対してリンクされて保護付き実行可能ファイル１９８を生成する。ホワイトボックスライブラリによって実装される暗号化操作および個々のサブルーチンの正確なＡＰＩの詳細は、本明細書の範囲外である。
【００７３】
パフォーマンスのチューニング
変換済みコードのテスト中に、ユーザは、そのアプリケーションのパフォーマンスまたはサイズに不満足であることに気が付くかもしれない。あるいは、パフォーマンスは申し分なく、セキュリティを向上することができる領域があることを見出すかもしれない。この時点で、前のステップにおいてなされた機能またはセキュリティに関する選択はいずれも再検討されてよく、変更はパラメータ化ファイル１２４に対してのみ行えばよい。幾つかのパラメータを変更して異なるサイズ／速度／セキュリティのトレードオフをすることができる。例えば、
●暗号化形式を、より高いパフォーマンスの変形またはより高いセキュリティの変形に変更してよい。
●高パフォーマンスおよび小さいサイズのために、ラウンド数を（意味のある場合には）減らすか、または、高セキュリティのために増やしてよい。
●高セキュリティのためにデータシャッフリング機能をオンにするか、または、高パフォーマンスのためにオフにしてよい。
●サイズを減少するために異なるホワイトボックス呼び出しに同じＩＤを与えるか、または、セキュリティを向上するために同じＩＤを有していた呼び出しに違うＩＤを与えてよい。
●アプリケーションコードまたは生成されたコードの変換がそれに基づくデータ変換設定を、パフォーマンスを向上するために下げるか、または、セキュリティを向上するために上げてよい。ユーザはさらには、生成されたコードを全く変換しないことを選択してもよい。
【００７４】
記載したホワイトボックスツールチェーンは、ユーザのアプリケーションにおけるアンチデバッグおよびインテグリティ検証を使用するユーザの能力には影響を与えない。さらに、ユーザは、ユーザのホワイトボックス呼び出しに、例えば、そのような呼び出しの前後にアンチデバッグタイミングポイントを配置するか、または、ホワイトボックスライブラリを含むモジュールの署名およびインテグリティチェックを行うことによって、徹底的な防御を追加することができる。
【００７５】
多様なインスタンスの生成
セキュリティの観点から、アプリケーションの２つ以上のインスタンスを有することが有利であることが多い。アプリケーションの多様性（diversity）とは、幾つかの異なるが機能的には等しいバージョンのアプリケーションをユーザベースに分配するか、または、既知の脆弱性を軽減する若しくは攻撃が二度と発生しないようにフィールドされた（fielded）アプリケーションに頻繁に更新を行うこと（このような種類の「時間における多様性」を行う能力は更新可能性（renewability）として知られる）を意味しうる。
【００７６】
当然ながら、単に、各インスタンスに対して１回、上述したステップを数回実行することによってホワイトボックス暗号法を用いてアプリケーションの多様なインスタンスを作成することが可能である。しかし、このアプローチは、低速であることに加えて、各インスタンスを別個にテストすることを必要とし、このことは適用可能な多様性の量を大幅に制限する。異なるアプローチは、アプリケーションの大部分がインスタンス間で変らないようにし、また、多様性はデータによって決定されるようにすることであり、これは、多様なインスタンスはアプリケーションが既にコンパイルかつリンクされた後でも実際に作成できることを意味する。データに基づいた多様性は、大抵の場合、クライアントに関するデータを更新することができるチャネルが適所にあるので、更新可能性をもっと簡単にする。既にビルドされたアプリケーションに対して多様性データを生成するこのプロセスは、「個別化（individualization）」と呼ばれる。ホワイトボックス暗号法データの個別化は、エクスポートテーブルを用いることと、アプリケーションがビルドされた後にｗｂｄａｔａｇｅｎ１５４を繰り返し実行することによって達成することができる。これを達成する１つの方法は、ｗｂｄａｔａｇｅｎ１５４を使用して、明白に異なる固定鍵をアプリケーションの各インスタンスに関連付けることである。ｗｂｄａｔａｇｅｎ１５４が実行される度にパラメータ化ファイル１２４を変更する必要なくこの使用を容易にするために、固定鍵はさらにコマンドライン上に指定されることも可能である。
【００７７】
要旨
上記セクションでは、ホワイトボックス暗号化機能をアプリケーションに統合するために必要なステップを記載した。これらのステップは、次の通りにまとめることができる。
●ユーザは、ホワイトボックス暗号ＡＰＩへの呼び出しを、ユーザのアプリケーションに追加する。
●ユーザはホワイトボックスパラメータ化ファイルを作成して各呼び出しに対してレコードを追加する。
●ユーザはｗｂｃｏｄｅｇｅｎを実行して、次にｘｃｏｄｅが続き、次にｗｂｄａｔａｇｅｎが続いて、トランスコードされたビルド用のサポートコードおよびデータが生成される。
●ユーザは、ユーザのアプリケーションをコンパイルし、リンクし、テストする。
●ユーザは、サイズ、パフォーマンス、およびセキュリティに満足するまでステップを繰り返す。
●ユーザは、ｗｂｄａｔａｇｅｎを繰り返し実行して、サポートデータの多様なインスタンスを作成する。
【００７８】
上述した本発明の実施形態は例示を目的とするに過ぎない。特定の実施形態を、本発明の範囲から逸脱することなく当業者によって変更、修正、および変化させることが可能である。本発明の範囲は添付の特許請求の範囲によってのみ定義される。
【図１】
0005460699.tif 000009
【図２】
0005460699.tif 000010
【図３】
0005460699.tif 000011
【図４】
0005460699.tif 000012
【図５】
0005460699.tif 000013
【図６】
0005460699.tif 000014