(57)【特許請求の範囲】
【請求項１】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
検証用となる変数の値が記憶される検証メモリ部、を有し、
少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、
前記型Ａのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、
前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記予め定められたプログラムには、
前記設定記述と、
複数のｎ個の前記情報処理検証演算記述と、
前記判定記述とが、
前記設定記述の後に前記ｎ個の情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記型Ａのあるビット列ａを前記メモリ部に記憶し、
前記ｎ個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Ａのあるビット列となるようなビット列ｂｉ（ｉ＝１〜ｎ）とを排他的論理和演算して前記検証メモリ部に上書きすることをｎ回実行し、
前記判定記述により、前記検証メモリ部から読み出した変数の値が
検証値ｃ＝ａ＾ｂ１＾ｂ２＾・・・・＾ｂｎ（＾は、排他的論理和演算）
と一致するか否かを判定する事により、
前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、
ことを特徴とする情報処理装置。
【請求項２】
前記設定記述に基づき前記検証メモリ部に記憶されているビット列ａと、
前記検証値ｃは、互いにビット反転の関係にある
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、
前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、
Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムは、
前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、
前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、
前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、
前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項４】
前記設定記述に基づいて検証メモリ部に記憶された前記型Ａの値と、
前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Ａの値とは、互いにビット反転の関係にある
ことを特徴とする請求項３記載の情報処理装置。
【請求項５】
前記予め定められたプログラムには、少なくとも
前記設定記述と、
ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、
前記判定記述とが、
前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、
前記設定記述には、値０の識別子で対応づけられるＸ（０）の値を前記検証メモリ部に記憶させるように記述されており、
前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｉ−１，ｉ）（ｉはループ内ｉ番目に処理される回数値）が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、
前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したＸ（ｎ）（ｎ＝１〜ｍであり、ループ回数）の値と一致するか否かを判断するように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする請求項３又は請求項４に記載の情報処理装置。
【請求項６】
前記予め定められたプログラムには、
下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、
前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、
前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、
前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、
ことを特徴とする請求項３から請求項５のいずれかに記載の情報処理装置。
【請求項７】
前記情報処理装置は、
モジュール内検証メモリ部を有し、
前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、
自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、
自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、
前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、
前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、
前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、
前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、
前記情報処理部は、
前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、
前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、
前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、
ことを特徴とする請求項６に記載の情報処理装置。
【請求項８】
前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、
前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、
ことを特徴とする請求項７記載の情報処理装置。
【請求項９】
前記検査対象情報処理による情報処理をするプログラムの記述において、
２値の値をとる２つの内部変数として、少なくとも０と１とを含む２ビット長以上の第３の固定ビット長である複数の基本ビット列を組み合わせた第４の固定ビット長の変数である２つの変数であって、互いにビット反転の関係にある２つの変数を用いる、
ことを特徴とする請求項３から請求項８のいずれかに記載の情報処理装置。
【請求項１０】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、
少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、
前記型Ａのある値を変換前ビット列として記憶する変換前ビット列記憶部と、
前記型Ａのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、
前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、
検証用となる変数の値を記憶する検証メモリ部と、を有し、
前記予め定められたプログラムには少なくとも、
前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、
検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、
前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、
前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、
前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、
前記情報処理部は、
前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、
前記情報処理記述に基づいて、前記検査対象情報処理を実行し、
前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、
前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する
ことを特徴とする情報処理装置。
【請求項１１】
前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、
前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にある
ことを特徴とする請求項１０記載の情報処理装置。
【請求項１２】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとして、前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、
前記情報処理部は、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、
ことを特徴とする情報処理方法。
【請求項１３】
予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとして、前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、
前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶する手順と、
前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、
前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順と
を実行させるための情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＩＣカードなどの情報処理部を搭載した情報処理装置において、コンピュータ等の処理や演算におけるバイパスや内部データの改竄など本来意図しない動作を防止するセキュリティの技術に関する。
【背景技術】
【０００２】
ＩＣカードなどの情報処理部を搭載した情報処理装置は、高電圧を印加する、レーザービームを照射する、イオンビームを照射するなどの物理的な攻撃を受けることで、搭載しているソフトウェアが、認証処理のバイパスや内部データの改竄など、本来意図しない動作をする可能性がある。
【０００３】
このような、バイパスや内部データの改竄の問題に対して、互いにビット反転した関係を表現する表現形式をもつ変数を用い、並列に演算を行い、各演算結果がそれぞれビット反転した関係になっているか否かを判定することにより、誤動作を検知できる技術が知られている（例えば、特許文献１参照）。
【０００４】
また、条件分岐条件を複数または並列に動作させ、それぞれの結果を照合することにより、誤動作を検知する技術が知られている（例えば、特許文献２および特許文献３を参照）。
【特許文献１】国際公開第２００５／０２７４０３号パンフレット
【特許文献２】特開２００２−３３４３１７号公報
【特許文献３】特開２００５−２８５１３３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１から特許文献３に示す技術においては、演算を並列に行うことや、条件分岐条件を複数または並列に動作させるために、バイパスや内部データの改竄を検知するための演算として追加される追加処理に対しての演算負荷が重くなるという問題、または、この追加処理に対しての演算時間が長くなるという問題があった。
【０００６】
本発明は、このような事情に鑑みてなされたもので、その目的は、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることを可能とする情報処理装置、情報処理方法、および、情報処理プログラムを提供することにある。
【課題を解決するための手段】
【０００７】
この発明は上述した課題を解決するためになされたもので、請求項１に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、検証用となる変数の値が記憶される検証メモリ部、を有し、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、前記型Ａのある値を前記検証メモリ部に記憶させることを示す記述を設定記述とし、検査対象となる情報処理である検査対象情報処理を実行することを示す記述を情報処理記述とし、前記検証メモリ部に記憶されている変数をあるビット列で排他的論理和演算して前記検証メモリ部に上書きすることを示す記述を検証演算記述とし、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述を判定記述とし、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記予め定められたプログラムには、前記設定記述と、複数のｎ個の前記情報処理検証演算記述と、前記判定記述とが、前記設定記述の後に前記ｎ個の情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記型Ａのあるビット列ａを前記メモリ部に記憶し、前記ｎ個の情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変数と排他的論理和演算する事で前記型Ａのあるビット列となるようなビット列ｂｉ（ｉ＝１〜ｎ）とを排他的論理和演算して前記検証メモリ部に上書きすることをｎ回実行し、前記判定記述により、前記検証メモリ部から読み出した変数の値が検証値ｃ＝ａ＾ｂ１＾ｂ２＾・・・・＾ｂｎ（＾は、排他的論理和演算）と一致するか否かを判定する事により、前記複数の前記情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する、ことを特徴とする情報処理装置である。
【０００８】
また、請求項２に記載の発明は、前記設定記述に基づき前記検証メモリ部に記憶されているビット列ａと、前記検証値ｃは、互いにビット反転の関係にあることを特徴とする請求項１に記載の情報処理装置である。
【０００９】
また、請求項３に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【００１０】
また、請求項４に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記型Ａの値と、前記判定記述に基づいて前記ビット列記憶部より読み出された前記型Ａの値とは、互いにビット反転の関係にあることを特徴とする請求項３記載の情報処理装置である。
【００１１】
また、請求項５に記載の発明は、前記予め定められたプログラムには、少なくとも前記設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で前記情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、前記判定記述とが、前記設定記述の後に前記ループ処理記述が記述され、かつ、前記ループ処理記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述には、値０の識別子で対応づけられるＸ（０）の値を前記検証メモリ部に記憶させるように記述されており、前記ループ処理記述中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｉ−１，ｉ）（ｉはループ内ｉ番目に処理される回数値）が示すビット列の値で排他的論理和演算し、前記検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、前記ビット列記憶部から読み出したＸ（ｎ）（ｎ＝１〜ｍであり、ループ回数）の値と一致するか否かを判断するように予め記述されており、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする請求項３又は請求項４に記載の情報処理装置である。
【００１２】
また、請求項６に記載の発明は、前記予め定められたプログラムには、下位モジュールを呼び出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得する記述であるモジュール呼び出し記述と、前記モジュール呼び出し記述で呼び出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証することを示す返却値判定記述とが、前記モジュール呼出記述の後に前記返却値判定記述が記述されるように予め記述されており、前記情報処理部は、前記モジュール呼出記述に基づいて下位モジュールを呼出し、前記検証メモリ部に記憶されている変数を前記下位モジュールに渡すとともに、前記下位モジュールからの返却値を取得し、前記返却値判定記述に基づいて、前記モジュール呼出し記述で呼出した下位モジュールからの返却値が、前記下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する、ことを特徴とする請求項３から請求項５のいずれかに記載の情報処理装置である。
【００１３】
また、請求項７に記載の発明は、前記情報処理装置は、モジュール内検証メモリ部を有し、前記モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムは、自モジュールを呼出した上位モジュールより渡された変数を、前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算して前記モジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、前記モジュール内検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却することを示す返却記述とを有し、前記モジュール内情報処理記述およびその後に前記モジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、前記モジュール内設定記述の後に前記モジュール内情報処理検証演算記述が記述され、かつ、前記モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されており、前記情報処理部は、前記モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記モジュール内検証メモリ部に記憶し、前記モジュール内情報処理検証演算記述に基づいて、前記モジュール内検査対象情報処理を実行するとともに、前記モジュール内検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値を前記モジュール内検証メモリ部に上書きし、前記返却記述に基づいて、前記モジュール内検証メモリ部に記憶されている変数の値を、前記上位モジュールに返却値として返却する、ことを特徴とする請求項６に記載の情報処理装置である。
【００１４】
また、請求項８に記載の発明は、前記モジュール内設定記述に基づき、前記モジュール内検証メモリ部に記憶される前記上位モジュールより渡された変数と、前記返却記述に基づき、前記上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている、ことを特徴とする請求項７記載の情報処理装置である。
【００１５】
また、請求項９に記載の発明は、前記検査対象情報処理による情報処理をするプログラムの記述において、２値の値をとる２つの内部変数として、少なくとも０と１とを含む２ビット長以上の第３の固定ビット長である複数の基本ビット列を組み合わせた第４の固定ビット長の変数である２つの変数であって、互いにビット反転の関係にある２つの変数を用いる、ことを特徴とする請求項３から請求項８のいずれかに記載の情報処理装置である。
【００１６】
また、請求項１０に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部を有する情報処理装置であって、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとし、前記型Ａのある値を変換前ビット列として記憶する変換前ビット列記憶部と、前記型Ａのある値であって、前記変換前ビット列とは値が異なるある値を変換後ビット列として記憶する変換後ビット列記憶部と、前記変換前ビット列と排他的論理和演算することにより前記変換後ビット列に変換させる変換ビット列を記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムには少なくとも、前記変換前ビット列記憶部に記憶されている変換前ビット列を読み出し前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とが、前記設定記述の後に前記情報処理記述が記述され、前記情報処理記述の後に検証演算記述が記述され、かつ、前記検証処理記述の後に前記判定記述が記述されるように予め記述されており、前記情報処理部は、前記設定記述に基づいて、変換前ビット列を前記変換前ビット列記憶部から読み出して前記検証メモリ部に記憶し、前記情報処理記述に基づいて、前記検査対象情報処理を実行し、前記検証演算記述に基づいて、前記検証メモリから読み出した変数と、前記変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算して前記検証メモリ部に上書きし、前記判定記述により、前記検証メモリ部から読み出した変数の値が、前記変換後ビット列記憶部より読み出した前記変換後ビット列と一致するか否かを判定する事により、前記検証演算記述による排他的論理和演算が実行されたか否かを判定することを特徴とする情報処理装置である。
【００１７】
また、請求項１１に記載の発明は、前記設定記述に基づいて検証メモリ部に記憶された前記変換前ビット列と、前記判定記述に基づいて前記変換後ビット列記憶部より読み出された前記変換後ビット列とは、互いにビット反転の関係にあることを特徴とする請求項１０記載の情報処理装置である。
【００１８】
また、請求項１２に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとして、前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されている情報処理装置において用いられる情報処理であって、前記情報処理部は、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶し、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きし、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する、ことを特徴とする情報処理方法である。
【００１９】
また、請求項１３に記載の発明は、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長である複数の基本ビット列を組み合わせた第２の固定ビット長のビット列のデータ型を型Ａとして、前記型Ａのビット列の値であって、値が互いに異なるｍ個の値を、識別子ｊ（ｊ＝０，・・・，ｍ−１）と対応づけて、前記型Ａのビット列の配列Ｘ（ｊ）として記憶するビット列記憶部と、Ｘ（ｋ）と排他的論理和演算することでＸ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）を変換ビット列として記憶する変換ビット列記憶部と、検証用となる変数の値を記憶する検証メモリ部と、を有し、前記予め定められたプログラムは、前記ビット列記憶部に記憶されている前記型Ａのある値を前記検証メモリ部に記憶させる事を示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、前記検証メモリ部に記憶されている変数を前記変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値を前記検証メモリ部に上書きすることを示す記述である検証演算記述と、前記検証メモリ部に記憶されている変数の値に基づいて前記検証演算記述による排他的論理和演算が実行されたか否かを示す記述である判定記述とを有し、前記情報処理記述およびその後に前記検証演算記述が記述されている記述を情報処理検証演算記述として、前記設定記述の後に、ｎ個の前記情報処理検証演算記述が順に記述され、かつ、前記ｎ個の情報処理検証演算記述の後に前記判定記述が記述されるように予め記述されており、前記設定記述は、前記ビット列記憶部に記憶されている前記型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を前記検証メモリ部に記憶させるように記述されており、前記ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、前記検証メモリ部に記憶されている変数を、前記変換ビット列記憶部より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されており、前記判定記述には、前記検証メモリ部に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、前記ビット列記憶部から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されている情報処理装置としてのコンピュータに、前記設定記述に基づいて、前記ビット列記憶部より読み出した前記型Ａのある値を前記検証メモリ部に記憶する手順と、前記情報処理検証演算記述に基づいて、前記検査対象情報処理を実行するとともに、前記検証メモリ部から読み出した前記変数と、前記変換ビット列記憶部から読みだした変換ビット列とを排他的論理和演算した値を前記検証メモリ部に上書きする手順と、前記判定記述に基づいて、前記検証メモリ部から読み出した変数の値が、前記ビット列記憶部から読み出した前記型Ａのビット列と一致するか否かを判定することにより、前記検証演算記述による排他的論理和演算が実行されたか否かを判定する手順とを実行させるための情報処理プログラムである。
【発明の効果】
【００２０】
この発明によれば、情報処理装置が、予め定められたプログラムの記述に基づいて順に情報処理を実行する情報処理部と、検証用となる変数の値が記憶される検証メモリ部とを有し、少なくとも０と１とを含む２ビット長以上の複数の基本ビット列を組み合わせた固定ビット長のビット列をＸ（ｉ）として、ビット列Ｘ（ｉ）と排他的論理和演算することによりビット列Ｘ（ｊ）に変換させる変換ビット列を用いて、情報処理の実行前にビット列Ｘ（ｉ）を検証メモリ部に記憶し、情報処理の実行後に検証メモリ部に記憶されているビット列と変換ビット列と排他的論理和演算して検証メモリ部に上書きし、検証メモリ部から読み出した変数の値に基いて検査対象となる情報処理が実行されたか否かを判定することにより、コンピュータ等の処理や演算におけるバイパスや内部データの改竄を検知するとともに、その演算負荷を減じることが可能となる効果を奏する。
【発明を実施するための最良の形態】
【００２１】
＜原理＞
まず、本実施形態において用いる原理について説明する。本実施形態においては、全ビット反転するという攻撃が、非常に困難であることに注目し、次のような処理を行う。この処理により、処理プログラムに対してのバイパスや改竄の検知が可能となる。
【００２２】
・ＣＶ（Complex Value）を、予め準備しておく。このＣＶとは、“０１”と“１０”とを組み合わせた、１バイト（byte）長のビット列の全ての組み合わせである。このＣＶについては、後述する。
・ＣＶ（ｉ）をＸＯＲ演算（排他的論理和演算）した場合に、ＣＶ（ｊ）となる値ＣＶＭを、ＣＶ（ｉ）とＣＶ（ｊ）との全ての組み合わせに対して予め算出して準備し、変換テーブルに記憶しておく。ここで、ｉとjとは、上記１６通りのＣＶの内、いずれか１つのＣＶを示すための識別情報である。
・処理プログラムの間（途中）に、ＣＶ（ｉ）を、ＣＶ（ｊ）に変換するプログラムを組み込む。
・処理プログラムの間（途中）で変換されたＣＶ（ｊ）の値と、予め算出されるはずのＣＶ（ｊ）の値とが一致するか否かを判定してチェックすることにより、バイパスや改竄を検知する。
【００２３】
＜原理詳細＞
以下、図面を参照して、本発明の実施の形態について説明する。
まず、図１に示すように、“０１”と“１０”との２ビット固定長である基本ビット列を組み合わせた１バイトフォーマットのデータ（８ビット固定長のデータ）を、ＣＶとする。この場合、基本ビット列が２ビット固定長であり、ＣＶが８ビット固定長であるため、ＣＶは１６種類のデータとなる。なお、ここでは、１６種類の組み合わせを有するＣＶについて、それぞれのＣＶを識別するために、識別情報ｉ（ここで、ｉは０から１５の整数）を用いてＣＶ（ｉ）とする。
【００２４】
なお、ここでは、識別情報ｉとＣＶ（ｉ）との関係において、たとえば、ＣＶ（０）とＣＶ（８）とが互いにビット反転の関係にあり、ＣＶ（１）とＣＶ（９）とが互いにビット反転の関係にあり、ＣＶ（２）とＣＶ（１０）とが互いにビット反転の関係にあり、ＣＶ（３）とＣＶ（１１）とが互いにビット反転の関係にあり、ＣＶ（４）とＣＶ（１２）とが互いにビット反転の関係にあり、ＣＶ（５）とＣＶ（１３）とが互いにビット反転の関係にあり、ＣＶ（６）とＣＶ（１４）とが互いにビット反転の関係にあり、かつ、ＣＶ（７）とＣＶ（１５）とが互いにビット反転の関係にあるようにする。
【００２５】
すなわち、ＣＶ（ｋ）とＣＶ（ｋ＋８）とが互いにビット反転の関係にあるような順序とする（ここで、ｋは０から７の整数）。このような識別情報ｉとＣＶ（ｉ）との関係としておくことにより、後述するように、判定段階において、検査対象となる情報処理前のＣＶと検査対象となる情報処理後のＣＶとで、ＣＶの値が互いにビット反転の関係になるように設定しやすくなる。
【００２６】
次に、入力値をＣＶ（ｉ）として、排他的論理和演算（ＸＯＲ）した場合に、出力値がＣＶ（ｊ）となるようなＣＶＭの値を算出する。ここで、ｉおよびｊは、それぞれ、０から１５の任意の整数である。なお、以降の説明においては、ＣＶまたはＣＶＭ内で用いられるｉおよびｊは、それぞれ、０から１５の任意の整数として説明する。
【００２７】
たとえば、図２（ａ）示すように、「ＣＶ（５）（＋）ＣＶＭ＝ＣＶ（１４）」の場合、すなわち、「０１１００１１０（＋）ＣＶＭ＝１００１０１１０」の場合には、この式を満たすＣＶＭの値は、「ＣＶＭ＝１１１１００００（＝Ｆ０ｈ）」となる。なお、記号「（＋）」または「＾」は、排他的論理和演算を示す。また、記号「ｈ」は、１６進数であることを示す。
【００２８】
また、図２（ａ）と同様に、図２（ｂ）に示すように、「ＣＶ（１１）（＋）ＣＶＭ＝ＣＶ（７）」の場合、すなわち、「１０１００１０１（＋）ＣＶＭ＝０１１０１０１０」の場合には、この式を満たすＣＶＭの値は、「ＣＶＭ＝１１００１１１１（＝ＣＦｈ）」となる。
【００２９】
上記図２（ａ）および図２（ｂ）に示す演算から、ＣＶ（ｉ）とＣＶ（ｊ）とを基本ビット列を単位として順に対比してみた場合、すなわち、２ビットずつを順に対比してみた場合、ＣＶ（ｉ）の値がビット反転してＣＶ（ｊ）になる箇所のＣＶＭの値が“１１”であり、それ以外が“００”である。すなわち、ＣＶ（ｉ）とＣＶ（ｊ）との値で、ＣＶ（ｉ）の“０１”がＣＶ（ｊ）の“１０”となる箇所、または、ＣＶ（ｉ）の“１０”がＣＶ（ｊ）の“０１”となる箇所のＣＶＭの値が“１１”となり、それ以外のＣＶＭの値が“００”となる。また、ＣＶＭは、ＣＶ（ｉ）およびＣＶ（ｊ）と同じ８ビット固定長の変数である。
【００３０】
以上のようにして、全てのＣＶ（ｉ）とＣＶ（ｊ）との組み合わせに対して、ＣＶＭを全て算出する。これにより、図３に示すような、列をＣＶ（ｉ）とし、行をＣＶ（ｊ）として、ＣＶ（ｉ）とＣＶ（ｊ）とにＣＶＭが関連付けられたテーブルを算出することができる。
【００３１】
なお、本実施形態における情報処理装置は、このテーブルを変換テーブルとして予め内部の記憶部（後述するＣＶＭテーブル３）に記憶しておき、この変換テーブルの値を参照しつつ、以降に説明する処理を実行する。なお、以降、ＣＶ（ｉ）とＣＶ（ｊ）とに関連付けられているＣＶＭをＣＶＭ（ｉ，ｊ）として表現する。つまり、ＣＶＭは、ＣＶＭ（０，０）、・・・・、ＣＶＭ（１５，１５）として表現される。
【００３２】
ここで、図３のテーブルにおいては、列方向において、識別情報ｉと変換前のＣＶであるＣＶ（ｉ）とが関連付けて記憶されており、行方向において、識別情報ｊと変換後のＣＶであるＣＶ（ｊ）とが関連付けて記憶されているとともに、さらに、識別情報ｉと識別情報ｊとに関連付けてＣＶＭ（ｉ，ｊ）が変換テーブルとして記憶されている。
【００３３】
なお、この図３において、列方向のＣＶ（ｉ）と行方向のＣＶ（ｊ）とにおいて、１６種類のＣＶ順序は、互いに同じとしてある。すなわち、列方向のＣＶ（０）と行方向のＣＶ（０）とは同じ値であり、列方向のＣＶ（１）と行方向のＣＶ（１）とは同じ値であり、・・・・・、列方向のＣＶ（１５）と行方向のＣＶ（１５）とは同じである。
【００３４】
＜ＣＶを用いた基本的な検証の利用方法＞
次に、図４を用いて、上記に説明したＣＶを用いた一例としての、改竄などの検証方法について説明する。
【００３５】
まず、図４（ａ）に「通常版」として示すように、プログラムに、０１行目に処理Ａが記述されており、０２行目に処理Ｂが記述されており、０３行目に処理Ｃが記述されている場合について説明する。すなわち、処理Ａ、処理Ｂ、処理Ｃが順に記述されている場合の処理について説明する。
【００３６】
この処理が実行される場合、記述されている順に、まず、処理Ａが実行され、処理Ａの次に処理Ｂが実行され、処理Ｂの次に処理Ｃが実行される。しかしながら、この場合、処理Ａと処理Ｂと処理Ｃとのうちいずれかの処理、または、全ての処理について、バイパスされた場合であっても、そのバイパスされたことを検知することが出来ない。
【００３７】
これに対して、図４（ｂ）に「セキュア版」として示すように、プログラムの０１行目に、「CurrentCVを初期値ＣＶ（０）＝５５ｈに設定する」ことを示す記述が記述されている。
【００３８】
また、０２行目に、「処理Ａを実行する」ことを示す記述が記述されており、０３行目に、「CurrentCVを、ＣＶ（０）＝５５ｈからＣＶ（３）＝５Ａｈに変えるように、CurrentCVをＣＶＭ（０，３）とＸＯＲ演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【００３９】
また、０４行目に、「処理Ｂを実行する」ことを示す記述が記述されており、０５行目に、「CurrentCVを、ＣＶ（３）＝５ＡｈからＣＶ（１２）＝９Ａｈに変えるように、CurrentCVをＣＶＭ（３，１２）とＸＯＲ演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【００４０】
また、０６行目に、「処理Ｃを実行する」ことを示す記述が記述されており、０７行目に、「CurrentCVを、ＣＶ（１２）＝９ＡｈからＣＶ（８）＝ＡＡｈに変えるように、CurrentCVをＣＶＭ（１２，８）とＸＯＲ演算してCurrentCVに上書きする」ことを示す記述が記述されている。
【００４１】
また、０８行目に、「CurrentCVがＣＶ（８）＝ＡＡｈと一致する否かを判定し、判定した結果が一致しない場合には、異常と判定して停止する」ことを示す記述が記述されている。
【００４２】
この、図４（ｂ）に「セキュア版」として示される処理が実行される場合、まず、０１行目の処理の実行により、CurrentCVにＣＶ（０）＝５５ｈの値が書き込まれる。これにより、物理的なメモリやレジスタなどの記憶部であるCurrentCVに、ＣＶ（０）＝５５ｈの値が書き込まれる。
【００４３】
次に、０１行目の処理の実行により、処理Ａが実行される。次に、０２行目の処理の実行により、CurrentCVとＣＶＭ（０，３）とがＸＯＲ演算されてCurrentCVに上書きされることにより、CurrentCVの値が、ＣＶ（０）＝５５ｈからＣＶ（３）＝５Ａｈに更新される。
【００４４】
次に、０４行目の処理の実行により、処理Ｂが実行される。次に、０５行目の処理の実行により、CurrentCVとＣＶＭ（３，１２）とがＸＯＲ演算されてCurrentCVに上書きされることにより、CurrentCVの値が、ＣＶ（３）＝５ＡｈからＣＶ（１２）＝Ｃ０ｈに更新される。
【００４５】
次に、０６行目の処理の実行により、処理Ｃが実行される。次に、０７行目の処理の実行により、CurrentCVとＣＶＭ（１２，８）とがＸＯＲ演算されてCurrentCVに上書きされることにより、CurrentCVの値が、ＣＶ（１２）＝Ｃ０ｈからＣＶ（８）＝ＡＡｈに更新される。
【００４６】
次に、０８行目の処理の実行により、CurrentCVの値がＣＶ（８）＝ＡＡｈと一致する否かを判定する。この判定した結果が一致することにより、上記の処理が順に正常になされたと判定し、一致しない場合には、異常と判定して停止する。
【００４７】
このように、CurrentCVの値が、１行目の初期値ＣＶ（０）から、３行目のＣＶＭ（０，３）、５行目のＣＶＭ（３，１２）、７行目のＣＶＭ（１２，８）により、ＣＶ（３）、ＣＶ（１２）、ＣＶ（８）と順に更新され、０８行目の処理の実行により、CurrentCVの値がＣＶ（８）と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができる。
【００４８】
ここで、たとえば、３行目のＣＶＭ（０，３）の処理のみがバイパスされた場合には、ＣＶは、１行目の初期値ＣＶ（０）から、５行目のＣＶＭ（３，１２）により更新され、７行目のＣＶＭ（１２，８）により更新されるが、この場合には、３行目のＣＶＭ（０，３）の処理がバイパスされているために、７行目のＣＶＭ（１２，８）により更新されたＣＶの値はＣＶ（８）とならない。同様に、１行目、３行目、５行目、７行目の処理、すなわち、ＣＶの値を更新する処理のうち、１つでも処理がバイパスされた場合には、ＣＶの値はＣＶ（８）とならない。そのため、ＣＶの値を更新する処理が、全て正常に実行されたか否かを検証することができる。
【００４９】
また、２行目の処理Ａ、４行目の処理Ｂ、および、６行目の処理Ｃは、それぞれ、CurrentCVの値が順に更新される処理に挟まれて実行されている。すなわち、１行目の初期値ＣＶ（０）から、３行目のＣＶＭ（０，３）、５行目のＣＶＭ（３，１２）、７行目のＣＶＭ（１２，８）により、ＣＶ（３）、ＣＶ（１２）、ＣＶ（８）とCurrentCVの値が順に更新される処理に、２行目の処理Ａ、４行目の処理Ｂ、および、６行目の処理Ｃは挟まれている。
【００５０】
そのため、０８行目の処理の実行により、CurrentCVの値がＣＶ（８）と一致する否かを判定することにより、CurrentCVの値を更新する処理が順に実行されたか否かを検証することができるとともに、処理Ａ、処理Ｂ、処理Ｃが正しい順序で実行されたか否かを検証することができる。
【００５１】
以上のように、処理Ａ、Ｂ、Ｃが正しい順序で全て実行された場合、CurrentCVの値が順に更新され、CurrentCVの値は最後にＣＶ（８）＝ＡＡｈとなる。これを、処理の最後に検査することによって、動作の正しさを検証することが可能である。つまり、バイパスなどが行われた場合の検知が可能になる。
【００５２】
なお、ＣＶＭ（ｉ，ｊ）において、１回目のＣＶＭ（ｉ、ｊ）におけるｉの値は、初期設定で設定されたＣＶ（ｉ）の値と同じとなるようにする。この図４（ｂ）では、０３行目のＣＶＭ（０，３）におけるｉの値０と、０１行目のＣＶ（０）におけるｉの値０とを同じ値とする。
【００５３】
また、２回目以降のＣＶＭ（ｉ、ｊ）におけるｉの値は、１つ前のＣＶＭ（ｉ、ｊ）におけるｊの値と同じとなるようにする。この図４（ｂ）では、０３行目のＣＶＭ（０，３）におけるｊの値３と、０５行目のＣＶＭ（３、１２）におけるｉの値３とを同じ値とする。また、０５行目のＣＶＭ（３，１２）におけるｊの値１２と、０７行目のＣＶＭ（１２、８）におけるｉの値１２とを同じ値とする。
【００５４】
また、最後のＣＶＭ（ｉ、ｊ）におけるｊの値は、比較する場合に比較対象とするＣＶ（ｉ）におけるｉの値と同じとする。この図４（ｂ）では、０７行目のＣＶＭ（１２，８）におけるｊの値８と、０５行目のＣＶ（８）におけるｉの値８とを同じ値とする
【００５５】
このようにＣＶＭ（ｉ、ｊ）のｉとｊとの値を設定することにより、ＣＶの値が、ＣＶＭ（ｉ、ｊ）と排他的論理和演算され、すなわち、図３のテーブルに基いて順に更新されるため、ＣＶの更新処理が順に実行されたことを検証することが可能である。
【００５６】
また、初期設定で設定されたＣＶ（ｉ）と、比較する場合に比較対象とするＣＶ（ｉ）とが、互いにビット反転になるような関係になるようにＣＶＭ（ｉ、ｊ）を設定しておくことが望ましい。すなわち、初期設定で設定されたＣＶをＣＶ（ｉ）として、比較する場合に比較対象とするＣＶがＣＶ（ｉ＋８）となるように、ＣＶＭ（ｉ、ｊ）の順序を設定しておくことが望ましい。
【００５７】
これにより、判定の演算方法として、初期設定で設定されたＣＶと比較対象とするＣＶとが、互いにビット反転の関係にあるか否かを判定するだけでよく、判定の精度が向上する効果を奏する。
【００５８】
ところで、上記に説明した基本的な適用方法のみでは、次の２点の脆弱性の可能性がある。
【００５９】
＜脆弱性１＞
仮に演算途中で、CurrentCVの値を「ビット反転」させるような改竄が出来るような場合には、CurrentCVの値を別の値、つまり、ＣＶと別のＣＶに変えることができてしまう。しかしながら、現在のハードウェア製品において、物理攻撃によるビット改竄は、連続した隣同士のビットをまとめて０にしたり、１にしたりする事は可能であるが、複数のビットに対して、ビット反転させるような改竄はきわめて難しい（現在は不可能である）事が分かっている。ここで、ＣＶは、上記に説明したように、“０１”および“１０”を組み合わせた変数であるため、ビット反転攻撃には耐性がある。そのため、このようなビット反転の攻撃に対しては、ＣＶを用いることにより、対抗できる。
【００６０】
＜脆弱性２＞
上記「セキュア版」プログラムの処理Ａ（図４（ｂ）の行番号０２の処理）のみ、処理Ｂ（図４（ｂ）の行番号０４の処理）のみ、または、処理Ｃ（図４（ｂ）の行番号０６の処理）だけをうまくバイパス攻撃できてしまうと、図４（ｂ）の行番号０１、０３、０５、０７、０８のCurrentCVの計算を正常に処理されてしまうため、このようなバイパス攻撃を検知することができない。
【００６１】
このような問題について、以降に示す手段を組み合わせることにより解決することが可能である。
【００６２】
＜ＩＦ文の代わりに算術演算を利用する方法＞
次に、図５を用いて、ＩＦ文の代わりに算術演算を利用する方法について説明する。ＩＦ文として、通常、条件判断部、正常系処理部、および、例外系処理部に分かれたプログラムが記述される。バイパス攻撃によって、条件判断部（と、正常系処理部）がバイパスされてしまうと、プログラムカウンタが働いてしまい、条件判断部による条件判断が実行されずに、正常系処理部もしくは例外系処理部が動作させられてしまう可能性がある（図５（ａ）参照）。
【００６３】
ここでは、図５（ａ）に示すように、例えば、認証データｔの値が０であるか否かにより、認証が成功したか否かを判定する場合について説明する。
【００６４】
この場合、認証データｔの値が０であるか否かを判定し（１行目参照）、認証データｔの値が０である場合には、認証の成功または失敗を示す変数ｓの値を０とし（２行目参照）、認証データｔの値が０でない場合には、認証の成功または失敗を示す変数ｓの値を１とする（３行目および４行目参照）。
これにより、認証が正しい場合、すなわち認証データｔの値が０の場合には、認証の成功または失敗を示す変数ｓの値が０となる。また、それ以外、すなわち、認証が正しくなく、認証データｔの値が０でない場合には、認証の成功または失敗を示す変数ｓの値が１となる。
【００６５】
しかし、図５（ａ）に示す方法で認証データｔの値により認証の成功または失敗を示す変数ｓの値を決定する場合、たとえば、１行目、３行目、４行目などの処理がスキップされ、２行目だけが実行された場合には、認証データｔの値に関係なく、認証の成功または失敗を示す変数ｓの値が０となってしまう。
【００６６】
たとえば、認証の成功または失敗を示す変数ｓの値が１として初期化されており、認証が正しい場合、すなわち認証データｔの値が０の場合のみ、認証の成功または失敗を示す変数ｓの値が０となるものとする。ここで、図５（ａ）に示す認証方法で、認証データｔの値により認証の成功または失敗を示す変数ｓの値を決定した場合、１行目、３行目、４行目などの処理がスキップされ、２行目だけが実行された場合には、認証データｔの値に関係なく、認証の成功または失敗を示す変数ｓの値が１から０に更新されてしまう。このように、図５（ａ）に示す判定方法には、バイパス攻撃に対して脆弱性があることになる。
【００６７】
この解決手段として、条件判断部に用いられるデータを、算術演算（ここでは、論理演算）だけで算術して変換することで、ＩＦ文をなくし、バイパス攻撃に対抗できるようにすることが可能である。図５（ａ）を用いて説明した判定方法に対して、算術演算を用いた一例としての解決手段の例を、図５（ｂ）に示す。
【００６８】
この図５（ｂ）に示されるように、認証の成功または失敗を示す変数ｓの値を、認証データｔの値を用いた計算式で算出する。ここでは、認証データｔの値と、ｆ０ｈとを排他的論理和演算することにより、認証の成功または失敗を示す変数ｓの値を算出する。
【００６９】
この場合も、図５（ａ）に示される方法と同様に、認証が正しい場合、すなわち認証データｔの値が０の場合には、認証の成功または失敗を示す変数ｓの値が０となり、それ以外、すなわち、認証が正しくなく、認証データｔの値が０でない場合には、認証の成功または失敗を示す変数ｓの値が１となる。
【００７０】
この処理は、処理が１行となっているため、この１行の処理が飛ばされた場合には、認証の成功または失敗を示す変数ｓの値が変更されない。
【００７１】
そのため、たとえば、認証の成功または失敗を示す変数ｓの値が１として初期化されている場合、図５（ｂ）の１行の処理が実行されない場合には、認証の成功または失敗を示す変数ｓの値が１から変更されることはない。認証の成功または失敗を示す変数ｓの値が１から０となるのは、図５（ｂ）の１行の処理が実行され、かつ、認証が正しい場合のみ、すなわち認証データｔの値が０の場合のみである。このように、図５（ｂ）に示す判定方法には、バイパス攻撃に対して耐性があることになる。
【００７２】
＜ＣＶを内部変数としての利用する方法＞
また、内部変数の値は、演算処理部にＲＡＭ（Random Access Memory）などのメモリ（記憶装置）上に展開される。しかしながら、メモリ上に展開される場合に、メモリ周辺を電気的にオール０やオール１にし（全てのデータ端子などをＨとなる電位、または、Ｌとなる電位にし）、メモリから読み出す場合またはメモリに書き込む場合のデータの値を電気的（物理的）に変えてしまうことで、ＩＣカードなどの情報処理装置に対して、誤動作を起こさせる可能性がある。
【００７３】
例えば、ＩＣカードなどにおいて、認証処理前と後とを０または１の値である１ビットで示す認証フラグに対して、この認証フラグの値を１に改竄することにより、不正アクセスが容易にできる可能性がある（図６（ａ）参照）。
【００７４】
たとえば、図６（ａ）に示すように、まず、認証フラグauthflagの値を、認証処理前を０とし、認証処理後を１として予め定義しておく。この図６（ａ）に示す認証方法では、入力されたパスワード（authData）と格納されているパスワード（keyData）とが一致するか否かを判定し（１行目参照）、一致する場合には、認証フラグauthflagの値をTrue（＝１）とし（２行目参照）、一致しない場合には、認証フラグauthflagの値をFalse（＝０）とする（３行目および４行目参照）。
【００７５】
しかしながら、認証フラグauthflagの値は、０または１であるため、上記に説明したメモリ周辺をオール０やオール１にする攻撃に対して、すなわち電気的な攻撃に対しては、脆弱性を有している。
【００７６】
この解決手段として、図６（ｂ）に示すように、認証フラグの値にＡＡｈや５５ｈを用いることで、改竄を困難にすることが可能である。また、この図６（ｂ）では、上記の＜ＩＦ文の代わりに算術演算を利用する方法＞で説明した方法を組み合わせた認証処理方法について説明する。なお、ここでＡＡｈや５５ｈを用いる理由は、５５ｈは二進数で表記すると０１０１０１０１であり、ＡＡｈは二進数で表記すると１０１０１０１０であり、この２つの値は０と１とが順に交互になっており、かつ、全てのビットが互いにビット反転している。そのため、電気的な改ざんに対して、５５ｈからＡＡｈへの改竄、また、逆に、ＡＡｈから５５ｈへの改竄が難しいためである。
【００７７】
図６（ｂ）の説明に戻り、図６（ｂ）に示すように、ここでは、認証フラグauthflagの値を、認証処理前を５５ｈとし、認証処理後をＡＡｈとして予め定義しておく。なお、この５５ｈおよびＡＡｈは、図１を用いて説明したＣＶの値でもあり、５５ｈ＝ＣＶ（０）であり、ＡＡｈ＝ＣＶ（８）である。
【００７８】
この図６（ｂ）では、入力されたパスワード（authData）と格納されているパスワード（keyData）とが、それぞれ８個ずつあり、それぞれを順に認証する場合について説明する。まず、仮変数tmpの値をＡＡｈに初期化する（１行目参照）。次に、ループ処理により、３行目から８行目までの処理を、ループ変数ｉの値が０から７まで１つずつ増大させながら８回繰り返す（２行目と９行目とを参照）。
【００７９】
次に、このループ処理において、１回目のループ処理においては、ループ変数ｉの値が０であるため、入力されたパスワードの１つ目（authData［０］）と格納されているパスワードの１つ目（keyData［０］）との排他的論理和演算をし、この結果を変数cmpに代入する（３行目参照）。この変数cmpの値は、入力されたパスワードの１つ目（authData［０］）と格納されているパスワードの１つ目（keyData［０］）とが一致する場合には０となり、一致しない場合には０以外となる。
【００８０】
次に、変数cmpの値が１であるか否かを判定し（４行目参照）、変数cmpの値が０以外である場合には、仮変数tmpの値を５５ｈに変更し（５行目参照）、ループ処理を終了する（６行目参照）。
【００８１】
一方、変数cmpの値が０である場合には、仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する（８行目参照）。なお、この仮変数tmpの値を、仮変数tmpの値と変数cmpの値とを排他的論理和演算した値に変更する場合、変数cmpの値は０であるので、仮変数tmpの値はＡＡｈが維持される。次に、２回目のループ処理が１回目のループ処理と同様に実行される。
【００８２】
以上より、図６（ｂ）に示す認証方法では、入力されたパスワード（authData）と格納されているパスワード（keyData）とが８個全て一致している場合には、仮変数tmpの値はＡＡｈに維持され、１つでも一致しない場合には、仮変数tmpの値は５５ｈに変更される。
【００８３】
以上、図６（ｂ）を用いて説明した認証方法のように、認証フラグauthflagの値として、０と１とが順に交互になっており、かつ、全てのビットが互いにビット反転している２つの変数、たとえば、５５ｈとＡＡｈとを用いることにより、５５ｈからＡＡｈへの改竄、また、逆に、ＡＡｈから５５ｈへの改竄が難しいため、認証フラグauthflagの値の改竄が困難となる効果を奏するとともに、上記に説明した電気的な改ざんに対して、耐性を有する効果を奏する。
【００８４】
＜ＣＶを用いたＦｏｒループの実行の保証＞
次に、図７を用いて、ＣＶを用いたＦｏｒループの実行の保証について説明する。なお、ここではループ処理としてＦｏｒループについて説明するが、Ｗｈｉｌｅループなど、他のループについても同様である。
【００８５】
＜ループ処理：通常版＞
まず、図７（ａ）に示すようなＦｏｒループにおいては、Ｆｏｒループの実行中にバイパスされてしまい、しかるべき回数の処理が実行されないような誤動作が生じる可能性がある。
【００８６】
たとえば、図７（ａ）では、８回のループ処理により（１行目と３行目参照）、処理Ａを８回実行している（２行目参照）。しかしながら、１行目と３行目との処理、すなわち、８回のループ処理がバイパスされた場合には、処理Ａが１回しか実行されなくなる。また、２行目のみの処理がバイパスされた場合には、１行目と３行目とによるループ処理は８回成されるものの、処理Ａは１度も実行されないことになる。
【００８７】
＜ループ処理：セキュア版１＞
この解決手段として、図７（ｂ）に「セキュア版１」として示すように、ループ中にＣＶの演算処理を行い、ループ処理の終了後に、ＣＶの値が、演算処理が実行された後に本来あるべきＣＶの値であるか否かをチェックすることで、Ｆｏｒループが実行されたことを保証することが可能である。
【００８８】
たとえば、図７（ｂ）に示すように、まず、currentCVの値をＣＶ（０）に初期設定する（１行目参照）。次に、ループ処理により、３行目と４行目との処理を、ループ変数ｉの値を０から７に順に１つずつ増大させながら８回繰り返す（２行目と５行目とを参照）。
【００８９】
１回目のループ処理、すわなち、ループ変数ｉの値が０の場合には、３行目の処理では、処理Ａが実行される。次に、４行目の処理では、currentCVの値が、currentCVの値とＣＶＭ（ｉ，ｉ＋１）とを排他的論理和演算した値、すなわち、ＣＶ（０）とＣＶＭ（０，１）とを排他的論理和演算した値に更新される。この４行目の処理において、ＣＶＭ（０，１）により、currentCVの値が、ＣＶ（０）からＣＶ（１）に更新される。
【００９０】
２回目のループ処理、すわなち、ループ変数ｉの値が１の場合には、３行目の処理では、処理Ａが実行される。次に、４行目の処理では、currentCVの値が、currentCVの値とＣＶＭ（１，２）とを排他的論理和演算した値に更新される。この４行目の処理において、ＣＶＭ（１，２）により、currentCVの値がＣＶ（１）からＣＶ（２）に更新される。
【００９１】
同様に、３回目のループ処理では、ＣＶＭ（２，３）により、currentCVの値がＣＶ（２）からＣＶ（３）に更新される。また、４回目のループ処理では、ＣＶＭ（３，４）により、currentCVの値がＣＶ（３）からＣＶ（４）に更新される。また、５回目のループ処理では、ＣＶＭ（４，５）により、currentCVの値がＣＶ（４）からＣＶ（５）に更新される。また、６回目のループ処理では、ＣＶＭ（５，６）により、currentCVの値がＣＶ（５）からＣＶ（６）に更新される。また、７回目のループ処理では、ＣＶＭ（６，７）により、currentCVの値がＣＶ（６）からＣＶ（７）に更新される。また、８回目のループ処理では、ＣＶＭ（７，８）により、currentCVの値がＣＶ（７）からＣＶ（８）に更新される。
【００９２】
次に、８回のループ処理が終了した後、currentCVの値がＣＶ（８）と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける（６行目参照）。
【００９３】
このように、Ｆｏｒループの実行にＣＶを用いた場合においても、ＣＶの値がＣＶＭにより順に更新されていくことにより、図４（ｂ）を用いて説明したように、処理の実行、および、その順序を検証することが可能である。
【００９４】
なお、上記に図７（ｂ）を用いて説明した処理の検証においては、ＣＶＭ（ｉ，ｊ）におけるｉとｊとの値を、ループ処理で算出される変数で指定している点が、図４（ｂ）において説明した処理の検証と異なる。
【００９５】
＜ループ処理：セキュア版２＞
なお、図７（ｃ）に「セキュア版２」として示すように、ループ回数を可変にすることも可能である。図７（ｃ）では、ループ処理の回数がｎ回（ここで、ｎは１以上の任意の整数）である場合について説明する。なお、ループ処理において、予め定められたループする回数の値を、ループ処理回数ｎとして説明する。
【００９６】
たとえば、図７（ｃ）に示すように、まず、currentCVの値をＣＶ（０）に初期設定する（１行目参照）。次に、ループ処理で更新される最終的なcurrentCVをfinalCVとして、このfinalCVの値を、１行目で初期設定されたcurrentCVの値とループ処理回数ｎとに基いて算出する（２行目参照）。
【００９７】
ここでは、ループ処理回数ｎについて、ＣＶの種類の数である１６に対する剰余を算出し、ＣＶ（０）であるcurrentCVを、ＣＶＭ（０、（算出した剰余の値））と排他的論理和演算して算出する。これにより、finalCVとして、ＣＶ（算出した剰余の値）となる。
【００９８】
このように、最終的なcurrentCVの値を、１行目で初期設定されたcurrentCVの値とループ処理回数ｎとに基いて算出することが可能な理由は、図７（ｂ）で説明したループ処理と同様に、後述するこの図７（ｃ）のループ処理でも、ＣＶ（０）に初期設定されたcurrentCVの値が、ＣＶＭ（０，１）、ＣＶＭ（１，２）、ＣＶＭ（２，３）・・・・により、ＣＶ（１）、ＣＶ（２）、ＣＶ（３）・・・・と、順に更新されるからである。すなわち、ループ処理が実行される毎に、ＣＶを識別する値（ＣＶ（ｉ）のｉの値）が、順に１つずつ増大していく。そのため、ループ処理の回数ｎにより、最終的なcurrentCVの値を、ループ処理を実行する前に算出することが可能である。
【００９９】
次に、ループ処理により、４行目から６行目の処理を、ループ変数ｉの値を０からｎに順に１つずつ増大させながらｎ回繰り返す（３行目と７行目とを参照）。
【０１００】
１回目のループ処理、すわなち、ループ変数ｉの値が０の場合には、４行目の処理では、処理Ａが実行される。次に、５行目の処理では、ループ変数ｉについて、ＣＶの種類の数である１６に対する剰余を算出し、算出した剰余の値を変数ｉ０に代入する。この５行目の処理は、ＣＶの種類の数が１６であるため、ループ変数ｉが増大した場合に、たとえば、ＣＶ（１５）の次に、ＣＶ（１６）ではなく、ＣＶ（０）となるようにするためである。また、同様に、ＣＶＭ（１４，１５）の次に、ＣＶＭ（１５，１６）ではなく、ＣＶＭ（１５，０）となるようにするためである。なお、この１回目のループ処理では、ループ変数ｉの値が０であるため、変数ｉ０の値は０となる。
【０１０１】
次に、６行目の処理では、currentCVの値が、currentCVの値とＣＶＭ（ｉ０，ｉ０＋１）とを排他的論理和演算した値、すなわち、ＣＶ（０）とＣＶＭ（０，１）とを排他的論理和演算した値に更新される。この６行目の処理におけるＣＶＭ（０，１）により、currentCVの値が、ＣＶ（０）からＣＶ（１）に更新される。
【０１０２】
２回目のループ処理、すわなち、ループ変数ｉの値が１の場合には、４行目の処理では、処理Ａが実行される。次に、５行目の処理では、変数ｉ０の値が１として算出される。次に、６行目の処理では、currentCVの値が、currentCVの値とＣＶＭ（１，２）とを排他的論理和演算した値に更新される。この６行目の処理におけるＣＶＭ（１，２）により、currentCVの値がＣＶ（１）からＣＶ（２）に更新される。
【０１０３】
同様に、３回目のループ処理では、ＣＶＭ（２，３）により、currentCVの値がＣＶ（２）からＣＶ（３）に更新される。また、４回目のループ処理では、ＣＶＭ（３，４）により、currentCVの値がＣＶ（３）からＣＶ（４）に更新される。
【０１０４】
以降、図７（ｂ）で説明したループ処理と同様にＣＶの値が順に更新される。ただし、５行目の処理で、ループ変数ｉについて、ＣＶの種類の数である１６に対する剰余を算出し、算出した剰余の値を変数ｉ０に代入する点が、図７（ｃ）のループ処理と図７（ｂ）のループ処理とでは異なる。そのため、たとえば、ループ回数ｉの値が１５から１６になった場合に、ｉ０の値が１５から０に戻る点が、図７（ｃ）のループ処理と図７（ｂ）のループ処理とでは異なる。
【０１０５】
その後、ｎ回のループ処理が終了した後、currentCVの値がループ演算の前に算出したfinalCVの値と一致するか否かを判定し、判定結果が、一致しない場合には異常と判定して処理を停止し、一致する場合にはその後の処理を続ける（８行目参照）。
【０１０６】
このように、ループ回数を可変にした場合においても、ループ処理で更新される最終的なcurrentCV、すなわちfinalCVを、初期設定されたcurrentCVの値とループ処理回数ｎとに基いて算出することが可能であるため、図４（ｂ）を用いて説明したループ処理と同様に、Ｆｏｒループの実行にＣＶを用いてループ処理における処理の実行、および、その順序を検証することが可能である。
【０１０７】
なお、上記に図７（ｂ）と図７（ｃ）とを用いて説明したループ処理においては、ＣＶの識別情報（ＣＶ（ｉ）におけるｉの値）を、１つずつ増大するようにＣＶＭを指定する識別情報（ＣＶＭ（ｉ、ｊ）におけるｉとｊとの値）を算出したが、これに限られるものではなく、２つずつ増大させてもよいし、異なる方法で算出するようにしてもよい。たとえば、ｊ＝ｊｍｏｄ１６とする方法がある。
【０１０８】
ただし、ループ処理の１回目のＣＶＭ（ｉ、ｊ）におけるｉの値は、初期設定で設定されたＣＶ（ｉ）の識別情報ｉの値と同じとなるようにする。また、２回目以降のＣＶＭ（ｉ、ｊ）におけるｉの値は、１つ前のＣＶＭ（ｉ、ｊ）におけるｊの値と同じとなるようにする。また、ループ処理の最後のＣＶＭ（ｉ、ｊ）におけるｊの値は、比較する場合のＣＶ（ｉ）におけるｉの値と同じとする。このようにＣＶＭ（ｉ、ｊ）のｉとｊとの値を設定することにより、または、算出されるように設定することにより、ループ処理が順に実行されたことを検証することが可能である。
【０１０９】
＜ＣＶを用いたモジュールの返却値への応用＞
次に、図８を用いて、ＣＶをモジュールの返却値に応用する場合について説明する。たとえば、比較や認証を実行するモジュールなどが、比較結果や認証結果を返却する場合には、一般に、正常終了を示す“０”や異常終了を示す“１”などの、１ビットの簡単な値を用いることがある（図８（ａ）参照）。たとえば、この図８（ａ）に示す例では、関数ｆ１（）は、返却値として１または０を返している。
【０１１０】
しかし、モジュールからの返却値が、メモリ上に展開された場合に、そのメモリ周辺をオール０やオール１にすることで、本来の返却値を改竄してしまうことで、ＩＣカードなどに対して、誤動作を起こさせる可能性がある。すなわち、電気的な改竄に対する脆弱性を有している。
【０１１１】
この解決手段として、図８（ｂ）に「セキュア版」として示すように、モジュールの返却値としての正常終了と異常終了とを示す値として、例えば、５５ｈとＡＡｈ、または、６６ｈと９９ｈなどの値を用いる。つまり、正常終了を示す値と、異常終了を示す値とが、互いに完全にビット反転した値とする。これにより、ビット反転は難しいため、電気的な改竄に対する耐性を得ることが可能となる。
【０１１２】
なお、この５５ｈとＡＡｈとはＣＶ（０）とＣＶ（８）に対応し、また、６６ｈと９９ｈとはＣＶ（５）とＣＶ（１３）に対応している。そのため返却値として、ＣＶを用いることが可能である。
【０１１３】
また、可能であれば、モジュール内のＣＶの演算に、パラメータを含むようにすると、さらに、誤動作に対する強度が向上する（後述する＜ＣＶを用いたグローバル・スタンプ・ラリー＞を参照）。
【０１１４】
＜ＣＶを用いたグローバル・スタンプ・ラリー＞
次に、図９を用いて、グローバル・スタンプ・ラリーについて説明する。まず、本実施形態でいうグローバル・スタンプ・ラリーについて説明する。なお、ここでは、モジュールの階層構造として、最上位モジュール、Module_A、および、Module_Bとの３つの階層構造を有している場合について説明する。なお、この図９においては、後述するcurrentCVをcCV、currentCVaをcCVa、currentCVbをcCVbとして表記している。
【０１１５】
ここでは、最上位モジュールで扱うcurrentCVの値を、そのまま下層モジュールに対して渡していき、最終的に下層モジュールから最上位モジュールに処理が戻ってから、最上位モジュールにてＣＶの値を検証する。これにより、全ての階層モジュールにおいて、しかるべき動作が正しく実行されたことを保証することができる。これを、グローバル・スタンプ・ラリーと称する。
【０１１６】
なお、このグローバル・スタンプ・ラリーとは、モジュール間の各データの入出力において、このモジュール間の各データの入出力において予め設定されているＣＶＭによりcurrentCVの値を順に変換する、すなわち、currentCVの値をＣＶＭにより更新する。このcurrentCVの値をＣＶＭにより更新することを、ここでは、currentCVにＣＶＭのスタンプを押すと称して説明する。なお、このグローバル・スタンプ・ラリーでは、モジュール内の処理においても、currentCVをＣＶＭで更新する。
【０１１７】
次に、グローバル・スタンプ・ラリーを導入するための基本ルールについて説明する。
・最上位モジュール（必ずしもｍａｉｎである必要はない）で、currentCVの初期値を設定する。たとえば、図９（ａ）の１行目「currentCV＝ＣＶ（０）」を参照。なお、このＣＶ（０）は５５ｈである。
【０１１８】
・最上位モジュールは、処理の最後に、モジュールから返却されたcurrentCVの値と、下位モジュールに渡したcurrentCVの値をビット反転した値（本来返却されるべきcurrentCVの値）との排他的論理和演算を行い、００ｈになっているか否かを判定することにより、下位モジュールに渡したcurrentCVの値と下位モジュールから返却されたcurrentCVの値とが反転の関係になっているか否かを確認する。たとえば、図９（ａ）の４行目「ｉｆ（ＣＶ（１０）＾ｒｅｔ）」を参照。
【０１１９】
・各モジュール（最上位モジュールを含む）は、モジュールを呼び出す場合に、呼び出すモジュールに対して、currentCVの値をパラメータとして渡す（図９のステップＳ９１、Ｓ９２、Ｓ９３、Ｓ９４を参照）。
【０１２０】
・呼び出された各モジュール（最上位モジュールを含む）は、上位のモジュールから受け取った（または、上位モジュールが最上位モジュールである場合には、初期設定された）currentCVの値に対して、順にスタンプを押していき、モジュール内処理が終了する前に、必ず、currentCVの値がビット反転するようにし、上位モジュールに最後のＣＶを返却する。言い換えると、受け取った場合のcurrentCVの値と、返却するcurrentCVの値とが、互いにビット反転する関係になるように、スタンプラリーを予め設定しておく（たとえば、図９（ｃ）のＣＶＭ（４，７）、ＣＶＭ（７，８）、ＣＶＭ（８，１２）を参照）。
【０１２１】
なお、上記に説明したようにスタンプラリーを設定することにより、各モジュールにおいて、呼び出したモジュールの処理が終了した場合において、呼び出したモジュールに渡したＣＶの値と、呼び出したモジュールから受け取ったＣＶの値とは、互いにビット反転しているはずである。
【０１２２】
そこで、各モジュールは、たとえば、呼び出したモジュールが認証など重要なモジュールである場合には、必要に応じて、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にあるか否かを判定することにより、呼び出したモジュールの動作を検査する。
【０１２３】
各モジュールは、この判定結果が、呼び出したモジュールに渡したcurrentCVの値と、呼び出したモジュールから受け取ったcurrentCVの値とが、互いにビット反転している関係にない場合、つまり、検査ＮＧの場合には、動作異常と判定して、予め定められた動作異常対処処理を実行する。
なお、呼び出されたモジュールは、返却値として、可能な限りＣＶを用いるようにする。
【０１２４】
＜グローバル・スタンプ・ラリーの動作＞
次に、図９の場合について、一例としてのグローバル・スタンプ・ラリーの動作について説明する。なお、ここでは、currentCVの値を更新する処理のみについて説明する。
まず、図９（ａ）の最上位モジュールにおいて、currentCVの値がＣＶ（０）に初期設定される（図９（ａ）１行目参照）。次に、currentCVの値が、ＣＶＭ（０，２）により、ＣＶ（０）からＣＶ（２）に更新される（図９（ａ）２行目参照）。次に、Module_Aを、Module_A（currentCV）として呼び出すことにより、呼び出すModule_AにＣＶ（２）であるcurrentCVを渡す（図９（ａ）３行目参照）（ステップＳ９１）。
【０１２５】
次に、ステップＳ９１で最上位モジュールに呼び出されたModule_Aは、渡されたＣＶ（２）を、Module_A内のローカルな変数であるcurrentCVaとして受け取り、この受け取ったcurrentCVaを、ＣＶＭ（２，４）により、ＣＶ（４）に更新する（図９（ｂ）１行目参照）。次に、Module_Bを、Module_B（currentCVa）として呼び出すことにより、呼び出すModule_BにＣＶ（４）であるcurrentCVaを渡す（図９（ｂ）２行目参照）（ステップＳ９２）。
【０１２６】
次に、ステップＳ９２でModule_Aに呼び出されたModule_Bは、渡されたＣＶ（４）を、Module_B内のローカルな変数であるcurrentCVbとして受け取り、この受け取ったcurrentCVbを、ＣＶＭ（４，７）により、ＣＶ（７）に更新する（図９（ｃ）１行目参照）。次に、ＣＶ（７）であるcurrentCVbを、ＣＶＭ（７，８）により、ＣＶ（８）に更新する（図９（ｃ）２行目参照）。次に、ＣＶ（８）であるcurrentCVbを、ＣＶＭ（８，１２）により、ＣＶ（１２）に更新する（図９（ｃ）３行目参照）。次に、ＣＶ（１２）であるcurrentCVbを、自モジュールを呼び出したModule_Aに返却する（図９（ｃ）４行目参照）（ステップＳ９３）。
【０１２７】
ここで、ステップＳ９２でModule_AがModule_Bに渡したcurrentCVaの値であるＣＶ（４）と、ステップＳ９３でModule_BがModule_Aに返却したcurrentCVbの値であるＣＶ（１２）とは、互いにビット反転の関係にある。
【０１２８】
次に、ステップＳ９３でModule_BからＣＶ（１２）であるcurrentCVbの値を返却されたModule_Aは、返却されたcurrentCVbの値を、返却値を代入するための変数である返却値retに代入する（図９（ｂ）２行目参照）。次に、返却値ret、すなわち、ステップＳ９３でModule_Bから返却されたcurrentCVbの値と、Module_Bに渡したＣＶ（４）とビット反転の関係にあるＣＶ（12）とを排他的論理和演算することにより、返却値retとModule_Bに渡したＣＶ（４）がビット反転の関係にあるかを判定する。判定値が００ｈにならない場合は、返却値が誤っているため、処理を中止する（図９（ｂ）３行目参照）。
【０１２９】
この判定処理により、Module_Bにおいて、処理が正常な順序で実行され、かつ、処理がバイパスされていないことを判定できる。なお、処理が正常な順序で実行され、かつ、バイパスがされていない場合には、ステップＳ９２でModule_AがModule_Bに渡したcurrentCVaの値であるＣＶ（４）と、ステップＳ９３でModule_BがModule_Aに返却したcurrentCVbの値であるＣＶ（１２）とは、互いにビット反転の関係にあるはずであることにより、この判定が可能である。
【０１３０】
次に、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、ＣＶ（１１）とＦＦｈとを、排他的論理和演算した値で、currentCVaの値を更新する（図９（ｂ）４行目参照）。ここでは、Module_Bに渡したcurrentCVaの値はＣＶ（４）であり、Module_Bからの返却値retの値はＣＶ（１２）である。そのため、この演算は、ＣＶ（４）とＣＶ（１２）とＣＶ（１１）とＦＦｈとを排他的論理和演算することになる。ここで、この排他的論理和演算した値はＣＶ（１１）となるため、currentCVaの値はＣＶ（１１）に更新される。
【０１３１】
なお、上記図９（ｂ）４行目の処理において、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retの値とは、上記に説明したように、Module_Bで正常に処理が実行された場合には、互いにビット反転の関係にある。そのため、Module_Bに渡したcurrentCVaの値と、Module_Bからの返却値retの値と、ＣＶ（ａ）と、ＦＦｈとを、それぞれ排他的論理和演算した場合、その値はＣＶ（ａ）となる。この識別変数ａは、０から１５の任意の整数である。
これは、Module_Bに渡したcurrentCVaの値とModule_Bからの返却値retとの排他的論理和演算した結果は、互いにビット反転した値同士を排他的論理和演算することからＦＦｈとなり、このＦＦｈに対して、更にＦＦｈと排他的論理和演算することにより００ｈとなるためである。
【０１３２】
このように、検証をするための変数（この場合は、currentCV、currentCVaまたはcurrentCVb）の値を更新する演算に、モジュールからの返却値retの値を直接用いることにより、検証をするための変数の値にモジュールからの結果を反映させることが可能である。また、このようにモジュールからの返却値の値を反映した検証をするための変数の値を判定することにより、モジュールにおいて記述された順序通りに処理が実行されたか否かを検証することが可能となる。
【０１３３】
次に、ＣＶ（１１）であるcurrentCVaの値を、ＣＶＭ（１１，１０）により、ＣＶ（１０）に更新する（図９（ｂ）５行目参照）。次に、ＣＶ（１０）であるcurrentCVaの値を、自モジュールを呼び出した最上位モジュールに返却する（図９（ｂ）６行目参照）（ステップＳ９４）。
【０１３４】
このステップＳ９１とステップＳ９４とにおいても、ステップＳ９２とステップＳ９３と同様に、ステップＳ９１で最上位モジュールがModule_Aに渡したcurrentCVの値であるＣＶ（２）と、ステップＳ９４でModule_Aが最上位モジュールに返却したcurrentCVaの値であるＣＶ（１０）とは、互いにビット反転の関係にある。
【０１３５】
次に、ステップＳ９４でModule_AからＣＶ（１０）であるcurrentCVの値を返却された最上位モジュールは、返却されたcurrentCVの値を、返却値を代入するための変数retに代入する（図９（ａ）３行目参照）。次に返却されたcurrentCVの値とModule_Aから返却されるべきcurrentCVの値であるＣＶ(１０）との排他的論理和演算を行い、００ｈになっているか否かを判定することにより、Module_Aに渡したＣＶ（２）とModule_Bから返却されたＣＶ（１０）とがビット反転の関係になっているか否かを確認する（図９（ａ）４行目参照）。
【０１３６】
次に、currentCVの値と変数retの値とＣＶ（７）とＦＦｈとの排他的論理和演算を行い、currentCVの値とする（図9（ａ）５行目参照）。次に、currentCVの値を、ＣＶＭ（７，８）により、ＣＶ（８）に更新する（図9（ａ）６行目参照）。次に、currentCVの値とＣＶ（８）とが、互いにビット反転の関係にあるか否かを判定する（図9（ａ）７行目参照）。この判定結果が、ビット反転関係にない場合は、処理を中止し、ビット反転関係である場合は、その後の処理を継続する。
【０１３７】
以上のようにして、複数のモジュール間においても、ＣＶを順に更新していくことにより、処理が順に実行されたことを検証することができ、また、処理がバイパスされていないことを検証することが可能である。
【０１３８】
以上説明したように、ＣＶを用いることにより、次のような効果を奏する。
（１）バイパス検知、つまり、プログラムステップを飛ばして処理が行われてしまうことを検知することが可能である。
（２）改竄の検知、つまり、プログラム処理中のある値が改竄されてしまうことを検知することが可能である。
【０１３９】
（３）また、次のことにより、バイパス検知または改竄の検知のために追加される処理で必要となる演算時間を低減することが可能である。
・ＩＦ文を減らすこと。
・算術演算ではなく、ＸＯＲ演算（排他的論理和演算）という論理演算を利用すること。一般的に、算術演算に対比して、論理演算の方が、演算時間が早い。また、本実施形態においては、変換テーブルを用いてＸＯＲ演算を実行するため、更に演算時間が早い。
・１バイト単位の変数エリアとワークエリアを２〜３バイト準備するだけでよいこと。
【０１４０】
次に、図１０を用いて、一例としての上記に説明した本実施形態のＩＣカードなどの情報処理装置１の構成について説明する。情報処理装置１は、検証メモリ部２、ＣＶＭテーブル３、情報処理部４、ＣＶ初期値設定部５、ＣＶ演算部６、ＣＶ判定部７、および、異常動作対処部８を有する。なお、ＣＶＭテーブル３は、変換前ビット列記憶部（ビット列記憶部）３１と、変換後ビット列記憶部３２と、変換テーブル記憶部（変換ビット列記憶部）３３とを有する。なお、このＣＶＭテーブル３において、変換前ビット列記憶部３１と、変換後ビット列記憶部３２と、変換テーブル記憶部３３とは、図３に示すように、一体としたテーブルとしてもよい。また、後述するように変換前ビット列記憶部３１と変換後ビット列記憶部３２とには、同一の情報が記憶されるため、この変換前ビット列記憶部３１と変換後ビット列記憶部３２とを一体として１つの記憶部、たとえば、ビット列記憶部３４としてもよい。
【０１４１】
変換前ビット列記憶部３１には、少なくとも０と１とを含む２ビット長以上の第１の固定ビット長（たとえば、２ビット長）である複数の基本ビット列（たとえば、“０１”と“１０”）を組み合わせた第２の固定ビット長（たとえば、１バイト長）のビット列のデータ型を型Ａとして、型Ａのビット列の値であって、値が互いに異なるｍ個の値が、変換前ビット列を識別する変換前ビット列識別情報（識別子ｉ（ｉ＝０，・・・，ｍ−１））と関連付けて、型Ａのビット列の配列Ｘ（ｉ）として予め記憶されている（たとえば、図３のｉとＣＶ（ｉ）とを参照）。
【０１４２】
ここで、第１の固定ビット長の値をＬ１とし、第２の固定ビット長の値をＬ２とし、基本ビット列の個数をＵ個とした場合には、変換前ビット列の個数ｍの値は、ｍ＝Ｕ（Ｌ２／Ｌ１）となる。なお、Ｕの値は最大ではＵ＝２Ｌ１であるが、基本ビット列を、後述するように互いにビット反転した２つの基本ビット列とした場合には、Ｕ＝２となる。たとえば、図３を用いて説明した基本ビット列と変換前ビット列との場合には、基本ビット列の個数が２個で、固定ビット長の値Ｌ１が２で、第２の固定ビット長の値Ｌ２が８であるため、変換前ビット列の個数ｍの値は、ｍ＝２（８／２）＝２４＝１６となる。
【０１４３】
変換後ビット列記憶部３２には、基本ビット列を組み合わせた第２の固定ビット長の変数である変換後ビット列が、変換後ビット列を識別する変換後ビット列識別情報（識別子ｊ（ｊ＝０，・・・，ｍ−１））と関連付けて予め記憶されている（たとえば、図３のｊとＣＶ（ｊ）とを参照）。よって、この変換後ビット列記憶部３２には、変換前ビット列記憶部３１と同一の情報が記憶されることになる。そこで、以降においては、変換前ビット列記憶部３１と変換後ビット列記憶部３２とを一体として、ビット列記憶部３４として説明する。
【０１４４】
変換テーブル記憶部３３には、変換前識別情報と変換後識別情報とに関連付けて、当該変換前識別情報で識別される変換前ビット列と排他的論理和演算することにより当該変換後識別情報で識別される変換後ビット列に変換させる変換ビット列が変換テーブルとして予め記憶されている（たとえば、図３のｉとｊとＣＶＭ（ｉ，ｊ）とを参照）。
すなわち、変換テーブル記憶部３３には、型Ａのビット列Ｘ（ｋ）と排他的論理和演算することで型Ａのビット列Ｘ（ｌ）となるようなビット列の配列Ｚ（ｋ，ｌ）（ｋ，ｌ＝０，・・・，ｍ−１）が変換ビット列として記憶されている。
【０１４５】
なお、この複数の基本ビット列は、互いにビット反転した２つの基本ビット列である（たとえば、“０１”と“１０”）。
【０１４６】
また、ビット列記憶部３４に記憶されている変換前ビット列と変換後ビット列記憶部３２に記憶されている変換後ビット列とは、少なくとも、互いにビット反転の関係にある変換前ビット列と変換後ビット列とを有している。
【０１４７】
なお、ビット列記憶部３４には、複数の変換前ビット列と変換前ビット列識別情報とが関連付けて予め記憶されている。また、変換後ビット列記憶部３２には、複数の変換後ビット列と変換後ビット列識別情報とが関連付けて予め記憶されている。また、変換テーブル記憶部３３には、複数の変換前識別情報と複数の変換後識別情報とに関連付けて、複数の変換ビット列が変換テーブルとして予め記憶されている。
【０１４８】
また、ビット列記憶部３４に関連付けて記憶されている複数の変換前ビット列と変換前ビット列識別情報との組み合わせと、変換後ビット列記憶部３２に関連付けて記憶されている複数の変換後ビット列と変換後ビット列識別情報との組み合わせは、互いに一致するようにされている。
【０１４９】
検証メモリ部２には、検証用となる変数の値が記憶される。情報処理部４は、予め定められたプログラムの記述に基づいて順に情報処理を実行する。なお、情報処理装置１は、このプログラムを記憶するためのプログラム記憶部を内部に有している。また、情報処理部４は、ループ処理がループされる毎に算出される変数をループ変数として有している。
【０１５０】
また、情報処理部４は、後述する設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部３４から読み出して、ＣＶ初期値設定部５を介して検証メモリ部２に記憶する。
また、情報処理部４は、ＣＶ演算部６により、検証メモリ部２から読み出した変数と変換ビット列とを排他的論理和演算して、検証メモリ部２に上書きする。
また、情報処理部４は、ＣＶ判定部７により、検証メモリ部２から読み出した変数の値に基いて、後述する検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【０１５１】
また、情報処理部４は、ＣＶ判定部７による判定結果が、後述する検証演算記述による排他的論理和演算が実行されていない場合には、異常動作対処部８により、予め定められた異常動作対処を実行する。
【０１５２】
以降からの情報処理装置１の構成について説明においては、プログラム記憶部に記憶されているプログラムと、情報処理部４の動作についてのみ説明する。
【０１５３】
予め定められたプログラムには少なくとも、変換前ビット列識別情報で識別される変換前ビット列、すなわちビット列記憶部３４に記憶されている型Ａのある値を検証メモリ部２に記憶させることを示す記述である設定記述と、検査対象となる情報処理である検査対象情報処理を実行することを示す記述である情報処理記述と、検証メモリ部２に記憶されている変数を変換前識別情報と変換後識別情報とで識別される変換ビット列で、すなわち変換テーブル記憶部３３より読み出した変換ビット列で排他的論理和演算した値を検証メモリ部２に上書きすることを示す記述である検証演算記述と、検証メモリ部２に記憶されている変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定することを示す記述である判定記述とが、予め記述されている。なお、このプログラムには、設定記述の後に情報処理記述が記述され、情報処理記述の後に検証演算記述が記述され、かつ、検証演算記述の後に判定記述が記述されるように予め記述されている。
【０１５４】
また、このプログラムには、情報処理記述およびその後に検証演算記述が記述されている記述を情報処理検証演算記述として、設定記述の後に、ｎ個（ｎは任意の自然数）の情報処理検証演算記述が順に記述され、かつ、ｎ個の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【０１５５】
この設定記述には、ビット列記憶部３４に記憶されている型Ａの値であるＸ（ｐ０）（ｐ０は、０〜ｍ−１の間の任意の値の識別子）を検証メモリ部２に記憶させるように記述されている。また、ｎ個の情報処理検証演算記述のうちｉ番目の記述の中の検証演算記述には、検証メモリ部２に記憶されている変数を、変換テーブル記憶部３３より読み出した変換ビット列であるＺ（ｐｉ−１，ｐｉ）（ｐｉは０〜ｍ−１の間の任意の識別子）が示す値で排他的論理和演算し、検証メモリ部２に上書きするように予め記述されている。
【０１５６】
また、この判定記述には、検証メモリ部２に記憶されている変数が、Ｘ（ｐ０）＾Ｚ（ｐ０，ｐ１）＾・・・・＾Ｚ（ｐｎ−１，ｐｎ）（＾は排他的論理和演算）の値となるＸ（ｐｎ）（ｐｎは０〜ｍ−１の間の任意の識別子）であって、ビット列記憶部３４から読み出したＸ（ｐｎ）の値と一致するか否かを判断するように予め記述されている。
【０１５７】
この場合、情報処理部４は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部３４から読み出して検証メモリ部２に記憶する。すなわち、情報処理部４は、設定記述に基いて、ビット列記憶部３４より読み出した型Ａのある値を検証メモリ部２に記憶する。
【０１５８】
次に、情報処理部４は、情報処理検証演算記述に含まれている情報処理記述に基いて、検査対象情報処理を実行し、情報処理検証演算記述に含まれている検証演算記述に基いて、検証メモリ部２から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部３３の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部２に上書きする。
すなわち、情報処理部４は、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部２から読み出した変数と、変換テーブル記憶部３３から読み出した変換ビット列とを排他的論理和演算した値を検証メモリ部２に上書きする。
【０１５９】
次に、情報処理部４は、判定記述に基いて、検証メモリ部２から読み出した変数の値に基いて、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
すなわち、情報処理部４は、判定記述に基づいて、検証メモリ部２から読み出した変数の値が、ビット列記憶部３４から読み出した型Ａのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【０１６０】
なお、この判定記述には、検証メモリ部２に記憶されている変数と変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定することを示す記述が記述されている。
【０１６１】
この場合、情報処理部４は、この判定記述に基いて、検証メモリ部２から読み出した変数と、ビット列記憶部３４から読み出した変換後ビット列識別情報で識別される変換後ビット列とが互いにビット反転の関係にあるか否かを判定する。
【０１６２】
すなわち、設定記述に基づいて検証メモリ部２に記憶された型Ａの値と、判定記述に基づいてビット列記憶部３４より読み出された型Ａの値とは、互いにビット反転の関係にある。
【０１６３】
また、予め定められたプログラムには少なくとも、設定記述と、複数の情報処理検証演算記述と、判定記述とが、設定記述の後に複数の情報処理検証演算記述が順に記述され、複数の情報処理検証演算記述の後に判定記述が記述されるように予め記述されている。
【０１６４】
この場合、情報処理部４は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部３４から読み出して検証メモリ部２に記憶する。次に、情報処理部４は、複数の情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部２から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部３３の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部２に順に上書きする。次に、情報処理部４は、判定記述に基いて、検証メモリ部２から読み出した変数と、ビット列記憶部３４から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、複数の情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【０１６５】
なお、複数の情報処理検証演算記述のうち最初の情報処理検証演算記述に含まれている検証演算記述の記述において、設定記述に記述されている変換前ビット列識別情報が、検証メモリ部２に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【０１６６】
また、複数の情報処理検証演算記述のうち２番目以降の情報処理検証演算記述に含まれている検証演算記述の記述において、１つ前の情報処理検証演算記述に含まれている検証演算記述に記述されている変換後識別情報が、検証メモリ部２に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報として記述されている。
【０１６７】
また、複数の情報処理検証演算記述のうち最後の情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部２に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報が、検証メモリ部２に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換後識別情報として記述されている。
【０１６８】
＜ＣＶを用いたＦｏｒループの実行の保証＞
ここで、情報処理記述の後に検証演算記述が記述されている記述を情報処理検証演算記述とする。また、予め定められたプログラムには少なくとも、設定記述と、ループ処理を実行することを示す記述ともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行することを示す記述が記述されているループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【０１６９】
この場合、情報処理部４は、設定記述に基いて、変換前ビット列識別情報で識別される変換前ビット列をビット列記憶部３４から読み出して検証メモリ部２に記憶する。次に、情報処理部４は、ループ処理記述に基いてループ処理を実行するとともに、該実行しているループ処理内で情報処理検証演算記述に基いて、検査対象情報処理を実行するとともに、検証メモリ部２から読み出した変数と、変換前識別情報と変換後識別情報とで識別される変換ビット列であって、変換テーブル記憶部３３の変換テーブルから読み出した変換ビット列とを排他的論理和演算して検証メモリ部２に順に上書きする。次に、情報処理部４は、判定記述に基いて、検証メモリ部２から読み出した変数と、ビット列記憶部３４から読み出した変換後ビット列識別情報で識別される変換後ビット列とに基いて、ループ処理の実行において情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が順に実行されたか否かを判定する。
【０１７０】
また、ループ処理内で実行される情報処理検証演算記述に含まれている検証演算記述の記述において、検証メモリ部２に記憶されている変数と排他的論理和演算するための変換ビット列を指定するための変換前識別情報および変換前識別情報の値がループ変数に基いて算出されるような算出手順が記述されている。
【０１７１】
なお、この算出手順は、ループ処理が実行される場合に、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最初に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値となる、ように予め記述されている。
【０１７２】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が２回目以降に実行される場合には、ループ変数に基いて算出される変換前識別情報の値が、１つ前に情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が実行された場合に算出された変換後識別情報の値となるように予め記述されている。
【０１７３】
また、この算出手順は、情報処理検証演算記述に含まれている検証演算記述による排他的論理和演算が最後に実行される場合には、ループ変数に基いて算出される変換後識別情報の値が、検証メモリ部２に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値となるように予め記述されている。
【０１７４】
また、ループ処理を実行する回数の値が予め定められており、検証メモリ部２に記憶されている変数を判定するために判定記述に記述されている変換後ビット列識別情報の値が、設定記述に記述されている変換前ビット列識別情報の値と、ループ処理を実行する回数の値とに基いて算出される。
【０１７５】
より具体的には、たとえば、予め定められたプログラムには、少なくとも、設定記述と、ループ処理を実行することを示す記述とともに、該記述されているループ処理が実行される場合に、該実行されているループ処理内で情報処理検証演算記述を実行する事を示す記述であるループ処理記述と、判定記述とが、設定記述の後にループ処理記述が記述され、かつ、ループ処理記述の後に判定記述が記述されるように予め記述されている。
【０１７６】
この設定記述には、値０の識別子で対応づけられるＸ（０）の値を検証メモリ部に記憶させるように記述されている。また、ループ処理記述中の検証演算記述には、検証メモリ部に記憶されている変数を、変換テーブル記憶部３３より読み出した変換ビット列であるＺ（ｉ−１，ｉ）（ｉはループ内ｉ番目に処理される回数値）が示すビット列の値で排他的論理和演算し、検証メモリ部に上書きするように予め記述されている。また、判定記述には、検証メモリ部に記憶されている変数が、ビット列記憶部３４から読み出したＸ（ｎ）（ｎ＝１〜ｍであり、ループ回数）の値と一致するか否かを判断するように予め記述されている。
【０１７７】
この場合、情報処理部４は、設定記述に基づいて、ビット列記憶部３４より読み出した型Ａのある値を検証メモリ部に記憶し、情報処理検証演算記述に基づいて、検査対象情報処理を実行するとともに、検証メモリ部から読み出した変数と、変換テーブル記憶部３３から読みだした変換ビット列とを排他的論理和演算した値を検証メモリ部に上書きし、判定記述に基づいて、検証メモリ部から読み出した変数の値が、ビット列記憶部３４から読み出した型Ａのビット列と一致するか否かを判定することにより、検証演算記述による排他的論理和演算が実行されたか否かを判定する。
【０１７８】
＜ＣＶを用いたモジュールの返却値への応用＞
また、予め定められたプログラムには、下位モジュールを呼び出し、検証メモリ部２に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得することを示す記述であるモジュール呼出記述と、モジュール呼出記述で呼び出した下位モジュールからの返却値が、予め定められたビット列であるか否かを検証することを示す返却値判定記述とが、モジュール呼出記述の後に返却値判定記述が記述されるように予め記述されている。
【０１７９】
この場合、情報処理部４は、モジュール呼出記述に基づいて、下位モジュールを呼び出し、検証メモリ部２に記憶されている検証用となる変数を呼び出す下位モジュールに渡すとともに、呼び出された下位モジュールからの返却値を取得し、返却値判定記述に基づいて、モジュール呼出記述で呼び出した下位モジュールからの返却値が、下位モジュールが記述順通りに実行された場合に返却されるビット列であるか否かを検証する。
【０１８０】
また、返却値判定記述には、検証メモリ部２に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証することを示す記述が記述されている。
【０１８１】
この場合、情報処理部４は、返却値判定記述に基づいて、検証メモリ部２に記憶されている検証用となる変数であって、呼び出すモジュールに渡した変数の値と、モジュール呼出記述で呼び出したモジュールからの返却値の値とが、互いにビット反転の関係にあることを検証することにより、モジュール呼出記述で呼び出したモジュールからの返却値の値を検証する。
【０１８２】
ところで、以降においては、情報処理装置１は、モジュール内検証メモリ部を有しているものとして説明する。このモジュール内検証メモリ部とは、検証メモリ部２と同様のメモリ部である。このようなモジュール内検証メモリ部を用いることにより、すなわち、モジュール内のローカル変数としての変数を用いることにより、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証をすることが可能である。
なお、このようなモジュール内検証メモリ部を用いることなく、検証メモリ部２のみを用いても、モジュール間でプログラムの記述順の通りに処理が実行されたか否かの検証を同様に実行することは可能である。検証メモリ部２のみを用いる場合には、この検証メモリ部２には、たとえば、グローバル変数としての変数が記憶される。
【０１８３】
モジュール呼出し記述に基づいて呼出される下位モジュールのプログラムには、自モジュールを呼出した上位モジュールより渡された変数を、変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算してモジュール内検証メモリ部に記憶する事を示す記述であるモジュール内設定記述と、自モジュール内における検査対象となる情報処理であるモジュール内検査対象情報処理を実行する事を示す記述であるモジュール内情報処理記述と、モジュール内検証メモリ部に記憶されている変数を変換ビット列記憶部より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に上書きする事を示す記述であるモジュール内検証演算記述と、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却することを示す返却記述とが記述されている。
なお、モジュール内情報処理記述およびその後にモジュール内検証演算記述が記述されている記述をモジュール内情報処理検証演算記述として、モジュール内設定記述の後にモジュール内情報処理検証演算記述が記述され、かつ、モジュール内情報処理検証演算記述の後に返却記述が記述されるように記述されている。
【０１８４】
この場合、情報処理部４は、モジュール内設定記述に基づいて、自モジュールを呼出した上位モジュールより渡された変数を変換ビット列記憶部３３より読み出した変換ビット列で排他的論理和演算した値をモジュール内検証メモリ部に記憶し、モジュール内情報処理検証演算記述に基づいて、モジュール内検査対象情報処理を実行するとともに、モジュール内検証メモリ部から読み出した変数と、変換ビット列記憶部から読み出した変換ビット列とを排他的論理和演算した値をモジュール内検証メモリ部に上書きし、返却記述に基づいて、モジュール内検証メモリ部に記憶されている変数の値を、上位モジュールに返却値として返却する。
【０１８５】
なお、モジュール内設定記述に基づき、モジュール内検証メモリ部に記憶される上位モジュールより渡された変数と、返却記述に基づき、上位モジュールに返却される返却値とは、互いにビット反転の関係になるように予め設定されている。
【０１８６】
この場合、情報処理部４は、モジュール内検証演算記述および返却記述に基づいて、渡された検証用となる変数と互いにビット反転の関係にある返却値を返却する。
【０１８７】
なお、上記の＜ＣＶを用いたモジュールの返却値への応用＞の説明においては、下位モジュールを呼び出す場合についてのみ説明したが、これに限られるものではなく、上位モジュールを呼び出す場合、または、階層関係にない任意のモジュールを呼び出す場合にも、同様の処理を実行することが可能である。
【０１８８】
＜ＣＶを内部変数としての利用する方法＞
また、検査対象情報処理による情報処理をするプログラムの記述において、２値の値をとる２つの内部変数として、少なくとも０と１とを含む２ビット長以上の第３の固定ビット長である複数の基本ビット列を組み合わせた第４の固定ビット長の変数である２つの変数であって、互いにビット反転の関係にある２つの変数を用いる。
【０１８９】
＜ＩＦ文の代わりに算術演算を利用する方法＞
また、検査対象情報処理となる情報処理のプログラムの記述において、条件判断の処理がある場合には、条件判断の対象となる変数に基づいた算術演算により条件判断する記述が条件判断記述として予め記述されている。この場合、情報処理部４は、条件判断記述に基づいて、条件判断の対象となる変数に基づいた算術演算により条件判断する。
【０１９０】
以上図１０を用いて説明した一例としての情報処理装置１の構成により、この情報処理装置１は、図４から図９を用いて説明した各処理を実行することが可能である。
【０１９１】
なお、上記に図１から図９を用いて説明した実施形態の説明においては、基本ビット列として、“０１”と“１０”などの２ビット固定長の場合について説明したが、基本ビット列は、このような２ビット固定長に限られるものではなく、たとえば、“０１０１”と“１０１０”との４ビット固定長であってもよい。または、同様に、基本ビット列として、８ビット固定長などであってもよい。
【０１９２】
また、本実施形態においては、全ビット反転する攻撃が技術的に難しいことを用いているため、この複数の基本ビット列は、互いにビット反転した２つの基本ビット列であることが望ましい。また、この基本ビット列においては、２ビット表現した場合に、０と１とが順に交互となっている方が望ましい。しかし、たとえば、基本ビット列として、“０１１０”と“１００１”など、少なくとも０と１とを含む２ビット長以上であってもよい。
【０１９３】
また、上記に図１から図９を用いて説明した実施形態の説明においては、ＣＶとして１バイト固定長（８ビット固定長）の場合について説明したが、これに限られるものではなく、１６ビット固定長、３２ビット固定長などであってもよい。なお、基本ビット列の固定ビット長、および、ＣＶの固定ビット長は、演算に要する負荷や、演算に要する時間、内部のＣＶＭテーブル３に予め保存することが必要となる情報の情報量、また、固定ビット長に依存するセキュリティの度合いにより、適宜設定されてもよい。
【０１９４】
なお、図４から図９を用いて説明した各処理においては、プログラム中に記述において、ＣＶＭを、ＣＶＭ（ｉ，ｊ）としてｉおよびｊの識別情報で指定し、ＣＶＭテーブル３から識別情報ｉおよびｊに対応するＣＶＭの値を読み出すようにしていたが、これに限られるものではなく、ＣＶＭ（ｉ，ｊ）の値そのものを、プログラム中に予め記述するようにしてもよい。
【０１９５】
なお、上記の説明においては、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に予め記述されているとして説明したが、予め情報処理記述が記述されているプログラムに、設定記述、検証演算記述、および、判定記述を自動的に埋め込む記述埋込装置により、設定記述、情報処理記述、検証演算記述、および、判定記述が、プログラムの記述に記述されるようにしてもよい。
【０１９６】
なお、上記に説明した実施形態の説明においては、情報処理装置１としてＩＣカードなどについて説明したが、これに限られるものではなく、情報処理装置１はパーソナルコンピュータまたは携帯電話などのコンピュータ装置であってもよい。
【０１９７】
また、上記に説明した実施形態の説明においては、１つの情報処理装置１におけるモジュール間の入出力にＣＶを用いる場合について説明したが、これに限られるものではなく、複数の装置間の入出力、例えば、通信機能を有する複数の通信装置間の通信において、その通信の送信および受信としての入出力に、上記実施形態に説明したＣＶを用いることも可能である。
【０１９８】
たとえば、図９を用いて説明したモジュール間のグローバル・スタンプ・ラリーにおいて、各モジュールを各通信装置とし、モジュール間のＣＶの受け渡しを、通信装置間の通信における送受信としてもよい。この場合にも、上記実施形態に説明したＣＶを用いることにより、モジュールの場合と同様に、各装置における処理の正常性を検査することが可能である。
【０１９９】
なお、上記の通信としては、有線、無線、接触型、または、非接触型の通信であってもよい。また、このような通信をする通信装置として、たとえば、ＩＣカードとＩＣカード読取装置とであってもよい。
【０２００】
なお、情報処理装置１の検証メモリ部２またはＣＶＭテーブル３は、ハードディスク装置や光磁気ディスク装置、フラッシュメモリ等の不揮発性のメモリや、ＣＲ−ＲＯＭ等の読み出しのみが可能な記憶媒体、ＲＡＭのような揮発性のメモリ、あるいはこれらの組み合わせにより構成されるものとする。
【０２０１】
なお、図１０における情報処理装置１は専用のハードウェアにより実現されるものであってもよく、また、メモリおよびマイクロプロセッサにより実現させるものであってもよい。
なお、この情報処理装置１は専用のハードウェアにより実現されるものであってもよく、また、この情報処理装置１はメモリおよびＣＰＵ（中央情報処理装置）により構成され、情報処理装置１の機能を実現するためのプログラムをメモリにロードして実行することによりその機能を実現させるものであってもよい。
【０２０２】
また、図１０における情報処理装置１の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより情報処理装置１の各機能による処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものとする。
【０２０３】
また、「コンピュータシステム」は、ＷＷＷシステムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【０２０４】
以上、この発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【０２０５】
【図１】“０１”と“１０”との２ビットの組み合わせのみを用いて、１バイトフォーマットを１６種類で表現する表現形式を説明する表である。
【図２】図１の表におけるＣＶに対するＣＶＭを説明する説明図である。
【図３】ＣＶ（ｉ）とＣＶ（ｊ）とに対応するＣＶＭ（ｉ，ｊ）を示す表である。
【図４】ＣＶを用いた基本的な検証の利用方法を説明する説明図である。
【図５】ＩＦ文の代わりに算術演算を利用する方法を説明する説明図である。
【図６】ＣＶを内部変数としての利用する方法を説明する説明図である。
【図７】ＣＶを用いたＦｏｒループの実行の保証を説明する説明図である。
【図８】ＣＶを用いたモジュールの返却値への応用を説明する説明図である。
【図９】ＣＶを用いたグローバル・スタンプ・ラリーを説明する説明図である。
【図１０】本発明の一実施形態による情報処理装置の構成を示すブロック図である。
【符号の説明】
【０２０６】
１…情報処理装置、２…検証メモリ部、３…ＣＶＭテーブル、４…情報処理部、５…ＣＶ初期値設定部、６…ＣＶ演算部、７…ＣＶ判定部、８…異常動作対処部、３１…変換前ビット列記憶部、３２…変換後ビット列記憶部、３３…変換テーブル記憶部、３４…ビット列記憶部
【図１】
0004701260.tif 000002
【図２】
0004701260.tif 000003
【図３】
0004701260.tif 000004
【図４】
0004701260.tif 000005
【図５】
0004701260.tif 000006
【図６】
0004701260.tif 000007
【図７】
0004701260.tif 000008
【図８】
0004701260.tif 000009
【図９】
0004701260.tif 000010
【図１０】
0004701260.tif 000011