プログラム秘匿システム、プログラム秘匿方法
【課題】セキュリティ性能に優れたプログラム秘匿システムを提供すること
【解決手段】保持回路310は、情報記憶メモリと別に設けられ、所定ステップ前の実行プログラムの命令コードを符号化した符号化コードを一時的に保持する。符号データ生成部100は、実行対象のプログラムの命令コードと、保持回路310が保持する符号化コードと、に基づいた演算により、実行対象のプログラムの命令コードを符号化した命令コードを生成するとともに、符号化した当該命令コードにより保持回路310に格納された符号化コードを所定ステップ毎に上書きする。命令復号回路320は、保持回路310に格納された符号化コードと、符号データ生成演算部100が生成した符号化コードと、に基づいた演算により実行対象のプログラムの命令コードを復号化する。
【解決手段】保持回路310は、情報記憶メモリと別に設けられ、所定ステップ前の実行プログラムの命令コードを符号化した符号化コードを一時的に保持する。符号データ生成部100は、実行対象のプログラムの命令コードと、保持回路310が保持する符号化コードと、に基づいた演算により、実行対象のプログラムの命令コードを符号化した命令コードを生成するとともに、符号化した当該命令コードにより保持回路310に格納された符号化コードを所定ステップ毎に上書きする。命令復号回路320は、保持回路310に格納された符号化コードと、符号データ生成演算部100が生成した符号化コードと、に基づいた演算により実行対象のプログラムの命令コードを復号化する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明はプログラム秘匿システムおよびプログラム秘匿方法に関し、特にセキュリティ性を考慮したプログラム秘匿システム、プログラム秘匿方法に関する。
【背景技術】
【0002】
従来の半導体記憶装置、及びマイクロコンピュータでは、メモリセルアレイ中に記憶されているデータが不当にコピーされる恐れがある。そのため、メモリセルアレイ中で保持されているデータを不当なコピーから保護する様々な手段が講じられている。特に、半導体記憶装置、及びマイクロコンピュータの誤作動防止のため、これらのメモリセルアレイ中に記憶されている命令コード、及び演算コードの暗号化は重要である。また、メモリセルアレイ中に記憶されている命令コード、及び演算コードの解析困難性の向上を図ることが望ましい。
【0003】
特許文献1には、データを暗号化した上でプログラムメモリ内に格納する半導体記憶装置が記載されている。当該半導体記憶装置は、プログラムメモリ内に、記憶対象データを暗号化したデータと、暗号化に利用した暗号キーと、を格納する。当該半導体装置では、データ読み出しに先立って暗号キーを記憶したプログラムメモリにアクセスしないと、誤った演算処理が行われる。これにより、記憶対象データを不当なコピーから保護することができる。
【0004】
特許文献2に記載のソフトウェア機密漏洩防止方法では、プログラムメモリと、中央処理装置と、の間に、固有の論理を組んだデータ変換要素を組み込む。当該方法では、プログラムメモリにプログラムの実行命令を暗号化した上で書き込む。中央処理装置によりプログラムメモリの内容を読み取る際に、データ変換要素により暗号化されたプログラムの実行命令を復号化する。
【0005】
特許文献3に記載のデータセキュリティシステムでは、実行プログラムの命令に一定値を用いた所定の演算により変換したデータをメモリに書き込む。読み出す際には、一定値を用いた所定の演算を行うことにより、実行プログラムの命令を復号化する。メモリ内に実行プログラムの命令を直接書き込む構成ではないため、セキュリティ性能を高めることができる。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開平9−312099号公報
【特許文献2】特開昭59−112341号公報
【特許文献3】特開2000−029790号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、上述の装置や方法では以下の問題がある。特許文献1に記載の半導体記憶装置では、暗号データとともに、暗号キーをプログラムメモリから読み出す必要が生じ、パフォーマンスが低下する。また、同一プログラムメモリ内に暗号データと、暗号化データと、を格納するため、プログラムメモリ内のデータが漏洩した場合、データが容易に復号化できてしまう。また、特許文献2及び特許文献3の技術では、暗号化に用いる暗号キーが一定であるため、一度暗号キーが漏洩した場合、データの復号化が容易である。すなわち、上述の装置や方法では、セキュリティ上の問題がある。
【課題を解決するための手段】
【0008】
本発明にかかるプログラム秘匿システムの一態様は、情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるものである。
【0009】
本発明においては、実行対象のプログラムの命令コードを保持回路内の共通鍵で符号化し、生成された符号化コードを保持回路の保持する共通鍵として逐次上書きする。保持回路に保持される共通鍵が逐次書き変わることにより、一度共通鍵の漏洩が起きた場合であっても、以後の影響を小さくすることができる。
【発明の効果】
【0010】
本発明によれば、セキュリティ性能に優れたプログラム秘匿システムを提供することができる。
【図面の簡単な説明】
【0011】
【図1】実施の形態1にかかるプログラム秘匿システムの基本構成を示すブロック図である。
【図2】実施の形態1にかかる命令差分の生成にかかるフローチャートある。
【図3】実施の形態1にかかるオペコードの復号化にかかるフローチャートである。
【図4】実施の形態1にかかるアセンブリ言語で記述されたオペコードを示す図である。
【図5】実施の形態1にかかるサンプルプログラムから命令差分を生成する例を示す図である。
【図6】実施の形態1にかる命令差分からオペコードを復号化する例を示す図である。
【図7】実施の形態1にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図8】実施の形態1にかかる命令差分からオペコードを復号化する例を示す図である。
【図9】実施の形態1にかかる命令差分からオペコードを復号化する例を示す図である。
【図10】実施の形態2にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図11】実施の形態2にかかる命令差分からオペコードを復号化する例を示す図である。
【図12】実施の形態2にかかる命令差分からオペコードを復号化する例を示す図である。
【発明を実施するための形態】
【0012】
本発明の実施の形態1
以下、図面を参照して本発明の実施の形態について説明する。まず、図1を参照して、本実施の形態1にかかるプログラム秘匿システムの基本構成について説明する。プログラム秘匿システム1は、符号データ生成部100と、半導体装置500と、を備える。半導体装置500は、命令フェッチ回路200と、命令復号部300と、命令実行部400と、を備える。半導体装置500の一例として、マイクロコンピュータが挙げられる。
【0013】
符号データ生成部100は、ソフトウェア開発ツール110と、外部記憶装置120と、を備える。ソフトウェア開発ツール110は、半導体装置500に実行させるソフトウェアを開発する為のツールである。ソフトウェア開発ツール110は、Cコンパイラ、アセンブラ、リンカ、Flashライタ等のツールから構成される。ソフトウェア開発ツール110は、符号コード生成演算部111を備える。符号コード生成演算部111は、実行対象のプログラムの1ステップ毎に、実行対象のプログラムの命令コード(以後、オペコードとも記載する。)を符号化した符号化命令コード(以後、命令差分とも記載する。)を生成し、命令差分信号S7として外部記憶装置120へ出力する。命令差分は、1ステップ後の符号コード生成演算部111によるオペコードの符号化に用いられ、かつ、復号化回路330による符号化命令コードを復号化に用いられる。すなわち、命令差分は1ステップ後の符号化、及び復号化の共通鍵として用いられる。なお、図示しないが、ソフトウェア開発ツール110は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて外部記憶装置120へ出力する。
【0014】
外部記憶装置120は、ソフトウェア開発ツール110が出力する命令差分(S7)を記憶するための記憶装置である。外部記憶装置120は、実行対象のプログラムのアドレスを示す信号S5に応じて、命令差分を信号S6として命令フェッチ回路200へ出力する。なお、本実施の形態では、外部記憶装置120は、半導体装置500の外部に配置されているが、これに限られず、外部記憶装置120を半導体装置500の内部に配置してもよい。
【0015】
命令フェッチ回路200は、実行対象のプログラムを外部記憶装置120から取得する回路である。命令フェッチ回路200は、実行対象のプログラムのアドレスを示す信号S5を外部記憶装置120へ出力する。命令フェッチ回路200には、S5に応じた命令差分信号S6が外部記憶装置120から入力される。命令フェッチ回路200は、外部記憶装置120から入力された命令差分を信号S1として命令復号部300へ出力する。なお、図示しないが、命令フェッチ回路200は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて命令復号部300へ出力する。
【0016】
命令復号部300は、命令フェッチ回路200から入力された命令差分(S1)を本来のオペコードに復号化する為の回路である。命令復号部300は、保持回路310と、命令復号回路320と、初期値入力回路330と、を備える。保持回路310は、命令フェッチ回路200から入力される命令差分(S1)を保持する為の回路である。また、命令実行部400からリセット信号S4が保持回路310に入力された場合、保持回路310は、初期値入力回路330からの初期値の入力を要求する信号S9を出力する。初期値入力回路330から初期値(S8)が入力された場合、保持回路310は、初期値入力回路330から入力された初期値(S8)を命令差分(S1)に代わり保持する。保持回路310が保持する値は、プログラムの実行ステップ毎に更新される。詳細な具体例は、後述する。
【0017】
命令復号回路320は、命令フェッチ回路200から入力される命令差分(S1)を、保持回路310から入力される命令差分(S2)を用いることにより、本来のオペコードに復号化する。命令復号回路320により復号化されたオペコードは、信号S3として命令実行部400へ出力される。なお、図示しないが、命令復号回路320は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて命令実行部400へ出力する。
【0018】
初期値入力回路330は、保持回路310にリセット信号S4が入力された際に、保持回路310に所定の初期値を入力する為の回路である。なお、保持回路310にリセット信号S4が入力された際に、保持回路310に所定の初期値(S9)を入力するものであれば、他の構成であってもよい。
【0019】
命令実行部400は、命令復号回路320が復号化したオペコードを用いて、プログラムを1ステップ毎に実行する処理部である。命令実行部400は、プログラム実行において、分岐処理が発生した場合に、リセット信号S4を保持回路310に出力する。
【0020】
続いて、図2を用いて、符号コード生成演算部111による命令差分の生成処理について説明する。図2は、符号コード生成演算部111による命令差分の生成手順を示すフローチャートである。
【0021】
始めに、符号コード生成演算部111は変数Xを初期化する(S21)。変数Xは、命令差分をプログラム実行の1ステップ毎に保持するための変数である。この際の初期化に用いる初期値は、任意の値でよいが、後述の初期値入力回路330が出力する初期値と同じ値とする必要がある。本実施の形態では、初期値を0100Hとする。
【0022】
次に、符号コード生成演算部111は、実行対象のプログラムからオペコードを取得し(S22)、取得したオペコードの命令種別が分岐先処理に該当するか否かを判定する(S23)。取得したオペコードが分岐先処理であった場合(S23:Yes)、符号コード生成演算部111は、保持回路310の値を初期化する為のINIT命令を命令差分信号S7として外部記憶装置120へ出力する。一方、取得したオペコードが分岐先処理ではなかった場合(S23:No)、符号コード生成演算部111は、取得したオペコードがプログラムの先頭を示す処理であるか否かを判定する(S24)。取得したオペコードがプログラムの先頭を示す処理である場合(S24:Yes)、符号コード生成演算部111は、変数Xを初期値0100Hで初期化し(S26)、その後、命令差分生成処理(S27)を行う。一方、取得したオペコードがプログラムの先頭を示す処理ではない場合(S24:No)、命令差分生成処理(S27)に遷移する。
【0023】
符号コード生成演算部111は、オペコードと、変数Xに格納された値と、から新たな命令差分を生成する(S27)。新たな命令差分の生成は、所定の演算により行う。例えば、オペコードと、変数Xに格納された値と、の減算により行う。ソフトウェア開発ツール110は、生成された命令差分を命令差分信号S7として外部記憶装置120へ出力する。
【0024】
符号コード生成演算部111は、変数Xに生成した命令差分を代入する(S28)。すなわち、符号コード生成演算部111は、生成した命令差分により変数Xの値を上書きする(S28)。符号コード生成演算部111は、実行プログラムの1ステップに対応するオペコードの命令差分の生成(S22〜S28)が終わった後、実行対象プログラムの終端まで到達したか否かを判定する(S29)。
【0025】
実行対象プログラムの終端まで到達した場合(S29:Yes)、符号コード生成演算部111は、命令差分の生成処理を終了する。一方、実行対象プログラムの終端まで到達していない場合(S29:No)、符号コード生成演算部111は、次のステップのオペコードの命令差分の生成(S22〜S28)を実行する。
【0026】
続いて、図3を用いて、半導体装置500内における、命令差分からのオペコードの復号化、及びプログラム実行処理について説明する。図3は、半導体装置500内でのオペコードの復号化手順を示すフローチャートである。
【0027】
始めに、保持回路310の初期化を行う(S31)。ここで、初期化に用いる初期値は、符号コード生成演算部111が用いる初期値と同じ値にする。本実施の形態では、初期値は0100Hとなる。続いて、命令フェッチ回路200が外部記憶装置120から実行プログラムの1ステップ毎の命令差分を取得する(S32)。命令フェッチ回路200は、取得した命令差分を命令復号部300へ出力する。
【0028】
命令復号回路320は、入力された命令差分と、保持回路310が保持する値と、に基づいて所定の演算を行うことでオペコードを復号化する(S33)。この際の所定の演算は、符号コード生成演算部111による命令差分生成に用いた演算と対応付けられたものである。例えば、符号コード生成演算部111が減算処理により命令差分を生成した場合、命令復号回路320は、加算処理によりオペコードの復号化を行う。詳細な具体例は後述する。命令復号回路320は、復号化したオペコードを命令実行部400へ出力する。
【0029】
命令実行部400は、入力されたオペコードを用いて1ステップ毎にプログラムの実行を行う。命令実行部400は、入力されたオペコードが分岐命令である場合(S34:Yes)には、保持回路310を初期値0100Hで初期化する(S36)。また、命令実行部400が保持回路310の初期化命令(INIT命令)を出力した場合にも(S34:Yes)、保持回路310を初期値0100Hで初期化する(S36)。一方、入力されたオペコードが分岐命令でなく、かつ命令実行部400からの初期化命令が入力されなかった場合(S34:No)、保持回路310の値を命令フェッチ回路200から入力された命令差分で更新する(S35)。
【0030】
上記のプログラム1ステップに対応するオペコードの復号化、及びプログラム実行処理(S32〜S36)が終了した場合、次のステップのオペコードの復号化、及びプログラム実行処理(S32〜S36)を実行する。
【0031】
続いて、アセンブラ言語による具体例を示し、本実施の形態にかかるオペコードからの命令差分の生成、及び命令差分からのオペコードの復号化について説明する。図4は、以下の説明で用いるオペコードの具体例を示す。例えば、ADD命令のオペコードは、1000Hであり、演算対象(オペランド)を加算する為に用いる。また、INIT命令は、本実施の形態にかかるプログラム実行固有の命令である。INIT命令は、保持回路310を初期化するために用いる。なお、各命令のオペランド部分は、本実施の形態に示す動作に直接関係がないため、記載を省略している。
【0032】
図5は、符号コード生成演算部111によりサンプルプログラムから命令差分を生成する例を示す図である。図5は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。命令差分は、図2に示したフローチャートに沿って生成される。なお、図5の例では、符号コード生成演算部111が用いる初期値は0100Hとする。また、図5の例では、符号コード生成演算部111は、オペコードと、変数Xの値と、の減算により命令差分を生成する。
【0033】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(S26)。そのため、生成される命令差分は、1000H−0100H=0F00Hとなる。Step2では、分岐先命令ではなく(S23:No)、かつプログラムの先頭でもない(S24:No)。そのため変数Xの初期化は行われず、生成される命令差分は、1001H-0F00H=0101Hとなる。同様に、Step3では、生成される命令差分は、1000H−0101H=0EFFHとなる。Step4では、生成される命令差分は、1001H−0EFFH=0102Hとなる。
【0034】
図6は、図5に示した命令差分からオペコードを復号化する例を示す図である。図6は、命令差分と、保持回路310の保持する値と、復号化されたオペコードと、をプログラムの1ステップ毎に示している。オペコードの復号化は、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。すなわち、オペコードの復号化は、命令復号回路320に入力された命令差分と、保持回路310から出力される値と、の加算により実現する。保持回路310の初期値は、符号コード生成演算部111が用いる初期値と同じ0100Hが設定されている。
【0035】
Step1では、命令フェッチ回路200により命令差分0F00Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分0F00Hと、保持回路310の値である0100Hと、の加算により求められる。すなわち、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。
【0036】
Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。ここで、Step2で入力された命令差分は0101Hである。また、保持回路310の値(前回のステップで保持回路310に入力された命令差分)は0F00Hである。よって復号化されるオペコードは、0101H+0F00H=1001H(SUB)となる。同様に、Step3では、復号化されるオペコードは、0EFFH+0101H=1000H(ADD)となる。Step4では、復号化されるオペコードは、0102H+0EFFH=1001H(SUB)となる。
【0037】
続いて、分岐処理を有するサンプルプログラムから命令差分を生成する例を示す図である。図7は、符号コード生成演算部111により、分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。図7は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。命令差分は、図2に示したフローチャートに沿って生成される。なお、図7の例でも、符号コード生成演算部111が用いる初期値は0100Hとする。また、図7の例でも、符号コード生成演算部111は、オペコードと、変数Xの値と、の減算により命令差分を生成する。
【0038】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(s26)。そのため、生成される命令差分は、1000H−0100H=0F00Hとなる。Step2では、生成される命令差分は、1100H−0F00H=0200Hとなる。同様に、Step3では、生成される命令差分は、1110H−0200H=0F10Hとなる。Step4では、生成される命令差分は、1000H−0F10H=00F0Hとなる。Step5は、Step7での命令差分生成処理により挿入されるINIT命令である。Step6は、分岐先を示すラベルがアセンブリ言語で記載されており、何らの演算を行うものではない。そのため、オペコードは存在せず、命令差分の生成処理は行わない。
【0039】
Step7は、Step3の分岐命令(BNE(Branch Not Equal)命令)の分岐先に該当するステップである(S23:Yes)。そのため、符号コード生成演算部111は、分岐先を示すラベル(Step6)の直前(Step5)にINIT命令を挿入する(S25)。また、符号コード生成演算部111は、保持回路310の初期化に用いる初期値により、変数Xを初期化する(S26)。すなわち、変数Xに0100Hが代入される。そのため、Step7で生成される命令差分は、1001H−0100H=0F01Hとなる。また、INIT命令が挿入されたStep5で生成される命令差分は、1111H−00F0H=1021Hとなる。Step8では、生成される命令差分は、1000H−0F01H=00FFHとなる。
【0040】
図8は、図7に示した命令差分からオペコードを復号化する例を示す図である。図8は、図7のStep3において、分岐処理が発生しなかった(分岐条件を満たさなかった)場合の例である。オペコードの復号処理は、図6の例と同様に、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。保持回路310の初期値は、符号コード生成演算部111が用いる初期値と同じ0100Hが設定されている。
【0041】
Step1では、命令フェッチ回路200により、命令差分0F00Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分0F00Hと、保持回路310の値である0100Hと、の加算により求められる。すなわち、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。Step2では、復号化されるオペコードは、0200H+0F00H=1100H(CMP)となる。
【0042】
Step3では、命令復号回路320により復号化されるオペコードは、保持回路310の値(Step2での命令差分である0200H)と、入力される命令差分0F10Hと、を加算した値となる。すなわち、命令復号回路320により復号化されるオペコードは、0200H+0F10H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図8の例では、分岐条件を満たさないため、命令実行部400は、リセット信号S4を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【0043】
Step4では、復号化されるオペコードは、0F10H+00F0H=1000H(ADD)となる。Step5では、復号化されるオペコードは、00F0H+1021H=1111H(INIT)となる。Step5では命令実行部400によるINIT命令が実行により、命令実行部400は、保持回路310にリセット信号S4を入力する。保持回路310にリセット信号S4が入力されることにより、次のステップ(Step7)で用いる保持回路310の値が初期化される。なお、Step6は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【0044】
Step7では、リセット信号S4により、保持回路310の値は0100Hとなっている。よって、復号化されるオペコードは、0F01H+0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、00FFH+0F01H=1000H(ADD)となる。
【0045】
続いて、図7のStep3において、分岐処理が発生した(分岐条件を満たした)場合の例を図9に示す。図9は、図7に示した命令差分からオペコードを復号化する例を示す図である。
【0046】
Step1では、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。Step2では、復号化されるオペコードは、0200H+0F00H=1100H(CMP)となる。
【0047】
Step3では、命令復号回路320により復号化されるオペコードは、0F10H+0200H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図9の例では、分岐条件を満たすため、命令実行部400はリセット信号S4を保持回路310に出力する。また、分岐条件を満たしたため、分岐先のStep7から処理が再開される。
【0048】
Step7では、リセット信号S4が入力されたことにより、保持回路310の値は0100Hとなる。よって、復号化されるオペコードは、0F01H+0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、00FFH+0F01H=1000H(ADD)となる。
【0049】
次に、本実施の形態におけるプログラム秘匿システムの効果について説明する。まず、本実施の形態にかかるプログラム秘匿システムでは、情報記憶メモリ(メモリセルアレイ)と別に設けられた保持回路310によって、復号化を行うための共通鍵(命令差分)が保持される。これにより、情報記憶メモリ内のデータの不当なコピーにより、共通鍵が漏洩することはない。また、共通鍵を情報記憶メモリではなく、保持回路310に保持させることにより、共通鍵の取得時に情報記憶メモリにアクセスする必要がなくなる。これにより、パフォーマンスの向上が図れる。
【0050】
符号データ生成部100は、オペコード(実行対象のプログラムの命令コード)と、保持回路が保持する命令差分(保持回路が保持する共通鍵)に基づいて新たな命令差分(符号化命令コード)を生成する。生成した命令差分により保持回路310が保持する共通鍵を上書きすることにより、以降のステップで利用する共通鍵が逐一書き変わることとなる。これにより、一度保持回路310の共通鍵が漏洩した場合であっても、その値を用いて以後のプログラム実行に用いるオペコードを復号化することはできない。よって、セキュリティ機能の向上したプログラムの符号化、及び復号化を実行することができる。また、オペコードの復号化を行う命令復号回路320は、符号生成演算部100による命令差分の生成演算と対応付けられた演算を行うようにするのみで容易に構成することができる。
【0051】
命令処理部400は、命令復号回路320により復号化されたオペコードを実行し、分岐先命令処理にかかるオペコードである場合、保持回路310の値を所定の初期値でリセットする。これにより、実行対象のプログラムが分岐処理を有する場合であっても、正確にプログラム実行を行うことができる。
【0052】
さらに、命令差分の生成、及びオペコードの復号化は、加算減算という基本的な論理演算により行うことができる。そのため、上述のオペコードの復号化等は、基本論理回路を組み合わせることにより、容易に既存のマイクロコンピュータに適応することができる。
【0053】
本発明の実施の形態2
本発明の実施の形態2は、命令差分の生成、及びオペコードの復号化のための演算に排他論理和を用いることを特徴とする。以下に、実施の形態1と異なる部分を説明する。なお、プログラム秘匿システム1の基本構成(図1)、命令差分の生成フロー(図2)、及びオペコードの復号化フロー(図3)は、実施の形態1と同じであるため、説明を省略する。
【0054】
図10は、本実施の形態にかかる命令差分の生成の実行例を示す図である。図10は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。図10の例では、符号コード生成演算部111が用いる初期値は0100Hとする。
【0055】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(s26)。そのため、生成される命令差分は、1000H XOR 0100H=1100Hとなる。Step2では、分岐先命令ではなく(S23:No)、かつプログラムの先頭でもない(S24:No)。そのため、生成される命令差分は、1100H XOR 1100=0000Hとなる。以下同様に命令差分を生成する。
【0056】
Step3では、生成される命令差分は、1110H XOR 0000H=1110Hとなる。Step4では、生成される命令差分は、1000H XOR 1110H=0110Hとなる。Step5は、Step7での命令差分生成処理により挿入されるINIT命令である。Step6は、分岐先を示すラベルがアセンブリ言語で記載されており、何らかの演算を行うものではないため、オペコードの復号化は行われない。
【0057】
Step7は、Step3の分岐命令(BNE命令)の分岐先に該当するステップである(S23:Yes)。そのため、符号コード生成演算部111は、分岐先を示すラベル(Step6)の直前(Step5)にINIT命令を挿入する(S25)。また、符号コード生成演算部111は、保持回路310の初期化に用いる初期値により、変数Xを初期化する(S26)。すなわち、変数Xに0100Hが代入される。そのため、Step7で生成される命令差分は、1001H XOR 0100H=1101Hとなる。また、INIT命令が挿入されたStep5で生成される命令差分は、1111H XOR −11−H=1001Hとなる。Step8では、生成される命令差分は、1000H XOR 1101H=0101Hとなる。
【0058】
図11は、図10に示した命令差分からオペコードを復号化する例を示す図である。図11は、図10のStep3において、分岐処理が発生しなかった(分岐条件を満たさなかった)場合の例である。オペコードの復号化処理は、実施の形態1と同様に、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成と同様に排他論理和により行う。
【0059】
Step1では、命令フェッチ回路200により、命令差分1100Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分1100Hと、保持回路310の値である0100Hと、の排他論理和により求められる。すなわち、命令復号回路320により復号化されるオペコードは、1100H XOR 0100H=1000(ADD)となる。また、命令差分1100Hは、保持回路310に入力され、次のステップ(Step2)の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2では、復号化されるオペコードは、0000H XOR 1100H=1100H(CMP)となる。
【0060】
Step3では、復号化されるオペコードは、1110H XOR 0000H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図11の例では、分岐条件を満たさないため、命令実行部400は、リセット信号S4を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【0061】
Step4では、復号化されるオペコードは、0110H XOR 1110H=1000H(ADD)となる。Step5では、復号化されるオペコードは、1001H XOR 0110H=1111H(INIT)となる。Step5では命令実行部400によるINIT命令が実行により、命令実行部400は、保持回路310にリセット信号S4を入力する。保持回路310にリセット信号S4が入力されることにより、次のステップ(Step7)で用いる保持回路310の値が初期化される。なお、Step6は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【0062】
Step7では、リセット信号S4により、保持回路310の値は0100Hとなっている。よって、復号化されるオペコードは、1101H XOR 0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、0101H XOR 1101H=1000H(ADD)となる。
【0063】
続いて、図10のStep3において、分岐処理が発生した(分岐条件を満たした)場合の例を図12に示す。図12は、図10に示した命令差分からオペコードを復号化する例を示す図である。
【0064】
Step1では、命令復号回路320により復号化されるオペコードは、1100H XOR 0100H=1000(ADD)となる。また、命令差分1100Hは、保持回路310に入力され、次のステップ(Step2)の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2では、復号化されるオペコードは、0000H XOR 1100H=1100H(CMP)となる。
【0065】
Step3では、復号化されるオペコードは、1110H XOR 0000H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図11の例では、分岐条件を満たすため、命令実行部400はリセット信号S4を保持回路310に出力する。また、分岐条件を満たしたため、分岐先のStep7から処理が再開される。
【0066】
Step7では、リセット信号S4が入力されたことにより、保持回路310の値は0100Hとなる。よって、復号化されるオペコードは、1101H XOR 0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、0101H XOR 1101H=1000H(ADD)となる。
【0067】
上記一連の処理により、排他論理和演算によっても命令差分(符号化命令コード)の生成、及びオペコード(実行対象のプログラムの命令コード)の復号化を行うことができる。本実施の形態では、排他論理和演算を行う命令復号回路320は、XORゲートのみで構成することができる。命令復号回路320を構成する為の素子がXORゲートのみであるため、半導体装置500の回路規模を削減することが可能となる。さらに、排他論理和による演算は、加算減算に比べて処理速度が向上する。そのため、命令コードの復号化処理速度の向上を図ることができる。また、実施の形態1と同様に、セキュリティ機能が向上したプログラム秘匿システムを提供することが可能である。
【0068】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、命令差分の生成演算を加算処理により行い、オペコードの復号化に減算処理を行ってもよい。
【符号の説明】
【0069】
1 プログラム秘匿システム
100 符号データ生成部
110 ソフトウェア開発ツール
111 符号コード生成演算部
120 外部記憶装置
200 命令フェッチ回路
300 命令復号部
310 保持回路
320 命令復号回路
330 初期値入力回路
400 命令実行部
500 半導体装置
【技術分野】
【0001】
本発明はプログラム秘匿システムおよびプログラム秘匿方法に関し、特にセキュリティ性を考慮したプログラム秘匿システム、プログラム秘匿方法に関する。
【背景技術】
【0002】
従来の半導体記憶装置、及びマイクロコンピュータでは、メモリセルアレイ中に記憶されているデータが不当にコピーされる恐れがある。そのため、メモリセルアレイ中で保持されているデータを不当なコピーから保護する様々な手段が講じられている。特に、半導体記憶装置、及びマイクロコンピュータの誤作動防止のため、これらのメモリセルアレイ中に記憶されている命令コード、及び演算コードの暗号化は重要である。また、メモリセルアレイ中に記憶されている命令コード、及び演算コードの解析困難性の向上を図ることが望ましい。
【0003】
特許文献1には、データを暗号化した上でプログラムメモリ内に格納する半導体記憶装置が記載されている。当該半導体記憶装置は、プログラムメモリ内に、記憶対象データを暗号化したデータと、暗号化に利用した暗号キーと、を格納する。当該半導体装置では、データ読み出しに先立って暗号キーを記憶したプログラムメモリにアクセスしないと、誤った演算処理が行われる。これにより、記憶対象データを不当なコピーから保護することができる。
【0004】
特許文献2に記載のソフトウェア機密漏洩防止方法では、プログラムメモリと、中央処理装置と、の間に、固有の論理を組んだデータ変換要素を組み込む。当該方法では、プログラムメモリにプログラムの実行命令を暗号化した上で書き込む。中央処理装置によりプログラムメモリの内容を読み取る際に、データ変換要素により暗号化されたプログラムの実行命令を復号化する。
【0005】
特許文献3に記載のデータセキュリティシステムでは、実行プログラムの命令に一定値を用いた所定の演算により変換したデータをメモリに書き込む。読み出す際には、一定値を用いた所定の演算を行うことにより、実行プログラムの命令を復号化する。メモリ内に実行プログラムの命令を直接書き込む構成ではないため、セキュリティ性能を高めることができる。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開平9−312099号公報
【特許文献2】特開昭59−112341号公報
【特許文献3】特開2000−029790号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、上述の装置や方法では以下の問題がある。特許文献1に記載の半導体記憶装置では、暗号データとともに、暗号キーをプログラムメモリから読み出す必要が生じ、パフォーマンスが低下する。また、同一プログラムメモリ内に暗号データと、暗号化データと、を格納するため、プログラムメモリ内のデータが漏洩した場合、データが容易に復号化できてしまう。また、特許文献2及び特許文献3の技術では、暗号化に用いる暗号キーが一定であるため、一度暗号キーが漏洩した場合、データの復号化が容易である。すなわち、上述の装置や方法では、セキュリティ上の問題がある。
【課題を解決するための手段】
【0008】
本発明にかかるプログラム秘匿システムの一態様は、情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるものである。
【0009】
本発明においては、実行対象のプログラムの命令コードを保持回路内の共通鍵で符号化し、生成された符号化コードを保持回路の保持する共通鍵として逐次上書きする。保持回路に保持される共通鍵が逐次書き変わることにより、一度共通鍵の漏洩が起きた場合であっても、以後の影響を小さくすることができる。
【発明の効果】
【0010】
本発明によれば、セキュリティ性能に優れたプログラム秘匿システムを提供することができる。
【図面の簡単な説明】
【0011】
【図1】実施の形態1にかかるプログラム秘匿システムの基本構成を示すブロック図である。
【図2】実施の形態1にかかる命令差分の生成にかかるフローチャートある。
【図3】実施の形態1にかかるオペコードの復号化にかかるフローチャートである。
【図4】実施の形態1にかかるアセンブリ言語で記述されたオペコードを示す図である。
【図5】実施の形態1にかかるサンプルプログラムから命令差分を生成する例を示す図である。
【図6】実施の形態1にかる命令差分からオペコードを復号化する例を示す図である。
【図7】実施の形態1にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図8】実施の形態1にかかる命令差分からオペコードを復号化する例を示す図である。
【図9】実施の形態1にかかる命令差分からオペコードを復号化する例を示す図である。
【図10】実施の形態2にかかる分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。
【図11】実施の形態2にかかる命令差分からオペコードを復号化する例を示す図である。
【図12】実施の形態2にかかる命令差分からオペコードを復号化する例を示す図である。
【発明を実施するための形態】
【0012】
本発明の実施の形態1
以下、図面を参照して本発明の実施の形態について説明する。まず、図1を参照して、本実施の形態1にかかるプログラム秘匿システムの基本構成について説明する。プログラム秘匿システム1は、符号データ生成部100と、半導体装置500と、を備える。半導体装置500は、命令フェッチ回路200と、命令復号部300と、命令実行部400と、を備える。半導体装置500の一例として、マイクロコンピュータが挙げられる。
【0013】
符号データ生成部100は、ソフトウェア開発ツール110と、外部記憶装置120と、を備える。ソフトウェア開発ツール110は、半導体装置500に実行させるソフトウェアを開発する為のツールである。ソフトウェア開発ツール110は、Cコンパイラ、アセンブラ、リンカ、Flashライタ等のツールから構成される。ソフトウェア開発ツール110は、符号コード生成演算部111を備える。符号コード生成演算部111は、実行対象のプログラムの1ステップ毎に、実行対象のプログラムの命令コード(以後、オペコードとも記載する。)を符号化した符号化命令コード(以後、命令差分とも記載する。)を生成し、命令差分信号S7として外部記憶装置120へ出力する。命令差分は、1ステップ後の符号コード生成演算部111によるオペコードの符号化に用いられ、かつ、復号化回路330による符号化命令コードを復号化に用いられる。すなわち、命令差分は1ステップ後の符号化、及び復号化の共通鍵として用いられる。なお、図示しないが、ソフトウェア開発ツール110は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて外部記憶装置120へ出力する。
【0014】
外部記憶装置120は、ソフトウェア開発ツール110が出力する命令差分(S7)を記憶するための記憶装置である。外部記憶装置120は、実行対象のプログラムのアドレスを示す信号S5に応じて、命令差分を信号S6として命令フェッチ回路200へ出力する。なお、本実施の形態では、外部記憶装置120は、半導体装置500の外部に配置されているが、これに限られず、外部記憶装置120を半導体装置500の内部に配置してもよい。
【0015】
命令フェッチ回路200は、実行対象のプログラムを外部記憶装置120から取得する回路である。命令フェッチ回路200は、実行対象のプログラムのアドレスを示す信号S5を外部記憶装置120へ出力する。命令フェッチ回路200には、S5に応じた命令差分信号S6が外部記憶装置120から入力される。命令フェッチ回路200は、外部記憶装置120から入力された命令差分を信号S1として命令復号部300へ出力する。なお、図示しないが、命令フェッチ回路200は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて命令復号部300へ出力する。
【0016】
命令復号部300は、命令フェッチ回路200から入力された命令差分(S1)を本来のオペコードに復号化する為の回路である。命令復号部300は、保持回路310と、命令復号回路320と、初期値入力回路330と、を備える。保持回路310は、命令フェッチ回路200から入力される命令差分(S1)を保持する為の回路である。また、命令実行部400からリセット信号S4が保持回路310に入力された場合、保持回路310は、初期値入力回路330からの初期値の入力を要求する信号S9を出力する。初期値入力回路330から初期値(S8)が入力された場合、保持回路310は、初期値入力回路330から入力された初期値(S8)を命令差分(S1)に代わり保持する。保持回路310が保持する値は、プログラムの実行ステップ毎に更新される。詳細な具体例は、後述する。
【0017】
命令復号回路320は、命令フェッチ回路200から入力される命令差分(S1)を、保持回路310から入力される命令差分(S2)を用いることにより、本来のオペコードに復号化する。命令復号回路320により復号化されたオペコードは、信号S3として命令実行部400へ出力される。なお、図示しないが、命令復号回路320は、オペコードにより演算対象となる実行対象のプログラムデータ(オペランド)も併せて命令実行部400へ出力する。
【0018】
初期値入力回路330は、保持回路310にリセット信号S4が入力された際に、保持回路310に所定の初期値を入力する為の回路である。なお、保持回路310にリセット信号S4が入力された際に、保持回路310に所定の初期値(S9)を入力するものであれば、他の構成であってもよい。
【0019】
命令実行部400は、命令復号回路320が復号化したオペコードを用いて、プログラムを1ステップ毎に実行する処理部である。命令実行部400は、プログラム実行において、分岐処理が発生した場合に、リセット信号S4を保持回路310に出力する。
【0020】
続いて、図2を用いて、符号コード生成演算部111による命令差分の生成処理について説明する。図2は、符号コード生成演算部111による命令差分の生成手順を示すフローチャートである。
【0021】
始めに、符号コード生成演算部111は変数Xを初期化する(S21)。変数Xは、命令差分をプログラム実行の1ステップ毎に保持するための変数である。この際の初期化に用いる初期値は、任意の値でよいが、後述の初期値入力回路330が出力する初期値と同じ値とする必要がある。本実施の形態では、初期値を0100Hとする。
【0022】
次に、符号コード生成演算部111は、実行対象のプログラムからオペコードを取得し(S22)、取得したオペコードの命令種別が分岐先処理に該当するか否かを判定する(S23)。取得したオペコードが分岐先処理であった場合(S23:Yes)、符号コード生成演算部111は、保持回路310の値を初期化する為のINIT命令を命令差分信号S7として外部記憶装置120へ出力する。一方、取得したオペコードが分岐先処理ではなかった場合(S23:No)、符号コード生成演算部111は、取得したオペコードがプログラムの先頭を示す処理であるか否かを判定する(S24)。取得したオペコードがプログラムの先頭を示す処理である場合(S24:Yes)、符号コード生成演算部111は、変数Xを初期値0100Hで初期化し(S26)、その後、命令差分生成処理(S27)を行う。一方、取得したオペコードがプログラムの先頭を示す処理ではない場合(S24:No)、命令差分生成処理(S27)に遷移する。
【0023】
符号コード生成演算部111は、オペコードと、変数Xに格納された値と、から新たな命令差分を生成する(S27)。新たな命令差分の生成は、所定の演算により行う。例えば、オペコードと、変数Xに格納された値と、の減算により行う。ソフトウェア開発ツール110は、生成された命令差分を命令差分信号S7として外部記憶装置120へ出力する。
【0024】
符号コード生成演算部111は、変数Xに生成した命令差分を代入する(S28)。すなわち、符号コード生成演算部111は、生成した命令差分により変数Xの値を上書きする(S28)。符号コード生成演算部111は、実行プログラムの1ステップに対応するオペコードの命令差分の生成(S22〜S28)が終わった後、実行対象プログラムの終端まで到達したか否かを判定する(S29)。
【0025】
実行対象プログラムの終端まで到達した場合(S29:Yes)、符号コード生成演算部111は、命令差分の生成処理を終了する。一方、実行対象プログラムの終端まで到達していない場合(S29:No)、符号コード生成演算部111は、次のステップのオペコードの命令差分の生成(S22〜S28)を実行する。
【0026】
続いて、図3を用いて、半導体装置500内における、命令差分からのオペコードの復号化、及びプログラム実行処理について説明する。図3は、半導体装置500内でのオペコードの復号化手順を示すフローチャートである。
【0027】
始めに、保持回路310の初期化を行う(S31)。ここで、初期化に用いる初期値は、符号コード生成演算部111が用いる初期値と同じ値にする。本実施の形態では、初期値は0100Hとなる。続いて、命令フェッチ回路200が外部記憶装置120から実行プログラムの1ステップ毎の命令差分を取得する(S32)。命令フェッチ回路200は、取得した命令差分を命令復号部300へ出力する。
【0028】
命令復号回路320は、入力された命令差分と、保持回路310が保持する値と、に基づいて所定の演算を行うことでオペコードを復号化する(S33)。この際の所定の演算は、符号コード生成演算部111による命令差分生成に用いた演算と対応付けられたものである。例えば、符号コード生成演算部111が減算処理により命令差分を生成した場合、命令復号回路320は、加算処理によりオペコードの復号化を行う。詳細な具体例は後述する。命令復号回路320は、復号化したオペコードを命令実行部400へ出力する。
【0029】
命令実行部400は、入力されたオペコードを用いて1ステップ毎にプログラムの実行を行う。命令実行部400は、入力されたオペコードが分岐命令である場合(S34:Yes)には、保持回路310を初期値0100Hで初期化する(S36)。また、命令実行部400が保持回路310の初期化命令(INIT命令)を出力した場合にも(S34:Yes)、保持回路310を初期値0100Hで初期化する(S36)。一方、入力されたオペコードが分岐命令でなく、かつ命令実行部400からの初期化命令が入力されなかった場合(S34:No)、保持回路310の値を命令フェッチ回路200から入力された命令差分で更新する(S35)。
【0030】
上記のプログラム1ステップに対応するオペコードの復号化、及びプログラム実行処理(S32〜S36)が終了した場合、次のステップのオペコードの復号化、及びプログラム実行処理(S32〜S36)を実行する。
【0031】
続いて、アセンブラ言語による具体例を示し、本実施の形態にかかるオペコードからの命令差分の生成、及び命令差分からのオペコードの復号化について説明する。図4は、以下の説明で用いるオペコードの具体例を示す。例えば、ADD命令のオペコードは、1000Hであり、演算対象(オペランド)を加算する為に用いる。また、INIT命令は、本実施の形態にかかるプログラム実行固有の命令である。INIT命令は、保持回路310を初期化するために用いる。なお、各命令のオペランド部分は、本実施の形態に示す動作に直接関係がないため、記載を省略している。
【0032】
図5は、符号コード生成演算部111によりサンプルプログラムから命令差分を生成する例を示す図である。図5は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。命令差分は、図2に示したフローチャートに沿って生成される。なお、図5の例では、符号コード生成演算部111が用いる初期値は0100Hとする。また、図5の例では、符号コード生成演算部111は、オペコードと、変数Xの値と、の減算により命令差分を生成する。
【0033】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(S26)。そのため、生成される命令差分は、1000H−0100H=0F00Hとなる。Step2では、分岐先命令ではなく(S23:No)、かつプログラムの先頭でもない(S24:No)。そのため変数Xの初期化は行われず、生成される命令差分は、1001H-0F00H=0101Hとなる。同様に、Step3では、生成される命令差分は、1000H−0101H=0EFFHとなる。Step4では、生成される命令差分は、1001H−0EFFH=0102Hとなる。
【0034】
図6は、図5に示した命令差分からオペコードを復号化する例を示す図である。図6は、命令差分と、保持回路310の保持する値と、復号化されたオペコードと、をプログラムの1ステップ毎に示している。オペコードの復号化は、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。すなわち、オペコードの復号化は、命令復号回路320に入力された命令差分と、保持回路310から出力される値と、の加算により実現する。保持回路310の初期値は、符号コード生成演算部111が用いる初期値と同じ0100Hが設定されている。
【0035】
Step1では、命令フェッチ回路200により命令差分0F00Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分0F00Hと、保持回路310の値である0100Hと、の加算により求められる。すなわち、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。
【0036】
Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。ここで、Step2で入力された命令差分は0101Hである。また、保持回路310の値(前回のステップで保持回路310に入力された命令差分)は0F00Hである。よって復号化されるオペコードは、0101H+0F00H=1001H(SUB)となる。同様に、Step3では、復号化されるオペコードは、0EFFH+0101H=1000H(ADD)となる。Step4では、復号化されるオペコードは、0102H+0EFFH=1001H(SUB)となる。
【0037】
続いて、分岐処理を有するサンプルプログラムから命令差分を生成する例を示す図である。図7は、符号コード生成演算部111により、分岐処理を含むサンプルプログラムから命令差分を生成する例を示す図である。図7は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。命令差分は、図2に示したフローチャートに沿って生成される。なお、図7の例でも、符号コード生成演算部111が用いる初期値は0100Hとする。また、図7の例でも、符号コード生成演算部111は、オペコードと、変数Xの値と、の減算により命令差分を生成する。
【0038】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(s26)。そのため、生成される命令差分は、1000H−0100H=0F00Hとなる。Step2では、生成される命令差分は、1100H−0F00H=0200Hとなる。同様に、Step3では、生成される命令差分は、1110H−0200H=0F10Hとなる。Step4では、生成される命令差分は、1000H−0F10H=00F0Hとなる。Step5は、Step7での命令差分生成処理により挿入されるINIT命令である。Step6は、分岐先を示すラベルがアセンブリ言語で記載されており、何らの演算を行うものではない。そのため、オペコードは存在せず、命令差分の生成処理は行わない。
【0039】
Step7は、Step3の分岐命令(BNE(Branch Not Equal)命令)の分岐先に該当するステップである(S23:Yes)。そのため、符号コード生成演算部111は、分岐先を示すラベル(Step6)の直前(Step5)にINIT命令を挿入する(S25)。また、符号コード生成演算部111は、保持回路310の初期化に用いる初期値により、変数Xを初期化する(S26)。すなわち、変数Xに0100Hが代入される。そのため、Step7で生成される命令差分は、1001H−0100H=0F01Hとなる。また、INIT命令が挿入されたStep5で生成される命令差分は、1111H−00F0H=1021Hとなる。Step8では、生成される命令差分は、1000H−0F01H=00FFHとなる。
【0040】
図8は、図7に示した命令差分からオペコードを復号化する例を示す図である。図8は、図7のStep3において、分岐処理が発生しなかった(分岐条件を満たさなかった)場合の例である。オペコードの復号処理は、図6の例と同様に、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成に減算を用いたため、加算によって実現する。保持回路310の初期値は、符号コード生成演算部111が用いる初期値と同じ0100Hが設定されている。
【0041】
Step1では、命令フェッチ回路200により、命令差分0F00Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分0F00Hと、保持回路310の値である0100Hと、の加算により求められる。すなわち、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。Step2では、復号化されるオペコードは、0200H+0F00H=1100H(CMP)となる。
【0042】
Step3では、命令復号回路320により復号化されるオペコードは、保持回路310の値(Step2での命令差分である0200H)と、入力される命令差分0F10Hと、を加算した値となる。すなわち、命令復号回路320により復号化されるオペコードは、0200H+0F10H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図8の例では、分岐条件を満たさないため、命令実行部400は、リセット信号S4を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【0043】
Step4では、復号化されるオペコードは、0F10H+00F0H=1000H(ADD)となる。Step5では、復号化されるオペコードは、00F0H+1021H=1111H(INIT)となる。Step5では命令実行部400によるINIT命令が実行により、命令実行部400は、保持回路310にリセット信号S4を入力する。保持回路310にリセット信号S4が入力されることにより、次のステップ(Step7)で用いる保持回路310の値が初期化される。なお、Step6は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【0044】
Step7では、リセット信号S4により、保持回路310の値は0100Hとなっている。よって、復号化されるオペコードは、0F01H+0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、00FFH+0F01H=1000H(ADD)となる。
【0045】
続いて、図7のStep3において、分岐処理が発生した(分岐条件を満たした)場合の例を図9に示す。図9は、図7に示した命令差分からオペコードを復号化する例を示す図である。
【0046】
Step1では、命令復号回路320により復号化されるオペコードは、0F00H+0100H=1000H(ADD)となる。また、命令差分0F00Hは、保持回路310に入力され、次のステップ(Step2)の演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2でも、復号化されるオペコードは、入力された命令差分と、保持回路310から出力される値と、の加算により求められる。Step2では、復号化されるオペコードは、0200H+0F00H=1100H(CMP)となる。
【0047】
Step3では、命令復号回路320により復号化されるオペコードは、0F10H+0200H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図9の例では、分岐条件を満たすため、命令実行部400はリセット信号S4を保持回路310に出力する。また、分岐条件を満たしたため、分岐先のStep7から処理が再開される。
【0048】
Step7では、リセット信号S4が入力されたことにより、保持回路310の値は0100Hとなる。よって、復号化されるオペコードは、0F01H+0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、00FFH+0F01H=1000H(ADD)となる。
【0049】
次に、本実施の形態におけるプログラム秘匿システムの効果について説明する。まず、本実施の形態にかかるプログラム秘匿システムでは、情報記憶メモリ(メモリセルアレイ)と別に設けられた保持回路310によって、復号化を行うための共通鍵(命令差分)が保持される。これにより、情報記憶メモリ内のデータの不当なコピーにより、共通鍵が漏洩することはない。また、共通鍵を情報記憶メモリではなく、保持回路310に保持させることにより、共通鍵の取得時に情報記憶メモリにアクセスする必要がなくなる。これにより、パフォーマンスの向上が図れる。
【0050】
符号データ生成部100は、オペコード(実行対象のプログラムの命令コード)と、保持回路が保持する命令差分(保持回路が保持する共通鍵)に基づいて新たな命令差分(符号化命令コード)を生成する。生成した命令差分により保持回路310が保持する共通鍵を上書きすることにより、以降のステップで利用する共通鍵が逐一書き変わることとなる。これにより、一度保持回路310の共通鍵が漏洩した場合であっても、その値を用いて以後のプログラム実行に用いるオペコードを復号化することはできない。よって、セキュリティ機能の向上したプログラムの符号化、及び復号化を実行することができる。また、オペコードの復号化を行う命令復号回路320は、符号生成演算部100による命令差分の生成演算と対応付けられた演算を行うようにするのみで容易に構成することができる。
【0051】
命令処理部400は、命令復号回路320により復号化されたオペコードを実行し、分岐先命令処理にかかるオペコードである場合、保持回路310の値を所定の初期値でリセットする。これにより、実行対象のプログラムが分岐処理を有する場合であっても、正確にプログラム実行を行うことができる。
【0052】
さらに、命令差分の生成、及びオペコードの復号化は、加算減算という基本的な論理演算により行うことができる。そのため、上述のオペコードの復号化等は、基本論理回路を組み合わせることにより、容易に既存のマイクロコンピュータに適応することができる。
【0053】
本発明の実施の形態2
本発明の実施の形態2は、命令差分の生成、及びオペコードの復号化のための演算に排他論理和を用いることを特徴とする。以下に、実施の形態1と異なる部分を説明する。なお、プログラム秘匿システム1の基本構成(図1)、命令差分の生成フロー(図2)、及びオペコードの復号化フロー(図3)は、実施の形態1と同じであるため、説明を省略する。
【0054】
図10は、本実施の形態にかかる命令差分の生成の実行例を示す図である。図10は、アセンブリ言語による命令種別と、オペコードと、変数Xの値と、生成される命令差分と、をプログラムの1ステップ毎に示している。図10の例では、符号コード生成演算部111が用いる初期値は0100Hとする。
【0055】
Step1では、プログラムの先頭と判定されるため(S24:Yes)、変数Xが0100Hに初期化される(s26)。そのため、生成される命令差分は、1000H XOR 0100H=1100Hとなる。Step2では、分岐先命令ではなく(S23:No)、かつプログラムの先頭でもない(S24:No)。そのため、生成される命令差分は、1100H XOR 1100=0000Hとなる。以下同様に命令差分を生成する。
【0056】
Step3では、生成される命令差分は、1110H XOR 0000H=1110Hとなる。Step4では、生成される命令差分は、1000H XOR 1110H=0110Hとなる。Step5は、Step7での命令差分生成処理により挿入されるINIT命令である。Step6は、分岐先を示すラベルがアセンブリ言語で記載されており、何らかの演算を行うものではないため、オペコードの復号化は行われない。
【0057】
Step7は、Step3の分岐命令(BNE命令)の分岐先に該当するステップである(S23:Yes)。そのため、符号コード生成演算部111は、分岐先を示すラベル(Step6)の直前(Step5)にINIT命令を挿入する(S25)。また、符号コード生成演算部111は、保持回路310の初期化に用いる初期値により、変数Xを初期化する(S26)。すなわち、変数Xに0100Hが代入される。そのため、Step7で生成される命令差分は、1001H XOR 0100H=1101Hとなる。また、INIT命令が挿入されたStep5で生成される命令差分は、1111H XOR −11−H=1001Hとなる。Step8では、生成される命令差分は、1000H XOR 1101H=0101Hとなる。
【0058】
図11は、図10に示した命令差分からオペコードを復号化する例を示す図である。図11は、図10のStep3において、分岐処理が発生しなかった(分岐条件を満たさなかった)場合の例である。オペコードの復号化処理は、実施の形態1と同様に、図3に示したフローチャートに沿って実行される。オペコードの復号化に用いる演算は、命令差分の生成と同様に排他論理和により行う。
【0059】
Step1では、命令フェッチ回路200により、命令差分1100Hが取得される。よって、命令復号回路320により復号化されるオペコードは、命令差分1100Hと、保持回路310の値である0100Hと、の排他論理和により求められる。すなわち、命令復号回路320により復号化されるオペコードは、1100H XOR 0100H=1000(ADD)となる。また、命令差分1100Hは、保持回路310に入力され、次のステップ(Step2)の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2では、復号化されるオペコードは、0000H XOR 1100H=1100H(CMP)となる。
【0060】
Step3では、復号化されるオペコードは、1110H XOR 0000H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図11の例では、分岐条件を満たさないため、命令実行部400は、リセット信号S4を出力しない。そのため、そのまま次のオペコードの復号化及びプログラムの実行に制御が移る。
【0061】
Step4では、復号化されるオペコードは、0110H XOR 1110H=1000H(ADD)となる。Step5では、復号化されるオペコードは、1001H XOR 0110H=1111H(INIT)となる。Step5では命令実行部400によるINIT命令が実行により、命令実行部400は、保持回路310にリセット信号S4を入力する。保持回路310にリセット信号S4が入力されることにより、次のステップ(Step7)で用いる保持回路310の値が初期化される。なお、Step6は分岐先を示すラベルに過ぎず、何らの命令を示すものではないため、オペコードの復号化は行われない。
【0062】
Step7では、リセット信号S4により、保持回路310の値は0100Hとなっている。よって、復号化されるオペコードは、1101H XOR 0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、0101H XOR 1101H=1000H(ADD)となる。
【0063】
続いて、図10のStep3において、分岐処理が発生した(分岐条件を満たした)場合の例を図12に示す。図12は、図10に示した命令差分からオペコードを復号化する例を示す図である。
【0064】
Step1では、命令復号回路320により復号化されるオペコードは、1100H XOR 0100H=1000(ADD)となる。また、命令差分1100Hは、保持回路310に入力され、次のステップ(Step2)の排他論理和演算に用いられる。復号化されたオペコードは、命令実行部400により実行される(以降でも同様である)。Step2では、復号化されるオペコードは、0000H XOR 1100H=1100H(CMP)となる。
【0065】
Step3では、復号化されるオペコードは、1110H XOR 0000H=1110H(BNE)となる。そして、命令実行部400により、当該オペコードを用いた演算が実行される。図11の例では、分岐条件を満たすため、命令実行部400はリセット信号S4を保持回路310に出力する。また、分岐条件を満たしたため、分岐先のStep7から処理が再開される。
【0066】
Step7では、リセット信号S4が入力されたことにより、保持回路310の値は0100Hとなる。よって、復号化されるオペコードは、1101H XOR 0100H=1001H(SUB)となる。Step8では、復号化されるオペコードは、0101H XOR 1101H=1000H(ADD)となる。
【0067】
上記一連の処理により、排他論理和演算によっても命令差分(符号化命令コード)の生成、及びオペコード(実行対象のプログラムの命令コード)の復号化を行うことができる。本実施の形態では、排他論理和演算を行う命令復号回路320は、XORゲートのみで構成することができる。命令復号回路320を構成する為の素子がXORゲートのみであるため、半導体装置500の回路規模を削減することが可能となる。さらに、排他論理和による演算は、加算減算に比べて処理速度が向上する。そのため、命令コードの復号化処理速度の向上を図ることができる。また、実施の形態1と同様に、セキュリティ機能が向上したプログラム秘匿システムを提供することが可能である。
【0068】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、命令差分の生成演算を加算処理により行い、オペコードの復号化に減算処理を行ってもよい。
【符号の説明】
【0069】
1 プログラム秘匿システム
100 符号データ生成部
110 ソフトウェア開発ツール
111 符号コード生成演算部
120 外部記憶装置
200 命令フェッチ回路
300 命令復号部
310 保持回路
320 命令復号回路
330 初期値入力回路
400 命令実行部
500 半導体装置
【特許請求の範囲】
【請求項1】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、
実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、
前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるプログラム秘匿システム。
【請求項2】
前記符号データ生成演算部は、実行対象のプログラムの命令コードが分岐先処理である場合、前記共通鍵をリセットする命令を実行対象のプログラムの実行位置の直前に挿入することを特徴とする請求項1に記載のプログラム秘匿システム。
【請求項3】
前記所定ステップは、1命令であることを特徴とする請求項1または請求項2に記載のプログラム秘匿システム。
【請求項4】
前記符号データ生成演算部による符号化は減算処理により行い、前記命令復号回路による復号化は加算処理により行う、
または、
前記符号データ生成演算部による符号化は加算処理により行い、前記命令復号回路による復号化は減算処理により行う、ことを特徴とする請求項1乃至請求項3に記載のプログラム秘匿システム。
【請求項5】
前記符号データ生成演算部による符号化、および、前記命令復号回路による復号化は排他論理和処理により行うことを特徴とする請求項1乃至請求項3に記載のプログラム秘匿システム。
【請求項6】
実行対象のプログラムの命令コードを一時記憶のための保持回路に格納された共通鍵により符号化した符号化命令コードを生成するとともに、当該符号化命令コードで前記共通鍵を所定ステップ毎に上書きする命令符号化ステップと、
前記共通鍵を使用して前記符号化命令コードを復号化する命令復号化ステップと、
前記命令復号化ステップにおいて復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理ステップと、
を備えるプログラム秘匿方法。
【請求項7】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を、符号化命令コードの生成を行う外部システムから入力される度に上書きして保持する保持回路と、
前記保持回路から出力される前記共通鍵を使用して、前記外部システムから入力された符号化命令コードを命令コードに復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるマイクロコンピュータ。
【請求項1】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を一時的に保持する保持回路と、
実行対象のプログラムの命令コードを、前記共通鍵を使用して符号化した符号化命令コードを生成するとともに、前記共通鍵を当該符号化命令コードで所定ステップ毎に上書きする為の信号を前記保持回路に出力する符号データ生成演算部と、
前記保持回路から出力される前記共通鍵を使用して、前記符号化命令コードを復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるプログラム秘匿システム。
【請求項2】
前記符号データ生成演算部は、実行対象のプログラムの命令コードが分岐先処理である場合、前記共通鍵をリセットする命令を実行対象のプログラムの実行位置の直前に挿入することを特徴とする請求項1に記載のプログラム秘匿システム。
【請求項3】
前記所定ステップは、1命令であることを特徴とする請求項1または請求項2に記載のプログラム秘匿システム。
【請求項4】
前記符号データ生成演算部による符号化は減算処理により行い、前記命令復号回路による復号化は加算処理により行う、
または、
前記符号データ生成演算部による符号化は加算処理により行い、前記命令復号回路による復号化は減算処理により行う、ことを特徴とする請求項1乃至請求項3に記載のプログラム秘匿システム。
【請求項5】
前記符号データ生成演算部による符号化、および、前記命令復号回路による復号化は排他論理和処理により行うことを特徴とする請求項1乃至請求項3に記載のプログラム秘匿システム。
【請求項6】
実行対象のプログラムの命令コードを一時記憶のための保持回路に格納された共通鍵により符号化した符号化命令コードを生成するとともに、当該符号化命令コードで前記共通鍵を所定ステップ毎に上書きする命令符号化ステップと、
前記共通鍵を使用して前記符号化命令コードを復号化する命令復号化ステップと、
前記命令復号化ステップにおいて復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理ステップと、
を備えるプログラム秘匿方法。
【請求項7】
情報記憶メモリと別に設けられ、実行プログラムの命令コードの符号化、および、復号化に用いる共通鍵を、符号化命令コードの生成を行う外部システムから入力される度に上書きして保持する保持回路と、
前記保持回路から出力される前記共通鍵を使用して、前記外部システムから入力された符号化命令コードを命令コードに復号化する命令復号回路と、
前記命令復号回路が復号化した命令コードが入力され、入力された命令コードに基づいて命令演算を行うとともに、入力された命令コードが分岐先処理にかかる命令コードである場合、前記共通鍵を初期化するリセット信号を出力する命令処理部と、を備えるマイクロコンピュータ。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【公開番号】特開2011−81429(P2011−81429A)
【公開日】平成23年4月21日(2011.4.21)
【国際特許分類】
【出願番号】特願2009−230572(P2009−230572)
【出願日】平成21年10月2日(2009.10.2)
【出願人】(302062931)ルネサスエレクトロニクス株式会社 (8,021)
【Fターム(参考)】
【公開日】平成23年4月21日(2011.4.21)
【国際特許分類】
【出願日】平成21年10月2日(2009.10.2)
【出願人】(302062931)ルネサスエレクトロニクス株式会社 (8,021)
【Fターム(参考)】
[ Back to top ]