(57)【要約】【課題】プログラムが未定義命令に書き変わった場合のみならず、未定義以外の命令に書き変わった場合においても、ＣＰＵの動作を制限することによってセキュリティの向上を図る。【解決手段】情報処理装置（１０７）は、コンパイラによってコンパイルされたプログラムを記憶する記憶装置（２２０）と、上記記憶装置に記憶されたプログラムを構成する命令コードをフェッチして実行可能なＣＰＵ（２１０）とを含む。そして、上記コンパイラが出力しない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限するためのフィルタ（４３０）を設け、プログラムが未定義命令に書き変わった場合のみならず、未定義以外の命令に書き変わった場合においてもＣＰＵの動作を制限する。【選択図】図２
2011232801.tif 000002
【特許請求の範囲】
【請求項１】
コンパイラによってコンパイルされたプログラムを記憶する記憶装置と、
上記記憶装置に記憶されたプログラムを構成する命令コードをフェッチして実行可能なＣＰＵと、を含む情報処理装置であって、
上記コンパイラが出力しない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限するためのフィルタを含むことを特徴とする情報処理装置。
【請求項２】
上記フィルタは、上記記憶装置に記憶されたプログラムに含まれない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限する請求項１記載の情報処理装置。
【請求項３】
上記フィルタは、上記記憶装置に記憶された命令コードの出現の有無がまとめられた命令コード出現情報を記憶する命令コード出現情報テーブル記憶部を含む請求項２記載の情報処理装置。
【請求項４】
上記命令コード出現情報テーブル記憶部に記憶された命令コードの出現情報は、復号化された命令コードのうち一部のビットを取り出し、当該一部のビットのパタンごとの命令の出現の有無とされる請求項３記載の情報処理装置。
【請求項５】
上記命令コード出現情報テーブル記憶部は、上記記憶装置に記憶されたプログラムに含まれない命令コードが上記ＣＰＵによってフェッチされる際に、上記ＣＰＵの動作を制限するための信号をアサートする機能を有する請求項４記載の情報処理装置。
【請求項６】
上記記憶装置に記憶されたプログラムを構成する命令コードは、１つ前に実行される命令コードに依存した符号化方式で符号化された請求項５記載の情報処理装置。
【請求項７】
上記記憶装置に記憶されたプログラムを構成する命令コードは、１つ前に実行される命令コードと、当該命令コードに対応するアドレス情報とに依存した符号化方式で符号化された請求項５記載の情報処理装置。
【請求項８】
上記ＣＰＵと上記記憶装置との間に、上記符号化方式で符号化された命令コードを復号化する復号化装置が配置され、上記復号化装置は、１つ前に復号化された命令コードを記憶する記憶部と、
１つ前に復号化された命令コードが一意に決まらない場合に、当該命令コードに代えて、予め定められた初期値を選択するセレクタと、
上記符号化された命令コードと、上記セレクタの出力との排他的論理和を得る排他的論理和演算回路と、を含んで成る請求項６記載の情報処理装置。
【請求項９】
上記ＣＰＵと上記記憶装置との間に、上記符号化方式で符号化された命令コードを復号化する復号化装置が配置され、上記復号化装置は、上記符号化された命令コードと同じビット長に上記アドレス情報を縮退するアドレス情報縮退装置と、
上記アドレス情報縮退装置によって縮退されたアドレス情報と、上記符号化された命令コードとの排他的論理和を得る第１排他的論理和演算装置と、
１つ前に復号化された命令コードを記憶する記憶部と、
１つ前に復号化された命令コードが一意に決まらない場合に、当該命令コードに代えて、予め定められた初期値を選択するセレクタと、
上記第１排他的論理和演算装置の出力と、上記セレクタの出力との排他的論理和を得る第２排他的論理和演算装置と、を含んで成る請求項７記載の情報処理装置。
【請求項１０】
請求項８記載の情報処理装置を搭載して成るＩＣカード。
【請求項１１】
請求項９記載の情報処理装置を搭載して成るＩＣカード。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶装置からの命令コードの読み出し誤りを検知する技術に関し、例えば、ＩＣカードなどに搭載されるマイクロコンピュータに適用して有効な技術に関する。
【背景技術】
【０００２】
近年、ＩＣカードなどに代表される、暗号処理により情報の漏洩、改竄、複製を防止する情報処理装置に対して、暗号処理中に故意に誤動作を起こさせ、誤った暗号演算処理結果から暗号鍵を推定する手法が問題になっている。こうした手法は１９９６年にＡＴ＆Ｔのベルコア研究所でＲＳＡ暗号に対するアタック手法が開発されて以降、１９９７年にＤＥＳ暗号に対するアタックが開発され、１９９９年にＡＥＳ暗号に対するアタックが開発されるなど、多くの暗号方式に対して、アタックが可能となっている。
【０００３】
そのため、暗号演算のソフトウエアを開発する場合、必ず誤動作に対する対策が盛り込まれている。多くの場合、演算結果の検証を行い、誤った演算結果の時には、結果を出力しないというような対策が行われる。しかし、プログラムの命令フェッチを誤らせることで、こうした検算処理をバイパスさせて、対策を無効化することができてしまう。そのため、プログラムの命令フェッチ誤りを検知する対策方式について、検討が行われている。
【０００４】
例えば、特許文献１には、外部記憶装置にコンピュータの実行プログラムを暗号化して記憶し、それを読み出した場合に、不正命令を検出し、実行を停止する装置が記載されている。このデータ保護装置では、不正命令についての詳しい定義が示されていないが、構成からは未定義命令の検出が行われていると解釈される。特許文献２には、マイクロコンピュータで実行できないような誤った命令語が命令レジスタに格納されると、未定義命令検出部が未定義命令を検出し、未定義命令とラップ割り込み信号を出力するマイクロコンピュータが記載されている。また、特許文献３には、ＩＣチップ上の揮発性メモリのデータが変更されて、意図しない命令が実行されたことを、ＣＰＵのレジスタに格納された命令のオペコードに対応する処理関数を検索し、命令実行プログラムが処理関数を検索できない場合に、不正な攻撃があったとして、ＩＣカードの実行を停止させるＩＣカード用プログラムに関する記述がある。
【０００５】
尚、特許文献４には、予めメモリに格納された暗号化命令コードをリアルタイムで復号化しながら所望の処理を行う情報処理装置が記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−１８５２８号公報
【特許文献２】特開平５−３２４４０８号公報
【特許文献３】特開２００９−１８７４３８号公報
【特許文献４】特開２００９−２５１７９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１〜３に記載された技術によれば、プログラムが書き変わって未定義命令となってしまった場合に、未定義命令を検出して、割り込みやプログラムの停止を行う事で誤動作を防止している。しかし、このような方法について本願発明者が検討したところ、プログラムが未定義命令以外に書き変わった場合にはそれを検出できないため、誤った内容に書き変わった命令を実行し、さらにその後に続く命令をも実行してしまうことが見出された。
【０００８】
セキュリティの向上を図るには、未定義命令だけでなく、プログラム内に出現しない命令がＣＰＵに送られてきた場合にそれを検知して、プログラム実行を停止させる必要がある。また、記憶装置に命令を格納する際の符号化方法を、一つ前の命令に依存した符号化方式とし、その符号化された命令列を復号化することで、記憶装置から読みだされた命令が誤っていた場合、その命令だけでなく、後続する命令列にも影響を与え続けることが、誤動作アタックに対して有効である。
【０００９】
尚、上記特許文献１〜４においては、上記の課題について配慮されていない。
【００１０】
本発明の目的は、プログラムが未定義命令に書き変わった場合のみならず、未定義以外の命令に書き変わった場合においても、ＣＰＵの動作を制限することによってセキュリティの向上を図るための技術を提供することにある。
【００１１】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１２】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１３】
すなわち、情報処理装置は、コンパイラによってコンパイルされたプログラムを記憶する記憶装置と、上記記憶装置に記憶されたプログラムを構成する命令コードをフェッチして実行可能なＣＰＵとを含む。そして、上記コンパイラが出力しない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限するためのフィルタを設ける。
【発明の効果】
【００１４】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００１５】
すなわち、プログラムが未定義命令に書き変わった場合のみならず、未定義以外の命令に書き変わった場合においても、ＣＰＵの動作を制限することによってセキュリティの向上を図るための技術を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】本発明にかかる情報処理装置の一例とされるマイクロコンピュータが搭載されたＩＣカードの説明図である。
【図２】上記マイクロコンピュータの構成例ブロック図である。
【図３】上記マイクロコンピュータにおける記憶装置上に現れるビットパタンの説明図である。
【図４】上記マイクロコンピュータの別の構成例ブロック図である。
【図５】上記マイクロコンピュータの別の構成例ブロック図である。
【図６】上記マイクロコンピュータの別の構成例ブロック図である。
【図７】上記マイクロコンピュータに含まれる復号化装置の構成例ブロック図である。
【図８】上記マイクロコンピュータに含まれる復号化装置の別の構成例ブロック図である。
【図９】上記マイクロコンピュータに含まれる復号化装置の別の構成例ブロック図である。
【図１０】上記復号化装置に含まれる変換部の構成例ブロック図である。
【図１１】上記変換部に含まれる転置部の構成例説明図である。
【図１２】上記変換部に含まれる全単射変換部での全単射変換の説明図である。
【図１３】上記復号化装置に含まれるアドレス情報縮退装置の構成例ブロック図である。
【図１４】上記アドレス情報縮退装置における主要部の構成例回路図である。
【図１５】プログラムの構成を示すフローチャートである。
【図１６】プログラムにおける基本ブロックの説明図である。
【図１７】プログラムにおける基本ブロックの説明図である。
【図１８】プログラムにおける基本ブロックの説明図である。
【図１９】上記マイクロコンピュータに含まれるフィルタの構成例説明図である。
【図２０】上記フィルタに含まれる命令コード出現情報テーブル記憶部に格納された出現情報の説明図である。
【発明を実施するための形態】
【００１７】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１８】
〔１〕本発明の代表的な実施の形態に係る情報処理装置（１０７）は、コンパイラによってコンパイルされたプログラムを記憶する記憶装置（２２０）と、上記記憶装置に記憶されたプログラムを構成する命令コードをフェッチして実行可能なＣＰＵ（２１０）とを含む。そして、上記コンパイラが出力しない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限するためのフィルタ（４３０）を設ける。
【００１９】
上記コンパイラが出力しない命令コードとは、ＣＰＵが解釈可能な命令のうち、アセンブラ命令を直接書き込むなどの方法以外では、ソースコードにどのような記述をしても生成されることのない命令を示す。
【００２０】
上記の構成によれば、フィルタは、上記コンパイラが出力しない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限する。これによって、プログラムが未定義命令に書き変わった場合のみならず、未定義以外の命令に書き変わった場合においても、上記ＣＰＵの動作を制限することができるので、セキュリティの向上を図ることができる。
【００２１】
〔２〕上記〔１〕において、上記コンパイラが出力しない命令コードには、上記記憶装置に記憶されているプログラム内に出現しない命令コードが含まれる。このため上記フィルタは、上記記憶装置に記憶されたプログラムに含まれない命令コードが上記ＣＰＵによってフェッチされる際に、当該命令コードを判別して上記ＣＰＵの動作を制限するように構成することができる。
【００２２】
〔３〕上記〔２〕において、上記フィルタは、上記記憶装置に記憶された命令コードの出現の有無がまとめられた命令コード出現情報を記憶する命令コード出現情報テーブル記憶部（２００２）を含んで構成することができる。かかる構成によれば、命令コード出現情報テーブル記憶部を参照することにより、上記記憶装置に記憶されているプログラム内に出現しない命令に書き変わった場合を容易に判別することができる。
【００２３】
〔４〕上記〔３〕において、上記命令コード出現情報テーブル記憶部に記憶された命令コードの出現情報は、復号化された命令コードのうち一部のビットを取り出し、当該一部のビットのパタンごとの命令の出現の有無とされる。
【００２４】
〔５〕上記〔４〕において、上記命令コード出現情報テーブル記憶部には、上記記憶装置に記憶されたプログラムに含まれない命令コードが上記ＣＰＵによってフェッチされる際に、上記ＣＰＵの動作を制限するための信号（４２０）をアサートする機能を含めることができる。かかる構成によれば、命令コード出現情報テーブル記憶部を参照することにより、上記記憶装置に記憶されているプログラム内に出現しない命令に書き変わった場合に、上記ＣＰＵの動作を制限するための信号（４２０）がアサートされることによって、上記ＣＰＵの動作を容易に制限することができる。ここで上記ＣＰＵの動作の制限には、上記信号（４２０）がアサートされた場合に、所定の割り込み処理に遷移させたり、ＣＰＵ自身をリセットする動作が含まれる。
【００２５】
〔６〕上記〔５〕において、上記記憶装置に記憶されたプログラムを構成する命令コードには、１つ前に実行される命令コードに依存した符号化方式で符号化されたものを適用することができる。
【００２６】
〔７〕上記〔５〕において、上記記憶装置に記憶されたプログラムを構成する命令コードには、１つ前に実行される命令コードと、当該命令コードに対応するアドレス情報とに依存した符号化方式で符号化されたものを適用することができる。
【００２７】
〔８〕上記〔６〕において、上記ＣＰＵと上記記憶装置との間に、上記符号化方式で符号化された命令コードを復号化する復号化装置（６２０）を配置することができる。このとき、上記復号化装置は、１つ前に復号化された命令コードを記憶する記憶部（７２０）と、１つ前に復号化された命令コードが一意に決まらない場合に、当該命令コードに代えて、予め定められた初期値を選択するセレクタ（７４０）と、上記符号化された命令コードと、上記セレクタの出力との排他的論理和を得る排他的論理和演算回路（７５０）とを含んで構成することができる。
【００２８】
上記記憶装置に記憶されたプログラムを構成する命令コードには、１つ前に実行される命令コードに依存した符号化方式で符号化されたものを適用した場合において、上記復号化装置（６２０）によって、上記符号化された命令コードを復号化することができる。また、かかる構成においては、一度復号化を誤ると、それが次の命令コードの復号化に影響するため、以降の命令コードの復号化が全て誤りとなってしまう。このため、誤って復号化された命令コードは、いずれ上記フィルタ（４３０）により判別され、上記信号（４２０）がアサートされる。誤った命令フェッチが続けば続くだけ、ＣＰＵ（２１０）が暴走を続ける確率は指数関数的に減少し、停止する確率は１００％に近づいて行くため、セキュリティの向上を図る上で極めて有効とされる。
【００２９】
〔９〕上記〔７〕において、上記ＣＰＵと上記記憶装置との間に、上記符号化方式で符号化された命令コードを復号化する復号化装置（６２０）を配置することができる。このとき、上記復号化装置には、上記符号化された命令コードと同じビット長に上記アドレス情報を縮退するアドレス情報縮退装置（８２０）と、上記アドレス情報縮退装置によって縮退されたアドレス情報と、上記符号化された命令コードとの排他的論理和を得る第１排他的論理和演算装置（８１０）とが設けられる。また上記復号化装置には、１つ前に復号化された命令コードを記憶する記憶部（７２０）と、１つ前に復号化された命令コードが一意に決まらない場合に、当該命令コードに代えて、予め定められた初期値を選択するセレクタ（７４０）と、上記第１排他的論理和演算装置の出力と、上記セレクタの出力との排他的論理和を得る第２排他的論理和演算装置（７５０）とが設けられる。かかる構成においても、一度復号化を誤ると、それが次の命令コードの復号化に影響するため、以降の命令コードの復号化が全て誤りとなってしまう。上記のように、誤った命令フェッチが続けば続くだけ、ＣＰＵ（２１０）が暴走を続ける確率は指数関数的に減少し、停止する確率は１００％に近づいて行くため、セキュリティの向上を図る上で極めて有効とされる。
【００３０】
〔１０〕上記〔８〕記載の情報処理装置を搭載してＩＣカード（１０８）を構成することができる。
【００３１】
〔１１〕上記〔９〕記載の情報処理装置を搭載してＩＣカード（１０８）を構成することができる。
【００３２】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００３３】
以下の実施の形態において、要素の数等（個数、数値、量、範囲等を含む）に言及する場合、特に明示した場合および原理的に明らかに特定の数に限定される場合等を除き、その特定の数に限定されるものではなく、特定の数以上でも以下でも良い。また、以下の実施の形態において、その構成要素（要素ステップ等も含む）は、特に明示した場合および原理的に明らかに必須であると考えられる場合等を除き、必ずしも必須のものではないことは言うまでもない。同様に、以下の実施の形態において、構成要素等の形状、位置関係等に言及するときは、特に明示した場合および原理的に明らかにそうでないと考えられる場合等を除き、実質的にその形状等に近似または類似するもの等を含むものとする。このことは、上記数値および範囲についても同様である。
【００３４】
以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において、同一の部材には原則として同一の符号を付し、その繰り返しの説明は省略する。
【００３５】
図１には、本発明にかかる情報処理装置の一例とされるマイクロコンピュータが搭載されたＩＣカードが示される。図１に示されるＩＣカード１０８には、マイクロコンピュータ１０７が組込まれ、上記マイクロコンピュータ１０７に結合された複数の端子１０１〜１０６が形成されている。この複数の端子１０１〜１０６は、ＩＣカード１０８が、図示されないリーダーライター装置に装着された場合に、当該リーダーライター装置側の端子に接触される。これにより、マイクロコンピュータ１０７とリーダーライター装置との間で信号のやり取りが可能になる。端子１０１は、電源電圧Ｖｃｃの供給端子とされ、端子１０２はリセット信号Ｒｓｔの入力端子とされ、端子１０３は、クロック信号ＣＬＫの入力端子とされ、端子１０４は、グランドＧＮＤレベルの供給端子とされ、端子１０５は高電圧Ｖｐｐの供給端子とされ、端子１０６はデータの入出力（Ｉ／Ｏ）のための端子とされる。
【００３６】
図２には、上記マイクロコンピュータ１０７の構成例が示される。マイクロコンピュータ１０７は、特に制限されないが、記憶装置２２０、ＣＰＵ（中央処理装置）２１０、及びフィルタ４３０を含み、公知の半導体集積回路製造技術により、単結晶シリコン基板などの一つの半導体基板に形成される。記憶装置２２０は、特に制限されないが、フラッシュメモリなどの不揮発性メモリとされる。この記憶装置２０２には、ＣＰＵ２１０で実行されるプログラムや各種データが記憶されている。ＣＰＵ２１０で実行されるプログラムとは、コンパイラによってソースコードをコンパイルすることで得られた実行形式のオブジェクトコード（「命令コード」という）を指す。ＣＰＵ２１０は、記憶装置２０２に記憶されたプログラムを形成する命令コードを、バス２３０を介してフェッチして実行する。バス２３０とＣＰＵ２１０の間には、フィルタ４３０が挿入されている。このフィルタ４３０は、上記コンパイラが出力しない命令コードがＣＰＵ２１０によってフェッチされる際に、当該命令コードを判別して上記ＣＰＵ２１０の動作を制限する機能を有する。例えばバス２３０からＣＰＵ２１０に送られるデータが命令コードであった場合、その命令コードが、記憶装置２０２内のプログラムに含まれる命令コードであるか否かを判定する。ＣＰＵ２１０からフィルタ４３０に、命令フェッチ信号４１０が供給される。フィルタ４３０は、伝達された令フェッチ信号４１０により、命令コードとデータの区別を行う。フィルタ４３０はフェッチされたコードがプログラムを構成する命令群に含まれない場合、停止信号４２０をアサートして、ＣＰＵ２１０にフェッチ異常があったことを知らせる。ＣＰＵ２１０は停止信号２４０のアサートに従って、割り込み処理に遷移したり、自身をリセットする動作を行ったりすることで、プログラムの異常動作を止める。
【００３７】
図３には、記憶装置２２０上に現れるビットパタンの例が示される。ＣＰＵ２１０が解釈することができないデータ群は、未定義命令３０４に分類される。命令として解釈、実行が可能であるものの、コンパイラが出力しない命令群３０３が存在する。ここで、コンパイラが出力しない命令とは、ＣＰＵが解釈可能な命令のうち、アセンブラ命令を直接書き込むなどの方法以外では、ソースコードにどのような記述をしても生成されることのない命令を示す。レジスタの直行性の高いＣＰＵでは、演算命令で指定できるレジスタに制限がないため、あまり意味のないレジスタの組み合わせた演算命令もＣＰＵが解釈可能な命令として存在する。例えば、スタックのアドレスを格納するレジスタの上位部と下位部を加算し、上位部に代入する、といった命令は、通常コンパイラから出力されることはない。
【００３８】
未定義命令３０４にもコンパイラが出力しない命令群３０３にも含まれないものが、コンパイラが出力し得る命令群３０５で、それは、さらにプログラムに含まれる命令群３０１と、プログラムに含まれない命令群３０２とに分けられる。ここで、プログラムに含まれない命令群３０２とは、コンパイラへ入力されるソースプログラムの書き方に依存して、出力されることのなかった命令群を指す。その内側には、プログラムに含まれる命令群３０１が存在する。記憶装置２２０の中には、プログラムに含まれる命令群３０１のみが存在し、仮にＣＰＵ２１０によってフェッチされた命令コードが、この「プログラムに含まれる命令群３０１」に属してない場合、それはフェッチ時に何らかのエラーが発生したと考えられる。この実施の形態では、フェッチされて復号化された命令が「プログラムに含まれる命令群３０１」に属していない場合、フィルタ４３０は、プログラムのフェッチに重大な誤りがあったと判断し、ＣＰＵ２１０の動作を停止させるために、停止信号４２０をアサートする。
【００３９】
プログラムに含まれる命令群３０１は、プログラムを開発するための開発ツールによって、記憶装置２２０に格納するためのオブジェクトコードを生成する際に生成される。
【００４０】
図１９には、上記フィルタ４３０の構成例が示される。上記フィルタ４３０は、特に制限されないが、命令コード出現情報テーブル記憶部２００２を含む。この命令コード出現情報テーブル記憶部２００２には、命令コード２００１の出現情報が格納されている。図２０には、上記命令コード出現情報テーブル記憶部２００２に格納された出現情報の一例が示される。命令コード出現情報は、命令コード２００１のうちの予め定められた部分ビットを取り出し、部分ビットの値の種類ごとに出現の有無がまとめられ、部分ビットの値をインデックス値とし、部分ビットの値がインデックス値と等しい命令コードが出現する場合は、テーブルのインデックス（ｉｎｄｅｘ）値の位置のバリュー（ｖａｌｕｅ）欄に、出現することを示す１ビットの値（例えば論理値“１”）が格納される。インデックス値と等しい部分ビットを持つ命令が出現しない場合、出現しないことを示す１ビットの値（例えば論理値“０”）が格納される。上記バリュー欄の値が停止信号４２０として出力される。図１９の構成例では、命令コードの上位８ビットを選択し、選択した８ビットの値で命令コードを分類して出現の有無を判別可能としているが、ビット数は８ビットに限らない。ビット数が増えることで、より精度よく出現しない命令を判別できるが、命令コード出現情報テーブルの大きさは、２のべき乗で増加する。同じビット数を選択する場合でも、選択するビットの位置によって、「出現が無い命令」の検出率が変化する。選択するビット位置は、「出現が無い命令」の検出率が最大となるように選択する。命令コードの個々のビットにどのような意味を持たせるのかは、ＣＰＵによって異なるため、異なる命令セットのＣＰＵでは、異なるビットを選択するように設計する。
【００４１】
尚、命令コード出現情報テーブルを複数用意し、その命令コード出現情報テーブルを実行中のプログラム毎に切り替えてもよい。
【００４２】
図４には、上記マイクロコンピュータ１０７の別の構成例が示される。
【００４３】
図４に示されるマイクロコンピュータ１０７が、図２に示されるのと大きく異なるのは、バス２３０のデータがＣＰＵ２１０とフィルタ４３０との両者に送られる点である。フィルタ４３０は、バス２３０のデータが、フェッチされた命令コードであるか、ＣＰＵ２１０のメモリアクセスによるデータであるかを判別する。この判別は、命令フェッチ信号４１０に基づいて行われる。命令フェッチ信号４１０がアサートされていればフェッチされた命令コードと判断され、命令フェッチ信号４１０がネゲートされていればＣＰＵ２１０のメモリアクセスによるデータと判断される。フェッチされた命令コードと判断された場合、フィルタ４３０は、バス２３０上の命令コードがプログラムに含まれる命令群か否かを判定する。バス２３０上の命令コードが、プログラムを構成する命令群に含まれない場合、停止信号４２０をアサートして、ＣＰＵ２１０にフェッチ異常があったことを知らせる。ＣＰＵ２１０は停止信号２４０に従って、割り込み処理に遷移したり、自身をリセットする動作を行ったりすることで、プログラムの異常動作を止める。
【００４４】
図５には、上記マイクロコンピュータ１０７の別の構成例が示される。図５に示されるマイクロコンピュータ１０７が、図２に示されるのと大きく異なるのは、記憶装置２２０に格納されているプログラムが符号化されている点である。この符号化は、１つ前に実行される命令コードに依存する符号化とされる。そして符号化された命令コードを復号するための復号化装置６２０がバス２３０とフィルタ４３０の間に配置される。符号化された命令コードは、復号化装置６２０で復号化され、フィルタ４３０を介して、ＣＰＵ２２０に伝達される。フィルタ４３０は、復号化装置６２０で復号化された命令コードがプログラムに含まれる命令群か否かを判定し、復号化装置６２０から送られてきた命令コードが、プログラムを構成する命令群に含まれない場合、停止信号４２０をアサートして、ＣＰＵ２１０にフェッチ異常があったことを知らせる。フィルタ４３０および復号化装置６２０は、ＣＰＵ２１０からの命令フェッチ信号４１０に基づいて、命令コードとデータとの区別を行う。１つ前に実行した命令コードに依存した符号化では、一つ前に実行した命令が一意に定まらない場合は、イニシャルベクタと呼ばれる値を一つ前に実行した命令の代わりに用いる。ＣＰＵ２１０は、一つ前に実行した命令が定まらない場合をコードブロック先頭信号６３０により通知する。ＣＰＵ２１０は、ジャンプ命令、条件分岐、サブルーチンからの復帰命令の検出により、コードブロックの先頭であるか否かを判断する。
【００４５】
ここで、上記コードブロックについて説明する。コードブロックとは、一つ前に実行された命令が一意に定まる命令列の塊と定義される。基本ブロックと類似しているが、基本ブロックとコードブロックでは、分岐命令の非分岐の場合の扱いが異なる。基本ブロックは、分岐を含まない一連の命令列を意味する。例えば図１５に示されるように複数の命令（又は処理）Ａ〜Ｆを含むプログラムの場合、図１６に示されるように、基本ブロック１７０１、１７０２、１７０３、１７０４の４つに分けることができる。分岐命令Ｂの直後には非分岐側の命令Ｃとの間で基本ブロックの境界が存在する。
【００４６】
一方、コードブロックでは、分岐命令が非分岐の場合は、コードブロックの境界とはならない。従って、図１７に示されるように、コードブロック１８０１、１８０２、１８０３の３つのブロックに分割される。
【００４７】
コードブロックの境界は、ＣＰＵ２１０からはジャンプ命令や分岐命令、サブルーチンコール命令、サブルーチンからの復帰命令により識別できる。図１７の命令Ｃと命令Ｅとの間には、コードブロックの境界が存在するが、命令Ｃは通常、分岐命令やジャンプ命令ではないので、そのままではＣＰＵ２１０から識別ができない。そこで、図１８のように命令Ｃと命令Ｅの間に、ＣＰＵ２１０がコードブロックの境界を認識できるようにするための識別命令１９１０が挿入される。この命令は、直後のアドレスに分岐する分岐命令や、コードブロック境界であることを示すための専用命令を用意しておく。例えば、何もしないことを意味するＮＯＰ（No OPeration）命令などは、上記コードブロックの境界を示す命令として用いることができる。
【００４８】
図６には、上記マイクロコンピュータ１０７の別の構成例が示される。図６に示されるマイクロコンピュータ１０７が、図４に示されるのと大きく異なるのは、記憶装置２２０に格納されているプログラムが符号化されている点である。この符号化は、１つ前に実行される命令コードに依存する符号化とされる。そして符号化された命令コードを復号するための復号化装置６２０がバス２３０とフィルタ４３０の間に配置される。復号化装置６２０で復号化された命令コードは、ＣＰＵ２１０とフィルタ４３０とに渡される。フィルタ４３０は、復号化装置６２０で復号化された命令コードが、プログラムに含まれる命令群か否かを判定し、復号化装置６２０から送られてきた命令コードがプログラムを構成する命令群に含まれない場合、停止信号４２０をアサートして、ＣＰＵ２１０にフェッチ異常があったことを知らせる。フィルタ４３０および復号化装置６２０は、ＣＰＵ２１０から命令フェッチ信号４１０に基づいて、命令コードとデータとの区別を行う。１つ前に実行した命令コードに依存した符号化では、一つ前に実行した命令が一意に定まらない場合、特別なイニシャルベクタと呼ばれる値を一つ前に実行した命令の代わりに用いる。そのため、ＣＰＵ２１０は、一つ前に実行した命令が定まらない場合をコードブロック先頭信号６３０により通知する。ＣＰＵ２１０は、ジャンプ命令や条件分岐、サブルーチンからの復帰命令などが実行された場合に、コードブロック先頭信号６３０を介して一つ前に実行した命令が一意に定まらないことを各モジュールに通知する。
【００４９】
図７には、上記復号化装置６２０の構成例が示される。図７に示される復号化装置６２０は、記憶装置（ＦＦ  ｓａｖｅ）７１０、記憶部（ＦＦ）７２０、セレクタ７４０、排他的論理和演算装置７５０、及び変換部７６０を含んで成る。記憶部７２０にはフリップフロップ回路を適用することができる。復号化装置６２０は、一つ前の命令コードに依存した符号化方式により符号化された命令コード列Ｅ−ｏｐｃｏｄｅを復号化して出力する。コードブロックの先頭の命令に対しては、一つ前に実行された命令コードが一意に決まらないため、その代わりに、初期値レジスタ（ＩＶ）７３０に保持されている初期値がセレクタ７４０で選択されるようになっている。セレクタ７４０は、コードブロック先頭信号６３０により制御される。符号化された命令コードは、排他的論理和演算装置７５０により、一つ前の命令コードを記憶する記憶部７２０の値もしくは、初期値レジスタ７３０の出力のうち、セレクタ７４０で選択された信号と排他的論理和（ＸＯＲ）が計算され、変換部７６０により変換される。変換部７６０では、入出力のビット幅は同じで、入出力値は１対１対応した変換を行う。変換部７６０の出力値は、復号化された命令コードとして出力されるとともに、命令フェッチ信号４１０の値に従って、命令フェッチであった場合は一つ前の命令コードを記憶する記憶部７２０に記憶される。命令フェッチでなかった場合は、記憶部７２０の内容は更新されない。また、割り込み時の一つ前の命令コードを退避するための記憶装置７１０は、割り込みが発生した場合に、記憶部７２０の内容を保存し、割り込みから復帰する際に、割り込み時の一つ前の命令コードを退避した記憶装置７１０の値により、記憶部７２０の値が割り込み前の値に復元されるよう構成される。
【００５０】
図７に示される復号化装置６２０では、一度復号化を誤ると、それが次の命令コードの復号化に影響するため、以降の命令コードの復号化が全て誤りとなってしまう。ここで、アドレスをＡＤＲ、アドレスＡＤＲに格納されている符号化された命令をＣＣＣＯＤＥ［ＡＤＲ］、復号化された命令コードをＰＣＣＯＤＥ［ＡＤＲ］、変換部７６０でＸを変換した値をＦ（Ｘ）とすると、ＣＣＣＯＤＥ［ＡＤＲ］やＦＦは、次のようになる。ここで、「：＝」は代入を意味する。
【００５１】
【数１】
2011232801.tif 000003
【００５２】
【数２】
2011232801.tif 000004
【００５３】
ＦＦは、コードブロックの先頭では、ＩＶが格納されているが、それ以外の場合には、ＰＣＯＤＥ［ＡＤＲ−１］が格納されており、数１の式は、次のようになる。
【００５４】
【数３】
2011232801.tif 000005
【００５５】
ここでＡＤＲのＣＣＯＤＥ［ＡＤＲ］をフェッチした際に誤りが発生し、ＣＣＯＤＥ［ＡＤＲ］の代わりに、ＣＣＯＤＥ’［ＡＤＲ］が入力されたとすると、数１の右辺のＦの括弧内の値は、ＣＣＯＤＥ’［ＡＤＲ］≠ＣＣＯＤＥ［ＡＤＲ］の場合、必ず、次式のようになる。
【００５６】
【数４】
2011232801.tif 000006
【００５７】
その結果、計算される、ＡＤＲの誤った演算結果ＰＣＯＤＥ’［ＡＤＲ］は当然ながら、次式のようになる。
【００５８】
【数５】
2011232801.tif 000007
【００５９】
このＰＣＯＤＥ’［ＡＤＲ］はＦＦに代入されるが、この値も誤っているので、ＦＦ’とおく。次にＡＤＲ＋１の命令コードを復号化する場合、ＣＣＯＤＥ［ＡＤＲ＋１］が正しくフェッチした場合でも、ＦＦ’が正しい値ではないので、同様に、数６に示されるようになり、アドレスＡＤＲ＋１の復号化結果は、数７に示されるように誤った値となる。
【００６０】
【数６】
2011232801.tif 000008
【００６１】
【数７】
2011232801.tif 000009
【００６２】
この値が再びＦＦに代入されるため、ＦＦの値は真の値とは異なる値を保ったままとなる。したがって、一度フェッチ誤りが発生すると、その後のフェッチは全て誤りとなる。
【００６３】
誤って復号化された命令コードは、いずれフィルタ４３０により判別され、停止信号４２０がアサートされる。それによりＣＰＵ２１０の動作が停止される。誤った命令フェッチが続けば続くだけ、停止しないで暴走を続ける確率は指数関数的に減少し、停止する確率は１００％に近づいて行く。例えば、フィルタで停止するビットパタンが２０％存在した場合、１０命令をフェッチする間に停止する確率は、数８のようになる。
【００６４】
【数８】
2011232801.tif 000010
【００６５】
図８には、復号化装置６２０の別の構成例が示される。図８に示される構成例では、一つ前に実行された命令コードと、命令コードが格納されているアドレス情報に依存した符号化が行われた命令コードとを復号化するよう構成されている。アドレス情報は、アドレス情報縮退装置（Ｈ）８２０により、符号化された命令コードＥ−ｏｐｅｃｏｄｅと同じビット長に縮退され、排他的論理和演算装置８１０により、符号化された命令コードとの排他的論理和（ＸＯＲ）が計算される。縮退化されたアドレス情報と符号化された命令コードとの排他的論理和演算結果は、排他的論理和演算装置７５０に伝達され、そこで、セレクタ７４０によって選択された値との排他的論理和が計算される。セレクタ７４０は、コードブロック先頭信号６３０により制御され、一つ前の命令コードを記憶した記憶部（ＦＦ）７２０の出力値もしくは、初期値レジスタ７３０の出力値のいずれかを選択して出力する。１つ前に復号化される命令が一意に決まらない場合には、セレクタ７４０によって初期値レジスタ７３０の出力値が選択される。排他的論理和演算装置７５０の演算結果は、変換部７６０により変換される。変換部７６０では、入出力のビット幅は同じサイズで、入出力値が１対１に対応した変換が行われる。変換部７６０の出力値ｏｐｃｏｄｅは、復号化された命令コードとしてＣＰＵ２１０に出力される。またこのとき、命令フェッチ信号４１０の値に従って、記憶部５６０の出力値が記憶部７１０に記憶される。つまり、命令フェッチの場合には、変換部７６０の出力が記憶部７２０に記憶され、命令フェッチでない場合には、記憶部７２０の内容は更新されない。また、記憶装置（ＦＦ  ｓａｖｅ）７１０は、割り込みが発生した場合に、一つ前の命令コードを記憶した記憶部７２０の内容を退避し、割り込みから復帰する際に、記憶装置７１０の値により、記憶部７２０の値が割り込み前の値に復元されるよう構成される。
【００６６】
図９には、復号化装置６２０の別の構成例が示される。図９に示される構成例では、一つ前に実行された命令コードと、鍵情報記憶装置（ｋｅｙ）８３０に記憶された鍵情報と、命令コードが格納されているアドレス情報とに依存した符号化が行われた命令コードを復号化するように構成されている。アドレス情報は、アドレス情報縮退装置（Ｈ）８２０により、符号化された命令コードＥ−ｏｐｃｏｄｅと同じビット長に縮退され、排他的論理和演算装置８１０により、符号化された命令コードとの排他的論理和が計算される。縮退化されたアドレス情報と符号化された命令コードとの排他的論理和演算結果は、排他的論理和演算装置８４０に伝達され、そこで、鍵情報記憶装置８３０に格納された鍵情報と排他的論理和が計算され、さらにその計算結果が排他的論理和演算装置７５０に伝達され、そこで、でセレクタ７４０によって選択された値との排他的論理和が計算される。セレクタ７４０は、コードブロック先頭信号６３０により制御され、一つ前の命令コードを記憶した記憶装置（ＦＦ）７２０の値もしくは、初期値レジスタ（ＩＶ）７３０のいずれかが選択されて出力される。排他的論理和演算装置７５０の演算結果は、変換部７６０により変換される。変換部７６０では、入出力のビット幅は同じで、入出力値が１対１に対応した変換が行われる。変換部７６０の出力値は、復号化された命令コードとして出力されるとともに、命令フェッチ信号４１０の値に従って、命令フェッチであった場合は一つ前の命令コードを記憶するための記憶部７２０に記憶される。命令フェッチでなかった場合は、記憶部７２０の内容は更新されない。また、記憶装置（ＦＦ  ｓａｖｅ）７１０は、割り込みが発生した場合に、一つ前の命令コードを記憶した記憶部７２０の内容を退避し、割り込みから復帰する際に、記憶装置７１０の値により、記憶部７２０の値が割り込み前の値に復元されるよう構成される。
【００６７】
図１０には、上記復号化装置６２０に含まれる変換部７６０の構成例が示される。変換部７６０は、入出力が同じビット長で、全単射となる変換を行う。また、入力ビットの一部のビットの違いが出力ビットの他のビットに伝搬するように構築することが望ましい。図１０に示される構成では、転置部１０１０により、１６ビットの値の各ビットの位置が入れ替えられる。転置部１０１０は、例えば図１１に示されるように、入力値の上位（ＭＳＢ）と下位（ＬＳＢ）のビットが交互に現れる転置が行われる。尚、転置の方法は、図１１の構成に限定されるものではなく、他の転置方法でも構わない。転置部１０１０によってビットが転置された後、上位バイトと下位バイトに分けられ、それぞれ全単射変換部１０２０，１０３０により変換が行われてから、再び１６ビットの値に戻されて出力される。全単射変換部１０２０，１０３０での全単射変換の一例が図１２に示される。この表は、ＡＥＳ暗号で用いられている、InvSubByteの変換で、全単射になっている。ここでの全単射変換は、全単射になっていれば、図１２の表以外の変換でもよい。
【００６８】
図１３には、上記復号化装置６２０に含まれるアドレス情報縮退装置８２０の構成例が示される。アドレス情報縮退装置８２０は、アドレス情報のビット値を、命令フェッチの際のフェッチ単位のビット長に合わせる変換を行う。ます、アドレス情報を１ビット毎に分解する。ビット毎に定められた縮退用定数１２０００（Ｃ０）〜１２０２３（Ｃ２３）が用意されているので、１であったビットに対応した縮退用定数を１ビット掛ける１６ビット乗算回路１２１００、１２１１８、１２１１９、１２１２０、１２１２１、１２１２２、１２１２３で取り出し、縮退用定数すべての排他的論理和を排他的論理和回路１２２００で演算する。縮退用定数は、フェッチ単位のビット長と同じビット長である。縮退後の値が縮退後の値のビット長で表現される全てのビットパタンが生成されるよう、縮退用定数を設定する。縮退用定数の選定には、少なくとも、縮退用定数の特定のビットの値に注目した時、縮退定数中での１と０の頻度は、いずれか一方のみが１００％となることの無いようにしたほうがよい。
【００６９】
図１４には、アドレス情報縮退装置８２０における、１ビット掛ける１６ビット乗算回路１２１００、１２１１８、１２１１９、１２１２０、１２１２１、１２１２２、１２１２３の構成例が示される。この１６ビット乗算回路は、縮退用定数１３２０のビット数に対応して配置されたアンドゲート１３０１〜１３１６を含んで成る。このような１６ビット乗算回路によって、縮退用定数１３２０のそれぞれのビットと、１ビット分のアドレス１３４０とのアンド論理が演算されることで、１ビット掛ける１６ビットの乗算が行われる。尚、縮退用定数がゼロとなるビットについては、アンドゲートを省いてもよい。
【００７０】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【符号の説明】
【００７１】
１０８  ＩＣカード
１０７  マイクロコンピュータ
２１０  ＣＰＵ
２２０  記憶装置
２３０  バス
４１０  命令フェッチ信号
４２０  停止信号
４３０  フィルタ
６２０  復号化装置
７１０  記憶装置
７２０  記憶部
７３０  初期値レジスタ
７４０  セレクタ
７５０  排他的論理和演算装置
７６０  変換部
８１０,８４０  排他的論理和演算装置
８２０  アドレス情報縮退装置
８３０  鍵情報記憶装置
１０１０  転置部
１０２０  全単射変換部
１０３０  全単射変換部
１７０１〜１７０４  基本ブロック
１８０１〜１８０３  コードブロック
１９１０  識別命令
２００１  命令コード
２００２  命令コード出現情報テーブル記憶部
１２１００〜１２１２３  １ビット掛ける１６ビット乗算回路
１２２００  排他的論理和回路
【図１】
2011232801.tif 000011
【図２】
2011232801.tif 000012
【図３】
2011232801.tif 000013
【図４】
2011232801.tif 000014
【図５】
2011232801.tif 000015
【図６】
2011232801.tif 000016
【図７】
2011232801.tif 000017
【図８】
2011232801.tif 000018
【図９】
2011232801.tif 000019
【図１０】
2011232801.tif 000020
【図１１】
2011232801.tif 000021
【図１２】
2011232801.tif 000022
【図１３】
2011232801.tif 000023
【図１４】
2011232801.tif 000024
【図１５】
2011232801.tif 000025
【図１６】
2011232801.tif 000026
【図１７】
2011232801.tif 000027
【図１８】
2011232801.tif 000028
【図１９】
2011232801.tif 000029
【図２０】
2011232801.tif 000030