(57)【特許請求の範囲】
【請求項１】
コンピュータに実行させる複数の命令からなる出力処理命令群を生成する命令生成装置であって、
前記コンピュータにデータを被代入変数に代入させる第一処理命令を前記コンピュータが実行するように、処理経路を前記第一処理命令に分岐させる分岐命令を、前記出力処理命令群の一部として生成する分岐命令生成手段と、
前記コンピュータが前記分岐命令に従って前記第一処理命令を実行した結果を示す前記被代入変数に代入されたデータに依存し、前記データが予め定められた内容を示す場合に、前記出力処理命令群以降に行うべき予め定められた処理を前記コンピュータに実行させる依存処理命令を、前記出力処理命令群の一部として生成する依存処理命令生成手段とを備え、
前記依存処理命令生成手段は、
前記コンピュータに対して予め定められた処理を実行させる第二処理命令を取得して前記依存処理命令に変換することによって前記依存処理命令を生成し、
前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、予め定められた想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させ、
前記命令生成装置は、さらに、
前記第一処理命令を使用しない前記第二処理命令と、前記第一処理命令を用いて前記第二処理命令とは異なる処理を前記コンピュータに実行させる第三処理命令とを含む入力プログラムを取得する取得手段と、
前記入力プログラムの前記第二処理命令が前記依存処理命令生成手段によって変換されて生成された前記依存処理命令を含む前記出力処理命令群と、前記第三処理命令とを含む出力プログラムを出力する出力手段とを備える
ことを特徴とする命令生成装置。
【請求項２】
前記命令生成装置は、さらに、
予め定められた条件に従って前記第一処理命令により前記被代入変数に代入される値を前記想定値として算出する想定値算出手段を備え、
前記依存処理命令生成手段は、
前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、前記想定値算出手段により算出された想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させる前記依存処理命令を生成する
ことを特徴とする請求項１に記載の命令生成装置。
【請求項３】
前記命令生成装置は、さらに、
前記コンピュータが前記第一処理命令を実行する際に、前記コンピュータに対して、前記第一処理命令で参照される被参照変数に値を代入させる被参照代入処理命令を、前記出力処理命令群の一部として生成する被参照代入処理生成手段を備え、
前記想定値算出手段は、
前記被参照変数に代入される値を前記条件として扱い、前記被参照変数の値に従って前記第一処理命令により前記被代入変数に代入される値を前記想定値として算出する
ことを特徴とする請求項２に記載の命令生成装置。
【請求項４】
前記命令生成装置は、さらに、
前記第一処理命令で参照される被参照変数を特定する被参照特定手段を備え、
前記被参照代入処理生成手段は、
前記コンピュータに対して、前記被参照特定手段により特定された被参照変数に値を代入させる前記被参照代入処理命令を生成する
ことを特徴とする請求項３に記載の命令生成装置。
【請求項５】
前記命令生成装置は、さらに、
前記被参照変数に代入される値の候補となる複数の値を、被参照変数値の集合として保持する値保持手段を備え、
前記被参照代入処理生成手段は、
前記被参照変数値の集合に含まれる何れかの値を前記被参照変数に代入させる前記被参照代入処理命令を生成する
ことを特徴とする請求項３に記載の命令生成装置。
【請求項６】
前記想定値算出手段は、
前記被参照変数値の集合に含まれる各値に従って前記第一処理命令により前記被代入変数に代入される値の集合を、想定値の集合として算出し、
前記依存処理命令生成手段は、
前記被参照変数値の集合と前記想定値の集合とを用いて前記依存処理命令を生成し、
前記依存処理命令は、
前記第一処理命令が実行された結果を示す前記被代入変数の値が、前記想定値の集合に含まれる値である場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させる
ことを特徴とする請求項５に記載の命令生成装置。
【請求項７】
前記依存処理命令は、
前記コンピュータに対して、前記被代入変数に代入された値を、予め定められた想定値と比較させ、前記被代入変数の値が前記想定値と等しいときには、予め定められた処理を前記コンピュータに実行させ、前記被代入変数の値が前記想定値と異なるときには、前記予め定められた処理の実行を前記コンピュータに抑制させる
ことを特徴とする請求項１に記載の命令生成装置。
【請求項８】
前記命令生成装置は、さらに、
前記第一処理命令に含まれる前記被代入変数を特定する被代入特定手段を備え、
前記依存処理命令生成手段は、
前記被代入特定手段により特定された前記被代入変数に代入されたデータに依存した処理を前記コンピュータに実行させる前記依存処理命令を生成する
ことを特徴とする請求項１に記載の命令生成装置。
【請求項９】
コンピュータに実行させる複数の命令からなる出力処理命令群を生成する命令生成方法であって、
前記コンピュータにデータを被代入変数に代入させる第一処理命令を前記コンピュータが実行するように、処理経路を前記第一処理命令に分岐させる分岐命令を、前記出力処理命令群の一部として生成する分岐命令生成ステップと、
前記コンピュータが前記分岐命令に従って前記第一処理命令を実行した結果を示す前記被代入変数に代入されたデータに依存し、前記データが予め定められた内容を示す場合に、前記出力処理命令群以降に行うべき予め定められた処理を前記コンピュータに実行させる依存処理命令を、前記出力処理命令群の一部として生成する依存処理命令生成ステップとを含み、
前記依存処理命令生成ステップでは、
前記コンピュータに対して予め定められた処理を実行させる第二処理命令を取得して前記依存処理命令に変換することによって前記依存処理命令を生成し、
前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、予め定められた想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させ、
前記命令生成方法は、さらに、
前記第一処理命令を使用しない前記第二処理命令と、前記第一処理命令を用いて前記第二処理命令とは異なる処理を前記コンピュータに実行させる第三処理命令とを含む入力プログラムを取得する取得ステップと、
前記入力プログラムの前記第二処理命令が前記依存処理命令生成ステップによって変換されて生成された前記依存処理命令を含む前記出力処理命令群と、前記第三処理命令とを含む出力プログラムを出力する出力ステップとを含む
ことを特徴とする命令生成方法。
【請求項１０】
コンピュータに実行させる複数の命令からなる出力処理命令群を生成するためのプログラムであって、
前記コンピュータにデータを被代入変数に代入させる第一処理命令を前記コンピュータが実行するように、処理経路を前記第一処理命令に分岐させる分岐命令を、前記出力処理命令群の一部として生成する分岐命令生成ステップと、
前記コンピュータが前記分岐命令に従って前記第一処理命令を実行した結果を示す、前記被代入変数に代入されたデータに依存し、前記データが予め定められた内容を示す場合に、前記出力処理命令群以降に行うべき予め定められた処理を前記コンピュータに実行させる依存処理命令を、前記出力処理命令群の一部として生成する依存処理命令生成ステップとをコンピュータに実行させ、
前記依存処理命令生成ステップでは、
前記コンピュータに対して予め定められた処理を実行させる第二処理命令を取得して前記依存処理命令に変換することによって前記依存処理命令を生成し、
前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、予め定められた想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させ、
前記プログラムは、さらに、
前記第一処理命令を使用しない前記第二処理命令と、前記第一処理命令を用いて前記第二処理命令とは異なる処理を前記コンピュータに実行させる第三処理命令とを含む入力プログラムを取得する取得ステップと、
前記入力プログラムの前記第二処理命令が前記依存処理命令生成ステップによって変換されて生成された前記依存処理命令を含む前記出力処理命令群と、前記第三処理命令とを含む出力プログラムを出力する出力ステップとをコンピュータに実行させる
ことを特徴とするプログラム。
【請求項１１】
コンピュータに実行させる複数の命令からなる出力処理命令群を生成する集積回路であって、
前記コンピュータにデータを被代入変数に代入させる第一処理命令を前記コンピュータが実行するように、処理経路を前記第一処理命令に分岐させる分岐命令を、前記出力処理命令群の一部として生成する分岐命令生成手段と、
前記コンピュータが前記分岐命令に従って前記第一処理命令を実行した結果を示す前記被代入変数に代入されたデータに依存し、前記データが予め定められた内容を示す場合に、前記出力処理命令群以降に行うべき予め定められた処理を前記コンピュータに実行させる依存処理命令を、前記出力処理命令群の一部として生成する依存処理命令生成手段とを備え、
前記依存処理命令生成手段は、
前記コンピュータに対して予め定められた処理を実行させる第二処理命令を取得して前記依存処理命令に変換することによって前記依存処理命令を生成し、
前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、予め定められた想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させ、
前記命令生成装置は、さらに、
前記第一処理命令を使用しない前記第二処理命令と、前記第一処理命令を用いて前記第二処理命令とは異なる処理を前記コンピュータに実行させる第三処理命令とを含む入力プログラムを取得する取得手段と、
前記入力プログラムの前記第二処理命令が前記依存処理命令生成手段によって変換されて生成された前記依存処理命令を含む前記出力処理命令群と、前記第三処理命令とを含む出力プログラムを出力する出力手段とを備える
ことを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不正な解析および改竄を防止できるようなコンピュータプログラムを生成する命令生成装置に関する。
【背景技術】
【０００２】
コンピュータ上で動作するプログラムの中には、不正な改竄を防止することが求められるプログラムがある。このようなプログラムの例は、個人情報を扱うプログラムや、著作権管理に関わるプログラム等である。個人情報等の重要な情報を使用するプログラムに対し、改竄されたプログラムが流出することは脅威であり、改竄防止が望まれる。また、著作権管理に関わるプログラムとは、例えば、コンテンツの使用回数等を管理し、使用制限を行うプログラムであるが、このプログラムが改竄されて使用制限が回避されることは脅威であり、改竄防止が望まれる。上記の例の他にも、ソフトウェア開発ベンダが開発したプログラムが改造されて他社から販売される脅威や、ゲームプログラムが著作権者の意図に反して改造される脅威などがあり、プログラムの改竄防止技術が望まれている。
【０００３】
従来の改竄防止技術には、改竄チェックを用いたものがある。この方式では、メモリ上のプログラムのハッシュ値／チェックサムを計算し、予め算出しておいたハッシュ値／チェックサムと等しいかを判定することにより改竄を検出する。
【０００４】
図１は、従来の改竄チェックの処理を含むプログラムを示す図である。図１において、関数ｆ１は改竄チェック対象（保護対象）の処理命令群を示す。関数ｆ１はコンピュータのメモリ上に保持されて実行されるプログラムであって、メモリ上のアドレス０３００〜０４００に保持されているものとする。関数ｆ２は改竄チェック処理を示す。処理命令「ｔｍｐ＝０；ｆｏｒ（ａ＝０３００；ａ＜０４００；ａ＋＋）｛ｔｍｐ＋＝＊ａ；｝」は変数ａの位置に格納されたデータを読み込み、読み込んだ値を変数ｔｍｐに加えるという動作をアドレス０３００〜０４００までの間繰り返す処理（ハッシュ計算処理）を示す。この処理によって、アドレス０３００〜０４００までのデータの和（チェックサム）を算出することが出来る。
【０００５】
処理命令「ｉｆ（ｔｍｐ！＝ＳＵＭ）｛ｅｘｉｔ（）；｝」は算出したチェックサムがＳＵＭと等しいかを判定し、真なる場合には、処理を継続し、偽なる場合には処理を終了する処理（判定／終了処理）を示す。ここで、ＳＵＭは、予め算出しておいた関数ｆ１のチェックサムである。したがって、関数ｆ１が改竄されていなければ、ＳＵＭとｔｍｐとは等しい値となるが、関数ｆ１が改竄されている場合には、ＳＵＭとｔｍｐは異なる値となる。このことから、ＳＵＭとｔｍｐが等しい値になるか否かによって関数ｆ１が改竄されているか否かを知ることが出来る。
【０００６】
図２は、従来の改竄防止処理生成装置の処理を説明するための説明図である。
【０００７】
従来の改竄防止処理生成装置（命令生成装置）は、保護対象コードを含む入力プログラムを取得し、その入力プログラムに対して改竄チェック処理を付加することにより、改竄防止プログラムを生成する。保護対象コードは、上述の関数ｆ１の処理命令群に相当し、改竄防止プログラムは図１に示すプログラムに相当する。
【０００８】
このような改竄防止プログラムがコンピュータにより実行されると、保護対象コードのハッシュ値（チェックサム）が正しいか否かが判断され、正しくないと判断されたときに、保護対象コードに対する改竄が検出される。
【０００９】
このように、従来の改竄防止処理生成装置は、入力プログラムに対して改竄チェック処理を追加することにより、改竄された保護対象コードを含む入力プログラムの実行を防止している。
【００１０】
改竄チェック以外の改竄防止技術としては、プログラムの振る舞いを監視する方法がある。特許文献１には、予め所定の振る舞いを行う処理命令をプログラムに埋め込み、プログラム実行時に実際のプログラムの振る舞いを監視し、埋め込んだ振る舞いが実際に行われるかを確認することでプログラムの改竄を検出する技術が記載されている。
【特許文献１】特開２００５−１７３９０３号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、図２に示す従来の改竄防止処理生成装置では、改竄チェック処理が不正解析者に容易に見つけられ、改竄チェック処理が改竄されて無効化されるという問題がある。
【００１２】
例えば、不正解析者は、まず、改竄防止プログラムの保護対象コード（関数ｆ１）を改竄し、その改竄防止プログラムを実行する。そして、不正解析者は、改竄された部分がデータとしてアクセスされないかを監視することにより、改竄チェック処理の中のハッシュ計算処理を容易に見つけることができる。具体的には、改竄チェック処理を見つけることは、指定したアドレスに対するデータとしての読み取りを監視する機能を持ったデバッガを用いることで可能となる。すなわち、不正解析者は、保護対象コードを改竄した後、改竄したアドレスを監視していれば、そのアドレスのデータを読み取る改竄チェック処理の「ｔｍｐ＋＝＊ａ」を見つけることができ、改竄したアドレスに対して改竄チェック処理が行われていることを知ることができる。
【００１３】
そこで、不正解析者は、判定／終了処理の処理命令「ｉｆ（ｔｍｐ！＝ＳＵＭ）｛ｅｘｉｔ（）；｝」を、ＳＵＭとｔｍｐが一致しなくとも何もしない命令「ｉｆ（ｔｍｐ！＝ＳＵＭ）｛；｝」に改竄する。これにより、改竄チェック処理自体が無効化される。
【００１４】
また、特許文献１に記載の技術のようなプログラムの振る舞いを監視する方法でも、振る舞いを監視する処理自体が見つけられ、改竄される恐れがある。
【００１５】
そこで、本発明では、かかる問題に鑑みてなされたものであって、保護対象コードを確実に保護し得るプログラムを生成する命令生成装置を提供することを目的とする。
【課題を解決するための手段】
【００１６】
上記目的を達成するために、本発明に係る命令生成装置は、コンピュータに対してデータを被代入変数に代入させる第一処理命令を保護するために、前記コンピュータに実行させる複数の命令からなる出力処理命令群を生成する命令生成装置であって、前記コンピュータが前記第一処理命令を実行するように、処理経路を前記第一処理命令に分岐させる分岐命令を、前記出力処理命令群の一部として生成する分岐命令生成手段と、前記コンピュータが前記分岐命令に従って前記第一処理命令を実行した結果を示す前記被代入変数に代入されたデータに依存し、前記データが予め定められた内容を示す場合に、前記出力処理命令群以降に行うべき予め定められた処理を前記コンピュータに実行させる依存処理命令を、前記出力処理命令群の一部として生成する依存処理命令生成手段とを備えることを特徴とする。
【００１７】
これにより、出力処理命令群がコンピュータにより実行されると、コンピュータは分岐命令により第一処理命令を実行するとともに、依存処理命令によりその実行結果（被代入変数に代入されたデータ）に依存した処理を実行する。その結果、第一処理命令が改竄されていなければ、コンピュータは依存処理命令により予め定められた処理を実行するが、第一処理命令が改竄されていれば、コンピュータは予め定められた処理以外の処理を実行することとなる。したがって、第一処理命令を改竄から保護することができる。さらに、第一処理命令をデータとして読み込むことがないので、改竄を防止しようとしている処理（出力処理命令群）が不正解析者に見つけ出されるのを困難にすることができ、保護対象コードである第一処理命令を改竄や不正解析から確実に保護することができる。
【００１８】
また、本発明では、第一処理命令が出力処理命令群の一部として使用されることとなり、プログラム（第一処理命令など）の不正解析および改竄を防止することができ、その価値は大きい。
【００１９】
また、本発明では、第一処理命令が改竄されると、出力処理命令群は定められた処理を行わない。すなわち、第一処理命令の改竄チェックが達成できる。さらに、この改竄チェックを回避するために第一処理命令によって代入されるデータを予め定められた内容に強制的に合わせるような改竄が行われたとしても、第一処理命令が他の命令群からも呼び出されている場合には、その命令群が正常に動作しなくなる。その結果、改竄があったことを検出できる。
【００２０】
また、本発明における改竄行為を困難にする方法は、従来の改竄チェック方法と異なり、プログラムをデータとして読み込む必要がないので、Ｊａｖａ（登録商標）等のプログラムをデータとして読み込むには制限がある環境でも用いることが出来、その効果は大きい。
【００２１】
また、出力処理命令群を実行する際に、第一処理命令も実行されることになる。よって、第一処理命令は第一処理命令の機能と、出力処理命令群の機能の両方に必要な処理であるのか、第一処理命令の機能にのみ必要な処理であるのかの解析が困難になる。よって、第一処理命令の機能に必要な処理のみに着目し、第一処理命令の解析をしようとする不正解析者の解析作業を困難にすることが出来る。
【００２２】
ここで、前記依存処理命令生成手段は、前記コンピュータに対して予め定められた処理を実行させる第二処理命令を取得して前記依存処理命令に変換することによって前記依存処理命令を生成し、前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、予め定められた想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させることを特徴としてもよい。
【００２３】
これにより、命令生成装置が第二処理命令を取得すると、その第二処理命令を依存処理命令に難読化することができ、第一処理命令を確実に保護することができる。
【００２４】
また、本発明では、定められた処理を行う出力処理命令群（第二処理命令の処理に相当）を実行する際に、第一処理命令も実行される。よって、定められた処理を解析する際に、不正解析者は、出力処理命令群と第一処理命令の両方を解析しなければならなくなり、不正解析をさらに困難にすることができる。
【００２５】
ここで、前記命令生成装置は、さらに、前記第一処理命令を使用しない前記第二処理命令と、前記第一処理命令を用いて前記第二処理命令とは異なる処理を前記コンピュータに実行させる第三処理命令とを含む入力プログラムを取得する取得手段と、前記入力プログラムの前記第二処理命令が前記依存処理命令生成手段によって変換されて生成された前記依存処理命令を含む前記出力処理命令群と、前記第三処理命令とを含む出力プログラムを出力する出力手段とを備えることを特徴としてもよい。
【００２６】
これにより、第二処理命令を含むプログラムを難読化することができる。また、難読化後のプログラムでは、元々は必要なかった第一処理命令の処理が追加して実行されるが、第一処理命令は、他の目的にも使われる命令なのでコードサイズの増加を押さえることが出来る上、第一処理命令の実行が実際には、改竄チェックを行うための処理であることを隠蔽することができる。
【００２７】
ここで、前記命令生成装置は、さらに、予め定められた条件に従って前記第一処理命令により前記被代入変数に代入される値を前記想定値として算出する想定値算出手段を備え、前記依存処理命令生成手段は、前記第一処理命令が実行された結果を示す前記被代入変数に代入された値が、前記想定値算出手段により算出された想定値を示す場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させる前記依存処理命令を生成することを特徴としてもよい。例えば、前記命令生成装置は、さらに、前記コンピュータが前記第一処理命令を実行する際に、前記コンピュータに対して、前記第一処理命令で参照される被参照変数に値を代入させる被参照代入処理命令を、前記出力処理命令群の一部として生成する被参照代入処理生成手段を備え、前記想定値算出手段は、前記被参照変数に代入される値を前記条件として扱い、前記被参照変数の値に従って前記第一処理命令により前記被代入変数に代入される値を前記想定値として算出する。
【００２８】
これにより、コンピュータが第一処理命令を実行するときに参照される被参照変数の値と、想定値算出手段が想定値を算出するときに条件とされる被参照変数の値とが等しいため、第一処理命令が改竄されていなければ、コンピュータが第一処理命令を実行した結果を示す被代入変数の値と想定値とを等しくすることができる。その結果、被代入変数の値と想定値とが異なっていれば、第一処理命令が改竄されていると判断でき、第二処理命令の実行結果と同じ実行結果をコンピュータに導出させないようにすることができる。
【００２９】
また、コンピュータが第一処理命令を実行するときに参照される被参照変数の値と、想定値算出手段が想定値を算出するときに条件とされる被参照変数の値とが等しければよいため、被参照変数の値を固定値でなく任意の値にすることができる。
【００３０】
ここで、前記命令生成装置は、さらに、前記第一処理命令で参照される被参照変数を特定する被参照特定手段を備え、前記被参照代入処理生成手段は、前記コンピュータに対して、前記被参照特定手段により特定された被参照変数に値を代入させる前記被参照代入処理命令を生成することを特徴としてもよい。
【００３１】
これにより、被参照特定手段（被参照変数解析部）が被参照変数を特定するため、第一処理命令に含まれる被参照変数がどれであるかをユーザが指定することなく、被参照代入処理命令（被参照変数値代入処理命令群）を生成することが出来る。
【００３２】
ここで、前記命令生成装置は、さらに、前記被参照変数に代入される値の候補となる複数の値を、被参照変数値の集合として保持する値保持手段を備え、前記被参照代入処理生成手段は、前記被参照変数値の集合に含まれる何れかの値を前記被参照変数に代入させる前記被参照代入処理命令を生成することを特徴としてもよい。例えば、前記想定値算出手段は、前記被参照変数値の集合に含まれる各値に従って前記第一処理命令により前記被代入変数に代入される値の集合を、想定値の集合として算出し、前記依存処理命令生成手段は、前記被参照変数値の集合と前記想定値の集合とを用いて前記依存処理命令を生成し、前記依存処理命令は、前記第一処理命令が実行された結果を示す前記被代入変数の値が、前記想定値の集合に含まれる値である場合に、前記第二処理命令の実行結果と同じ実行結果を前記コンピュータに導出させる。
【００３３】
これにより、被参照変数に格納される値を、前記出力処理命令が実行されるごとに異ならせることができる。その結果、出力処理命令群が第一処理命令を保護するためにあることが不正解析者に解明されるのをより困難にすることができる。
【００３４】
ここで、前記依存処理命令は、前記コンピュータに対して、前記被代入変数に代入された値を、予め定められた想定値と比較させ、前記被代入変数の値が前記想定値と等しいときには、予め定められた処理を前記コンピュータに実行させ、前記被代入変数の値が前記想定値と異なるときには、前記予め定められた処理の実行を前記コンピュータに抑制させることを特徴としてもよい。
【００３５】
これにより、第一処理命令が改竄された結果、被代入変数の値が想定値と異なるときには、コンピュータに対してエラー処理を実行させることができ、第一処理命令の改竄検出を行うことができる。
【００３６】
ここで、前記命令生成装置は、さらに、前記第一処理命令に含まれる前記被代入変数を特定する被代入特定手段を備え、前記依存処理命令生成手段は、前記被代入特定手段により特定された前記被代入変数に代入されたデータに依存した処理を前記コンピュータに実行させる前記依存処理命令を生成することを特徴としてもよい。
【００３７】
これにより、被代入特定手段（被代入変数解析部）が被代入変数を特定するため、第一処理命令に含まれる被代入変数がどれであるかをユーザが指定することなく、依存処理命令を生成することが出来る。
【００３８】
ここで、前記命令生成装置は、さらに、前記第一処理命令、前記第一処理命令の分岐元となる第一先行命令、前記第一処理命令の分岐先となる第一後続命令、第一後続命令の分岐先となる第二処理命令、および前記第二処理命令の分岐先となる第二後続命令を含む入力プログラムを取得する取得手段と、第一の条件が満たされている場合と第二の条件が満たされている場合とで、前記第一処理命令の分岐先が異なるように、前記処理経路を前記第一処理命令から他の命令に分岐させる条件分岐命令を生成する条件分岐命令生成手段と、前記第一処理命令、前記第一先行命令、前記第一後続命令、および前記第二処理命令を含む出力プログラムを出力する出力手段とを備え、前記依存処理命令生成手段は、前記被代入変数のデータが予め定められた内容を示す場合に、前記第二後続命令と同一の実行結果を前記コンピュータに導出させる前記依存処理命令を生成し、前記分岐命令生成手段は、前記コンピュータが前記第二処理命令を実行した後に再び前記第一処理命令を実行するように、処理経路を前記第二処理命令から前記第一処理命令に分岐させる前記分岐命令を生成し、前記条件分岐命令生成手段は、前記第一の条件が満たされている場合には、前記処理経路を前記第一処理命令から前記第一後続命令に分岐させ、前記第二の条件が満たされている場合には、前記処理経路を前記第一処理命令から前記依存処理命令に分岐させる前記条件分岐命令を生成し、前記出力手段は、前記依存処理命令、前記分岐命令、および前記条件分岐命令を含む前記出力プログラムを出力し、前記第一の条件は、前記第一処理命令が前記コンピュータに実行されたときに、前記第一処理命令の実行の直前に前記第一先行命令が実行されていることであり、前記第二の条件は、前記第一処理命令が前記コンピュータに実行されたときに、前記第一処理命令の実行の直前に前記第二処理命令が実行されていることであることを特徴としてもよい。
【００３９】
これにより、入力プログラムにおいて第二処理命令と第二後続命令との間で実行されることがない第一処理命令が、出力プログラム（改竄防止プログラム）においては第二処理命令と第二後続命令との間で実行されることがある。すなわち、出力プログラムにおいて、第一処理命令は、入力プログラムにおける実行順序とは異なる実行順序でも実行されることとなる。その結果、入力プログラムを難読化することができ、不正解析者が出力プログラムを実際に動かして解析を行っても、入力プログラムの実行順序や前後関係を解析することが困難になる。
【００４０】
さらに、前記入力プログラムには、複数の前記第一後続命令が含まれており、前記条件分岐命令生成手段は、前記第一の条件が満たされている場合には、前記第一処理命令が実行された後に、前記複数の第一後続命令のうち第三の条件に応じた１つの第一後続命令が分岐先第一後続命令として実行されるように、前記処理経路を前記第一処理命令から前記分岐先第一後続命令に分岐させる前記条件分岐命令を生成することを特徴としてもよい。
【００４１】
これにより、第一処理命令の分岐先として、依存処理命令と複数の第一後続命令とが混在することになるので、それらの命令が、第一処理命令と第二処理命令とのどちらから分岐して実行されるものであるかを解析し難くすることができる。
【００４２】
また、前記第三の条件は、変数に代入される値であり、前記条件分岐命令生成手段は、前記第一の条件が満たされているか否かを示す変数の値と、前記第二の条件が満たされているか否かを示す変数の値とに基づいて前記処理経路を分岐させる前記条件分岐命令を生成することを特徴としてもよい。
【００４３】
これにより、第一の条件または第二の条件が満たされているかの確認に使われる変数と、第三の条件に利用される変数との区別が困難になるので、各条件がどの変数に基づいているのかを分かり難くすることができ、各条件の解析を困難にすることができる。
【００４４】
また、前記入力プログラムには、複数の前記第二後続命令が含まれてあり、前記依存処理命令は、前記複数の第二後続命令をそれぞれ前記依存処理命令に変換し、前記条件分岐命令生成手段は、前記第二の条件が満たされている場合には、前記第一処理命令が実行された後に、前記複数の依存処理命令のうち第四の条件に応じた１つの依存処理命令が分岐先依存処理命令として実行されるように、前記処理経路を前記第一処理命令から前記分岐先依存処理命令に分岐させる前記条件分岐命令を生成することを特徴としてもよい。
【００４５】
これにより、第一処理命令の分岐先として、複数の依存処理命令と第一後続命令とが混在することになるので、それらの命令が、第一処理命令と第二処理命令とのどちらから分岐して実行されるものであるかを解析し難くすることができる。
【００４６】
さらに、前記第四の条件は、変数に代入される値であり、前記条件分岐命令生成手段は、前記第一の条件が満たされているか否かを示す変数の値と、前記第二の条件が満たされているか否かを示す変数の値とに基づいて前記処理経路を分岐させる前記条件分岐命令を生成することを特徴としてもよい。
【００４７】
これにより、第一の条件または第二の条件が満たされているかの確認に使われる変数と、第四の条件に利用される変数との区別が困難になるので、各条件がどの変数に基づいているのかを分かり難くすることができ、各条件の解析を困難にすることができる。
【００４８】
また、前記命令生成装置は、さらに、前記入力プログラムで使用されていない追加変数を生成する変数生成手段と、前記第一の条件が満たされる場合に、前記コンピュータに対して、前記追加変数に第一条件値を代入させる第一条件値代入命令を生成し、前記第二の条件が満たされる場合に、前記コンピュータに対して、前記追加変数に第二条件値を代入させる第二条件値代入命令を生成する条件値代入命令生成手段とを備え、前記条件分岐命令生成手段は、前記追加変数に代入されている値が前記第一条件値であるときには、前記処理経路を前記第一処理命令から前記第一後続命令に分岐させ、前記追加変数に代入されている値が前記第二条件値であるときには、前記処理経路を前記第一処理命令から前記第依存処理命令に分岐させる条件分岐命令を生成することを特徴としてもよい。
【００４９】
これにより、第一の条件または第二の条件が満たされるか否かの確認に用いられる追加変数が、入力プログラム中に含まれる変数ではないので、第一の条件または第二の条件の判定のために、追加変数に値が代入されても入力プログラムが行うべき処理の実行に影響が出ないことを保証することができる。
【００５０】
また、前記第二後続命令および前記依存処理命令は、前記第二処理命令が実行された時点において得られている実行結果を使用して、互いに同等の処理を前記コンピュータに実行させる命令であって、前記命令生成装置は、さらに、前記第二処理命令が実行された時点において得られている実行結果を、前記第一処理命令が実行される前に退避させる退避命令を生成する退避命令生成手段と、前記第一処理命令が再び実行された後に、退避された実行結果を復帰させる復帰命令を生成する復帰命令生成手段とを備えることを特徴としてもよい。
【００５１】
これにより、出力プログラムにおいて第一処理命令が第二処理命令と依存処理命令との間に割り込んでも、依存処理命令処理以降の実行結果が、入力プログラムにおける第二後続処理命令以降の実行結果と同一となることを保証することができる。
【００５２】
また、前記命令生成装置は、さらに、前記第一処理命令、前記第一先行命令、および前記第二処理命令のうち少なくとも１つの命令を、当該命令に等価な命令に変換する変換手段を備え、前記出力手段は、前記変換手段によって変換された命令を、当該命令に対応する変換前の命令の代わりに前記出力プログラムに含めて出力することを特徴としてもよい。つまり、本発明の命令または命令群には、その命令または命令群そのものだけでなく、それらを本発明と異なる他の難読化手法により難読化して得られる等価な命令も含まれる。
【００５３】
これにより、出力プログラムでは、入力プログラムの少なくとも１つの命令が、その命令に等価な命令に置き換えられているため、入力プログラムの命令と出力プログラムの命令との対応関係を分かり難くすることができる。つまり、入力プログラムに対する難読化の程度を増すことができ、出力プログラムの解析をより困難にすることができる。
【００５４】
また、前記分岐命令生成手段は、前記第一処理命令がＡＰＩ（Application Program Interface）を含むときには、前記ＡＰＩと同一のＡＰＩを呼び出す命令を前記第二後続命令として検索し、前記第二後続命令の分岐元となる前記第二処理命令から前記第一処理命令に処理経路を分岐させる前記分岐命令を生成することを特徴としてもよい。
【００５５】
これにより、第一処理命令のＡＰＩと同一のＡＰＩを呼び出す命令が第二後続命令とされるため、第一処理命令を、被代入変数のデータに依存した依存処理命令に容易に変換することができ、上述と同様、第一処理命令を改竄や不正解析から確実に保護することができる。
【００５６】
また、前記命令生成装置は、さらに、前記第一処理命令を含む入力プログラムを取得する取得手段と、前記分岐命令生成手段および前記依存処理命令生成手段によって生成された前記分岐命令および前記依存処理命令を前記入力プログラムに追加することにより、前記第一処理命令、前記分岐命令および前記依存処理命令を含む出力プログラムを生成して出力する出力手段とを備えることを特徴としてもよい。
【００５７】
これにより、入力プログラムを出力プログラムに変換して、出力プログラムに含まれる第一処理命令を確実に保護することができる。
【００５８】
また、本発明に係る命令生成装置によって生成される出力プログラムは、第一の機能に対応する第一処理命令と、第二の機能に対応する第二処理命令と、コンピュータが第二処理命令を実行する際に、第二の機能には不要である第一処理命令を冗長処理としてコンピュータに実行させる分岐命令とを含むことを特徴とする。
【００５９】
これにより、第二処理命令による処理では本来不要な第一処理命令による処理が、第二処理命令による処理でも行われるので、第一処理命令による処理がどの機能の実現に必要であり、どの機能に不要なのかを解析することを困難にすることができる。
【００６０】
また、本発明は、このような命令生成装置として実現することができるだけでなく、その出力処理命令群を生成する処理生成方法や、パーソナルコンピュータ等にその出力処理命令群を生成させるためのプログラム、そのプログラムを記録した記録媒体、または、その出力処理命令群を生成する集積回路としても実現することができる。この場合も、命令生成装置と同様の効果が得られることは言うまでもない。
【発明の効果】
【００６１】
本発明に係る命令生成装置は、保護対象コードを確実に保護し得るプログラムを生成することができるという作用効果を奏する。
【発明を実施するための最良の形態】
【００６２】
以下、本発明に係る命令生成装置および命令生成方法について図面を参照して説明する。なお、以下の各実施の形態および各変形例では、本発明に係る命令生成装置を改竄防止処理生成装置として説明する。
【００６３】
（実施の形態１）
本発明に関わる実施の形態１における処理システムについて説明する。
【００６４】
図３は、実施の形態１における処理システムの構成を示す図である。
【００６５】
本実施の形態における処理システム１００は、改竄防止処理生成装置（命令生成装置）１１０と、実行処理装置１３０とを備える。
【００６６】
改竄防止処理生成装置１１０は、保護対象コードを確実に保護し得るプログラムを生成する装置であって、保護対象コードである第一処理命令群１４０と第二処理命令群１５０とを取得して、出力処理命令群１６０を生成する。なお、改竄防止処理生成装置１１０は、第二処理命令群１５０を難読化して出力処理命令群１６０を生成する難読化装置として構成されている。なお、特に断らない限り、本明細書および本発明における命令群とは、複数の命令が含まれるものに限らず、命令が１つだけのものも含むものとする。
【００６７】
また、改竄防止処理生成装置１１０は、その生成された出力処理命令群１６０と第一処理命令群１４０とを記録媒体１２０に書き込む。
【００６８】
実行処理装置１３０は、記録媒体１２０に記録されている第一処理命令群１４０および出力処理命令群１６０を読み出して実行する。
【００６９】
なお、改竄防止処理生成装置１１０は、第一処理命令群１４０および出力処理命令群１６０を記録媒体１２０に書き込むことなく、通信媒体を介して実行処理装置１３０に送信してもよい。
【００７０】
以下、それぞれの構成要素について説明を行う。
【００７１】
第一処理命令群１４０は、実行処理装置１３０で実行される処理命令群であって、出力処理命令群１６０の処理の一部として実行される場合もあれば、それとは別に実行される場合もある。
【００７２】
第二処理命令群１５０は、実行処理装置１３０に所定の処理を指示する命令を含んだ処理命令群である。
【００７３】
以下、本実施の形態では、第一処理命令群１４０は、コンテンツの暗号化された再生可能回数を入力とし、これを復号し、平文の再生可能回数を出力する処理を指示する命令群であるものとして説明を行う。また、本実施の形態では、第二処理命令群１５０は圧縮されたコンテンツを入力とし、これを解凍し、出力する処理を指示する命令群であるものとして説明を行う。
【００７４】
出力処理命令群１６０は、第二処理命令群１５０を難読化した命令群であり、処理の途中で第一処理命令群１４０を呼び出して使用する構成となっている。すなわち、実行処理装置１３０で出力処理命令群１６０が実行される場合、最初は出力処理命令群１６０に含まれる命令群が実行され、途中で第一処理命令群１４０が呼び出されて実行され、次にまた出力処理命令群１６０の続きの処理命令群が実行される。
【００７５】
以下、出力処理命令群１６０の詳細を説明する。
【００７６】
（１）出力処理命令群１６０の構成
図４は、出力処理命令群１６０の構成を示す図である。
【００７７】
出力処理命令群１６０は、第一処理命令群１４０を呼び出して実行する際に必要となる各種パラメータに値を設定する被参照変数値代入処理命令群３１０と、第一処理命令群１４０を呼び出す分岐処理命令群３２０と、第一処理命令群１４０を呼び出した後に実行される依存処理命令群３３０とからなる。実行処理装置１３０で出力処理命令群１６０が実行される場合、被参照変数値代入処理命令群３１０、分岐処理命令群３２０、第一処理命令群１４０、依存処理命令群３３０の順に各処理命令群が実行される。
【００７８】
以下、それぞれを説明する。
【００７９】
（１．１）被参照変数値代入処理命令群３１０
被参照変数値代入処理命令群３１０は、第一処理命令群１４０を呼び出して実行する際に必要となる各種パラメータに値を設定する処理である。具体的には、例えば、第一処理命令群１４０が関数である場合には、被参照変数値代入処理命令群３１０は、関数の引数に値を代入する命令群である。また、例えば、第一処理命令群１４０が外部変数を参照する命令群であれば、被参照変数値代入処理命令群３１０は、外部変数に値を代入する命令群である。また、例えば、第一処理命令群１４０がスタックの値を参照する命令群であれば、被参照変数値代入処理命令群３１０は、スタックに値を格納する命令群である。また、例えば、第一処理命令群１４０がアドレス変数で指定した位置に格納された値を参照する命令群であれば、被参照変数値代入処理命令群３１０は、その参照されるアドレス変数に値を格納する命令群である。
【００８０】
これらの第一処理命令群１４０を実行する際に必要となる各種パラメータのことを以降の説明では総称して、被参照変数と呼ぶものとする。
【００８１】
（１．２）分岐処理命令群３２０
分岐処理命令群３２０は第一処理命令群１４０に分岐する処理命令群である。具体的には、例えば、第一処理命令群１４０が関数であるならば、分岐処理命令群３２０は関数コール命令であり、第一処理命令群１４０がサブルーチンであるならば、分岐処理命令群３２０はサブルーチンコール命令である。また、第一処理命令群１４０が処理命令群の集まりであるならば、分岐処理命令群３２０は分岐命令であり、第一処理命令群１４０が例外処理ならば、分岐処理命令群３２０は例外を発生させる処理命令である。より具体的には、分岐処理命令群３２０は、例えばアセンブリ言語の命令では、「ＣＡＬＬ、ＲＥＴ」のような関数コールや「ＪＡ、ＪＭＰ、ＬＯＯＰ」などのジャンプ命令、「ＩＮＴ」などの割り込み命令である。
【００８２】
（１．３）依存処理命令群３３０
依存処理命令群３３０は、第一処理命令群１４０を呼び出した後に実行される処理命令群であり、第二処理命令群１５０と同等の処理を行うプログラム命令群である。第二処理命令群１５０そのものと異なる点は、第二処理命令群１５０の一部の処理が、第一処理命令群１４０の処理結果を使用した処理に置き換えられている点である。置き換えの詳細は改竄防止処理生成装置１１０の説明の際に述べるものとし、ここでは置き換えの概要を説明する。
【００８３】
まず、第一処理命令群１４０の処理結果とは、具体的には、例えば、第一処理命令群１４０が関数である場合には、関数の戻り値である。また、例えば、第一処理命令群１４０が外部変数に値を設定する処理であるならば、第一処理命令群１４０の処理結果とは、外部変数に代入された値である。また、例えば、第一処理命令群１４０がスタックに値を格納する処理であれば、第一処理命令群１４０の処理結果とは、スタックに格納された値である。また、例えば、第一処理命令群１４０がアドレス変数で指定した位置に値を格納する処理であれば、第一処理命令群１４０の処理結果とは、その格納された値である。これらの第一処理命令群１４０の処理結果が格納される格納先のことを、以降の説明では被代入変数と呼ぶものとする。
【００８４】
第一処理命令群１４０の処理結果を予め知ることは一般には出来ないが、第一処理命令群１４０を実行する際に必要となる各種パラメータの値が被参照変数値代入処理命令群３１０で設定される時に限っては、処理結果の値を予め知ることができる。具体的には、例えば、被参照変数値代入処理命令群３１０が設定する値を実際に被参照変数に設定した上で、第一処理命令群１４０を実行すれば、処理結果の値を知ることができる。以降の説明では、この値を想定値と呼ぶものとする。
【００８５】
依存処理命令群３３０は、被代入変数の値が想定値である場合には、前記第二処理命令群と同じ処理を行う命令群である。また、望ましくは、被代入変数の値が想定値でない場合には、前記第二処理命令群とは異なる処理をする命令群であるとよい。具体的には、例えば、第二処理命令群が「ａ＝ａ＊５；」で、被代入変数「ｂ」の想定値が「５」である場合に、第二処理命令群を「ａ＝ａ＊ｂ；」に置き換えたものが依存処理命令群となる。
【００８６】
（１．４）処理命令群の具体例
図５Ａは、Ｃ言語で記述された第一処理命令群１４０の具体例を示す図である。また、図５Ｂは、Ｃ言語で記述された第二処理命令群１５０の具体例を示す図である。また、図５Ｃは、Ｃ言語で記述された出力処理命令群１６０の具体例を示す図である。なお、以降の説明では、「＊」、「〜」、「｜」、「＾」、「＜＜」、「＞＞」等の演算子を用いるが、処理命令群の説明で用いるこれらの演算子は特に断りのない場合、Ｃ言語における演算子を示す。また、以下の説明では、各処理命令群には、関数宣言や変数宣言がＣ言語の言語形式にしたがって追加されているが、この言語形式については公知であるので説明を省略する。
【００８７】
第一処理命令群１４０は、図５Ａに示すように、暗号化されたコンテンツの再生回数「ｅｎｃｒｙｐｔｅｄＤａｔａ」（被参照変数）を入力して復号化することにより、コンテンツの再生回数「ｐｌａｉｎＤａｔａ」（被代入変数）を出力する処理を含む命令群である。ここでは、簡単のために、暗号化されたコンテンツの再生回数と、秘密情報「０ｘ００ＦＦ」との排他論理和を取る処理「ｐｌａｉｎＤａｔａ＝ｅｎｃｒｙｐｔｅｄＤａｔａ＾０ｘ００ＦＦ」を、復号化の処理としている。なお、「０ｘ００ＦＦ」における頭の「０ｘ」は「００ＦＦ」が１６進数であることを示している。
【００８８】
ここで、「ｐｌａｉｎＤａｔａ」および「ｅｎｃｒｙｐｔｅｄＤａｔａ」はそれぞれ「０ｘ００００〜０ｘＦＦＦＦ」までの値を取る１６ビットの値とする。また、ｐｌａｉｎＤａｔａは２進数表記したときに最上位ビットが１である場合は負の値を示すものとする。すなわち「０ｘ８０００〜０ｘＦＦＦＦ」までの値は負数を示す。
【００８９】
第二処理命令群１５０は、図５Ｂに示すように、圧縮されたコンテンツデータ「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」を入力して解凍することにより、コンテンツデータ「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ」を出力する処理を含む命令群である。ここでは、簡単のために、圧縮されたコンテンツデータ「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」の値の数だけ１が連続する２進数を出力する処理を、解凍の処理とする。この処理は、図５Ｂに示すように、命令群「ｆｏｒ（ｃｏｕｎｔｅｒ＝０；ｃｏｕｎｔｅｒ＜ｃｏｍｐｒｅｓｓｅｄＤａｔａ；ｃｏｕｎｔｅｒ＋＋）｛（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜０ｘ０００１；｝」として表される。
【００９０】
ここで、「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」は０〜３１までの値を取るものとし、「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ」は３２ビットの値とする。「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ」は、「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」が「０」の時は、「０ｘ００００００００」となり、「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」が「１」の時は、「０ｘ０００００００１」となり、「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」が「３１」の時は、「０ｘＦＦＦＦＦＦＦＦ」となる。
【００９１】
出力処理命令群１６０は、図５Ｃに示すように、第二処理命令群１５０と同じ解凍処理を行う処理命令群である。この出力処理命令群１６０は、第二処理命令群１５０が改竄防止処理生成装置１１０によって難読化された後の命令群である。改竄防止処理生成装置１１０の詳細については後述する。
【００９２】
被参照変数値代入処理命令群３１０である「ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２；」は、第一処理命令群１４０を呼び出す際の引数に値を代入する処理であり、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に値「０ｘＦ０２２」を代入する処理を示している。
【００９３】
分岐処理命令群３２０である「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）；」は、引数を被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」として第一処理命令群１４０を呼び出す処理を示し、第一処理命令群１４０の処理結果を被代入変数「ｐｌａｉｎＤａｔａ」に格納する。実行処理装置１３０において、分岐処理命令群３２０が正常に実行された場合の戻り値の想定値は、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」を値「０ｘＦ０２２」として第一処理命令群１４０の処理を行った際の結果である「０ｘＦ０２２＾０ｘ００ＦＦ＝０ｘＦ０ＤＤ」となる。
【００９４】
依存処理命令群３３０は、第二処理命令群１５０と同等の処理を行う処理を示す。ただし、この処理では、第二処理命令群１５０とは異なり、第一処理命令群１４０の処理結果である「ｐｌａｉｎＤａｔａ」を用いた処理が含まれる。
【００９５】
具体的に、依存処理命令群３３０は、「ｆｏｒ（ｃｏｕｎｔｅｒ＝０；ｃｏｕｎｔｅｒ＜ｃｏｍｐｒｅｓｓｅｄＤａｔａ；ｃｏｕｎｔｅｒ＋＋）｛ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（ｐｌａｉｎＤａｔａ−０ｘＦ０ＤＣ）；｝」として表される。
【００９６】
上記の処理において、「ｐｌａｉｎＤａｔａ」の値が、先述の想定値「０ｘＦ０ＤＤ」である場合、「（ｐｌａｉｎＤａｔａ−０ｘＦ０ＤＣ）」は値「０ｘ００１」となる。これは、第二処理命令群１５０の対応箇所と同一の値であるので、「ｐｌａｉｎＤａｔａ」が想定値になっていれば、依存処理命令群３３０は第二処理命令群１５０と同等の処理を行う。また、「ｐｌａｉｎＤａｔａ」の値が想定値と異なっていた時には、「（ｐｌａｉｎＤａｔａ−０ｘＦ０ＤＣ）」の値は「０ｘ００１」とは異なる値となるため、第二処理命令群１５０と同等の処理が行われなくなる。
【００９７】
（１．５）出力処理命令群１６０の効果
実施の形態１の出力処理命令群１６０は、第一処理命令群１４０を実行する際に必要となる各種パラメータに値を設定する被参照変数値代入処理命令群３１０と、第一処理命令群１４０を呼び出す分岐処理命令群３２０と、第一処理命令群１４０を呼び出した後に実行される依存処理命令群３３０とからなる。ここで、改竄防止処理生成装置１１０による変換が行われていない第二処理命令群１５０では第一処理命令群１４０を呼び出さないにも関わらず、変換後の命令群である出力処理命令群１６０では第一処理命令群１４０を呼び出すための処理が追加されている。
【００９８】
このような構成を用いれば、実行処理装置１３０で出力処理命令群１６０を実行する際に、出力処理命令群１６０が目的としている処理（上記の実施の形態では解凍処理）には本来不要なはずの第一処理命令群１４０（上記の実施の形態では復号処理）も実行されることになる。よって、第一処理命令群１４０は複数の処理に必要な機能であるのか、単数の処理に必要な機能であるかの解析が困難になる。具体的には、上記の例では、第一処理命令群は、復号に必要な処理であり、本来は解凍には不要な処理であった。しかし、出力処理命令群１６０では、第一処理命令群１４０は復号と解凍との両方に必要な処理となる。よって、復号のみに必要な処理を解析することで復号処理に含まれる秘密情報を解析しようとする不正解析者の解析作業を困難にすることが出来る。
【００９９】
さらに、実行処理装置１３０では、出力処理命令群１６０を実行する際に、第一処理命令群１４０も実行されることとなる。よって、出力処理命令群１６０を解析しようとする不正解析者が解析しないといけない処理が、第二処理命令群１５０と比べて増加する。従来からも、元々の処理に他の処理を追加して、不正解析者が解析しなければならない処理を増加させる難読化は行われていたが、その際には追加する処理のプログラムサイズが増大するという問題があった。しかし、出力処理命令群１６０は、実行処理装置１３０において他の用途で使用される第一処理命令群１４０を呼び出すための命令群を追加しているのみであるので、プログラムサイズをほとんど増大させずに、不正解析者が解析しなければならない処理を増大させることができる。
【０１００】
なお、発明の本質ではないので特に詳細に説明していないが、実施の形態１の復号処理を行う第一処理命令群１４０は、解凍処理を行う第二処理命令群１５０以外の命令群からも呼ばれる処理である（むしろ、本来は第二処理命令群１５０以外から呼ばれるべき処理である）ことは言うまでもない。ここで、第一処理命令群１４０を本来呼び出すべき命令群は、第一処理命令群１４０と同一のプログラムに含まれる命令群であってもよいし、第一処理命令群１４０がライブラリ等である場合は、異なるプログラムから呼び出されてもよい。また、第一処理命令群１４０と第二処理命令群１５０が同一のプログラムに含まれていてもよいし、上述のように第一処理命令群１４０がライブラリ等である場合は異なるプログラムに含まれていてもよい。ここで、同一のプログラムに含まれる場合、上述したようにプログラムサイズを増大させないためには、そのプログラムは第一処理命令群１４０を用いて何らかの処理を行うプログラムであることが望ましい。
【０１０１】
また、第一処理命令群１４０と第二処理命令群１５０とが同一のプログラムに含まれる場合は、そのプログラムを入力として与えることで、両方の処理命令群を入力することができる。さらにこの場合、プログラム中の第二処理命令群１５０を出力処理命令群１６０に置き換えて出力するプログラム出力手段等をさらに設けることで、入力されたプログラムを上述した特徴を有したプログラムへと難読化することができる。
【０１０２】
さらに、出力処理命令群１６０の依存処理命令群３３０は、第一処理命令群１４０の処理結果に依存する処理を行う命令群となっている。よって、不正解析者が、第一処理命令群１４０を不正改竄した場合、出力処理命令群１６０の処理が本来の結果と異なる結果となる。具体的には、例えば、不正解析者が図５Ａのコンテンツの再生可能回数を出力する第一処理命令群１４０を、「ｉｎｔ  ｄｅｃｒｙｐｔ（  ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ）｛ｒｅｔｕｒｎ  １００；｝」に改竄した場合、依存処理命令群３３０における「ｐｌａｉｎＤａｔａ」の値は１００となり、「０ｘＦ０ＤＤ」とは異なる値になる。よって、出力処理命令群１６０が実行されても、本来の解凍処理とは異なる値が出力されることとなる。よって、第一処理命令群１４０を改竄した不正解析者は、さらに出力処理命令群１６０をも不正改竄しなければ、コンテンツを正しく実行することが出来なくなる。このように、第一処理命令群１４０と第二処理命令群１５０がコンテンツの再生等の大きな機能の構成要素である場合に、その一部の構成要素が改竄されると、他の一部の構成要素の挙動がおかしくなる。よって、不正解析者が望む通りに機能を改竄することが困難になる。
【０１０３】
（２）改竄防止処理生成装置１１０の構成
続いて、改竄防止処理生成装置１１０の説明を行う。改竄防止処理生成装置１１０は、第二処理命令群１５０を上記の出力処理命令群１６０に変換する装置である。
【０１０４】
図６は、改竄防止処理生成装置１１０の構成を示す図である。
【０１０５】
改竄防止処理生成装置１１０は、入力処理命令群保持部２１０、被参照変数解析部２２０、被参照変数情報保持部２３０、被参照変数値代入処理命令群生成部２４０、被参照変数値代入処理命令群保持部２５０、被参照変数値保持部２６０、被代入変数解析部２７０、被代入変数情報保持部２８０、想定値情報保持部２９５、想定値算出部２９０、依存処理命令群生成部２０１、依存処理命令群保持部２０２、分岐処理命令群生成部２０３、分岐処理命令群保持部２０４、出力処理命令群生成部２０５、および出力処理命令群保持部２０６を備えている。
【０１０６】
入力処理命令群保持部２１０は、第一処理命令群１４０と第二処理命令群１５０を取得し、取得された各命令群を保持する。
【０１０７】
被参照変数解析部２２０は、第一処理命令群１４０を実行する際に値を設定しておく必要のある引数等の変数（被参照変数）が何であるかを解析する。
【０１０８】
被参照変数情報保持部２３０は、被参照変数解析部２２０による解析によって得られた被参照変数の変数名等の情報を保持する。
【０１０９】
被参照変数値代入処理命令群生成部２４０は、被参照変数に値を代入する被参照変数値代入処理命令群３１０を生成する。
【０１１０】
被参照変数値代入処理命令群保持部２５０は、被参照変数値代入処理命令群生成部２４０が生成した被参照変数値代入処理命令群３１０を保持する。
【０１１１】
被参照変数値保持部２６０は、被参照変数値代入処理命令群３１０が被参照変数に代入する値を保持する。
【０１１２】
被代入変数解析部２７０は、第一処理命令群１４０の処理結果が代入される変数（被代入変数）が何であるかを解析する。
【０１１３】
被代入変数情報保持部２８０は、被代入変数解析部２７０による解析によって得られた被代入変数の変数名等の情報を保持する。
【０１１４】
想定値算出部２９０は、被参照変数の値を被参照変数値保持部２６０が保持する値とし、第一処理命令群１４０を実行した際に得られる被代入変数の想定値を算出する。
【０１１５】
想定値情報保持部２９５は、想定値算出部２９０が算出した想定値を保持する。
【０１１６】
依存処理命令群生成部２０１は、第二処理命令群１５０と想定値に基づき依存処理命令群３３０を生成する。
【０１１７】
依存処理命令群保持部２０２は、依存処理命令群生成部２０１が生成した依存処理命令群３３０を保持する。
【０１１８】
分岐処理命令群生成部２０３は、入力処理命令群保持部２１０が保持する第一処理命令群１４０を呼び出す分岐処理命令群３２０を生成する。
【０１１９】
分岐処理命令群保持部２０４は、分岐処理命令群生成部２０３が生成した分岐処理命令群３２０を保持する。
【０１２０】
出力処理命令群生成部２０５は、被参照変数値代入処理命令群保持部２５０が保持する被参照変数値代入処理命令群３１０と、分岐処理命令群保持部２０４が保持する分岐処理命令群３２０と、依存処理命令群保持部２０２が保持する依存処理命令群３３０とからなる出力処理命令群１６０を生成する。
【０１２１】
出力処理命令群保持部２０６は、出力処理命令群が生成した出力処理命令群１６０を保持する。
【０１２２】
以下、上述の各構成要素について詳細に説明する。なお、以下の説明においては各構成要素の機能説明に加え、図５Ａの第一処理命令群１４０が入力された場合の具体的な動作例も説明する。
【０１２３】
（２．１）入力処理命令群保持部２１０
入力処理命令群保持部２１０は、外部から第一処理命令群１４０と第二処理命令群１５０の入力を受け付ける。つまり、入力処理命令群保持部２１０は、第一処理命令群１４０と第二処理命令群１５０とを取得する。また、入力処理命令群保持部２１０は、１以上の処理命令群を記憶する領域を備えている。入力処理命令群保持部２１０は、改竄防止処理生成装置１１０に入力された第一処理命令群１４０と第二処理命令群１５０を保持する。なお、入力を受け付ける部位と入力された命令群を保持する部位とを別々に構成してもよいことは言うまでもない。
【０１２４】
（２．２）被参照変数解析部２２０
被参照変数解析部２２０は、入力処理命令群保持部２１０が保持する第一処理命令群１４０を実行する際に必要となるパラメータを解析（特定）し、解析（特定）した情報を被参照変数情報保持部２３０に格納する。
【０１２５】
具体的には、例えば、第一処理命令群１４０が関数であれば、被参照変数解析部２２０は、その関数の引数の型や名前、個数を特定する。また、例えば、第一処理命令群１４０が外部変数を参照する処理を含む命令群であれば、被参照変数解析部２２０は、その外部変数の変数名や型を特定する。また、例えば、第一処理命令群１４０がスタックの値を参照する処理を含む命令群であれば、被参照変数解析部２２０は、参照されるスタックのサイズを特定する。また、例えば、第一処理命令群１４０がアドレス変数で指定した位置に格納された値を参照する処理を含む命令群であれば、被参照変数解析部２２０は、そのアドレス変数や格納する値の型を特定する。以下の説明では、このように特定された情報（解析された情報）、すなわち、第一処理命令群１４０を実行する際に必要なパラメータに関する情報を総称して、被参照変数情報と呼ぶ。
【０１２６】
具体的な例としては、被参照変数解析部２２０は、図５Ａの第一処理命令群１４０が入力された場合、関数の引数名とその引数の型「ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ」を特定（解析）し、これを被参照変数情報保持部２３０に格納する。ここでは、引数名は「ｅｎｃｒｙｐｔｅｄＤａｔａ」であり、型は「ｉｎｔ」である。
【０１２７】
（２．３）被参照変数情報保持部２３０
被参照変数情報保持部２３０は、被参照変数情報を記憶する領域を備えている。
【０１２８】
被参照変数情報保持部２３０は、被参照変数解析部２２０によって特定された第一処理命令群１４０の被参照変数情報を記憶する。
【０１２９】
具体的には、被参照変数情報保持部２３０は、被参照変数解析部２２０が図５Ａの第一処理命令群１４０を解析した場合、関数の引数名と型「ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ」を記憶する。
【０１３０】
（２．４）被参照変数値代入処理命令群生成部２４０
被参照変数値代入処理命令群生成部２４０は、第一処理命令群１４０を実行する際に必要なパラメータに値を設定する処理命令群である被参照変数値代入処理命令群３１０を生成し、生成した処理命令群を被参照変数値代入処理命令群保持部２５０に書き込む。また、被参照変数値代入処理命令群生成部２４０は、パラメータに設定する値を被参照変数値保持部２６０に書き込む。
【０１３１】
具体的には、例えば、被参照変数値代入処理命令群生成部２４０は、被参照変数情報保持部２３０が保持する変数名を取得する。次に、被参照変数値代入処理命令群生成部２４０は、取得した取得した変数名が示す変数に代入する値を決定する。そして、被参照変数値代入処理命令群生成部２４０は、取得した変数名と、決定した値との組を被参照変数値保持部２６０に書き込む。さらに、被参照変数値代入処理命令群生成部２４０は、変数に対して、先に決定した値を代入する処理（被参照変数値代入処理命令群３１０）を生成し、その処理を被参照変数値代入処理命令群保持部２５０に書き込む。
【０１３２】
より具体的には、被参照変数情報保持部２３０が（２．３）の具体例に示した処理を行っている場合、被参照変数値代入処理命令群生成部２４０は、被参照変数情報保持部２３０が保持する被参照変数情報「ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ」を取得する。次に、被参照変数値代入処理命令群生成部２４０は、「ｅｎｃｒｙｐｔｅｄＤａｔａ」に代入するｉｎｔ型の定数値をランダムに決定する。ここでは、被参照変数値代入処理命令群生成部２４０は、定数値を「０ｘＦ０２２」と決定するものとする。次に、被参照変数値代入処理命令群生成部２４０は、決定した変数名と値との組「ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２」を被参照変数値保持部２６０に書き込む。また、被参照変数値代入処理命令群生成部２４０は、「ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２」を被参照変数値代入処理命令群３１０として被参照変数値代入処理命令群保持部２５０に書き込む。
【０１３３】
（２．５）被参照変数値代入処理命令群保持部２５０
被参照変数値代入処理命令群保持部２５０は、１以上の処理命令を記憶する領域を備える。被参照変数値代入処理命令群保持部２５０は、被参照変数値代入処理命令群生成部２４０が生成した被参照変数値代入処理命令群３１０を記憶領域に記憶する。被参照変数値代入処理命令群生成部２４０が生成した処理命令が複数ある場合には、複数の処理命令を記憶する。
【０１３４】
具体的には、被参照変数値代入処理命令群生成部２４０が（２．４）の具体例に示した処理を行っている場合、「ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２；」を記憶する。
【０１３５】
（２．６）被参照変数値保持部２６０
被参照変数値保持部２６０は、第一処理命令群１４０を実行する際に必要なパラメータ（被参照変数）に設定する値を記憶する領域を備える。
【０１３６】
具体的には、例えば、被参照変数値保持部２６０は、変数名と値との組を複数記憶する領域を備え、被参照変数値代入処理命令群生成部２４０が決定した変数名と、その変数名に対応する変数に代入する値との組を記憶する。
【０１３７】
より具体的には、被参照変数値代入処理命令群生成部２４０が（２．４）の具体例に示した処理を行っている場合、被参照変数値保持部２６０は、変数「ｅｎｃｙｒｐｔｅｄＤａｔａ」と値「０ｘＦ０２２」との組を記憶する。
【０１３８】
（２．７）被代入変数解析部２７０
被代入変数解析部２７０は、入力処理命令群保持部２１０が保持する第一処理命令群１４０の処理結果が格納される格納先を解析（特定）する。
【０１３９】
具体的には、例えば、第一処理命令群１４０が関数である場合には、被代入変数解析部２７０は、その関数の戻り値の変数名や型を特定する。また、例えば、第一処理命令群１４０が外部変数に値を決定する処理であるならば、被代入変数解析部２７０は、その外部変数の変数名や型を特定する。また、例えば、第一処理命令群１４０がスタックに値を格納する処理を含む命令群であれば、被代入変数解析部２７０は、そのスタックのサイズやスタック上の位置（スタックポインタ）を特定する。また、例えば、第一処理命令群１４０がアドレス変数で指定した位置に値を格納する処理を含む命令群であれば、被代入変数解析部２７０は、その格納されるアドレスを特定する。以降の説明では、このように特定された情報、すなわち、第一処理命令群１４０の処理結果が格納される格納先の情報を総称して、被代入変数情報と呼ぶ。なお、スタック等がＯＳ（Operating System）の機能として実現されている場合、スタックポインタやスタックのサイズはプログラム中には明示的には表れないことがあるが、このような値も被代入変数情報である。
【０１４０】
次に、被代入変数解析部２７０は、解析（特定）した被代入変数情報を被代入変数情報保持部２８０に格納する。
【０１４１】
より具体的には、図５Ａの第一処理命令群１４０を解析の対象とする場合、被代入変数解析部２７０は、関数の戻り値が格納される変数名と型「ｉｎｔ  ｐｌａｉｎＤａｔａ」を特定し、「ｉｎｔ  ｐｌａｉｎＤａｔａ」を被代入変数情報保持部２８０に格納する。
【０１４２】
（２．８）被代入変数情報保持部２８０
被代入変数情報保持部２８０は、被代入変数解析部２７０によって特定された第一処理命令群１４０の被代入変数情報を記憶する。
【０１４３】
第一処理命令群１４０で値が決定される変数（被代入変数）が複数ある場合には、そのうちの１つ以上の変数名等（被代入変数情報）を記憶する。なお、本発明は被代入変数が最低１つ分かれば実現できるので、複数の被代入変数が特定されたとしてもその全てを記憶する必要はない。どの被代入変数についての被代入変数情報を記憶するかは、被代入変数情報保持部２８０が決定してもよいし、被代入変数解析部２７０が決定してもよい。また、被代入変数情報を記憶する被代入変数をどれにするかの決定の仕方は特に問わないが、例えば、最初に見つかった被代入変数としたり、見つかった被代入変数からランダムに決定するとしてもよい。
【０１４４】
具体的には、図５Ａの第一処理命令群１４０に対して被代入変数解析部２７０による解析が行われた場合、被代入変数情報保持部２８０は、関数の戻り値が格納される変数名と型「ｉｎｔ  ｐｌａｉｎＤａｔａ」を記憶する。
【０１４５】
（２．９）想定値算出部２９０
想定値算出部２９０は、被参照変数値保持部２６０が保持する被参照変数の値を用いて第一処理命令群１４０を実行した場合に、被代入変数に代入される想定値を算出する。
【０１４６】
具体的には、想定値算出部２９０は、以下のＡ）〜Ｅ）に示す処理を行う。
【０１４７】
Ａ）想定値算出部２９０は、被代入変数情報保持部２８０から被代入変数情報を読み込む。
【０１４８】
Ｂ）想定値算出部２９０は、被参照変数値保持部２６０から被参照変数名および値を読み込む。
【０１４９】
Ｃ）想定値算出部２９０は、被参照変数に、読み込んだ値を代入し、入力処理命令群保持部２１０が保持する第一処理命令群１４０を実行する。
【０１５０】
Ｄ）想定値算出部２９０は、第一処理命令群１４０の実行後の被代入変数の値を参照する。
【０１５１】
Ｅ）想定値算出部２９０は、被代入変数の変数名と、参照した被代入変数の値との組を想定値情報保持部２９５に書き込む。
【０１５２】
なお、被代入変数情報保持部２８０が保持する被代入変数情報が複数ある場合には、想定値算出部２９０は、それぞれの被代入変数情報の変数名とその値との組を想定値情報保持部２９５に書き込む。
【０１５３】
より具体的には、被参照変数値保持部２６０が（２．６）の具体例に示す処理を行っている場合、想定値算出部２９０は、以下に示すＡ）〜Ｅ）の処理を行う。
【０１５４】
Ａ）想定値算出部２９０は、被代入変数情報保持部２８０が保持する被代入変数情報「ｉｎｔ  ｐｌａｉｎＤａｔａ」を読み込む。
【０１５５】
Ｂ）想定値算出部２９０は、被参照変数値保持部２６０から「ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２」を読み込む。ここで、被参照変数名は「ｅｎｃｒｙｐｔｅｄＤａｔａ」であり、値は「０ｘＦ０２２」である。
【０１５６】
Ｃ）想定値算出部２９０は、「ｄｅｃｒｙｐｔ（０ｘＦ０２２）；」を実行する。すなわち、「ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）；」の「ｅｎｃｒｙｐｔｅｄＤａｔａ」に値「０ｘＦ０２２」を代入して計算を行う。
【０１５７】
Ｄ）想定値算出部２９０は、「ｄｅｃｒｙｐｔ（０ｘＦ０２２）；」を実行した結果得られる被代入変数「ｐｌａｉｎＤａｔａ」の値を算出する。ここでは、想定値算出部２９０は、「０ｘＦ０２２＾０ｘ００ＦＦ＝０ｘＦ０ＤＤ」を算出する。
【０１５８】
Ｅ）想定値算出部２９０は、「ｉｎｔ  ｐｌａｉｎＤａｔａ＝０ｘＦ０ＤＤ」を想定値情報保持部２９５に格納する。ここで、被代入変数の変数名は「ｐｌａｉｎＤａｔａ」であり、値は「０ｘＦ０ＤＤ」である。
【０１５９】
（２．１０）想定値情報保持部２９５
想定値情報保持部２９５は、想定値情報を記憶する領域を備える。ここで、想定値情報とは想定値を保持すべき変数名やその想定値などの情報である。
【０１６０】
具体的には、想定値情報保持部２９５は、想定値算出部２９０が算出した想定値とその変数名とを上述の想定値情報として保持する。
【０１６１】
より具体的には、想定値算出部２９０が（２．９）の具体例に示した処理を行っている場合、「ｉｎｔ  ｐｌａｉｎＤａｔａ＝０ｘＦ０ＤＤ」を保持する。ここで、想定値は「０ｘＦ０ＤＤ」であり、変数名は「ｐｌａｉｎＤａｔａ」である。
【０１６２】
（２．１１）依存処理命令群生成部２０１
依存処理命令群生成部２０１は、想定値情報保持部２９５が保持する想定値および入力処理命令群保持部２１０が保持する第二処理命令群１５０に基づき依存処理命令群３３０を生成する。
【０１６３】
依存処理命令群３３０は、第二処理命令群１５０と同等の処理を行う処理命令群であって、第一処理命令群１４０の処理結果を参照する処理を含み、一部の処理がその参照した値を用いた処理となっている処理命令群である。
【０１６４】
依存処理命令群生成部２０１は、具体的には、例えば、以下に示すＡ）〜Ｆ）の処理を行う。
【０１６５】
Ａ）依存処理命令群生成部２０１は、第二処理命令群１５０に含まれる処理命令に含まれる定数を見つける。以下、この定数を含む処理命令をＯｒ１、その定数の値をＶａ１とする。
【０１６６】
Ｂ）依存処理命令群生成部２０１は、想定値情報保持部２９５が保持する想定値情報を読み込む。以下、その想定値を保持すべき変数をＶｒ１、その想定値をＶａ２とする。
【０１６７】
Ｃ）依存処理命令群生成部２０１は、Ｖａ３＝Ｖａ２−Ｖａ１を算出する。この時、Ｖａ１＝Ｖａ２−Ｖａ３となる。
【０１６８】
Ｄ）依存処理命令群生成部２０１は、処理命令Ｏｒ１に含まれる値Ｖａ１を、変数Ｖｒ１（値Ｖａ２を保持すべき変数）から値Ｖａ３を引き算することで算出する処理命令Ｏｒ２を生成する。すなわち、Ｏｒ２は「（Ｖｒ１−Ｖａ３）」となる。
【０１６９】
Ｅ）依存処理命令群生成部２０１は、第二処理命令群１５０の処理命令Ｏｒ１を処理命令Ｏｒ２に置き換えた命令群である依存処理命令群３３０を生成する。
【０１７０】
このような置き換えを行えば、変数Ｖｒ１の値が想定値Ｖａ２であれば、「Ｖｒ１−Ｖａ３」の値は「Ｖａ２−Ｖａ３＝Ｖａ１」となる。すなわち、処理命令Ｏｒ１に含まれる値Ｖａ１に対して上記の置き換えを行ったとしても、処理命令Ｏｒ２は、Ｖｒ１に正しい値が代入される限り、置き換えを行う前と同じ結果をもたらすことが出来る。
【０１７１】
具体的には、想定値情報保持部２９５が（２．１０）の処理を行った場合、依存処理命令群生成部２０１は、以下に示すＡ）〜Ｅ）の処理を行う。
【０１７２】
Ａ）依存処理命令群生成部２０１は、処理命令Ｏｒ１を「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜０ｘ０００１；」とし、値Ｖａ１を「０ｘ０００１」とする。
【０１７３】
Ｂ）依存処理命令群生成部２０１は、想定値情報保持部２９５から「ｉｎｔ  ｐｌａｉｎＤａｔａ＝０ｘＦ０ＤＤ」を読み込む。ここで、依存処理命令群生成部２０１は、変数Ｖｒ１を「ｐｌａｉｎＤａｔａ」、値Ｖａ２を「０ｘＦ０ＤＤ」とする。
【０１７４】
Ｃ）依存処理命令群生成部２０１は、値Ｖａ３、すなわち「０ｘＦ０ＤＤ−０ｘ０００１＝０ｘＦ０ＤＣ」を算出する。
【０１７５】
Ｄ）依存処理命令群生成部２０１は、処理命令Ｏｒ２「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（ｐｌａｉｎＤａｔａ−０ｘＦ０ＤＣ）；」を生成する。
【０１７６】
Ｅ）依存処理命令群生成部２０１は、第二処理命令群１５０の処理命令Ｏｒ１を処理命令Ｏｒ２に置き換えた命令群である依存処理命令群３３０を生成する。なお、本実施の形態はＣ言語によるプログラムであるとしているので、上述した処理の他に、依存処理命令群３３０がＣ言語プログラムとして適切に動作するよう、関数宣言や変数宣言を追加する必要がある。
【０１７７】
以上により、図５Ｃに図示する依存処理命令群３３０と同じ命令群が生成される。
【０１７８】
なお、ここでは、上述のＣ）で「Ｖａ３＝Ｖａ２−Ｖａ１」の演算を行ったが、他の算出式による演算または処理を行っても構わない。具体的には、排他的論理和や加算などの演算を行ってもよいし、より複雑な変換を行う関数等の演算を行ってもよい。その場合、算出式または処理を変形し、Ｖａ２を求める算出式または処理を生成し、それをＶａ２と置き変えればよい。すなわち、Ｖａ１とＶａ２とを用いた演算または処理を行うことでＶａ３を算出し、得られたＶａ３とＶａ１とからＶａ２を逆算する演算または処理を行う命令群を生成し、それをＶａ２と置き換えればよい。
【０１７９】
（２．１２）依存処理命令群保持部２０２
依存処理命令群保持部２０２は、１以上の処理命令を記憶する領域を備える。依存処理命令群保持部２０２は、依存処理命令群生成部２０１が生成した依存処理命令群３３０を記憶領域に記憶する。
【０１８０】
具体的には、依存処理命令群生成部２０１が（２．１１）の処理を行った場合、依存処理命令群保持部２０２は、図５Ｃに示す依存処理命令群３３０を記憶する。
【０１８１】
（２．１３）分岐処理命令群生成部２０３
分岐処理命令群生成部２０３は、入力処理命令群保持部２１０が保持する第一処理命令群１４０を呼び出す分岐処理命令群３２０を生成する。
【０１８２】
具体的には、例えば、第一処理命令群１４０が関数であるならば、分岐処理命令群生成部２０３は、関数コール命令を生成する。また、第一処理命令群１４０がサブルーチンであるならば、分岐処理命令群生成部２０３は、サブルーチンコール命令を生成する。また、第一処理命令群１４０が例外処理ならば、分岐処理命令群生成部２０３は、例外を発生させる処理命令を生成する。
【０１８３】
より具体的には、入力処理命令群保持部２１０が（２．１）の処理を行った場合、分岐処理命令群生成部２０３は、関数コール命令である「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）；」を分岐処理命令群３２０として生成する。
【０１８４】
（２．１４）分岐処理命令群保持部２０４
分岐処理命令群保持部２０４は、１以上の処理命令を記憶する領域を備える。分岐処理命令群保持部２０４は、分岐処理命令群生成部２０３が生成した分岐処理命令群３２０を記憶領域に記憶する。
【０１８５】
具体的には、分岐処理命令群生成部２０３が（２．１３）の処理を行った場合、分岐処理命令群保持部２０４は「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）；」を記憶する。
【０１８６】
（２．１５）出力処理命令群生成部２０５
出力処理命令群生成部２０５は、被参照変数値代入処理命令群保持部２５０が保持する被参照変数値代入処理命令群３１０と、分岐処理命令群保持部２０４が保持する分岐処理命令群３２０と、依存処理命令群保持部２０２が保持する依存処理命令群３３０とからなる出力処理命令群１６０を生成する。
【０１８７】
具体的には、上記の（２．１４）までの処理が行われた場合、出力処理命令群生成部２０５は、図５Ｃの出力処理命令群１６０を生成する。
【０１８８】
（２．１６）出力処理命令群保持部２０６
出力処理命令群保持部２０６は、１以上の処理命令群を記憶する領域を備えている。出力処理命令群保持部２０６は、出力処理命令群生成部２０５が生成した出力処理命令群１６０を記憶する。
【０１８９】
具体的には、出力処理命令群生成部２０５が（２．１５）の処理を行った場合、出力処理命令群保持部２０６は、図５Ｃの出力処理命令群１６０を記憶する。
【０１９０】
（２．１７）改竄防止処理生成装置１１０の動作
改竄防止処理生成装置１１０の動作について、図７を用いて説明する。
【０１９１】
図７は、改竄防止処理生成装置１１０の動作を示すフローチャートである。
【０１９２】
被参照変数解析部２２０は、入力処理命令群保持部２１０が保持する第一処理命令群１４０を実行する際に必要となるパラメータの格納先である被参照変数に関する情報である被参照変数情報を解析（特定）する（ステップＳ１００）。
【０１９３】
被参照変数解析部２２０は、特定（解析）された被参照変数情報を被参照変数情報保持部２３０に格納する（ステップＳ１０２）。
【０１９４】
被参照変数値代入処理命令群生成部２４０は、ステップＳ１００で特定（解析）された被参照変数に格納する値を決定する（ステップＳ１０４）。
【０１９５】
被参照変数値代入処理命令群生成部２４０は、ステップＳ１０４で決定した、被参照変数に格納する値、および被参照変数名を被参照変数値保持部２６０に格納する（ステップＳ１０６）。
【０１９６】
被参照変数値代入処理命令群生成部２４０は、ステップＳ１０４で決定した値を被参照変数に格納する処理命令群である被参照変数値代入処理命令群３１０を生成する（ステップＳ１０８）。
【０１９７】
被参照変数値代入処理命令群生成部２４０は、ステップＳ１０８で生成した被参照変数値代入処理命令群３１０を被参照変数値代入処理命令群保持部２５０に格納する（ステップＳ１１０）。
【０１９８】
想定値算出部２９０は、被参照変数値保持部２６０が保持する被参照変数の値を用いて第一処理命令群１４０を実行した場合の被代入変数が取る想定値を算出する（ステップＳ１１２）。ここで、被代入変数解析部２７０は、このステップＳ１１２が行われるよりも前に被代入変数の解析を行い、その結果を被代入変数情報保持部２８０に格納しているものとする。したがって、ステップＳ１１２では、想定値算出部２９０は、被代入変数情報保持部２８０から被代入変数に関する情報を得て、想定値を算出している。
【０１９９】
想定値算出部２９０は、算出した想定値および、被代入変数名を想定値情報保持部に格納する（ステップＳ１１４）。
【０２００】
依存処理命令群生成部２０１は、想定値情報保持部２９５が保持する想定値および入力処理命令群保持部２１０が保持する第二処理命令群１５０に基づき依存処理命令群３３０を生成する（ステップＳ１１６）。
【０２０１】
依存処理命令群生成部２０１は、生成した依存処理命令群３３０を依存処理命令群保持部２０２に格納する（ステップＳ１１８）。
【０２０２】
分岐処理命令群生成部２０３は、入力処理命令群保持部２１０が保持する第一処理命令群１４０を呼び出す分岐処理命令群３２０を生成する（ステップＳ１２０）。
【０２０３】
分岐処理命令群生成部２０３は、生成した分岐処理命令群３２０を分岐処理命令群保持部２０４に格納する（ステップＳ１２２）。
【０２０４】
出力処理命令群生成部２０５は、被参照変数値代入処理命令群保持部２５０が保持する被参照変数値代入処理命令群３１０と、分岐処理命令群保持部２０４が保持する分岐処理命令群３２０と、依存処理命令群保持部２０２が保持する依存処理命令群３３０とからなる出力処理命令群１６０を生成する（ステップＳ１２４）。
【０２０５】
出力処理命令群生成部２０５は、生成した出力処理命令群１６０を出力処理命令群保持部２０６に格納する（ステップＳ１２６）。
【０２０６】
（２．１８）改竄防止処理生成装置１１０の効果
改竄防止処理生成装置１１０は、入力として与えられた第一処理命令群１４０および第二処理命令群１５０から（１．５）で述べた効果を有する出力処理命令群１６０を生成することが出来る。
【０２０７】
図８は、改竄防止処理生成装置１１０の効果を説明するための説明図である。
【０２０８】
改竄防止処理生成装置１１０は、例えば、第一処理命令群１４０と第二処理命令群１５０とを含む入力プログラム（オリジナルプログラム）１０１を取得して、その入力プログラム１０１を改竄防止プログラム１０２に変換して出力する。このとき、改竄防止処理生成装置１１０は、上述のように、入力プログラム１０１の第二処理命令群１５０を出力処理命令群１６０に変換している。
【０２０９】
つまり、改竄防止処理生成装置１１０は、第二処理命令群１５０に対して、保護対象コードである第一処理命令群１４０の呼出処理を追加するとともに、第二処理命令群１５０の解凍処理を、保護対象コードである第一処理命令群１４０の処理結果に依存させること（依存処理）により、改竄防止処理を生成している。
【０２１０】
保護対象コード（第一処理命令群１４０）の呼出処理では、被参照変数値代入処理命令群３１０において、保護対象コードの被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に値「０ｘ００２２」が代入された状態で、保護対象コードが呼び出される。
【０２１１】
その結果、改竄防止プログラム１０２では、従来のように保護対象コードがデータとして読み込まれることがないため、不正解析者によって改竄防止処理が見つけられるのを困難にすることができる。
【０２１２】
さらに、依存処理では、依存処理命令群３３０の解凍処理「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（ｐｌａｉｎＤａｔａ−０ｘＦ０ＤＣ」が、上述の呼出処理によって保護対象コードが呼び出されて実行された結果（第一処理命令群１４０の処理結果）である「ｐｌａｉｎＤａｔａ」の値に依存している。つまり、保護対象コードが改竄されていなければ、「ｐｌａｉｎＤａｔａ」の値は想定値「０ｘＦ０ＤＤ」となるため、改竄防止プログラム１０２の出力処理命令群１６０が実行されると、第二処理命令群１５０の解凍処理「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜０ｘ０００１」が正しく実行される。
【０２１３】
一方、保護対象コードが改竄されていれば、「ｐｌａｉｎＤａｔａ」の値は想定値「０ｘＦ０ＤＤ」と異なるため、改竄防止プログラム１０２の出力処理命令群１６０が実行されると、第二処理命令群１５０の解凍処理とは異なる処理が実行される。つまり、改竄防止プログラム１０２に含まれる入力プログラム１０１の処理が正しく実行されないこととなる。
【０２１４】
その結果、改竄防止プログラム１０２では、従来のように判定／終了処理がないため、不正解析者によって改竄防止処理が見つけられるのをさらに困難にすることができる。もしも、プログラムに判定／終了処理があれば、不正解析者は、プログラムを複数回実行して各回におけるログを収集することにより、各回におけるログの違いに基づいて、判定／終了処理、すなわち判定／終了処理を伴う改竄防止処理を容易に見つけることができる。
【０２１５】
しかし、改竄防止プログラム１０２では、上述のように、判定／終了処理がないため、改竄防止処理を見つけることが困難になるのである。
【０２１６】
さらに、不正解析者に対して、出力処理命令群１６０から呼び出される保護対象コード（第一処理命令群１４０）を出力処理命令群１６０の処理の一部に見せかけることができ、第二処理命令群１５０を難読化することができる。
【０２１７】
このように、本実施の形態における改竄防止処理生成装置１１０は、第二処理命令群１５０に対して保護対象コードの呼出処理を追加するとともに依存処理を生成することにより、保護対象コードに対する改竄を確実に防止する出力処理命令群１６０（改竄防止プログラム１０２）を生成することができる。また、本実施の形態における改竄防止処理生成装置１１０は、実行中にメモリ上にあるコードをデータとして読み込むことができないＪａｖａ（登録商標）等の言語で記述されたプログラムに対しても、そのプログラムの保護対象コードに対する改竄を確実に防止することができる。
【０２１８】
（変形例１）
上述した実施の形態では、第一処理命令群１４０の引数であった変数をそのまま被参照変数値代入処理命令群３１０で値を代入する変数としていたが、これに限られるものではない。被参照変数値代入処理命令群生成部２４０は、第二処理命令群１５０で使用されている変数名を特定し、被参照変数情報保持部２３０に保持されている変数名のうち、第二処理命令群１５０で使用されていない変数名の変数にランダムな値を代入する処理を行う命令群を被参照変数値代入処理命令群３１０としてもよい。このような構成を用いれば、第一処理命令群で戻り値を格納する変数名が、第二処理命令群１５０で他の用途に使用されている場合でも第二処理命令群１５０の難読化を行うことができる。
【０２１９】
上述した実施の形態では、第一処理命令群１４０と第二処理命令群１５０とは、本来、情報をやりとりする必要のない命令群であったため、第一処理命令群１４０の処理結果を格納する変数をそのまま難読化に用いたとしても、そのことにより正しい処理結果が書き換えられることはなかった。しかし、第二処理命令群１５０が、第一処理命令群１４０を呼び出す命令をもともと含んでおり、その処理結果を利用する命令群である場合、単純に上述した難読化を施すと、被参照変数値代入処理命令群３１０によってその処理結果が書き換えられてしまうことにより、正常な動作が保証できなくなる。ここで、上述のように第二処理命令群１５０に含まれない変数を用いることにより、難読化に用いる変数と第二処理命令群１５０にもともと含まれていた第一処理命令群１４０の処理結果を格納する変数とが異なる変数となるため、処理結果に影響を与えることなく難読化を行うことができる。すなわち、第二処理命令群１５０が第一処理命令群１４０を呼び出すような処理を含む場合であっても、上述と同様の難読化を行うことができる。
【０２２０】
なお、この場合であっても、（１．５）で述べたものと同様の効果が得られることは言うまでもない。
【０２２１】
（変形例２）
被参照変数値代入処理命令群生成部２４０では、被参照変数に代入する値をランダムに決定するとしたが、代入する値によって、不正解析者の解析行為の困難さに差が出る場合がある。したがって、改竄防止処理生成装置１１０の構成は、代入する値または想定値がユーザにより指定されるような構成であっても構わない。
【０２２２】
以下、図５Ｃに示すように、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に代入する値を「０ｘＦ０２２」とした場合と、「０ＸＦ０００１」とした場合とで、不正解析者の解析行為の困難さの差を具体的に説明する。
【０２２３】
図５Ｃに示すように、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に代入する値を「０ｘＦ０２２」とすると、想定値算出部２９０が算出する想定値は「０ｘＦ０ＤＤ」であった。よって、第一処理命令群１４０が処理「ｉｎｔ  ｄｅｃｒｙｐｔ（ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ）｛ｒｅｔｕｒｎ  ０ｘＦ０ＤＤ；｝」に改竄された場合でも、出力処理命令群１６０は正常に動作することとなる。
【０２２４】
上記の処理は、第一処理命令群１４０の戻り値を常に想定値となるようにした処理である。
【０２２５】
この時、改竄後の第一処理命令群１４０が出力する再生可能回数は、「０ｘＦ０ＤＤ」である。ここで、「０ｘＦ０ＤＤ」は、２進標記した場合の最上位ビットが１であるので、負の値である。すなわち、第一処理命令群１４０が出力する再生可能回数は常に負の値となるので、仮に上記のような改竄に成功しても再生はできない。したがって、改竄に成功しても失敗しても再生ができないことから、不正解析者は改竄が成功したか否かの判断ができなくなる。また、仮に改竄に成功したと不正解析者が認識していたとしても、再生可能回数が常に負の値であるので、改竄が成功したことによる利益は薄い。
【０２２６】
一方、被参照変数に代入する値がランダムに「０ｘ０００１」と決まった場合、想定値算出部２９０が算出する想定値は「０ｘ００ＦＥ」である。よって、第一処理命令群１４０が処理「ｉｎｔ  ｄｅｃｒｙｐｔ（  ｉｎｔ  ｅｎｃｒｙｐｔｅｄＤａｔａ）｛ｒｅｔｕｒｎ  ０ｘ００ＦＥ；｝」に改竄された場合、出力処理命令群１６０は正常に動作することとなる。
【０２２７】
この時、改竄後の第一処理命令群１４０が出力する再生可能回数０ｘ００ＦＥは、最上位ビットが０であるので常に正の値となる。この場合、常に再生が可能となってしまうので、これは、不正解析者にとって望ましい改竄である。
【０２２８】
このように、被参照変数に代入する値によって不正解析者の解析行為が困難さに差が出る場合がある。そこで、改竄防止処理生成装置１１０を、代入する値または想定値がユーザにより指定されるような構成としてもよい。
【０２２９】
（変形例３）
実施の形態１では、被参照変数の値をランダムに決定し、その値に対応する想定値を想定値算出部２９０により算出したが、改竄防止処理生成装置１１０を、予め被参照変数の値や想定値が与えられるような構成としても構わない。
【０２３０】
例えば、第一処理命令群１４０を開発した後に行うテストの際のテストデータに含まれる、被参照変数情報や、被参照変数値、想定値などの情報を用いる構成としても構わない。
【０２３１】
その場合、改竄防止処理生成装置１１０は、被参照変数解析部２２０、被代入変数解析部２７０、想定値算出部２９０を含まなくてよい。
【０２３２】
このような構成は、同一の第一処理命令群１４０を用いる複数の異なるプログラムのそれぞれに対して難読化を行うような場合や、難読化強度の調節を行う他の手法と組み合わせて適切な実行速度と強度を兼ね備えた出力処理命令群１６０が得られるまで何度も難読化を試みる場合等に有効である。
【０２３３】
すなわち、想定値の算出に時間がかかる場合、同じ想定値を得られるのみであるにも関わらず、難読化が行われるたびに想定値の算出処理が行われるので、それぞれの難読化に余分な時間がかかってしまう。上記のような構成を用いることで、一度想定値を算出すれば、その値を使い回すことができるので、想定値の算出にかかる時間の分、難読化処理にかかる時間を短くすることができる。
【０２３４】
（変形例４）
被参照変数を一つも含まないような第一処理命令群１４０を対象とする場合には、改竄防止処理生成装置１１０を、被参照変数解析部２２０および被参照変数情報保持部２３０を含まない構成としてもよい。
【０２３５】
（変形例５）
実施の形態１の改竄防止処理生成装置１１０では、Ｃ言語を対象としているため、中間プログラムを保持する被参照変数値代入処理命令群保持部２５０、分岐処理命令群保持部２０４、および依存処理命令群保持部２０２と、出力処理命令群生成部２０５とを備えて、中間プログラムから、変数宣言および関数宣言等を有するＣ言語のプログラム（出力処理命令群１６０）を出力した。しかし、アセンブリ言語のような、順に処理命令を並べることでプログラムを生成できる言語を対象とする場合には、改竄防止処理生成装置１１０は、これらの要素を備えずに、出力処理命令群保持部に２０６に順に中間プログラムを追記して出力処理命令群１６０を出力してもよい。
【０２３６】
（変形例６）
改竄防止処理生成装置１１０の変形例である改竄防止処理生成装置１１０ａについて図９および図１０を用いて説明する。なお、以降の説明で、実施の形態１の構成要素（装置、部、および処理命令群など）の符号の語尾に「ａ」を付けたものはその構成要素の変形例である。例えば、改竄防止処理生成装置１１０ａは、実施の形態１の構成要素である改竄防止処理生成装置１１０の変形例である。また、本変形例における構成要素のうち、実施の形態１の構成要素の名称および符号と同じ名称および符号を用いて示される構成要素は、実施の形態１にて説明した構成要素と同一である。
【０２３７】
改竄防止処理生成装置１１０ａは改竄防止処理生成装置１１０と同じく処理システム１００において用いられる装置である。改竄防止処理生成装置１１０ａは、第一処理命令群１４０および第二処理命令群１５０を入力とし、出力処理命令群１６０ａを出力する。以下、出力処理命令群１６０ａおよび改竄防止処理生成装置１１０ａを説明する。
【０２３８】
（３）出力処理命令群１６０ａの構成
図９は、改竄防止処理生成装置１１０ａによって生成された出力処理命令群１６０ａの具体例を示す図である。
【０２３９】
出力処理命令群１６０ａは、第一処理命令群１４０を実行する際に必要となる各種パラメータに値を設定する被参照変数値代入処理命令群３１０ａと、第一処理命令群１４０を呼び出す分岐処理命令群３２０ａと、第一処理命令群１４０を呼び出した後に実行される依存処理命令群３３０ａとからなる。以下、この具体例を用いながら各部を説明する。
【０２４０】
（３．１）被参照変数値代入処理命令群３１０ａ
被参照変数値代入処理命令群３１０ａは、第一処理命令群１４０を呼び出して実行する際に必要となる各種パラメータに値を設定する処理である。図５Ｃの被参照変数値代入処理命令群３１０では、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に格納される値は常に１つの値「０ｘＦ０２２」と固定されていたのに対し、被参照変数値代入処理命令群３１０ａでは、格納される値は１つの固定された値とはならない。
【０２４１】
具体的には、図９の被参照変数値代入処理命令群３１０ａ「ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８；」では、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に格納される値は「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」の値に依存する。「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」は、０〜３１の値（１６進数表記で０ｘ００〜０ｘ１Ｆ）を取るので、被参照変数値代入処理命令群「ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８；」によって被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に代入される値は「０ｘ００００、０ｘ０１００、…、０ｘ１Ｆ００」のいずれかとなる。以降の説明では、被参照変数が取る値を集合の表現を用いて｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘ００００、０ｘ０１００、…、０ｘ１Ｆ００｝と表す。あるいは、被参照変数が取る値を、「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」も使った集合の表現として｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝と表す。
【０２４２】
（３．２）分岐処理命令群３２０ａ
分岐処理命令群３２０ａは第一処理命令群１４０に分岐する処理命令群である。
【０２４３】
実施の形態１の場合、実行処理装置１３０により出力処理命令群１６０を実行した場合、第一処理命令群１４０を呼び出した後の被代入変数「ｐｌａｉｎＤａｔａ」が取る値は常に１つの固定された値である。なぜならば、第一処理命令群１４０の処理結果に影響を与える変数は被参照変数であり、実施の形態１では、その被参照変数に常に同じ値を代入しているからである。
【０２４４】
一方、本変形例では、被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に代入される値は１つの固定された値ではないので、被代入変数「ｐｌａｉｎＤａｔａ」に代入される値も１つの固定された値とはならない。被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」が取る値は「０ｘ００００、０ｘ０１００、…、０ｘ１Ｆ００」のいずれかであるので、被代入変数「ｐｌａｉｎＤａｔａ」の取る値は、これらの値を第一処理命令群１４０によって処理した結果である「０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ」のいずれかとなる。被代入変数が取る値を集合で表現した場合、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ｝あるいは、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾０ｘ００ＦＦ、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝となる。
【０２４５】
（３．３）依存処理命令群３３０ａ
依存処理命令群３３０ａは、第一処理命令群１４０を呼び出した後に実行される処理命令群であり、第二処理命令群１５０と同等の処理を行う処理命令群である。具体的には、被代入変数の値が、（３．２）で述べた取り得る値のいずれであっても第二処理命令群１５０と同等の処理を行う処理命令群である。
【０２４６】
より具体的には、依存処理命令群３３０ａは、処理命令群「  ｆｏｒ（ｃｏｕｎｔｅｒ＝０；ｃｏｕｎｔｅｒ＜ｃｏｍｐｒｅｓｓｅｄＤａｔａ；ｃｏｕｎｔｅｒ＋＋）｛ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾ｐｌａｉｎＤａｔａ＾０ｘ００ＦＥ）；｝」である。
【０２４７】
上記の処理命令群で、着目すべきは「（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾ｐｌａｉｎＤａｔａ＾０ｘ００ＦＥ」の処理命令群の部分である。
【０２４８】
｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾０ｘ００ＦＦ、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝の時、上記の処理命令群は「（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８＾０ｘ００ＦＦ）＾０ｘ００ＦＥ」を算出する処理となり、出力値は常に１となる。すなわち、（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）とｐｌａｉｎＤａｔａとは上位の８ビットが同一の値ｃｏｍｐｒｅｓｓｅｄＤａｔａであるので、排他的論理和演算の結果は常に値「０ｘ００ＦＦ」となる。上記の処理命令群では、この値に対して、さらに、０ｘＦＥという最下位ビットのみ「０ｘ００ＦＦ」と異なる値との排他的論理和を取ることにより、最下位ビットのみが１の値、すなわち、「０ｘ０００１」が得られる。よって、依存処理命令群３３０ａは、被代入変数の値が、（３．２）で述べた取り得る値のいずれであっても第二処理命令群１５０と同等の処理となる。
【０２４９】
（３．４）出力処理命令群１６０ａの効果
出力処理命令群１６０ａを用いれば、被代入変数に格納される値は変数「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」に依存して変化する値となるので、不正解析者の解析が困難になる。以下、この詳細を説明する。
【０２５０】
実施の形態１の場合、不正解析者が、被参照変数「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」に「０〜３１」の何れかの値を順に代入して出力処理命令群１６０を実行すると、分岐処理命令群３２０「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）」の処理結果である被代入変数「ｐｌａｉｎＤａｔａ」の値は常に１つの固定された値「０ｘＦ０ＤＤ」となる。そこで、不正解析者は、「ｐｌａｉｎＤａｔａ」の値は常に「０ｘＦ０ＤＤ」になると推測して、分岐処理命令群３２０を「ｐｌａｉｎＤａｔａ＝０ｘＦ０ＤＤ；」に置き換える改竄を行うことができる。このような手順で不正解析者が解析を行った場合、不正解析者は、第一処理命令群１４０の中身を解析せずに出力処理命令群１６０を効率的に解析することが出来る。一方、出力処理命令群１６０ａの場合には、被代入変数の値は「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」の値に応じて変化するため、このような解析を行うことは出来ない。
【０２５１】
（４）改竄防止処理生成装置１１０ａの構成
図１０は、改竄防止処理生成装置１１０ａの構成を示す図である。
【０２５２】
改竄防止処理生成装置１１０ａは、図６の改竄防止処理生成装置１１０の、被参照変数値代入処理命令群生成部２４０、被参照変数値保持部２６０、想定値算出部２９０、想定値情報保持部２９５、および依存処理命令群生成部２０１がそれぞれ、被参照変数値代入処理命令群生成部２４０ａ、被参照変数値保持部２６０ａ、想定値算出部２９０ａ、想定値情報保持部２９５ａ、および依存処理命令群生成部２０１ａに置換わったものである。
【０２５３】
以下、置き換わった構成要素のそれぞれについて説明する。なお、以下の例で挙げる具体例は、図９に示す出力処理命令群１６０ａとは異なる出力処理命令群を得るための処理であることに注意されたい。
【０２５４】
（４．１）被参照変数値代入処理命令群生成部２４０ａ
被参照変数値代入処理命令群生成部２４０ａは、第一処理命令群１４０を実行する際に必要なパラメータに値を設定する処理命令群である被参照変数値代入処理命令群３１０ａを生成し、生成した処理命令群を被参照変数値代入処理命令群保持部２５０に書き込む。また、パラメータに設定する値を被参照変数値保持部２６０ａに書き込む。
【０２５５】
具体的には、例えば、被参照変数値代入処理命令群生成部２４０ａは、被参照変数情報保持部２３０が保持する変数名を取得し、取得したそれぞれの変数に対し以下のＡ）〜Ｄ）の処理を行う。
【０２５６】
Ａ）被参照変数値代入処理命令群生成部２４０ａは、被参照変数値代入処理命令群３１０ａを決定する。被参照変数値代入処理命令群３１０ａは、第二処理命令群１５０の被依存変数を用いてランダムに生成されるとしてもよいし、あらかじめ定められた命令群のテンプレートに被依存変数を当てはめる等としてもよい。
【０２５７】
Ｂ）被参照変数値代入処理命令群生成部２４０ａは、決定した被参照変数値代入処理命令群３１０ａを被参照変数値代入処理命令群保持部２５０に書き込む。
【０２５８】
Ｃ）被参照変数値代入処理命令群生成部２４０ａは、被参照変数値代入処理命令群３１０ａによる、被参照変数が取りうる値の集合を求める。
【０２５９】
Ｄ）被参照変数値代入処理命令群生成部２４０ａは、求めた集合を被参照変数値保持部２６０ａに書き込む。
【０２６０】
より具体的には、図５Ａの第一処理命令群１４０に対しては、以下の処理が行われる。
【０２６１】
Ａ）被参照変数値代入処理命令群生成部２４０ａは、被参照変数値代入処理命令群３１０ａを「ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８」とする。この処理命令群は、第二処理命令群１５０の被依存変数を用いてランダムに生成した式である。
【０２６２】
Ｂ）被参照変数値代入処理命令群生成部２４０ａは、被参照変数値代入処理命令群３１０ａ「ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８」を被参照変数値代入処理命令群保持部２５０に書き込む。
【０２６３】
Ｃ）被参照変数値代入処理命令群生成部２４０ａは、被参照変数値代入処理命令群３１０ａによる、被参照変数が取りうる値の集合を求める。この集合は、｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝となる。
【０２６４】
Ｄ）被参照変数値代入処理命令群生成部２４０ａは、求めた集合を被参照変数値保持部２６０ａに書き込む。ここでは、集合｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ  ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、、、０ｘ１Ｆ｝を書き込む。
【０２６５】
（４．２）被参照変数値保持部２６０ａ
被参照変数値保持部２６０ａは、第一処理命令群１４０を実行する際に必要なパラメータに設定する値を記憶する領域を備える。
【０２６６】
具体的には、例えば、被参照変数値保持部２６０ａは、変数名と、その変数名の変数が取りうる値の集合の情報とを記憶する領域を備える。
【０２６７】
より具体的には、図５Ａの第一処理命令群１４０に対しては、被参照変数値保持部２６０ａは、集合｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝を保持する。ここで、変数名は「ｅｎｃｒｙｐｔｅｄＤａｔａ」であり、その値の集合は、｛ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝である。なお、保持する内容は、具体的に値を列挙したものであっても、集合の表現であっても構わない。
【０２６８】
（４．３）想定値算出部２９０ａ
想定値算出部２９０ａは、被参照変数値保持部２６０ａが保持する被参照変数の値を用いて第一処理命令群１４０を実行した場合に、被代入変数に代入される想定値の値を算出する。ここで、被参照変数の値が１つの値だけではなく、値の集合に含まれる何れかの値であるので、想定値算出部２９０ａは、想定値を集合として求める。
【０２６９】
具体的には、想定値算出部２９０ａは、例えば以下のＡ）〜Ｃ）の処理を行う。
【０２７０】
Ａ）想定値算出部２９０ａは、被代入変数情報保持部２８０から被代入変数情報を読み込む。
【０２７１】
Ｂ）想定値算出部２９０ａは、被参照変数値保持部２６０ａから被参照変数名、および値の集合を読み込み、値の集合の要素について以下の（α）および（β）の処理を繰り返す。
【０２７２】
（α）想定値算出部２９０ａは、被参照変数に、読み込んだ値を代入し、入力処理命令群保持部２１０が保持する第一処理命令群１４０を実行する。
【０２７３】
（β）想定値算出部２９０ａは、第一処理命令群１４０の実行後の被代入変数の値を参照する。
【０２７４】
Ｃ）想定値算出部２９０ａは、Ｂ）で参照した値の集合および、Ａ）で読み込んだ被代入変数の変数名を想定値情報保持部２９５に格納する。
【０２７５】
より具体的には、（４．１）および（４．２）の具体例に示した処理が行われている場合、想定値算出部２９０ａは、以下の処理を行う。
【０２７６】
Ａ）想定値算出部２９０ａは被代入変数情報「ｉｎｔ  ｐｌａｉｎＤａｔａ」を読み込む。
【０２７７】
Ｂ）想定値算出部２９０ａは集合｛ｅｎｃｒｙｐｔｅｄＤａｔａ｜ｅｎｃｒｙｐｔｅｄＤａｔａ＝ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝を読み込む。
【０２７８】
想定値算出部２９０ａは「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」が「０ｘ００、０ｘ０１、…、０ｘ１Ｆ」の各場合について、以下の（α）および（β）の処理を繰り返す。
【０２７９】
（α）想定値算出部２９０ａは「ｃｏｍｐｒｅｓｓｅｄＤａｔａ」が各値の場合の「ｅｎｃｒｙｐｔｅｄＤａｔａ」の値を算出し、さらに第一処理命令群１４０による処理の結果である「ｅｎｃｒｙｐｔｅｄＤａｔａ＾０ｘ００ＦＦ」を算出する。
【０２８０】
（β）想定値算出部２９０ａは、算出した値を参照する。なお、ｃｏｍｐｒｅｓｓｅｄＤａｔａが「０ｘ００、０ｘ０１、…、０ｘ１Ｆ」の各場合について被代入変数「ｐｌａｉｎＤａｔａ」の値は「０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ」となる。
【０２８１】
Ｃ）想定値算出部２９０ａは、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ｝を想定値情報保持部２９５に格納する。
【０２８２】
なお、上述した処理は、「ｐｌａｉｎＤａｔａ」の値の集合を、列挙により表現する場合の処理である。「ｐｌａｉｎＤａｔａ」の値を集合の表現として記録する場合には、想定値算出部２９０ａは、（α）および（β）の処理を繰り返す代わりに、第一処理命令群１４０の処理「ｅｎｃｒｙｐｅｄＤａｔａ＾０ｘ００ＦＦ」を用いて、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾０ｘ００ＦＦ、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝を格納しても構わない。
【０２８３】
（４．４）想定値情報保持部２９５ａ
想定値情報保持部２９５ａは、想定値情報を記憶する領域を備える。
【０２８４】
具体的には、想定値情報保持部２９５ａは、想定値算出部２９０ａが算出した想定値の集合とその変数名を上述の想定値情報として保持する。
【０２８５】
より具体的には、想定値情報保持部２９５ａは、想定値算出部２９０ａが（４．３）に示した具体例の処理を行っている場合、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ｝を記憶する。ここで、変数名は「ｐｌａｉｎＤａｔａ」であり、その値の集合は、｛ｐｌａｉｎＤａｔａ＝０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ｝である。なお、上述のような値を列挙する形式で想定値を保持するのではなく、集合を示す形で想定値を保持してもよいことは言うまでもない。この場合、想定値情報保持部２９５ａは、｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾０ｘ００ＦＦ、ｃｏｍｐｒｅｓｓｅｄＤａｔａ＝０ｘ００、０ｘ０１、…、０ｘ１Ｆ｝を記憶する。
【０２８６】
（４．５）依存処理命令群生成部２０１ａ
依存処理命令群生成部２０１ａは、想定値情報保持部２９５ａが保持する想定値および入力処理命令群保持部２１０が保持する第二処理命令群１５０に基づき依存処理命令群３３０ａを生成する。
【０２８７】
依存処理命令群３３０ａは、第二処理命令群１５０と同等の処理を行う処理命令群であって、第一処理命令群１４０の処理結果を参照する処理を含み、一部の処理がその参照した値を用いた処理となっている処理命令群である。
【０２８８】
具体的には、例えば、依存処理命令群３３０ａは、以下のＡ）〜Ｆ）の処理を行う。
【０２８９】
Ａ）依存処理命令群生成部２０１ａは、第二処理命令群１５０に含まれる処理命令に含まれる定数を見つける。この定数を含む処理命令をＯｒ１、その定数の値をＶａ１とする。
【０２９０】
Ｂ）依存処理命令群生成部２０１ａは、想定値情報保持部２９５ａが保持する想定値情報を読み込む。
【０２９１】
Ｃ）依存処理命令群生成部２０１ａは、想定値の集合の全ての要素を１つの値Ｖａ２に対応させる写像Ｆを生成する。例えば、被参照変数がｘであり、想定値の集合が｛ｘ｜ｘ＝ｘ＿０、ｘ＿１、…、ｘ＿ｎ｝の時、依存処理命令群生成部２０１ａは、写像Ｆを（ｘ＾ｘ＿０）＊（ｘ＾ｘ＿１）＊…＊（ｘ＾ｘ＿ｎ）とする。ここで、「＊」は乗算を示す。ｘ＝ｘ＿ｔ（ｔ＝０、１、…、ｎの何れか）であるので、写像Ｆを示す式の第ｔ項（ｘ＾ｘ＿ｔ）の値は０となり、第ｔ項以外の項は値が何であっても値０（第ｔ項）との積となるので写像Ｆは０となる。つまり、この例では、Ｖａ２＝（ｘ＾ｘ＿０）＊（ｘ＾ｘ＿１）＊…＊（ｘ＾ｘ＿ｎ）＝０の関係が成り立つ。
【０２９２】
Ｄ）依存処理命令群生成部２０１ａは、Ｖａ３＝Ｖａ２−Ｖａ１を算出する。先述の例では、Ｖａ１＝Ｖａ２−Ｖａ３＝（ｘ＾ｘ＿０）＊（ｘ＾ｘ＿１）＊…＊（ｘ＾ｘ＿ｎ）−Ｖａ３の関係が成り立つ。
【０２９３】
Ｅ）依存処理命令群生成部２０１ａは、処理命令Ｏｒ１に含まれる値Ｖａ１を「写像Ｆの処理−Ｖａ３」に置き換えた処理命令Ｏｒ２を生成する。
【０２９４】
Ｆ）依存処理命令群生成部２０１ａは、第二処理命令群１５０の処理命令Ｏｒ１を処理命令Ｏｒ２に置き換えた命令群である依存処理命令群３３０を生成する。
【０２９５】
より具体的には、想定値情報保持部２９５ａが（４．４）の具体例に示した処理を行っている場合、依存処理命令群生成部２０１ａは、以下のＡ）〜Ｆ）の処理を行う。
【０２９６】
Ａ）依存処理命令群生成部２０１ａは、第二処理命令群１５０に含まれる処理命令に含まれる定数を見つける。つまり、依存処理命令群生成部２０１ａは、この定数を含む処理命令Ｏｒ１を「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜０ｘ０００１；」とし、その定数の値Ｖａ１を「０ｘ０００１」とする。
【０２９７】
Ｂ）依存処理命令群生成部２０１は、想定値情報保持部２９５から想定値情報｛ｐｌａｉｎＤａｔａ｜ｐｌａｉｎＤａｔａ＝０ｘ００ＦＦ、０ｘ０１ＦＦ、…、０ｘ１ＦＦＦ｝を読み込む。
【０２９８】
Ｃ）依存処理命令群生成部２０１ａは、想定値の集合の全ての要素を１つの値Ｖａ２「０」に対応させる写像Ｆ「（ｐｌａｉｎＤａｔａ＾０ｘ００ＦＦ）＊（ｐｌａｉｎＤａｔａ＾０ｘ０１ＦＦ）＊…＊（ｐｌａｉｎＤａｔａ＾０ｘ１１ＦＦ）」を生成する。
【０２９９】
Ｄ）依存処理命令群生成部２０１ａは、Ｖａ３＝Ｖａ２−Ｖａ１を算出する。すなわち「Ｖａ３＝０−０ｘ０００１＝−１＝０ｘＦＦＦＦ」を算出する。
【０３００】
Ｅ）依存処理命令群生成部２０１ａは、処理命令Ｏｒ１に含まれる値Ｖａ１「０ｘ０００１」を、「写像Ｆの処理−Ｖａ３」すなわち「（ｐｌａｉｎＤａｔａ＾０ｘ００ＦＦ）＊（ｐｌａｉｎＤａｔａ＾０ｘ０１ＦＦ）＊…＊（ｐｌａｉｎＤａｔａ＾０ｘ１１ＦＦ）−０ｘＦＦＦＦ」に置き換えた処理命令Ｏｒ２を生成する。
【０３０１】
すなわち、処理命令Ｏｒ２「ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（（ｐｌａｉｎＤａｔａ＾０ｘ００ＦＦ）＊（ｐｌａｉｎＤａｔａ＾０ｘ０１ＦＦ）＊…＊（ｐｌａｉｎＤａｔａ＾０ｘ１１ＦＦ））−０ｘＦＦＦＦ）；」を生成する。
【０３０２】
Ｆ）依存処理命令群生成部２０１は、第二処理命令群１５０の処理命令Ｏｒ１を処理命令Ｏｒ２に置き換えた命令群である依存処理命令群３３０ａを生成する。
【０３０３】
すなわち、「  ｆｏｒ（ｃｏｕｎｔｅｒ＝０；ｃｏｕｎｔｅｒ＜ｃｏｍｐｒｅｓｓｅｄＤａｔａ；ｃｏｕｎｔｅｒ）｛ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＝（ｄｅｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜１）｜（（ｐｌａｉｎＤａｔａ＾０ｘ００ＦＦ）＊（ｐｌａｉｎＤａｔａ＾０ｘ０１ＦＦ）＊…＊（ｐｌａｉｎＤａｔａ＾０ｘ１１ＦＦ））−０ｘＦＦＦＦ）；｝」が生成される。
【０３０４】
ここでは、更に、Ｃ言語の言語形式にしたがって関数宣言や変数宣言を追加する。
【０３０５】
なお、Ｃ）では想定値の集合の全ての要素を１つの値に対応させる写像Ｆの一例を示したが、他の写像であっても構わない。また、写像Ｆを予めいくつか登録できるようにして、その中から選択する構成であっても構わない。また、写像Ｆをユーザが指定する構成であっても構わない。この場合も、実施の形態１と同様、同じ写像を使って何度も難読化が行われる場合に有用である。
【０３０６】
また、上記で説明した写像Ｆとは異なる他の写像の具体例としては、例えば図９の依存処理命令群３３０ａ中の「（ｃｏｍｐｒｅｓｓｅｄＤａｔａ＜＜８）＾ｐｌａｉｎＤａｔａ＾０ｘ００ＦＥ」がある。このような写像であっても正しい値「０ｘ０００１」が得られることは、上述したとおりである。
【０３０７】
（変形例７）
改竄防止処理生成装置１１０は、複数の処理命令群の入力を受け付け、その中から第一処理命令群１４０と第二処理命令群１５０を選択してもよい。例えば、改竄防止処理生成装置１１０は、処理命令群Ａ１、処理命令群Ａ２、…、処理命令群Ａｎを取得し、その中からランダムに第一処理命令群１４０と第二処理命令群１５０の組を選択し難読化を行っても構わない。さらに、処理を行う対象は１組だけに限るものではなく、選択と難読化を繰り返しても構わない。
【０３０８】
また、例えば、改竄防止処理生成装置１１０は、第一処理命令群１４０を処理命令群Ａ１とし、第二処理命令群１５０を処理命令群Ａ１以外の処理命令群からランダムに選択して難読化を行い、以下、処理命令群Ａ２、…、Ａｎについてもそれぞれを第一処理命令群１４０とし、その第一処理命令群１４０とされた処理命令群以外の処理命令群から第二処理命令群１５０を選択して難読化してもよい。
【０３０９】
以上のような構成を用いれば、処理命令群Ａ１〜Ａｎは複雑に絡みあうので、さらに改竄を困難にすることが出来る。
【０３１０】
また、本発明の応用例として、改竄防止処理生成装置１１０と同等の構成を一部として含み、プログラムの実行時に改竄防止処理生成装置１１０による変換を行った上でプログラムを実行する実行処理装置を実装することも考えられる。この場合、その実行処理装置に本変形例と同様の構成を持たせると、どの処理命令群が第一処理命令群および第二処理命令群であるのかを特定することが困難になるため、より解析を困難にすることができる。
【０３１１】
（変形例８）
ここでは、第一処理命令１４０に含まれる命令を保護対象とし、その命令に対する改竄を防止する場合について説明した。しかし、改竄を防止すべき対象は命令に限るものではなく、データであってもよい。実施の形態１のように、命令群を保護する場合は、その命令群へ分岐する処理を追加していたが、保護対象がデータである場合には、そのデータを所定の変数等に読み込む処理を追加する。例えば、第一処理命令群１４０が使用するデータを保護対象とする場合であれば、分岐処理命令群３２０の替わりに、保護対象データを読み込む処理を追加し、依存処理命令群３３０は、その変数に依存し、変数に格納されている値が想定値（ここでは、改竄のないデータ）である場合に正しく動作する構成とすることが考えられる。
【０３１２】
このような構成を用いれば、分岐処理命令群３２０によって第一処理命令群１４０が実行される替わりに、保護対象データが変数に読み込まれる。そして、保護対象データに改竄があれば、変数に読み込まれる値が変化することにより、依存処理命令群３３０が第二処理命令群１５０と異なる動作をするようになる。したがって、実施の形態１における第一処理命令群１４０に対する保護と同様にして、保護対象データを保護することができる。なお、保護対象データは、例えば、携帯電話における電話番号等の機器固有番号である。
【０３１３】
（実施の形態２）
本発明に関わる実施の形態２としての処理システム１００ｂについて説明する。
【０３１４】
図１１は、実施の形態２における処理システム１００ｂの構成を示す図である。
【０３１５】
本実施の形態における処理システム１００ｂは、第一処理命令群１４０ｂの入力を受け付けて、第一処理命令群１４０ｂの改竄チェックを目的とした出力処理命令群１６０ｂを生成するシステムであって、改竄防止処理生成装置１１０ｂ（命令生成装置）と、実行処理装置１３０ｂとを備える。
【０３１６】
改竄防止処理生成装置１１０ｂは、保護対象コードを確実に保護し得るプログラムを生成する装置である。つまり、改竄防止処理生成装置１１０ｂは、保護対象コードである第一処理命令群１４０ｂを取得して、その保護対象コードの改竄チェック処理を行う出力処理命令群１６０ｂを生成する。また、改竄防止処理生成装置１１０ｂは、その生成された出力処理命令群１６０ｂと第一処理命令群１４０ｂとを記録媒体１２０ｂに書き込む。
【０３１７】
実行処理装置１３０ｂは、記録媒体１２０ｂに記録されている第一処理命令群１４０ｂおよび出力処理命令群１６０ｂを読み出して実行する。
【０３１８】
なお、改竄防止処理生成装置１１０ｂは、第一処理命令群１４０ｂおよび出力処理命令群１６０ｂを記録媒体１２０ｂに書き込むことなく、通信媒体を介して実行処理装置１３０ｂに送信してもよい。
【０３１９】
出力処理命令群１６０ｂは、処理の途中で第一処理命令群１４０ｂを呼び出す構成となっている。すなわち、実行処理装置１３０ｂで出力処理命令群１６０ｂが実行される場合、最初は出力処理命令群１６０ｂに含まれる命令群が実行され、途中で第一処理命令群１４０ｂが呼び出されて実行され、次にまた出力処理命令群１６０ｂの続きの処理命令群が実行される。
【０３２０】
第一処理命令群１４０ｂは、実行処理装置１３０ｂで実行される処理命令群であって、出力処理命令群１６０ｂの処理の途中に実行される場合もあれば、それとは別に実行される場合もある。
【０３２１】
具体的には、例えば、第一処理命令群１４０ｂは、コンテンツの暗号化された再生可能回数を入力とし、これを復号し、平文の再生可能回数を出力する処理である。出力処理命令群１６０ｂは第一処理命令群１４０ｂが改竄されていないかをチェックし、改竄されていない場合、０を返し、改竄されていた場合、実行処理装置１３０ｂで実行中の処理を停止する処理命令群である。
【０３２２】
以下、それぞれについて詳細な説明を行う。
【０３２３】
（１）出力処理命令群１６０ｂの構成
図１２は、出力処理命令群１６０ｂの構成を示す図である。
【０３２４】
出力処理命令群１６０ｂは、第一処理命令群１４０ｂを実行する際に必要となる各種パラメータに値を設定する被参照変数値代入処理命令群３１０ｂと、第一処理命令群１４０ｂを呼び出す分岐処理命令群３２０ｂと、第一処理命令群１４０ｂを呼び出した後に実行される依存処理命令群３３０ｂとからなる。実行処理装置１３０ｂで出力処理命令群１６０ｂが実行される場合、被参照変数値代入処理命令群３１０ｂ、分岐処理命令群３２０ｂ、第一処理命令群１４０ｂ、依存処理命令群３３０ｂの順に各処理命令群の処理が実行される。
【０３２５】
以下、それぞれを説明する。
【０３２６】
（１．１）被参照変数値代入処理命令群３１０ｂ
実施の形態１における被参照変数値代入処理命令群３１０と同様である。
【０３２７】
（１．２）分岐処理命令群３２０ｂ
実施の形態１における分岐処理命令群３２０と同様である。
【０３２８】
（１．３）依存処理命令群３３０ｂ
依存処理命令群３３０ｂは、第一処理命令群１４０ｂを呼び出した後に実行される処理命令群であり、第一処理命令群１４０ｂの処理結果に基づき改竄をチェックする処理を行う。
【０３２９】
第一処理命令群１４０ｂの処理結果とは、具体的には、例えば、第一処理命令群１４０ｂが関数である場合には関数の戻り値である。また、例えば、第一処理命令群１４０ｂが外部変数に値を決定する命令群であるならば、第一処理命令群１４０ｂの処理結果とは、外部変数に代入された値である。また、例えば、第一処理命令群１４０ｂがスタックに値を格納する命令群であれば、第一処理命令群１４０ｂの処理結果とは、スタックに格納された値である。また、例えば、第一処理命令群１４０ｂがアドレス変数で指定した位置に値を格納する命令群であれば、第一処理命令群１４０ｂの処理結果とは、その格納された値である。これらの第一処理命令群１４０ｂの処理結果が格納される格納先のことを、実施の形態１と同様に、被代入変数と呼ぶものとする。
【０３３０】
第一処理命令群１４０ｂの処理結果を予め知ることは一般には出来ないが、第一処理命令群１４０ｂを実行する際に必要となる各種パラメータの値が被参照変数値代入処理命令群３１０ｂで設定した値である時に限っては、処理結果の値を予め知ることができる。具体的には、例えば、被参照変数値代入処理命令群３１０ｂが設定する値を実際に被参照変数に設定した上で、第一処理命令群１４０ｂを実行すれば、処理結果の値を知ることができる。以降の説明では、実施の形態１と同様に、この値を想定値と呼ぶものとする。
【０３３１】
（１．４）出力処理命令群１６０ｂの一例
図１３は、Ｃ言語で記述された出力処理命令群１６０ｂの具体例を示す図である。
【０３３２】
出力処理命令群１６０ｂは、図５Ａの第一処理命令群１４０と同等の処理命令群を第一処理命令群１４０ｂとした時の出力処理命令群であり、第一処理命令群１４０ｂの改竄チェックを行う処理命令群である。
【０３３３】
被参照変数値代入処理命令群３１０ｂ「ｅｎｃｒｙｐｔｅｄＤａｔａ＝０ｘＦ０２２；」は、第一処理命令群１４０ｂを呼び出す際の引数に値を代入する処理を示す命令群である。すなわち、被参照変数値代入処理命令群３１０ｂは変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に値「０ｘＦ０２２」を代入する。
【０３３４】
分岐処理命令群３２０ｂ「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）；」は、引数を変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」として第一処理命令群１４０ｂを呼び出す処理を示す命令群であり、処理結果を変数「ｐｌａｉｎＤａｔａ」に格納する。実行処理装置１３０ｂにおいて、分岐処理命令群３２０ｂが正常に実行された場合の戻り値の想定値は、変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」を値「０ｘＦ０２２」とし、第一処理命令群１４０ｂの処理を行った際の結果である「０ｘＦ０２２＾０ｘ００ＦＦ＝０ｘＦ０ＤＤ」となる。
【０３３５】
依存処理命令群３３０ｂは、第一処理命令群１４０ｂの処理結果が、想定値と等しいかを判定し、等しい場合は０を返し、等しくない場合は実行処理装置１３０ｂで実行中の処理を停止する処理命令群であって、「  ｉｆ（ｐｌａｉｎＤａｔａ！＝０ｘＦ０ＤＤ）｛ｅｘｉｔ（１）；｝ｒｅｔｕｒｎ０；」により表される。
【０３３６】
上記の処理において、第一処理命令群１４０ｂが改竄されている場合、第一処理命令群１４０ｂの処理結果は想定値と異なる値となる。
【０３３７】
（１．５）出力処理命令群１６０ｂの効果
実施の形態２の出力処理命令群１６０ｂは、第一処理命令群１４０ｂを実行する際に必要となる各種パラメータに値を設定する被参照変数値代入処理命令群３１０ｂと、第一処理命令群１４０ｂを呼び出す分岐処理命令群３２０ｂと、第一処理命令群１４０ｂを呼び出した後に実行される依存処理命令群３３０ｂとからなる。
【０３３８】
このような構成を用いれば、第一処理命令群１４０ｂの処理命令が改竄されている場合、第一処理命令群１４０ｂの処理結果が想定値と等しいかを判定することにより、第一処理命令群１４０ｂの改竄を検出することができる。
【０３３９】
従来のハッシュチェックによる改竄チェックは、プログラムをデータとして読み込む必要があった。ところが、通常のプログラムは実行対象として読み込まれることはあっても、データとして読み込まれることは少なく、また読み込みに使用する命令も特殊なものである。よって、不正解析者は、命令を監視し、プログラムをデータとして読み込む命令が実行された場合、その読み込みを行っている処理は改竄チェック処理命令群の一部であり、読み込まれている処理は改竄防止対象となる重要な処理である可能性が高いと判断することができた。しかし、本実施の形態の方法では、プログラムをデータとしてアクセスすることなくプログラムの改竄を検出することが出来る。また、プログラムをデータとしてアクセスすることを禁止している言語でも改竄チェックを行うことができる。
【０３４０】
（２）改竄防止処理生成装置１１０ｂの構成
図１４は、改竄防止処理生成装置１１０ｂの構成を示す図である。ここで、改竄防止処理生成装置１１０ｂは、第一処理命令群１４０ｂの改竄チェックを行う出力処理命令群１６０ｂを生成する装置である。
【０３４１】
改竄防止処理生成装置１１０ｂは、入力処理命令群保持部２１０ｂ、被参照変数解析部２２０ｂ、被参照変数情報保持部２３０ｂ、被参照変数値代入処理命令群生成部２４０ｂ、被参照変数値代入処理命令群保持部２５０ｂ、被参照変数値保持部２６０ｂ、被代入変数解析部２７０ｂ、被代入変数情報保持部２８０ｂ、想定値情報保持部２９５ｂ、想定値算出部２９０ｂ、依存処理命令群生成部２０１ｂ、依存処理命令群保持部２０２ｂ、分岐処理命令群生成部２０３ｂ、分岐処理命令群保持部２０４ｂ、出力処理命令群生成部２０５ｂ、および出力処理命令群保持部２０６ｂを備えている。
【０３４２】
入力処理命令群保持部２１０ｂは、第一処理命令群１４０ｂを取得して保持する。
【０３４３】
被参照変数解析部２２０ｂは、第一処理命令群１４０ｂを実行する際に値を設定しておく必要のある引数等の変数（被参照変数）が何であるかを解析する。
【０３４４】
被参照変数情報保持部２３０ｂは、被参照変数解析部２２０ｂによる解析によって得られた被参照変数の変数名等の情報を保持する。
【０３４５】
被参照変数値代入処理命令群生成部２４０ｂは、被参照変数に値を代入する被参照変数値代入処理命令群３１０ｂを生成する。
【０３４６】
被参照変数値代入処理命令群保持部２５０ｂは、被参照変数値代入処理命令群生成部２４０ｂが生成した被参照変数値代入処理命令群３１０ｂを保持する。
【０３４７】
被参照変数値保持部２６０ｂは、被参照変数値代入処理命令群３１０ｂが被参照変数に代入する値を保持する。
【０３４８】
被代入変数解析部２７０ｂは、第一処理命令群１４０ｂの処理結果が代入される変数（被代入変数）が何であるかを解析する。
【０３４９】
被代入変数情報保持部２８０ｂは、被代入変数解析部２７０ｂによる解析によって得られた被代入変数の変数名等の情報を保持する。
【０３５０】
想定値算出部２９０ｂは、被参照変数の値を被参照変数値保持部２６０ｂが保持する値とし、第一処理命令群１４０ｂを実行した際に得られる被代入変数の想定値を算出する。
【０３５１】
想定値情報保持部２９５ｂは、想定値算出部２９０ｂが算出した想定値を保持する。
【０３５２】
依存処理命令群生成部２０１ｂは、想定値に基づき依存処理命令群３３０ｂを生成する。
【０３５３】
依存処理命令群保持部２０２ｂは、依存処理命令群生成部２０１ｂが生成した依存処理命令群３３０ｂを保持する。
【０３５４】
分岐処理命令群生成部２０３ｂは、入力処理命令群保持部２１０ｂが保持する第一処理命令群１４０ｂを呼び出す分岐処理命令群３２０ｂを生成する。
【０３５５】
分岐処理命令群保持部２０４ｂは、分岐処理命令群生成部２０３ｂが生成した分岐処理命令群３２０ｂを保持する。
【０３５６】
出力処理命令群生成部２０５ｂは、被参照変数値代入処理命令群保持部２５０ｂが保持する被参照変数値代入処理命令群３１０ｂと、分岐処理命令群保持部２０４ｂが保持する分岐処理命令群３２０ｂと、依存処理命令群保持部２０２ｂが保持する依存処理命令群３３０ｂとからなる出力処理命令群１６０ｂを生成する。
【０３５７】
出力処理命令群保持部２０６ｂは、出力処理命令群生成部２０５ｂが生成した出力処理命令群１６０ｂを保持する。
【０３５８】
以下、実施の形態１と異なる入力処理命令群保持部２１０ｂ、および依存処理命令群生成部２０１ｂについて説明する。他の部は、実施の形態１記載の対応する部と同等の処理を行うので、説明を省略する。
【０３５９】
（２．１）入力処理命令群保持部２１０ｂ
入力処理命令群保持部２１０ｂは、外部から第一処理命令群１４０ｂの入力を受け付ける。つまり、入力処理命令群保持部２１０ｂは、第一処理命令群１４０ｂを取得する。また、入力処理命令群保持部２１０ｂは、１以上の処理命令群を記憶する領域を備えている。入力処理命令群保持部２１０ｂは、改竄防止処理生成装置１１０ｂに入力された第一処理命令群１４０ｂを保持する。
【０３６０】
（２．２）依存処理命令群生成部２０１ｂ
依存処理命令群生成部２０１ｂは、想定値情報保持部２９５ｂが保持する想定値に基づき依存処理命令群３３０ｂを生成する。
【０３６１】
具体的には、例えば、依存処理命令群生成部２０１ｂは、以下のＡ）〜Ｄ）の処理を行う。
【０３６２】
Ａ）依存処理命令群生成部２０１ｂは、想定値情報保持部２９５ｂが保持する想定値情報を読み込む。
【０３６３】
Ｂ）依存処理命令群生成部２０１ｂは、その想定値を保持すべき変数（被代入変数）をＶｒ１、その想定値をＶａ１とする。
【０３６４】
Ｃ）依存処理命令群生成部２０１ｂは、変数Ｖｒ１と想定値Ｖａ１を比較し、等しい場合は０を返し、等しくない場合は実行処理装置１３０ｂで実行中の処理を停止する処理命令群を生成する。なお、ここでは一般的なプログラミングの作法にしたがって、検証結果が正しい場合（ここでは改竄がないことが確認された場合）には０を返すとしているが、これに限るものではない。０以外の値を返すとしてもよいし、何も値を返さないとしてもよい。すなわち、改竄がないことが確認された場合に、実行中の処理が継続される限り、返す値はどのようなものであっても構わない。
【０３６５】
Ｄ）依存処理命令群生成部２０１ｂは、生成した依存処理命令群３３０ｂを依存処理命令群保持部２０２ｂに格納する。
【０３６６】
より具体的には、想定値情報保持部２９５ｂが実施の形態１の（２．１０）と同様の処理を行っている場合、依存処理命令群生成部２０１ｂは、以下のＡ）〜Ｄ）の処理を行う。
【０３６７】
Ａ）依存処理命令群生成部２０１ｂは、想定値情報保持部２９５ｂが保持する想定値情報「ｉｎｔ  ｐｌａｉｎＤａｔａ＝０ｘＦ０ＤＤ」を読み込む。
【０３６８】
Ｂ）依存処理命令群生成部２０１ｂは、その想定値を保持すべき変数「ｐｌａｉｎＤａｔａ」をＶｒ１とし、その想定値「０ｘＦ０ＤＤ」をＶａ１とする。
【０３６９】
Ｃ）依存処理命令群生成部２０１ｂは、変数Ｖｒ１と想定値Ｖａ１を比較し、等しい場合は０を返し、等しくない場合は実行処理装置１３０ｂで実行中の処理を停止する処理命令群「  ｉｆ（ｐｌａｉｎＤａｔａ！＝０ｘＦ０ＤＤ）｛ｅｘｉｔ（１）；｝ｒｅｔｕｒｎ０；」を生成する。
【０３７０】
Ｄ）依存処理命令群生成部２０１ｂは、生成した依存処理命令群３３０ｂを依存処理命令群保持部２０２ｂに格納する。
【０３７１】
（２．３）改竄防止処理生成装置１１０ｂの効果
改竄防止処理生成装置１１０ｂは、プログラムをデータとして読み込むことなくプログラムの改竄をチェックできる改竄チェック処理命令群（出力処理命令群１６０ｂ）を生成することが出来る。
【０３７２】
図１５は、改竄防止処理生成装置１１０ｂの効果を説明するための説明図である。
【０３７３】
改竄防止処理生成装置１１０は、例えば、第一処理命令群１４０ｂを含む入力プログラム１０１ｂを取得して、その入力プログラム１０１ｂを改竄防止プログラム１０２ｂに変換して出力する。このとき、改竄防止処理生成装置１１０は、上述のように、出力処理命令群１６０ｂを生成して入力プログラム１０１ｂに追加している。
【０３７４】
つまり、改竄防止処理生成装置１１０は、保護対象コードである第一処理命令群１４０ｂの呼出処理（被参照変数値代入処理命令群３１０ｂおよび分岐処理命令群３２０ｂ）と、呼出処理によって行われた第一処理命令群１４０ｂの処理結果が想定値と異なるときに実行処理装置１３０ｂによって実行されている処理を中止させる判定／終了処理（依存処理命令群３３０ｂ）とを、改竄防止処理として生成し、入力プログラム１０１ｂに追加している。
【０３７５】
保護対象コード（第一処理命令群１４０）の呼出処理では、被参照変数値代入処理命令群３１０ｂにおいて、保護対象コードの被参照変数「ｅｎｃｒｙｐｔｅｄＤａｔａ」に値「０ｘ００２２」が代入された状態で、保護対象コードが呼び出される。
【０３７６】
その結果、改竄防止プログラム１０２ｂでは、従来のように保護対象コードがデータとして読み込まれることがないため、不正解析者によって改竄防止処理が見つけられるのを困難にすることができる。
【０３７７】
さらに、判定／終了処理では、依存処理命令群３３０ｂの「ｉｆ（ｐｌａｉｎＤａｔａ！＝０ｘＦ０ＤＤ）｛ｅｘｉｔ（１）；｝ｒｅｔｕｒｎ０；」が、上述の呼出処理によって保護対象コードが呼び出されて実行された結果（第一処理命令群１４０ｂの処理結果）である「ｐｌａｉｎＤａｔａ」の値に依存している。つまり、保護対象コードが改竄されていなければ、「ｐｌａｉｎＤａｔａ」の値は想定値「０ｘＦ０ＤＤ」となるため、改竄防止プログラム１０２ｂの出力処理命令群１６０が実行されると、改竄防止プログラム１０２ｂにおける入力プログラム１０１ｂと同等の処理が実行処理装置１３０ｂにより正しく実行される。
【０３７８】
一方、保護対象コードが改竄されていれば、「ｐｌａｉｎＤａｔａ」の値は想定値「０ｘＦ０ＤＤ」と異なるため、実行処理装置１３０ｂによって実行されている、改竄防止プログラム１０２ｂにおける入力プログラム１０１ｂと同等の処理が中止されることとなる。
【０３７９】
このように、本実施の形態における改竄防止処理生成装置１１０ｂは、入力プログラム１０１ｂに対して保護対象コードの呼出処理および判定／終了処理を生成して追加することにより、保護対象コードに対する改竄を確実に防止することができる。また、本実施の形態における改竄防止処理生成装置１１０ｂは、実行中にメモリ上にあるコードをデータとして読み込むことができないＪａｖａ（登録商標）等の言語で記述されたプログラムに対しても、そのプログラムの保護対象コードに対する改竄を確実に防止することができる。
【０３８０】
（実施の形態３）
本発明に関わる実施の形態３の処理システム１３００について説明する。実施の形態３に係る処理システム１３００は、１つの入力プログラム中に含まれる第一処理命令群（後述するＡ命令群に対応）と第二処理命令群（後述するＢ命令群とＳＵＣ＿Ｂ命令群に対応）とを用いて、その入力プログラムの難読化を行う。また、実施の形態１および２では、第一処理命令群の処理結果を第二処理命令群でも用いるように難読化していたが、実施の形態３では、Ａ命令群（第一処理命令群）の処理結果をＳＵＣ＿Ｂ命令群（第二処理命令群）では用いない。つまり、実施の形態３では、第二処理命令群の処理途中で本来不要な処理である第一処理命令群に分岐し、その後第二処理命令群の続きを行わせることで、制御構造の複雑化を図っている。
【０３８１】
実施の形態３では、このような入力プログラムの難読化（制御構造の複雑化）を図ることにより、保護対象コードであるＡ命令群（第一処理命令群）を改竄から確実に保護することができる。
【０３８２】
従来、プログラムの処理の流れを困難にし、不正な解析を防止する技術として、非特許文献１（Ｃｈｅｎｘｉ  Ｗａｎｇ、“Ａ  Ｓｅｃｕｒｉｔｙ  Ａｒｃｈｉｔｅｃｔｕｒｅ  ｆｏｒ  Ｓｕｒｖｉｖａｂｉｌｉｔｙ  Ｍｅｃｈａｎｉｓｍｓ”、  Ｐｈ．Ｄ．  Ｄｉｓｓｅｒｔａｔｉｏｎ  （２０００））に記載の技術のような単純な無条件分岐命令を分岐先が分かり難い条件分岐命令に置換える方法や、プログラムを複数の命令群に分割して命令群の配置順序を入替える方法が知られている。不正な解析の結果は、その後の不正な改竄の際に手掛かりとなるため、解析の時点で不正行為を防止できるようにことは有用である。しかし、上述したような方法で難読化を行ったとしても、実際にプログラムを動かすことで命令群の実行順序や前後関係（例えば、ＰＲＥ＿Ａ命令群の次にＡ命令群が実行されるという関係）を知ることは出来てしまう。そこで、実施の形態３では、プログラムを実際に動かした時にも命令群の実行順序等が分からないように制御構造を難読化する。
【０３８３】
以下、実施の形態３の処理システム１３００を説明する。
【０３８４】
図１６は、実施の形態３における処理システム１３００の構成を示す図である。
【０３８５】
本実施の形態における処理システム１３００は、改竄防止処理生成装置（命令生成装置）１３２０と、実行処理装置１３４０とを備える。
【０３８６】
改竄防止処理生成装置１３２０は、保護対象コードを確実に保護し得るプログラムを生成する装置であって、保護対象コードを含む入力プログラム１３１０を取得してその入力プログラム１３１０を難読化することにより、改竄防止プログラム１３３０を生成する。
【０３８７】
また、改竄防止処理生成装置１３２０は、その生成された改竄防止プログラム１３３０を記録媒体１３５０に書き込む。
【０３８８】
実行処理装置１３４０は、記録媒体１３５０に記録されている改竄防止プログラム１３３０を読み出して実行する。
【０３８９】
なお、改竄防止処理生成装置１３２０は、改竄防止プログラム１３３０を記録媒体１３５０に書き込むことなく、通信媒体を介して実行処理装置１３４０に送信してもよい。
【０３９０】
ここで、入力プログラム１３１０は、以降に述べるように、一つ以上の命令からなるＰＲＥ＿Ａ命令群と、ＰＲＥ＿Ａ命令群の後に実行されるＡ命令群と、Ｂ命令群とを含む。
【０３９１】
（１）入力プログラム１３１０の構成
図１７は、入力プログラム１３１０の構成を示す図である。
【０３９２】
入力プログラム１３１０は、Ａ命令群１４２０と、Ａ命令群１４２０の分岐元の命令群であるＰＲＥ＿Ａ命令群１４１０と、Ａ命令群１４２０の分岐先の命令群であるＳＵＣ＿Ａ命令群１４３０と、Ｂ命令群１４４０と、Ｂ命令群１４４０の分岐先の命令群であるＳＵＣ＿Ｂ命令群１４５０とを含んでいる。
【０３９３】
ここで、各命令群は０以上の命令からなる命令の集合である。すなわち、一部の命令群については、存在していなくとも良い。例えば、Ａ命令群１４２０がプログラムの先頭である場合には、ＰＲＥ＿Ａ命令群１４１０は存在しなくともよい。また、Ａ命令群１４２０やＢ命令群１４４０が、プログラムの最後である場合には、ＳＵＣ＿Ａ命令群１４３０やＳＵＣ＿Ｂ命令群１４５０は存在しなくともよい。
【０３９４】
また、ここで、Ｙ命令群がＸ命令群の分岐先であるとは、Ｘ命令群の後にＹ命令群が実行されることを意味する。具体的には、例えば、Ｘ命令群の直後にＹ命令群が配置されている場合や、Ｘ命令群にＹ命令群への分岐命令が含まれる場合などがある。なお、Ｘ命令群の直後に明示的な分岐命令が存在していなくとも、プログラムの記法上、Ｘ命令群の後にＹ命令群が実行される場合も、本実施の形態では分岐と呼ぶ。例えばＣ言語では、特に分岐命令等がない場合、プログラム中の命令は上から順に実行される。この場合、Ｘ命令群の下にＹ命令群が記述されていれば、Ｘ命令群の後にＹ命令群が実行されるので、Ｙ命令群はＸ命令群の分岐先である。また、Ｘ命令群がＹ命令群の分岐元であるとは、Ｙ命令群がＸ命令群の分岐先であることを意味する。
【０３９５】
なお、分岐命令とは、具体的には、条件分岐命令や、無条件分岐命令、サブルーチンコール、例外を発生させる命令、割込みを発生させる命令などを含む。すなわち、ある命令群から別の命令群へ実行を移すような命令はいずれも本明細書で述べる分岐命令に当たる。例えば、アセンブリ言語の命令であれば、「ＣＡＬＬ、ＲＥＴ」のような関数コールや「ＪＡ、ＪＭＰ、ＬＯＯＰ」などのジャンプ命令、「ＩＮＴ」などの割り込み命令である。
【０３９６】
図１８は、Ｃ言語における入力プログラム１３１０の具体的な一例を示す図である。
【０３９７】
入力プログラム１３１０は、ＰＲＥ＿Ａ命令群１４１０と、Ａ命令群１４２０と、ＳＵＣ＿Ａ命令群１４３０と、Ｂ命令群１４４０と、ＳＵＣ＿Ｂ命令群１４５０とを含む。
【０３９８】
（２）改竄防止プログラム１３３０の構成
改竄防止プログラム１３３０は、入力プログラム１３１０が改竄防止処理生成装置１３２０によって難読化されたプログラムである。
【０３９９】
図１９は、改竄防止プログラム１３３０の構成を示す図である。
【０４００】
改竄防止プログラム１３３０は、ＰＲＥ＿Ａ命令群１４１０と、ＳＴＲ＿Ａ変数群値代入命令群１６２０と、Ａ命令群１４２０と、ＣＢＲ＿ＡＢ条件分岐命令群１６１０と、ＳＵＣ＿Ａ命令群１４３０と、Ｂ命令群１４４０と、ＳＴＲ＿Ｂ変数群値代入命令群１６３０と、退避命令群１６４０と、ＢＲ＿Ｂ分岐命令群１６６０と、復帰命令群１６５０と、ＳＵＣ＿Ｂ命令群１４５０とを含んでいる。
【０４０１】
入力プログラム１３１０では、Ａ命令群１４２０が実行されるのはＰＲＥ＿Ａ命令群１４１０が実行された後だけであったが、改竄防止プログラム１３３０は、Ｂ命令群１４４０の後にもＡ命令群１４２０が実行されるように変換されている。より具体的に述べると、改竄防止プログラム１３３０では、ＰＲＥ＿Ａ命令群１４１０、Ａ命令群１４２０、ＳＵＣ＿Ａ命令群１４３０の順に各命令群の処理が実行される場合もあれば、Ｂ命令群１４４０、Ａ命令群１４２０、ＳＵＣ＿Ｂ命令群１４５０の順で各命令群の処理が実行される場合もある。すなわち、Ｂ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０の間にＡ命令群１４２０の実行が割り込む場合がある。
【０４０２】
図２０は、Ｃ言語で表した改竄防止プログラム１３３０の具体的な一例を示す図である。
【０４０３】
改竄防止プログラム１３３０は、入力プログラム１３１０に含まれる各要素に加え、以下の要素を含む。これらの要素は、改竄防止処理生成装置１３２０により、入力プログラム１３１０に付け加えられるが、この付け加える処理の詳細については後述する。
【０４０４】
ＢＲ＿Ｂ分岐命令群１６６０は、Ｂ命令群１４４０の後に、Ａ命令群１４２０を実行させるための分岐命令である。
【０４０５】
ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、Ａ命令群１４２０の実行後、適切な分岐先を判定してその分岐先に処理を分岐させるための命令群である。入力プログラム１３１０では、Ａ命令群１４２０の後に実行される命令群は常にＳＵＣ＿Ａ命令群１４３０であったが、改竄防止プログラム１３３０においては、ＳＵＣ＿Ａ命令群１４３０の場合と、ＳＵＣ＿Ｂ命令群１４５０の場合とがある。ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、Ａ命令群１４２０の実行後、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０のどちらに分岐すべきかを判定して、適切な分岐先に処理を分岐させる。
【０４０６】
ＳＴＲ＿Ａ変数群値代入命令群１６２０、およびＳＴＲ＿Ｂ変数群値代入命令群１６３０は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０の判定に用いる情報（本実施の形態では、後述する変数「ｖａｒ＿ａｂ０」の値）をセットする命令群である。改竄防止プログラム１３３０では、Ａ命令群１４２０がＰＲＥ＿Ａ命令群１４１０の後に実行されているならば、次に実行されるべき命令群はＳＵＣ＿Ａ命令群１４３０であり、Ａ命令群１４２０がＢ命令群１４４０の後に実行されているならば、次に実行されるべき命令群はＳＵＣ＿Ｂ命令群１４５０である。そのどちらであるのかがわかるように、すなわち、ＰＲＥ＿Ａ命令群１４１０が行われた後なのか、Ｂ命令群１４４０が行われた後なのかがわかるように、判定の手掛かりを残す命令群が、ＳＴＲ＿Ａ変数群値代入命令群１６２０およびＳＴＲ＿Ｂ変数群値代入命令群１６３０である。
【０４０７】
退避命令群１６４０は、既に実行された処理結果がその後に実行される処理によって影響されないように、その既に実行された処理結果を退避する命令群である。また、復帰命令群１６５０は、その退避された処理結果を復帰させる命令群である。
【０４０８】
改竄防止プログラム１３３０では、Ｂ命令群１４４０の実行とＳＵＣ＿Ｂ命令群１４５０の実行と間にＡ命令群１４２０の実行が割り込む。そのため、Ｂ命令群１４４０が終った時点での処理の途中結果を、Ａ命令群の処理によって影響されないように退避しておく必要がある。この退避処理を行う命令群が退避命令群１６４０である。
【０４０９】
また、復帰命令群１６５０は、退避命令群１６４０が退避した途中結果の内容を、ＳＵＣ＿Ｂ命令群１４５０に戻った時点で戻す。
【０４１０】
以下、各命令群について、図１９、図２０を用いてより詳細に説明する。
【０４１１】
（２．１）退避命令群１６４０
Ｂ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０との間に割り込むＡ命令群１４２０の処理によって、ＳＵＣ＿Ｂ命令群１４５０およびその後で実行される命令群の処理に影響が及ばないように、途中結果を退避しておく処理を行う命令群が退避命令群１６４０である。具体的には、退避命令群１６４０は、Ａ命令群１４２０で値が代入される変数のうち、ＳＵＣ＿Ｂ命令群以降に実行される命令群において参照される変数に格納されている値を他の変数に格納する命令群である。
【０４１２】
入力プログラム１３１０では、Ｂ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０以降との間には他の命令が存在しないため、Ｂ命令群までが実行された時点での途中結果が、ＳＵＣ＿Ｂ命令群以降にも引き継がれる。ここで、入力プログラム１３１０が、改竄防止処理生成装置１３２０によって難読化されると、Ｂ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０以降の命令との間にＡ命令群１４２０の実行が割り込むこととなる。このとき、Ａ命令群１４２０が、ＳＵＣ＿Ｂ命令群１４５０以降の命令が用いる変数と同じ変数を変化させる命令を含む場合、上述した途中結果がＡ命令群１４２０によって書き換えられてしまうこととなる。このような事態が発生すると、改竄防止プログラム１３３０の実行結果が入力プログラム１３１０と異なるものとなってしまう。このような事態を避けるために、Ａ命令群１４２０が実行される前後で途中結果を退避および復帰させる必要がある。
【０４１３】
例えば図２０のＡ命令群１４２０においては、変数「ｖａｒ＿ｏｒｇ０」と変数「ｖａｒ＿ｏｒｇ１」とが値が代入される変数である。そのうち変数「ｖａｒ＿ｏｒｇ２」は、ＳＵＣ＿Ｂ命令群１４５０中の命令「ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＋ｖａｒ＿ｏｒｇ２；」において値が参照されている。そのため、処理の途中結果である「ｖａｒ＿ｏｒｇ２」の値を退避する必要があるが、この「ｖａｒ＿ｏｒｇ２」に格納されている値を他の変数「ｖａｒ＿ｓａｖｅ０」に退避する処理「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」が退避命令群１６４０である。
【０４１４】
なお、本実施の形態では、変数の値を例として述べているが、変数以外にもＡ命令群１４２０によって改変される恐れのある情報は退避しておくことが望ましい。このような情報の例としてはスタックや、レジスタ、キャッシュの記録内容などが考えられる。
【０４１５】
（２．２）復帰命令群１６５０
復帰命令群１６５０は、難読化によってＢ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０の間に割り込むこととなったＡ命令群１４２０の処理が終った後に、退避命令群１６４０で退避しておいた値を元の変数に戻す命令群である。
【０４１６】
具体的には、図２０の復帰命令群１６５０は、変数「ｖａｒ＿ｓａｖｅ０」に退避した値を変数「ｖａｒ＿ｏｒｇ２」に格納する処理「ｖａｒ＿ｏｒｇ２＝ｖａｒ＿ｓａｖｅ０；」として表される。
【０４１７】
なお、Ａ命令群が、ＳＵＣ＿Ｂ命令群以降の命令で参照する変数を変化させない場合は、これらの変数を退避する必要がないので、退避命令群１６４０と復帰命令群１６５０は不要である。
【０４１８】
（２．３）ＣＢＲ＿ＡＢ条件分岐命令群１６１０
ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０とを条件分岐先に含む条件分岐命令である。なお、改竄防止プログラム１３３０が復帰命令群１６５０を含む場合には、退避していた内容を復帰させた上でＳＵＣ＿Ｂ命令群１４５０以降の処理を行わなくてはならないので、ＳＵＣ＿Ｂ命令群１４５０の替わりに復帰命令群１６５０を条件分岐先とする。図２０では、ＳＵＣ＿Ｂ命令群１４５０と復帰命令群１６５０にそれぞれ、「ＳＵＣ＿Ｂ」、「ＳＵＣ＿Ｂ＿」を付しているが、ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、復帰命令群１６５０が存在する場合には、ラベル「ＳＵＣ＿Ｂ＿」が付された復帰命令群１６５０を分岐先とし、存在しない場合には、ラベル「ＳＵＣ＿Ｂ」が付されたＳＵＣ＿Ｂ命令群１４５０を分岐先とする。復帰命令群１６５０が存在しない場合としては、復帰させるべき途中結果がない場合などが考えられる。
【０４１９】
図２０に例示した改竄防止プログラム１３３０は、復帰命令群１６５０を含む。したがって、ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、ＳＵＣ＿Ａ命令群１４３０と復帰命令群１６５０とを条件分岐先とし、「変数ｖａｒ＿ａｂ０」の値によって分岐先が決定する条件分岐命令「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）ｇｏｔｏ  ＳＵＣ＿Ｂ＿；」として表される。ここで、変数「ｖａｒ＿ａｂ０」は、Ａ命令群１４２０が、ＰＲＥ＿Ａ命令群１４１０の後に実行されたのか、Ｂ命令群１４４０の後に実行されたのかを示す手がかりとなる変数であり、後述するＧ＿ＶＡＬ＿ＡＢ変数群にあたる。改竄防止プログラム１３３０では、このＣＢＲ＿ＡＢ条件分岐命令群１６１０によって、Ａ命令群１４２０の後にＳＵＣ＿Ａ命令群１４３０が実行される場合と、Ａ命令群１４２０の後に復帰命令群１６５０（またはＳＵＣ＿Ｂ命令群１４５０）が行われる場合とが生じるよう制御している。
【０４２０】
なお、本実施の形態では、改竄防止プログラム１３３０はＣ言語で記述されているため、ＣＢＲ＿ＡＢ条件分岐命令群１６１０において、明示的にＳＵＣ＿Ａ命令群１４３０へ分岐する命令を記述していない。すなわち、Ｃ言語の記法上、ＣＢＲ＿ＡＢ条件分岐命令群１６１０のｉｆ文中の条件「ｖａｒ＿ａｂ０％２＝＝０」が偽の場合、ＣＢＲ＿ＡＢ条件分岐命令群１６１０の直後にはＳＵＣ＿Ａ命令群が実行されるため、ＳＵＣ＿Ａ命令群への明示的な分岐命令は不要である。つまり、図２０の記述内容でも、実質的にＣＢＲ＿ＡＢ条件分岐命令群１６１０はＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０とのいずれを実行するかの分岐を示すこととなる。なお、図２０のＣＢＲ＿ＡＢ条件分岐命令群１６１０の直後に「ｅｌｓｅ  ｇｏｔｏ  ＳＵＣ＿Ａ；」等の明示的な分岐命令が記述されていても良いことは言うまでもない。上述のように明示的な分岐命令を記述しておくことで、ＣＢＲ＿ＡＢ条件分岐命令群１６１０とＳＵＣ＿Ａ命令群１４３０とがプログラム上で離れた位置にあっても適切な分岐処理を行うことができる。
【０４２１】
（２．４）ＳＴＲ＿Ａ変数群値代入命令群１６２０
ＳＴＲ＿Ａ変数群値代入命令群１６２０は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０において、条件分岐先がＳＵＣ＿Ａ命令群１４３０と判定されるように、変数に値を代入する命令群である。すなわち、この命令群が実行されるときは、ＰＲＥ＿Ａ命令群１４１０が実行された後にＡ命令群１４２０が実行され、さらにその後にＣＢＲ＿ＡＢ条件分岐命令群１６１０が実行されるときであるので、ＳＴＲ＿Ａ変数群値代入命令群１６２０は、その旨を示す情報を変数の値として残している。なお、この変数を、以下ではＧ＿ＶＡＬ＿ＡＢ変数群と呼ぶ。なお、Ｇ＿ＶＡＬ＿ＡＢ変数群は１つの変数である必要はなく、複数の変数の集合であってもよい。また、プログラム中に明示的に変数として現れるもの以外のものであってもよく、例えばスタックの一番上に積まれている値などであってもよい。すなわち、判定の手掛かりが残せるような処理を行う命令群であれば、どのような命令群であっても良い。このＧ＿ＶＡＬ＿ＡＢ変数群は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０がどの命令に分岐すべきかを決定する際に用いられる。図２０に示した具体例ではＧ＿ＶＡＬ＿ＡＢ変数群は変数「ｖａｒ＿ａｂ０」である。
【０４２２】
図２０に示した具体例では、ＳＴＲ＿Ａ変数群値代入命令群１６２０は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０のｉｆ文中の条件「ｖａｒ＿ａｂ０％２＝＝０」が偽となるように「ｖａｒ＿ａｂ０」に値を代入する命令群「ｖａｒ＿ａｂ０＝１；」である。ここで、条件「ｖａｒ＿ａｂ０％２＝＝０」が偽となれば、ＣＢＲ＿ＡＢ条件分岐命令群１６１０がＳＵＣ＿Ａ命令群１４３０に分岐することは、ＣＢＲ＿ＡＢ条件分岐命令群１６１０の説明で述べたとおりである。すなわち、改竄防止プログラム１３３０では、ＰＲＥ＿Ａ命令群１４１０の後にＡ命令群１４２０が行われた後には、（ＳＵＣ＿Ｂ命令群１４５０ではなく）ＳＵＣ＿Ａ命令群１４３０が行われるようにするために、ＳＴＲ＿Ａ変数群値代入命令群１６２０を用いている。
【０４２３】
（２．５）ＳＴＲ＿Ｂ変数群値代入命令群１６３０
ＳＴＲ＿Ｂ変数群値代入命令群１６３０は、上述のＣＢＲ＿ＡＢ条件分岐命令群１６１０において、条件分岐先がＳＵＣ＿Ｂ命令群１４５０と判定されるように、Ｇ＿ＶＡＬ＿ＡＢ変数群に含まれる変数に値を代入する命令群である。すなわち、この命令群が実行されるときは、Ｂ命令群１４４０が実行された後にＡ命令群１４２０が実行され、さらにその後にＣＢＲ＿ＡＢ条件分岐命令群１６１０が実行されるときであるので、ＳＴＲ＿Ｂ変数群値代入命令群１６３０は、その旨を示す情報を変数の値として残している。ここで、ＳＴＲ＿Ｂ変数群値代入命令群１６３０が、複数の変数を用いたり、変数以外のものを利用する構成であってもよいことは、ＳＴＲ＿Ａ変数群値代入命令群１６２０と同様である。
【０４２４】
図２０に示した具体的例では、ＣＢＲ＿ＡＢ条件分岐命令群１６１０のｉｆ文中の条件「ｖａｒ＿ａｂ０％２＝＝０」が真となるように「ｖａｒ＿ａｂ０」に値を代入する命令群「ｖａｒ＿ａｂ０＝８；」がＳＴＲ＿Ｂ変数群値代入命令群１６３０である。ここで、条件「ｖａｒ＿ａｂ０％２＝＝０」が真となれば、ＣＢＲ＿ＡＢ条件分岐命令群１６１０中のｉｆ文の判定結果が真となって「ｇｏｔｏ  ＳＵＣ＿Ｂ＿；」が実行されるため、復帰命令群１６５０への分岐処理が実行される。すなわち、改竄防止プログラム１３３０では、Ｂ命令群１４４０、退避命令群１６４０、Ａ命令群１４２０の順に各命令群の処理が行われた後には、（ＳＵＣ＿Ａ命令群１４３０ではなく）復帰命令群１６５０が行われるようにするために、ＳＴＲ＿Ｂ変数群値代入命令群１６３０を用いている。なお、復帰命令群１６５０がない場合には、ＳＴＲ＿Ｂ変数群値代入命令群１６３０は、Ｂ命令群１４４０が実行された後にＡ命令群１４２０が実行され、さらにその後にＳＵＣ＿Ｂ命令群１４５０が実行されるようにするために、変数の値を設定する命令群である。
【０４２５】
（２．６）ＢＲ＿Ｂ分岐命令群１６６０
図２０中のＢＲ＿Ｂ分岐命令群１６６０は、Ｂ命令群１４４０からＡ命令群１４２０へ分岐する命令群である。ただし、改竄防止プログラム１３３０が退避命令群１６４０を含む場合は、Ａ命令群１４２０へ分岐する前に途中結果を退避する必要があるので、退避命令群１６４０による処理が終わった後でＡ命令群１４２０へ分岐する命令群となる。
【０４２６】
図２０に例示した改竄防止プログラム１３３０は退避命令群１６４０を含むので、ＢＲ＿Ｂ分岐命令群１６６０は、退避命令群１６４０による処理が終わった後でＡ命令群１４２０へ分岐する分岐命令群「ｇｏｔｏ  Ａ；」として表される。
【０４２７】
（２．７）改竄防止プログラム１３３０の処理の流れ
本実施の形態における改竄防止プログラム１３３０の処理の流れを、入力プログラム１３１０の処理の流れと比較して説明するため、先に、入力プログラム１３１０の処理の流れについて説明する。
【０４２８】
図２１は、入力プログラム１３１０の処理の流れを示す図である。
【０４２９】
入力プログラム１３１０は、図２１に示すように、分岐を含まない単純なものである。実行処理装置１３４０は、入力プログラム１３１０を実行した場合、まず、ＰＲＥ＿Ａ命令群１４１０を実行し（ステップＳ２００）、Ａ命令群１４２０を実行する（ステップＳ２０２）。さらに、実行処理装置１３４０は、ＳＵＣ＿Ａ命令群１４３０を実行し（ステップＳ２０４）、Ｂ命令群１４４０を実行し（ステップＳ２０６）、ＳＵＣ＿Ｂ命令群１４５０を実行する（ステップＳ２０８）。
【０４３０】
図２２は、改竄防止プログラム１３３０の処理の流れを示す図である。
【０４３１】
一方、改竄防止プログラム１３３０は、図２２に示すように、分岐と合流を含む。実行処理装置１３４０は、改竄防止プログラム１３３０を実行した場合、まず、ＰＲＥ＿Ａ命令群１４１０を実行し（ステップＳ３００）、次に、ＳＴＲ＿Ａ変数群値代入命令群１６２０を実行し（ステップＳ３０２）、その後、Ａ命令群１４２０を実行する（ステップＳ３０４）。ここで、実行処理装置１３４０は、ステップＳ３０２でＳＴＲ＿Ａ変数群値代入命令群１６２０を実行することで、変数「ｖａｒ＿ａｂ０」に１を代入する。
【０４３２】
そして、実行処理装置１３４０は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０を実行することにより、変数「ｖａｒ＿ａｂ０」が「ｖａｒ＿ａｂ０％２＝＝０」を満たすか否かを判別する（ステップＳ３０６）。このとき、実行処理装置１３４０は、ステップＳ３０２で変数「ｖａｒ＿ａｂ０」に１が代入されているため、変数「ｖａｒ＿ａｂ０」が「ｖａｒ＿ａｂ０％２＝＝０」を満たさないと判別する（ステップＳ３０６の「ｖａｒ＿ａｂ０％２＝＝１」）。
【０４３３】
その結果、実行処理装置１３４０は、ＳＵＣ＿Ａ命令群１４３０を実行し（ステップＳ３０８）、次に、Ｂ命令群１４４０を実行し（ステップＳ３１０）、さらに、ＳＴＲ＿Ｂ変数群値代入命令群１６３０を実行する（ステップＳ３１２）。ここで、実行処理装置１３４０は、ステップＳ３１２でＳＴＲ＿Ｂ変数群値代入命令群１６３０を実行するときには、変数「ｖａｒ＿ａｂ０」に８を代入する。
【０４３４】
さらに、実行処理装置１３４０は、退避命令群１６４０を実行し（ステップＳ３１４）、その後、ＢＲ＿Ｂ分岐命令群１６６０を実行すると（ステップＳ３１６）、再び、Ａ命令群１４２０を実行する（ステップＳ３０４）。
【０４３５】
そして、実行処理装置１３４０は、もう一度、ＣＢＲ＿ＡＢ条件分岐命令群１６１０を実行することにより、変数「ｖａｒ＿ａｂ０」が「ｖａｒ＿ａｂ０％２＝＝０」を満たすか否かを判別する（ステップＳ３０６）。このとき、実行処理装置１３４０は、ステップＳ３１２で変数「ｖａｒ＿ａｂ０」に８が代入されているため、変数「ｖａｒ＿ａｂ０」が「ｖａｒ＿ａｂ０％２＝＝０」を満たすと判別する（ステップＳ３０６の「ｖａｒ＿ａｂ０％２＝＝０」）。
【０４３６】
その結果、実行処理装置１３４０は、復帰命令群１６５０を実行し（ステップＳ３１８）、次に、ＳＵＣ＿Ｂ命令群１４５０を実行する（ステップＳ３２０）。
【０４３７】
このように、Ａ命令群１４２０は、ＳＴＲ＿Ａ変数群値代入命令群１６２０の後と、ＢＲ＿Ｂ分岐命令群１６６０の後とで実行される。つまり、実行処理装置１３４０が入力プログラム１３１０を実行した場合には、Ａ命令群１４２０は１回しか実行されないのに対し、実行処理装置１３４０が改竄防止プログラム１３３０を実行した場合には、Ａ命令群１４２０は２回実行されることとなる。したがって、改竄防止プログラム１３３０を実行処理装置１３４０で実行させた場合と、難読化前のプログラムである入力プログラム１３１０を実行処理装置１３４０で実行させた場合とでは、各命令群が異なる順序で実行される。
【０４３８】
（２．８）改竄防止プログラム１３３０の効果
不正解析者が改竄防止プログラム１３３０を解析した際のそのプログラムの実行順序と、入力プログラム１３１０の実行順序とは、図２１および図２２に示したように異なるため、不正解析者は改竄防止プログラム１３３０の実行順序を解析しても、難読化前の入力プログラムの実行順序を知ることが難しく、解析が困難になる。また、改竄防止プログラム１３３０の実行順序は、入力プログラム１３１０の実行順序よりも複雑になるので、解析や改竄を困難にすることが出来る。その結果、保護対象コードであるＡ命令群１４２０を確実に保護することができる。
【０４３９】
また、不正解析者が、難読化のための冗長な処理を見つけ出して読み飛ばす、あるいは、削除するといった攻撃を取ることが考えられる。ここで、本実施の形態では、ＢＲ＿Ｂ分岐命令群１６６０の後のＡ命令群１４２０の実行が冗長な処理に当たるので、不正解析者がＡ命令群１４２０が冗長であることをつきとめ、削除しようとすることが考えられる。しかし、本実施の形態の改竄防止プログラム１３３０では、Ａ命令群１４２０は単なる冗長な処理ではなく、難読化前のプログラム（入力プログラム１３１０）で必要であった処理である。したがって、Ａ命令群１４２０を削除すると、難読化前のプログラムにおいてＡ命令群１４２０を使っていた処理が実行されなくなる。その結果、改竄防止プログラム１３３０と入力プログラム１３１０との全体の処理結果が合わなくなる。つまり、不正解析者は必要な処理まで削除してしまうこととなる。よって、このような不正解析者の攻撃による改竄防止プログラム１３３０の改竄は困難になる。
【０４４０】
また、不正解析者がプログラムの特定の部分の制御構造を知っていて、その知識を用いてその特定の部分を見つけ出す攻撃を行うことも考えられる（このような制御構造の例としては、公知の暗号化アルゴリズムなどが考えられる）。また、難読化対象（入力プログラム１３１０）が秘密情報を用いるプログラムであって、不正解析者がプログラムに含まれる特定の演算を知っていて、その秘密情報を見つけるために、その演算を見つけ出す攻撃も考えられる。しかし、本実施の形態における改竄防止プログラム１３３０の制御構造は不正解析者が知っている制御構造と異なるものとなっているので、不正解析者が知っている制御構造に基づく、改竄防止プログラム１３３０の制御構造に対する解析が困難になる。
【０４４１】
（３）改竄防止処理生成装置１３２０の構成
続いて、改竄防止処理生成装置１３２０の説明を行う。改竄防止処理生成装置１３２０は、入力プログラム１３１０を難読化し改竄防止プログラム１３３０を生成する装置である。
【０４４２】
図２３は、改竄防止処理生成装置１３２０の構成を示す図である。
【０４４３】
改竄防止処理生成装置１３２０は、入力部２０１０と、入力プログラム保持部２０２０と、被代入変数解析部２０３０と、被代入変数情報保持部２０４０と、被退避変数解析部２０５０と、被退避変数情報保持部２０６０と、退避命令群生成部２０７０と、退避命令群保持部２０８０と、復帰命令群生成部２０９０と、復帰命令群保持部２０９１と、条件分岐命令群生成部２０９２と、分岐条件保持部２０９３と、条件分岐命令群保持部２０９４と、変数群値代入命令群生成部２０９５と、変数群値代入命令群保持部２０９６と、分岐命令群生成部２０９７と、分岐命令群保持部２０９８と、改竄防止プログラム生成部２０９９と、改竄防止プログラム出力部２１００とを備えている。
【０４４４】
入力部２０１０は、ＳＵＣ＿Ａ命令群１４３０を分岐先とするＡ命令群１４２０と、Ａ命令群１４２０を分岐先とするＰＲＥ＿Ａ命令群１４１０と、ＳＵＣ＿Ｂ命令群１４５０を分岐先とするＢ命令群１４４０とを含む入力プログラム１３１０（例えば図１８に示すプログラム）を受け付ける。
【０４４５】
入力プログラム保持部２０２０は、入力部２０１０が受け付けた入力プログラム１３１０を保持する。
【０４４６】
被代入変数解析部２０３０は、入力プログラム保持部２０２０が保持する入力プログラム１３１０中のＡ命令群１４２０に含まれる変数であって、値の代入がなされる変数（被代入変数）を解析（特定）する。
【０４４７】
被代入変数情報保持部２０４０は、被代入変数解析部２０３０による解析によって得られた被代入変数の変数名等の情報を保持する。
【０４４８】
被退避変数解析部２０５０は、ＳＵＣ＿Ｂ命令群１４５０に含まれる変数であって、値の参照がなされる変数（被参照変数）を解析（特定）する。さらに、被退避変数解析部２０５０は、被代入変数情報保持部２０４０が保持する被代入変数であり、かつ、被参照変数でもある変数（以下では、被退避変数と呼ぶ）を特定する。
【０４４９】
被退避変数情報保持部２０６０は、被退避変数解析部２０５０で特定された被退避変数の変数名等の情報を保持する。
【０４５０】
退避命令群生成部２０７０は、被退避変数が保持する値を退避用変数（本実施の形態では、変数「ｖａｒ＿ｓａｖｅ０」など）に退避する命令群である退避命令群１６４０を生成する。
【０４５１】
退避命令群保持部２０８０は、退避命令群生成部２０７０が生成した退避命令群１６４０を保持する。
【０４５２】
復帰命令群生成部２０９０は、退避用変数に退避した値を被退避変数に戻すための命令群である復帰命令群１６５０を生成する。
【０４５３】
復帰命令群保持部２０９１は、復帰命令群生成部２０９０が生成した復帰命令群１６５０を保持する。
【０４５４】
条件分岐命令群生成部２０９２は、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０とを条件分岐先に含み、分岐先決定用の変数であるＧ＿ＶＡＬ＿ＡＢ変数群（本実施の形態では、変数「ｖａｒ＿ａｂ０」など）の値に基づき分岐先を決定するＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成する。
【０４５５】
分岐条件保持部２０９３は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０がＳＵＣ＿Ａ命令群１４３０を分岐先とする条件を満たすために分岐先決定用変数が取るべき値の集合、および、ＳＵＣ＿Ｂ命令群１４５０を分岐先とする条件を満たすために分岐先決定用変数が取るべき値の集合を保持する。
【０４５６】
条件分岐命令群保持部２０９４は、条件分岐命令群生成部２０９２が生成したＣＢＲ＿ＡＢ条件分岐命令群１６１０を保持する。
【０４５７】
変数群値代入命令群生成部２０９５は、Ｇ＿ＶＡＬ＿ＡＢ変数群（本実施の形態では、変数「ｖａｒ＿ａｂ０」など）に、ＳＵＣ＿Ａ命令群１４３０を分岐先とする条件を満たす値を代入する命令群の生成、および、ＳＵＣ＿Ｂ命令群１４５０を分岐先とする条件を満たす値を代入する命令群の生成を行う。
【０４５８】
変数群値代入命令群保持部２０９６は、変数群値代入命令群生成部２０９５が生成した命令群を保持する。
【０４５９】
分岐命令群生成部２０９７は、Ｂ命令群１４４０の後にＡ命令群１４２０が実行されるように制御するＢＲ＿Ｂ分岐命令群１６６０を生成する。
【０４６０】
分岐命令群保持部２０９８は、分岐命令群生成部２０９７が生成したＢＲ＿Ｂ分岐命令群１６６０を保持する。
【０４６１】
改竄防止プログラム生成部２０９９は、入力プログラム保持部２０２０が保持する入力プログラム１３１０および、各命令群保持部が保持する命令群を用いて改竄防止プログラム１３３０を生成する。
【０４６２】
改竄防止プログラム出力部２１００は、改竄防止プログラム生成部２０９９が生成した改竄防止プログラム１３３０を記録媒体１３５０に記録する。
【０４６３】
以下、各構成要素の動作についてより詳細に説明する。また、具体例として、図１８の入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合の動作を説明する。
【０４６４】
（３．１）入力部２０１０
入力部２０１０は、入力プログラム１３１０を受け付ける。入力プログラム１３１０は、入力プログラム１３１０の構成で述べたように、Ａ命令群１４２０、ＰＲＥ＿Ａ命令群１４１０、ＳＵＣ＿Ａ命令群１４３０、Ｂ命令群１４４０、およびＳＵＣ＿Ｂ命令群１４５０を含む。入力部２０１０は、さらに、入力プログラム１３１０のうち、いずれの部分が、Ａ命令群１４２０、ＰＲＥ＿Ａ命令群１４１０、ＳＵＣ＿Ａ命令群１４３０、Ｂ命令群１４４０、またはＳＵＣ＿Ｂ命令群１４５０であるかの指定を受け付ける。
【０４６５】
（３．２）入力プログラム保持部２０２０
入力プログラム保持部２０２０は、命令群を記憶する領域を備えている。入力プログラム保持部２０２０は、入力部２０１０が受け付けた入力プログラム１３１０を保持する。
【０４６６】
（３．３）被代入変数解析部２０３０
被代入変数解析部２０３０は、入力プログラム保持部２０２０が保持する入力プログラム１３１０中のＡ命令群１４２０において、なんらかの処理結果が格納される格納先を解析（特定）する。
【０４６７】
具体的には、例えば、Ａ命令群１４２０が変数の値を代入する処理を含むのであれば、被代入変数解析部２０３０は、変数の変数名や型を解析（特定）する。また、例えば、Ａ命令群１４２０がスタックポインタからの相対値を指定してスタックに値を格納する処理を含むのであれば、被代入変数解析部２０３０は、そのスタックポインタや、スタックのサイズやスタックポインタからの相対値を解析（特定）する。また、例えば、Ａ命令群１４２０がアドレス変数で指定した位置に値を格納する処理を含むのであれば、被代入変数解析部２０３０は、その格納されるアドレスを解析（特定）する。以降の説明では、これらのＡ命令群１４２０のなんらかの処理結果が格納される格納先の情報を総称して、被代入変数情報と呼ぶ。なお、本実施の形態では、Ａ命令群１４２０中に直接的に現れる変数以外であっても、なんらかの処理結果が格納される格納先の情報を被代入変数情報と呼ぶ。例えば、スタック等がＯＳの機能として実現されている場合、スタックポインタやスタックのサイズはＡ命令群１４２０中には明示的には表れないことがあるが、このような値も被代入変数情報である。
【０４６８】
次に、被代入変数解析部２０３０は、解析した被代入変数情報を被代入変数情報保持部２０４０に格納する。例えば、図１８のＡ命令群１４２０を解析の対象とする場合、被代入変数解析部２０３０は、値の代入が行われる変数「ｖａｒ＿ｏｒｇ０」と変数「ｖａｒ＿ｏｒｇ２」の変数名と型「ｉｎｔ  ｖａｒ＿ｏｒｇ０」と「ｉｎｔ  ｖａｒ＿ｏｒｇ２」を特定し、それぞれを被代入変数情報保持部２０４０に格納する。
【０４６９】
なお、本実施の形態では、入力プログラム１３１０におけるＡ命令群１４２０の範囲は、ラベル「Ａ：」から始まり、次の他のラベルが現れる前までとする。以降の説明における、ＰＲＥ＿Ａ命令群１４１０、ＳＵＣ＿Ａ命令群１４３０、Ｂ命令群１４４０、ＳＵＣ＿Ｂ命令群１４５０の範囲も同様に、各命令群は何らかのラベルから次のラベルが現れる前までの範囲であるものとする。
【０４７０】
このラベルは、入力部２０１０を介してユーザからの指定により付されるものとしてもよいし、入力プログラム１３１０に元から付されているラベルを利用しても良い。
【０４７１】
（３．４）被代入変数情報保持部２０４０
被代入変数情報保持部２０４０は、被代入変数解析部２０３０が解析したＡ命令群１４２０の被代入変数情報を記憶する。被代入変数が複数ある場合には、各被代入変数についての被代入変数情報を記憶する。
【０４７２】
本実施の形態では、図１８のＡ命令群１４２０に対して被代入変数解析部２０３０による解析が行われた場合、被代入変数情報保持部２０４０は、各被代入変数の型と変数名である「ｉｎｔ  ｖａｒ＿ｏｒｇ０」と「ｉｎｔ  ｖａｒ＿ｏｒｇ２」とを記憶する。
【０４７３】
（３．５）被退避変数解析部２０５０
被退避変数解析部２０５０は、ＳＵＣ＿Ｂ命令群１４５０以降の命令群の処理結果に影響を与える変数であって、かつ、Ａ処理命令群で値が変更される変数を解析（特定）する。なお、被退避変数解析部２０５０の解析対象は、被代入変数解析部２０３０の解析対象と同様、Ａ命令群１４２０中に直接的に現れる変数以外のものも含む。このような変数を解析してその変数の値を退避しておかなくては、Ａ処理命令群がＳＵＣ＿Ｂ命令群１４５０の前に実行されることにより、改竄防止プログラム１３３０の処理結果が入力プログラム１３１０とは異なるものとなってしまうこととなることは上述のとおりである。
【０４７４】
まず、被退避変数解析部２０５０は、入力プログラム保持部２０２０が保持する入力プログラム１３１０中のＳＵＣ＿Ｂ命令群１４５０、および、ＳＵＣ＿Ｂ命令群１４５０以降を実行する際に必要となる変数を特定する。ここで、実行する際に必要となる変数とは、Ｂ命令群１４４０の実行が終了した時点における変数の値がＳＵＣ＿Ｂ命令群１４５０以降の命令で使用される変数、すなわち、ＳＵＣ＿Ｂ命令群１４５０以降の処理結果に影響を与える変数のことを示す。より具体的には、Ｂ命令群１４４０までに値が代入され、ＳＵＣ＿Ｂ命令群１４５０以降の命令に含まれる代入式の右辺に表れる変数がこれに当たる。
【０４７５】
次に、特定された変数のうち被代入変数情報保持部２０４０に保持されている変数があれば、被退避変数解析部２０５０は、その変数を被退避変数とし、被退避変数の変数名等の情報を被退避変数情報保持部２０６０に格納する。すなわち、被退避変数解析部２０５０は、Ａ命令群１４２０で値が代入され、ＳＵＣ＿Ｂ命令群１４５０以降の命令群で必要となる変数を、退避変数として抽出する。
【０４７６】
より具体的には、ＳＵＣ＿Ｂ命令群１４５０が変数を参照する処理を含む命令群であれば、被退避変数解析部２０５０は、その変数の変数名や型を解析（特定）する。また、例えば、ＳＵＣ＿Ｂ命令群１４５０がスタックの値を参照する処理を含む命令群であれば、被退避変数解析部２０５０は、参照するスタックのサイズを解析（特定）する。また、例えば、ＳＵＣ＿Ｂ命令群１４５０がアドレス変数で指定した位置に格納された値を参照する処理を含むのであれば、被退避変数解析部２０５０は、そのアドレス変数や格納する値の型を解析（特定）する。以下の説明では、これらのＳＵＣ＿Ｂ命令群１４５０を実行する際に必要なパラメータや変数に関する情報を総称して被参照変数情報と呼び、パラメータや変数自体のことを被参照変数と呼ぶ。
【０４７７】
次に、その被参照変数のうち、被代入変数情報保持部２０４０に保持されている変数があれば、被退避変数解析部２０５０は、その変数を被退避変数とし、被退避変数の変数名等の情報を被退避変数情報保持部２０６０に格納する。
【０４７８】
例えば、図１８のＳＵＣ＿Ｂ命令群１４５０の場合、「ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＋ｖａｒ＿ｏｒｇ２；ｖａｒ＿ｏｒｇ１  ＝ｖａｒ＿ｏｒｇ１＊１２３；」において、変数「ｖａｒ＿ｏｒｇ１」および変数「ｖａｒ＿ｏｒｇ２」の値が参照されている。よって、被退避変数解析部２０５０は、変数「ｖａｒ＿ｏｒｇ１」および変数「ｖａｒ＿ｏｒｇ２」を被参照変数とし、「ｉｎｔ  ｖａｒ＿ｏｒｇ１」および「ｉｎｔ  ｖａｒ＿ｏｒｇ２」を被参照変数情報とする。このうち、「ｉｎｔ  ｖａｒ＿ｏｒｇ１」は被代入変数情報保持部２０４０に保持されておらず、「ｉｎｔ  ｖａｒ＿ｏｒｇ２」は保持されている。したがって、保持されている方の「ｉｎｔ  ｖａｒ＿ｏｒｇ２」の変数「ｖａｒ＿ｏｒｇ２」は、ＳＵＣ＿Ｂ命令群１４５０の処理結果に影響を与える変数であって、かつ、Ａ命令群１４２０で値が変更される変数である。よって、変数「ｖａｒ＿ｏｒｇ２」の値を、Ａ命令群１４２０の処理を行う前に退避し、ＳＵＣ＿Ｂ命令群１４５０の処理を行う前にその値を戻さなければならない。被退避変数解析部２０５０は、「ｉｎｔ  ｖａｒ＿ｏｒｇ２」を被退避変数情報とし、被退避変数情報保持部２０６０に格納する。
【０４７９】
なお、ＳＵＣ＿Ｂ命令群１４５０の処理結果に影響を与える変数であって、かつ、Ａ命令群１４２０で値が変更される変数が抽出されるのであれば、被退避変数解析部２０５０が行う処理は上記のものに限らない。例えば、被退避変数解析部２０５０は、被代入変数情報保持部２０４０に保持されている変数を取り出し、これがＳＵＣ＿Ｂ命令群１４５０以降の命令に含まれているかを検索しても良い。また、被退避変数解析部２０５０は、被代入変数情報保持部２０４０を用いずに、入力プログラム保持部２０２０が保持する入力プログラム１３１０から、Ａ命令群１４２０によって値が変更される変数を直接取り出してもよい。
【０４８０】
（３．６）被退避変数情報保持部２０６０
被退避変数情報保持部２０６０は、被退避変数情報を記憶する領域を備えている。
【０４８１】
被退避変数情報保持部２０６０は、被退避変数解析部２０５０が解析した被退避変数情報を記憶する。なお、被退避変数が複数ある場合には、被退避変数情報保持部２０６０は、各被退避変数についての被退避変数情報を記憶する。
【０４８２】
具体的には、図１８のＳＵＣ＿Ｂ命令群１４５０の場合、被退避変数情報保持部２０６０は、被退避変数の変数名と型「ｉｎｔ  ｖａｒ＿ｏｒｇ２」を記憶する。
【０４８３】
（３．７）退避命令群生成部２０７０
退避命令群生成部２０７０は、被退避変数情報の値を退避させる退避命令群１６４０を生成して退避命令群保持部２０８０に格納する。より詳細には、以下の処理を行う。
【０４８４】
Ａ）退避命令群生成部２０７０は、被退避変数をどう退避するかを決める。具体的には、どの変数に退避するかなどを決定する。本実施の形態では、退避命令群生成部２０７０は、被退避変数の退避先として新たな変数を作成して、その変数に被退避変数の値を退避させる。
【０４８５】
Ｂ）退避命令群生成部２０７０は、決定した退避のさせ方に従って、被退避変数の値を退避させる命令群である退避命令群１６４０を生成する。
【０４８６】
Ｃ）退避命令群生成部２０７０は、生成した退避命令群１６４０を退避命令群保持部２０８０に格納する。
【０４８７】
以下、図１８の入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合における、退避命令群生成部２０７０の具体的な動作の例を説明する。
【０４８８】
Ａ）退避命令群生成部２０７０は、被退避変数情報保持部２０６０より被退避変数情報を取得し、被退避変数の個数を調べる。ここでは、被退避変数は「ｉｎｔ  ｖａｒ＿ｏｒｇ２」のみであるので、１つである。退避命令群生成部２０７０は、判定した個数分の退避用変数を新たに作成し、作成した退避用変数「ｉｎｔ  ｖａｒ＿ｓａｖｅ０」を退避に用いる変数に決める。
【０４８９】
Ｂ）退避命令群生成部２０７０は、被退避変数の値を退避用変数に退避する退避命令群１６４０を生成する。ここでは、退避命令群生成部２０７０は、命令「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」を生成する。なお、被退避変数が複数ある場合は、退避命令群生成部２０７０は、それぞれの被退避変数について、退避命令群を生成する。また、退避命令群として被退避変数そのものを退避させるのではなく、暗号化などの何らかの変換を施して退避してもよい。本実施の形態では、このような変換を施した上で退避する場合および無変換のまま退避する場合の両方を含めて、変換と呼ぶ。
【０４９０】
Ｃ）退避命令群生成部２０７０は、生成した退避命令群１６４０を退避命令群保持部２０８０に格納する。ここでは、「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」が格納される。
【０４９１】
（３．８）退避命令群保持部２０８０
退避命令群保持部２０８０は、命令群を記憶する領域を備える。退避命令群保持部２０８０は、退避命令群生成部２０７０が生成した退避命令群１６４０を記憶領域に記憶する。
【０４９２】
図１８に示した入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合、退避命令群生成部２０７０が生成した退避命令群１６４０が「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」となるので、退避命令群保持部２０８０は、「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」を記憶する。
【０４９３】
（３．９）復帰命令群生成部２０９０
復帰命令群生成部２０９０は、退避用変数に退避した値を被退避変数に戻すための命令群である復帰命令群１６５０を生成する。より詳細には、以下の処理を行う。
【０４９４】
Ａ）復帰命令群生成部２０９０は、退避命令群保持部２０８０が保持する退避命令群１６４０を取得する。
【０４９５】
Ｂ）復帰命令群生成部２０９０は、取得した退避命令群１６４０が行う変換の逆変換を行う命令群を生成してその命令群を復帰命令群１６５０とする。
【０４９６】
Ｃ）復帰命令群生成部２０９０は、復帰命令群１６５０を復帰命令群保持部２０９１に格納する。
【０４９７】
以下、図１８の入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合における、復帰命令群生成部２０９０の具体的な動作の例を説明する。
【０４９８】
Ａ）復帰命令群生成部２０９０は、退避命令群保持部２０８０が保持する退避命令群１６４０「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」を取得する。
【０４９９】
Ｂ）復帰命令群生成部２０９０は、「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」の逆変換である「ｖａｒ＿ｏｒｇ２＝ｖａｒ＿ｓａｖｅ０；」を生成し、復帰命令群１６５０とする。
【０５００】
Ｃ）復帰命令群生成部２０９０は、復帰命令群１６５０「ｖａｒ＿ｏｒｇ２＝ｖａｒ＿ｓａｖｅ０；」を復帰命令群保持部２０９１に格納する。
【０５０１】
（３．１０）復帰命令群保持部２０９１
復帰命令群保持部２０９１は、命令群を記憶する領域を備える。復帰命令群保持部２０９１は、復帰命令群生成部２０９０が生成した復帰命令群１６５０を記憶領域に記憶する。
【０５０２】
上記の具体例では、復帰命令群生成部２０９０が生成した復帰命令群１６５０が「ｖａｒ＿ｏｒｇ２＝ｖａｒ＿ｓａｖｅ０；」であるので、復帰命令群保持部２０９１は、復帰命令群生成部２０９０で生成された「ｖａｒ＿ｏｒｇ２＝ｖａｒ＿ｓａｖｅ０；」を記憶する。
【０５０３】
（３．１１）条件分岐命令群生成部２０９２
条件分岐命令群生成部２０９２は、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０とを条件分岐先に含み、分岐先決定用のＧ＿ＶＡＬ＿ＡＢ変数（変数「ｖａｒ＿ａｂ０」）の値に基づき分岐先を決定するＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成する。なお、復帰命令群１６５０がある場合には、条件分岐命令群生成部２０９２は、ＳＵＣ＿Ｂ命令群１４５０に替えて復帰命令群１６５０を分岐先として含むＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成する。
【０５０４】
具体的には、以下の処理を行う。
【０５０５】
Ａ）条件分岐命令群生成部２０９２は、分岐先決定用の変数を決定する。本実施の形態では、新しく変数を生成し、その変数を分岐先決定用の変数とする。
【０５０６】
Ｂ）条件分岐命令群生成部２０９２は、分岐先決定用の変数の値がどのような値の時にＳＵＣ＿Ａ命令群１４３０を条件分岐先とするかを決定する。また、条件分岐命令群生成部２０９２は、分岐先決定用の変数の値がどのような値の時にＳＵＣ＿Ｂ命令群１４５０を条件分岐先とするかを決定する。ここで決定する条件の具体例としては、例えば、変数の値が所定の値と一致する、所定の値よりも大きい、変数の値に何らかの変換を施した値が所定の値と一致するなどである。
【０５０７】
Ｃ）条件分岐命令群生成部２０９２は、上記のＢ）で決めた条件分岐先がＳＵＣ＿Ａ命令群１４３０となる分岐先決定用の変数の値の集合を分岐条件保持部２０９３に格納する。また、条件分岐命令群生成部２０９２は、Ｂ）で決めた条件分岐先がＳＵＣ＿Ｂ命令群１４５０となる分岐先決定用の変数の値の集合を分岐条件保持部２０９３に格納する。
【０５０８】
Ｄ）復帰命令群保持部２０９１が復帰命令群１６５０を保持する場合は、条件分岐命令群生成部２０９２は、ＳＵＣ＿Ａ命令群１４３０と復帰命令群１６５０を条件分岐先とし、保持しない場合は、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０を条件分岐先とするＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成する。
【０５０９】
Ｅ）条件分岐命令群生成部２０９２は、生成したＣＢＲ＿ＡＢ条件分岐命令群１６１０を条件分岐命令群保持部２０９４に格納する。
【０５１０】
以下、図１８の入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合における、条件分岐命令群生成部２０９２の具体的な動作の例を説明する。
【０５１１】
Ａ）条件分岐命令群生成部２０９２は、入力プログラム１３１０に含まれない変数を新たに用意し、分岐先決定用のＧ＿ＶＡＬ＿ＡＢ変数とする。ここでは、分岐先決定用の変数は「ｖａｒ＿ａｂ０」とする。
【０５１２】
Ｂ）条件分岐命令群生成部２０９２は、分岐先決定用の変数が２の倍数でない時、すなわち、「ｖａｒ＿ａｂ０％２  ＝＝１」の時、ＳＵＣ＿Ａ命令群１４３０を分岐先とし、２の倍数の時、すなわち、「ｖａｒ＿ａｂ０％２  ＝＝０」の時、ＳＵＣ＿Ｂ命令群１４５０を分岐先とすることを決定する。
【０５１３】
なお、ここでは、分岐先決定用の変数がどのような値の時にＳＵＣ＿Ａ命令群１４３０を分岐先にするかの一例を示したが、その決め方は他の方法であっても構わない。例えば、分岐先決定用の変数の値がランダムに選択した値の時にＳＵＣ＿Ａ命令群１４３０を分岐先とすると決めても構わない。
【０５１４】
Ｃ）条件分岐命令群生成部２０９２は、上記のＢ）で決めた条件分岐先がＳＵＣ＿Ａ命令群１４３０となる分岐先決定用の変数の値の集合を分岐条件保持部２０９３に格納する。ここでは、条件分岐命令群生成部２０９２は、集合「ｖａｒ＿ａｂ０％２  ＝＝１」、すなわち２の倍数以外の値の集合を格納する。
【０５１５】
さらに、条件分岐命令群生成部２０９２は、条件分岐先がＳＵＣ＿Ｂ命令群１４５０となる分岐先決定用の変数の値の集合を分岐条件保持部２０９３に格納する。ここでは、条件分岐命令群生成部２０９２は、集合「ｖａｒ＿ａｂ０％２  ＝＝０」、すなわち２の倍数を格納する。
【０５１６】
ここで、集合を格納するとは、集合に含まれる全ての値を格納するのであっても構わないし、「ｖａｒ＿ａｂ０％２  ＝＝０」のような集合を表す式を格納するのであっても構わない。
【０５１７】
Ｄ）条件分岐命令群生成部２０９２は、復帰命令群保持部２０９１が復帰命令群１６５０を保持する場合は、ＳＵＣ＿Ａ命令群１４３０と復帰命令群１６５０を条件分岐先とし、保持しない場合は、ＳＵＣ＿Ａ命令群１４３０とＳＵＣ＿Ｂ命令群１４５０を条件分岐先とするＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成する。ここでは、復帰命令群保持部２０９１は復帰命令群１６５０を保持するので、条件分岐命令群生成部２０９２は、復帰命令群１６５０の先頭にラベル「ＳＵＣ＿Ｂ＿」を設け、ＣＢＲ＿ＡＢ条件分岐命令群１６１０「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）  ｇｏｔｏ  ＳＵＣ＿Ｂ＿；」を生成する。
【０５１８】
Ｅ）条件分岐命令群生成部２０９２は、生成したＣＢＲ＿ＡＢ条件分岐命令群１６１０「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）  ｇｏｔｏ  ＳＵＣ＿Ｂ＿；」を条件分岐命令群保持部２０９４に格納する。
【０５１９】
（３．１２）分岐条件保持部２０９３
分岐条件保持部２０９３は、変数の値の集合を記憶する領域を少なくとも２つ備える。第一の領域は、条件分岐命令群生成部２０９２の分岐先がＳＵＣ＿Ａ命令群１４３０となる条件を満たす変数の値の集合である第一の集合を記録する。また、第二の領域は、条件分岐命令群生成部２０９２の分岐先がＳＵＣ＿Ｂ命令群１４５０（もしくは復帰命令群１６５０）となる条件を満たす変数の値の集合である第二の集合を記憶する。ここで、集合を格納するとは、集合に含まれる全ての値を格納するのであっても構わないし、「ｖａｒ＿ａｂ０％２＝＝０」のような集合を表す式を格納するのであっても構わない。
【０５２０】
上記の具体例の場合、第一の領域は、条件分岐命令群生成部２０９２の分岐先がＳＵＣ＿Ａ命令群１４３０となる条件を満たす変数の値の集合である「ｖａｒ＿ａｂ０％２＝＝１」を保持する。また、第二の領域は、条件分岐命令群生成部２０９２の分岐先が復帰命令群１６５０となる条件を満たす変数の値の集合である「ｖａｒ＿ａｂ０％２＝＝０」を保持する。
【０５２１】
（３．１３）条件分岐命令群保持部２０９４
条件分岐命令群保持部２０９４は、命令群を記憶する領域を備える。条件分岐命令群保持部２０９４は、条件分岐命令群生成部２０９４が生成したＣＢＲ＿ＡＢ条件分岐命令群１６１０を記憶領域に記憶する。
【０５２２】
上記の具体例の場合、条件分岐命令群保持部２０９４は、条件分岐命令群生成部２０９２が生成したＣＢＲ＿ＡＢ条件分岐命令群１６１０「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）  ｇｏｔｏ  ＳＵＣ＿Ｂ＿；」を記憶する。
【０５２３】
（３．１４）変数群値代入命令群生成部２０９５
変数群値代入命令群生成部２０９５は、ＳＴＲ＿Ａ変数群値代入命令群１６２０と、ＳＴＲ＿Ｂ変数群値代入命令群１６３０を生成する。具体的には、以下の処理を行う。
【０５２４】
Ａ）変数群値代入命令群生成部２０９５は、分岐条件保持部２０９３が保持する第一の集合および第二の集合を取得する。
【０５２５】
Ｂ）変数群値代入命令群生成部２０９５は、分岐先決定用の変数に、第一の集合に含まれる値を代入する命令群を生成し、ＳＴＲ＿Ａ変数群値代入命令群１６２０とする。また、変数群値代入命令群生成部２０９５は、分岐先決定用の変数に、第二の集合に含まれる値を代入する命令群を生成し、ＳＴＲ＿Ｂ変数群値代入命令群１６３０とする。なお、第一の集合または第二の集合に複数の値が含まれる場合、変数群値代入命令群生成部２０９５は、いずれかの値を選択して代入する値とする。この選択方法はランダムであってもよいし、何らかの基準に従って選択してもよい。
【０５２６】
Ｃ）変数群値代入命令群生成部２０９５は、生成した命令群を変数群値代入命令群保持部２０９６に格納する。
【０５２７】
以下、図１８の入力プログラム１３１０が改竄防止処理生成装置１３２０に入力された場合における、変数群値代入命令群生成部２０９５の具体的な動作の例を説明する。
【０５２８】
Ａ）変数群値代入命令群生成部２０９５は、分岐条件保持部２０９３が保持する第一の集合および第二の集合を取得する。これらは、それぞれ「ｖａｒ＿ａｂ０％２＝＝１」または「ｖａｒ＿ａｂ０％２＝＝０」である。
【０５２９】
Ｂ）変数群値代入命令群生成部２０９５は、分岐先決定用の変数を、第一の集合に含まれる値とする命令群を生成し、ＳＴＲ＿Ａ変数群値代入命令群１６２０とする。ここでは、分岐先決定用の変数は「ｖａｒ＿ａｂ０」であり、例えば、１が第一の集合に含まれる値である。よって、変数群値代入命令群生成部２０９５は、「ｖａｒ＿ａｂ０＝１；」をＳＴＲ＿Ａ変数群値代入命令群１６２０とする。同様に、変数群値代入命令群生成部２０９５は、「ｖａｒ＿ａｂ０＝８；」をＳＴＲ＿Ｂ変数群値代入命令群１６３０とする。
【０５３０】
Ｃ）変数群値代入命令群生成部２０９５は、生成したＳＴＲ＿Ａ変数群値代入命令群１６２０とＳＴＲ＿Ｂ変数群値代入命令群１６３０とを変数群値代入命令群保持部２０９６に格納する。
【０５３１】
（３．１５）変数群値代入命令群保持部２０９６
変数群値代入命令群保持部２０９６は、命令群を記憶する領域を備える。変数群値代入命令群保持部２０９６は、変数群値代入命令群生成部２０９５が生成したＳＴＲ＿Ａ変数群値代入命令群１６２０とＳＴＲ＿Ｂ変数群値代入命令群１６３０とを記憶領域に記憶する。
【０５３２】
上記の具体例の場合、変数群値代入命令群保持部２０９６は、変数群値代入命令群生成部２０９５が生成したＳＴＲ＿Ａ変数群値代入命令群１６２０とＳＴＲ＿Ｂ変数群値代入命令群１６３０とである、「ｖａｒ＿ａｂ０＝１；」と「ｖａｒ＿ａｂ０＝８；」とを保持する。
【０５３３】
（３．１６）分岐命令群生成部２０９７
分岐命令群生成部２０９７は、Ｂ命令群１４４０からＡ命令群１４２０に分岐するためのＢＲ＿Ｂ分岐命令群１６６０を生成する。
【０５３４】
具体的には、図１８の入力プログラム１３１０が処理対象である場合、分岐命令群生成部２０９７は、Ａ命令群１４２０へ分岐するＢＲ＿Ｂ分岐命令群１６６０である「ｇｏｔｏ  Ａ；」を生成する。
【０５３５】
（３．１７）分岐命令群保持部２０９８
分岐命令群保持部２０９８は、命令群を記憶する領域を備える。分岐命令群保持部２０９８は、分岐命令群生成部２０９７が生成したＢＲ＿Ｂ分岐命令群１６６０を記憶領域に記憶する。
【０５３６】
例えば、上記の具体例の場合、分岐命令群保持部２０９８は、分岐命令群生成部２０９７が生成したＢＲ＿Ｂ分岐命令群１６６０である「ｇｏｔｏ  Ａ；」を保持する。
【０５３７】
（３．１８）改竄防止プログラム生成部２０９９
改竄防止プログラム生成部２０９９は、入力プログラム保持部２０２０が保持する入力プログラム１３１０および、各命令群保持部が保持する命令群を用いて改竄防止プログラム１３３０を生成する。具体的には、改竄防止プログラム生成部２０９９は、入力プログラム１３１０に対して、各命令群保持部が保持する命令群を以下の位置に挿入または配置することにより、改竄防止プログラム１３３０を生成する。
【０５３８】
Ａ）改竄防止プログラム生成部２０９９は、ＰＲＥ＿Ａ命令群１４１０中のいずれかの位置にＳＴＲ＿Ａ変数群値代入命令群１６２０を挿入する。
【０５３９】
Ｂ）改竄防止プログラム生成部２０９９は、Ａ命令群１４２０の最後にＣＢＲ＿ＡＢ条件分岐命令群１６１０を配置する。
【０５４０】
Ｃ）改竄防止プログラム生成部２０９９は、Ｂ命令群１４４０中のいずれかの位置にＳＴＲ＿Ｂ変数群値代入命令群１６３０を挿入する。
【０５４１】
Ｄ）改竄防止プログラム生成部２０９９は、Ｂ命令群１４４０の最後に退避命令群１６４０を、さらにその後ろに、ＢＲ＿Ｂ分岐命令群１６６０を配置する。
【０５４２】
Ｅ）改竄防止プログラム生成部２０９９は、ＳＵＣ＿Ｂ命令群１４５０の直前に復帰命令群１６５０を配置する。
【０５４３】
具体的な例としては、改竄防止プログラム生成部２０９９は、図１８の入力プログラム１３１０に対して、生成して保持されている各命令群を挿入すると、図２０の改竄防止プログラム１３３０を生成する。
【０５４４】
なお、入力プログラム１３１０自体に対して、すでに他の難読化手法による変換などが施されている場合、Ａ命令群１４２０やＢ命令群１４４０の最後に正常系での実行時には実行されないダミー命令等が含まれている場合がある。この場合は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０や退避命令群１６４０は、必ずしも各命令群の最後でなくとも良い。すなわち、正常系で実行される命令のうちでの最後の位置に配置すれば良い。
【０５４５】
（３．１９）改竄防止プログラム出力部２１００
改竄防止プログラム出力部２１００は、改竄防止プログラム生成部２０９９が生成した改竄防止プログラム１３３０を受け取って格納する。また、改竄防止プログラム出力部２１００は、改竄防止プログラム１３３０を記録媒体１３５０に記録する。
【０５４６】
なお、本実施の形態では、分岐先決定用のＧ＿ＶＡＬ＿ＡＢ変数（変数「ｖａｒ＿ａｂ０」）が追加変数に相当し、条件分岐命令群生成部２０９２が変数生成手段として構成されている。また、ＳＴＲ＿Ａ変数群値代入命令群１６２０が第一条件値代入命令に相当し、ＳＴＲ＿Ｂ変数群値代入命令群１６３０が第二条件値代入命令に相当し、変数群値代入命令群生成部２０９５が条件値代入命令生成手段として構成されている。
【０５４７】
（３．２０）改竄防止処理生成装置１３２０の処理の流れ
図２４は、改竄防止処理生成装置１３２０の動作を示すフローチャートである。図２４を用いて、入力プログラム１３１０を改竄防止プログラム１３３０に変換する処理、つまり難読化の処理の流れを説明する。
【０５４８】
まず、改竄防止処理生成装置１３２０の入力部２０１０は、入力プログラム１３１０と、入力プログラム１３１０におけるＡ命令群１４２０、ＰＲＥ＿Ａ命令群１４１０、ＳＵＣ＿Ａ命令群１４３０、Ｂ命令群１４４０、およびＳＵＣ＿Ｂ命令群１４５０の位置の指定とを受け付け、入力プログラム保持部２０２０に格納する（ステップＳ４００）。
【０５４９】
被代入変数解析部２０３０は、入力プログラム保持部２０２０が保持するＡ命令群１４２０の被代入変数情報を解析し、被代入変数情報保持部２０４０に格納する（ステップＳ４０２）。
【０５５０】
被退避変数解析部２０５０は、入力プログラム保持部２０２０が保持する入力プログラム１３１０中のＳＵＣ＿Ｂ命令群１４５０、および、ＳＵＣ＿Ｂ命令群１４５０以降を実行する際に必要となる変数を特定する。そして、被退避変数解析部２０５０は、特定された変数のうち被代入変数情報保持部２０４０に保持されている変数を被退避変数とし、被退避変数情報保持部２０６０に格納する（ステップＳ４０４）。
【０５５１】
退避命令群生成部２０７０は、退避命令群１６４０を生成して退避命令群保持部２０８０に格納する（ステップＳ４０６）。
【０５５２】
復帰命令群生成部２０９０は、復帰命令群１６５０を生成して復帰命令群保持部２０９１に格納する（ステップＳ４０８）。なお、ステップＳ４０４で被退避変数が１つも見つからなかった場合は、退避命令群１６４０および復帰命令群１６５０を生成する必要がないので、ステップＳ４０６およびステップＳ４０８の処理は行われない。
【０５５３】
条件分岐命令群生成部２０９２は、ＣＢＲ＿ＡＢ条件分岐命令群１６１０を生成し、条件分岐命令群保持部２０９４に格納する（ステップＳ４１０）。
【０５５４】
変数群値代入命令群生成部２０９５は、ＳＴＲ＿Ｂ変数群値代入命令群１６３０およびＳＴＲ＿Ａ変数群値代入命令群１６２０を生成し、変数群値代入命令群保持部２０９６に格納する（ステップＳ４１２）。
【０５５５】
分岐命令群生成部２０９７は、ＢＲ＿Ｂ分岐命令群１６６０を生成し、分岐命令群保持部２０９８に格納する（ステップＳ４１４）。
【０５５６】
改竄防止プログラム生成部２０９９は、改竄防止プログラム１３３０を生成し、改竄防止プログラム出力部２１００に格納する(ステップＳ４１６）。また、改竄防止プログラム出力部２１００は、改竄防止プログラムを記録媒体１３５０に記録する。
【０５５７】
（３．２１）改竄防止処理生成装置１３２０の効果
改竄防止処理生成装置１３２０は、入力として与えられた入力プログラム１３１０を、入力プログラム１３１０と同一の結果が得られる改竄防止プログラム１３３０に変換することが出来る。ここで、不正解析者が改竄防止プログラム１３３０を実際に動かして解析を行ったとしても、入力プログラム１３１０の命令群の実行順序や制御構造を知ることが困難であることは、改竄防止プログラム１３３０の説明にて述べたとおりである。
【０５５８】
また、改竄防止処理生成装置１３２０は、入力プログラム１３１０をより複雑な制御構造を持つ改竄防止プログラム１３３０に難読化することが出来る。
【０５５９】
（その他の変形例）
なお、本発明を上記実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
【０５６０】
（１）実施の形態１およびその変形例ならびに実施の形態２，３では、Ｃ言語の記法に合わせるため、難読化の処理中に変数宣言等の命令を追加していたが、これらの命令を追加するタイミングは、上記で述べたものに限られない。難読化の処理が完了した後、最後にこれらの命令を追加するとしても良いし、他のタイミングで追加するとしても良い。また、難読化後の記述言語によってはこの処理が不要な場合もある。
【０５６１】
（２）実施の形態１およびその変形例ならびに実施の形態２では、実行処理装置と改竄防止処理生成装置とは別装置としていたが、これに限られるものではない。例えば、実行処理装置に改竄防止処理生成装置と同等の機能を持った処理生成部を含ませ、プログラムの実行時には、その処理生成部による難読化を行った上で、実行してもよい。この構成によると、実行されるプログラムは本発明による難読化が行われたプログラムとなるため、実施の形態１および２と同様に不正な改竄および解析を防止することができる。なお、この場合、実行処理装置内でのプログラムの格納場所を耐タンパ化等により保護することにより、オリジナルのプログラムを保護しておくことが望ましいことは言うまでもない。
【０５６２】
さらに、実行処理装置は、プログラム配信サーバから配信されたプログラムを実行する装置であって、改竄防止処理生成装置に加え、更に復号装置を含み、暗号化されて配信されたプログラムを復号化し、さらに難読化を行った上で実行する構成であるとしてもよい。このような構成によると、プログラム配信サーバから配信されたプログラムを実行処理装置で難読化し実行することが出来る。
【０５６３】
また、実施の形態３において、改竄防止処理生成装置と実行処理装置を別々な構成を示したが、同様にこれに限られるものではない。実施の形態１および２と同様に上記のような変形例が考えられる。
【０５６４】
（３）実施の形態３では、被退避変数解析部２０５０は、被代入変数情報保持部２０４０の一部の変数を被退避変数としたが、被代入変数情報保持部２０４０が保持する変数の全てを被退避変数としても構わない。このような構成を用いた場合、退避しなくとも結果に影響が出ない変数まで余分に退避される可能性があるが、被退避変数を選ぶ処理が不要となる分、難読化の処理をより高速にすることが出来る。
【０５６５】
また、Ａ命令群１４２０に含まれる全ての変数を被退避変数としたり、入力プログラム１３１０に含まれる全ての変数を被退避変数とする構成であっても構わない。このような構成を用いれば、被代入変数の解析自体が不要となるので、更に、難読化の処理を高速にすることが出来る。
【０５６６】
（４）実施の形態３では、退避命令群生成部２０７０は、退避命令群１６４０「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２；」を生成するとしたが、「ｖａｒ＿ｓａｖｅ０＝ｖａｒ＿ｏｒｇ２＋２；」などのように、逆変換可能な他の命令を生成しても構わない。その場合、復帰命令群生成部２０９０は、逆変換となる復帰命令群１６５０「ｖａｒ＿ｏｒｇ２  ＝  ｖａｒ＿ｓａｖｅ０−２；」を生成する。なお、逆変換可能な命令を生成する方法は上記にて挙げた方法に限るものではなく、公知の方法を用いても、将来的に考え出される方法を適用してもよい。
【０５６７】
また、一つの被退避変数を、複数の段階の処理によって退避するような退避命令群を生成する構成であっても構わないし、複数の被退避変数に対して、最終的に被退避変数全てが退避されるような複数の退避命令群を生成する構成であっても構わない。すなわち、退避命令群の実行によって最終的に退避変数が退避されるのであれば、退避命令群の構成は問わない。さらに、一部の被退避命令群に対しては複数の退避命令群を生成し、他の被退避命令群については、それぞれ１つの退避命令群を生成するといったようにしても構わない。このような構成を用いれば、不正解析者が、改竄防止プログラムに含まれる命令群の中から退避命令群や復帰命令群を見つけ出すことが困難になる。
【０５６８】
また、退避命令群生成部２０７０は、新たに変数を追加して退避用変数とする構成を説明したが、退避用変数は、難読化のために生成した他の変数と併用する構成であっても構わない。このような変数の例としては、他の手法による難読化において正常系での実行時には実行されないダミーの処理を付加する場合の、ダミー処理中で用いられる変数などが考えられる。また、プログラム中にあって、既に使用されていない変数などを用いても構わない。このような構成を用いれば、不正解析者が改竄防止プログラムで使われる変数のうち、いずれが難読化前からあった変数で、いずれが退避用変数であるかを解析することが困難になる。よって、改竄防止プログラムのなかのどの部分に本手法が適用されているかを知ることが困難になる。
【０５６９】
（５）実施の形態３では、改竄防止プログラム１３３０に含まれる各命令群をそれぞれ独立した命令群として示したが、それらのうち複数を合成した命令群を生成しても構わない。また、実施の形態１およびその変形例ならびに実施の形態２でも、上述と同様、複数の命令群を合成した命令群を生成してもよい。例えば、実施の形態３において、復帰命令群１６５０である「ｖａｒ＿ｏｒｇ２＝  ｖａｒ＿ｓａｖｅ０；」とＳＵＣ＿Ｂ命令群１４５０である「ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＋ｖａｒ＿ｏｒｇ２；ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＊１２３；」とを生成する代わりに、それらを合成した命令群「ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＋ｖａｒ＿ｓａｖｅ０；ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＊１２３；」を生成しても構わない。上記の例では、プログラムの解析により、変数「ｖａｒ＿ｏｒｇ２」の値が「ｖａｒ＿ｓａｖｅ０」の値と同一であることが分かるので、ＳＵＣ＿Ｂ命令群１４５０中のｖａｒ＿ｏｒｇ２をｖａｒ＿ｓａｖｅ０と置き換えている。このような構成を用いれば、不正解析者が改竄防止プログラムから復帰命令群や退避命令群を見つけ出すことが困難になる。よって、改竄防止プログラムのなかのどの部分に本手法が適用されているかを知ることが困難になる。
【０５７０】
なお、上記の例以外にも複数の命令から前後の矛盾なく合成した新しい命令を生成する手法がコンパイラ等の分野で知られている。詳細な説明は省略するが、本手法に対して適宜それらの手法を用いてもよいことは言うまでもない。
【０５７１】
（６）実施の形態３では、分岐命令群生成部２０９７は、ＢＲ＿Ｂ分岐命令群１６６０である「ｇｏｔｏ  Ａ；」の替わりに条件分岐命令群を生成しても構わない。例えば、ＢＲ＿Ｂ分岐命令群１６６０を「ｉｆ（ｖａｒ＿ｏｒｇ２  ＞２００）  ｇｏｔｏ  Ａ；」としても構わない。
【０５７２】
このような構成を用いれば、改竄防止プログラム１３３０の動作はｖａｒ＿ｏｒｇ２の値によって、異なる動作となる。上記の例では、改竄防止プログラム１３３０は、「ｖａｒ＿ｏｒｇ２」の値が「２００」を超えるかどうかに応じて動作を変える。そのため、不正解析者に（本来は特に意味のない値である）「２００」という値が何か重要な値であると思い込ませることができるので、解析作業がより困難になる。
【０５７３】
なお、実施の形態１およびその変形例ならびに実施の形態２においても、上述と同様、分岐命令群生成部２０３，２０３ｂは、分岐処理命令群３２０，３２０ａ，３２０ｂである「ｐｌａｉｎＤａｔａ＝ｄｅｃｒｙｐｔ（ｅｎｃｒｙｐｔｅｄＤａｔａ）」の代わりに条件分岐命令群を生成してもよい。
【０５７４】
（７）実施の形態３では、入力プログラムにおいて、Ａ命令群１４２０がＢ命令群１４４０よりも前にある場合について説明したが、逆であっても構わない。
【０５７５】
（８）実施の形態３では、入力プログラムにおいて、Ａ命令群の分岐元ブロックがＰＲＥ＿Ａ命令群の１つのみである場合を説明したが、分岐元ブロックは複数あっても構わない。分岐元ブロックが第一ＰＲＥ＿Ａ命令群、第二ＰＲＥ＿Ａ命令群、…と複数ある場合には、それぞれの分岐元ブロックに対して同様にＳＴＲ＿Ａ変数群値代入命令群を追加すればよい。このような構成を用いれば、改竄防止処理生成装置１３２０によって制御構造の複雑なプログラムの難読化が可能となる。この場合、各命令群に追加するＳＴＲ＿Ａ変数群値代入命令群を、それぞれ、最終的な計算結果は同一となるものの途中の計算過程が異なる命令としてもよい。これにより、不正解析者に対して、ＳＴＲ＿Ａ変数群値代入命令群がどの命令であるかを分かりにくくすることができる。
【０５７６】
また、実施の形態３では、Ａ命令群一つに対して、Ｂ命令群が一つであったが、これらはどちらか、あるいは両方が複数であっても構わない。このような構成を用いれば、改竄防止プログラムのバリエーションが豊富になり、不正解析者が改竄防止プログラムから入力プログラムを想像することがより困難になる。なお、実施の形態１およびその変形例ならびに実施の形態２においても、上述と同様、矛盾が無い範囲で、同一種の命令群の数が複数あってもよい。
【０５７７】
（９）実施の形態３では、入力プログラムにおけるＢ命令群の分岐先ブロックはＳＵＣ＿Ｂ命令群の１つのみであったが、分岐先ブロックは複数あっても構わない。例えば、Ｂ命令群１４４０の分岐先ブロックが第一ＳＵＣ＿Ｂ命令群と第二ＳＵＣ＿Ｂ命令群である場合、Ｂ命令群１４４０の最後で「ｖａｒ＿ｏｒｇ２」の値によって分岐先を決定する。このように分岐先を決定するＣＢＲ＿Ｂ条件分岐命令は、例えば、「ｉｆ（ｖａｒ＿ｏｒｇ２％２＝＝０）｛ｇｏｔｏ  ＳＵＣ＿Ｂ＿１；｝  ｅｌｓｅ｛ｇｏｔｏ  ＳＵＣ＿Ｂ＿２；｝」として表される。この場合、ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、「ｖａｒ＿ａｂ０％２！＝０」の時は、ＳＵＣ＿Ａを分岐先とし、「ｖａｒ＿ａｂ０％２＝＝０」の時は、「ｖａｒ＿ｏｒｇ２」の値に基づき、分岐先を決定する。すなわち、この処理を行うＣＢＲ＿ＡＢ条件分岐命令群１６１０を、Ｃ言語を用いて具体的に記述すると以下のようになる。
【０５７８】
「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）｛
ｉｆ（ｖａｒ＿ｏｒｇ２％２＝＝０）｛ｇｏｔｏ  ＳＵＣ＿Ｂ＿１；｝
ｅｌｓｅ｛ｇｏｔｏ  ＳＵＣ＿Ｂ＿２；｝
｝」
【０５７９】
なお、「ＳＵＣ＿Ｂ＿１」は第一ＳＵＣ＿Ｂ命令群に付されたラベルであり、「ＳＵＣ＿Ｂ＿２」は第二ＳＵＣ＿Ｂ命令群に付されたラベルである。
【０５８０】
このような、ＣＢＲ＿ＡＢ条件分岐命令群１６１０では、ＰＲＥ＿Ａ命令群が実行された後にＡ命令群が実行された場合には、「ｖａｒ＿ａｂ％２！＝０」となるので、ＣＢＲ＿ＡＢ条件分岐命令群１６１０の直後にあるＳＵＣ＿Ａ命令群が分岐先となる。また、Ｂ命令群が実行された後にＡ命令群が実行された場合には、「ｖａｒ＿ａｂ％２＝＝０」となるので、上述の命令群の２行目から３行目に含まれているＣＢＲ＿Ｂ条件分岐命令の条件に基づき第一ＳＵＣ＿Ｂ命令群または第二ＳＵＣ＿Ｂ命令群が条件分岐先となる。
【０５８１】
なお、ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、上記のように、実施の形態３と同様のＣＢＲ＿ＡＢ条件分岐命令群１６１０にＣＢＲ＿Ｂ条件分岐命令を含ませる構成に限らない。上記の例の場合は、「ｖａｒ＿ａｂ％２！＝０」の時にＳＵＣ＿Ａ命令群が分岐先となり、「ｖａｒ＿ａｂ％２＝＝０」かつ「ｖａｒ＿ｏｒｇ２％２＝＝０」の時に第一ＳＵＣ＿Ｂ命令群が分岐先となり、「ｖａｒ＿ａｂ％２＝＝０」かつ「ｖａｒ＿ｏｒｇ２％２！＝０」の時に第二ＳＵＣ＿Ｂ命令群が分岐先となる処理となれば、ＣＢＲ＿ＡＢ条件分岐命令群１６１０は、他の構成であっても構わない。
【０５８２】
例えば、ＣＢＲ＿ＡＢ条件分岐命令群１６１０を以下のような命令群としてもよい。
【０５８３】
「ｔｍｐ  ＝  （ｖａｒ＿ａｂ０％２）＊２＋（ｖａｒ＿ｏｒｇ２％２）；
ｓｗｉｔｃｈ（ｔｍｐ）｛ ｃａｓｅ  ０：
ｃａｓｅ  １：
ｇｏｔｏ  ＳＵＣ＿Ａ；
ｃａｓｅ  ２：
ｇｏｔｏ  ＳＵＣ＿Ｂ＿１；
ｃａｓｅ  ３：
ｇｏｔｏ  ＳＵＣ＿Ｂ＿２； ｝」
【０５８４】
また、同様に、Ａ命令群の分岐先ブロックについても、ＳＵＣ＿Ａ命令群の１つのみである場合について説明したが、分岐先ブロックは複数あっても構わない。第一ＳＵＣ＿Ａ命令群と第二ＳＵＣ＿Ａ命令群とが、変数「ｖａｒ＿ｏｒｇ２」の値が２の倍数かどうかによって分岐先となる場合における、ＣＢＲ＿ＡＢ条件分岐命令群１６１０の例を以下に示す。
【０５８５】
「ｉｆ（ｖａｒ＿ａｂ０％２＝＝０）｛ｇｏｔｏ  ＳＵＣ＿Ｂ；｝
ｅｌｓｅ｛
ｉｆ（ｖａｒ＿ｏｒｇ２％２＝＝０）｛ｇｏｔｏ  ＳＵＣ＿Ａ＿１；｝
ｅｌｓｅ  ｛ｇｏｔｏ  ＳＵＣ＿Ａ＿２；｝
｝」
【０５８６】
なお、「ＳＵＣ＿Ａ＿１」は第一ＳＵＣ＿Ａ命令群に付されたラベルであり、「ＳＵＣ＿Ａ＿２」は第二ＳＵＣ＿Ａ命令群に付されたラベルである。
【０５８７】
上記の例では、「ｖａｒ＿ａｂ０」が２で割り切れない場合、第一ＳＵＣ＿Ａ命令群へ分岐するか、第二ＳＵＣ＿Ａ命令群へ分岐するかの処理が行われる。なお、ＳＵＣ＿Ａ命令群が複数ある場合のＣＢＲ＿ＡＢ条件分岐命令群１６１０の作り方も上述のものに限られない。具体的な例は、ＳＵＣ＿Ｂ命令群が複数ある場合と同様であるので省略する。
【０５８８】
また、ＳＵＣ＿Ａ命令群およびＳＵＣ＿Ｂ命令群の両方ともが複数あってもよいことはいうまでもない。
【０５８９】
以下、このような構成を用いた場合の効果について述べる。
【０５９０】
不正解析者による攻撃の例として、プログラムの不正改竄を行う際に、条件分岐命令を無条件分岐命令に改竄することが考えられる。例えば、改竄対象のプログラムが、ユーザが入力したＩＤが正しい値であるかをチェックし、正しい値であった場合には第一ＳＵＣ＿Ｂ命令群を行い、間違った値であった場合には第二ＳＵＣ＿Ｂ命令群を行うプログラムである場合に、不正解析者は条件分岐命令を改竄して第一ＳＵＣ＿Ｂ命令群に分岐する無条件分岐命令に改竄することを行う。このような改竄を行うと、正しいＩＤを知らなくとも、正しいＩＤを知っている正規のユーザと同等のプログラムを実行することが出来る。ここで、上述した難読化を行ったプログラムに対して、条件分岐命令を無条件分岐命令に置き換える改竄を行った場合、例えば、上にあげたＣＢＲ＿ＡＢ条件分岐命令群１６１０を「ｇｏｔｏ  ＳＵＣ＿Ｂ＿１；」におきかえた場合、入力されたＩＤが正しい値でない場合であっても第一ＳＵＣ＿Ｂ命令群を行うようにすることが出来る（改竄がなければ、第二ＳＵＣ＿Ｂ命令群が実行されるはずである）。しかし、上述した難読化を施したＣＢＲ＿ＡＢ条件分岐命令群１６１０は、ＳＵＣ＿Ａを実行する前にも呼び出されるので、このような改竄を行うと、ＳＵＣ＿Ａ命令群を行うべき場合にも、無条件で第一ＳＵＣ＿Ｂ命令群が行われてしまうこととなる。よって、このような改竄を行うと、ＳＵＣ＿Ａ命令群の実行自体が行われなくなってしまうという不正解析者が意図しない影響が生じる。このため、不正解析者に対して、自身が行った改竄による影響を把握しにくくすることができるので、不正解析行為および改竄行為を行いにくくなる。
【０５９１】
特に上記の構成と変形例（６）で述べた構成を組み合わせた場合、入力値等によって（例えば、「ｖａｒ＿ｏｒｇ２」の値によって）上記の改竄による影響が発生する場合と発生しない場合とができる。そのため、不正解析者が影響の出ない入力値を使って解析を行った場合に本手法が適用された部分の把握がより困難になり、不正解析行為および改竄行為を行いにくくなる。
【０５９２】
さらにまた、非特許文献１に記載の難読化技術のような実際には分岐しないダミーの分岐先を含む条件分岐命令群を追加しても構わない。具体的には、上記にあげた条件分岐命令群の例に、「ｃａｓｅ  ４」、「ｃａｓｅ  ５」、…とダミーの分岐先を追加しても構わない。このような構成を用いれば、第二ＳＵＣ＿Ｂ命令群へと分岐する箇所のみを第一ＳＵＣ＿Ｂ命令群へ無条件分岐するよう改竄しようとしても、いずれの箇所を改竄すればよいかを知ることが困難になる。また、アセンブリ言語などで記述されたプログラムを難読化する場合には、相対ジャンプを用いた条件分岐命令を用いても構わない。
【０５９３】
さらにまた、第一ＳＵＣ＿Ｂ命令群と同等の処理を行う第一ＳＵＣ＿Ｂ命令群１、第一ＳＵＣ＿Ｂ命令群２、…を設け、本来第一ＳＵＣ＿Ｂ命令群に分岐する条件の時に、上記同等な処理のいずれかに分岐しても構わない。第二ＳＵＣ＿Ｂ命令群、第一ＳＵＣ＿Ａ命令群についても同様である。このようにすることで、不正解析者が、どの命令群が第一ＳＵＣ＿Ｂ命令群等に当たる処理を示しているのかを特定することを困難にすることができる。
【０５９４】
（１０）実施の形態３では、ＳＵＣ＿Ｂ命令群の分岐元はＢ命令群ただ一つである場合について説明したが、Ｂ命令群以外に、ＳＵＣ＿Ｂ命令群の分岐元としてＣ１命令群、Ｃ２命令群、…があっても構わない。その場合、ＳＵＣ＿Ｂ命令群に復帰命令群を追加する都合上、Ｃ１命令群、Ｃ２命令群、…にも復帰命令に対応する退避命令群を追加する必要がある。また、Ｃ１命令群にＳＵＣ＿Ｂ命令群以外の分岐先であるＤ１分岐先命令群、Ｄ２分岐先命令群、…がある場合には、Ｃ１命令群に復帰命令群を追加する都合上、Ｄ１分岐先命令群、Ｄ２分岐先命令群、…にも退避命令群を追加する。
【０５９５】
制御構造の複雑なプログラムに対しては、上記の操作を繰り返し行い、退避命令群を追加する対象となる命令群と復帰命令群を追加する対象となる命令群とを決定する。決定した命令群に退避命令群、復帰命令群の追加を行うことで、本発明による難読化を行うことができる。
【０５９６】
（１１）実施の形態３では、Ｂ命令群の後にＡ命令群が実行された場合、Ａ命令群の実行結果は使用されない構成を示したが、Ａ命令群を行った後の結果をＳＵＣ＿Ｂ命令群で使用する構成としても構わない。この場合は、実施の形態１または２と同様の効果が得られる。
【０５９７】
図２５は、本変形例に係る改竄防止プログラムの構成を示す図である。
【０５９８】
本変形例に係る改竄防止プログラム１３３０ａは、ＰＲＥ＿Ａ命令群１４１０と、ＳＴＲ＿Ａ変数群値代入命令群１６２０と、Ａ命令群１４２０と、ＣＢＲ＿ＡＢ条件分岐命令群１６１０と、ＳＵＣ＿Ａ命令群１４３０と、Ｂ命令群１４４０と、ＳＴＲ＿Ｂ変数群値代入命令群１６３０と、退避命令群１６４０と、被参照変数値代入処理命令群２２１０と、ＢＲ＿Ｂ分岐命令群１６６０と、復帰命令群１６５０と、ＳＵＣ＿Ｂ依存処理命令群２２２０とを含んでいる。
【０５９９】
つまり、本変形例に係る改竄防止プログラム１３３０ａは、実施の形態３の改竄防止プログラム１３３０と比べて、被参照変数値代入処理命令群２２１０をさらに含むとともに、改竄防止プログラム１３３０のＳＵＣ＿Ｂ命令群１４５０の代わりに、ＳＵＣ＿Ｂ依存処理命令群２２２０を含んでいる。
【０６００】
また、本変形例に係る改竄防止プログラム１３３０ａでは、Ａ命令群１４２０は実施の形態１の第一処理命令群１４０に相当し、被参照変数値代入処理命令群２２１０は実施の形態１の被参照変数値代入処理命令群３１０に相当し、ＢＲ＿Ｂ分岐命令群１６６０は実施の形態１の分岐処理命令群３２０に相当し、ＳＵＣ＿Ｂ依存処理命令群２２２０は実施の形態１の依存処理命令群３３０に相当する。
【０６０１】
図２６は、Ｃ言語で表した改竄防止プログラム１３３０ａの具体的な一例を示す図である。
【０６０２】
被参照変数値代入処理命令群２２１０は、Ａ命令群１４２０を呼び出して実行する際に必要となる各種パラメータに値を設定する処理である。具体的には、例えば、被参照変数値代入処理命令群２２１０は、「ｖａｒ＿ｏｒｇ２＝５；」として表され、被参照変数「ｖａｒ＿ｏｒｇ２」に値「５」を代入する処理を示している。
【０６０３】
したがって、ＢＲ＿Ｂ分岐命令群１６６０によって、Ａ命令群１４２０に処理が分岐すると、そのＡ命令群１４２０が改竄されていなければ、Ａ命令群１４２０の処理により被代入変数「ｖａｒ＿ｏｒｇ０」に想定値「４０（＝５×８）」が代入されるとともに、変数「ｖａｒ＿ｏｒｇ２」に７（＝５＋２）が代入される。
【０６０４】
一方、ＳＵＣ＿Ｂ依存処理命令群２２２０は、Ａ命令群１４２０を呼び出した後に実行される処理命令群であり、入力プログラム１３１０のＳＵＣ＿Ｂ命令群１４５０と同等の処理を行うプログラム命令群である。ＳＵＣ＿Ｂ命令群１４５０そのものと異なる点は、ＳＵＣ＿Ｂ命令群１４５０の一部の処理が、Ａ命令群１４２０の処理結果を使用した処理に置き換えられている点である。
【０６０５】
具体的には、例えば、ＳＵＣ＿Ｂ依存処理命令群２２２０は、「ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＋ｖａｒ＿ｏｒｇ２；  ｖａｒ＿ｏｒｇ１＝ｖａｒ＿ｏｒｇ１＊（ｖａｒ＿ｏｒｇ０＊３＋３）」として表される。つまり、ＳＵＣ＿Ｂ依存処理命令群２２２０では、ＳＵＣ＿Ｂ命令群１４５０の「１２３」が、Ａ命令群１４２０の処理結果を使用した「（ｖａｒ＿ｏｒｇ０＊３＋３）」に置き換えられている。
【０６０６】
したがって、ＳＵＣ＿Ｂ依存処理命令群２２２０は、Ａ命令群１４２０の処理により、被代入変数「ｖａｒ＿ｏｒｇ０」の値として想定値「４０」が得られていれば、ＳＵＣ＿Ｂ命令群１４５０と同等の処理を実行することができる。
【０６０７】
図２７は、改竄防止プログラム１３３０ａの処理の流れを示す図である。
【０６０８】
改竄防止プログラム１３３０ａの処理は、図２２に示す改竄防止プログラム１３３０の処理と比べて、さらに、被参照変数値代入処理命令群２２１０を実行する処理（ステップＳ３１５）を含むとともに、図２２に示すステップＳ３２０の処理の代わりに、ＳＵＣ＿Ｂ依存処理命令群２２２０を実行する処理（ステップＳ３２１）を含んでいる。
【０６０９】
すなわち、実行処理装置１３４０は、改竄防止プログラム１３３０ａを実行した場合には、退避命令群１６４０を実行した後（ステップＳ３１４）、被参照変数値代入処理命令群２２１０を実行する（ステップＳ３１５）。その後、実行処理装置１３４０は、ＢＲ＿Ｂ分岐命令群１６６０を実行する（ステップＳ３１６）。また、実行処理装置１３４０は、復帰命令群１６５０を実行した後には（ステップＳ３１８）、ＳＵＣ＿Ｂ依存処理命令群２２２０を実行する（ステップＳ３２１）。
【０６１０】
図２８は、本変形例に係る改竄防止処理生成装置が改竄防止プログラム１３３０ａを生成する動作を説明するための説明図である。
【０６１１】
なお、図２８では、ＰＲＥ＿ＡはＰＲＥ＿Ａ命令群１４１０を示し、ＡはＡ命令群１４２０を示し、ＳＵＣ＿ＡはＳＵＣ＿Ａ命令群１４３０を示し、ＢはＢ命令群１４４０を示し、ＳＵＣ＿ＢはＳＵＣ＿Ｂ命令群１４５０またはＳＵＣ＿Ｂ依存処理命令群２２２０を示す。また、変数「Ｘ０」は変数「ｖａｒ＿ｏｒｇ０」を示し、変数「Ｘ１」は変数「ｖａｒ＿ｏｒｇ１」を示し、変数「Ｘ２」は変数「ｖａｒ＿ｏｒｇ２」を示す。さらに、変数「Ｙ」は変数「ｖａｒ＿ａｂ０」を示し、変数「Ｐ」は変数「ｖａｒ＿ｓａｖｅ０」を示す。
【０６１２】
改竄防止処理生成装置は、入力プログラム１３１０を取得すると、保護対象とすべき命令群を特定し、その保護対象の命令群が複数の処理経路で実行されるように、その入力プログラム１３１０を難読化する。すなわち、改竄防止処理生成装置は、１つの処理経路の一部として存在する保護対象の命令群が改竄された場合には、その改竄によって他の処理経路で異常が発生するような改竄防止プログラム１３３０ａを生成する。
【０６１３】
具体的には、改竄防止処理生成装置は、図２８の（ａ）に示すように、Ｂ命令群１４４０とＳＵＣ＿Ｂ命令群１４５０との間を選択位置に設定する。そして、改竄防止処理生成装置は、図２８の（ｂ）に示すように、その選択位置で保護対象のＡ命令群１４２０が再び実行されるように、入力プログラムの実行経路（処理経路）を変更する。
【０６１４】
すなわち、改竄防止処理生成装置は、Ｂ命令群１４４０からＡ命令群１４２０に処理が分岐するように、ＢＲ＿Ｂ分岐命令群１６６０「ｇｏｔｏ  Ａ」を新経路として追加する。
【０６１５】
このとき、改竄防止処理生成装置は、ＰＲＥ＿Ａ命令群１４１０の後にＡ命令群１４２０が実行されたときには、その後、ＳＵＣ＿Ａ命令群１４３０が実行され、Ｂ命令群１４４０の後にＡ命令群１４２０が実行されたときには、その後、ＳＵＣ＿Ｂ命令群１４５０が実行されるように、幾つかの命令群を追加する。例えば、改竄防止処理生成装置は、ＳＴＲ＿Ａ変数群値代入命令群１６２０「Ｙ＝１」と、ＳＴＲ＿Ｂ変数群値代入命令群１６３０「Ｙ＝８」と、ＣＢＲ＿ＡＢ条件分岐命令群１６１０「ｉｆ（Ｙ％２＝＝０）ｇｏｔｏ  ＳＵＣ＿Ｂ」とを追加する。
【０６１６】
次に、改竄防止処理生成装置は、図２８の（ｃ）に示すように、Ｂ命令群１４４０の後にＡ命令群１４２０が再び実行されるような実行経路の変更によって、ＳＵＣ＿Ｂ命令群１４５０の処理結果が変化しないように、ＳＵＣ＿Ｂ命令群１４５０の整合性を確保する。
【０６１７】
すなわち、改竄防止処理生成装置は、退避命令群１６４０「Ｐ＝Ｘ２」と復帰命令群１６５０「Ｘ２＝Ｐ」とを追加する。これにより、改竄防止処理生成装置は、Ｂ命令群１４４０の後にＡ命令群１４２０が実行されても、その実行結果がＳＵＣ＿Ｂ命令群１４５０の処理結果に影響を与えてしまうのを防ぐことができる。
【０６１８】
さらに、改竄防止処理生成装置は、図２８の（ｄ）に示すように、ＳＵＣ＿Ｂ命令群１４５０の処理結果が、Ｂ命令群１４４０の後に実行されるＡ命令群１４２０の実行結果に依存するように、ＳＵＣ＿Ｂ命令群１４５０をＳＵＣ＿Ｂ依存処理命令群２２２０に変更する。このとき、改竄防止処理生成装置は、被参照変数値代入処理命令群２２１０「Ｘ２＝５」を追加する。
【０６１９】
その結果、Ａ命令群１４２０が改竄されていなければ、Ｂ命令群１４４０の後のＡ命令群１４２０の実行によって変数「Ｘ０」の値として想定値「４０」が得られ、ＳＵＣ＿Ｂ依存処理命令群２２２０は、ＳＵＣ＿Ｂ命令群１４５０と同等の処理となる。一方、Ａ命令群１４２０が改竄されていれば、Ｂ命令群１４４０の後のＡ命令群１４２０の実行によって変数「Ｘ０」の値として想定値「４０」が得られず、ＳＵＣ＿Ｂ依存処理命令群２２２０は、ＳＵＣ＿Ｂ命令群１４５０と異なる異常な処理となる。
【０６２０】
このように本変形例に係る改竄防止処理生成装置は、Ａ命令群１４０の実行結果を使用するＳＵＣ＿Ｂ依存処理命令群２２２０を生成する。これは、本変形例に係る改竄防止処理生成装置が、実施の形態１およびその変形例の改竄防止処理生成装置１１０，１１０ａと同様の構成を有することによって実現される。つまり、本変形例に係る改竄防止処理生成装置は、実施の形態３の図２３に示す改竄防止処理生成装置１３２０に対して、実施の形態１およびその変形例における想定値算出部２９０，２９０ａおよび依存処理命令群生成部２０１，２０１ａなどを追加して構成される。
【０６２１】
ここで、保護対象のＡ命令群１４２０やＳＵＣ＿Ｂ命令群１４５０には、関数の代わりに、ユーザインターフェースや外部アクセスに関するＡＰＩ（Application Program Interface）が含まれていてもよい。
【０６２２】
図２９は、本変形例に係る改竄防止処理生成装置が、ＡＰＩを含む改竄防止プログラムを生成する動作を説明するための説明図である。
【０６２３】
なお、図２９では、ＰＲＥ＿ＡはＰＲＥ＿Ａ命令群を示し、ＡはＡ命令群を示し、ＳＵＣ＿ＡはＳＵＣ＿Ａ命令群を示し、ＢはＢ命令群を示し、ＳＵＣ＿ＢはＳＵＣ＿Ｂ命令群またはＳＵＣ＿Ｂ依存処理命令群を示す。
【０６２４】
ここで、図２９の（ａ）に示すように、Ａ命令群は例えば「Ｘ＝ＧｅｔＴｅｘｔ（Ｖ）」として表される。「ＧｅｔＴｅｘｔ（Ｖ）」は、アドレス変数Ｖの示すアドレスに、ユーザが入力した文字列を格納するＡＰＩである。同様に、ＳＵＣ＿Ｂ命令群は例えば「Ｓ＝ＧｅｔＴｅｘｔ（Ｔ）」として表される。「ＧｅｔＴｅｘｔ（Ｔ）」は、アドレス変数Ｔの示すアドレスに、ユーザが入力した文字列を格納するＡＰＩである。
【０６２５】
つまり、改竄防止処理生成装置は、図２９の（ａ）に示すように、Ａ命令群およびＳＵＣ＿Ｂ命令群にＡＰＩを含む入力プログラムを取得する。このような場合でも、改竄防止処理生成装置は、上述と同様、保護対象とすべき命令群を特定し、その保護対象の命令群が複数の処理経路で実行されるように、その入力プログラムを難読化する。すなわち、改竄防止処理生成装置は、１つの処理経路の一部として存在する保護対象の命令群が改竄された場合には、その改竄によって他の処理経路で異常が発生するような改竄防止プログラムを生成する。
【０６２６】
具体的には、改竄防止処理生成装置は、保護対象となるＡ命令群にＡＰＩが含まれているか否かを判定する。ここで、ＡＰＩが含まれていると判定すると、改竄防止処理生成装置は、そのＡＰＩをコールする他の処理を検索する。その結果、改竄防止処理生成装置は、そのＡＰＩをコールするＳＵＣ＿Ｂ命令群を見つけると、図２９の（ａ）に示すように、Ｂ命令群とそのＳＵＣ＿Ｂ命令群との間を選択位置に設定する。そして、改竄防止処理生成装置は、図２９の（ｂ）に示すように、その選択位置で保護対象のＡ命令群が再び実行されるように、入力プログラムの実行経路（処理経路）を変更する。
【０６２７】
すなわち、改竄防止処理生成装置は、Ｂ命令群からＡ命令群に処理が分岐するように、ＢＲ＿Ｂ分岐命令群「ｇｏｔｏ  Ａ」を新経路として追加する。
【０６２８】
このとき、改竄防止処理生成装置は、ＰＲＥ＿Ａ命令群の後にＡ命令群が実行されたときには、その後、ＳＵＣ＿Ａ命令群が実行され、Ｂ命令群の後にＡ命令群が実行されたときには、その後、ＳＵＣ＿Ｂ命令群が実行されるように、幾つかの命令群を追加する。例えば、改竄防止処理生成装置は、ＳＴＲ＿Ａ変数群値代入命令群「Ｙ＝１」と、ＳＴＲ＿Ｂ変数群値代入命令群「Ｙ＝８」と、ＣＢＲ＿ＡＢ条件分岐命令群「ｉｆ（Ｙ％２＝＝０）ｇｏｔｏ  ＳＵＣ＿Ｂ」とを追加する。
【０６２９】
次に、改竄防止処理生成装置は、図２９の（ｃ）に示すように、Ｂ命令群の後にアドレス変数Ｖの値を変更してＡ命令群が再び実行されても、その変数Ｘおよびアドレス変数Ｖの値がＳＵＣ＿Ｂ命令群以降の処理でも不必要に変更されてしまうことがないように、変数Ｘおよびアドレス変数Ｖの整合性を確保する。すなわち、改竄防止処理生成装置は、退避命令群「Ｐ１＝Ｘ；  Ｐ２＝Ｖ」と復帰命令群「Ｘ＝Ｐ１；  Ｖ＝Ｐ２」とを追加する。
【０６３０】
さらに、改竄防止処理生成装置は、図２９の（ｄ）に示すように、ＳＵＣ＿Ｂ命令群の処理結果が、Ａ命令群の実行結果に依存するように、ＳＵＣ＿Ｂ命令群「Ｓ＝ＧｅｔＴｅｘｔ（Ｔ）」をＳＵＣ＿Ｂ依存処理命令群「Ｓ＝Ｘ；  ＊Ｔ＝＊Ｖ」に変更する。すなわち、改竄防止処理生成装置は、アドレス変数Ｖにより示されるアドレスに処理結果が格納されているので、その処理結果を本来のＳＵＣ＿Ｂ命令群の処理結果の代わりに使用する。なお、このとき、改竄防止処理生成装置は、被参照変数値代入処理命令群「Ｖ＝Ｔ」を追加する。
【０６３１】
その結果、Ａ命令群が改竄されていなければ、ＳＵＣ＿Ｂ依存処理命令群は、ＳＵＣ＿Ｂ命令群と同等の処理となる。一方、Ａ命令群が改竄されていれば、つまり、Ａ命令群がシリアルの入力をする処理である場合に不正解析者が例えば「Ｘ＝（シリアルの値の定数）」とするような改竄を行えば、ＳＵＣ＿Ｂ依存処理命令群は、ＳＵＣ＿Ｂ命令群と異なる異常な処理となる。
【０６３２】
（１２）実施の形態３では、ＰＲＥ＿Ａ命令群、Ａ命令群、ＳＵＣ＿Ａ命令群、Ｂ命令群、およびＳＵＣ＿Ｂ命令群とは同一の入力プログラムに含まれる命令群であるとしたが、別々の関数として実現してもよい。
【０６３３】
例えば、実施の形態１と同様、第一処理命令群に相当するＡ命令群と、第二処理命令群に相当するＢ命令群およびＳＵＣ＿Ｂ命令群とを別々の関数として入力することなどが考えられる。この場合、Ｂ命令群からＡ命令群を含む関数を読み出し、その関数の処理結果を破棄すれば（または、明示的に破棄しなくとも参照しなければ）、ＳＵＣ＿Ｂ命令群以降の処理に命令群Ａの影響が現れないようにしつつ、実施の形態３と同様の難読化を行うことができる。なお、Ａ命令群を含む関数を参照呼びで呼び出す場合などには、引数として与えた変数が変化してしまい、ＳＵＣ＿Ｂ命令群以降の処理に影響が出る恐れがあるので、実施の形態３と同様、退避処理命令群や復帰処理命令群を関数呼び出しの前後に追加する。
【０６３４】
また、実施の形態１およびその変形例では、第一処理命令群と第二処理命令群とは別々に入力されるものであるとしたが、実施の形態３と同様、同一の入力プログラム中、または、同一の関数中の別の処理であるとしても良い。この場合も上記と同様の効果が得られることは言うまでもない。
【０６３５】
（１３）実施の形態３では、Ｂ命令群の後にＡ命令群が実行されるようにするために、ＢＲ＿Ｂ分岐命令群１６６０を用いる構成を説明したが、これに限られるものではない。例えば、分岐命令を使う代わりに、命令群の処理の順番を入れ替え、退避命令群１６４０の直後に、Ａ命令群を配置するとしてもよい。この場合には、ＢＲ＿Ｂ分岐命令群１６６０は不要となるが、命令群の実行順序を入力プログラム１３１０と同じにするため、ＳＴＲ＿Ａ変数群値代入命令群１６２０の後にＡ命令群への分岐命令を挿入する等の変換が必要となる。
【０６３６】
（１４）実施の形態３では、入力プログラムのうち、どの部分をＡ命令群とし、どの部分をＢ命令群とするかをユーザが指定する構成であったが、改竄防止処理生成装置が入力プログラムの中からランダムに選択した命令群をＡ命令群又はＢ命令群とする構成としても構わない。そのような構成をする場合、改竄防止処理生成装置は、Ａ命令群又はＢ命令群の決定後、ＰＲＥ＿Ａ命令群およびＳＵＣ＿Ａ命令群を決定する必要がある。この場合、改竄防止処理生成装置は、決定したＡ命令群の分岐元ブロックを解析し、解析したブロックを第一ＰＲＥ＿Ａ命令群、第二ＰＲＥ＿Ａ命令群、…とする。第一ＰＲＥ＿Ｂ命令群、第二ＰＲＥ＿Ｂ命令群、…についても同様である。また、改竄防止処理生成装置は、命令群の分岐先ブロックを解析し、解析したブロックを第一ＳＵＣ＿Ａ命令群、第二ＳＵＣ＿Ａ命令群、…とする。第一ＳＵＣ＿Ｂ命令群、第二ＳＵＣ＿Ｂ命令群、…についても同様である。
【０６３７】
（１５）実施の形態３では、分岐先決定用のＧ＿ＶＡＬ＿ＡＢ変数は、「ｖａｒ＿ａｂ０」の１つだけであったが、複数であってもよい。この場合、例えば、ＳＵＣ＿Ａ命令群へ分岐すべきか否か示す変数とＳＵＣ＿Ｂ命令群へ分岐すべきか否かを示す変数とを異なる変数にすることなどができる。
【０６３８】
（１６）実施の形態３では、改竄防止処理生成装置１３２０への入力として、ＳＵＣ＿Ａ命令群を含んだ入力プログラムを用いていたが、これに限られるものではない。例えば、Ａ命令群の分岐先である命令がＯＳ側の関数である場合などには、必ずしもＳＵＣ＿Ａ命令群に相当する命令が入力プログラムに含まれない。すなわち、改竄防止処理生成装置１３２０は、ＳＵＣ＿Ａ命令群が入力として与えられない場合でも、Ａ命令群の分岐先である命令のアドレスや関数名さえ分っていれば、そのアドレスや関数名が示す命令群に分岐するようＣＢＲ＿ＡＢ条件分岐命令群を構成することで、難読化ができる。
【０６３９】
（１７）実施の形態１およびその変形例ならびに実施の形態２，３の説明では、プログラム生成の処理の流れの一例を示したが、互いに依存関係のない処理については順序を入替えたり、並列化して実行しても構わない。
【０６４０】
また、ここで述べた難読化を他の難読化手法と一緒に適用しても良い。
【０６４１】
例えば、実施の形態１およびその変形例ならびに実施の形態２，３では、基本的には入力された命令群を、出力する命令群にそのまま含ませていたが、それに限られるものではない。別の難読化手法などにより、入力プログラムに基づいて、各命令群に等価な命令群を生成した上で、その命令群を難読化後のプログラムに含ませても良い。このようにすることで、入力プログラムの命令群と出力されるプログラムの命令群との対応関係を分かりにくくすることができる。ここで、全ての命令群からそれぞれの等価な命令群を生成するのではなく、一部については等価な命令群を生成し、他の命令群については、入力プログラムそのままの命令群を出力するとしてもよい。つまり、本変形例における等価な命令群とは特に何も変換されない命令群も含み、等価な命令群の生成とは入力プログラムから各命令群を抽出するだけの処理も含む。なお、上記の効果を得るためには、各命令群のうち、少なくとも１つが元とは異なるが等価な処理を行う命令群に変換されればよく、他の命令群が元とは異なる命令群に変換されるかどうかは問わない。
【０６４２】
（１８）ここで例えば、図３に示す第二処理命令群１５０を本発明と異なる他の手法により難読化して実行処理装置１３０に実行させる場合には、その難読化された第二処理命令群１５０を解析することなく、それらを他の機器に容易に移植して、その機器においても第二処理命令群１５０を正常に実行させることができる。
【０６４３】
例えば、第二処理命令群１５０では、暗号鍵を用いて復号化が行われる。その暗号鍵や復号化処理の内容は秘密とされるべき情報（秘密情報）であって、解析されてはならない。したがって、上述のように第二処理命令群１５０は難読化される。しかし、第二処理命令群１５０が難読化されて、その秘密情報の解明を防ぐことができても、上述のような移植という不正行為が容易に行われれば、その難読化は無意味になってしまう。また、そのような不正行為を防ぐためには、難読化された第二処理命令群１５０のコードサイズを大幅に増加させる必要がある。
【０６４４】
したがって、実施の形態１およびその変形例の改竄防止処理生成装置１１０では、実行処理装置１３０に元々含まれている命令群を第一処理命令群１４０として用い、処理経路がその第一処理命令群１４０に分岐するように出力処理命令群１６０を生成してもよい。これにより、出力処理命令群１６０のコードサイズの増大を小さく抑えつつ上述のような移植を困難にすることができる。
【０６４５】
図３０は、第一処理命令群１４０が実行処理装置１３０に元々含まれている場合における本発明の効果を説明するための説明図である。
【０６４６】
改竄防止処理生成装置１１０は、保護対象である第二処理命令群１５０を取得する。例えば、第二処理命令群１５０は、処理ブロックＢ０，Ｂ１，…Ｂ９を含んでいる。また、第一処理命令群１４０を構成する処理ブロックＢＡは、実行処理装置１３０に元々含まれている。そこで、改竄防止処理生成装置１１０は、処理経路が処理ブロックＢ０から処理ブロックＢＡに分岐して処理ブロックＢ１に戻るように、第二処理命令群１５０を修正することにより、出力処理命令群１６０を生成する。つまり、改竄防止処理生成装置１１０は、第一処理命令群１４０を保護対象の一部とし、第二処理命令群１５０を出力処理命令群１６０に難読化する。
【０６４７】
その結果、不正解析者は、第二処理命令群１５０による処理を他の機器に実行させるような不正行為を行う場合には、第二処理命令群１５０だけでなく第一処理命令群１４０も移植しなければならない。しかし、第一処理命令群１４０は、実行処理装置にもともと組み込まれている処理を行う命令群であるので、別の装置への移植は困難である。したがって、このような不正行為を困難にすることができる。さらに、第二処理命令群１５０の難読化により、命令群が大幅に増加されることがないので、出力処理命令群１６０のコードサイズの増大を小さく抑えることができる。また、各実行処理装置に固有の処理を行うような命令群を第一処理命令群１４０として選ぶことで、さらに移植を困難にすることができる。
【０６４８】
なお、第一処理命令群１４０は必ずしもプログラム命令である必要はなく、実行処理装置１３０に元々含まれている装置や回路（例えば、オーディオ再生に使用する回路）などとしてもよい。また、移植を困難にするために、実行処理装置１３０に第一処理命令群１４０の役割を担う専用の装置や回路を追加してもよい。これらの場合、分岐処理命令群には、第一処理命令群１４０に分岐する動作の代わりに、上述した装置や回路を動作させる命令を含ませればよい。なお、被参照変数は、例えば、その装置や回路に対する入力となり、被代入変数は、その装置や回路の出力となる。
【０６４９】
このような構成を用いれば、単に実行処理装置１３０で動作するプログラムを移植しても、前記の装置や回路を持たない環境では、移植したプログラムを動作させることが出来なくなるので、不正者がプログラムを移植する攻撃を防止することができる。
【０６５０】
（１９）ここで例えば、暗号などの秘密情報を含む処理（命令群）には、一般的にはあまり使用されないテーブル引きやビットシフト演算などの特徴的な演算（以下、特徴的演算）が含まれる場合がある。したがって、図１６に示す実行処理装置１３４０が入力プログラム１３１０を実行するような場合には、不正解析者は、特徴的演算を目印にして、入力プログラム１３１０から、秘密情報を含む命令群を容易に見つけ出して不正に解析することができる。
【０６５１】
したがって、例えば実施の形態３の改竄防止処理生成装置１３２０では、特徴的演算を含む命令群をＡ命令群１４２０として、改竄防止プログラム１３３０を生成してもよい。
【０６５２】
図３１は、Ａ命令群１４２０が特徴的演算を含む場合における本発明の効果を説明するための説明図である。
【０６５３】
改竄防止処理生成装置１３２０は、入力プログラム１３１０を取得すると、特徴的演算を含む命令群を検索して、見つかった命令群をＡ命令群１４２０として、上述した実施の形態３と同様の難読化処理を行う。その結果、改竄防止処理生成装置１３２０が生成するプログラムは、上述の実施の形態３と同様に、その特徴的演算を含むＡ命令群１４２０が繰り返して実行されるような改竄防止プログラム１３３０となる。
【０６５４】
これにより、改竄防止プログラム１３３０の処理経路において特徴的演算が実行される箇所が増加する。したがって、不正解析者が秘密情報を含む命令群を見つけ出そうとする不正解析を困難にすることができる。
【０６５５】
なお、実施の形態１およびその変形例ならびに実施の形態２においても、上述と同様、改竄防止処理生成装置は、特徴的演算を含む命令群を第一処理命令群として、出力処理命令群を生成してもよい。
【０６５６】
（２０）ここで、実施の形態１およびその変形例ならびに実施の形態２，３では、保護対象となる命令群（第一処理命令群またはＡ命令群）に分岐する分岐処理命令群を生成したが、この分岐処理命令群を生成することなく、図２８の（ｄ）に示すような依存化のみを行ってもよい。
【０６５７】
例えば、コンテンツの再生を制限するプログラムを改竄して、そのプログラムの再生制限を解除してしまうような攻撃が想定される。このようなプログラムは、例えば、コンテンツの再生回数が所定の制限回数以下であれば、そのコンテンツの再生を許可する。または、プログラムは、コンテンツを再生する機器を認証し、正当な機器にのみそのコンテンツの再生を許可する。または、プログラムは、そのコンテンツが不正にコピーされたものであるか否かを判定し、不正にコピーされたものでなければ、そのコンテンツの再生を許可する。
【０６５８】
つまり、不正解析者は、コンテンツの再生許否を判定するための条件分岐命令をそのプログラムから見つけ出して、常に再生許可されるようにその条件分岐命令を無条件分岐命令に改竄しようとする。
【０６５９】
図３２は、不正解析者による改竄の例を示す図である。
【０６６０】
不正解析者は、まず、図３２の（ａ）および（ｂ）に示すように、プログラムを実行させて、再生許可時におけるログと再生不許可時におけるログとを比較する。その結果、不正解析者は、図３２の（ｃ）および（ｄ）に示すように、ログに差異が生じる部位を特定し、その部位の直前にある、コンテンツの再生許否を判定するための条件分岐命令（処理ブロックＢ１９）を見つけ出す。
【０６６１】
そこで、不正解析者は、条件分岐命令である処理ブロックＢ１９を解析し、処理ブロックＢ１９では、再生許可のときに変数ａに１が代入され、再生不許可のときに変数ａに０が代入されることを解明する。したがって、不正解析者は、処理ブロックＢ１９において常に変数ａに１が代入されるように、その処理ブロックＢ１９を条件分岐命令から無条件分岐命令に変更しようとする。
【０６６２】
そこで、この攻撃に対処するために、本発明では、図２８の（ｄ）に示すような依存化のみを行ってもよい。
【０６６３】
図３３は、本変形例に係る改竄防止処理生成装置が依存化のみを行う例を示す図である。
【０６６４】
本変形例に係る改竄防止処理生成装置４００は、図３２に示す条件分岐命令を含むプログラムを入力プログラムＰｉとして取得する。そして、改竄防止処理生成装置４００は、その入力プログラムＰｉの中の再生許可時の処理（被制限処理）に含まれる１つの定数を特定する。つまり、改竄防止処理生成装置４００は、処理ブロックＢ２６に含まれる定数「１０」を見つけ出す。さらに、改竄防止処理生成装置４００は、その入力プログラムＰｉの条件分岐命令（処理ブロックＢ１９）で、コンテンツの再生許否の判定結果が格納される変数である判定変数ａと、再生許可のときにその判定変数ａに格納される判定結果を示す値である被制限値「１」とを処理ブロックＢ１９から抽出する。
【０６６５】
その結果、改竄防止処理生成装置４００は、処理ブロックＢ２６に含まれる定数「１０」を、「ａ＝１」のときにその定数「１０」と等しくなるような数式「ａ＊５＋５」に変換することにより、処理ブロックＢ２６の処理を処理ブロックＢ１９の処理結果（実行結果）に依存させる。
【０６６６】
つまり、改竄防止処理生成装置４００は、入力プログラムＰｉにおいて処理ブロックＢ１９の判定結果に関わらず再生許可時の処理が実行されるように、再生不許可時のエラー処理（処理ブロックＢ３０〜Ｂ３９）を削除するとともに、処理ブロックＢ２６「ｘ＝ｘ＋１０」を、処理ブロックＢ２６ａ「ｘ＝ｘ＋ａ＊５＋５」に置き換えることにより、改竄防止プログラムＰｏを生成する。
【０６６７】
これにより、改竄防止プログラムＰｏでは、処理ブロックＢ２６で再生が許可されたとき、つまり判定変数ａに１が代入されたときには、コンテンツが正常に再生されるような処理が行われる。一方、処理ブロックＢ２６で再生が許可されなかったとき、つまり判定変数ａに０が代入されたときには、コンテンツが正常に再生されるような処理は行われず、異常な処理が行われる。したがって、判定変数ａに正当な値が代入されなかった場合には、コンテンツを正常に再生することができなくなるので、入力プログラムＰｉと同等の処理ができる。
【０６６８】
また、本変形例では、改竄防止プログラムＰｏを実行したときのログが、再生許可時と再生不許可時とで等しくなるため、保護対象となる条件分岐命令が見つけ出されて無条件分岐命令に改竄されるのを困難にすることができる。
【０６６９】
図３４は、本変形例に係る改竄防止処理生成装置４００の構成の一例を示す図である。
【０６７０】
改竄防止処理生成装置４００は、入力プログラム保持部４０１、定数選択部４０２、変数抽出部４０３、変換部４０４、および改竄防止プログラム保持部４０５を備えている。
【０６７１】
入力プログラム保持部４０１は、入力プログラムＰｉを取得して保持する。
【０６７２】
定数選択部４０２は、入力プログラムＰｉの中の再生許可時の処理（被制限処理）を特定し、さらに、その処理に含まれる１つの定数を選択する。
【０６７３】
変数抽出部４０３は、入力プログラムＰｉの中の条件分岐命令において判定結果が格納される判定変数を、その条件分岐命令から抽出する。さらに、変数抽出部４０３は、条件分岐命令において被制限処理を実行すべきと判定されるときにその判定変数に格納される値である被制限値を抽出する。
【０６７４】
なお、判定結果を示す値を判定変数に格納する条件分岐命令は、複数の命令からなる命令群であってもよい。また、判定変数は、入力プログラムＰｉ中に明示的に表れる変数である必要はない。例えば、判定変数はスタックであってもよい。この場合、被制限値とは、そのスタックに格納された値である。また、判定変数は、アドレス変数で指定される位置に対応する記憶領域であってもよい。この場合、被制限値とは、その位置に格納された値である。さらに、被制限値も１つの値に限るものではなく、値の集合であってもよい。この場合、処理ブロックＢ２６ａとして、判定変数に代入された値がこの集合に属するどの値であっても処理ブロックＢ２６と同じ処理を行うような命令群を生成する。このような性質を持つ命令群の生成の仕方は、実施の形態１の変形例６における依存処理命令群の生成の仕方と同様である。
【０６７５】
また、このような条件分岐命令において判定変数に被制限値を代入する処理は、実施の形態１およびその変形例ならびに実施の形態２における第一処理命令群の処理や、実施の形態３のＡ命令群の処理と同様である。
【０６７６】
変換部４０４は、条件分岐命令の判定結果に関わらず被制限処理が実行されるように、入力プログラムＰｉの中のエラー処理を削除する。さらに、変換部４０４は、定数選択部４０２で選択された定数を、判定変数を用いた数式に変換する。なお、変換部４０４は、その定数を、判定変数を用いた関数に変換してもよい。このとき、変換部４０４は、判定変数に被制限値が代入されたときにその数式によって算出される値が上述の定数と等しくなるように数式を生成する。変換部４０４は、このような処理により改竄防止プログラムＰｏを生成して改竄防止プログラム保持部４０５に格納する。なお、変換部４０４は、実施の形態１およびその変形例ならびに実施の形態２の依存処理命令群生成部２０１，２０１ａ，２０１ｂと同様の処理を行うことにより、上述の数式を生成する。
【０６７７】
改竄防止プログラム保持部４０５は、変換部４０４によって生成された改竄防止プログラムＰｏを取得して保持する。
【０６７８】
図３５は、本変形例に係る改竄防止処理生成装置４００の動作の一例を示すフローチャートである。
【０６７９】
改竄防止処理生成装置４００は、まず、入力プログラムＰｉの被制限処理に含まれる定数を選択する（ステップＳ５００）。さらに、改竄防止処理生成装置４００は、入力プログラムＰｉの条件分岐命令から判定変数および被制限値を抽出する（ステップＳ５０２）。そして、改竄防止処理生成装置４００は、ステップＳ５００で選択された定数を、判定変数を用いた数式に変換する（ステップＳ５０４）。また、このとき、改竄防止処理生成装置４００は、条件分岐命令の判定結果に関わらず被制限処理が実行されるように、入力プログラムＰｉの中のエラー処理を削除する。その結果、入力プログラムＰｉは改竄防止プログラムＰｏに変換される。
【０６８０】
（２１）また、実施の形態１およびその変形例では、第二処理命令群１５０が、圧縮されたコンテンツを解凍する処理であるとして説明したが、他の処理であってもよい。さらに、実施の形態１およびその変形例ならびに実施の形態２では、第一処理命令群１４０が、コンテンツの暗号化された再生可能回数を復号して平文の再生可能回数を出力する処理であるとして説明したが、他の処理であってもよい。すなわち、本発明の適用対象は、実施の形態１およびその変形例ならびに実施の形態２で述べた復号処理や解凍処理等を行う命令群に限らない。改竄を防止する必要がある命令群であれば、どのようなものにでも適用できる。例えば、その適用例として、コンテンツの利用権を管理する命令群などが挙げられる。
【０６８１】
（２２）実施の形態１およびその変形例ならびに実施の形態２，３では、各プログラムや命令群がＣ言語のプログラムである場合の例を示したが、これに限られるものではない。それぞれ、他のプログラミング言語、ＵＭＬ等のモデリング言語、コンパイラ等の中間言語、アセンブリ言語、マシン語等であっても構わない。
【０６８２】
（２３）実施の形態１およびその変形例ならびに実施の形態２，３で、難読化する対象はコンピュータプログラミング言語に関わらず、論理回路記述言語等の論理回路の設計の情報（具体的には、ＶＨＤＬ等のハードウェア記述言語で記述されたプログラム等）であっても構わない。難読化により得られるプログラムについても同様である。すなわち、本発明で難読化対象とするプログラムおよび難読化により得られるプログラムは、コンピュータプログラミング言語で記述されたプログラムに限らず、上述した論理回路の設計の情報も含む概念である。
【０６８３】
（２４）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、およびマウスなどから構成されるコンピュータシステムである。そのＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。つまり、マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。なお、各装置は、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどの全てを含むコンピュータシステムには限らず、これらの一部から構成されているコンピュータシステムであってもよい。
【０６８４】
（２５）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、およびＲＡＭなどを含んで構成されるコンピュータシステムである。そのＲＡＭには、コンピュータプログラムが記憶されている。つまり、マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。
【０６８５】
（２６）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。そのＩＣカードまたはモジュールは、マイクロプロセッサ、ＲＯＭ、およびＲＡＭなどから構成されるコンピュータシステムである。そのＩＣカードまたはモジュールは、上記の超多機能ＬＳＩを含むとしてもよい。つまり、マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、そのＩＣカードまたはモジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０６８６】
（２７）本発明は、上記の改竄防止処理生成装置が改竄防止処理を生成する方法としても実現される。また、本発明は、これらの方法によりコンピュータに改竄防止処理を生成させるコンピュータプログラムや、コンピュータプログラムからなるディジタル信号としても実現される。
【０６８７】
（２８）また、本発明は、上述のコンピュータプログラムまたはディジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスクや、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしても実現される。また、これらの記録媒体に記録されているディジタル信号としても実現される。
【０６８８】
（２９）また、本発明は、電気通信回線、無線通信回線、有線通信回線、インターネットを代表とするネットワーク、またはデータ放送等を経由して伝送される、上述のコンピュータプログラムまたはディジタル信号としても実現される。
【０６８９】
（３０）また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムとしても実現される。この場合、そのメモリは、上述のコンピュータプログラムを記憶しており、マイクロプロセッサは、そのコンピュータプログラムにしたがって動作する。
【０６９０】
（３１）また、そのコンピュータプログラムまたはディジタル信号を記録媒体に記録して移送することにより、またはコンピュータプログラムまたはディジタル信号をネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより本発明の処理を実施してもよい。
【０６９１】
（３２）本発明は、これらの実施の形態及び変形例の組合せであってもよい。
【産業上の利用可能性】
【０６９２】
また、本発明に係る命令生成装置は、暗号鍵などの秘密情報を扱うプログラムを、より解析が困難なプログラムに変換することができるので、不正解析者に漏洩すると不利益を招くような秘密情報を用いたソフトウェア等を生成する機器などにおいて有用である。また、本発明に係る命令生成装置により生成されたプログラムは、不正解析者による解析が困難な形をしているので、不正解析者に漏洩すると不利益を招くような秘密情報を用いた処理を行うソフトウェア等を実行する機器などに適用することができる。
【図面の簡単な説明】
【０６９３】
【図１】図１は、従来の改竄チェックの処理を含むプログラムを示す図である。
【図２】図２は、従来の改竄防止処理生成装置の処理を説明するための説明図である。
【図３】図３は、本発明の実施の形態１における処理システムの構成を示す図である。
【図４】図４は、同上の出力処理命令群の構成を示す図である。
【図５Ａ】図５Ａは、Ｃ言語で記述された第一処理命令群の具体例を示す図である。
【図５Ｂ】図５Ｂは、Ｃ言語で記述された第二処理命令群の具体例を示す図である。
【図５Ｃ】図５Ｃは、Ｃ言語で記述された出力処理命令群の具体例を示す図である。
【図６】図６は、同上の改竄防止処理生成装置の構成を示す図である。
【図７】図７は、同上の改竄防止処理生成装置の動作を示すフローチャートである。
【図８】図８は、同上の改竄防止処理生成装置の効果を説明するための説明図である。
【図９】図９は、同上の変形例６に係る改竄防止処理生成装置によって生成された出力処理命令群の具体例を示す図である。
【図１０】図１０は、同上の変形例６に係る改竄防止処理生成装置の構成を示す図である。
【図１１】図１１は、本発明の実施の形態２における処理システムの構成を示す図である。
【図１２】図１２は、同上の出力処理命令群の構成を示す図である。
【図１３】図１３は、同上のＣ言語で記述された出力処理命令群の具体例を示す図である。
【図１４】図１４は、同上の改竄防止処理生成装置の構成を示す図である。
【図１５】図１５は、同上の改竄防止処理生成装置の効果を説明するための説明図である。
【図１６】図１６は、本発明の実施の形態３における処理システムの構成を示す図である。
【図１７】図１７は、同上の入力プログラムの構成を示す図である。
【図１８】図１８は、同上のＣ言語における入力プログラムの具体的な一例を示す図である。
【図１９】図１９は、同上の改竄防止プログラムの構成を示す図である。
【図２０】図２０は、同上のＣ言語で表した改竄防止プログラムの具体的な一例を示す図である。
【図２１】図２１は、同上の入力プログラムの処理の流れを示す図である。
【図２２】図２２は、同上の改竄防止プログラムの処理の流れを示す図である。
【図２３】図２３は、同上の改竄防止処理生成装置の構成を示す図である。
【図２４】図２４は、同上の改竄防止処理生成装置の動作を示すフローチャートである。
【図２５】図２５は、同上の変形例に係る改竄防止プログラムの構成を示す図である。
【図２６】図２６は、同上の変形例に係るＣ言語で表した改竄防止プログラムの具体的な一例を示す図である。
【図２７】図２７は、同上の変形例に係る改竄防止プログラムの処理の流れを示す図である。
【図２８】図２８は、同上の変形例に係る改竄防止処理生成装置が改竄防止プログラムを生成する動作を説明するための説明図である。
【図２９】図２９は、同上の変形例に係る改竄防止処理生成装置が、ＡＰＩを含む改竄防止プログラムを生成する動作を説明するための説明図である。
【図３０】図３０は、本発明の第一処理命令群が実行処理装置に元々含まれている場合における効果を説明するための説明図である。
【図３１】図３１は、本発明のＡ命令群が特徴的演算を含む場合における効果を説明するための説明図である。
【図３２】図３２は、不正解析者による改竄の例を示す図である。
【図３３】図３３は、本発明の実施の形態１〜３の変形例に係る改竄防止処理生成装置が依存化のみを行う例を示す図である。
【図３４】図３４は、同上の変形例に係る改竄防止処理生成装置の構成の一例を示す図である。
【図３５】図３５は、同上の変形例に係る改竄防止処理生成装置の動作の一例を示すフローチャートである。
【符号の説明】
【０６９４】
１００，１００ｂ，１３００    処理システム
１０１，１０１ｂ，１３１０，Ｐｉ    入力プログラム
１０２，１０２ｂ，１３３０，１３３０ａ，Ｐｏ    改竄防止プログラム
１１０，１１０ａ，１１０ｂ，１３２０，４００    改竄防止処理生成装置
１２０，１２０ｂ，１３５０    記録媒体
１３０，１３０ｂ，１３４０    実行処理装置
１４０，１４０ｂ    第一処理命令群
１５０    第二処理命令群
１６０，１６０ａ，１６０ｂ    出力処理命令群
２１０    入力処理命令群保持部
２２０    被参照変数解析部
２３０    被参照変数情報保持部
２４０，２４０ａ    被参照変数値代入処理命令群生成部
２５０    被参照変数値代入処理命令群保持部
２６０，２６０ａ    被参照変数値保持部
２７０    被代入変数解析部
２８０    被代入変数情報保持部
２９０，２９０ａ    想定値算出部
２９５，２９５ａ    想定値情報保持部
２０１    依存処理命令群生成部
２０２    依存処理命令群保持部
２０３    分岐処理命令群生成部
２０４    分岐処理命令群保持部
２０５    出力処理命令群生成部
２０６    出力処理命令群保持部
３１０，３１０ａ，３１０ｂ，２２１０    被参照変数値代入処理命令群
３２０，３２０ａ，３２０ｂ    分岐処理命令群
３３０，３３０ａ，３３０ｂ，２２２０    依存処理命令群
１４１０    ＰＲＥ＿Ａ命令群
１４２０    Ａ命令群
１４３０    ＳＵＣ＿Ａ命令群
１４４０    Ｂ命令群
１４５０    ＳＵＣ＿Ｂ命令群
１６１０    ＣＢＲ＿ＡＢ条件分岐命令群
１６２０    ＳＴＲ＿Ａ変数群値代入命令群
１６３０    ＳＴＲ＿Ｂ変数群値代入命令群
１６４０    退避命令群
１６５０    復帰命令群
１６６０    ＢＲ＿Ｂ分岐命令群
２０１０    入力部
２０２０    入力プログラム保持部
２０３０    被代入変数解析部
２０４０    被代入変数情報保持部
２０５０    被退避変数解析部
２０６０    被退避変数情報保持部
２０７０    退避命令群生成部
２０８０    退避命令群保持部
２０９０    復帰命令群生成部
２０９１    復帰命令群保持部
２０９２    条件分岐命令群生成部
２０９３    分岐条件保持部
２０９４    条件分岐命令群保持部
２０９５    変数群値代入命令群生成部
２０９６    変数群代入命令群保持部
２０９７    分岐命令群生成部
２０９８    分岐命令群保持部
２０９９    改竄防止プログラム生成部
２１００    改竄防止プログラム出力部
【図１】
0005118036.tif 000002
【図２】
0005118036.tif 000003
【図３】
0005118036.tif 000004
【図４】
0005118036.tif 000005
【図５Ａ】
0005118036.tif 000006
【図５Ｂ】
0005118036.tif 000007
【図５Ｃ】
0005118036.tif 000008
【図６】
0005118036.tif 000009
【図７】
0005118036.tif 000010
【図８】
0005118036.tif 000011
【図９】
0005118036.tif 000012
【図１０】
0005118036.tif 000013
【図１１】
0005118036.tif 000014
【図１２】
0005118036.tif 000015
【図１３】
0005118036.tif 000016
【図１４】
0005118036.tif 000017
【図１５】
0005118036.tif 000018
【図１６】
0005118036.tif 000019
【図１７】
0005118036.tif 000020
【図１８】
0005118036.tif 000021
【図１９】
0005118036.tif 000022
【図２０】
0005118036.tif 000023
【図２１】
0005118036.tif 000024
【図２２】
0005118036.tif 000025
【図２３】
0005118036.tif 000026
【図２４】
0005118036.tif 000027
【図２５】
0005118036.tif 000028
【図２６】
0005118036.tif 000029
【図２７】
0005118036.tif 000030
【図２８】
0005118036.tif 000031
【図２９】
0005118036.tif 000032
【図３０】
0005118036.tif 000033
【図３１】
0005118036.tif 000034
【図３２】
0005118036.tif 000035
【図３３】
0005118036.tif 000036
【図３４】
0005118036.tif 000037
【図３５】
0005118036.tif 000038