"攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの重要なアセットを識別する工程であって、前記重要なアセットは一つ以上の所定のプログラム特性により成る工程と、プログラム特性関数を、前記重要なアセットのうちの対応する一つに関連付ける工程と、ユーザ定義のトレランスに従って前記関連付ける工程を調整する工程と、前記ソフトウェアアプリケーションの一つ以上のポイントで、前記プログラム特性関数から演算処理されたプログラム特性を生成する工程と、前記一つ以上の所定のプログラム特性のうちの対応する一つに対して前記演算処理されたプログラム特性を検証する工程とを含む、方法。前記関連付ける工程が、前記ソフトウェアアプリケーション内に依存関係を挿入することを含み、前記依存関係が前記検証する工程によって用いられる、請求項1に記載の方法。前記一つ以上の所定のプログラム特性が、特性基本命令のライブラリとして提供される、請求項1に記載の方法。前記一つ以上の所定のプログラム特性が、前記ソフトウェアアプリケーションのコンパイラ分析の結果として提供される、請求項1に記載の方法。前記検証する工程が、前記ソフトウェアアプリケーションの元のコードを置き換え増強して変換済みコードを形成し、正常な条件下では前記変換済みコードが前記元のコードのように挙動するが、改ざんされた条件下では予期されない挙動へ逸脱するようにする、請求項1に記載の方法。攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータおよびプログラム依存関係とともに、重要なアセットを識別する工程と、ユーザ固有の基準に従って前記重要なアセットの優先順位を決める工程と、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させる工程と、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得する工程と、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成する工程と、前記代替の中間表現から変換済みソフトウェアアプリケーションを生成する工程とを含み、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、方法。前記挿入する工程が、アセットの重要性と、前記プログラムにおける関係と、性能トレランスとに基づいて、代替の依存関係についてデータおよびコードを識別する工程をさらに含む、請求項6に記載の方法。元の演算を等価の依存関係関数と置き換えることにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、またはコードとコードとの間に作り出される、請求項7に記載の方法。前記元の関数と同様に、ただし加えられた依存関係に基づいて機能するように、前記等価の依存関係関数が混合ブール算術演算で構築される、請求項8に記載の方法。前記等価の依存関係関数が、外部データを用いた関数演算処理の一部として構成され使用される外部データ依存関係を含み、前記外部データの変化または除去が、前記ソフトウェアアプリケーションの異常な挙動を引き起こすようにする、請求項9に記載の方法。定数データを演算処理するための演算を挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項10に記載の方法。関数呼び出しを挿入することにより、前記代替の依存関係が、データとコードとの間に作り出される、請求項10に記載の方法。ハッシュ、チェックサム、または特性有効チェックを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項10に記載の方法。使用時点でデータを複製することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項10に記載の方法。関数統合により、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項10に記載の方法。新たなコードおよび関数呼び出しを挿入することにより、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項10に記載の方法。等価の依存関係関数を挿入することにより、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項10に記載の方法。前記外部データが、特性基本命令のライブラリとして提供された一つ以上の所定のプログラム特性を含む、請求項10に記載の方法。前記外部データが、前記ソフトウェアアプリケーションのコンパイラ分析の結果として提供された一つ以上の所定のプログラム特性を含む、請求項10に記載の方法。攻撃耐性をソフトウェアアプリケーション全体に提供するシステムであって、前記システムは、前記ソフトウェアアプリケーションの重要なアセットのユーザ仕様書と、ソフトウェアに実現された自動プログラム変換メカニズムとを含み、前記自動プログラム変換メカニズムは、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータとプログラム依存関係とを識別し、ユーザ固有の基準に従って前記重要なアセットの優先順位を決め、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させ、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得し、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成し、かつ前記代替の中間表現から変換済みソフトウェアアプリケーションを生成し、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、システム。新たなデータおよびプログラム依存関係要素を挿入するように構成された前記ソフトウェアは、アセットの重要性と、前記プログラムにおける関係と、性能トレランスとに基づいて、代替の依存関係についてデータおよびコードを識別するようにさらに構成される、請求項20に記載のシステム。元の演算を等価の依存関係関数と置き換えることにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、またはコードとコードとの間に作り出される、請求項21に記載のシステム。前記元の演算と同じ機能を実行するように、前記等価の依存関係関数が混合ブール算術演算で構築される、請求項22に記載のシステム。前記等価の依存関係関数が、外部データを用いた関数演算処理の一部として構成され使用される外部データ依存関係を含み、前記外部データの変化または除去が、前記ソフトウェアアプリケーションの異常な挙動を引き起こすようにする、請求項23に記載のシステム。定数データを演算処理するための演算を挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項24に記載のシステム。関数呼び出しを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項24に記載のシステム。ハッシュ有効チェックを挿入することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項24に記載のシステム。使用時点でデータを複製することにより、前記代替の依存関係が、データとコードとの間に、データとデータとの間に、または、コードとコードとの間に作り出される、請求項24に記載のシステム。関数統合により、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項24に記載のシステム。新たなコードおよび関数呼び出しを挿入することにより、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項24に記載のシステム。等価の依存関係関数を挿入することにより、前記代替の依存関係が、少なくとも第1の関数と第2の関数との間にさらに作り出される、請求項24に記載のシステム。特性基本命令のライブラリをさらに含み、前記外部データが、前記ライブラリに設けられた一つ以上の所定のプログラム特性を含む、請求項24に記載のシステム。前記ソフトウェアアプリケーションのコンパイラ分析用に構成されたソフトウェアをさらに含み、前記コンパイラ分析は、前記ソフトウェアアプリケーションからの一つ以上の所定のプログラム特性を識別して前記外部データを形成する、請求項24に記載のシステム。本発明は、従来のソフトウェア保護メカニズムの少なくとも一つの欠点を取り除く、または軽減することを目的とする。本発明には、ソフトウェアアプリケーションの攻撃耐性を強化することを目的として、当該ソフトウェアアプリケーション全体に依存関係ネットワークを提供するシステムおよび方法が含まれる。前記システムおよび方法は、かかるソフトウェアアプリケーションの基礎となる高度に依存したコードの生成を提供し、攻撃に耐性のある、改ざん防止と隠匿とを組み合わせたメカニズムを含む。概して、ソフトウェアアプリケーション全体に自動的に張り巡らされるアグレッシブな依存関係群が、本発明によって提供される。さらに重要なことには、これら依存関係は、前記所与のソフトウェアアプリケーションのどの部分もすなわち,コード部分やソフトウェアモジュールなどを含む部分もそのままで用いられないようにする。改ざん防止特性に加えて、本発明の技術は、前記所与のソフトウェアアプリケーションに挿入されている依存関係を特定し取り除くことを困難にする隠匿特性を備えている。第1の態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの重要なアセットを識別する工程であって、前記重要なアセットは一つ以上の所定のプログラム特性により成る工程と、プログラム特性関数を、前記重要なアセットのうちの対応する一つに関連付ける工程と、ユーザ定義のトレランスに従って前記関連付ける工程を調整する工程と、前記ソフトウェアアプリケーションの一つ以上のポイントで、前記プログラム特性関数から演算処理されたプログラム特性を生成する工程と、前記一つ以上の所定のプログラム特性のうちの対応する1つに対して前記演算処理されたプログラム特性を検証する工程とを含む、方法を提供する。さらなる態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供する方法であって、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータおよびプログラム依存関係とともに、重要なアセットを識別する工程と、ユーザ固有の基準に従って前記重要なアセットの優先順位を決める工程と、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させる工程と、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得する工程と、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成する工程と、前記代替の中間表現から変換済みソフトウェアアプリケーションを生成する工程とを含み、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、方法を提供する。さらに別の態様において、本発明は、攻撃耐性をソフトウェアアプリケーション全体に提供するシステムであって、前記ソフトウェアアプリケーションの重要なアセットのユーザ仕様書と、ソフトウェアに実現された自動プログラム変換メカニズムとを含み、前記自動プログラム変換メカニズムは、前記ソフトウェアアプリケーションの中間コンパイラ表現からの元のデータおよびプログラム依存関係を識別し、ユーザ固有の基準に従って前記重要なアセットの優先順位を決め、前記元のデータおよびプログラム依存関係を、前記優先順位が決まった重要なアセットに相互に関連させ、前記ソフトウェアアプリケーションについてユーザ固有の制御トレランスを取得し、前記ユーザ固有の基準と前記ユーザ固有の制御トレランスとに関して、新たなデータおよびプログラム依存関係要素を前記ソフトウェアアプリケーションの前記中間コンパイラ表現に挿入して、代替の中間表現を形成し、かつ、前記代替の中間表現から変換済みソフトウェアアプリケーションを生成し、前記変換済みソフトウェアアプリケーションは、強化された攻撃耐性を提供する改善された依存関係ネットワークを含む、システムを提供する。本発明のその他の態様および特徴は、当業者が添付の図とともに本発明の特定の実施形態についての以下の記載を参照すれば、明らかになるであろう。概して言えば、本発明は、ソフトウェアアプリケーションまたは単にプログラムと記載するの一部から以前は無関係であった別の部分への従属関係を、自動的に伝搬させる方法およびシステムを提供する。前記プロセスは、所望の回数、反復されてもよい。より詳しくは、本発明には、前記プログラムの他の部分への必須コード関数およびデータの伝搬が含まれる。本発明は、一般的な算術関数を、プログラムの既存の部分に結合している混合ブール演算MBA式と置き換える。前記プログラムはまず、コンパイラレベルで分析され、プログラム中に保持されている特性を特定する。その後、これら特性に基づいて条件を構築し、データおよび演算中の条件を暗号化する公式へ暗号化する。そしてこれが、実際の依存関係をアプリケーション全体に作り出すために使用され、もし依存関係が壊れた場合に前記プログラムが正常に機能しなくなるようにする。本発明は、実行されると、ユーザが重要なプログラムアセットの識別を行うようにしてもよく、または、所定のプログラム特性基本命令群がライブラリに確立されて、アナライザが自動的にユーザのプログラムに当てはまる特性基本命令群を特定するようにしてもよい。どちらの場合も、依存関係キャリアおよびバインディングが依存関係のウェブを作り出すために用いられてもよく、これは前記プログラム特性の条件が持続することを要する。もしソフトウェアリフティング攻撃がコードの一部になされたら、プログラム特性の持続の見込みが小さくなり、条件が持続しなくなり、前記依存関係を保持する前記プログラムの一部は正常に動作しなくなる。図1において、本発明の変換プロセス100の一般化されたフロー図が示される。ここに、本発明のプロセスへの3つの入力110、113、114が示されている。まず、ソースコード形式のアプリケーションプログラム114が提供される。次に、前記プログラムの重要なアセットのユーザ仕様書110または、上述のようなユーザのプログラムに適用される特性基本命令群のライブラリでもよいが提供される。このユーザ仕様書または特性基本命令ライブラリ群は、重要なアセットの相対的な優先順位を示す、元のアプリケーションのマークアップである。前記マークアップは、様々な形態をとってもよい。たとえば、プログラミング言語自体の上の言語拡張;前記プログラムを参照する別の記載;またはユーザが前記プログラムの領域を強調できるグラフィカルユーザーインターフェースGUIであってもよい。前記第3の入力は、アプリケーションの安全性、性能、およびサイズ目標間でのトレードオフをユーザが特定できるようにする制御オプションすなわち,トレランス113を含む。これら入力110、113、114は自動プログラム変換ツール111によって処理され、プログラム依存関係が挿入された変換済みアプリケーションプログラムを作成する。得られた変換済みプログラム112は、正常な動作条件下では、元の入力プログラムと同じ挙動をする。ただし、重要なアセットが敵対者による攻撃にさらされているという条件下では、前記プログラムは期待されたようには挙動しない。かかる攻撃には、アプリケーションデータ値を他のデータ値と置き換える、コードまたはプログラムの一部を別のコードと置き換える、前記プログラムの制御のフローを別のソースへ向ける、または別のソースから導く、前記プログラムの、別のコンテクストで使用するための部分をリフティングする、などがあるが、これらに限定されるわけではない。重要なアセットのユーザによる識別が含まれる本実施形態に関して、本発明はコンパイラベースの変換ツールを提供するが、この変換ツールは、重要なアセットから開始し、演算、関数呼び出し、およびデータ使用を挿入することによって前記アセットに対して依存関係の長大なウェブを築く。演算および関数は、アプリケーションの既存の関数にアグレッシブに統合される。前記アプリケーションからのデータは、分析され可能ならば再使用される。また、作り出されたデータは前記アプリケーションに使用されるデータ構造に統合される。依存関係のウェブは、ユーザのサイズおよび性能トレランスの範囲内でできるだけ広く拡張される。上記に示唆した通り、本発明は安全性と性能とをトレードオフするための自由度を提供する。高性能のためには、性能に影響の大きいコードを避けて安全性の目標を維持するように依存関係のウェブを調整してもよい。前記依存関係のウェブの端点は、安全性と性能とのトレードオフを最適化するために戦略的に設定されてもよい。極端な場合、前記依存関係のウェブはアプリケーション全体をカバーし、これは重要なアセットが例外なく依存関係にあることを意味する。さらに、ライブラリに確立された所定のプログラム特性基本命令群が含まれる実施形態に関して、本発明は、ユーザのプログラムに適用される特性基本命令群を自動的に特定するアナライザを提供する。プログラム中の一つのソース点から別の対象点へ従属関係を広げ、各基本命令のアプリケーションに基づいて、前記プログラムが変更される。対象点では、もとは前記ソース点由来の一定の条件へ依存するように、前記プログラムに対して依存関係バインディングが作り出される。前記プログラム中の前記ソース点が変更によって直接的に攻撃されると、前記対象点で前記プログラムの演算中に副次的効果が発生することが、上記の依存によって確実になる。その結果、アタッカーの期待するパラメータ内で挙動しないプログラムが得られる。多数の種類の特性基本命令があり、また、プログラムが特性基本命令に基づいて変更される方法もさらに多数ある。特性基本命令は各種それぞれ、一定の特徴を有する。例えば、積分定数特性とは、プログラムの実体が、プログラムの全実行寿命について定数を保持していることを意味する。この特徴は、前記実体がプログラム使用の時点で前記積分定数値を有していなければならず、かつ、決して他の値は取らないことを示唆する。これに基づいたプログラム操作の例としては、以下に示すものがあるが、これらに限定されるわけではない:元の定数値についてプログラム実体を複製する;プログラム中の他の値を演算処理するために定数値を使用する;イニシャライズ時間での定数値の演算処理;プログラムの他のフロー全体で定数値を演算処理し、プログラム中、使用時点で正しい値を含むことだけを確実にする;または、プログラム中の適切な時間に有効性を保持するという条件例えば、equal等しい、greaterthan~より大きい、lessthan~より小さいなどすなわちプログラムの寿命、または前回点に記載された演算処理に従った使用時点で実体を使用する、など。図2は、本発明の関数呼び出し、およびデータ依存関係の挿入を示す、アプリケーションに対する変換の一般的な例である。変換は、元のアプリケーション側200と変換済みアプリケーション側201の間に示された大きな黒い矢印によって表されている。元のアプリケーション200は左に示され、呼び出しグラフを介して相関している関数Fl、F2、F3、F4、F5221~225の群を含む。前記関数呼び出しグラフは、そのノードが関数を表し、その有向エッジ関数から関数への矢印が一つの端部の関数呼び出し元矢印の元と、他方の端部矢印の先の関数呼び出し先とを表すグラフである。図2のグラフはまた、有向エッジデータから関数への矢印を介した、メモリDl、D2、D3211~213へのデータ依存関係を示す。この例は、読み出し専用定数データを示しているが、前記プロセスが読み取り書き込みデータにも使用されてもよく、前記データの寿命は周知であるか、または分析されてもよい。図2は、右に変換済みアプリケーション201を示す。元の呼び出しグラフ依存関係221~225およびデータ依存関係211~213に加えて、新たな項目が挿入されている破線に示される項目。これら新たな項目には、下記に示す項目が含まれるが、これらに限定されるわけではない:元の依存とは異なる、データからコードおよび/または関数への依存関係元の依存とは異なる、コードおよび/または関数の間の依存関係を有する新たなデータ元のプログラムには存在しなかった、関数呼び出し依存関係関数統合、これは以前は関係が無かった二つの関数について共用関数APIを効果的に作り出すデータ複製、これはデータ攻撃の有意な変形の危険を減少させるコード複製、これは、望ましいプログラム挙動を強制する試みにおいてコードを変更するというアタッカーの能力を低減する実行の際に、後にコードパスで使用されるであろうデータに必要なアドレスを演算処理する、ハッシュアルゴリズムの呼び出しの挿入上記の項目リストは、プログラムを、当該プログラムよりも多くの依存関係を有する新たなプログラムに変換する手段のサンプルを提供している。ただし、本発明では、プログラム特性とは、事前に例えば,開発時、設置時、または初回実行時に演算処理され、後の時点で例えば、ランタイム時に検証されるプログラムのなんらかの特徴として定義される。プログラム特性の例をいくつか挙げると、以下のものがあるただし、これらに限定されるわけではない:プログラムの一部または全体における、コード片のハッシュ値プログラムの特定の実行状態における変数の特定の値プログラムのコード片にある命令の絶対的または相対的なアドレスプログラム中のコード片またはデータ片のうちいずれかのサイズプログラムのレイアウト中の命令の種類と配置プログラム中の断片のサイズと配置プログラム中の関数の数とアドレス配置プログラム中のシステム呼び出しの数とアドレス配置プログラム中の命令の相対的なオフセット本発明では、プログラム特性は特に重要である。具体的には、これら特性はある時点で演算処理され、その他の一つまたは複数の時点で検証されてもよい。前記検証をパスすることが期待される;さもなければ改ざん例えば,逆行分析攻撃、コードおよびデータ変形例攻撃、コードおよびデータリフティング攻撃などが推測され、検出される。依存関係としてのプログラム特性をプログラム全体に伝搬させると、最終的に得られるものは、影響を受けていないプログラム特性に依拠する、しっかりと結合されたプログラムである。プログラムが正常に機能するかどうかは、プログラム特性によるところが大きくなる。上述のように、前記プログラム特性関数は所与のプログラムに対してソフトウェア保護を適用する技術者が使用できるよう、特性基本命令のライブラリが開発者によってハンドコードされる方法か、またはコンパイラ解析フェーズがプログラムへの自動注入用の特性基本命令を決定する方法かの二つの方法で作成できる。なお、これら選択可能なアプローチはどちらも本発明の不可欠の要件である。依存関係キャリアに関しては、かかるキャリアは、単純な変数から暗号化された値の計算を含む複合データ構造まですべてを含んでもよい。加えて、キャリアはデータに限定されず、依存関係はかわりに同様にプログラムコードに担持されてもよい。通常、本発明の依存関係キャリアは、個別の値を設定し、演算および/または条件を評価し、実行の異なる時点でその結果を使用し、また、設定されている元のデータ値を隠すように設計されたコード公式およびデータを備える。プログラム全体でデータとして担持されている依存関係は、好適には、変換済みの形態で暗号化され、元の値がアタッカーにわからないようにされる。このように、これらは簡単に逆行分析のような攻撃をかけられることはない。依存関係キャリアは、関連付けられたランダムな定数を有する様々な変換ファミリーを用いて暗号化される。暗号化方法のこの多様性により、依存関係が逆行分析されてプログラムから除去されるのを防ぐ一定レベルの曖昧性が提供される。デザイン志向に応じて、様々な公知の暗号化方法が、本発明の意図する範囲から外れることなくこの目的のために使用されてもよい。データ依存関係を暗号化する方法として可能なものは、米国特許第6,594,761号、第6,842,862号、および第7,350,085号に記載されている。参照文献の内容は当該参照により本明細書に包含される。前記値は、上述のように、以下の通り暗号化されてもよい。ある関数をFとすると、yFxであり、逆関数をF1とするとxF1yである。この場合、Fは、xを依存関係キャリアyに暗号化する手段として用いることができる。さらに、FおよびF1が、それら演算にさらにパラメータをいくつ取ろうとも、同じ全体的効果が得られる。加えて、xおよびyは、最も単純な場合、それぞれ単独の変数である。ただし、それらはまた、関数および逆関数の全体的効果が維持される限り、以下に示すもののいずれであってもよい:多数の変数、条件、データ構造、配列、大きな整数など。さらなるバリエーションとして、演算が既存のプログラムコードと混ざり合って関数および逆関数の境界が不明になってもよい。例えば、Fを、Fxcbaxとし、F1を、F1ya1b1c1yとする。前記関数a>b>c>c1>b1>a1は、全体として、依存関係を担持するというジョブを行い、最終的にその順序で実行されなければならない。ただし、関数および逆関数の関連を絶って、いくつかのサブ関数にする能力は、重要である。サブ関数は、ソースすなわち依存関係の発生元によって対象すなわちコードの挙動が依存関係に依存しているところに対して離間されているコード位置の何個分に注入されてもよい。依存関係キャリアとして機能するサブ関数は、以下のようであってもよい。―起動数が適切になるような条件制御下で、呼び出しグラフの様々なレベル、例えば、メインレベル、呼び出された関数、リーフ関数などに設けられてもよい単一のコードとして統合されてもよい。例えば、もし演算においてbおよびb1が同じまたは類似なら、それらは単一の関数に統合されてもよい既存のアプリケーション関数に統合されてもよい公知の特性例えば、定数、その他の特性基本命令で構築されてもよく、新たな依存関係キャリアおよびバインディングを、挿入される特性とするアプリケーションコードとブレンドしてもよい。例えば、a1という最後の演算は、コードと区別がつかないように、値xの最終使用とブレンドしてもよい依存関係キャリアのさらなる態様は、状態の概念である。依存関係キャリアは、一つの元の値の初期状態以上を担持してもよい。例えば、二つの初期値をxとx’とし、依存関係キャリアをyとすると、yFx、x’である。ここで、以下の4つの初期状態がありうる:1.何も設定されていない2.xが設定されている3.x’が設定されている4.xおよびx’の両方が、設定されているさらに、演算の概念が、依存関係キャリア状態に付加されてもよい。例えば、xおよびx’の等価条件に関心があるという状況を考えると、下記の演算によって、5番目の状態が定義される:5.等価条件の評価。同様に、さらにいくつかの暗号化演算または逆演算を、中間状態として考えることができる。これら暗号化は、算術演算またはブール演算から公式化できる。何らかの形式で情報が保有されている限り、前記データは、望ましい数の中間状態をとってもよい:6.中間状態n.中間状態。なお、上記は一例であり、したがって、入力が一つや、入力が二つの、算術演算、ブール演算、条件付き演算のいずれも、新たなキャリア状態と考えられることは、容易に理解できよう。キャリア状態は、キャリア情報を元のアプリケーションプログラムのフローとブレンドするために重要である。概して、前記依存関係キャリア状態は、どんな数の入力値や、その値についてのどんな数やタイプの演算からも計算できる。依存関係キャリアの結果とその演算は、依存関係バインディングを介してアプリケーションプログラムと組み合わせられるが、それは以下に記載する通りである。依存関係バインディングは、依存関係キャリアから情報を取得し、データおよび演算の結果をプログラム中の対象点に結合させる。ここでも、本発明の意図する範囲を逸脱することなく依存関係バインディングを作り出す方法がいくつかある。一つの可能な方法は、依存関係キャリアに基づいて演算処理された値を有するデータ実体を提供することである。演算処理された値は、プログラムの重要な演算の必須部分となる。さらに複雑なバインディングは、基本アルゴリズムの部分用の対象位置として必要なポインタの表をファイルすることによって提供できる。依存関係バインディングは、依存関係キャリアとアプリケーションコードとの間を接続させて改ざん防止するという目的を達成するために使用されるプログラム変換群である。依存関係バインディングは、以下のコード形式を考慮して様々な変換を使用する:1.依存関係キャリア、および2.アプリケーションプログラムコード。依存関係バインディングの目的は、上述した依存関係キャリアおよびアプリケーションプログラムコードを分かりにくくして、それらの分離を非常に困難にすることである。単にバインディング点で依存関係キャリア値を用いることにより、プログラムに対する直接的な依存関係バインディングを有することが可能である一方、アタッカーがこの依存関係を切り離すことも容易であろう。したがって、依存関係バインディングの機能は、依存関係キャリアをわかりにくくしてアプリケーションコードにブレンドすることによってバインディングの存在を不明にすることである。さらに、バインディングの挙動は、改ざん防止の有益性のために一定の基準を満たさなければならない。例えば、プログラムがその挙動を大きく変えることのないように非常に小さな変更を値に加えることをアタッカーができれば、そのアタッカーが成功する可能性が増える。本発明に従って、依存関係バインディングを作り出すために混合ブール演算MBA式を立てるための方法を特定する。MBA式は、望ましい挙動を計算するために組み合わせたいくつかのブール演算および/または算術演算である。依存関係バインディングは、コードの演算がアプリケーションコードとブレンドされるように構築されてもよい。さらに、バインディングはまた、依存関係キャリアが期待値を含む時に演算値が正常な挙動を呈し、かつ、依存関係キャリアが予想外の値を含む時に演算値が外れた値になるすなわち,非常に大きい、または非常に小さい値を含むか、または異常な挙動を呈するように構築されてもよい。依存関係バインディングは、C言語のようなハイレベルのプログラミング言語に見られるような構造から構築されてもよい。これらは、ブール演算:and、or、xor、notすなわち、、Λ、、または算術演算:add加算、sub減算、mul乗算、div除算、mod剰余すなわち、-、、、を含んでもよい。加えて、前記バインディングは、条件すなわち、equal等しい、notequal等しくない、greaterthan~より大きい、lessthan~より小さい、greaterthanorequal~より大きいか等しい、lessthanorequal~より小さいか等しい、または制御フローすなわち、ジャンプ、分岐、ループを含んでもよい。依存関係バインディングの形態は、依存関係キャリアに担持されている特性のタイプに関連付けられている。前記キャリアは、ダウンストリーム計算に用いられる単純な定数、または、条件例えば等価条件など、ある量の情報を含んでもよい。ここで、入力が一つの関数、例えばx、xのような演算が用いられてもよい。入力が二つの等価タイプの依存関係については、まず入力が二つで出力が一つの関数を考えることにより、バインディングを構築する。intdepintx、inty前記関数depは、xおよびyが同じ値を有する時に正常な挙動をし、xおよびyが異なる値を有する時に非常に異なる種類の挙動をするように構築されてもよい。さらに、関数に別の入力を加えてもよいintdepintx、inty、intc前記入力cは、演算で用いられるが、依存関係演算処理をアプリケーションプログラム自体に結合させる働きだけを行う。関数への別の入力は、何個であってもよい。望ましい演算処理は、次のような方法を用いて構築される1.演算とそれに対応する特徴とのパレットが作成される。特徴パラメータは、演算の数を含む。演算が多ければ安全性レベルが上がり、演算が少なければ性能が上がる。2.安全性および性能の目標を念頭におきつつ、パレットからの選択がなされる。3.選択を組み合わせて全演算処理を作り出す。演算のパレットを以下に示す演算パレットのこれら演算は、それぞれ異なる演算数で、同等に算術減算演算を行う。演算の数は、演算処理の安全性レベルおよび性能に寄与する。ハイレベルなプログラミング言語例えば,C言語用の算術演算およびブール演算はすべて、同じように特徴づけられてもよい。加えて、演算のパレットから、恒等関数が作成される。恒等関数は、入力x、および、一つ以上の別の入力、c1、c2、をとる演算処理群である。前記別の入力cl、c2、はプログラム値であるが、恒等関数の演算処理中は一定でなければならない。恒等関数は、出力時に値xを生成する。恒等関数は以下のとおりであるこのように恒等関数を作成することで、前記別の入力cl、c2、などを用いて依存関係をアプリケーションに導入することが可能になる。これら入力は、アプリケーションプログラムのなんらかの変数に結合されてもよく、それによりアタッカーの前記演算処理を切り出す能力を低減する。なぜなら、アタッカーにはプログラムの残り部分に対する依存関係の陰にあるセマンティクスが分からないからである。恒等関数は、ハイレベルのプログラミング言語例えば、C言語用の算術演算およびブール演算すべてについて作成される。さらに、上記の記載以外に、恒等関数を作成するために演算を組み合わせるやり方は、他に多数ある。説明用に、アプリケーションコードを保護するために使用される依存関係バインディングの例を下記に詳細に示す。ただし、かかる詳細な例は、本発明の意図する範囲を限定するものとはみなされない。以下の例は、アプリケーションコードを保護するために使用される依存関係バインディングの特徴を示す。関数depは、依存関係キャリアがどのようにプログラムコードに結合され、望ましい結果を達成するかを示す。関数mainに示されているように、定数値190にならなければならないプログラム特性があると想定する。前記プログラムは、変数xを使用してランタイム時に前記値を演算処理し、前記関数depが前記結果になりそれを担持するために用いられる。二つの状況が考えられる:1.変数xが、正しい値すなわち190を含む。その結果はd1にある。2.変数xが、正しくない値すなわち183を含む。その結果はd2にある。依存関係キャリア関数depは以下のように働く:入力値aおよびbを64ビットの戻り変数に担持されるよう暗号化する。この例は、前記値が算術演算subおよびブール演算xorによって演算される非常に単純な例を使用している。演算処理に入力cを利用するただし、前記値は出力結果に影響しない。唯一の必須条件は、前記値cが演算処理中に一定であることである。これにより、アタッカーが容易に切り離せない、プログラムコード上の依存関係が提供される。マクロで暗号化された、依存関係バインディング演算、BLEND1、BLEND2は、以下の属性を備えた構成である入力aが入力bと同じ値を有していれば、バインディング演算は1を算出する。入力aが入力bとは異なる値を有していれば、バインディング演算は大きな値を算出する。同様に、依存関係キャリアがゼロを生成すれば、PREBLENDは大きな数の定数を加算する構成であり、POSTBLENDはこの同じ大きさの定数を減算する構成である。一方で、依存関係キャリアが他の値を生成すれば、POSTBLENDは前記の大きい定数値を加算する。これら依存関係バインディングマクロは、拡張して前記演算をアプリケーションコードにブレンドするので、アタッカーが容易に除去できない。前記マクロは、特性にブレンドされた依存関係を隠しつつ等価の関数を提供する手段を、効果的に提供する。関数mainにおいて、100という値になるべきkとjという二つの加算がある。なお、この加算は、アプリケーションプログラムにおける有意な演算を示している。第1の加算は、正しい値が演算処理される結果となるd1に依存し、第2の加算はd2に依存し、これは非常に大きな正しくない数が演算処理される結果となる。さらに本例について、以下の3つの部分がある:1.元のソース形態のプログラム例2.処理前のプログラム例。これは、コードをアプリケーションプログラムにブレンドしたものを示す3.プログラムが実行されている時のランタイム出力。前記第1の出力は、前記特性が正しいことを示している。前記第2の出力は、前記特性が正しくないことを示している。前記第3の出力は、前記特性が正しいことを示している。元のソース形態のプログラム例は以下を含む:前記処理前のプログラム例は、以下を含む:コンパイルおよび実行後のランタイム出力は、以下を含む:onehundred100onehundred81964804onehundred100依存関係キャリアおよびバインディングは、図3に図示される。ここに、本発明のプログラム変換を示す図が示されている。前記元のプログラム側300は、データ依存関係311~313またはそれ以上、アプリケーション関数321~324またはそれ以上、およびアセット331~333またはそれ以上を含む。正常なプログラムフローは、矢印370により表されている。元のプログラム側300から変換済みプログラム側301へ向かう大きな黒矢印によって示されている変換の際に、前記元のデータ依存関係、関数、およびアセットは、注入された依存関係バインディングD-バインディング351~355、および依存関係キャリアD-キャリア361~365の依存関係ネットワーク点線で表されているを含む。この依存関係ネットワークは、変更プログラムフロー371を効果的に作り出す。前記依存関係ネットワークは、外部データの挿入と、注入データ314および注入関数325によって提供された新たな関数とによって、さらに改善される。図3に示されたかかるプログラム変換の基礎となる方法は、本発明の方法に従った一般的な工程400を示す図4をさらに参照して、詳細に説明される。アプリケーションを依存関係ネットワークに変換する方法は、以下の工程を含む:工程1元のアプリケーションは、411でソース形態からパースされ、412で中間コンパイラ表現で表されている工程2重要なアセット明示の、または非明示のプログラム特性を含むが、413で認識され、ユーザの仕様書に基づいて優先順位が決められる工程3414で、前記アプリケーションが、元のデータおよびプログラム依存関係について解析される。解析情報は同様に、工程2からの情報に相互に関連付けられる工程4415で、ユーザが、所与のアプリケーションについての性能/サイズオプションおよび/またはトレランスを提供する工程5416で、アプリケーション内でできるだけ広く前記依存関係を拡張させることを目指して、新たなデータおよびコード依存関係の項目上記のようにが挿入される。前記重要なアセットの優先順位工程3およびユーザのアプリケーションの前記性能/サイズトレランス工程4に基づき、トレードオフが行われる工程6417で、中間表現から変換済みアプリケーションが生成される。上記工程5では、下記のサブ工程が含まれる:サブ工程1アセットの重要性、プログラム中の関係、および性能トレランスに基づいて、新たな依存関係についてデータおよびコードが識別されるサブ工程2データとコードとの間で、データとデータとの間で、またはコードとコードとの間で、依存関係が作り出されるが、それは以下のいずれかによってなされる:a演算を等価の依存関係関数と置き換える。これら等価の依存関係関数はMBA演算で構築され、元の演算と同じ関数を行うが、外部データ依存関係も有するようになっている。前記外部データは、関数演算処理の一部であり、切り離せない状態で用いられる。前記データの変化または除去は、異常な挙動を引き起こすb定数データを演算処理するための演算の挿入c関数呼び出しを挿入dハッシュ有効性チェックを挿入e使用時点でデータを複製サブ工程3関数と他の関数との間に依存関係が作り出される:a関数統合b新たなコードおよび関数呼び出しを挿入c等価の依存関係関数を挿入。上記に参照した変換手順400の結果は、強固に結合したプログラムであり、これは図3を参照して示され、すでに記載されている。したがって、関数およびデータが、変換プロセスを経て互いに密接に依存するようになっていることは明らかである。これは、重要なアセット、ノードロックアルゴリズム、プログラム特性演算処理、などすべてが、プログラム全体でデータおよびコードを介して、互いに密接に結合し依存するようになっていることを意味している。これは改ざん攻撃の脅威を低減し、リフティング攻撃をより困難にしている。幅広いバリエーションのプログラムの大きな部分に一片のコードまたはデータが依拠している場合、別のプログラムに使用するために前記コードおよび/またはデータを分離することはとても困難である。プログラム特性チェック、ノードロック、透かしなど、前記プログラムの個別化された特徴を考えると、アタッカーは常に、全プログラムを全体として使用することを余儀なくされ、改ざんおよびソフトウェアリフティング攻撃が無効にされる。アタッカーがプログラムを全体でとらえることを余儀なくされているので、この場合、攻撃耐性という目標が達成されている。本発明の別の例は、公知の装置フィンガープリンティングとともに、本発明のシステムおよび方法を実施することを含む。概して、プログラムが、スライス間に限定的な相互依存関係を有するプログラムスライス群に分解できることは知られている。かかるプログラムスライス依存関係が、従来技術の図5に示されている。従来技術の図5は、特定のコンピュータ用のIPアドレス519とHardwareGUIDすなわち、GeneralUniversalIdentifierグローバル一意識別子510を読み出し、その後、署名518およびチェックサムアルゴリズム511をそれぞれ実行する公知の装置フィンガープリンティングのシナリオである。この工程は、ノード許可514をチェックし、プログラムの他の部分を進行させるか515での中間および516での終了または512でプログラムを中断させる関数への入力として用いられる、予想されるフィンガープリント517を生成する。これは、mainプログラム513の一部として行われる。この装置フィンガープリンティングシナリオは、事実上、単純化されたノードロッキングアルゴリズムであり、そこではユーザは、IPアドレスとHardwareGUIDとの正しい組み合わせを用いた時のみコンピュータ上でプログラムを実行することが許可される。安全性保護の観点から見ると、従来技術の図5に示された装置フィンガープリンティングシナリオにある主要な問題の1つは、それがプログラムスライスから成ることであり、そこでは依存関係プログラムおよびデータの双方のフローが一つの関数から次の関数へと向かっており予測可能になっていることである。これら依存関係は破線で示されている。この論理フローは、良好なモジュラープログラミングの実行に役立つ一方、いくつかの一目瞭然な攻撃ポイントを提供している。まず、データ予期されたフィンガープリント定数517が異なるデータと置き換えられるだろう。さらに、ハードウェア関数IPアドレス読み出し519、ハードウェアGUID読み出し510が、望ましいデータを生成するハードコードされた関数と置き換えられるだろう。また、フィンガープリント関数署名作成518、チェックサム511がハードコードされた関数と置き換えられるだろう。さらに、ノード許可チェック関数514での条件がプログラム開始を常に許可するように妨害されるだろう。さらに、ノード許可チェック関数514の呼び出しが除去されるだろう。かかる攻撃ポイントは、本発明を実行することによって低減されよう。本発明を従来技術の図5に示された装置フィンガープリンティング実施形態に適用した後に、新たに挿入された依存関係が元のスライスすべてを相互に依存させ、プログラム全体が依存関係のネットワークになって、さらなる分解を困難なものにする。この本発明の装置フィンガープリンティング実施形態の変形例は図6に示される。これにより、本開示に記載の方法を使用して、同じ基礎となるアプリケーション例が変換され、変換済みアプリケーション600が生成される。この例では、依存関係キャリアおよびバインディングは、単純なデータ変数であり、使用は下流のプログラム点である。この例は、上述の効果的な依存関係キャリアおよびバインディングを考慮した、依存関係が効果的に配置される場所を点線によって示している。前記の例のように、外部データと挿入データ610によって提供された新たな関数との挿入によって、依存関係ネットワークがさらに改善される。従来技術の図4に関連する元のプログラムコードは次のように実施される:先の段落に記載された、この元のコードの例は、変換図6に一般的に示された本発明の変換の時は、以下のように示される:本発明の上記の実施形態は、あくまでも例示である。当業者であれば、本明細書に添付の請求項によってのみ定義される本発明の範囲を逸脱することなく、前記特定の実施形態に改変、変更、およびバリエーションを加えるであろう。"