(57)【要約】      （修正有）【課題】安全なコード暗号化を可能とするだけではなく、暗号化または復号化の実行時間を短縮して保存するデータの量を減らす。【解決手段】暗号化装置３０は、実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存するインデックス生成部３１と、コードブロックを暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは第１類型のコードブロックを呼び出すコードブロック(呼出ブロック)を利用して生成し、２回以上呼び出されるコードブロック(第２類型のコードブロック)の暗号キーは乱数で生成して実行ファイルに保存するブロック暗号化部３２と、を含む。【選択図】図１２
2012118956.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化装置であって、
前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存するインデックス生成部と、
前記コードブロックを暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは前記第１類型のコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成し、２回以上呼び出されるコードブロック(以下、第２類型のコードブロック)の暗号キーは乱数で生成して前記実行ファイルに保存するブロック暗号化部と、を含むこと
を特徴とするインデックステーブル基盤のコード暗号化装置。
【請求項２】
前記実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項３】
前記インデックス生成部は、最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出すことを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項４】
前記インデックス生成部は、コードブロックの呼出回数をインデックステーブルに保存するが、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を一つずつ増加させて保存することを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項５】
前記ブロック暗号化部は、前記第１類型のコードブロックの呼出ブロックをハッシュして前記第１類型のコードブロックの暗号キーを生成することを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項６】
前記ブロック暗号化部は、最初のコードブロックの暗号キーを初期キーで決めることを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項７】
前記ブロック暗号化部は、前記第２類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存することを特徴とする請求項１記載のインデックステーブル基盤のコード暗号化装置。
【請求項８】
前記ブロック暗号化部は、前記インデックステーブルを前記実行ファイルのデータ領域に保存することを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置 。
【請求項９】
前記インデックス生成部は、前記コードブロックのサイズを前記インデックステーブルに保存することを特徴とする請求項１に記載のインデックステーブル基盤のコード暗号化装置。
【請求項１０】
請求項１乃至請求項９の中でいずれの１項の装置により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化装置であって、
前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するブロック復号化部と、
復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックを再暗号化するブロック再暗号部と、を含むこと
を特徴とするインデックステーブル基盤のコード復号化装置。
【請求項１１】
前記ブロック再暗号部は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復回数が“０”になれば、前記コードブロックを再暗号化することを特徴とする請求項１０に記載のインデックステーブル基盤のコード復号化装置。
【請求項１２】
コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化方法であって、
(ｂ)前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存し、２回以上呼び出されるコードブロック(以下、第２類型のコードブロック)に対して暗号キーを乱数で生成して保存するステップと、
(ｃ)前記コードブロックを前記コードブロックの暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは前記第１類型のコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成するステップと、を含むこと
を特徴とするインデックステーブル基盤のコード暗号化方法。
【請求項１３】
前記実行コードはアセンブリコードであり、前記呼出コードはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする請求項１２に記載のインデックステーブル基盤のコード暗号化方法。
【請求項１４】
前記ステップ(ｂ)は、
(ｂ１)前記実行コードを順次に検査するステップと、
(ｂ２)検査した実行コードが呼出コードであれば、呼出コードの被演算子からアドレスを抽出するステップと、
(ｂ３)前記アドレスが前記インデックステーブルに存在しなければ、前記アドレスを前記インデックステーブルにコードブロックの開始アドレスで挿入するステップと、
(ｂ４)前記アドレスが前記インデックステーブルに存在すれば、前記アドレスに該当するコードブロックの呼出回数を一つずつ増加させるステップと、
(ｂ５)前記コードブロックの呼出回数が１回以上であれば、前記コードブロックの暗号キーを乱数で生成して保存するステップと、を含むこと
を特徴とする請求項１２に記載のインデックステーブル基盤のコード暗号化方法。
【請求項１５】
前記ステップ(ｂ)は、
(ｂ６)前記実行ファイルの最後の実行コードを検査すれば、各コードブロックのサイズを計算して前記インデックステーブルに保存するステップをさらに含むことを特徴とする請求項１２に記載のインデックステーブル基盤のコード暗号化方法。
【請求項１６】
請求項１２乃至請求項１５の中でいずれの１項の方法により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化方法であって、
(ｄ)前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するステップと、
(ｆ)復号化されたコードブロックの最後の実行コードが実行されると、前記コードブロックを再暗号化するステップと、を含むこと
を特徴とするインデックステーブル基盤のコード復号化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの実行ファイルを暗号化するか、暗号化された実行ファイルを復号化するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法に関する。
【０００２】
特に、本発明は、１回呼び出されるコードブロックは自分を呼び出すコードブロックを利用して暗号/復号化し、２以上呼び出されるコードブロックは乱数で生成した暗号キーで暗号/復号化するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法に関する。
【０００３】
また、本発明は、コードブロックの開始アドレス、呼出回数、ブロックのサイズなどを保存するインデックステーブルを利用して実行コードをブロックで区分するか呼出回数を計算するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法に関するものである。
【背景技術】
【０００４】
一般的に、ソフトウェアの著作権侵害による被害は相当なことで推算されている。特に、逆工学が広く知られた以後、このような著作権侵害は非常に深刻である。これはソフトウェアの特性上、一度配布された以後には逆工学により攻撃者に完全に露出されるからである。
【０００５】
したがって、ソフトウェアを保護するためには逆工学に備えた技術が必要である。コード暗号化スキーム(ｃｏｄｅ ｅｎｃｙｐｔｉｏｎ ｓｃｈｅｍｅ)はバイナリ実行ファイルを暗号化する技術として、コンパイルされた時点以後のプログラムを暗号化することで行われる。しかし、上手なリバーサー(ｒｅｖｅｒｓｅｒ)はこのようなスキームの秘密キーを容易に捜し出すことができる。このような問題を解決するためにコード暗号化スキームは安全なキー管理方法を要求する。
【０００６】
このために、ＣａｐｐａｅｒｔとＪｕｎｇはランタイム(ｒｕｎｔｉｍｅ)でバイナリファイルと関連がある秘密キーを生成するスキームを提案した。しかし、Ｃａｐｐａｅｒｔのスキームは正しい秘密キーの生成が不可能な問題点があった。もし、コード暗号化スキームで秘密キーが正しく生成されないと、これはプログラム衝突や他の意図しなかった問題を誘発するようになる。また、Ｊｕｎｇのスキームはコードの長さをひどく長くする。これは効率性と関連された問題を発生させる。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
したがって、本発明は上述したような従来技術の問題点を解決するためになされたもので、その目的は、１回呼び出されるコードブロックは自分を呼び出すコードブロックを利用して暗号/復号化し、２回以上呼び出されるコードブロックは乱数で生成した暗号キーで暗号/復号化するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法を提供することにある。
【０００８】
本発明の他の目的は、コードブロックの開始アドレス、呼出回数、ブロックのサイズなどを保存するインデックステーブルを利用して実行コードをブロックで区分するか呼出回数を計算するインデックステーブル基盤のコード暗号化及び復号化装置及びその方法を提供することにある。
【課題を解決するための手段】
【０００９】
前記目的を達成するために本発明は、コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化装置にあって、前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存するインデックス生成部と、前記コードブロックを暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは前記第１類型のコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成し、２回以上呼び出されるコードブロック(以下、第２類型のコードブロック)の暗号キーは乱数で生成して前記実行ファイルに保存するブロック暗号化部と、を含むことを特徴とする。
【００１０】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする。
【００１１】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出すことを特徴とする。
【００１２】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、コードブロックの呼出回数をインデックステーブルに保存し、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を１ずつ増加させて保存することを特徴とする。
【００１３】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記第１類型のコードブロックの呼出ブロックをハッシュして前記第１類型のコードブロックの暗号キーを生成することを特徴とする。
【００１４】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、最初コードブロックの暗号キーを初期キーで決めることを特徴とする。
【００１５】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記第２類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存することを特徴とする。
【００１６】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記ブロック暗号化部は、前記インデックステーブルを前記実行ファイルのデータ領域に保存することを特徴とする。
【００１７】
また、本発明は、インデックステーブル基盤のコード暗号化装置において、前記インデックス生成部は、前記コードブロックのサイズを前記インデックステーブルに保存することを特徴とする。
【００１８】
また、本発明は、インデックステーブル基盤のコード暗号化装置により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化装置であって、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するブロック復号化部と、復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックをさらに暗号化するブロック再暗号部と、を含むことを特徴とする。
【００１９】
また、本発明は、インデックステーブル基盤のコード復号化装置において、前記ブロック再暗号部は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復関数が０回になれば、前記コードブロックを再暗号化することを特徴とする。
【００２０】
また、本発明は、コンピュータプログラムの実行ファイルを暗号化するインデックステーブル基盤のコード暗号化方法であって、(ｂ)前記実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存し、２回以上呼び出されるコードブロック(以下、第２類型のコードブロック)に対して暗号キーを乱数で生成して保存するステップと、(ｃ)前記コードブロックを前記コードブロックの暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは前記第１類型のコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成するステップと、を含むことを特徴とする。
【００２１】
また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記実行コードはアセンブリコードであり、前記呼出コードはアセンブリコードの分岐コードまたはジャンプコードであることを特徴とする。
【００２２】
また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記ステップ(ｂ)は、(ｂ１)前記実行コードを順次に検査するステップと、(ｂ２)検査した実行コードが呼出コードであれば、呼出コードの被演算子からアドレスを抽出するステップと、(ｂ３)前記アドレスが前記インデックステーブルに存在しなければ、前記アドレスを前記インデックステーブルにコードブロックの開始アドレスで挿入するステップと、(ｂ４)前記アドレスが前記インデックステーブルに存在すれば、前記アドレスに該当するコードブロックの呼出回数を１回増加させるステップと、(ｂ５)前記コードブロックの呼出回数が１回以上であれば、前記コードブロックの暗号キーを乱数で生成して保存するステップと、を含むことを特徴とする。
【００２３】
また、本発明は、インデックステーブル基盤のコード暗号化方法において、前記ステップ(ｂ)は、(ｂ６)前記実行ファイルの最後の実行コードを検査すれば、各コードブロックのサイズを計算して前記インデックステーブルに保存するステップをさらに含むことを特徴とする。
【００２４】
また、本発明は、前記インデックステーブル基盤のコード暗号化方法により暗号化された実行ファイルを復号化するインデックステーブル基盤のコード復号化方法にあって、(ｄ)前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用するステップと、(ｆ)復号コードブロックの最後の実行コードが実行されると、前記コードブロックをさらに暗号化するステップと、を含むことを特徴とする。
【発明の効果】
【００２５】
上述のように、本発明によるインデックステーブル基盤のコード暗号化及び復号化装置及びその方法によれば、インデックステーブルを利用してコードブロックの呼出回数によって暗号キーを相違に生成することにより、安全なコード暗号化が可能であるだけではなく、暗号化または復号化の実行時間を短縮させて保存するデータの量を減らす効果が得られる。
【図面の簡単な説明】
【００２６】
【図１】本発明を実施するための全体システム構成の一例を示した図である。
【図２】(ａ)は、本発明の一実施形態による実行ファイルの一例であり、(ｂ)は、本発明の一例によって実行ファイルがメモリーに常住された状態を表示した図である。
【図３】本発明に使われた用語及び略語表である。
【図４】(ａ)〜(ｃ)は、本発明の一実施形態によるインデックステーブル基盤のコード暗号化方法を説明するフローチャートである。
【図５】(ａ)及び(ｂ)は、本発明の一実施形態によるインデックステーブル基盤のコード暗号化方法の疑似コード(Ｐｓｅｕｄｏ−ｃｏｄｅ)である。
【図６】本発明の一実施形態によるキーチェインの一例を示した図である。
【図７】(ａ)及び(ｂ)は、本発明による一実施形態によるプログラミング言語とアセンブリコードを例示した図である。
【図８】本発明の一実施形態による実行コードとそれによるインデックステーブル生成の一例を表示した図である。
【図９】本発明の一実施形態による実行コードとそれによるインデックステーブル生成の一例を表示した図である。
【図１０】本発明の一実施形態によるインデックステーブル基盤のコード復号化方法を説明するフローチャートである。
【図１１】本発明の一実施形態によるインデックステーブル基盤のコード復号化方法の疑似コード(Ｐｓｅｕｄｏ−ｃｏｄｅ)である。
【図１２】本発明の一実施形態によるインデックステーブル基盤のコード暗号化装置の構成に対するブロック図である。
【図１３】本発明の一実施形態によるインデックステーブル基盤のコード復号化装置の構成に対するブロック図である。
【発明を実施するための形態】
【００２７】
以下、添付図面を参照して本発明の好ましい実施の形態について詳細に説明する。
【００２８】
また、本発明の説明において同一部分には同一符号を付けて、その繰り返し説明は省略する。
【００２９】
先に、本発明を実施するための全体システムの構成の一例に対して図１を参照して説明する。
【００３０】
図１に示したように、本発明を実施するための全体システムは、暗号化装置３０と復号化装置４０で構成される。
【００３１】
暗号化装置３０または復号化装置４０は、プログラムで構成されてコンピュータ端末１１、１２に設置され実行される。コンピュータ端末１１、１２に設置されたプログラムは一つのシステム３０、４０のように動作できる。一方、他の実施形態として、暗号化装置３０または復号化装置４０はＡＳＩＣ(注文型半導体)など一つの電子回路で構成して実施できる。すなわち、ソフトウェア形態、ＦＰＧＡチップや多数個の回路素子で構成された電子回路の形態で構成することもできる。その外の可能な他の形態でも実施できる。しかし、以下では説明の便宜のためにコンピュータ端末１１、１２に具現された暗号化装置３０または復号化装置４０で説明する。
【００３２】
実行ファイル６０はコンピュータ端末１１の保存媒体にあらかじめ保存され、保存された実行ファイル６０を暗号化装置３０により読み出して入力することができる。暗号化装置３０は実行ファイル６０の実行コードを暗号化して暗号化された実行ファイル６０ａを生成する。
【００３３】
図２の(ａ)に示したように、実行ファイル６０は実行コード領域６１とデータ領域６２で区分される。実行コード６１はコードブロック６２で区分される。好ましくは、実行ファイル６０はバイナリコード、アセンブリコードなどの実行コード６１で構成される。実行コード６１が中央処理装置(ＣＰＵ)により直接実行されるコードであれば、機械語またはバイナリコードである必要があるが、インタプリターなどにより解釈され実行される場合はそのインタプリターに合わせるアセンブリコードなどで生成されなければならない。
【００３４】
実行コード領域６１はアセンブリコードなど実行コードを保存するための領域であり、データ領域６２はデータを保存するための領域である。
【００３５】
この時、暗号化装置３０は実行コード６１をコードブロック６３単位で暗号化する。したがって、コードブロック単位で復号化することも可能である。例えば、“コードブロック３”だけを別に復号化することができる。
【００３６】
コードブロック６３は一連の実行コード６１aで構成される。“実行コード”という用語は実行コード全体を意味する用語や一つのラインである実行コードを意味する用語で混用する。
【００３７】
コードブロック６３内の実行コード６１aは順次に実行され、コードブロック６３内の最後の実行コード６１aは呼出コードとして、呼出コードが実行されると、他のコードブロック６３に移動され実行される。呼出コードはアセンブリコードにおいてジャンプコード(ｊｕｍｐ  ｃｏｄｅ)または分岐コード(ｂｒａｎｃｈ  ｃｏｄｅ)などを意味する。すなわち、コードブロック６３の呼出コードにより順次に次の実行コードが実行されないで、他の位置にあるコードブロック６３が新しく開始される。
【００３８】
また、前記実行コードのコードブロックに対する情報はインデックステーブル７０に保存される。インデックステーブル７０はデータ領域６２に保存される。インデックステーブル７０は各コードブロックのアドレス(または開始アドレス)、ブロックのサイズ、呼出回数などを保存するテーブルで構成される。好ましくは、インデックステーブル７０は初期キーで暗号化されて保存できる。また、データ領域全体も初期キーにより暗号化されて保存できる。
【００３９】
前記のように、暗号化された実行ファイル６０aはネットワーク２０を介して配布されるかオフライン上に配布される。配布された実行ファイル６０aはコンピュータ端末１２に設置され実行される。
【００４０】
図２の(ｂ)に示したように、実行ファイル６０aの実行コード６１及びデータ領域６２はコンピュータ端末１２のメモリー１２ｂにローディングされて常住する。各実行コード６１aは１ラインずつ(一つのコマンドずつ)コンピュータ端末１２のＣＰＵ１２aにより読み出され実行される。この時、実行コード６１は全体がメモリー１２ｂにローディングされるか、一部だけがローディングされることもできる。この時、一つのラインの実行コードはアドレスにより識別され、一つのコードブロックは多数の実行コード(多数のラインコマンド)で構成される。
【００４１】
一方、実行ファイル６０aがローディングされ実行されるとき(ランタイムの場合)、実行ファイル６０aにも、固定されたデータ領域６２と、スタック(ｓｔａｃｋ)または流動的なデータのための流動的なデータ領域６５が生成される。以下では区別せずデータ領域６２だけで記載する。
【００４２】
上述のように、一つのコードブロック６３は順次に実行され、コードブロック６３の最後の実行コードである呼出コードが実行されると、他のコードブロックにジャンプされ実行される。同一なコードブロック内で反復されて順次に実行される場合もある。
【００４３】
復号化装置４０は暗号化された実行ファイル(６０または６０ａ)の実行コードを復号化して実行コードを実行させる。この時、復号化装置４０は実行されるコードブロック６３だけを復号化し、復号化されたコードブロック６３を全て実行すれば、復号化したコードブロック６３を再暗号化する。そして、次に実行されるコードブロック６３を復号化して復号化されたコードブロック６３を実行する。
【００４４】
図２の(ｂ)の例において、コードブロック１→コードブロック３→コードブロック２を実行すると仮定する場合、先にコードブロック１を復号化する。コードブロック１の復号化を全て実行すれば、コードブロック１を再暗号化し、次に実行するコードブロック３を復号化する。そして、コードブロック３の復号化を全て実行すれば、コードブロック３を暗号化してコードブロック２を復号化する。
【００４５】
次に、本発明を説明するための用語及び略語について図３を参照して説明する。
【００４６】
ＩＫは初期キーとして、乱数とインデックステーブル(ｉｎｄｅｘｅｄ ｔａｂｌｅ)を同時に保護する。乱数は、多重ブロックにより呼び出される基本ブロック(またはコードブロック)を暗号化し、また初期キーＩＫは乱数を暗号化する。初期キーＩＫを保護してまた提供することはアプリケーションに依存し、初期キーＩＫは外装ハードディスクやＴＰＭ(Ｔｒｕｓｔｅｄ Ｐｌａｔｆｏｒｍ Ｍｏｄｕｌｅ)などの外部記憶媒体に記憶することができる。したがって、初期キーＩＫがオフライン上で安全に分配され記憶されると仮定する。
【００４７】
乱数は２個以上のコードブロックから呼び出されるコードブロックを暗号化し、初期キーＩＫを暗号化する。保護キーＰＫは初期キーＩＫにより暗号化された乱数を意味する。保護キーＰＫはバイナリコード(または実行ファイル)のデータセクション(またはデータ領域)に記憶される。また、暗号化または復号化アルゴリズムは従来の暗復号化技法を利用するので、その具体的な説明は省略する。
【００４８】
ＥＫ()とＤＫ()は各々暗号キーＫを利用して暗号化または復号化演算を行うことを表示する。Ｈ()は一方向のハッシュ関数を意味する。
【００４９】
次に、本発明によるインデックステーブル基盤のコード暗号化及び復号化装置及びその方法が充足すべき要求事項、すなわち、安全なコード暗号技法の要求事項について説明する。
【００５０】
先に、気密性を備える必要がある。原本バイナリコード(実行コードまたはアセンブリコード)は気密性維持を通じて静的分析から保護されなければならない。バイナリコードをフローや制御移動などの動的分析から保護するためにメモリー上には最小個数のコードブロックが存在する必要がある。メモリー上にコードが暗号化されている限りプログラムは静的及び動的分析から保護される。
【００５１】
また、メモリーダンプが防止される必要がある。もし、単一ルーチンを通じて一つのプログラムを丸ごと暗号化する場合、復号化ルーチンがプログラム全体を復号化した後、開始地点を指定すると、これはメモリーダンプ攻撃に脆弱になる。したがって、最小限のプログラムが復号化される必要があり、残り部分は暗号化された状態を維持しなければならない。
【００５２】
また、正しいキーチェーンを具備する必要がある。コード暗号化がプログラムに適用されると、正しいキー(または暗号キー)が必要になる。もし、多重経路が存在するとき正しいキーチェーンを持たないと、システムクラッシュや意図しなかった実行が可能である。
【００５３】
また、不正使用(ｔａｍｐｅｒｉｎｇ)防止を満足しなければならない。不正使用から保護するためには無欠性維持が必要である。これは下記のような特性が必要とする。
【００５４】
暗号化過程で、１ビットが一つの基本ブロックを変更すれば、その効果はすべての暗号化されたブロックに影響を及ぼさなければならない。
【００５５】
復号化過程で、もし、暗号化されたブロックで一つ以上のビットが変更されると、復号化結果は一つ以上のビットが変更されなければならない。
【００５６】
次に、本発明の一実施形態によるインデックステーブル基盤のコード暗号化方法について図４を参照してより具体的に説明する。
【００５７】
図４の(ａ)に示したように、本発明によるインデックステーブル基盤のコード暗号化方法は (ａ)コンパイルするステップ(ステップＳ１０)、(ｂ)インデックステーブルを生成するステップ(ステップＳ２０)及び(ｃ)コードブロックを暗号化するステップ(ステップＳ３０)に区分される。
【００５８】
前記ステップ(ａ)(またはコンパイルするステップ)は、プログラムソースコードをコンパイルして実行コード(アセンブリコードまたはバイナリコード)を生成するステップである。
【００５９】
前記ステップ(ｂ)では、実行コードを呼出コードによりコードブロックで区分し、各コードブロックの呼出回数及び開始アドレスなどの情報をインデックステーブルで生成する(ステップＳ２０)。この時、呼出回数が２回以上のコードブロック(または第２類型のコードブロック)に対して乱数で暗号キーを生成して記憶する。
【００６０】
この時、呼出回数が２回以上のコードブロックを第２類型のコードブロックと称し、その他のコードブロックを第１類型のコードブロックと称する。第１類型のコードブロックは呼出回数が１回である。一方、最初のコードブロックは初めてプログラムの開始により１回呼び出されることで仮定する。
【００６１】
次に、ステップ(ｂ)をより具体的に説明する前に、ステップ(ｃ)を具体的に説明する。前記ステップ(ｃ)は、図４の(ｃ)に示したとおりである。
【００６２】
図４の(ｃ)に示したように、前記ステップ(ｃ)は、コードブロックを暗号キーで暗号化する。この時、１回呼び出されるコードブロックの暗号キーはこのコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成する。すなわち、呼出ブロックを利用して暗号化する。また、２回以上呼び出されるコードブロックは乱数で生成された暗号キーを通じて暗号化される。例えば、乱数自体を暗号キーで使ってコードブロックを暗号化する。
【００６３】
コードブロック(または第１類型のコードブロック)は、次 の[数１]により暗号化される。
【００６４】
【数１】
2012118956.tif 000003
【００６５】
ｉはインデックステーブル内にあるコードブロックの手順である。もし、フラグ(または多重経路フラグ)が“０”ではないと、ブロック(またはコードブロック)は乱数により暗号化されたのである。初期キーＩＫは乱数を暗号化して実行ファイル内に保存される。もし、乱数が露出されると、該当ブロックは乱数により復号化され、したがって、ブロックは攻撃者により分析可能になるからこのような暗号化ステップが必要である。
【００６６】
インデックステーブルは正しいキーチェーンを形成するために使われる。テーブル構成は次のようである。まず、基本ブロック(またはコードブロック)の現在アドレスを保存した後、呼出コード(ｊｕｍｐやｂｒａｎｃｈ系列の命令語)をポインタを移動しながら調査する。このような呼出コードの命令語は次に実行されるコードブロックのアドレスを後に(被演算子として)有している。
【００６７】
次のアドレス(呼出コードの被演算子)が現在の基本ブロックを示している場合、これはルーフ(または反復文)や再帰を意味する。ルーフや再帰が発生すれば、ｃｍｐ命令語などを通じて呼出回数を決めることができるようになり、このような呼出回数をテーブルに保存する。これと同様に、現在のブロックがもうテーブルに保存されている場合、これは該当コードブロックの多重呼出(２回以上の呼び出し)を意味する。このとき保護キーＰＫが生成されてバイナリイメージ(または実行ファイルのバイナリイメージ)のデータ領域(ｄａｔａ ｓｅｃｔｉｏｎ)に保存される。保護キーＰＫは乱数を暗号化したもので、乱数がコードブロックを暗号化する暗号キーとして使用される。
【００６８】
図６に示したように、基本ブロック(またはコードブロック)Ｄは、Ｂ、ＣそしてＦなどの多重ブロックにより呼び出される。すなわち、３個の相違なるコードブロックにより呼び出されている。Ｂの暗号キーはＡブロックのハッシュ値であり、Ｃの秘密キーと同一である。ＦはＡにより直接呼び出されなくて、Ｄにより呼び出される。その時、乱数ｒがＤの秘密キー(または暗号キー)で生成され、これはさらに初期キー(ＩＫ)で暗号化される。その結果、保護キー(ＰＫ)が新たに生成され、これはバイナリファイル(または実行ファイル)内に保存される。保護キー(ＰＫ)は乱数ｒが初期キー(ＩＫ)により暗号化された値を意味する。
【００６９】
リヌックスやウィンドウなどの一般的なコンピュータ運営体制は、実行ファイルイメージ内に変数を保存することができるデータ領域を支援し、したがって、保護キー(ＰＫ)はこのような実行ファイル内に存在するデータ領域内に保存できる。
【００７０】
インデックステーブルは反復呼び出される回数を含む。もし、これが考慮されなければ、ループまたは再帰などを意味する基本ブロック(またはコードブロック)が数回復号化できる。したがって、ループや再帰回数をテーブル内に表示しておくことによりこのような問題を解決することができる。もし、基本ブロックが呼び出されると、テーブル内に保存された呼出回数が１減少し、このような方式で呼出回数が“０”になれば、該当ブロックはメモリーダンプ防止のために再暗号化される。
【００７１】
例えば、ループの場合、Ｃ言語で使われた例示は図７のようである。ｃｍｐ命令語において二番目の被演算子の値は“ＯＡ”である。これはブロック“ｌｏｃ＿４０１００６”は１０回実行されることを意味し、これはブロックのループまたは再帰回数であることが分かる。
【００７２】
図４の(ｃ)を参照して加えて説明すれば、最初のコードブロックＰＯは初期キーＩＫで暗号化する(ステップＳ３１)。インデックステーブルから次のコードブロックのアドレス(開始アドレス)及び類型を読み出して(ステップＳ３２)、何の類型であるかを判断する(ステップＳ３３)。インデックステーブルでフラグ(または多重経路呼出フラグ)が“０”であれば、第１類型のコードブロックであり、“０”ではなければ、第２類型のコードブロックである。
【００７３】
現在のコードブロックＰｉが第１類型のコードブロックであれば、直前の呼出ブロック(またはインデックステーブルで直前コードブロック)Ｐｉ−１をハッシュしてハッシュ値Ｈ(Ｐｉ−１)で現在のコードブロックＰｉを暗号化する(ステップＳ３４)。そして、現在のコードブロックＰｉが第２類型のコードブロックであれば、乱数を発生して(ステップＳ３５)、乱数ｒで現在のコードブロックを暗号化する(ステップＳ３６)。この時、ステップ(ｂ)で発生させた乱数を利用することもでき、ステップ(ｂ)で乱数を発生しなければこのステップで乱数を発生する。
【００７４】
インデックステーブルから読み出した現在のコードブロックＰｉが最後のコードブロックであるか否かを確認して(ステップＳ３７)、最後のコードブロックであれば終了し、そうではなければ、次のコードブロックを読み出して前記過程を繰り返す。
【００７５】
次に、前記ステップ(ｂ)を、図４ｂと図８及び図９を参照してより具体的に説明する。図４ｂは、インデックステーブルを生成するステップを説明するフローチャートであり、図９は、図８の実行コードの例からインデックステーブルを生成した一例を示した図である。
【００７６】
図８に示したように、例示コード(または実行コード)は大きく５個のコードブロックに分けられる。基本ブロック(またはコードブロック)はｊｕｍｐやｂｒａｎｃｈ系列の命令語(または呼出コードの命令語)により分けられる。先に初期化が実行される。０ｘ００４０１０３Ｅはプログラムの開始地点でセッティングされる。以後ｊｕｍｐやｂｒａｎｃｈ系列の命令語が探索される。
【００７７】
図９に示したように、もし、命令語がｊｕｍｐやｂｒａｎｃｈであれば、これは他のブロックの一番目のアドレスになるため、被演算子をテーブルに保存する。例えば、０ｘ００４０１０５Ａはアドレス０ｘ００４０１０４Ｆに存在する“ｊｎｅ ０ｘ００４０１０５Ａ”コードによりテーブルに保存される。命令語の次のアドレスは他のブロックの一番目のアドレスになる。すなわち、０ｘ００４０１０５１はテーブルに保存される。このような方法で、０ｘ００４０１０６Ｃと０ｘ００４０１０６０が順に保存される。アドレス０ｘ００４０１０６Ａで命令語は“ｊｍｐ ０ｘ００４０１０５１”で識別される。０ｘ００４０１０５１はもうテーブルに保存されているので、これは多重呼出されるブロックであると言える。したがって、該当ブロックの情報が更新されて乱数が生成される。このような方法ですべてのブロックが識別され区分される。
【００７８】
図９のインデックステーブルにおいて、アドレスはコードブロックの開始アドレスであり、コードブロックを識別する識別子の機能をする。また、呼出回数は他のコードブロックが該当コードブロックを呼び出す回数を記録したのである。フラグは多重経路呼出フラグとして、１回呼び出される場合“０”を記録し、２回以上呼び出されて多重経路の呼出が形成される場合“１”を記録する。
【００７９】
前記ステップ(ｂ)及びステップ(ｃ)に対する疑似コード(Ｐｓｅｕｄｏ−ｃｏｄｅ)は各々図５の(ａ)と(ｂ)のようである。
【００８０】
次に、本発明の一実施形態によるインデックステーブル基盤のコード復号化方法について図１０を参照してより具体的に説明する。
【００８１】
図１０に示したように、本発明によるインデックステーブル基盤のコード復号化方法は、大きく(ｄ)コードブロックを復号化するステップ(ステップＳ４０)、(e)コードブロックの実行コードを実行するステップ(ステップＳ５０)及び(ｅ)復号化されたコードブロックを再暗号化するステップ(ステップＳ６０)に区分される。
【００８２】
先に、最初のコードブロックは初期キーＩＫで復号化する(ステップＳ４１)。最初のコードブロックの実行が完了されると、次のコードブロックを読み出す。この時、インデックステーブルで次のコードブロックのアドレスを検索する(ステップＳ４２)。次のコードブロックがどの類型(第１類型または第２類型)であるかを判断して(ステップＳ４３)、第１類型であれば、直前のコードブロック(または呼出ブロック)をハッシュしてハッシュ値を暗号キーとしてコードブロックを復号化する(ステップＳ４４)。第２類型であれば、保存された保護キーを持ち込んで初期キーＩＫで復号化して乱数を抽出して(ステップＳ４５)、抽出された乱数を暗号キーとしてコードブロックを復号化する(ステップＳ４６)。そして、コードブロックを実行し(ステップＳ５０)、実行されたコードブロックを再暗号化する(ステップＳ６０)。すべてのコードブロックが完了されて最後のコードブロックになると終了する(ステップＳ４７)。
【００８３】
すなわち、前記ステップ(ｄ)は、実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キー(または保護キーを復号化した乱数)を利用する。
【００８４】
先に、プログラムが始まる前に、インデックステーブルを参照してプログラムのエントリポイント(ｅｎｔｒｙ ｐｏｉｎｔ)を探す。そして、暗号化されたコードブロックＣｉを実行コードまたはコードブロックＰｉで復号化する。暗号化されたコードブロックは直前ブロックのハッシュ値を利用して復号化され、復号化されたコードＰｉが実行される。もし、直前ブロックＰｉ−１がＰ′ｉ−１に変更(ｔａｍｐｅｒｉｎｇ)された場合、暗号キーはＨ(Ｐｉ−１)≠Ｈ(Ｐ′ｉ−１)である。したがって、コードブロックＰｉは正しく復号化されない。
【００８５】
一方、インデックステーブルはフラグを含む。フラグはコードブロックが乱数を利用するか利用しないかを示すフラグである。もし、フラグが“１”であれば、暗号化されたコードブロックは乱数で復号化しなければならない。復号化コード作業が完了すれば、復号化されたコードブロックはさらに暗号化されてメモリーに保存される。
【００８６】
次に、本発明の一実施形態によるインデックステーブル基盤のコード暗号化装置３０の構成について図１２を参照してより具体的に説明する。
【００８７】
図１２に示したように、本発明による暗号化装置３０はインデックス生成部３１及びブロック暗号化部３２で構成される。
【００８８】
インデックス生成部３１は、実行ファイルの実行コードを呼出コードによりコードブロックで区分し、各コードブロックが呼び出される回数及び開始アドレスをインデックステーブルに保存する。
【００８９】
ブロック暗号化部３２は、コードブロックを暗号キーで暗号化するが、１回呼び出されるコードブロック(以下、第１類型のコードブロック)の暗号キーは前記第１類型のコードブロックを呼び出すコードブロック(以下、呼出ブロック)を利用して生成し、２回以上呼び出されるコードブロック(以下、第２類型のコードブロック)の暗号キーは乱数で生成して前記実行ファイルに保存する。
【００９０】
この時、実行コードはバイナリコードまたはアセンブリコードであり、前記呼出コードはバイナリコードまたはアセンブリコードの分岐コードまたはジャンプコードである。
【００９１】
一方、インデックス生成部３１は最後の実行コードを呼出コードで含む一連の実行コードを一つのコードブロックで区分し、前記呼出コードは前記呼出コードが含まれたコードブロック以外の他のコードブロックを呼び出す。また、インデックス生成部３１はコードブロックの呼出回数をインデックステーブルに保存し、各コードブロックの呼出コード各々に対して、前記呼出コードが呼び出すコードブロックの呼出回数を一つずつ増加させて保存する。また、インデックス生成部３１は前記コードブロックのサイズを前記インデックステーブルに保存する。
【００９２】
ブロック暗号化部３２は、前記第１類型のコードブロックの呼出ブロックをハッシュして前記第１類型のコードブロックの暗号キーを生成する。また、ブロック暗号化部３２は最初コードブロックの暗号キーを初期キーで決める。また、ブロック暗号化部３２は、前記第２類型のコードブロックの暗号キーを初期キーで暗号化して前記実行ファイルのデータ領域に保存する。好ましくは、ブロック暗号化部３２は前記インデックステーブルを前記実行ファイルのデータ領域に保存する。
【００９３】
次に、本発明の一実施形態によるインデックステーブル基盤のコード復号化装置４０の構成について図１３を参照してより具体的に説明する。
【００９４】
図１３に示したように、本発明による復号化装置４０はブロック復号化部４１及びブロック再暗号部４２で構成される。
【００９５】
ブロック復号化部４１は、前記実行ファイルの暗号化された実行コードをコードブロック単位でコードブロックの暗号キーを利用して復号化するが、前記インデックステーブルを参照して、前記コードブロックが第１類型のコードブロックであれば、前記コードブロックの呼出ブロックで暗号キーを生成して利用し、第２類型のコードブロックであれば、前記コードブロックの保存された暗号キーを利用する。
【００９６】
ブロック再暗号部４２は、復号化されたコードブロックの最後の呼出コードが実行されると、前記コードブロックを再暗号化する。特に、ブロック再暗号部４２は、前記コードブロックが反復実行される場合、反復回数を前記インデックステーブルに保存して前記コードブロックが呼び出される時ごとに前記反復回数を減少させて、反復回数が“０”になれば、前記コードブロックを再暗号化する。
【００９７】
前記暗号化または復号化装置に対する説明の中で省略した部分は上述した暗号化または復号化方法の記載を参照する。
【００９８】
以上、本発明を具体的な実施形態を参照して詳細に説明したが、本発明の範囲は前述の実施形態によって限定されるべきではなく、特許請求の範囲の記載及びこれと均等なものの範囲内で様々な変形が可能なことは、当該技術分野における通常の知識を持つ者には明らかである。
【産業上の利用可能性】
【００９９】
本発明は、１回呼び出されるコードブロックを直前の呼出コードブロックで暗号/復号化し、２回以上呼び出されるコードブロックを乱数で生成した暗号キーで暗号/復号化するインデックステーブル基盤のコード暗号化及び復号化装置の開発において有用である。
【符号の説明】
【０１００】
１１ コンピュータ端末
１２ コンピュータ端末
２０ ネットワーク
３０ 暗号化装置
３１ インデックス生成部
３２ ブロック暗号化部
４０ 復号化装置
４１ ブロック復号化部
４２ ブロック再暗号部
６０ 実行ファイル
６０a 暗号化された実行ファイル
６１ 実行コード領域
６１a 実行コード
６２ データ領域
６３ コードブロック
６５ 動的データ領域
【図１】
2012118956.tif 000004
【図２ａ】
2012118956.tif 000005
【図２ｂ】
2012118956.tif 000006
【図３】
2012118956.tif 000007
【図４ａ】
2012118956.tif 000008
【図４ｂ】
2012118956.tif 000009
【図４ｃ】
2012118956.tif 000010
【図５ａ】
2012118956.tif 000011
【図５ｂ】
2012118956.tif 000012
【図６】
2012118956.tif 000013
【図７】
2012118956.tif 000014
【図８】
2012118956.tif 000015
【図９】
2012118956.tif 000016
【図１０】
2012118956.tif 000017
【図１１】
2012118956.tif 000018
【図１２】
2012118956.tif 000019
【図１３】
2012118956.tif 000020