コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化装置であって、前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存するインデックス生成部と、前記コードブロックを暗号キーで暗号化するが、1回呼び出されるコードブロックの暗号キーは前記第1類型のコードブロックを呼び出すコードブロックを利用して生成し、2回以上呼び出されるコードブロックの暗号キーは乱数で生成して前記実行ファイルに保存するブロック暗号化部と、を含むことを特徴とするインデックステーブル基盤のコード暗号化装置。前記実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記インデックス生成部は、最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出すことを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記インデックス生成部は、コードブロックの呼出回数をインデックステーブルに保存するが、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を一つずつ増加させて保存することを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記ブロック暗号化部は、前記第1類型のコードブロックの呼出ブロックをハッシュして前記第1類型のコードブロックの暗号キーを生成することを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記ブロック暗号化部は、最初のコードブロックの暗号キーを初期キーで決めることを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記ブロック暗号化部は、前記第2類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存することを特徴とする請求項1記載のインデックステーブル基盤のコード暗号化装置。前記ブロック暗号化部は、前記インデックステーブルを前記実行ファイルのデータ領域に保存することを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。前記インデックス生成部は、前記コードブロックのサイズを前記インデックステーブルに保存することを特徴とする請求項1に記載のインデックステーブル基盤のコード暗号化装置。請求項1乃至請求項9の中でいずれの1項の装置により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化装置であって、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するブロック復号化部と、復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックを再暗号化するブロック再暗号部と、を含むことを特徴とするインデックステーブル基盤のコード復号化装置。前記ブロック再暗号部は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復回数が0になれば、前記コードブロックを再暗号化することを特徴とする請求項10に記載のインデックステーブル基盤のコード復号化装置。コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化方法であって、前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存し、2回以上呼び出されるコードブロックに対して暗号キーを乱数で生成して保存するステップと、前記コードブロックを前記コードブロックの暗号キーで暗号化するが、1回呼び出されるコードブロックの暗号キーは前記第1類型のコードブロックを呼び出すコードブロックを利用して生成するステップと、を含むことを特徴とするインデックステーブル基盤のコード暗号化方法。前記実行コードはアセンブリコードであり、前記呼出コードはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする請求項12に記載のインデックステーブル基盤のコード暗号化方法。前記ステップは、前記実行コードを順次に検査するステップと、検査した実行コードが呼出コードであれば、呼出コードの被演算子からアドレスを抽出するステップと、前記アドレスが前記インデックステーブルに存在しなければ、前記アドレスを前記インデックステーブルにコードブロックの開始アドレスで挿入するステップと、前記アドレスが前記インデックステーブルに存在すれば、前記アドレスに該当するコードブロックの呼出回数を一つずつ増加させるステップと、前記コードブロックの呼出回数が1回以上であれば、前記コードブロックの暗号キーを乱数で生成して保存するステップと、を含むことを特徴とする請求項12に記載のインデックステーブル基盤のコード暗号化方法。前記ステップは、前記実行ファイルの最後の実行コードを検査すれば、各コードブロックのサイズを計算して前記インデックステーブルに保存するステップをさらに含むことを特徴とする請求項12に記載のインデックステーブル基盤のコード暗号化方法。請求項12乃至請求項15の中でいずれの1項の方法により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化方法であって、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するステップと、復号化されたコードブロックの最後の実行コードが実行されると、前記コードブロックを再暗号化するステップと、を含むことを特徴とするインデックステーブル基盤のコード復号化方法。したがって、本発明は上述したような従来技術の問題点を解決するためになされたもので、その目的は、1回呼び出されるコードブロックは自分を呼び出すコードブロックを利用して暗号復号化し、2回以上呼び出されるコードブロックは乱数で生成した暗号キーで暗号復号化するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法を提供することにある。本発明の他の目的は、コードブロックの開始アドレス、呼出回数、ブロックのサイズなどを保存するインデックステーブルを利用して実行コードをブロックで区分するか呼出回数を計算するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法を提供することにある。前記目的を達成するために本発明は、コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化装置にあって、前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存するインデックス生成部と、前記コードブロックを暗号キーで暗号化するが、1回呼び出されるコードブロックの暗号キーは前記第1類型のコードブロックを呼び出すコードブロックを利用して生成し、2回以上呼び出されるコードブロックの暗号キーは乱数で生成して前記実行ファイルに保存するブロック暗号化部と、を含むことを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出すことを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、コードブロックの呼出回数をインデックステーブルに保存し、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を1ずつ増加させて保存することを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記第1類型のコードブロックの呼出ブロックをハッシュして前記第1類型のコードブロックの暗号キーを生成することを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、最初コードブロックの暗号キーを初期キーで決めることを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記第2類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存することを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記インデックステーブルを前記実行ファイルのデータ領域に保存することを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、前記コードブロックのサイズを前記インデックステーブルに保存することを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化装置により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化装置であって、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するブロック復号化部と、復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックをさらに暗号化するブロック再暗号部と、を含むことを特徴とする。また、本発明は、インデックステーブル基盤のコード復号化装置において、前記ブロック再暗号部は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復関数が0回になれば、前記コードブロックを再暗号化することを特徴とする。また、本発明は、コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化方法であって、前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存し、2回以上呼び出されるコードブロックに対して暗号キーを乱数で生成して保存するステップと、前記コードブロックを前記コードブロックの暗号キーで暗号化するが、1回呼び出されるコードブロックの暗号キーは前記第1類型のコードブロックを呼び出すコードブロックを利用して生成するステップと、を含むことを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記実行コードはアセンブリコードであり、前記呼出コードはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記ステップは、前記実行コードを順次に検査するステップと、検査した実行コードが呼出コードであれば、呼出コードの被演算子からアドレスを抽出するステップと、前記アドレスが前記インデックステーブルに存在しなければ、前記アドレスを前記インデックステーブルにコードブロックの開始アドレスで挿入するステップと、前記アドレスが前記インデックステーブルに存在すれば、前記アドレスに該当するコードブロックの呼出回数を1回増加させるステップと、前記コードブロックの呼出回数が1回以上であれば、前記コードブロックの暗号キーを乱数で生成して保存するステップと、を含むことを特徴とする。また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記ステップは、前記実行ファイルの最後の実行コードを検査すれば、各コードブロックのサイズを計算して前記インデックステーブルに保存するステップをさらに含むことを特徴とする。また、本発明は、前記インデックステーブル基盤のコード暗号化方法により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化方法にあって、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するステップと、復号コードブロックの最後の実行コードが実行されると、前記コードブロックをさらに暗号化するステップと、を含むことを特徴とする。上述のように、本発明によるインデックステーブル基盤のコード暗号化及び復号化装置及びその方法によれば、インデックステーブルを利用してコードブロックの呼出回数によって暗号キーを相違に生成することにより、安全なコード暗号化が可能であるだけではなく、暗号化または復号化の実行時間を短縮させて保存するデータの量を減らす効果が得られる。以下、添付図面を参照して本発明の好ましい実施の形態について詳細に説明する。また、本発明の説明において同一部分には同一符号を付けて、その繰り返し説明は省略する。先に、本発明を実施するための全体システムの構成の一例に対して図1を参照して説明する。図1に示したように、本発明を実施するための全体システムは、暗号化装置30と復号化装置40で構成される。暗号化装置30または復号化装置40は、プログラムで構成されてコンピュータ端末11、12に設置され実行される。コンピュータ端末11、12に設置されたプログラムは一つのシステム30、40のように動作できる。一方、他の実施形態として、暗号化装置30または復号化装置40はASICなど一つの電子回路で構成して実施できる。すなわち、ソフトウェア形態、FPGAチップや多数個の回路素子で構成された電子回路の形態で構成することもできる。その外の可能な他の形態でも実施できる。しかし、以下では説明の便宜のためにコンピュータ端末11、12に具現された暗号化装置30または復号化装置40で説明する。実行ファイル60はコンピュータ端末11の保存媒体にあらかじめ保存され、保存された実行ファイル60を暗号化装置30により読み出して入力することができる。暗号化装置30は実行ファイル60の実行コードを暗号化して暗号化された実行ファイル60aを生成する。図2のに示したように、実行ファイル60は実行コード領域61とデータ領域62で区分される。実行コード61はコードブロック62で区分される。好ましくは、実行ファイル60はバイナリコード、アセンブリコードなどの実行コード61で構成される。実行コード61が中央処理装置により直接実行されるコードであれば、機械語またはバイナリコードである必要があるが、インタプリターなどにより解釈され実行される場合はそのインタプリターに合わせるアセンブリコードなどで生成されなければならない。実行コード領域61はアセンブリコードなど実行コードを保存するための領域であり、データ領域62はデータを保存するための領域である。この時、暗号化装置30は実行コード61をコードブロック63単位で暗号化する。したがって、コードブロック単位で復号化することも可能である。例えば、コードブロック3だけを別に復号化することができる。コードブロック63は一連の実行コード61aで構成される。実行コードという用語は実行コード全体を意味する用語や一つのラインである実行コードを意味する用語で混用する。コードブロック63内の実行コード61aは順次に実行され、コードブロック63内の最後の実行コード61aは呼出コードとして、呼出コードが実行されると、他のコードブロック63に移動され実行される。呼出コードはアセンブリコードにおいてジャンプコードまたは分岐コードなどを意味する。すなわち、コードブロック63の呼出コードにより順次に次の実行コードが実行されないで、他の位置にあるコードブロック63が新しく開始される。また、前記実行コードのコードブロックに対する情報はインデックステーブル70に保存される。インデックステーブル70はデータ領域62に保存される。インデックステーブル70は各コードブロックのアドレス、ブロックのサイズ、呼出回数などを保存するテーブルで構成される。好ましくは、インデックステーブル70は初期キーで暗号化されて保存できる。また、データ領域全体も初期キーにより暗号化されて保存できる。前記のように、暗号化された実行ファイル60aはネットワーク20を介して配布されるかオフライン上に配布される。配布された実行ファイル60aはコンピュータ端末12に設置され実行される。図2のに示したように、実行ファイル60aの実行コード61及びデータ領域62はコンピュータ端末12のメモリー12bにローディングされて常住する。各実行コード61aは1ラインずつコンピュータ端末12のCPU12aにより読み出され実行される。この時、実行コード61は全体がメモリー12bにローディングされるか、一部だけがローディングされることもできる。この時、一つのラインの実行コードはアドレスにより識別され、一つのコードブロックは多数の実行コードで構成される。一方、実行ファイル60aがローディングされ実行されるとき、実行ファイル60aにも、固定されたデータ領域62と、スタックまたは流動的なデータのための流動的なデータ領域65が生成される。以下では区別せずデータ領域62だけで記載する。上述のように、一つのコードブロック63は順次に実行され、コードブロック63の最後の実行コードである呼出コードが実行されると、他のコードブロックにジャンプされ実行される。同一なコードブロック内で反復されて順次に実行される場合もある。復号化装置40は暗号化された実行ファイルの実行コードを復号化して実行コードを実行させる。この時、復号化装置40は実行されるコードブロック63だけを復号化し、復号化されたコードブロック63を全て実行すれば、復号化したコードブロック63を再暗号化する。そして、次に実行されるコードブロック63を復号化して復号化されたコードブロック63を実行する。図2のの例において、コードブロック1→コードブロック3→コードブロック2を実行すると仮定する場合、先にコードブロック1を復号化する。コードブロック1の復号化を全て実行すれば、コードブロック1を再暗号化し、次に実行するコードブロック3を復号化する。そして、コードブロック3の復号化を全て実行すれば、コードブロック3を暗号化してコードブロック2を復号化する。次に、本発明を説明するための用語及び略語について図3を参照して説明する。IKは初期キーとして、乱数とインデックステーブルを同時に保護する。乱数は、多重ブロックにより呼び出される基本ブロックを暗号化し、また初期キーIKは乱数を暗号化する。初期キーIKを保護してまた提供することはアプリケーションに依存し、初期キーIKは外装ハードディスクやTPMなどの外部記憶媒体に記憶することができる。したがって、初期キーIKがオフライン上で安全に分配され記憶されると仮定する。乱数は2個以上のコードブロックから呼び出されるコードブロックを暗号化し、初期キーIKを暗号化する。保護キーPKは初期キーIKにより暗号化された乱数を意味する。保護キーPKはバイナリコードのデータセクションに記憶される。また、暗号化または復号化アルゴリズムは従来の暗復号化技法を利用するので、その具体的な説明は省略する。EKとDKは各々暗号キーKを利用して暗号化または復号化演算を行うことを表示する。Hは一方向のハッシュ関数を意味する。次に、本発明によるインデックステーブル基盤のコード暗号化及び復号化装置及びその方法が充足すべき要求事項、すなわち、安全なコード暗号技法の要求事項について説明する。先に、気密性を備える必要がある。原本バイナリコードは気密性維持を通じて静的分析から保護されなければならない。バイナリコードをフローや制御移動などの動的分析から保護するためにメモリー上には最小個数のコードブロックが存在する必要がある。メモリー上にコードが暗号化されている限りプログラムは静的及び動的分析から保護される。また、メモリーダンプが防止される必要がある。もし、単一ルーチンを通じて一つのプログラムを丸ごと暗号化する場合、復号化ルーチンがプログラム全体を復号化した後、開始地点を指定すると、これはメモリーダンプ攻撃に脆弱になる。したがって、最小限のプログラムが復号化される必要があり、残り部分は暗号化された状態を維持しなければならない。また、正しいキーチェーンを具備する必要がある。コード暗号化がプログラムに適用されると、正しいキーが必要になる。もし、多重経路が存在するとき正しいキーチェーンを持たないと、システムクラッシュや意図しなかった実行が可能である。また、不正使用防止を満足しなければならない。不正使用から保護するためには無欠性維持が必要である。これは下記のような特性が必要とする。暗号化過程で、1ビットが一つの基本ブロックを変更すれば、その効果はすべての暗号化されたブロックに影響を及ぼさなければならない。復号化過程で、もし、暗号化されたブロックで一つ以上のビットが変更されると、復号化結果は一つ以上のビットが変更されなければならない。次に、本発明の一実施形態によるインデックステーブル基盤のコード暗号化方法について図4を参照してより具体的に説明する。図4のに示したように、本発明によるインデックステーブル基盤のコード暗号化方法はコンパイルするステップ、インデックステーブルを生成するステップ及びコードブロックを暗号化するステップに区分される。前記ステップは、プログラムソースコードをコンパイルして実行コードを生成するステップである。前記ステップでは、実行コードを呼出コードによりコードブロックで区分し、各コードブロックの呼出回数及び開始アドレスなどの情報をインデックステーブルで生成する。この時、呼出回数が2回以上のコードブロックに対して乱数で暗号キーを生成して記憶する。この時、呼出回数が2回以上のコードブロックを第2類型のコードブロックと称し、その他のコードブロックを第1類型のコードブロックと称する。第1類型のコードブロックは呼出回数が1回である。一方、最初のコードブロックは初めてプログラムの開始により1回呼び出されることで仮定する。次に、ステップをより具体的に説明する前に、ステップを具体的に説明する。前記ステップは、図4のに示したとおりである。図4のに示したように、前記ステップは、コードブロックを暗号キーで暗号化する。この時、1回呼び出されるコードブロックの暗号キーはこのコードブロックを呼び出すコードブロックを利用して生成する。すなわち、呼出ブロックを利用して暗号化する。また、2回以上呼び出されるコードブロックは乱数で生成された暗号キーを通じて暗号化される。例えば、乱数自体を暗号キーで使ってコードブロックを暗号化する。コードブロックは、次の数1により暗号化される。iはインデックステーブル内にあるコードブロックの手順である。もし、フラグが0ではないと、ブロックは乱数により暗号化されたのである。初期キーIKは乱数を暗号化して実行ファイル内に保存される。もし、乱数が露出されると、該当ブロックは乱数により復号化され、したがって、ブロックは攻撃者により分析可能になるからこのような暗号化ステップが必要である。インデックステーブルは正しいキーチェーンを形成するために使われる。テーブル構成は次のようである。まず、基本ブロックの現在アドレスを保存した後、呼出コードをポインタを移動しながら調査する。このような呼出コードの命令語は次に実行されるコードブロックのアドレスを後に有している。次のアドレスが現在の基本ブロックを示している場合、これはルーフや再帰を意味する。ルーフや再帰が発生すれば、cmp命令語などを通じて呼出回数を決めることができるようになり、このような呼出回数をテーブルに保存する。これと同様に、現在のブロックがもうテーブルに保存されている場合、これは該当コードブロックの多重呼出を意味する。このとき保護キーPKが生成されてバイナリイメージのデータ領域に保存される。保護キーPKは乱数を暗号化したもので、乱数がコードブロックを暗号化する暗号キーとして使用される。図6に示したように、基本ブロックDは、B、CそしてFなどの多重ブロックにより呼び出される。すなわち、3個の相違なるコードブロックにより呼び出されている。Bの暗号キーはAブロックのハッシュ値であり、Cの秘密キーと同一である。FはAにより直接呼び出されなくて、Dにより呼び出される。その時、乱数rがDの秘密キーで生成され、これはさらに初期キーで暗号化される。その結果、保護キーが新たに生成され、これはバイナリファイル内に保存される。保護キーは乱数rが初期キーにより暗号化された値を意味する。リヌックスやウィンドウなどの一般的なコンピュータ運営体制は、実行ファイルイメージ内に変数を保存することができるデータ領域を支援し、したがって、保護キーはこのような実行ファイル内に存在するデータ領域内に保存できる。インデックステーブルは反復呼び出される回数を含む。もし、これが考慮されなければ、ループまたは再帰などを意味する基本ブロックが数回復号化できる。したがって、ループや再帰回数をテーブル内に表示しておくことによりこのような問題を解決することができる。もし、基本ブロックが呼び出されると、テーブル内に保存された呼出回数が1減少し、このような方式で呼出回数が0になれば、該当ブロックはメモリーダンプ防止のために再暗号化される。例えば、ループの場合、C言語で使われた例示は図7のようである。cmp命令語において二番目の被演算子の値はOAである。これはブロックloc_401006は10回実行されることを意味し、これはブロックのループまたは再帰回数であることが分かる。図4のを参照して加えて説明すれば、最初のコードブロックPOは初期キーIKで暗号化する。インデックステーブルから次のコードブロックのアドレス及び類型を読み出して、何の類型であるかを判断する。インデックステーブルでフラグが0であれば、第1類型のコードブロックであり、0ではなければ、第2類型のコードブロックである。現在のコードブロックPiが第1類型のコードブロックであれば、直前の呼出ブロックPi-1をハッシュしてハッシュ値Hで現在のコードブロックPiを暗号化する。そして、現在のコードブロックPiが第2類型のコードブロックであれば、乱数を発生して、乱数rで現在のコードブロックを暗号化する。この時、ステップで発生させた乱数を利用することもでき、ステップで乱数を発生しなければこのステップで乱数を発生する。インデックステーブルから読み出した現在のコードブロックPiが最後のコードブロックであるか否かを確認して、最後のコードブロックであれば終了し、そうではなければ、次のコードブロックを読み出して前記過程を繰り返す。次に、前記ステップを、図4bと図8及び図9を参照してより具体的に説明する。図4bは、インデックステーブルを生成するステップを説明するフローチャートであり、図9は、図8の実行コードの例からインデックステーブルを生成した一例を示した図である。図8に示したように、例示コードは大きく5個のコードブロックに分けられる。基本ブロックはjumpやbranch系列の命令語により分けられる。先に初期化が実行される。0x0040103Eはプログラムの開始地点でセッティングされる。以後jumpやbranch系列の命令語が探索される。図9に示したように、もし、命令語がjumpやbranchであれば、これは他のブロックの一番目のアドレスになるため、被演算子をテーブルに保存する。例えば、0x0040105Aはアドレス0x0040104Fに存在するjne0x0040105Aコードによりテーブルに保存される。命令語の次のアドレスは他のブロックの一番目のアドレスになる。すなわち、0x00401051はテーブルに保存される。このような方法で、0x0040106Cと0x00401060が順に保存される。アドレス0x0040106Aで命令語はjmp0x00401051で識別される。0x00401051はもうテーブルに保存されているので、これは多重呼出されるブロックであると言える。したがって、該当ブロックの情報が更新されて乱数が生成される。このような方法ですべてのブロックが識別され区分される。図9のインデックステーブルにおいて、アドレスはコードブロックの開始アドレスであり、コードブロックを識別する識別子の機能をする。また、呼出回数は他のコードブロックが該当コードブロックを呼び出す回数を記録したのである。フラグは多重経路呼出フラグとして、1回呼び出される場合0を記録し、2回以上呼び出されて多重経路の呼出が形成される場合1を記録する。前記ステップ及びステップに対する疑似コードは各々図5のとのようである。次に、本発明の一実施形態によるインデックステーブル基盤のコード復号化方法について図10を参照してより具体的に説明する。図10に示したように、本発明によるインデックステーブル基盤のコード復号化方法は、大きくコードブロックを復号化するステップ、コードブロックの実行コードを実行するステップ及び復号化されたコードブロックを再暗号化するステップに区分される。先に、最初のコードブロックは初期キーIKで復号化する。最初のコードブロックの実行が完了されると、次のコードブロックを読み出す。この時、インデックステーブルで次のコードブロックのアドレスを検索する。次のコードブロックがどの類型であるかを判断して、第1類型であれば、直前のコードブロックをハッシュしてハッシュ値を暗号キーとしてコードブロックを復号化する。第2類型であれば、保存された保護キーを持ち込んで初期キーIKで復号化して乱数を抽出して、抽出された乱数を暗号キーとしてコードブロックを復号化する。そして、コードブロックを実行し、実行されたコードブロックを再暗号化する。すべてのコードブロックが完了されて最後のコードブロックになると終了する。すなわち、前記ステップは、実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用する。先に、プログラムが始まる前に、インデックステーブルを参照してプログラムのエントリポイントを探す。そして、暗号化されたコードブロックCiを実行コードまたはコードブロックPiで復号化する。暗号化されたコードブロックは直前ブロックのハッシュ値を利用して復号化され、復号化されたコードPiが実行される。もし、直前ブロックPi-1がP′i-1に変更された場合、暗号キーはH≠Hである。したがって、コードブロックPiは正しく復号化されない。一方、インデックステーブルはフラグを含む。フラグはコードブロックが乱数を利用するか利用しないかを示すフラグである。もし、フラグが1であれば、暗号化されたコードブロックは乱数で復号化しなければならない。復号化コード作業が完了すれば、復号化されたコードブロックはさらに暗号化されてメモリーに保存される。次に、本発明の一実施形態によるインデックステーブル基盤のコード暗号化装置30の構成について図12を参照してより具体的に説明する。図12に示したように、本発明による暗号化装置30はインデックス生成部31及びブロック暗号化部32で構成される。インデックス生成部31は、実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存する。ブロック暗号化部32は、コードブロックを暗号キーで暗号化するが、1回呼び出されるコードブロックの暗号キーは前記第1類型のコードブロックを呼び出すコードブロックを利用して生成し、2回以上呼び出されるコードブロックの暗号キーは乱数で生成して前記実行ファイルに保存する。この時、実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードである。一方、インデックス生成部31は最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出す。また、インデックス生成部31はコードブロックの呼出回数をインデックステーブルに保存し、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を一つずつ増加させて保存する。また、インデックス生成部31は前記コードブロックのサイズを前記インデックステーブルに保存する。ブロック暗号化部32は、前記第1類型のコードブロックの呼出ブロックをハッシュして前記第1類型のコードブロックの暗号キーを生成する。また、ブロック暗号化部32は最初コードブロックの暗号キーを初期キーで決める。また、ブロック暗号化部32は、前記第2類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存する。好ましくは、ブロック暗号化部32は前記インデックステーブルを前記実行ファイルのデータ領域に保存する。次に、本発明の一実施形態によるインデックステーブル基盤のコード復号化装置40の構成について図13を参照してより具体的に説明する。図13に示したように、本発明による復号化装置40はブロック復号化部41及びブロック再暗号部42で構成される。ブロック復号化部41は、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第1類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第2類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用する。ブロック再暗号部42は、復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックを再暗号化する。特に、ブロック再暗号部42は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復回数が0になれば、前記コードブロックを再暗号化する。前記暗号化または復号化装置に対する説明の中で省略した部分は上述した暗号化または復号化方法の記載を参照する。以上、本発明を具体的な実施形態を参照して詳細に説明したが、本発明の範囲は前述の実施形態によって限定されるべきではなく、特許請求の範囲の記載及びこれと均等なものの範囲内で様々な変形が可能なことは、当該技術分野における通常の知識を持つ者には明らかである。