(57)【要約】  必要情報抽出部１２０は、対象プログラム１０１で使用されている変数のうち出力関数リスト１８２に定義された出力関数によって出力される出力情報が設定される出力変数を抽出する。必要情報抽出部１２０は、対象プログラム１０１で使用されている変数のうち暗号関数リスト１８３に定義された暗号化関数によって暗号化された暗号情報が設定される暗号変数を抽出する。保護状態解析部１３０は、対象プログラム１０１に含まれる代入文を参照し、暗号情報が代入される暗号状態変数を抽出する。脆弱性判定部１４０は、暗号状態変数と出力変数とが同じ変数であるか否かを判定し、判定結果に基づいてプログラム検証結果１９７を出力する。
2014050431.tif 000002
【特許請求の範囲】
【請求項１】
変数と出力関数と暗号化関数とを使用すると共に代入文を含むプログラムを入力するプログラム入力部と、
前記出力関数によって出力される出力情報が設定される出力変数を前記プログラムから抽出する出力変数抽出部と、
前記暗号化関数によって暗号化された暗号情報が設定される暗号変数を前記プログラムから抽出する暗号変数抽出部と、
前記プログラムに含まれる代入文を参照し、前記暗号変数抽出部によって抽出された前記暗号変数に設定された前記暗号情報が代入される暗号状態変数を前記プログラムから抽出する暗号状態変数抽出部と、
前記暗号状態変数抽出部によって抽出された前記暗号状態変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定する暗号状態判定部と、
前記暗号状態判定部の判定結果に基づいて前記プログラムの検証結果を出力する検証結果出力部と
を備えることを特徴とするプログラム検証装置。
【請求項２】
前記プログラム検証装置は、
前記プログラムで使用されている変数のうち、情報取得関数によって取得された保護対象情報が設定される保護対象変数を抽出する保護対象変数抽出部と、
前記保護対象変数抽出部によって抽出された前記保護対象変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定する保護対象判定部とを備え、
前記検証結果出力部は、前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいて前記プログラムの前記検証結果を出力する
ことを特徴とする請求項１記載のプログラム検証装置。
【請求項３】
前記プログラム検証装置は、
前記プログラムで使用されている変数のうち、前記暗号化関数によって使用される暗号鍵が設定される鍵変数を抽出する鍵変数抽出部と、
前記プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が可変値であるか否かを判定する鍵内容判定部とを備え、
前記検証結果出力部は、前記鍵内容判定部の判定結果と前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいて前記プログラムの前記検証結果を出力する
ことを特徴とする請求項２記載のプログラム検証装置。
【請求項４】
前記プログラム検証装置は、
前記プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が秘匿演算によって秘匿される秘匿値であるか否かを判定する鍵状態判定部を備え、
前記検証結果出力部は、前記鍵状態判定部の判定結果と前記鍵内容判定部の判定結果と前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいて前記プログラムの前記検証結果を出力する
ことを特徴とする請求項３記載のプログラム検証装置。
【請求項５】
前記プログラム検証装置は、
前記プログラムで使用されている変数のうち、前記暗号化関数によって使用される暗号鍵が設定される鍵変数を抽出する鍵変数抽出部と、
前記プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が可変値であるか否かを判定する鍵内容判定部とを備え、
前記検証結果出力部は、前記鍵内容判定部の判定結果と前記暗号状態判定部の判定結果とに基づいて前記プログラムの前記検証結果を出力する
ことを特徴とする請求項１記載のプログラム検証装置。
【請求項６】
前記プログラム検証装置は、
前記プログラムで使用されている変数のうち、前記暗号化関数によって使用される暗号鍵が設定される鍵変数を抽出する鍵変数抽出部と、
前記プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が秘匿演算によって秘匿される秘匿値であるか否かを判定する鍵状態判定部を備え、
前記検証結果出力部は、前記鍵状態判定部の判定結果と前記暗号状態判定部の判定結果とに基づいて前記プログラムの前記検証結果を出力する
ことを特徴とする請求項１記載のプログラム検証装置。
【請求項７】
プログラム入力部と、出力変数抽出部と、暗号変数抽出部と、暗号状態変数抽出部と、暗号状態判定部と、検証結果出力部とを備えるコンピュータを用いるプログラム検証方法であって、
前記プログラム入力部が、変数と出力関数と暗号化関数とを使用すると共に代入文を含むプログラムを入力し、
前記出力変数抽出部が、前記出力関数によって出力される出力情報が設定される出力変数を前記プログラムから抽出し、
前記暗号変数抽出部が、前記暗号化関数によって暗号化された暗号情報が設定される暗号変数を前記プログラムから抽出し、
前記暗号状態変数抽出部が、前記プログラムに含まれる代入文を参照し、前記暗号変数抽出部によって抽出された前記暗号変数に設定された前記暗号情報が代入される暗号状態変数を前記プログラムから抽出し、
前記暗号状態判定部が、前記暗号状態変数抽出部によって抽出された前記暗号状態変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定し、
前記検証結果出力部が、前記暗号状態判定部の判定結果に基づいて前記プログラムの検証結果を出力する
ことを特徴とするプログラム検証方法。
【請求項８】
請求項７記載のプログラム検証方法をコンピュータに実行させるためのプログラム検証プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば、プログラムの信頼性を検証するプログラム検証装置、プログラム検証方法およびプログラム検証プログラムに関するものである。
【背景技術】
【０００２】
プログラムの信頼性を検証する技術において、機密情報や個人情報等の重要な情報がプログラムによって外部（インターネット、他のプログラム、他のファイルまたはデータベースなど）へ流れ出る、という脆弱性を突き止める手法がある。
従来技術では、データの流れのみに注目してプログラムを解析するため、適切に暗号化された情報が外部に送出されるケースも脆弱性として誤検出してしまう。
プログラム開発者の立場としては、安全な実装を施したプログラムから脆弱性が誤検出されることは望ましくない。一方、ユーザの立場としては、プログラム内で自らの重要な情報が適切に取り扱われているか否かを確認したいというニーズがある。
ここでいう「重要な情報が適切に取り扱われている」とは以下の条件を満たすことをいう。
・重要な情報が平文のままプログラムから外部に出力されない。
・重要な情報が暗号化された場合において、暗号化に利用する鍵がプログラム内でハードコード（定数化）されていない。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特表２０１０−５０７１６５号公報
【特許文献２】特表２００８−５０２０４６号公報
【非特許文献】
【０００４】
【非特許文献１】中田育男、「コンパイラの構成と最適化」、朝倉書店、１９９９年９月、ＩＳＢＮ４−２５４−１２１３９−３
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明は、例えば、検証する対象である対象プログラムによって出力される情報が暗号化された後に出力される情報であるか否かを検証することを目的とする。
【課題を解決するための手段】
【０００６】
本発明のプログラム検証装置は、
変数と出力関数と暗号化関数とを使用すると共に代入文を含むプログラムを入力するプログラム入力部と、
前記出力関数によって出力される出力情報が設定される出力変数を前記プログラムから抽出する出力変数抽出部と、
前記暗号化関数によって暗号化された暗号情報が設定される暗号変数を前記プログラムから抽出する暗号変数抽出部と、
前記プログラムに含まれる代入文を参照し、前記暗号変数抽出部によって抽出された前記暗号変数に設定された前記暗号情報が代入される暗号状態変数を前記プログラムから抽出する暗号状態変数抽出部と、
前記暗号状態変数抽出部によって抽出された前記暗号状態変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定する暗号状態判定部と、
前記暗号状態判定部の判定結果に基づいて前記プログラムの検証結果を出力する検証結果出力部とを備える。
【発明の効果】
【０００７】
本発明によれば、例えば、検証する対象である対象プログラムによって出力される情報が暗号化された後に出力される情報であるか否かを検証することができる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態１におけるプログラム検証装置１００の構成図。
【図２】実施の形態１における必要情報抽出部１２０の構成図。
【図３】実施の形態１における保護状態解析部１３０の構成図。
【図４】実施の形態１における脆弱性判定部１４０の概要図。
【図５】実施の形態１におけるプログラム検証装置１００のプログラム検証方法を示すフローチャート。
【図６】実施の形態１における必要情報抽出処理（Ｓ１２０）を示すフローチャート。
【図７】実施の形態１における対象プログラム１０１の一例を示す図。
【図８】実施の形態１における情報取得関数リスト１８１の一例を示す図。
【図９】実施の形態１における保護対象抽出リスト１９１の一例を示す図。
【図１０】実施の形態１における出力関数リスト１８２の一例を示す図。
【図１１】実施の形態１における出力関数抽出リスト１９２の一例を示す図。
【図１２】実施の形態１における対象プログラム１０１の一例を示す図。
【図１３】実施の形態１における暗号関数リスト１８３の一例を示す図。
【図１４】実施の形態１における暗号関数抽出リスト１９３の一例を示す図。
【図１５】実施の形態１における対象プログラム１０１の一例を示す図。
【図１６】実施の形態１における変数情報抽出リスト１９４の一例を示す図。
【図１７】実施の形態１における保護状態解析処理（Ｓ１３０）を示すフローチャート。
【図１８】実施の形態１における保護対象状態取得処理（Ｓ２００）の一例を示すフローチャート。
【図１９】実施の形態１における保護対象抽出リスト１９１の一例を示す図。
【図２０】実施の形態１における保護対象状態管理表１９５の初期化の一例を示す図。
【図２１】実施の形態１における保護対象状態管理表１９５の一例を示す図。
【図２２】実施の形態１における対象プログラム１０１の一例を示す図。
【図２３】実施の形態１における保護対象状態管理表１９５の一例を示す図。
【図２４】実施の形態１における保護対象状態管理表１９５の一例を示す図。
【図２５】実施の形態１における暗号関数抽出リスト１９３の一例を示す図。
【図２６】実施の形態１における保護対象状態管理表１９５の一例を示す図。
【図２７】実施の形態１における対象プログラム１０１の一例を示す図。
【図２８】実施の形態１における保護対象抽出リスト１９１の一例を示す図。
【図２９】実施の形態１における暗号関数抽出リスト１９３の一例を示す図。
【図３０】実施の形態１における保護対象状態管理表１９５の一例を示す図。
【図３１】実施の形態１における鍵状態取得処理（Ｓ３００）の一例を示すフローチャート。
【図３２】実施の形態１における鍵状態管理表１９６の構成図。
【図３３】実施の形態１における暗号関数抽出リスト１９３の一例を示す図。
【図３４】実施の形態１における変数情報抽出リスト１９４の一例を示す図。
【図３５】実施の形態１における対象プログラム１０１の一例を示す図。
【図３６】実施の形態１における鍵状態管理表１９６の一例を示す図。
【図３７】実施の形態１における鍵変数解析処理（Ｓ３５０）を示すフローチャート。
【図３８】実施の形態１における脆弱性判定処理（Ｓ１４０）の一例を示すフローチャート。
【図３９】実施の形態１における出力関数抽出リスト１９２の一例を示す図。
【図４０】実施の形態１における鍵状態管理表１９６の一例を示す図。
【図４１】実施の形態１におけるプログラム検証装置１００のハードウェア資源の一例を示す図。
【発明を実施するための形態】
【０００９】
実施の形態１．
検証する対象である対象プログラムが、保護対象情報を適切に暗号化した後に出力するプログラムであるか否かを検証するための形態について説明する。
【００１０】
図１は、実施の形態１におけるプログラム検証装置１００の構成図である。
実施の形態１におけるプログラム検証装置１００について、図１に基づいて説明する。
【００１１】
プログラム検証装置１００は、検証対象のプログラムが保護対象の情報を暗号化によって保護した後に出力する信頼性の高いプログラムであるか検証するコンピュータである。情報はデータともいう（以下同様）。
以下、検証対象のプログラムを「対象プログラム１０１」とし、保護対象の情報を「保護対象情報」とする。
【００１２】
プログラム検証装置１００（プログラム検証装置の一例）は、プログラム入力部１１０、必要情報抽出部１２０、保護状態解析部１３０、脆弱性判定部１４０および検証装置記憶部１９０を備える。
以下に、プログラム検証装置１００の各構成の概要について説明する。プログラム検証装置１００の各構成の詳細については後述する。
【００１３】
プログラム入力部１１０（プログラム入力部の一例）は、対象プログラム１０１を入力する。
【００１４】
必要情報抽出部１２０（出力変数抽出部、暗号変数抽出部、保護対象変数抽出部、鍵変数抽出部の一例）は、プログラム入力部１１０が入力した対象プログラム１０１から検証に必要な各種情報を抽出する。
必要情報抽出部１２０は、各種情報の抽出結果として保護対象抽出リスト１９１、出力関数抽出リスト１９２、暗号関数抽出リスト１９３および変数情報抽出リスト１９４を生成する。
保護対象抽出リスト１９１は、保護対象情報用の変数の変数名の一覧表である。
出力関数抽出リスト１９２は、情報を出力する出力関数の関数名の一覧表である。
暗号関数抽出リスト１９３は、情報を暗号化（または復号）する暗号関数の関数名の一覧表である。
変数情報抽出リスト１９４は、変数の変数名の一覧表である。
【００１５】
保護状態解析部１３０（暗号状態変数抽出部、鍵内容判定部、鍵状態判定部の一例）は、必要情報抽出部１２０による各種情報の抽出結果に基づいて保護対象情報の保護状態について対象プログラム１０１を解析する。
保護状態解析部１３０は、解析結果に基づいて保護対象状態管理表１９５および鍵状態管理表１９６を生成する。
保護対象状態管理表１９５は、保護対象情報用の変数毎に保護対象情報が暗号化されるか否かを示す一覧表である。
鍵状態管理表１９６は、暗号化で使用される暗号鍵毎に暗号鍵が保護されるか否かを示す一覧表である。
【００１６】
脆弱性判定部１４０（暗号状態判定部、保護対象判定部、検証結果出力部の一例）は、保護状態解析部１３０による対象プログラム１０１の解析結果に基づいて対象プログラム１０１に含まれる脆弱な要素を判定し、判定結果をプログラム検証結果１９７として出力する。
適切に暗号化されずに出力される保護対象情報が多いほど対象プログラム１０１は脆弱であり、適切に暗号化されずに出力される保護対象情報が少ないほど対象プログラム１０１の信頼性は高い。
【００１７】
検証装置記憶部１９０（リスト記憶部の一例）は、プログラム検証装置１００で使用するデータを記憶する。
例えば、検証装置記憶部１９０は、以下のようなデータを記憶する。
検証装置記憶部１９０は、プログラム入力部１１０が入力する対象プログラム１０１を記憶する。
検証装置記憶部１９０は、情報取得関数リスト１８１、出力関数リスト１８２、暗号関数リスト１８３およびハッシュ関数リスト１８４を予め記憶する。
検証装置記憶部１９０は、必要情報抽出部１２０によって生成される保護対象抽出リスト１９１、出力関数抽出リスト１９２、暗号関数抽出リスト１９３および変数情報抽出リスト１９４を記憶する。
検証装置記憶部１９０は、保護状態解析部１３０によって生成される保護対象状態管理表１９５および鍵状態管理表１９６を記憶する。
検証装置記憶部１９０は、脆弱性判定部１４０によって生成されるプログラム検証結果１９７を記憶する。
情報取得関数リスト１８１（情報取得関数リストの一例）は、保護対象情報を取得する情報取得関数を定義した一覧表であり、保護対象抽出リスト１９１を生成するために使用される。
出力関数リスト１８２（出力関数リストの一例）は、情報を出力する出力関数を定義した一覧表であり、出力関数抽出リスト１９２を生成するために使用される。
暗号関数リスト１８３（暗号化関数リストの一例）は、情報を暗号化（または復号）する暗号関数を定義した一覧表であり、暗号関数抽出リスト１９３を生成するために使用される。
ハッシュ関数リスト１８４は、一般に利用可能な暗号学的なハッシュ関数（ＳＨＡ１、ＭＤ５など）の一覧表であり、鍵状態管理表１９６を生成するために使用される。
【００１８】
図２は、実施の形態１における必要情報抽出部１２０の構成図である。
実施の形態１における必要情報抽出部１２０の構成について、図２に基づいて説明する。
【００１９】
必要情報抽出部１２０は、保護対象抽出部１２１、出力関数抽出部１２２、暗号関数抽出部１２３および変数情報抽出部１２４を備える。
以下に、必要情報抽出部１２０の各構成の概要について説明する。必要情報抽出部１２０の各構成の詳細については後述する。
【００２０】
保護対象抽出部１２１（保護対象変数抽出部の一例）は、情報取得関数リスト１８１に基づいて対象プログラム１０１から保護対象情報用の変数を抽出し、抽出した変数を一覧にした保護対象抽出リスト１９１を生成する。
出力関数抽出部１２２（出力変数抽出部の一例）は、出力関数リスト１８２に基づいて対象プログラム１０１から出力関数を抽出し、抽出した出力関数を一覧にした出力関数抽出リスト１９２を生成する。
暗号関数抽出部１２３（暗号変数抽出部、鍵変数抽出部の一例）は、暗号関数リスト１８３に基づいて対象プログラム１０１から暗号関数を抽出し、抽出した暗号関数を一覧にした暗号関数抽出リスト１９３を生成する。
変数情報抽出部１２４は、対象プログラム１０１から変数を抽出し、抽出した変数を一覧にした変数情報抽出リスト１９４を生成する。
【００２１】
図３は、実施の形態１における保護状態解析部１３０の構成図である。
実施の形態１における保護状態解析部１３０の構成について、図３に基づいて説明する。
【００２２】
保護状態解析部１３０は、保護対象状態取得部１３１および鍵状態取得部１３２を備える。
以下に、保護状態解析部１３０の各構成の概要について説明する。保護状態解析部１３０の各構成の詳細については後述する。
【００２３】
保護対象状態取得部１３１（暗号状態変数抽出部の一例）は、保護対象抽出リスト１９１と暗号関数抽出リスト１９３とに基づいて対象プログラム１０１を解析し、保護対象情報用の変数毎に変数に設定される保護対象情報が暗号化されるか否かを示す保護対象状態管理表１９５を生成する。
鍵状態取得部１３２（鍵内容判定部、鍵状態判定部の一例）は、暗号関数抽出リスト１９３と変数情報抽出リスト１９４とハッシュ関数リスト１８４とに基づいて対象プログラム１０１を解析し、暗号化で使用される暗号鍵毎に暗号鍵が保護されるか否かを示す鍵状態管理表１９６を生成する。
【００２４】
図４は、実施の形態１における脆弱性判定部１４０の概要図である。
実施の形態１における脆弱性判定部１４０の概要について、図４に基づいて説明する。
【００２５】
脆弱性判定部１４０（暗号状態判定部、保護対象判定部、検証結果出力部の一例）は、出力関数抽出リスト１９２と保護対象状態管理表１９５と鍵状態管理表１９６とに基づいて対象プログラム１０１に含まれる脆弱な要素を判定し、判定結果を示すプログラム検証結果１９７を出力する。
【００２６】
図５は、実施の形態１におけるプログラム検証装置１００のプログラム検証方法を示すフローチャートである。
実施の形態１におけるプログラム検証装置１００のプログラム検証方法について、図５に基づいて説明する。
【００２７】
まず、プログラム検証装置１００のプログラム検証方法の概要について説明する。
Ｓ１１０において、プログラム入力部１１０は対象プログラム１０１を入力する。
Ｓ１２０において、必要情報抽出部１２０は対象プログラム１０１から各種情報を抽出し、各種情報の抽出リストを生成する。
Ｓ１３０において、保護状態解析部１３０は各種情報の抽出リストに基づいて保護対象情報の保護状態について対象プログラム１０１を解析する。
Ｓ１４０において、脆弱性判定部１４０は対象プログラム１０１の解析結果に基づいて対象プログラム１０１に含まれる脆弱な要素を判定し、判定結果を示すプログラム検証結果１９７を生成し、生成したプログラム検証結果１９７を出力する。
【００２８】
次に、Ｓ１１０からＳ１４０の各処理の詳細について説明する。
【００２９】
Ｓ１１０において、利用者は、キーボードやマウスなどの入力装置を用いて、検証したいプログラム（対象プログラム１０１）をプログラム検証装置１００に対して指定する。
プログラム検証装置１００のプログラム入力部１１０は、指定された対象プログラム１０１を入力する。
対象プログラム１０１はソースコードの形式で入力される。対象プログラム１０１がコンパイル済みのバイトコードである場合、プログラム入力部１１０は対象プログラム１０１をソースコードに逆コンパイルする。
例えば、対象プログラム１０１は補助記憶装置に予め記憶され、プログラム入力部１１０は補助記憶装置から対象プログラム１０１を入力する。入力とは、例えば、メモリ（検証装置記憶部１９０）の所定の記憶領域に記憶することである。
Ｓ１１０の後、Ｓ１２０に進む。
【００３０】
図６は、実施の形態１における必要情報抽出処理（Ｓ１２０）を示すフローチャートである。
実施の形態１における必要情報抽出処理（Ｓ１２０）について、図６に基づいて説明する。
【００３１】
必要情報抽出処理（Ｓ１２０）において、必要情報抽出部１２０の各構成はＳ１０１で入力された対象プログラム１０１を先頭行から最終行まで参照し、以下のように各種リストを生成する。
【００３２】
必要情報抽出処理（Ｓ１２０）は、Ｓ１２１からＳ１２４の各処理で構成される。
【００３３】
Ｓ１２１において、保護対象抽出部１２１は、検証装置記憶部１９０から情報取得関数リスト１８１を取得する。
保護対象抽出部１２１は、取得した情報取得関数リスト１８１に基づいて、Ｓ１１０で入力された対象プログラム１０１から保護対象情報が設定される変数を抽出する。以下、保護対象情報が設定される変数を「保護対象変数」という。
保護対象抽出部１２１は、抽出した保護対象変数を一覧にした保護対象抽出リスト１９１を生成する。
Ｓ１２１の後、Ｓ１２２に進む。
【００３４】
図７は、実施の形態１における対象プログラム１０１の一例を示す図である。
図８は、実施の形態１における情報取得関数リスト１８１の一例を示す図である。
図９は、実施の形態１における保護対象抽出リスト１９１の一例を示す図である。
保護対象抽出処理（Ｓ１２１）の一例について、図７から図９に基づいて説明する。
【００３５】
情報取得関数リスト１８１Ａ（図８参照）は、保護対象情報を取得する情報取得関数の一覧表である。情報取得関数リスト１８１Ａは予め生成し、検証装置記憶部１９０に記憶しておく。
情報取得関数リスト１８１Ａは、「関数名」と「保護対象情報」とを対応付けて含んでいる。
「関数名」は情報取得関数の関数名を示す。
「保護対象情報」は情報取得関数によって取得される保護対象情報の内容を示す。
図８の情報取得関数リスト１８１Ａは、例えば、情報取得関数「ｇｅｔＰｒｏｆｉｌｅ」が保護対象情報「プロフィール」を取得するための関数である、ということを示している。
【００３６】
保護対象抽出部１２１は、情報取得関数リスト１８１Ａ（図８参照）に基づいて、対象プログラム１０１Ａ（図７参照）から情報取得関数が使用されている行を抽出する。
例えば、図７の対象プログラム１０１Ａの１行目には情報取得関数「ｇｅｔＰｒｏｆｉｌｅ」が使用されている。
【００３７】
保護対象抽出部１２１は、情報取得関数が使用されている行および情報取得関数リスト１８１Ａに基づいて、保護対象抽出リスト１９１Ａ（図９参照）を生成する。
【００３８】
保護対象抽出リスト１９１Ａは、「変数名」「位置（行番号）」「保護対象情報」および「情報の状態」を対応付けて含んでいる。
「変数名」は、情報取得関数によって取得された保護対象情報が設定される保護対象変数の変数名を示す。
「位置（行番号）」は、保護対象変数に保護対象情報が設定される行の番号を示す。
「保護対象情報」は、保護対象変数に設定される保護対象情報の内容を示す。
「情報の状態」は、保護対象変数に設定される保護対象情報が暗号化された状態（暗号文）と暗号化されていない状態（平文）とのいずれの状態であるかを示す。保護対象抽出部１２１は「情報の状態」の欄に初期値として「平文」を設定する。
図９の保護対象抽出リスト１９１Ａは、例えば、保護対象情報「プロフィール」が対象プログラム１０１Ａ（図７参照）の１行目で保護対象変数「ｐｒｏｆｉｌｅ」に設定される、ということを示している。
【００３９】
図６に戻り、必要情報抽出処理（Ｓ１２０）の説明をＳ１２２から続ける。
【００４０】
Ｓ１２２において、出力関数抽出部１２２は、検証装置記憶部１９０から出力関数リスト１８２を取得する。
出力関数抽出部１２２は、取得した出力関数リスト１８２に基づいて、Ｓ１１０で入力された対象プログラム１０１から出力関数を抽出する。
出力関数抽出部１２２は、抽出した出力関数を一覧にした出力関数抽出リスト１９２を生成する。
Ｓ１２２の後、Ｓ１２３に進む。
【００４１】
図１０は、実施の形態１における出力関数リスト１８２の一例を示す図である。
図１１は、実施の形態１における出力関数抽出リスト１９２の一例を示す図である。
出力関数抽出処理（Ｓ１２２）の一例について、図７、図１０および図１１に基づいて説明する。
【００４２】
出力関数リスト１８２Ａ（図１０参照）は、情報を出力する出力関数の一覧表である。出力関数リスト１８２Ａは予め生成し、検証装置記憶部１９０に記憶しておく。
出力関数リスト１８２Ａは、「関数名」「出力内容」および「出力の状態」を対応付けて含んでいる。
「関数名」は出力関数の関数名を示す。
「出力内容」は出力関数の内容を示す。例えば、ファイル出力用の関数、通信用の関数、プログラム間通信用の関数及びデータベース書き込み用の関数は出力関数の一例である。
「出力の状態」は「暗号文」または「平文」を示す。「暗号文」は出力関数が暗号化した情報を出力することを意味し、「平文」は出力関数が情報を暗号化せずに出力することを意味する。
図１０の出力関数リスト１８２Ａは、例えば、出力関数「ｏｕｔｐｕｔ」がファイルを暗号化せずに出力する、ということを示している。
【００４３】
出力関数抽出部１２２は、出力関数リスト１８２Ａ（図１０参照）に基づいて、対象プログラム１０１Ａ（図７参照）から出力関数が使用されている行を抽出する。
例えば、図７の対象プログラム１０１Ａの９行目には出力関数「ｏｕｔｐｕｔ」が使用されている。
【００４４】
出力関数抽出部１２２は、出力関数が使用されている行および出力関数リスト１８２Ａに基づいて、出力関数抽出リスト１９２Ａ（図１１参照）を生成する。
【００４５】
出力関数抽出リスト１９２Ａは、「関数名」「位置（行番号）」「実引数」および「出力の状態」を対応付けて含んでいる。
「関数名」は、対象プログラム１０１Ａで使用されている出力関数の関数名を示す。
「位置（行番号）」は、出力関数が使用されている行の番号を示す。
「実引数」は、出力関数の引数、つまり、出力関数によって出力される出力情報用の変数を示す。引数は変数の一種である（以下同様）。以下、出力関数によって出力される出力情報用の変数を「出力変数」という。
「出力の状態」は、出力関数によって出力される出力情報の状態（平文または暗号文）を示す。
図１１の出力関数抽出リスト１９２Ａは、例えば、出力関数「ｏｕｔｐｕｔ」が対象プログラム１０１Ａ（図７参照）の９行目で出力変数「ｎａｍｅ」「ａｇｅ」「ｓｅｘ」の設定値（出力情報）を「平文」の状態で出力する、ということを示している。
【００４６】
図６に戻り、必要情報抽出処理（Ｓ１２０）の説明をＳ１２３から続ける。
【００４７】
Ｓ１２３において、暗号関数抽出部１２３は、検証装置記憶部１９０から暗号関数リスト１８３を取得する。
暗号関数抽出部１２３は、取得した暗号関数リスト１８３に基づいて、Ｓ１１０で入力された対象プログラム１０１から暗号関数を抽出する。
暗号関数抽出部１２３は、抽出した暗号関数を一覧にした暗号関数抽出リスト１９３を生成する。
Ｓ１２３の後、Ｓ１２４に進む。
【００４８】
図１２は、実施の形態１における対象プログラム１０１の一例を示す図である。
図１３は、実施の形態１における暗号関数リスト１８３の一例を示す図である。
図１４は、実施の形態１における暗号関数抽出リスト１９３の一例を示す図である。
暗号関数抽出処理（Ｓ１２３）の一例について、図１２から図１４に基づいて説明する。
【００４９】
暗号関数リスト１８３Ｂ（図１３参照）は、情報を暗号化または復号する暗号関数の一覧表である。以下、情報を暗号化する暗号関数を「暗号化関数」といい、情報を復号する暗号関数を「復号関数」という。
暗号関数リスト１８３Ｂは予め生成し、検証装置記憶部１９０に記憶しておく。
暗号関数リスト１８３Ｂは、「関数名」「鍵の位置」および「処理内容」を対応付けて含んでいる。
「関数名」は暗号関数の関数名を示し、「鍵の位置」は暗号関数の引数のうち暗号鍵または復号鍵が設定される引数の引数名を示す。「処理内容」は暗号関数の処理が暗号化と復号とのいずれの処理であるかを示す。
図１３の暗号関数リスト１８３Ｂは、例えば、暗号化関数「ｅｎｃ」が「第２引数」の情報を暗号鍵として用いて「暗号化」の処理を行う、ということを示している。
【００５０】
暗号関数抽出部１２３は、暗号関数リスト１８３Ｂ（図１３参照）に基づいて、対象プログラム１０１Ｂ（図１２参照）から暗号関数が使用されている行を抽出する。
例えば、図１２の対象プログラム１０１Ｂの９行目には暗号化関数「ｅｎｃ」が使用されている。
【００５１】
暗号関数抽出部１２３は、暗号関数が使用されている行および暗号関数リスト１８３Ｂに基づいて、暗号関数抽出リスト１９３Ｂ（図１４参照）を生成する。
【００５２】
暗号関数抽出リスト１９３Ｂは、「関数名」「位置（行番号）」「関数の実引数」「鍵用の実引数」「出力用の変数」および「出力の状態」を対応付けて含んでいる。
「関数名」は、暗号関数の関数名を示す。
「位置（行番号）」は、暗号関数が使用されている行の番号を示す。
「関数の実引数」は、暗号関数に設定されている引数を示す。
「鍵用の実引数」は、暗号関数に設定されている引数のうち暗号鍵が設定される引数を示す。
「出力用の変数」は、暗号関数によって処理された情報が設定される変数を示す。以下、暗号関数によって処理された情報が設定される変数を「暗号変数」という。
「出力の状態」は、暗号関数によって処理された情報が暗号化された状態と復号された状態とのいずれの状態であるかを示す。
図１４の暗号関数抽出リスト１９３Ｂは、例えば、暗号化関数「ｅｎｃ」が対象プログラム１０１Ｂ（図１２参照）の９行目で引数「ｋｅｙ」に設定される暗号鍵を用いて引数「ｔｅｌ」に設定される情報を暗号化すること、および暗号化関数「ｅｎｃ」が暗号化した情報を暗号変数「ｅｎｃ＿ｔｅｌ」に設定することを示している。
【００５３】
図６に戻り、必要情報抽出処理（Ｓ１２０）の説明をＳ１２４から続ける。
【００５４】
Ｓ１２４において、変数情報抽出部１２４は、Ｓ１１０で入力された対象プログラム１０１から変数を抽出し、抽出した変数を一覧にした変数情報抽出リスト１９４を生成する。
このとき、変数情報抽出部１２４は、コンパイラの一般的なコード最適化技術として知られている定数伝播を、変数を抽出するための処理として利用することができる（非特許文献１参照）。
Ｓ１２４により、必要情報抽出処理（Ｓ１２０）は終了する。
【００５５】
図１５は、実施の形態１における対象プログラム１０１の一例を示す図である。
図１６は、実施の形態１における変数情報抽出リスト１９４の一例を示す図である。
変数情報抽出処理（Ｓ１２４）の一例について、図１５および図１６に基づいて説明する。
【００５６】
変数情報抽出部１２４は、図１５の対象プログラム１０１Ｃから、代入文の代入先（左辺）または関数の引数として使用されている６つの変数「ｐｒｏｆｉｌｅ」「ｎａｍｅ」「ａｇｅ」「ｋｅｙ」「ｈ＿ｋｅｙ」「ｅｎｃ＿ｔｅｌ」を抽出する。
変数情報抽出部１２４は、抽出した変数の情報を変数情報抽出リスト１９４Ｃ（図１６参照）に設定する。
【００５７】
変数情報抽出リスト１９４Ｃは、「変数名」「位置（行番号）」「変数の内容」を対応付けて含んでいる。
「変数名」は、対象プログラム１０１Ｃで使用されている変数を示す。
「位置（行番号）」は、変数が使用されている行の番号を示す。
「変数の内容」は、変数に設定される値が「可変」であるか又は「不変」（定数）であるかを示す。
【００５８】
但し、変数は「可変」と「不変」との２種類以外の種類に分類しても構わない。
例えば、外部入力関数の出力値「入力変数」または時間取得関数の出力値「時間変数」を変数の種類に加えても構わない。
例えば、関数が「不変」の変数だけを引数として含む場合、その関数の出力値が設定される変数の内容は「不変」である。関数が「入力変数」を引数として含む場合、その関数の出力値が設定される変数の内容は「入力変数」である。関数が「入力変数」を引数として含まずに「時間変数」を引数として含む場合、その関数の出力値が設定される変数の内容は「時間変数」である。また、関数が「入力変数」または「時間変数」を引数として含まずに「可変」の変数を引数として含む場合、その関数の出力値が設定される変数の内容は「可変」である。
【００５９】
例えば、図１５の対象プログラム１０１Ｃで使用されている変数の内容は以下のとおりである。
１行目から３行目において、引数を持たない関数（ｇｅｔＰｒｏｆｉｌｅ（）など）の出力値が代入される代入先の変数「ｐｒｏｆｉｌｅ」「ｎａｍｅ」「ａｇｅ」の内容は「可変」である。
４行目において、定数「１２３４５」が設定される変数「ｋｅｙ」の内容は「不変」である。
５行目において、不変の変数だけを引数として含んでいる関数（ｈａｓｈ）の出力値が設定される変数「ｈ＿ｋｅｙ」の内容は「不変」である。
６行目において、可変の変数（ｎａｍｅ）を引数として含んでいる関数（ｅｎｃ）の出力値が設定される変数「ｅｎｃ＿ｔｅｌ」の内容は「可変」である。
【００６０】
図１６の変数情報抽出リスト１９４Ｃは、例えば、可変の変数「ｐｒｏｆｉｌｅ」が対象プログラム１０１Ｃの１行目に使用されていること、及び、不変の変数「ｋｅｙ」が対象プログラム１０１Ｃの４から６行目に使用されていることを示している。
【００６１】
図６で説明した必要情報抽出処理（Ｓ１２０）のＳ１２１からＳ１２４の各処理は、順番を入れ替えて実行しても、並行して実行しても構わない。
必要情報抽出処理（Ｓ１２０）の後、保護状態解析処理（Ｓ１３０）に進む（図５参照）。
【００６２】
図１７は、実施の形態１における保護状態解析処理（Ｓ１３０）を示すフローチャートである。
実施の形態１における保護状態解析処理（Ｓ１３０）について、図１７に基づいて説明する。
保護状態解析処理（Ｓ１３０）は、Ｓ２００およびＳ３００の各処理で構成される。
【００６３】
Ｓ２００において、保護対象状態取得部１３１は、Ｓ１２１（図６参照）で生成された保護対象抽出リスト１９１と、Ｓ１２３（図６参照）で生成された暗号関数抽出リスト１９３とに基づいて、対象プログラム１０１を解析する。
そして、保護対象状態取得部１３１は、解析結果に基づいて保護対象状態管理表１９５を生成する。
保護対象状態取得処理（Ｓ２００）の一例について後述する。
Ｓ２００の後、Ｓ３００に進む。
【００６４】
Ｓ３００において、鍵状態取得部１３２は、Ｓ１２３（図６参照）で生成された暗号関数抽出リスト１９３と、Ｓ１２４（図６参照）で生成された変数情報抽出リスト１９４と、検証装置記憶部１９０に予め記憶されるハッシュ関数リスト１８４とに基づいて、対象プログラム１０１を解析する。
そして、鍵状態取得部１３２は、解析結果に基づいて鍵状態管理表１９６を生成する。
鍵状態取得処理（Ｓ３００）の一例について後述する。
Ｓ３００により、保護状態解析処理（Ｓ１３０）は終了する。
【００６５】
図１７で説明した保護状態解析処理（Ｓ１３０）のＳ２００およびＳ３００は、順番を入れ替えて実行しても、並行して実行しても構わない。
【００６６】
図１８は、実施の形態１における保護対象状態取得処理（Ｓ２００）の一例を示すフローチャートである。
実施の形態１における保護対象状態取得処理（Ｓ２００）の一例について、図１８に基づいて説明する。
保護対象状態取得処理（Ｓ２００）は、Ｓ２１０からＳ２６１の各処理で構成される。
【００６７】
Ｓ２１０において、保護対象状態取得部１３１は、対象プログラム１０１の処理の流れを表すフローグラフを生成する。
フローグラフとは、プログラム内の一つの命令（および行番号）を表すノードと、ノード同士を処理順につなぐエッジとを用いて、プログラムの全ての処理経路（処理順序）を表すグラフのデータである。
例えば、保護対象状態取得部１３１は、既存のツールを利用して対象プログラム１０１のフローグラフを生成する。
Ｓ２１０の後、Ｓ２２０に進む。
【００６８】
Ｓ２２０において、保護対象状態取得部１３１は、保護対象状態管理表１９５を生成し、保護対象抽出リスト１９１に基づいて保護対象状態管理表１９５を初期化する。
Ｓ２２０の後、Ｓ２３０に進む。
【００６９】
図１９は、実施の形態１における保護対象抽出リスト１９１の一例を示す図である。
図２０は、実施の形態１における保護対象状態管理表１９５の初期化の一例を示す図である。
管理表初期化処理（Ｓ２２０）の一例について、図１９および図２０に基づいて説明する。
【００７０】
保護対象状態管理表１９５Ｄ（図２０参照）は、「行番号」「平文」および「暗号文」を対応付けて含んでいる。
「行番号」は対象プログラム１０１の行番号を示す。
「平文」は暗号化されていない保護対象変数を示す。以下、暗号化されていない保護対象変数を「平文状態変数」という。
「暗号文」は暗号化された保護対象変数を示す。以下、暗号化された保護対象変数を「暗号状態変数」という。
【００７１】
図１９の保護対象抽出リスト１９１Ｄは、「平文」状態の保護対象変数「ｐｒｏｆｉｌｅ」が対象プログラム１０１の１行目で設定され、「平文」状態の保護対象変数「ｎａｍｅ」が対象プログラム１０１の２行目で設定されていることを示している。
そこで、保護対象状態取得部１３１は、図２０に示すように、保護対象状態管理表１９５Ｄの行番号「１行目」に対応付けられた「平文」の欄に保護対象変数「ｐｒｏｆｉｌｅ」を設定する。
また、保護対象状態取得部１３１は、保護対象状態管理表１９５Ｄの行番号「２行目」に対応付けられた「平文」の欄に保護対象変数「ｎａｍｅ」を設定する。
つまり、保護対象状態取得部１３１は、保護対象抽出リスト１９１Ｄに基づいて、保護対象変数が設定されている行の番号と保護対象変数の状態とに対応付けて保護対象変数の変数名を保護対象状態管理表１９５Ｄに設定する。
図２０に示す保護対象状態管理表１９５Ｄは、図１９に示す保護対象抽出リスト１９１Ｄに基づいて初期化した状態である。
【００７２】
図１８に戻り、保護対象状態取得処理（Ｓ２００）の説明をＳ２３０から続ける。
【００７３】
Ｓ２３０において、保護対象状態取得部１３１は、Ｓ２１０で生成したフローグラフの先頭ノードを処理ポインタで指定する。ここで、処理ポインタとは処理するノードを指定するものである。
Ｓ２３０の後、Ｓ２３１に進む。
【００７４】
Ｓ２３１において、保護対象状態取得部１３１は、Ｓ２１０で生成したフローグラフから、処理ポインタで指定されたノードをメモリに読み込む。
以下、Ｓ２３１で読み込んだノードを「注目ノード」とし、Ｓ２３１で読み込んだノードが表す命令を「注目ノード命令」とする。
【００７５】
さらに、保護対象状態取得部１３１は、フローグラフに基づいて注目ノードの一つ前のノードを特定し、特定したノードと同じ行番号に対応付けられた平文状態変数および暗号状態変数を保護対象状態管理表１９５から取得する。
そして、取得した平文状態変数および暗号状態変数が、注目ノード命令で、上書きされていないことを確認する。注目ノード命令が代入文であり、代入文の左辺が平文状態変数または暗号状態変数であれば、その平文状態変数または暗号状態変数は上書きされている。
上書きされていなければ、保護対象状態取得部１３１は、取得した平文状態変数および暗号状態変数を注目ノードと同じ行番号に対応付けて保護対象状態管理表１９５に追加する。
例えば、保護対象状態管理表１９５Ｄが図２０に示す状態である場合、保護対象状態取得部１３１は、注目ノードの一つ前の行番号「１行目」の平文「ｐｒｏｆｉｌｅ」を注目ノードの行番号「２行目」の平文に追加する。これにより、保護対象状態管理表１９５Ｄは図２１に示す状態になる。
図２１は、実施の形態１における保護対象状態管理表１９５の一例を示す図である。
Ｓ２３１の後、Ｓ２３２に進む。
【００７６】
Ｓ２３２において、保護対象状態取得部１３１は、Ｓ２３１で読み込んだ注目ノードが表す注目ノード命令が代入文であるか否かを判定する。
注目ノード命令が代入文である場合（ＹＥＳ）、Ｓ２４０に進む。
注目ノード命令が代入文でない場合（ＮＯ）、Ｓ２６０に進む。
【００７７】
Ｓ２４０において、保護対象状態取得部１３１は、注目ノード命令（代入文）の右辺（代入元）を以下の（１）（２）のように解析する。
（１）保護対象状態取得部１３１は、保護対象状態管理表１９５に設定された保護対象変数が注目ノード命令の右辺に含まれているか否かを解析する。
（２）保護対象状態取得部１３１は、暗号関数抽出リスト１９３を参照し、注目ノード命令の右辺が暗号関数抽出リスト１９３に設定された暗号化関数と保護対象状態管理表１９５に設定された暗号状態変数とのいずれかであるかを解析する。
Ｓ２４０の後、Ｓ２５０に進む。
【００７８】
Ｓ２５０において、保護対象状態取得部１３１は、Ｓ２４０の解析結果に基づいて、保護対象変数が注目ノード命令（代入文）の右辺（代入元）に含まれているか否かを判定する。
保護対象変数が注目ノード命令の右辺に含まれている場合（ＹＥＳ）、Ｓ２５１に進む。
保護対象変数が注目ノード命令の右辺に含まれていない場合（ＮＯ）、Ｓ２６０に進む。
【００７９】
Ｓ２５１において、保護対象状態取得部１３１は、Ｓ２４０の解析結果に基づいて、注目ノード命令（代入文）の右辺（代入元）が暗号化関数と暗号状態変数とのいずれかであるか否かを判定する。
注目ノード命令の右辺が暗号化関数と暗号状態変数とのいずれかである場合（ＹＥＳ）、Ｓ２５２に進む。
注目ノード命令の右辺が暗号化関数と暗号状態変数とのいずれでもない場合（ＮＯ）、Ｓ２５３に進む。
【００８０】
Ｓ２５２において、保護対象状態取得部１３１は、注目ノード命令（代入文）の左辺（代入先）の変数名を注目ノードの行番号に対応付けて保護対象状態管理表１９５の項目「暗号文」に追加する。保護対象状態管理表１９５の項目「暗号文」に追加される変数は暗号状態変数の一例である。
また、注目ノード命令の右辺が暗号化関数である場合、保護対象状態取得部１３１は、追加する暗号状態変数に対応付けて、暗号化関数の関数名および暗号化関数が使用されている行の番号を設定する。
さらに、保護対象状態取得部１３１は、その暗号化関数の鍵変数名を暗号関数抽出リスト１９３から取得し、取得した鍵変数名を注目ノードの行番号に対応付けて保護対象状態管理表１９５の項目「平文」に追加する。保護対象状態管理表１９５の「平文」の項目に追加される鍵変数は平文状態変数の一例である。
【００８１】
例えば、図２２に示す対象プログラム１０１Ｄの７行目（代入文）の右辺は暗号化関数「ｅｎｃ（ｎａｍｅ１，ｋｅｙ）」であり、鍵変数は「ｋｅｙ」である。
注目ノードの行番号が７行目である場合、保護対象状態取得部１３１は、対象プログラム１０１Ｄの７行目の左辺の変数名「ｅｎｃ＿ｎａｍｅ」を注目ノードの行番号「７行目」に対応づけて保護対象状態管理表１９５Ｄの項目「暗号文」に追加する。
また、保護対象状態取得部１３１は、追加した変数名「ｅｎｃ＿ｎａｍｅ」に対応付けて暗号化関数名「ｅｎｃ」と行番号「７行目」とを保護対象状態管理表１９５Ｄに設定する。
さらに、保護対象状態取得部１３１は、鍵変数名「ｋｅｙ」を注目ノードの行番号「７行目」に対応付けて保護対象状態管理表１９５Ｄの項目「平文」に追加する。
これにより、保護対象状態管理表１９５Ｄは図２３の状態になる。
図２２は、実施の形態１における対象プログラム１０１の一例を示す図である。
図２３は、実施の形態１における保護対象状態管理表１９５の一例を示す図である。
Ｓ２５２の後、Ｓ２６０に進む。
【００８２】
Ｓ２５３において、保護対象状態取得部１３１は、注目ノード命令（代入文）の左辺（代入先）の変数名を注目ノードの行番号に対応付けて保護対象状態管理表１９５の項目「平文」に追加する。保護対象状態管理表１９５の項目「平文」に追加される変数は平文状態変数の一例である。
また、注目ノード命令の右辺が復号関数である場合、保護対象状態取得部１３１は、追加する平文状態変数に対応付けて復号関数の関数名および復号関数が使用されている行の番号を設定する。
【００８３】
例えば、図２２に示す対象プログラム１０１Ｄの３行目（代入文）の右辺は暗号化されていない保護対象変数「ｎａｍｅ」である。
注目ノードの行番号が３行目である場合、保護対象状態取得部１３１は、対象プログラム１０１の３行目の左辺の変数名「ｎａｍｅ１」を注目ノードの行番号「３行目」に対応付けて保護対象状態管理表１９５Ｄの項目「平文」に追加する。
これにより、保護対象状態管理表１９５Ｄは図２４の状態になる。
図２４は、実施の形態１における保護対象状態管理表１９５の一例を示す図である。
Ｓ２５３の後、Ｓ２６０に進む。
【００８４】
Ｓ２６０において、保護対象状態取得部１３１は、処理ポインタで指定されている注目ノードがフローグラフの最終ノードであるか否かを判定する。
注目ノードが最終ノードである場合（ＹＥＳ）、Ｓ２６１に進む。
注目ノードが最終ノードでない場合（ＮＯ）、保護対象状態取得部１３１は、注目ノードの次のノードを新たな注目ノードとして処理ポインタで指定する。その後、Ｓ２３１に戻る。
【００８５】
Ｓ２６１において、保護対象状態取得部１３１は、保護対象状態管理表１９５が変化したか否かを判定する。つまり、Ｓ２３１からＳ２６０までのループでＳ２５２又はＳ２５３が実行されたか否かを判定する。Ｓ２５２又はＳ２５３が実行されていれば、保護対象状態管理表１９５は変化している。
例えば、保護対象状態取得部１３１は、Ｓ２５２又はＳ２５３を実行したときに、保護対象状態管理表１９５が変化したことを示す変化フラグ値を変化フラグに設定する。そして、保護対象状態取得部１３１は、変化フラグに変化フラグ値が設定されているか否かを判定する。判定後、保護対象状態取得部１３１は、保護対象状態管理表１９５が変化していないことを示す無変化フラグ値で変化フラグを初期化する。
【００８６】
但し、保護対象状態取得部１３１は、Ｓ２３０で保護対象状態管理表１９５をコピーし、コピーした保護対象状態管理表１９５と現在の保護対象状態管理表１９５とを比較することによって保護対象状態管理表１９５が変化したか否かを判定しても構わない。
【００８７】
保護対象状態管理表１９５が変化しないということは、例えば、フローグラフの全てのノードについて処理を終えたこと、つまり、フローグラフの全ての処理経路について処理を終えたことを意味する。
そこで、保護対象状態取得部１３１は、保護対象状態管理表１９５が変化したか否かを判定する代わりに、フローグラフの全てのノードについて処理を終えたか否か、つまり、フローグラフの全ての処理経路について処理を終えたか否かを判定しても構わない。
【００８８】
保護対象状態管理表１９５が変化した場合（ＹＥＳ）、Ｓ２３０に戻り、Ｓ２３０から処理を繰り返す。
保護対象状態管理表１９５が変化していない場合（ＮＯ）、保護対象状態取得処理（Ｓ２００）は終了する。
【００８９】
図２５は、実施の形態１における暗号関数抽出リスト１９３の一例を示す図である。
図２６は、実施の形態１における保護対象状態管理表１９５の一例を示す図である。
保護対象状態取得処理（Ｓ２００）（図１８参照）により、保護対象状態取得部１３１は、図２２に示す対象プログラム１０１Ｄと、図１９に示す保護対象抽出リスト１９１Ｄと、図２５に示す暗号関数抽出リスト１９３Ｄとに基づいて、図２６に示す保護対象状態管理表１９５Ｄを生成する。
【００９０】
図２７は、実施の形態１における対象プログラム１０１の一例を示す図である。
図２８は、実施の形態１における保護対象抽出リスト１９１の一例を示す図である。
図２９は、実施の形態１における暗号関数抽出リスト１９３の一例を示す図である。
図３０は、実施の形態１における保護対象状態管理表１９５の一例を示す図である。
保護対象状態取得処理（Ｓ２００）（図１８参照）により、保護対象状態取得部１３１は、図２７に示す対象プログラム１０１Ｅと、図２８に示す保護対象抽出リスト１９１Ｅと、図２９に示す暗号関数抽出リスト１９３Ｅとに基づいて、図３０に示す保護対象状態管理表１９５Ｅを生成する。
【００９１】
図３１は、実施の形態１における鍵状態取得処理（Ｓ３００）の一例を示すフローチャートである。
実施の形態１における鍵状態取得処理（Ｓ３００）の一例について、図３１に基づいて説明する。
鍵状態取得処理（Ｓ３００）は、Ｓ３１０からＳ３７０の各処理で構成される。
【００９２】
Ｓ３１０において、鍵状態取得部１３２は、対象プログラム１０１のフローグラフを生成する。但し、鍵状態取得部１３２は、対象プログラム１０１のフローグラフを生成せず、保護対象状態取得部１３１によって生成されるフローグラフ（図１８のＳ２１０参照）を使用しても構わない。
Ｓ３１０の後、Ｓ３２０に進む。
【００９３】
Ｓ３２０において、鍵状態取得部１３２は鍵状態管理表１９６を生成して初期化する。
Ｓ３２０の後、Ｓ３３０に進む。
【００９４】
図３２は、実施の形態１における鍵状態管理表１９６の構成図である。
実施の形態１における鍵状態管理表１９６の構成について、図３２に基づいて説明する。
【００９５】
鍵状態管理表１９６は、「位置（行番号）」「鍵変数」「演算子（関数名）」および「内容」を対応付けて含んでいる。
「位置（行番号）」は暗号化関数が使用されている行の番号を示す。
「鍵変数」は暗号鍵として使用される鍵変数を示す。
「演算子（関数名）」は鍵変数を生成するために使用される演算子および関数を示す。
「内容」は鍵変数に設定される値が「可変」であるか又は「不変」であるかを示す。
初期化された鍵状態管理表１９６は、情報が何も設定されていない状態である（図３２参照）。
【００９６】
図３１に戻り、鍵状態取得処理（Ｓ２００）の説明をＳ３３０から続ける。
【００９７】
Ｓ３３０において、鍵状態取得部１３２は、暗号関数抽出リスト１９３の先頭行を処理ポインタで指定する。ここで、処理ポインタとは暗号関数抽出リスト１９３の行を指定するものである。
Ｓ３３０の後、Ｓ３３１に進む。
【００９８】
Ｓ３３１において、鍵状態取得部１３２は、暗号関数抽出リスト１９３から処理ポインタで指定された行をメモリに読み込む。以下、Ｓ３３１で読み込んだ行を「注目行」とする。
Ｓ３３１の後、Ｓ３４０に進む。
【００９９】
Ｓ３４０において、鍵状態取得部１３２は、暗号関数抽出リスト１９３の注目行から鍵変数の変数名を取得し、取得した変数名で識別される鍵変数の内容（可変または不変）を変数情報抽出リスト１９４から取得する。
例えば、図３３に示す暗号関数抽出リスト１９３ＦのＮｏ「１」が注目行である場合、鍵状態取得部１３２は、鍵用の実引数「ｋｅｙ２」（鍵変数）と同じ変数名に対応付けられた内容「可変」を図３４に示す変数情報抽出リスト１９４Ｆから取得する。
図３３は、実施の形態１における暗号関数抽出リスト１９３の一例を示す図である。
図３４は、実施の形態１における変数情報抽出リスト１９４の一例を示す図である。
Ｓ３４０の後、Ｓ３５０に進む。
【０１００】
Ｓ３５０において、鍵状態取得部１３２は、注目行の鍵変数についてフローグラフを解析し、注目行の鍵変数を生成するために使用される演算子および関数を解析結果として取得する。
鍵変数解析処理（Ｓ３５０）の詳細については後述する。
Ｓ３５０の後、Ｓ３６０に進む。
【０１０１】
Ｓ３６０において、鍵状態取得部１３２は、暗号関数抽出リスト１９３に設定されている注目行の行番号と、Ｓ３４０で取得した鍵変数の内容と、Ｓ３５０で取得した解析結果（演算子および関数）とを鍵状態管理表１９６に登録する。
Ｓ３６０の後、Ｓ３７０に進む。
【０１０２】
Ｓ３７０において、鍵状態取得部１３２は、現在の注目行が暗号関数抽出リスト１９３の最終行であるか否かを判定する。
現在の注目行が暗号関数抽出リスト１９３の最終行である場合（ＹＥＳ）、鍵状態取得処理（Ｓ３００）は終了する。
現在の注目行が暗号関数抽出リスト１９３の最終行でない場合（ＮＯ）、鍵状態取得部１３２は現在の注目行の次の行を新たな注目行として処理ポインタで指定する。その後、Ｓ３３１に戻る。
【０１０３】
図３５は、実施の形態１における対象プログラム１０１の一例を示す図である。
図３６は、実施の形態１における鍵状態管理表１９６の一例を示す図である。
図３５に示す対象プログラム１０１Ｆにおいて、暗号化変数「ｅｎｃ」の鍵変数「ｋｅｙ２」は、演算子「ｘｏｒ」（６行目）と、ハッシュ関数「ｈａｓｈ」（５行目）と、演算子「＋」（５行目）とを用いて生成されている。
鍵状態取得処理（Ｓ３００）（図３１参照）により、鍵状態取得部１３２は、図３５に示す対象プログラム１０１Ｆと、図３３に示す暗号関数抽出リスト１９３Ｆと、図３４に示す変数情報抽出リスト１９４Ｆとに基づいて、図３６に示す鍵状態管理表１９６Ｆを生成する。
ここで、ハッシュ関数リスト１８４は、ハッシュ関数の関数名として「ｈａｓｈ」を含むものとする。
【０１０４】
図３７は、実施の形態１における鍵変数解析処理（Ｓ３５０）を示すフローチャートである。
鍵状態取得処理（Ｓ３００）（図３１参照）の鍵変数解析処理（Ｓ３５０）について、図３７に基づいて説明する。
鍵変数解析処理（Ｓ３５０）は、Ｓ３５１からＳ３５６の各処理で構成される。
【０１０５】
Ｓ３５１において、鍵状態取得部１３２は、暗号関数抽出リスト１９３の注目行の鍵変数が使用されている各行の行番号を変数情報抽出リスト１９４から取得し、取得した行番号で識別される行を表すノードのうち注目行の鍵変数を設定する代入文を表すノードをフローグラフから選択する。ここで、選択したノードを「注目ノード」とする。
例えば、注目行の鍵変数が「ｋｅｙ２」である場合、鍵状態取得部１３２は、図３４に示す変数情報抽出リスト１９４Ｆから鍵変数「ｋｅｙ２」に対応付けられている行番号「６」「７」を取得する。そして、鍵状態取得部１３２は、行番号「６」「７」のうち鍵変数「ｋｅｙ２」を設定する代入文の行番号「６」を選択する（図３５の６行目参照）。この場合、６行目の代入文を表すノードが注目ノードである。
Ｓ３５１の後、Ｓ３５２に進む。
【０１０６】
Ｓ３５２において、鍵状態取得部１３２は、Ｓ３５１で選択した注目ノード（代入文）の右辺（代入元）から変数名、演算子および関数名（例えば、ハッシュ関数リスト１８４に含まれるハッシュ関数名）を取得する。
例えば、鍵状態取得部１３２は、図３５に示す対象プログラム１０１Ｆの６行目の代入文（注目ノード）から右辺で用いられている変数名「ｋｅｙ１」「ｓｅｅｄ２」および演算子「ｘｏｒ」を取得する。
Ｓ３５２の後、Ｓ３５３に進む。
【０１０７】
Ｓ３５３において、鍵状態取得部１３２は、Ｓ３５２で取得した変数名から未選択の変数名を１つ選択する。
Ｓ３５３の後、Ｓ３５４に進む。
【０１０８】
Ｓ３５４において、鍵状態取得部１３２は、Ｓ３５３で選択した変数名で識別される変数について、注目行の鍵変数と同様にフローグラフを解析する。
言い換えると、鍵状態取得部１３２は、注目行の鍵変数名をＳ３５３で選択した変数名に置き換えて鍵変数解析処理（Ｓ３５０）を実行する。
つまり、鍵状態取得部１３２は、鍵変数を設定するための変数について鍵変数解析処理（Ｓ３５０）を再帰的に実行する。
【０１０９】
例えば、鍵状態取得部１３２は、図３５に示す対象プログラム１０１Ｆの鍵変数「ｋｅｙ２」を設定する代入文（６行目）で用いられる変数「ｋｅｙ１」について鍵変数解析処理（Ｓ３５０）を実行する。
さらに、鍵状態取得部１３２は、変数「ｋｅｙ１」を設定する代入文（５行目）で用いられている変数「ｉｎ」について鍵変数解析処理（Ｓ３５０）を実行する。
また、鍵状態取得部１３２は、鍵変数「ｋｅｙ２」を設定するためのその他の変数「ｓｅｅｄ２」「ｓｅｅｄ１」についても鍵変数解析処理（Ｓ３５０）を実行する。
Ｓ３５４の後、Ｓ３５５に進む。
【０１１０】
Ｓ３５５において、鍵状態取得部１３２は、Ｓ３５２で取得した演算子および関数名（Ｓ３５４で再帰的に取得した演算子および関数名を含む）を解析結果リストに登録する。解析結果リストは鍵変数解析処理（Ｓ３５０）の解析結果である。
例えば、鍵状態取得部１３２は、図３５に示す対象プログラム１０１Ｆに含まれる演算子および関数名のうち、鍵変数「ｋｅｙ２」を設定する代入文（６行目）の演算子「ｘｏｒ」、変数「ｋｅｙ１」を設定する代入文（５行目）のハッシュ関数名「ｈａｓｈ」および演算子「＋」を解析結果リストに登録する。
Ｓ３５５の後、Ｓ３５６に進む。
【０１１１】
Ｓ３５６において、鍵状態取得部１３２は、Ｓ３５３で未選択の変数名が残っているか否かを判定する。
未選択の変数名が残っている場合（ＹＥＳ）、Ｓ３５３に戻る。
未選択の変数名が残っていない場合（ＮＯ）、鍵変数解析処理（Ｓ３５０）は終了する。
【０１１２】
図３８は、実施の形態１における脆弱性判定処理（Ｓ１４０）の一例を示すフローチャートである。
実施の形態１における脆弱性判定処理（Ｓ１４０）（図５参照）について、図３８に基づいて説明する。
脆弱性判定処理（Ｓ１４０）は、Ｓ１４１からＳ１４９の各処理で構成される。
【０１１３】
Ｓ１４１において、脆弱性判定部１４０は、Ｓ１２２（図６参照）で生成された出力関数抽出リスト１９２の先頭行を処理ポインタで指定する。ここで、処理ポインタとは出力関数抽出リスト１９２の行を指定するものである。
Ｓ１４１の後、Ｓ１４２に進む。
【０１１４】
Ｓ１４２において、脆弱性判定部１４０は、出力関数抽出リスト１９２から処理ポインタで指定された行をメモリに読み込む。以下、Ｓ１４２で読み込んだ行を「注目行」とする。
Ｓ１４２の後、Ｓ１４３に進む。
【０１１５】
Ｓ１４３において、脆弱性判定部１４０は、出力関数抽出リスト１９２の注目行を参照し、注目行の項目「出力の状態」が「平文」であるか否かを判定する。
例えば、図３９に示す出力関数抽出リスト１９２ＤのＮｏ「１」が注目行である場合、注目行の項目「出力の状態」は「平文」である。
図３９は、実施の形態１における出力関数抽出リスト１９２の一例を示す図である。
注目行の項目「出力の状態」が「平文」である場合（ＹＥＳ）、Ｓ１４４に進む。
注目行の項目「出力の状態」が「平文」でない場合、つまり、注目行の項目「出力の状態」が「暗号文」である場合（ＮＯ）、Ｓ１４８に進む。
【０１１６】
Ｓ１４４において、脆弱性判定部１４０は、出力関数抽出リスト１９２の注目行から出力変数（出力関数の実引数）を一つ選択する。
例えば、図３９に示す出力関数抽出リスト１９２ＤのＮｏ「１」が注目行である場合、注目行の出力変数（実引数）は「ｅｎｃ＿ｎａｍｅ」である。
Ｓ１４４の後、Ｓ１４５に進む。
【０１１７】
Ｓ１４５において、脆弱性判定部１４０は、Ｓ１４４で選択した出力変数がＳ２００（図１７参照）で生成された保護対象状態管理表１９５に含まれる保護対象変数と同じ変数であるか否かを判定する。
例えば、出力変数「ｅｎｃ＿ｎａｍｅ」は図２６に示す保護対象状態管理表１９５Ｄに含まれる保護対象変数である。
出力変数が保護対象変数である場合（ＹＥＳ）、Ｓ１４６−１に進む。
出力変数が保護対象変数でない場合（ＮＯ）、Ｓ１４８に進む。
【０１１８】
Ｓ１４６−１において、脆弱性判定部１４０は、Ｓ１４４で選択した出力変数（保護対象変数）が保護対象状態管理表１９５の項目「暗号文」に含まれる暗号状態変数であるか否かを判定する。
例えば、出力変数「ｅｎｃ＿ｎａｍｅ」は図２６に示す保護対象状態管理表１９５Ｄの項目「暗号文」に含まれる暗号状態変数である。
出力変数が暗号状態変数である場合（ＹＥＳ）、Ｓ１４６−２に進む。
出力変数が暗号状態変数でない場合、つまり、出力変数が平文状態変数である場合（ＮＯ）、Ｓ１４７に進む。
【０１１９】
Ｓ１４６−２において、脆弱性判定部１４０は、保護対象状態管理表１９５から出力変数（暗号状態変数）に対応付けて設定された暗号化関数の行番号を取得する。
また、脆弱性判定部１４０は、取得した暗号化関数の行番号に対応付けられた鍵変数の内容（可変または不変）をＳ３００（図１７参照）で生成された鍵状態管理表１９６から取得する。
そして、脆弱性判定部１４０は、取得した鍵変数の内容が可変であるか否かを判定する。
【０１２０】
例えば、脆弱性判定部１４０は、出力変数「ｅｎｃ＿ｎａｍｅ」に対応付けられた暗号化関数「ｅｎｃ」の行番号「７行目」を図２６に示す保護対象状態管理表１９５Ｄから取得する。
また、脆弱性判定部１４０は、取得した行番号「７行目」に対応付けられた鍵変数「ｋｅｙ」の内容「不変」を図４０に示す鍵状態管理表１９６Ｄから取得する。
図４０は、実施の形態１における鍵状態管理表１９６の一例を示す図である。
【０１２１】
鍵変数の内容が可変である場合（ＹＥＳ）、Ｓ１４６−３に進む。
鍵変数の内容が可変でない場合、つまり、鍵変数の内容が不変である場合（ＮＯ）、Ｓ１４７に進む。
【０１２２】
Ｓ１４６−３において、脆弱性判定部１４０は、鍵状態管理表１９６を参照し、鍵変数に設定される暗号鍵がハッシュ関数または「ｘｏｒ」などの所定の秘匿演算によって生成される秘匿値であるか否かを判定する。所定の秘匿演算は、第三者によって推測されず、第三者に対して秘匿される秘匿値を算出するための演算である。
例えば、図３６に示す鍵状態管理表１９６Ｆは鍵変数「ｋｅｙ２」が「ｘｏｒ」およびハッシュ関数「ｈａｓｈ」を用いて生成されることを示している。この場合、脆弱性判定部１４０は鍵変数「ｋｅｙ２」が保護されていると判定する。
鍵変数が保護されている場合（ＹＥＳ）、Ｓ１４８に進む。
鍵変数が保護されていない場合（ＮＯ）、Ｓ１４７に進む。
【０１２３】
Ｓ１４７において、脆弱性判定部１４０は、プログラム検証結果１９７に判定結果を追加する。
例えば、脆弱性判定部１４０は、プログラム検証結果１９７に以下のような判定結果を追加する。
Ｓ１４６−１において出力変数が暗号状態変数でない場合（ＮＯ）、脆弱性判定部１４０は出力変数の情報（変数名、行番号など）および出力変数が平文状態であること（保護対象情報が暗号化されずに出力されること）を示す情報をプログラム検証結果１９７に追加する。
Ｓ１４６−２において鍵変数が可変でない場合（ＮＯ）、脆弱性判定部１４０は鍵変数の情報（関数名、変数名、行番号など）および鍵変数が不変（定数）であること（保護対象情報が適切に暗号化されずに出力されること）を示す情報をプログラム検証結果１９７に追加する。
Ｓ１４６−３において鍵変数が保護されていない場合（ＮＯ）、脆弱性判定部１４０は鍵変数の情報（関数名、変数名、行番号など）および鍵変数が保護されていないこと（保護対象情報が適切に暗号化されずに出力されること）を示す情報をプログラム検証結果１９７に追加する。
Ｓ１４７の後、Ｓ１４８に進む。
【０１２４】
Ｓ１４８において、脆弱性判定部１４０は、Ｓ１４４で未選択の出力変数が残っているか否かを判定する。
未選択の出力変数が残っている場合（ＹＥＳ）、Ｓ１４４に戻る。
未選択の出力変数が残っていない場合（ＮＯ）、Ｓ１４９に進む。
【０１２５】
Ｓ１４９において、脆弱性判定部１４０は、現在の注目行が出力関数抽出リスト１９２の最終行であるか否かを判定する。
現在の注目行が出力関数抽出リスト１９２の最終行である場合（ＹＥＳ）、脆弱性判定部１４０はプログラム検証結果１９７をディスプレイまたはプリンタなどの出力装置に出力する。そして、脆弱性判定処理（Ｓ１４０）は終了する。
現在の注目行が出力関数抽出リスト１９２の最終行でない場合（ＮＯ）、脆弱性判定部１４０は現在の注目行の次の行を新たな注目行として処理ポインタで指定する。その後、Ｓ１４２に戻る。
【０１２６】
図３８で説明した脆弱性判定処理（Ｓ１４０）では、Ｓ１４６−１からＳ１４６−３の条件を満たさない場合の判定結果をプログラム検証結果１９７に設定している。
但し、全ての出力変数について、出力変数毎にＳ１４５の判定結果とＳ１４６−１からＳ１４６−３それぞれの判定結果とのうち少なくともいずれかの判定結果をプログラム検証結果１９７に設定しても構わない。
また、全ての出力変数のうち全ての保護対象変数について、保護対象変数毎にＳ１４６−１からＳ１４６−３の少なくともいずれかの判定結果をプログラム検証結果１９７に設定しても構わない。
【０１２７】
図４１は、実施の形態１におけるプログラム検証装置１００のハードウェア資源の一例を示す図である。
図４１において、プログラム検証装置１００（コンピュータの一例）は、ＣＰＵ９０１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を備えている。ＣＰＵ９０１は、バス９０２を介してＲＯＭ９０３、ＲＡＭ９０４、通信ボード９０５（通信装置）、ディスプレイ９１１（表示装置）、キーボード９１２、マウス９１３、ドライブ９１４、磁気ディスク装置９２０などのハードウェアデバイスと接続され、これらのハードウェアデバイスを制御する。ドライブ９１４は、ＦＤ（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ）、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）などの記憶媒体を読み書きする装置である。
ＲＯＭ９０３、ＲＡＭ９０４、磁気ディスク装置９２０およびドライブ９１４は記憶装置の一例である。キーボード９１２、マウス９１３、通信ボード９０５および記憶装置は入力装置の一例である。ディスプレイ９１１、通信ボード９０５および記憶装置は出力装置の一例である。
【０１２８】
通信ボード９０５は、有線または無線で、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット、電話回線などの通信網に接続している。
【０１２９】
磁気ディスク装置９２０には、ＯＳ９２１（オペレーティングシステム）、プログラム群９２２、ファイル群９２３が記憶されている。
【０１３０】
プログラム群９２２には、実施の形態において「〜部」として説明する機能を実行するプログラムが含まれる。プログラム（例えば、プログラム検証プログラム）は、ＣＰＵ９０１により読み出され実行される。すなわち、プログラムは、「〜部」としてコンピュータを機能させるものであり、また「〜部」の手順や方法をコンピュータに実行させるものである。
【０１３１】
ファイル群９２３には、実施の形態において説明する「〜部」で使用される各種データ（入力、出力、判定結果、計算結果、処理結果など）が含まれる。
【０１３２】
実施の形態において構成図およびフローチャートに含まれている矢印は主としてデータや信号の入出力を示す。
フローチャートなどに基づいて説明する実施の形態の処理はＣＰＵ９０１、記憶装置、入力装置、出力装置などのハードウェアを用いて実行される。
【０１３３】
実施の形態において「〜部」として説明するものは「〜回路」、「〜装置」、「〜機器」であってもよく、また「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ファームウェア、ソフトウェア、ハードウェアまたはこれらの組み合わせのいずれで実装されても構わない。
【０１３４】
実施の形態１により、例えば、以下のような効果を奏することができる。
プログラム検証装置１００は、機密情報または個人情報などの保護対象情報が平文のまま又は適切な暗号方法を経ないでプログラムの外部に流れ出ることを静的解析によって発見して警告する、ことができる。
つまり、プログラム検証装置１００は、「重要な情報が平文のままプログラムから外部に出力されないこと」「重要な情報が暗号化された場合において、暗号化に利用する鍵がプログラム内でハードコード（定数化）されていないこと」を検証することができる。
また、対象プログラム１０１が保護対象情報を適切に暗号化してから出力する適正なプログラムである場合、プログラム検証装置１００は、対象プログラム１０１に脆弱性がある、という誤った診断をしてしまうことを防ぐことができる。
暗号用または復号用の鍵およびパスワードは機密情報の一例であり、電話帳、住所、メール、位置情報及び生体情報は個人情報の一例である。
プログラムの外部とは、例えば、ネットワーク、他のプログラム、ファイル、データベースまたは可搬型記憶媒体等を意味する。
【０１３５】
実施の形態１において、例えば、以下のようなプログラム検証装置（１００）について説明した。実施の形態１の構成のうち対応する構成の符号を括弧内に記す。
プログラム検証装置（１００）は、リスト記憶部（１９０）と、プログラム入力部（１１０）と、出力変数抽出部（１２２）と、暗号変数抽出部（１２３）と、暗号状態変数抽出部（１３１）と、暗号状態判定部（１４０）と、検証結果出力部（１４０）とを備える。
【０１３６】
前記リスト記憶部は、特定の変数に設定された情報を出力する出力関数が定義された出力関数リスト（１８２）と、情報を暗号化する暗号化関数が定義された暗号化関数リスト（１８３）とを記憶する。
前記プログラム入力部は、検証する対象であるプログラムを対象プログラム（１０１）として入力する（Ｓ１１０）。
前記出力変数抽出部は、前記対象プログラムで使用されている変数のうち前記出力関数リストに定義された前記出力関数によって出力される情報が出力情報として設定される前記特定の変数を出力変数として抽出する（Ｓ１２２）。
前記暗号変数抽出部は、前記対象プログラムで使用されている変数のうち前記暗号化関数リストに定義された前記暗号化関数によって暗号化された情報が暗号情報として設定される変数を暗号変数として抽出する（Ｓ１２３）。
前記暗号状態変数抽出部は、前記対象プログラムに含まれる代入文を参照し、前記暗号変数抽出部によって抽出された前記暗号変数に設定された前記暗号情報が代入される変数を暗号状態変数として前記対象プログラムから抽出する（Ｓ２００）。
前記暗号状態判定部は、前記暗号状態変数抽出部によって抽出された前記暗号状態変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定する（Ｓ１４６−１）。
前記検証結果出力部は、前記暗号状態判定部の判定結果に基づいた情報を前記対象プログラムの検証結果として出力する（Ｓ１４７）。
【０１３７】
前記リスト記憶部は、保護する対象である保護対象情報を取得する情報取得関数が定義された情報取得関数リスト（１８１）を記憶する。
前記プログラム検証装置は、保護対象変数抽出部（１２１）と、保護対象判定部（１４０）とを備える。
前記保護対象変数抽出部は、前記対象プログラムで使用されている変数のうち前記情報取得関数リストに定義された前記情報取得関数によって取得された前記保護対象情報が設定される変数を保護対象変数として抽出する（Ｓ１２１）。
前記保護対象判定部は、前記保護対象変数抽出部によって抽出された前記保護対象変数と前記出力変数抽出部によって抽出された前記出力変数とが同じ変数であるか否かを判定する（Ｓ１４５）。
前記検証結果出力部は、前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいた情報を前記対象プログラムの前記検証結果として出力する（Ｓ１４７）。
【０１３８】
前記プログラム検証装置は、鍵変数抽出部（１２３）と、鍵内容判定部（１３２）とを備える。
前記鍵変数抽出部は、前記対象プログラムで使用されている変数のうち暗号鍵が設定された変数として前記暗号化関数に対して指定されている変数を鍵変数として抽出する（Ｓ１２３）。
前記鍵内容判定部は、前記対象プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が可変値であるか否かを判定する（Ｓ３００）。
前記検証結果出力部は、前記鍵内容判定部の判定結果と前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいた情報を前記対象プログラムの前記検証結果として出力する（Ｓ１４７）。
【０１３９】
前記プログラム検証装置は、鍵状態判定部（１３２）を備える。
前記鍵状態判定部は、前記対象プログラムに含まれる代入文を参照し、前記鍵変数抽出部によって抽出された前記鍵変数に前記暗号鍵として代入される値が所定の秘匿演算で生成されることによって秘匿される秘匿値であるか否かを判定する（Ｓ３００）。
前記検証結果出力部は、前記鍵状態判定部の判定結果と前記鍵内容判定部の判定結果と前記保護対象判定部の判定結果と前記暗号状態判定部の判定結果とに基づいた情報を前記対象プログラムの前記検証結果として出力する（Ｓ１４７）。
【符号の説明】
【０１４０】
１００  プログラム検証装置、１０１  対象プログラム、１１０  プログラム入力部、１２０  必要情報抽出部、１２１  保護対象抽出部、１２２  出力関数抽出部、１２３  暗号関数抽出部、１２４  変数情報抽出部、１３０  保護状態解析部、１３１  保護対象状態取得部、１３２  鍵状態取得部、１４０  脆弱性判定部、１８１  情報取得関数リスト、１８２  出力関数リスト、１８３  暗号関数リスト、１８４  ハッシュ関数リスト、１９０  検証装置記憶部、１９１  保護対象抽出リスト、１９２  出力関数抽出リスト、１９３  暗号関数抽出リスト、１９４  変数情報抽出リスト、１９５  保護対象状態管理表、１９６  鍵状態管理表、１９７  プログラム検証結果、９０１  ＣＰＵ、９０２  バス、９０３  ＲＯＭ、９０４  ＲＡＭ、９０５  通信ボード、９１１  ディスプレイ、９１２  キーボード、９１３  マウス、９１４  ドライブ、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  プログラム群、９２３  ファイル群。
【図１】
2014050431.tif 000003
【図２】
2014050431.tif 000004
【図３】
2014050431.tif 000005
【図４】
2014050431.tif 000006
【図５】
2014050431.tif 000007
【図６】
2014050431.tif 000008
【図７】
2014050431.tif 000009
【図８】
2014050431.tif 000010
【図９】
2014050431.tif 000011
【図１０】
2014050431.tif 000012
【図１１】
2014050431.tif 000013
【図１２】
2014050431.tif 000014
【図１３】
2014050431.tif 000015
【図１４】
2014050431.tif 000016
【図１５】
2014050431.tif 000017
【図１６】
2014050431.tif 000018
【図１７】
2014050431.tif 000019
【図１８】
2014050431.tif 000020
【図１９】
2014050431.tif 000021
【図２０】
2014050431.tif 000022
【図２１】
2014050431.tif 000023
【図２２】
2014050431.tif 000024
【図２３】
2014050431.tif 000025
【図２４】
2014050431.tif 000026
【図２５】
2014050431.tif 000027
【図２６】
2014050431.tif 000028
【図２７】
2014050431.tif 000029
【図２８】
2014050431.tif 000030
【図２９】
2014050431.tif 000031
【図３０】
2014050431.tif 000032
【図３１】
2014050431.tif 000033
【図３２】
2014050431.tif 000034
【図３３】
2014050431.tif 000035
【図３４】
2014050431.tif 000036
【図３５】
2014050431.tif 000037
【図３６】
2014050431.tif 000038
【図３７】
2014050431.tif 000039
【図３８】
2014050431.tif 000040
【図３９】
2014050431.tif 000041
【図４０】
2014050431.tif 000042
【図４１】
2014050431.tif 000043
【国際調査報告】
2014050431.tif 000044
2014050431.tif 000045
2014050431.tif 000046