(57)【要約】【課題】セキュリティ性能に優れたプログラム秘匿システムを提供すること【解決手段】保持回路３１０は、情報記憶メモリと別に設けられ、所定ステップ前の実行プログラムの命令コードを符号化した符号化コードを一時的に保持する。符号データ生成部１００は、実行対象のプログラムの命令コードと、保持回路３１０が保持する符号化コードと、に基づいた演算により、実行対象のプログラムの命令コードを符号化した命令コードを生成するとともに、符号化した当該命令コードにより保持回路３１０に格納された符号化コードを所定ステップ毎に上書きする。命令復号回路３２０は、保持回路３１０に格納された符号化コードと、符号データ生成演算部１００が生成した符号化コードと、に基づいた演算により実行対象のプログラムの命令コードを復号化する。【選択図】図１
2011081429.tif 000002
【特許請求の範囲】
【請求項１】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、
実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、
前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるプログラム秘匿システム。
【請求項２】
前記符号データ生成演算部は、実行対象のプログラムの命令コードが分岐先処理である場合、前記共通鍵をリセットする命令を実行対象のプログラムの実行位置の直前に挿入することを特徴とする請求項１に記載のプログラム秘匿システム。
【請求項３】
前記所定ステップは、１命令であることを特徴とする請求項１または請求項２に記載のプログラム秘匿システム。
【請求項４】
前記符号データ生成演算部による符号化は減算処理により行い、前記命令復号回路による復号化は加算処理により行う、
または、
前記符号データ生成演算部による符号化は加算処理により行い、前記命令復号回路による復号化は減算処理により行う、ことを特徴とする請求項１乃至請求項３に記載のプログラム秘匿システム。
【請求項５】
前記符号データ生成演算部による符号化、および、前記命令復号回路による復号化は排他論理和処理により行うことを特徴とする請求項１乃至請求項３に記載のプログラム秘匿システム。
【請求項６】
実行対象のプログラムの命令コードを一時記憶のための保持回路に格納された共通鍵により符号化した符号化命令コードを生成するとともに、当該符号化命令コードで前記共通鍵を所定ステップ毎に上書きする命令符号化ステップと、
前記共通鍵を使用して前記符号化命令コードを復号化する命令復号化ステップと、
前記命令復号化ステップにおいて復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理ステップと、
を備えるプログラム秘匿方法。
【請求項７】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を、符号化命令コードの生成を行う外部システムから入力される度に上書きして保持する保持回路と、
前記保持回路から出力される前記共通鍵を使用して、前記外部システムから入力された符号化命令コードを命令コードに復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるマイクロコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム秘匿システムおよびプログラム秘匿方法に関し、特にセキュリティ性を考慮したプログラム秘匿システム、プログラム秘匿方法に関する。
【背景技術】
【０００２】
従来の半導体記憶装置、及びマイクロコンピュータでは、メモリセルアレイ中に記憶されているデータが不当にコピーされる恐れがある。そのため、メモリセルアレイ中で保持されているデータを不当なコピーから保護する様々な手段が講じられている。特に、半導体記憶装置、及びマイクロコンピュータの誤作動防止のため、これらのメモリセルアレイ中に記憶されている命令コード、及び演算コードの暗号化は重要である。また、メモリセルアレイ中に記憶されている命令コード、及び演算コードの解析困難性の向上を図ることが望ましい。
【０００３】
特許文献１には、データを暗号化した上でプログラムメモリ内に格納する半導体記憶装置が記載されている。当該半導体記憶装置は、プログラムメモリ内に、記憶対象データを暗号化したデータと、暗号化に利用した暗号キーと、を格納する。当該半導体装置では、データ読み出しに先立って暗号キーを記憶したプログラムメモリにアクセスしないと、誤った演算処理が行われる。これにより、記憶対象データを不当なコピーから保護することができる。
【０００４】
特許文献２に記載のソフトウェア機密漏洩防止方法では、プログラムメモリと、中央処理装置と、の間に、固有の論理を組んだデータ変換要素を組み込む。当該方法では、プログラムメモリにプログラムの実行命令を暗号化した上で書き込む。中央処理装置によりプログラムメモリの内容を読み取る際に、データ変換要素により暗号化されたプログラムの実行命令を復号化する。
【０００５】
特許文献３に記載のデータセキュリティシステムでは、実行プログラムの命令に一定値を用いた所定の演算により変換したデータをメモリに書き込む。読み出す際には、一定値を用いた所定の演算を行うことにより、実行プログラムの命令を復号化する。メモリ内に実行プログラムの命令を直接書き込む構成ではないため、セキュリティ性能を高めることができる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−３１２０９９号公報
【特許文献２】特開昭５９−１１２３４１号公報
【特許文献３】特開２０００−０２９７９０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述の装置や方法では以下の問題がある。特許文献１に記載の半導体記憶装置では、暗号データとともに、暗号キーをプログラムメモリから読み出す必要が生じ、パフォーマンスが低下する。また、同一プログラムメモリ内に暗号データと、暗号化データと、を格納するため、プログラムメモリ内のデータが漏洩した場合、データが容易に復号化できてしまう。また、特許文献２及び特許文献３の技術では、暗号化に用いる暗号キーが一定であるため、一度暗号キーが漏洩した場合、データの復号化が容易である。すなわち、上述の装置や方法では、セキュリティ上の問題がある。
【課題を解決するための手段】
【０００８】
本発明にかかるプログラム秘匿システムの一態様は、情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるものである。
【０００９】
本発明においては、実行対象のプログラムの命令コードを保持回路内の共通鍵で符号化し、生成された符号化コードを保持回路の保持する共通鍵として逐次上書きする。保持回路に保持される共通鍵が逐次書き変わることにより、一度共通鍵の漏洩が起きた場合であっても、以後の影響を小さくすることができる。
【発明の効果】
【００１０】
本発明によれば、セキュリティ性能に優れたプログラム秘匿システムを提供することができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１にかかるプログラム秘匿システムの基本構成を示すブロック図である。
【図２】実施の形態１にかかる命令差分の生成にかかるフローチャートある。
【図３】実施の形態１にかかるオペコードの復号化にかかるフローチャートである。
【図４】実施の形態１にかかるアセンブリ言語で記述されたオペコードを示す図である。
【図５】実施の形態１にかかるサンプルプログラムから命令差分を生成する例を示す図である。
【図６】実施の形態１にかる命令差分からオペコードを復号化する例を示す図である。
【図７】実施の形態１にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図８】実施の形態１にかかる命令差分からオペコードを復号化する例を示す図である。
【図９】実施の形態１にかかる命令差分からオペコードを復号化する例を示す図である。
【図１０】実施の形態２にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図１１】実施の形態２にかかる命令差分からオペコードを復号化する例を示す図である。
【図１２】実施の形態２にかかる命令差分からオペコードを復号化する例を示す図である。
【発明を実施するための形態】
【００１２】
本発明の実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。まず、図１を参照して、本実施の形態１にかかるプログラム秘匿システムの基本構成について説明する。プログラム秘匿システム１は、符号データ生成部１００と、半導体装置５００と、を備える。半導体装置５００は、命令フェッチ回路２００と、命令復号部３００と、命令実行部４００と、を備える。半導体装置５００の一例として、マイクロコンピュータが挙げられる。
【００１３】
符号データ生成部１００は、ソフトウェア開発ツール１１０と、外部記憶装置１２０と、を備える。ソフトウェア開発ツール１１０は、半導体装置５００に実行させるソフトウェアを開発する為のツールである。ソフトウェア開発ツール１１０は、Ｃコンパイラ、アセンブラ、リンカ、Ｆｌａｓｈライタ等のツールから構成される。ソフトウェア開発ツール１１０は、符号コード生成演算部１１１を備える。符号コード生成演算部１１１は、実行対象のプログラムの１ステップ毎に、実行対象のプログラムの命令コード（以後、オペコードとも記載する。）を符号化した符号化命令コード（以後、命令差分とも記載する。）を生成し、命令差分信号Ｓ７として外部記憶装置１２０へ出力する。命令差分は、１ステップ後の符号コード生成演算部１１１によるオペコードの符号化に用いられ、かつ、復号化回路３３０による符号化命令コードを復号化に用いられる。すなわち、命令差分は１ステップ後の符号化、及び復号化の共通鍵として用いられる。なお、図示しないが、ソフトウェア開発ツール１１０は、オペコードにより演算対象となる実行対象のプログラムデータ（オペランド）も併せて外部記憶装置１２０へ出力する。
【００１４】
外部記憶装置１２０は、ソフトウェア開発ツール１１０が出力する命令差分（Ｓ７）を記憶するための記憶装置である。外部記憶装置１２０は、実行対象のプログラムのアドレスを示す信号Ｓ５に応じて、命令差分を信号Ｓ６として命令フェッチ回路２００へ出力する。なお、本実施の形態では、外部記憶装置１２０は、半導体装置５００の外部に配置されているが、これに限られず、外部記憶装置１２０を半導体装置５００の内部に配置してもよい。
【００１５】
命令フェッチ回路２００は、実行対象のプログラムを外部記憶装置１２０から取得する回路である。命令フェッチ回路２００は、実行対象のプログラムのアドレスを示す信号Ｓ５を外部記憶装置１２０へ出力する。命令フェッチ回路２００には、Ｓ５に応じた命令差分信号Ｓ６が外部記憶装置１２０から入力される。命令フェッチ回路２００は、外部記憶装置１２０から入力された命令差分を信号Ｓ１として命令復号部３００へ出力する。なお、図示しないが、命令フェッチ回路２００は、オペコードにより演算対象となる実行対象のプログラムデータ（オペランド）も併せて命令復号部３００へ出力する。
【００１６】
命令復号部３００は、命令フェッチ回路２００から入力された命令差分（Ｓ１）を本来のオペコードに復号化する為の回路である。命令復号部３００は、保持回路３１０と、命令復号回路３２０と、初期値入力回路３３０と、を備える。保持回路３１０は、命令フェッチ回路２００から入力される命令差分（Ｓ１）を保持する為の回路である。また、命令実行部４００からリセット信号Ｓ４が保持回路３１０に入力された場合、保持回路３１０は、初期値入力回路３３０からの初期値の入力を要求する信号Ｓ９を出力する。初期値入力回路３３０から初期値（Ｓ８）が入力された場合、保持回路３１０は、初期値入力回路３３０から入力された初期値（Ｓ８）を命令差分（Ｓ１）に代わり保持する。保持回路３１０が保持する値は、プログラムの実行ステップ毎に更新される。詳細な具体例は、後述する。
【００１７】
命令復号回路３２０は、命令フェッチ回路２００から入力される命令差分（Ｓ１）を、保持回路３１０から入力される命令差分（Ｓ２）を用いることにより、本来のオペコードに復号化する。命令復号回路３２０により復号化されたオペコードは、信号Ｓ３として命令実行部４００へ出力される。なお、図示しないが、命令復号回路３２０は、オペコードにより演算対象となる実行対象のプログラムデータ（オペランド）も併せて命令実行部４００へ出力する。
【００１８】
初期値入力回路３３０は、保持回路３１０にリセット信号Ｓ４が入力された際に、保持回路３１０に所定の初期値を入力する為の回路である。なお、保持回路３１０にリセット信号Ｓ４が入力された際に、保持回路３１０に所定の初期値（Ｓ９）を入力するものであれば、他の構成であってもよい。
【００１９】
命令実行部４００は、命令復号回路３２０が復号化したオペコードを用いて、プログラムを１ステップ毎に実行する処理部である。命令実行部４００は、プログラム実行において、分岐処理が発生した場合に、リセット信号Ｓ４を保持回路３１０に出力する。
【００２０】
続いて、図２を用いて、符号コード生成演算部１１１による命令差分の生成処理について説明する。図２は、符号コード生成演算部１１１による命令差分の生成手順を示すフローチャートである。
【００２１】
始めに、符号コード生成演算部１１１は変数Ｘを初期化する(Ｓ２１)。変数Ｘは、命令差分をプログラム実行の１ステップ毎に保持するための変数である。この際の初期化に用いる初期値は、任意の値でよいが、後述の初期値入力回路３３０が出力する初期値と同じ値とする必要がある。本実施の形態では、初期値を０１００Ｈとする。
【００２２】
次に、符号コード生成演算部１１１は、実行対象のプログラムからオペコードを取得し（Ｓ２２）、取得したオペコードの命令種別が分岐先処理に該当するか否かを判定する（Ｓ２３）。取得したオペコードが分岐先処理であった場合（Ｓ２３：Ｙｅｓ）、符号コード生成演算部１１１は、保持回路３１０の値を初期化する為のＩＮＩＴ命令を命令差分信号Ｓ７として外部記憶装置１２０へ出力する。一方、取得したオペコードが分岐先処理ではなかった場合（Ｓ２３：Ｎｏ）、符号コード生成演算部１１１は、取得したオペコードがプログラムの先頭を示す処理であるか否かを判定する（Ｓ２４）。取得したオペコードがプログラムの先頭を示す処理である場合（Ｓ２４：Ｙｅｓ）、符号コード生成演算部１１１は、変数Ｘを初期値０１００Ｈで初期化し（Ｓ２６）、その後、命令差分生成処理（Ｓ２７）を行う。一方、取得したオペコードがプログラムの先頭を示す処理ではない場合（Ｓ２４：Ｎｏ）、命令差分生成処理（Ｓ２７）に遷移する。
【００２３】
符号コード生成演算部１１１は、オペコードと、変数Ｘに格納された値と、から新たな命令差分を生成する（Ｓ２７）。新たな命令差分の生成は、所定の演算により行う。例えば、オペコードと、変数Ｘに格納された値と、の減算により行う。ソフトウェア開発ツール１１０は、生成された命令差分を命令差分信号Ｓ７として外部記憶装置１２０へ出力する。
【００２４】
符号コード生成演算部１１１は、変数Ｘに生成した命令差分を代入する（Ｓ２８）。すなわち、符号コード生成演算部１１１は、生成した命令差分により変数Ｘの値を上書きする（Ｓ２８）。符号コード生成演算部１１１は、実行プログラムの１ステップに対応するオペコードの命令差分の生成（Ｓ２２〜Ｓ２８）が終わった後、実行対象プログラムの終端まで到達したか否かを判定する（Ｓ２９）。
【００２５】
実行対象プログラムの終端まで到達した場合（Ｓ２９：Ｙｅｓ）、符号コード生成演算部１１１は、命令差分の生成処理を終了する。一方、実行対象プログラムの終端まで到達していない場合（Ｓ２９：Ｎｏ）、符号コード生成演算部１１１は、次のステップのオペコードの命令差分の生成（Ｓ２２〜Ｓ２８）を実行する。
【００２６】
続いて、図３を用いて、半導体装置５００内における、命令差分からのオペコードの復号化、及びプログラム実行処理について説明する。図３は、半導体装置５００内でのオペコードの復号化手順を示すフローチャートである。
【００２７】
始めに、保持回路３１０の初期化を行う（Ｓ３１）。ここで、初期化に用いる初期値は、符号コード生成演算部１１１が用いる初期値と同じ値にする。本実施の形態では、初期値は０１００Ｈとなる。続いて、命令フェッチ回路２００が外部記憶装置１２０から実行プログラムの１ステップ毎の命令差分を取得する（Ｓ３２）。命令フェッチ回路２００は、取得した命令差分を命令復号部３００へ出力する。
【００２８】
命令復号回路３２０は、入力された命令差分と、保持回路３１０が保持する値と、に基づいて所定の演算を行うことでオペコードを復号化する（Ｓ３３）。この際の所定の演算は、符号コード生成演算部１１１による命令差分生成に用いた演算と対応付けられたものである。例えば、符号コード生成演算部１１１が減算処理により命令差分を生成した場合、命令復号回路３２０は、加算処理によりオペコードの復号化を行う。詳細な具体例は後述する。命令復号回路３２０は、復号化したオペコードを命令実行部４００へ出力する。
【００２９】
命令実行部４００は、入力されたオペコードを用いて１ステップ毎にプログラムの実行を行う。命令実行部４００は、入力されたオペコードが分岐命令である場合（Ｓ３４：Ｙｅｓ）には、保持回路３１０を初期値０１００Ｈで初期化する（Ｓ３６）。また、命令実行部４００が保持回路３１０の初期化命令（ＩＮＩＴ命令）を出力した場合にも（Ｓ３４：Ｙｅｓ）、保持回路３１０を初期値０１００Ｈで初期化する（Ｓ３６）。一方、入力されたオペコードが分岐命令でなく、かつ命令実行部４００からの初期化命令が入力されなかった場合（Ｓ３４：Ｎｏ）、保持回路３１０の値を命令フェッチ回路２００から入力された命令差分で更新する（Ｓ３５）。
【００３０】
上記のプログラム１ステップに対応するオペコードの復号化、及びプログラム実行処理（Ｓ３２〜Ｓ３６）が終了した場合、次のステップのオペコードの復号化、及びプログラム実行処理（Ｓ３２〜Ｓ３６）を実行する。
【００３１】
続いて、アセンブラ言語による具体例を示し、本実施の形態にかかるオペコードからの命令差分の生成、及び命令差分からのオペコードの復号化について説明する。図４は、以下の説明で用いるオペコードの具体例を示す。例えば、ＡＤＤ命令のオペコードは、１０００Ｈであり、演算対象（オペランド）を加算する為に用いる。また、ＩＮＩＴ命令は、本実施の形態にかかるプログラム実行固有の命令である。ＩＮＩＴ命令は、保持回路３１０を初期化するために用いる。なお、各命令のオペランド部分は、本実施の形態に示す動作に直接関係がないため、記載を省略している。
【００３２】
図５は、符号コード生成演算部１１１によりサンプルプログラムから命令差分を生成する例を示す図である。図５は、アセンブリ言語による命令種別と、オペコードと、変数Ｘの値と、生成される命令差分と、をプログラムの１ステップ毎に示している。命令差分は、図２に示したフローチャートに沿って生成される。なお、図５の例では、符号コード生成演算部１１１が用いる初期値は０１００Ｈとする。また、図５の例では、符号コード生成演算部１１１は、オペコードと、変数Ｘの値と、の減算により命令差分を生成する。
【００３３】
Ｓｔｅｐ１では、プログラムの先頭と判定されるため（Ｓ２４：Ｙｅｓ）、変数Ｘが０１００Ｈに初期化される（Ｓ２６）。そのため、生成される命令差分は、１０００Ｈ−０１００Ｈ＝０Ｆ００Ｈとなる。Ｓｔｅｐ２では、分岐先命令ではなく（Ｓ２３：Ｎｏ）、かつプログラムの先頭でもない（Ｓ２４：Ｎｏ）。そのため変数Ｘの初期化は行われず、生成される命令差分は、１００１Ｈ-０Ｆ００Ｈ=０１０１Ｈとなる。同様に、Ｓｔｅｐ３では、生成される命令差分は、１０００Ｈ−０１０１Ｈ＝０ＥＦＦＨとなる。Ｓｔｅｐ４では、生成される命令差分は、１００１Ｈ−０ＥＦＦＨ＝０１０２Ｈとなる。
【００３４】
図６は、図５に示した命令差分からオペコードを復号化する例を示す図である。図６は、命令差分と、保持回路３１０の保持する値と、復号化されたオペコードと、をプログラムの１ステップ毎に示している。オペコードの復号化は、図３に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。すなわち、オペコードの復号化は、命令復号回路３２０に入力された命令差分と、保持回路３１０から出力される値と、の加算により実現する。保持回路３１０の初期値は、符号コード生成演算部１１１が用いる初期値と同じ０１００Ｈが設定されている。
【００３５】
Ｓｔｅｐ１では、命令フェッチ回路２００により命令差分０Ｆ００Ｈが取得される。よって、命令復号回路３２０により復号化されるオペコードは、命令差分０Ｆ００Ｈと、保持回路３１０の値である０１００Ｈと、の加算により求められる。すなわち、命令復号回路３２０により復号化されるオペコードは、０Ｆ００Ｈ＋０１００Ｈ＝１０００Ｈ（ＡＤＤ）となる。また、命令差分０Ｆ００Ｈは、保持回路３１０に入力され、次のステップ（Ｓｔｅｐ２）の演算に用いられる。復号化されたオペコードは、命令実行部４００により実行される（以降でも同様である）。
【００３６】
Ｓｔｅｐ２でも、復号化されるオペコードは、入力された命令差分と、保持回路３１０から出力される値と、の加算により求められる。ここで、Ｓｔｅｐ２で入力された命令差分は０１０１Ｈである。また、保持回路３１０の値（前回のステップで保持回路３１０に入力された命令差分）は０Ｆ００Ｈである。よって復号化されるオペコードは、０１０１Ｈ＋０Ｆ００Ｈ＝１００１Ｈ（ＳＵＢ）となる。同様に、Ｓｔｅｐ３では、復号化されるオペコードは、０ＥＦＦＨ＋０１０１Ｈ＝１０００Ｈ（ＡＤＤ）となる。Ｓｔｅｐ４では、復号化されるオペコードは、０１０２Ｈ＋０ＥＦＦＨ＝１００１Ｈ（ＳＵＢ）となる。
【００３７】
続いて、分岐処理を有するサンプルプログラムから命令差分を生成する例を示す図である。図７は、符号コード生成演算部１１１により、分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。図７は、アセンブリ言語による命令種別と、オペコードと、変数Ｘの値と、生成される命令差分と、をプログラムの１ステップ毎に示している。命令差分は、図２に示したフローチャートに沿って生成される。なお、図７の例でも、符号コード生成演算部１１１が用いる初期値は０１００Ｈとする。また、図７の例でも、符号コード生成演算部１１１は、オペコードと、変数Ｘの値と、の減算により命令差分を生成する。
【００３８】
Ｓｔｅｐ１では、プログラムの先頭と判定されるため（Ｓ２４：Ｙｅｓ）、変数Ｘが０１００Ｈに初期化される（ｓ２６）。そのため、生成される命令差分は、１０００Ｈ−０１００Ｈ＝０Ｆ００Ｈとなる。Ｓｔｅｐ２では、生成される命令差分は、１１００Ｈ−０Ｆ００Ｈ＝０２００Ｈとなる。同様に、Ｓｔｅｐ３では、生成される命令差分は、１１１０Ｈ−０２００Ｈ＝０Ｆ１０Ｈとなる。Ｓｔｅｐ４では、生成される命令差分は、１０００Ｈ−０Ｆ１０Ｈ＝００Ｆ０Ｈとなる。Ｓｔｅｐ５は、Ｓｔｅｐ７での命令差分生成処理により挿入されるＩＮＩＴ命令である。Ｓｔｅｐ６は、分岐先を示すラベルがアセンブリ言語で記載されており、何らの演算を行うものではない。そのため、オペコードは存在せず、命令差分の生成処理は行わない。
【００３９】
Ｓｔｅｐ７は、Ｓｔｅｐ３の分岐命令（ＢＮＥ（Branch Not Equal）命令）の分岐先に該当するステップである（Ｓ２３：Ｙｅｓ）。そのため、符号コード生成演算部１１１は、分岐先を示すラベル（Ｓｔｅｐ６）の直前（Ｓｔｅｐ５）にＩＮＩＴ命令を挿入する（Ｓ２５）。また、符号コード生成演算部１１１は、保持回路３１０の初期化に用いる初期値により、変数Ｘを初期化する（Ｓ２６）。すなわち、変数Ｘに０１００Ｈが代入される。そのため、Ｓｔｅｐ７で生成される命令差分は、１００１Ｈ−０１００Ｈ＝０Ｆ０１Ｈとなる。また、ＩＮＩＴ命令が挿入されたＳｔｅｐ５で生成される命令差分は、１１１１Ｈ−００Ｆ０Ｈ＝１０２１Ｈとなる。Ｓｔｅｐ８では、生成される命令差分は、１０００Ｈ−０Ｆ０１Ｈ＝００ＦＦＨとなる。
【００４０】
図８は、図７に示した命令差分からオペコードを復号化する例を示す図である。図８は、図７のＳｔｅｐ３において、分岐処理が発生しなかった（分岐条件を満たさなかった）場合の例である。オペコードの復号処理は、図６の例と同様に、図３に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。保持回路３１０の初期値は、符号コード生成演算部１１１が用いる初期値と同じ０１００Ｈが設定されている。
【００４１】
Ｓｔｅｐ１では、命令フェッチ回路２００により、命令差分０Ｆ００Ｈが取得される。よって、命令復号回路３２０により復号化されるオペコードは、命令差分０Ｆ００Ｈと、保持回路３１０の値である０１００Ｈと、の加算により求められる。すなわち、命令復号回路３２０により復号化されるオペコードは、０Ｆ００Ｈ＋０１００Ｈ＝１０００Ｈ（ＡＤＤ）となる。また、命令差分０Ｆ００Ｈは、保持回路３１０に入力され、次のステップ（Ｓｔｅｐ２）の演算に用いられる。復号化されたオペコードは、命令実行部４００により実行される（以降でも同様である）。Ｓｔｅｐ２でも、復号化されるオペコードは、入力された命令差分と、保持回路３１０から出力される値と、の加算により求められる。Ｓｔｅｐ２では、復号化されるオペコードは、０２００Ｈ＋０Ｆ００Ｈ＝１１００Ｈ（ＣＭＰ）となる。
【００４２】
Ｓｔｅｐ３では、命令復号回路３２０により復号化されるオペコードは、保持回路３１０の値（Ｓｔｅｐ２での命令差分である０２００Ｈ）と、入力される命令差分０Ｆ１０Ｈと、を加算した値となる。すなわち、命令復号回路３２０により復号化されるオペコードは、０２００Ｈ＋０Ｆ１０Ｈ＝１１１０Ｈ（ＢＮＥ）となる。そして、命令実行部４００により、当該オペコードを用いた演算が実行される。図８の例では、分岐条件を満たさないため、命令実行部４００は、リセット信号Ｓ４を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【００４３】
Ｓｔｅｐ４では、復号化されるオペコードは、０Ｆ１０Ｈ＋００Ｆ０Ｈ＝１０００Ｈ（ＡＤＤ）となる。Ｓｔｅｐ５では、復号化されるオペコードは、００Ｆ０Ｈ＋１０２１Ｈ＝１１１１Ｈ（ＩＮＩＴ）となる。Ｓｔｅｐ５では命令実行部４００によるＩＮＩＴ命令が実行により、命令実行部４００は、保持回路３１０にリセット信号Ｓ４を入力する。保持回路３１０にリセット信号Ｓ４が入力されることにより、次のステップ（Ｓｔｅｐ７）で用いる保持回路３１０の値が初期化される。なお、Ｓｔｅｐ６は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【００４４】
Ｓｔｅｐ７では、リセット信号Ｓ４により、保持回路３１０の値は０１００Ｈとなっている。よって、復号化されるオペコードは、０Ｆ０１Ｈ＋０１００Ｈ＝１００１Ｈ（ＳＵＢ）となる。Ｓｔｅｐ８では、復号化されるオペコードは、００ＦＦＨ＋０Ｆ０１Ｈ＝１０００Ｈ（ＡＤＤ）となる。
【００４５】
続いて、図７のＳｔｅｐ３において、分岐処理が発生した（分岐条件を満たした）場合の例を図９に示す。図９は、図７に示した命令差分からオペコードを復号化する例を示す図である。
【００４６】
Ｓｔｅｐ１では、命令復号回路３２０により復号化されるオペコードは、０Ｆ００Ｈ＋０１００Ｈ＝１０００Ｈ（ＡＤＤ）となる。また、命令差分０Ｆ００Ｈは、保持回路３１０に入力され、次のステップ（Ｓｔｅｐ２）の演算に用いられる。復号化されたオペコードは、命令実行部４００により実行される（以降でも同様である）。Ｓｔｅｐ２でも、復号化されるオペコードは、入力された命令差分と、保持回路３１０から出力される値と、の加算により求められる。Ｓｔｅｐ２では、復号化されるオペコードは、０２００Ｈ＋０Ｆ００Ｈ＝１１００Ｈ（ＣＭＰ）となる。
【００４７】
Ｓｔｅｐ３では、命令復号回路３２０により復号化されるオペコードは、０Ｆ１０Ｈ＋０２００Ｈ＝１１１０Ｈ（ＢＮＥ）となる。そして、命令実行部４００により、当該オペコードを用いた演算が実行される。図９の例では、分岐条件を満たすため、命令実行部４００はリセット信号Ｓ４を保持回路３１０に出力する。また、分岐条件を満たしたため、分岐先のＳｔｅｐ７から処理が再開される。
【００４８】
Ｓｔｅｐ７では、リセット信号Ｓ４が入力されたことにより、保持回路３１０の値は０１００Ｈとなる。よって、復号化されるオペコードは、０Ｆ０１Ｈ＋０１００Ｈ＝１００１Ｈ（ＳＵＢ）となる。Ｓｔｅｐ８では、復号化されるオペコードは、００ＦＦＨ＋０Ｆ０１Ｈ＝１０００Ｈ（ＡＤＤ）となる。
【００４９】
次に、本実施の形態におけるプログラム秘匿システムの効果について説明する。まず、本実施の形態にかかるプログラム秘匿システムでは、情報記憶メモリ（メモリセルアレイ）と別に設けられた保持回路３１０によって、復号化を行うための共通鍵（命令差分）が保持される。これにより、情報記憶メモリ内のデータの不当なコピーにより、共通鍵が漏洩することはない。また、共通鍵を情報記憶メモリではなく、保持回路３１０に保持させることにより、共通鍵の取得時に情報記憶メモリにアクセスする必要がなくなる。これにより、パフォーマンスの向上が図れる。
【００５０】
符号データ生成部１００は、オペコード（実行対象のプログラムの命令コード）と、保持回路が保持する命令差分（保持回路が保持する共通鍵）に基づいて新たな命令差分（符号化命令コード）を生成する。生成した命令差分により保持回路３１０が保持する共通鍵を上書きすることにより、以降のステップで利用する共通鍵が逐一書き変わることとなる。これにより、一度保持回路３１０の共通鍵が漏洩した場合であっても、その値を用いて以後のプログラム実行に用いるオペコードを復号化することはできない。よって、セキュリティ機能の向上したプログラムの符号化、及び復号化を実行することができる。また、オペコードの復号化を行う命令復号回路３２０は、符号生成演算部１００による命令差分の生成演算と対応付けられた演算を行うようにするのみで容易に構成することができる。
【００５１】
命令処理部４００は、命令復号回路３２０により復号化されたオペコードを実行し、分岐先命令処理にかかるオペコードである場合、保持回路３１０の値を所定の初期値でリセットする。これにより、実行対象のプログラムが分岐処理を有する場合であっても、正確にプログラム実行を行うことができる。
【００５２】
さらに、命令差分の生成、及びオペコードの復号化は、加算減算という基本的な論理演算により行うことができる。そのため、上述のオペコードの復号化等は、基本論理回路を組み合わせることにより、容易に既存のマイクロコンピュータに適応することができる。
【００５３】
本発明の実施の形態２
本発明の実施の形態２は、命令差分の生成、及びオペコードの復号化のための演算に排他論理和を用いることを特徴とする。以下に、実施の形態１と異なる部分を説明する。なお、プログラム秘匿システム１の基本構成（図１）、命令差分の生成フロー（図２）、及びオペコードの復号化フロー（図３）は、実施の形態１と同じであるため、説明を省略する。
【００５４】
図１０は、本実施の形態にかかる命令差分の生成の実行例を示す図である。図１０は、アセンブリ言語による命令種別と、オペコードと、変数Ｘの値と、生成される命令差分と、をプログラムの１ステップ毎に示している。図１０の例では、符号コード生成演算部１１１が用いる初期値は０１００Ｈとする。
【００５５】
Ｓｔｅｐ１では、プログラムの先頭と判定されるため（Ｓ２４：Ｙｅｓ）、変数Ｘが０１００Ｈに初期化される（ｓ２６）。そのため、生成される命令差分は、１０００Ｈ  ＸＯＲ  ０１００Ｈ＝１１００Ｈとなる。Ｓｔｅｐ２では、分岐先命令ではなく（Ｓ２３：Ｎｏ）、かつプログラムの先頭でもない（Ｓ２４：Ｎｏ）。そのため、生成される命令差分は、１１００Ｈ  ＸＯＲ  １１００＝００００Ｈとなる。以下同様に命令差分を生成する。
【００５６】
Ｓｔｅｐ３では、生成される命令差分は、１１１０Ｈ  ＸＯＲ  ００００Ｈ＝１１１０Ｈとなる。Ｓｔｅｐ４では、生成される命令差分は、１０００Ｈ  ＸＯＲ  １１１０Ｈ＝０１１０Ｈとなる。Ｓｔｅｐ５は、Ｓｔｅｐ７での命令差分生成処理により挿入されるＩＮＩＴ命令である。Ｓｔｅｐ６は、分岐先を示すラベルがアセンブリ言語で記載されており、何らかの演算を行うものではないため、オペコードの復号化は行われない。
【００５７】
Ｓｔｅｐ７は、Ｓｔｅｐ３の分岐命令（ＢＮＥ命令）の分岐先に該当するステップである（Ｓ２３：Ｙｅｓ）。そのため、符号コード生成演算部１１１は、分岐先を示すラベル（Ｓｔｅｐ６）の直前（Ｓｔｅｐ５）にＩＮＩＴ命令を挿入する（Ｓ２５）。また、符号コード生成演算部１１１は、保持回路３１０の初期化に用いる初期値により、変数Ｘを初期化する（Ｓ２６）。すなわち、変数Ｘに０１００Ｈが代入される。そのため、Ｓｔｅｐ７で生成される命令差分は、１００１Ｈ  ＸＯＲ  ０１００Ｈ＝１１０１Ｈとなる。また、ＩＮＩＴ命令が挿入されたＳｔｅｐ５で生成される命令差分は、１１１１Ｈ  ＸＯＲ  −１１−Ｈ＝１００１Ｈとなる。Ｓｔｅｐ８では、生成される命令差分は、１０００Ｈ  ＸＯＲ  １１０１Ｈ＝０１０１Ｈとなる。
【００５８】
図１１は、図１０に示した命令差分からオペコードを復号化する例を示す図である。図１１は、図１０のＳｔｅｐ３において、分岐処理が発生しなかった（分岐条件を満たさなかった）場合の例である。オペコードの復号化処理は、実施の形態１と同様に、図３に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成と同様に排他論理和により行う。
【００５９】
Ｓｔｅｐ１では、命令フェッチ回路２００により、命令差分１１００Ｈが取得される。よって、命令復号回路３２０により復号化されるオペコードは、命令差分１１００Ｈと、保持回路３１０の値である０１００Ｈと、の排他論理和により求められる。すなわち、命令復号回路３２０により復号化されるオペコードは、１１００Ｈ  ＸＯＲ  ０１００Ｈ＝１０００（ＡＤＤ）となる。また、命令差分１１００Ｈは、保持回路３１０に入力され、次のステップ（Ｓｔｅｐ２）の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部４００により実行される（以降でも同様である）。Ｓｔｅｐ２では、復号化されるオペコードは、００００Ｈ  ＸＯＲ  １１００Ｈ＝１１００Ｈ（ＣＭＰ）となる。
【００６０】
Ｓｔｅｐ３では、復号化されるオペコードは、１１１０Ｈ  ＸＯＲ  ００００Ｈ＝１１１０Ｈ（ＢＮＥ）となる。そして、命令実行部４００により、当該オペコードを用いた演算が実行される。図１１の例では、分岐条件を満たさないため、命令実行部４００は、リセット信号Ｓ４を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【００６１】
Ｓｔｅｐ４では、復号化されるオペコードは、０１１０Ｈ  ＸＯＲ  １１１０Ｈ＝１０００Ｈ（ＡＤＤ）となる。Ｓｔｅｐ５では、復号化されるオペコードは、１００１Ｈ  ＸＯＲ  ０１１０Ｈ＝１１１１Ｈ（ＩＮＩＴ）となる。Ｓｔｅｐ５では命令実行部４００によるＩＮＩＴ命令が実行により、命令実行部４００は、保持回路３１０にリセット信号Ｓ４を入力する。保持回路３１０にリセット信号Ｓ４が入力されることにより、次のステップ（Ｓｔｅｐ７）で用いる保持回路３１０の値が初期化される。なお、Ｓｔｅｐ６は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【００６２】
Ｓｔｅｐ７では、リセット信号Ｓ４により、保持回路３１０の値は０１００Ｈとなっている。よって、復号化されるオペコードは、１１０１Ｈ  ＸＯＲ  ０１００Ｈ＝１００１Ｈ（ＳＵＢ）となる。Ｓｔｅｐ８では、復号化されるオペコードは、０１０１Ｈ  ＸＯＲ  １１０１Ｈ＝１０００Ｈ（ＡＤＤ）となる。
【００６３】
続いて、図１０のＳｔｅｐ３において、分岐処理が発生した（分岐条件を満たした）場合の例を図１２に示す。図１２は、図１０に示した命令差分からオペコードを復号化する例を示す図である。
【００６４】
Ｓｔｅｐ１では、命令復号回路３２０により復号化されるオペコードは、１１００Ｈ  ＸＯＲ  ０１００Ｈ＝１０００（ＡＤＤ）となる。また、命令差分１１００Ｈは、保持回路３１０に入力され、次のステップ（Ｓｔｅｐ２）の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部４００により実行される（以降でも同様である）。Ｓｔｅｐ２では、復号化されるオペコードは、００００Ｈ  ＸＯＲ  １１００Ｈ＝１１００Ｈ（ＣＭＰ）となる。
【００６５】
Ｓｔｅｐ３では、復号化されるオペコードは、１１１０Ｈ  ＸＯＲ  ００００Ｈ＝１１１０Ｈ（ＢＮＥ）となる。そして、命令実行部４００により、当該オペコードを用いた演算が実行される。図１１の例では、分岐条件を満たすため、命令実行部４００はリセット信号Ｓ４を保持回路３１０に出力する。また、分岐条件を満たしたため、分岐先のＳｔｅｐ７から処理が再開される。
【００６６】
Ｓｔｅｐ７では、リセット信号Ｓ４が入力されたことにより、保持回路３１０の値は０１００Ｈとなる。よって、復号化されるオペコードは、１１０１Ｈ  ＸＯＲ  ０１００Ｈ＝１００１Ｈ（ＳＵＢ）となる。Ｓｔｅｐ８では、復号化されるオペコードは、０１０１Ｈ  ＸＯＲ  １１０１Ｈ＝１０００Ｈ（ＡＤＤ）となる。
【００６７】
上記一連の処理により、排他論理和演算によっても命令差分（符号化命令コード）の生成、及びオペコード（実行対象のプログラムの命令コード）の復号化を行うことができる。本実施の形態では、排他論理和演算を行う命令復号回路３２０は、ＸＯＲゲートのみで構成することができる。命令復号回路３２０を構成する為の素子がＸＯＲゲートのみであるため、半導体装置５００の回路規模を削減することが可能となる。さらに、排他論理和による演算は、加算減算に比べて処理速度が向上する。そのため、命令コードの復号化処理速度の向上を図ることができる。また、実施の形態１と同様に、セキュリティ機能が向上したプログラム秘匿システムを提供することが可能である。
【００６８】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、命令差分の生成演算を加算処理により行い、オペコードの復号化に減算処理を行ってもよい。
【符号の説明】
【００６９】
１      プログラム秘匿システム
１００  符号データ生成部
１１０  ソフトウェア開発ツール
１１１  符号コード生成演算部
１２０  外部記憶装置
２００  命令フェッチ回路
３００  命令復号部
３１０  保持回路
３２０  命令復号回路
３３０  初期値入力回路
４００  命令実行部
５００  半導体装置
【図１】
2011081429.tif 000003
【図２】
2011081429.tif 000004
【図３】
2011081429.tif 000005
【図４】
2011081429.tif 000006
【図５】
2011081429.tif 000007
【図６】
2011081429.tif 000008
【図７】
2011081429.tif 000009
【図８】
2011081429.tif 000010
【図９】
2011081429.tif 000011
【図１０】
2011081429.tif 000012
【図１１】
2011081429.tif 000013
【図１２】
2011081429.tif 000014