(57)【特許請求の範囲】
【請求項１】
被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを記憶するプログラム記憶手段と、
前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成手段と、
それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成手段と、
前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成手段と、
前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換え手段とを備え、
前記結合演算は、ビット毎の自己双対関数による演算である
ことを特徴とするプログラム変換装置。
【請求項２】
前記結合演算は、入力ビット値が全て０の時は０を出力し、入力ビット値が全て１である場合には１を出力する演算である
ことを特徴とする請求項１に記載のプログラム変換装置。
【請求項３】
前記秘密演算命令が行う演算は、ビット毎の論理演算であり、
前記分割演算は、前記秘密演算命令が行う演算と同一の演算であり、
前記結合命令は、前記結合演算と同一の演算を行う命令である
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項４】
前記秘密演算命令が行う演算は、前記被演算情報と前記秘密情報との同ビット桁毎の演算であり、
前記分割秘密情報生成手段は、前記秘密情報のビット桁それぞれについて、当該ビット桁に対する自己双対関数の逆演算の結果である複数のビット値を生成し、生成した複数のビット値それぞれを、複数の分割秘密情報の当該ビット桁に割り当て、
前記分割演算命令は、前記被演算情報と前記分割秘密情報の同ビット桁毎に前記演算を行う命令であり、
前記結合命令は、前記分割演算それぞれにより算出される複数の結果について、同ビット桁のビット値に前記自己双対関数を施し、その結果を当該ビット桁のビット値とすることにより、前記結合を行う命令である
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項５】
前記自己双対関数は、複数の入力値のうち、過半数を占める入力値を出力する多数決関数であり、
前記分割秘密情報生成手段は、
自己双対関数に係る複数の入力値と、対応する出力値との対応表を予め保持しており、
前記秘密情報のビット桁それぞれについて、当該ビット桁のビット値と同値の出力値に対応する複数の入力値を前記対応表から読み出し、前記複数の入力値を、前記複数の分割秘密情報それぞれの当該ビット桁のビット値とする
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項６】
前記プログラム変換装置は、さらに、
異なる複数の自己双対関数を記憶している演算記憶手段
を含み、
前記分割秘密情報生成手段は、前記結合演算として、前記演算記憶手段に記憶された自己双対関数からランダムに自己双対関数を選出する
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項７】
前記置き換え手段は、更に、
それぞれの前記分割演算命令と、前記結合演算命令とを、プログラムの実行結果に影響を及ぼさない範囲で並び替える
ことを特徴とする請求項２に記載のプログラム変換装置。
【請求項８】
前記置き換え手段は、更に、
並び替えられた各演算命令の配置を、プログラムの実行結果に影響を及ぼさない範囲で分散させる
ことを特徴とする請求項７に記載のプログラム変換装置。
【請求項９】
前記置き換え手段は、更に、
プログラムの実行結果に影響を及ぼさない範囲で、ダミーの演算処理を追加する
ことを特徴とする請求項８に記載のプログラム変換装置。
【請求項１０】
被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを記憶するプログラム記憶手段と、分割秘密情報生成手段と、分割演算命令生成手段と、結合命令生成手段と、置き換え手段とを備えた、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置におけるプログラム変換方法において、
前記分割秘密情報生成手段が、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、
前記分割演算命令生成手段が、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、
前記結合命令生成手段が、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、
前記置き換え手段が、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップとを含み、
前記結合演算は、ビット毎の自己双対関数による演算である
ことを特徴とするプログラム変換方法。
【請求項１１】
被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを記憶するプログラム記憶手段と、分割秘密情報生成手段と、分割演算命令生成手段と、結合命令生成手段と、置き換え手段とを備えた、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられるコンピュータプログラムであって、
前記分割秘密情報生成手段により、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、
前記分割演算命令生成手段により、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、
前記結合命令生成手段により、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、
前記置き換え手段により、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップと
の各ステップをコンピュータに実行させ、
前記結合演算は、ビット毎の自己双対関数による演算である
ことを特徴とするコンピュータプログラム。
【請求項１２】
被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられる集積回路であって、
前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成手段と、
それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成手段と、
前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成手段と、
前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換え手段とを備え、
前記結合演算は、ビット毎の自己双対関数による演算である
ことを特徴とする集積回路。
【請求項１３】
被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを記憶するプログラム記憶手段と、分割秘密情報生成手段と、分割演算命令生成手段と、結合命令生成手段と、置き換え手段とを備えた、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられるコンピュータプログラムを記憶するコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、
前記分割秘密情報生成手段により、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、
前記分割演算命令生成手段により、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、
前記結合命令生成手段により、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、
前記置き換え手段により、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップと
の各ステップをコンピュータに実行させ、
前記結合演算は、ビット毎の自己双対関数による演算である
ことを特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、秘密情報を扱うプログラムをコンピュータシステム上で実行させる際の機密性を向上させる技術に関する。
【背景技術】
【０００２】
近年、コンピュータシステムに関し、デバッガやＩＣＥ（Ｉｎ−Ｃｉｒｃｕｉｔ  Ｅｍｕｌａｔｏｒ、登録商標）等のプログラム解析ツールの機能が充実し、これらツールを用いたプログラムの解析および改変が容易になっている。
機密保護を強化するための技術として、例えば、プログラムを分割して暗号化しておき、実行時に必要な部分のみを復号して実行することで平文プログラムの収集およびプログラムの解析を困難にする方法や、特許文献１に記載のように、暗号化計算を並列に実行できるように分割し、解析を分かりにくくする方法が提案されている。
【特許文献１】特表２００２−５３６９１１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら、秘密情報を用いて暗号化データを復号するようなプログラムについて、上述のようにプログラムを分割、暗号化しても、実行時には当該プログラムは復元され、復号鍵等の秘密情報がプログラム実行中にメモリ上に現れてしまうので、解析ツールによってメモリ上の前記秘密情報が取得されてしまう可能性がある。
上記の問題に鑑み、本発明は、秘密情報を用いて暗号化データを復号するようなプログラムを、当該秘密情報をメモリ上に表すことなく実行できるようにし、プログラム実行時の機密性を向上させるプログラム変換装置を提供することを目的とする。
【課題を解決するための手段】
【０００４】
上記課題を解決するために、本発明は、プログラム変換装置であって、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを記憶するプログラム記憶手段と、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成手段と、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成手段と、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成手段と、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換え手段とを備える。
【発明の効果】
【０００５】
本発明のプログラム変換装置は、上述の構成を備えることにより、原プログラムにおける前記演算において、前記秘密情報を用いる代わりに、複数の前記分割秘密情報を用い、かつ、原プログラムと比べ実行結果が同じとなるプログラムを生成することができる。
よって、生成されたプログラムを、コンピュータシステム上で実行した場合には、前記秘密情報がメモリ上に現れることがないので、前記秘密情報の漏洩を防ぐことができ、プログラムの機密性を向上させることができる。
【０００６】
また、偶然に分割秘密情報が秘密情報と同じ値である場合であっても、他の分割秘密情報についても同様の演算が行われることとなるので、その分割秘密情報が秘密情報と同じ値であることを分かりにくくすることができる。
また、前記結合演算は、ビット毎の自己双対関数による演算であることとしてもよい。
また、前記結合演算は、入力ビット値が全て０の時は０を出力し、入力ビット値が全て１である場合には１を出力する演算であることとしてもよい。
【０００７】
この構成によれば、原プログラムにおける前記演算において、前記秘密情報を用いる代わりに、複数の前記分割秘密情報を用い、かつ、原プログラムと比べ実行結果が同じとなるプログラムを生成することができる。
よって、生成されたプログラムを、コンピュータシステム上で実行した場合には、前記秘密情報がメモリ上に現れることがないので、前記秘密情報の漏洩を防ぐことができ、プログラムの機密性を向上させることができる。
【０００８】
また、偶然に分割秘密情報が秘密情報と同じ値である場合であっても、他の分割秘密情報についても同様の演算が行われることとなるので、その分割秘密情報が秘密情報と同じ値であることを分かりにくくすることができる。
ここで、自己双対関数とは、ｎ（ｎは２以上の自然数）個の変数ｘ１、ｘ２、・・・・・ｘｎを入力とするｎ変数入力関数ｆ（ｘ１，ｘ２，・・・，ｘｎ）であって、〜ｆ（ｘ１，ｘ２，・・・，ｘｎ）=ｆ（〜ｘ１，〜ｘ２，・・・，〜ｘｎ）を満たす、即ち、関数ｆに与える各入力値を全て否定（ＮＯＴ）した場合に、出力が、元の入力値に対する出力値の否定（ＮＯＴ）となるものである。ただし、「〜」は否定を表す記号である。また、条件としてｆ（０，０，…，０）＝０かつｆ（１，１，…，１）＝１を満たすものとする。
【０００９】
また、前記秘密演算命令が行う演算は、ビット毎の論理演算であり、前記分割演算は、前記秘密演算命令が行う演算と同一の演算であり、前記結合命令は、前記結合演算と同一の演算を行う命令であることとしてもよい。
この構成によれば、原プログラムにおける前記秘密演算命令が行う演算であるビット毎の論理演算について、前記秘密情報を用いる代わりに、複数の前記分割秘密情報を用い、かつ、原プログラムと比べ実行結果が同じとなるプログラムを生成することができる。
【００１０】
また、前記秘密演算命令が行う演算は、前記被演算情報と前記秘密情報との同ビット桁毎の演算であり、前記分割秘密情報生成手段は、前記秘密情報のビット桁それぞれについて、当該ビット桁に対する自己双対関数の逆演算の結果である複数のビット値を生成し、生成した複数のビット値それぞれを、複数の分割秘密情報の当該ビット桁に割り当て、前記分割演算命令は、前記被演算情報と前記分割秘密情報の同ビット桁毎に前記演算を行う命令であり、前記結合命令は、前記分割演算それぞれにより算出される複数の結果について、同ビット桁のビット値に前記自己双対関数を施し、その結果を当該ビット桁のビット値とすることにより、前記結合を行う命令であることとしてもよい。
【００１１】
この構成によれば、原プログラムにおける前記秘密演算命令が行う演算であるビット毎の演算について、前記秘密情報を用いる代わりに、複数の前記分割秘密情報を用い、かつ、原プログラムと比べ実行結果が同じとなるプログラムを生成することができる。
ここで、自己双対関数の逆演算とは、演算対象であるデータＸに対して、Ｘ＝ｆ（ｘ１，ｘ２，・・・，ｘｎ）を満たすｘ１、ｘ２・・・ｘｎを算出して出力する演算をいう。また、Ｘ＝ｆ（ｘ１，ｘ２，・・・，ｘｎ）を満たす（ｘ１、ｘ２・・・ｘｎ）の組が、複数存在する場合、これらの組からランダムに１の組を選出する。
【００１２】
また、前記自己双対関数は、複数の入力値のうち、過半数を占める入力値を出力する多数決関数であり、前記分割秘密情報生成手段は、自己双対関数に係る複数の入力値と、対応する出力値との対応表を予め保持しており、前記秘密情報のビット桁それぞれについて、当該ビット桁のビット値と同値の出力値に対応する複数の入力値を前記対応表から読み出し、前記複数の入力値を、前記複数の分割秘密情報それぞれの当該ビット桁のビット値とすることとしてもよい。
【００１３】
この構成によれば、前記分割秘密情報生成手段は、多数決の結果値が予め分かっている場合に、多数決の結果が前記結果値となるような複数の値を決定することができる。また、決定された複数の前記値それぞれを、複数の前記分割秘密情報の同ビット桁に割り当てているので、それぞれが前記秘密情報から推定されにくい複数の分割秘密情報を生成することができる。
【００１４】
また、前記プログラム変換装置は、さらに、異なる複数の自己双対関数を記憶している演算記憶手段を含み、前記分割秘密情報生成手段は、前記結合演算として、前記演算記憶手段に記憶された自己双対関数からランダムに自己双対関数を選出することとしてもよい。
この構成によれば、前記プログラム変換装置は、複数のうちから選出した自己双対関数を使用したプログラムを生成することができるので、不正な解析をさらに困難にさせることができ、プログラムの機密性を向上させることができる。
【００１５】
また、前記置き換え手段は、更に、それぞれの前記分割演算命令と、前記結合演算命令とを、プログラムの実行結果に影響を及ぼさない範囲で並び替えることとしてもよい。
また、前記置き換え手段は、更に、並び替えられた各演算の配置を、プログラムの実行結果に影響を及ぼさない範囲で分散させることとしてもよい。
また、前記置き換え手段は、更に、プログラムの実行結果に影響を及ぼさない範囲で、ダミーの演算処理を追加することとしてもよい。
【００１６】
この構成によれば、原プログラムにおける秘密演算が行われていた箇所と比べて、複数の箇所に処理が拡散したプログラムを生成するので、さらに、不正な解析を困難にし、プログラムの機密性を向上させることができる。
本発明のプログラム変換方法は、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換方法であって、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップとを含む。
【００１７】
本発明のコンピュータプログラムは、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられるコンピュータプログラムであって、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップとを含む。
【００１８】
本発明の集積回路は、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられる集積回路であって、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成手段と、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成手段と、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成手段と、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換え手段とを備える。
【００１９】
本発明の記録媒体は、被演算情報に対して秘密情報を用いた演算を行う秘密演算命令を含む原プログラムを変換するプログラム変換装置に用いられるコンピュータプログラムを記憶するコンピュータ読み取り可能な記録媒体であって、前記コンピュータプログラムは、前記秘密情報と所定の結合演算とを用いて、前記結合演算を施すと前記秘密情報が得られるような複数の分割秘密情報を生成する分割秘密情報生成ステップと、それぞれの前記分割秘密情報について、前記被演算情報と当該分割秘密情報とを用いた分割演算を行う分割演算命令を生成する分割演算命令生成ステップと、前記分割演算命令の処理の結果を前記結合演算を用いて結合することによって前記秘密演算命令と同一の結果を算出する結合命令を生成する結合命令生成ステップと、前記原プログラムにおける前記秘密演算命令を前記分割演算命令と前記結合命令とに置き換える置き換えステップとを含む。
【００２０】
この構成によれば、原プログラムにおける前記演算において、前記秘密情報を用いる代わりに、複数の前記分割秘密情報を用い、かつ、原プログラムと比べ実行結果が同じとなるプログラムを生成することができる。
よって、生成されたプログラムを、コンピュータシステム上で実行した場合には、前記秘密情報がメモリ上に現れることがないので、秘密情報の漏洩を防ぐことができ、プログラムの機密性を向上させることができる。
【００２１】
また、偶然に分割秘密情報が秘密情報と同じ値である場合であっても、他の分割秘密情報についても同様の演算が行われることとなるので、その分割秘密情報が秘密情報と同じ値であることを分かりにくくすることができる。
本発明のセキュア処理装置は、被演算情報を保持する被演算情報保持手段と、複数の分割秘密情報を保持する分割秘密情報保持手段と、前記複数の分割秘密情報を結合する結合演算を示す結合演算式を保持する結合演算式保持手段と、前記複数の分割秘密情報それぞれについて、前記被演算情報に対して当該分割秘密情報を用いた第１演算である分割演算を施す分割演算手段と、前記複数の分割演算の結果を前記結合演算を用いて結合する結合手段とを備え、前記結合手段は、前記複数の分割秘密情報を前記結合演算により結合すると得られる秘密情報を用いて前記被演算情報に対して第２演算を施した結果と同一となるよう、前記分割演算の結果を前記結合演算を用いて結合する。
【００２２】
本発明のコンピュータプログラムは、被演算情報と、複数の分割秘密情報と、前記複数の分割秘密情報を結合可能な結合演算式とを備え、前記複数の分割秘密情報それぞれについて、前記被演算情報に対して当該分割秘密情報を用いた第１演算である分割演算を施す分割演算ステップと、前記複数の分割演算ステップの結果を前記結合演算を用いて結合する結合ステップとを有し、前記結合ステップは、前記複数の分散秘密情報を前記結合演算により結合すると得られる秘密情報を用いて前記被演算情報に対して第２演算を施した結果と同一となるよう、前記分散演算ステップの結果を前記結合演算を用いて結合する。
【００２３】
また、前記第１演算と、前記第２演算は、同じ演算であることとしてもよい。
この構成によれば、前記秘密情報を用いた演算の代わりに、複数の前記分割秘密情報を用いた演算によって、前記秘密情報を用いた演算と同じ実行結果を得ることができる。
よって、前記秘密情報がメモリ上に現れることがないので、秘密情報の漏洩を防ぐことができ、機密性を向上させることができる。
【００２４】
また、偶然に分割秘密情報が秘密情報と同じ値である場合であっても、他の分割秘密情報についても同様の演算が行われることとなるので、その分割秘密情報が秘密情報と同じ値であることを分かりにくくすることができる。
【発明を実施するための最良の形態】
【００２５】
＜第１実施形態＞
＜概要＞
本発明の一実施形態に係る実行プログラム生成装置は、ユーザが作成した、暗号化データを復号鍵を用いて復号するような秘匿性の要求される処理を含むプログラムに対し、実行時に前記復号鍵がメモリに現れないようにするなど秘匿性を向上させる変換処理を行い、前記変換処理後のプログラムをコンパイルして、不正解析が困難な実行プログラムを生成するものである。
【００２６】
ユーザが作成するプログラムは、一例として、暗号化された音楽データやビデオデータなどのコンテンツを、秘密情報である復号鍵を用いて復号し、再生するプレーヤプログラムであり、図１に示すプログラム６０１のように、Ｃ言語など所定のプログラム言語の仕様に基づき作成される。
以下、プログラム６０１を例にして説明を続ける。
【００２７】
プログラム６０１は、複数行のテキストからなる。テキストの各行を、以下、コードという。
プログラム６０１は、秘密情報を扱い秘匿性が要求されるコード６１１「ｄａｔａ２  ＝  ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）；」を含む。コード６１１は、上述した暗号化データ或いはその一部を復号し、復号結果を格納する演算の一例である。
【００２８】
ｄａｔａ１は変数であって、復号される対象のデータである。
ＫＥＹは、プログラム中に埋め込まれている定数であって、データを復号するための復号鍵である。
関数ｆ＿ｘｏｒ（Ａ，Ｂ）は、８ビットの引数ＡとＢの各桁の排他的論理和を、戻り値の当該桁の値とするものである。ここで、８ビットの最下位桁から順にビット０、ビット１、ビット２、・・・・ビット７と称し、変数Ｘのｊビット目の値を、Ｘ：ｊと記載する。また、以下、１６進数を０ｘＹの様に記載する。０ｘはその数が１６進数であることを示す。０ｘＦは１０進数の１５を示し、０ｘＦＦは１０進数の２５５を示す。
【００２９】
ｆ＿ｘｏｒ（Ａ，Ｂ）は、具体的には、引数Ａ、引数Ｂそれぞれのビット０について、排他的論理和（ＸＯＲ）を算出して、算出結果を戻り値のビット０とし、引数Ａ、引数Ｂそれぞれのビット１について、ＸＯＲを算出して、算出結果を戻り値のビット１とし、ビット２〜ビット７までについても同様の処理を行うことで、８ビットの戻り値を計算する。例えば、ｄａｔａ１＝０ｘ０３、ＫＥＹ＝０ｘ０３の場合であれば、ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）の戻り値は、０ｘ００となる。
【００３０】
ここで、ｆ＿ｘｏｒ（Ａ，Ｂ）の引数Ａ、Ｂの各桁を独立に排他的論理和処理するものであるので、Ａ、Ｂは８ビット以外の、例えば、１０２４ビット、２０４８ビット等であってもよく、この場合も１０２４ビット、２０４８ビット等の各桁についての排他的論理和の算出結果を連結すればよい。また、引数Ａ，Ｂが１ビット長である、即ちｄａｔａ１とＫＥＹが共に１ビット長である場合は、コード６１１は、「ｄａｔａ２  ＝  ｄａｔａ１  ＾  ＫＥＹ；」と同じである。ここで、「＾」は、ＸＯＲを示す演算子である。
【００３１】
また、Ａ、Ｂが２ビット長であれば、ｄａｔａ２＝ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）は、下記の２つの式による処理がプログラム６０１に記載されているのと同じとなる。
ｄａｔａ２：１  ＝  ｄａｔａ１：１  ＾  ＫＥＹ：１；
ｄａｔａ２：０  ＝  ｄａｔａ１：０  ＾  ＫＥＹ：０；
プログラム６０１をそのままコンパイルして実行プログラムを生成し、コンピュータ上で実行すると、実行プログラムのコード６１１に該当する部分をコンピュータが実行する際に、メモリ上に、復号鍵ＫＥＹが現れてしまうので、デバッガやＩＣＥ（Ｉｎ−Ｃｉｒｃｕｉｔ  Ｅｍｕｌａｔｏｒ、登録商標）のような解析ツールで実行プログラムを実行中のメモリ上のデータを解析すると、復号鍵ＫＥＹの即値を得ることが出来てしまう。
【００３２】
本発明の実行プログラム生成装置は、プログラム６０１から、一例として図１に示すようなプログラム６０５を一旦生成し、プログラム６０５をコンパイルして実行プログラムを生成する。
プログラム６０５の詳細は後述するが、プログラム６０１中のコード６１１が、プログラム６０５においては複数のコード６１２、コード６１３、コード６１４、コード６１５に分けられており、コード６１２、コード６１３、コード６１４、コード６１５を実行すれば、コード６１１と同内容の処理が行われる。
【００３３】
ユーザの作成したプログラムにおいて、前述のように、同内容の処理に変換されたプログラムを変換プログラムという。前述したプログラム６０５は、変換プログラムである。
また、プログラム６０５から生成する実行プログラムを、コンピュータ上で実行しても、メモリ上に復号鍵ＫＥＹの直値が現れることなくＫＥＹを使った演算と同一の結果が得られるので、不正解析により容易に鍵が暴露されるのを避けることができる。
＜構成＞
以下、本発明の一実施形態である実行プログラム生成装置１０について、図面を用いて説明する。
【００３４】
実行プログラム生成装置１０は、図２に示すように、入力部１１と、プログラム保持部１２と、変換プログラム生成部１３と、実行プログラム生成部１４とを含んで構成される。
実行プログラム生成装置１０は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレィユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、実行プログラム生成装置１０は、その機能を達成する。
＜入力部１１、プログラム保持部１２、実行プログラム生成部１４＞
入力部１１は、ユーザがキーボード、マウス（図示せず）などの入力装置を用いて入力する、実行プログラム生成装置１０に対する指示を受け付けて、前記指示の内容に応じた処理部に、前記指示を送信する。
【００３５】
プログラム保持部１２は、ハードディスクなどの記憶装置であり、ユーザが作成したプログラムを保持する。プログラム保持部１２は、一例としてプログラム６０１を保持している。
実行プログラム生成部１４は、ＣＰＵ及びコンパイラから成り、変換プログラム生成部１３により生成された変換プログラムを、コンピュータが実行可能な実行プログラムに変換する。
＜変換プログラム生成部１３＞
変換プログラム生成部１３は、ＣＰＵ及びその制御プログラムから成り、ユーザが作成したプログラムを変換プログラムに変換する。
【００３６】
変換プログラム生成部１３は、図２に示すように、秘密演算指定部１０１と、分割秘密情報生成部１０２と、プログラム取得部１０３と、分割数指定部１０４と、結合関数保持部１０５と、プログラム変換部１０６と、結合関数生成部１０７とを含んで構成される。
（プログラム取得部１０３）
プログラム取得部１０３は、入力部１１から、変換すべきプログラムの取得指示を受信すると、プログラム保持部１２から前記取得指示により示されるプログラムを読み出して、ディスプレイ（図示せず）に表示する。ここで、前記取得指示は、変換すべきプログラムが記録されたファイル名を含むものとする。
【００３７】
一例として、プログラム取得部１０３は、入力部１１から、プログラム６０１が記録されたファイル名を含む取得指示を受信し、前記ファイル名で識別されるファイルに記録されたプログラム６０１をプログラム保持部１２から読み出して、前記ディスプレイに表示する。
（秘密演算指定部１０１）
秘密演算指定部１０１は、入力部１１から、プログラム中の秘密情報を特定するための情報である秘密特定情報を取得し、前記秘密特定情報を分割秘密情報生成部１０２に出力する。
【００３８】
前記秘密特定情報は、一例として、秘密情報を含むコード（例えば、コード６１１）の位置を示す秘密位置情報、前記秘密情報を含む。
例えば、前記秘密位置情報は、プログラム６０１におけるコード６１１の行番号であり、秘密情報は「ＫＥＹ」である。
具体的な取得手順の一例としては、ユーザが、プログラム取得部１０３がディスプレイに表示されているプログラム６０１を見ながら、秘密情報を含み秘匿性の向上を希望するコード（例えば、コード６１１）を探し、前記秘密情報を指示するために前記秘密特定情報を入力部１１に対し入力する。秘密演算指定部１０１は、入力された前記秘密特定情報を、入力部１１を介して取得する。
（分割数指定部１０４）
分割数指定部１０４は、ユーザが入力する分割数を、入力部１１を介して取得し、当該分割数を結合関数生成部１０７に対して出力する。
【００３９】
前記分割数は、前記秘密情報をいくつの分割秘密情報に分割するかを示す。
秘密情報の分割及び分割秘密情報については、後述する。
（結合関数保持部１０５）
結合関数保持部１０５は、ハードディスクなどの記憶装置であり、１以上の結合関数を保持する。
【００４０】
結合関数は、複数の分割秘密情報を結合して、秘密情報を生成するための関数である。
結合関数保持部１０５は、結合関数ｆ（）を保持している。
第１実施形態では、ｆ（）の一例として、結合関数ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）を保持しているものとする。
ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）は、８ビットの引数Ｐ１、Ｐ２、Ｐ３の各桁について、多数決演算を行い、その多数決結果を、戻り値の該当桁の値とするものである。
【００４１】
前記多数決演算を行う関数ｆ（）の一例である関数４０１を図３に示す。
関数４０１は、ｘ，ｙ，ｚのうち、半数以上、すなわち２つ以上が、値１である場合に１を出力する多数決演算である。
関数４０１は、ｘ、ｙ、ｚの３つの数が入力されると、図３中の真理値表４０２に従って、結合結果を出力する。
【００４２】
例えば、関数４０１に、ｘ＝０，ｙ＝０，ｚ＝０が入力されると真理値表４０２に従って０を出力し、ｘ＝０，ｙ＝１，ｚ＝１が入力されると真理値表４０２に従って１を出力する。
例えば、ｆ＿ｍａｊｏｒ（０ｘ０３，０ｘ０３，０ｘ０２）は、Ｐ１＝０ｘ０３、Ｐ２＝０ｘ０３、Ｐ３＝０ｘ０２について、Ｐ１のビット０である値１をｘ、Ｐ２のビット０である値１をｙ、Ｐ３のビット０である値０をｚとしたｆ（１，１，０）＝１を、ｆ＿ｍａｊｏｒ（）の戻り値のビット０とする。
【００４３】
同様に、Ｐ１のビット１である値１をｘ、Ｐ２のビット１である値１をｙ、Ｐ３のビット１である値１をｚとしたｆ（１，１，１）＝１を、ｆ＿ｍａｊｏｒ（）の戻り値のビット１とし、ビット２〜ビット７についても同様に処理して、８ビットの戻り値を計算し、戻り値を返却する。
ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）も、上述したｆ＿ｘｏｒ（Ａ，Ｂ）と同様に、Ｐ１、Ｐ２、Ｐ３の各桁を独立に多数決演算処理するものであるので、Ｐ１，Ｐ２，Ｐ３が８ビット以外の、例えば、１０２４ビット、２０４８ビット等であってもよく、この場合も１０２４ビット、２０４８ビット等の各桁についての多数決演算の算出結果を連結すればよい。また、引数Ｐ１、Ｐ２、Ｐ３が１ビット長である場合、「ｄａｔａ２＝ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）」は、「ｄａｔａ２＝ｆ（Ｐ１，Ｐ２，Ｐ３）」と同じである。
【００４４】
結合関数保持部１０５は、結合関数として、関数ｆ＿ｍａｊｏｒ（）以外の関数も保持する。
例えば、ｆ＿ｍａｊｏｒ（）と同様に、入力される引数の各桁について図４に示す関数４２１を適用する関数や、入力される引数の各桁について、図５に示す関数４４１を適用する関数などである。
【００４５】
ここで、関数４０１、関数４２１、関数４４１中の記号「｜」は、論理和を示し、記号「＆」は論理積を示す。
また、図４に、関数ｆの一例である関数４２１とその真理値表４２２を示し、図５に、関数ｆの一例である関数４４１と、その真理値表４４１を示す。
関数４２１、関数４４１中の記号「〜」は、否定の論理演算を示す。
【００４６】
図４、図５ついては、図３の説明と重複するので、詳細説明は割愛する。
（結合関数生成部１０７）
結合関数生成部１０７は、分割数指定部１０４から前記分割数を受信すると、前記分割数に適した結合関数のうちの１つを、結合関数保持部１０５に保持されている結合関数の中からランダムに１つ選択する。
【００４７】
分割数が３の場合であれば、結合関数保持部１０５に保持されている結合関数であって３入力を備えるもの、一例として結合関数ｆ＿ｍａｊｏｒ（）を選択する。
結合関数生成部１０７は、前記選択を行った後、選択した関数に係る情報であって、鍵の分割方法を特定する情報、例えば、「多数決」を示す情報である分割方法情報と、前記分割数とを、分割秘密情報生成部１０２に出力し、選択した結合関数をプログラム変換部１０６に通知する。
【００４８】
本実施形態では、結合関数生成部１０７は、結合関数保持部１０５に記憶されている結合関数からランダムに結合関数を選択することとしているが、結合関数を生成することとしてもよい。
なお、結合関数生成部１０７が保持若しくは生成する結合関数は、必ずしも多数決演算を行う関数である必要はないが、いずれも所定の性質を満たしている必要がある。その性質については後に詳細に述べるので、ここでの説明は省略する。
（分割秘密情報生成部１０２）
分割秘密情報生成部１０２は、秘密演算指定部１０１から秘密特定情報を受信し、結合関数生成部１０７から分割方法情報と分割数とを受信して、前記分割方法情報が示す分割方法に基づき、秘密情報を分割数に分割する。
【００４９】
本実施形態では、分割数Ｍは３であり、分割方法情報が「多数決」を示すものとする。また、分割数Ｍは、多数決を行う必要があることから奇数が設定されるものとする。
分割秘密情報生成部１０２は、受信した秘密特定情報に含まれる秘密情報「ＫＥＹ」に基づき、多数決の結果が「ＫＥＹ」となるような３個の分割秘密情報Ｋ１、Ｋ２、Ｋ３を生成する。
【００５０】
分割秘密情報生成部１０２による、分割秘密情報の生成処理について、図６のフローチャートを用いて説明する。ここで、本フローチャートは、ＫＥＹ、Ｋ１〜Ｋ３のそれぞれが１ビットである場合についての処理を示すものであり、ＫＥＹ、Ｋ１〜Ｋ３のそれぞれが、複数ビットから成る場合には、複数ビットの各桁について、当該フローチャートに示す処理を適用すれば、所望ビット長のＫＥＹについて、所望ビット長のＫ１〜Ｋ３を得ることができる。
【００５１】
図６中の変数ｉは、値の設定の対象となっている分割秘密情報Ｋｉを示すためのものである。
変数ｊは、値が設定済みである分割秘密情報Ｋ１〜Ｋｉのうち、「ＫＥＹ」と同じ値が設定された分割秘密情報の数を数えるためのものである。
分割秘密情報生成部１０２は、まず、変数ｉを１で初期化し、変数ｊを０で初期化する（ステップＳ１０１）。
【００５２】
次いで、Ｍに関し、多数決において多数となる最低数ｍを算出する（ステップＳ１０２）。ｍは、式Ｉｎｔ（Ｍ／２）＋１を用いて算出する。ここでＩｎｔ（ｘ）は、ｘの整数部を示す。
次に、分割秘密情報生成部１０２は、ｊがｍ以上か否かを判定する（ステップＳ１０３）。
【００５３】
ｊがｍ以上である場合（ステップＳ１０３：ＹＥＳ）、Ｋ１〜ＫＭの多数決を取ると「ＫＥＹ」になることが確定しているので、Ｋｉに関数ｒａｎｄ（）の戻り値を設定する（ステップＳ１０５）。
ここで、関数ｒａｎｄ（）は、戻り値として０か１のいずれかをランダムに返却する関数である。
【００５４】
ｊがｍ未満である場合（ステップＳ１０３：ＮＯ）、ＫＥＹと同じ値を設定すべき分割秘密情報の最低数である（ｍ−ｊ）が、値が未設定である分割秘密情報の数（Ｍ＋１−ｉ）以下であるか否かを判定する（ステップＳ１０４）。
（ｍ−ｊ）が、（Ｍ＋１−ｉ）以下である場合（ステップＳ１０４：ＹＥＳ）、値が未設定である分割秘密情報の全てに値ＫＥＹを設定する必要があるので、ＫｉにＫＥＹを設定し（ステップＳ１０７）、ステップＳ１０８に移行する。
【００５５】
（ｍ−ｊ）が、（Ｍ＋１−ｉ）以下でない場合（ステップＳ１０４：ＮＯ）、値が未設定の分割秘密情報全てにＫＥＹと同じ値を設定する必要はないので、ステップＳ１０５に移行し、ランダムな値を分割秘密情報に設定する。
ステップＳ１０５の終了後、分割秘密情報生成部１０２は、ＫｉがＫＥＹと一致するか否かを判定し（ステップＳ１０６）、一致しない場合には（ステップＳ１０６：ＮＯ）、ステップＳ１０９に移行し、一致する場合（ステップＳ１０６：ＹＥＳ）には、ｊを１インクリメントして（ステップＳ１０８）、ステップＳ１０９に移行する。
【００５６】
次に、分割秘密情報生成部１０２は、（ｉ＋１）がＭ以上であるか否かを判定し（ステップＳ１０９）、Ｍ以上でない場合には（ステップＳ１０９：ＮＯ）、ｉを１インクリメントして（ステップＳ１１０）、ステップＳ１０３に移行し、Ｍ以上である場合（ステップＳ１０９：ＹＥＳ）、処理を終了する。
分割秘密情報生成部１０２は、上記説明した手順によって、秘密情報ＫＥＹに基づいて、分割秘密情報Ｋ１〜ＫＭの多数決の結果が、ＫＥＹになるようなＫ１〜ＫＭを生成した後、生成したＫ１〜Ｋ３と、前記秘密特定情報とを、プログラム変換部１０６に対して出力する。
（プログラム変換部１０６）
プログラム変換部１０６は、分割秘密情報生成部１０２から、前記秘密特定情報と前記分割数個の前記分割秘密情報を取得し、結合関数生成部１０７から結合関数の通知を取得し、プログラム取得部１０３からプログラムを取得し、取得したプログラムに対し、（ａ）演算分割処理、（ｂ）インターリーブ処理、（ｃ）ダミー追加処理、（ｄ）結合関数追加処理を行う。
【００５７】
以下、（ａ）〜（ｄ）について、順に、再び図１を参照しながら説明する。
（ａ）演算分割処理
演算分割処理は、プログラムに含まれる秘密演算をＭ個の分割秘密演算に分割する処理である。
演算変換部１０６は、プログラム６０１における、秘密特定情報に含まれる行番号のコード６１１「ｄａｔａ２＝ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）；」に関し、秘密情報による演算を分割秘密情報による演算に置き換えた、Ｍ個の演算、すなわち、コード６１２「Ｐ１＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ１）；」、コード６１３「Ｐ２＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ２）；」、コード６１４「Ｐ３＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ３）；」を生成し、コード６１１をコード６１２、６１３、６１４に置き換える。
【００５８】
また、ＫＥＹの値を定義するコード６３１「ＫＥＹ＝０ｘ０３；」をＫ１、Ｋ２、Ｋ３の値を定義するコード６３２「Ｋ１＝０ｘ０５；」、コード６３３「Ｋ２＝０ｘ０３；」、コード６３４「Ｋ３＝０ｘ０２；」に置き換える。
コード６１１がコード６１２、６１３、６１４に置き換えられ、コード６３１がコード６３２、６３３、６３４に置き換えられたプログラムが、プログラム６０２である。
（ｂ）インターリーブ処理
プログラム変換部１０８は、プログラムの処理結果を変えることなく、プログラム６０２におけるコードの並び順を置き換える。
【００５９】
図１中の、プログラム６０３は、プログラム６０２がインターリーブ処理されたものである。
具体的には、プログラム変換部１０８は、プログラム６０２において、プログラム６０１から置き換えられたコードであるコード６１２、６１３、６１４の３つが、プログラム中の他のコードにより挟み込まれる（インターリーブされる）ように配置する。
【００６０】
一例として、プログラムの先頭のコード「ｃ＝１００；」を、コード６１３とコード６１４の間に挟み込み、コード「ａ＝ｂ＋ｃ；」、「ｂ＝ｂ＋１；」を、コード６１４と６１２の間に挟み込んでいる。
また、コード６１２、６１３、６１４は、それぞれ独立したコードであるため、並び順序を変更しても結果は変わらないので、プログラム変換部１０８は、これらコードの並び順を変更する。
【００６１】
但し、コード「ｄａｔａ１＝ｄａｔａ１＜＜２；」は、コード６１２、６１３、６１４の前に配置してしまうと、コード６１２、６１３、６１４の処理結果が変わってしまうので、コード６１２、６１３、６１４より後に配置したままである。
このインターリーブ処理によって、各分割秘密情報を用いた演算処理の位置が一箇所に固まらず、離れた場所に拡散されるため、不正解析をより困難にするという効果がある。
【００６２】
（ｃ）ダミー追加処理
プログラム変換部１０６は、インターリーブ処理されたプログラム６０３に対し、プログラムの実行結果には影響を及ぼさないダミーの処理を示すコードを追加する。
プログラム変換部１０６は、一例として、図１のプログラム６０４に示すように、プログラム６０３に対し、
コード６２１「Ｔｅｍｐ１＝０；」
コード６２２「Ｔｅｍｐ２＝１０；」
コード６２３「Ｔｅｍｐ１＝Ｔｅｍｐ１＋Ｔｅｍｐ２；」
コード６２４「Ｔｅｍｐ２＝ｄａｔａ２＋Ｔｅｍｐ１；」
の４つのダミーのコードを追加する。
【００６３】
Ｔｅｍｐ１、Ｔｅｍｐ２は元々のプログラム６０３には含まれていなかったダミーの変数であり、このプログラムの実行結果には影響しない変数である。また、コード６２１〜６２４は、元々プログラム６０３には存在していなかった新たなコードである。
コード６２４は、プログラム６０３中に存在していたｄａｔａ２を用いているが、プログラムの実行結果には影響を与えないように用いられている。
【００６４】
（ｄ）結合関数追加処理
プログラム変換部１０６は、結合関数生成部１０７から取得する結合関数ｆ（）の引数に、コード６１２〜６１４の演算結果であるＰ１〜Ｐ３を与える、コード６１５「ｄａｔａ２＝ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）；」をプログラム６０４に追加することによりプログラム６０５を生成する。
【００６５】
以上説明した処理によって、プログラム変換部１０６は、プログラム６０１を、変換プログラムであるプログラム６０５に変換し、前記変換プログラムを実行プログラム生成部１４に出力する。
＜動作＞
実行プログラム生成装置１０の動作について、図７に示すフローチャートを用いて説明する。
【００６６】
ユーザは、ユーザ操作により、秘密情報を含むプログラム６０１を作成し、プログラム６０１を電子ファイルとしてプログラム保持部１２に保持させる。
ユーザは、キーボード等に対するユーザ操作によりプログラム６０１を含む電子ファイルの表示を要求する。
入力部１１は、前記要求に基づき、前記電子ファイル名を含む取得指示を、プログラム取得部１０３に送信する（ステップＳ３０１）。
【００６７】
プログラム取得部１０３は、電子ファイル名により識別される電子ファイルを、プログラム保持部１２から取得し、前記ディスプレイ（図示せず）にプログラム６０１を表示させる。
ユーザは、ディスプレイに表示されたプログラム６０１を参照しながら、ユーザ操作により、入力部１１に対し、プログラム６０１中に含まれる秘密情報に係る秘密特定情報を入力する。
【００６８】
前記秘密特定情報は、コード６１１のプログラム６０１における行番号、秘密演算に用いられている演算子  「＾」、秘密情報「ＫＥＹ」を含む。
秘密演算指定部１０１は、入力部１１を介して前記秘密特定情報を取得し、前記秘密特定情報を分割秘密情報生成部１０２に送信する（ステップＳ３０２）。
次に、ユーザは、ユーザ操作により、入力部１１に対し、分割数を入力する。ここでは、分割数は３である。
【００６９】
分割数指定部１０４は、入力部１１から、前記分割数を取得し（ステップＳ３０３）、前記分割数を結合関数生成部１０７に送信する。
結合関数生成部１０７は、前記分割数を受信し、前記分割数に基づき、結合関数保持部１０５に保持されている結合関数のうちの１つを選出し（ステップＳ３０４）、選出した結合関数に係る情報であって、鍵の分割方法を特定する情報、例えば、「多数決」を示す情報である分割方法情報と、前記分割数とを、分割秘密情報生成部１０２に出力し、選択した結合関数をプログラム変換部１０６に通知する。
【００７０】
分割秘密情報生成部１０２は、前記分割方法情報と、前記分割数とを受信し、秘密演算指定部１０１から受信した秘密特定情報に含まれる秘密情報「ＫＥＹ」に基づき、多数決の結果が秘密情報「ＫＥＹ」となるような前記分割数である３個の分割秘密情報Ｋ１〜Ｋ３を生成し（ステップＳ１０５）、生成した３個の分割秘密情報であるＫ１〜Ｋ３を、プログラム変換部１０６に対して出力する（ステップＳ３０５）。
【００７１】
プログラム変換部１０６は、分割秘密情報生成部１０２から、前記秘密特定情報を取得し、結合関数生成部１０７から結合関数の通知を取得し、プログラム取得部１０３からプログラム６０１を取得し、取得したプログラム６０１に対し、演算分割処理を実行してプログラム６０２を生成し（ステップＳ３０６）、インターリーブ処理を実行してプログラム６０３を生成し（ステップＳ３０７）、ダミー追加処理を行ってプログラム６０４を生成し（ステップＳ３０８）、結合関数追加処理を行って、プログラム６０５を生成し（ステップＳ３０９）、プログラム６０５を実行プログラム生成部１４に対して出力する。
【００７２】
実行プログラム生成部１４は、プログラム変換部１０６から、変換プログラムであるプログラム６０５を取得して、コンパイルし、実行プログラムを生成する。
＜第２実施形態＞
上述の第１実施形態においては、秘密情報に係る処理、例えばコード６１１「ｄａｔａ２  ＝ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）；」は、入力される引数の各ビットについて論理演算を行うものであった。論理演算とは、ＡＮＤ（論理積）やＯＲ（論理和）、ＮＯＴ（否定）、ＸＯＲ（排他的論理和）、ビットシフト演算などである。
【００７３】
論理演算は、暗号アルゴリズムなどのプログラムでは比較的良く使用される演算であるため、プログラム中のこのような論理演算子は、解析者にとって暗号鍵のような秘密情報を不正に取得する手がかりになり易いものである。
秘密情報に係る処理における演算が、論理演算である場合には第１実施形態にて説明した手法で処理できるのであるが、演算が算術演算である場合には、既に述べたような分割秘密情報を用いた演算への置き換えでは変換前と同じ演算結果が得られず、算術演算時に生じる各ビット毎の桁上がりや桁下がりを考慮した演算処理に変換する必要がある。
【００７４】
ここで、算術演算とは、＋（加算）、−（減算）、×（積算）、÷（除算）を指し、暗号アルゴリズムでは比較的使用されることは少ないが、使用された場合はそれが特徴となり、論理演算子と同様、解析の手がかりになり得るものである。
第２実施形態は、算術演算子を含んだ秘密演算を含むプログラムを、算術演算時に生じる各ビット毎の桁上がりや桁下がりを考慮した変換プログラムへと変換するものである。
【００７５】
以下、第２実施形態について、第１実施形態と差異のある部分についてのみ、図面を用いて説明する。
第２実施形態における実行プログラム生成装置は、図８に示すように、ユーザが生成するプログラム７０１をプログラム７０２に変換する。
プログラム７０１は、プログラム６０１の各ビット値を論理演算するコード６１１「ｄａｔａ２  ＝  ｆ＿ｘｏｒ（ｄａｔａ１，ＫＥＹ）；」が、算術演算を含むコード７１１「ｄａｔａ２  ＝  ｄａｔａ１  ＋  ＫＥＹ；」に置き換えられたものある。
【００７６】
プログラム７０２は、コード７１１に基づき生成されたコード７１２「Ｋ［］＝｛ｄｕｍｍｙ，Ｋ１，Ｋ２，Ｋ３｝；」とコード７１３「ｄａｔａ２＝ｆｕｎｃ（ｄａｔａ１，Ｋ）；」を含む。
コード７１２中のＫ１、Ｋ２、Ｋ３は、第１実施形態と同様に、秘密情報ＫＥＹに基づき生成された分割秘密情報である。
【００７７】
関数ｆｕｎｃ（ｄａｔａ１，Ｋ）は、引数として受け取る秘密演算ｄａｔａ１と、分割秘密情報の格納アドレスＫとを用いて、ｄａｔａ２を生成する関数である。ｆｕｎｃ（）の詳細は後述する。
第２実施形態で扱う算術演算は、桁上がり（キャリー）が発生するため、第１実施形態のように単純に結合関数ｆ（）を適用するだけでは、適切な演算結果は得られない。そこで、第２実施形態では、結合関数ｆ（）を用いてｄａｔａ２を算出する関数ｆｕｎｃ（）を用いる。
【００７８】
第２実施形態における実行プログラム生成装置１１００は、一例として図９に示すように、入力部１１と、プログラム保持部１２と、変換プログラム生成部１３００と、実行プログラム生成部１４とを含んで構成される。
実行プログラム生成装置１１００は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、実行プログラム生成装置１１００は、その機能を達成する。
【００７９】
入力部１１、プログラム保持部１２、実行プログラム生成部１４については、第１実施形態において説明済みである。
変換プログラム生成部１３００は、ユーザが作成したプログラムを変換プログラムに変換する。
変換プログラム生成部１３００は、図９に示すように、秘密演算指定部１１０１と、分割秘密情報生成部１０２と、プログラム取得部１０３と、分割数指定部１０４と、結合関数保持部１０５と、プログラム変換部１１０６と、結合関数生成部１１０７とを含んで構成される。変換プログラム生成部１３００における、変換プログラム生成部１３と同様の構成要素については、第１実施形態と同符号を付しており、説明は省略する。
【００８０】
秘密演算指定部１１０１は、生成した秘密特定情報を分割秘密情報生成部１０２のみでなく、結合関数生成部１１０７にも出力する以外は、秘密演算指定部１０１と同様である。
結合関数保持部１０５は、演算子を示す演算子情報に対応づけて、結合関数４０１、４２１、４４１に加え、関数ｆｕｎｃ（）を保持している。
【００８１】
例えば、結合関数保持部１０５は、演算子「＋」と、関数ｆｕｎｃ（）とを対応づけて保持し、演算子「＾」と、結合関数４０１とを対応づけて保持し、演算子「＾」と、結合関数４２１とを対応づけて保持し、演算子「＾」と、結合関数４４１とを対応づけて保持している。
結合関数４０１、４２１、４４１、関数ｆｕｎｃ（）のそれぞれは、演算子を示す演算子情報と対応付けられて記憶されている。
【００８２】
結合関数生成部１１０７は、分割数指定部１０４から分割数を取得し、秘密演算指定部１１０１から秘密特定情報を取得する。
次に、結合関数生成部１１０７は、取得した秘密特定情報に含まれる演算子情報が、算術演算を示すか否かを判定し、算術演算（特に「＋」）を示す場合には、結合関数保持部１０５から、前記算術演算及び前記分割数に対応する関数ｆｕｎｃ（）を選出し、論理演算（特に「＾」）を示す場合には、前記論理演算及び前記分割数に対応する結合関数４０１、４２１、４４１のいずれかをランダムに選出する。論理演算である場合については、第１実施形態において説明済みであるので、以下、演算子情報が算術演算（特に「＋」）を示し、関数ｆｕｎｃ（）が選出された場合について、説明する。
【００８３】
結合関数生成部１１０７は、プログラム変換部１１０６に対し結合関数としてｆｕｎｃ（）を通知し、分割秘密情報生成部１０２に対して前記秘密特定情報と、秘密情報の分割方法を示す分割方法情報を通知する。
秘密情報は、第１実施形態と同様に、結合関数ｆ（）を適用すると元の秘密情報が得られるような形で分割される。
【００８４】
以下の説明では、第１実施形態と同様、結合関数ｆ（）は多数決演算を行う関数であるものとして説明を行うので、分割方法情報は「多数決」を示すものとする。
なお、結合関数ｆ（）は、第１実施形態と同様、所定の性質が満たされていれば、多数決演算に限るものではないが、その性質については後述するので、ここでの説明は省略する。
【００８５】
分割秘密情報生成部１０２は、結合関数生成部１１０７から、前記秘密特定情報と、前記分割方法情報とを受信すると、第１実施形態に示したように、前記秘密特定情報に含まれる秘密情報を、前記分割方法情報に基づき前記分割数に分割する。次に、分割秘密情報生成部１０２は、前記秘密特定情報と、前記分割によって生成された分割秘密情報をプログラム変換部１１０６に対し出力する。
【００８６】
プログラム変換部１１０６は、分割秘密情報生成部１０２から、前記秘密特定情報と、前記分割数個の前記分割秘密情報を取得し、結合関数生成部１１０７から結合関数の通知を取得し、プログラム取得部１０３からプログラムを取得し、取得したプログラムに対し、分割秘密情報と、結合関数とを追加する。
具体例としては、プログラム変換部１１０６は、プログラム取得部１０３からプログラム７０１を取得し、プログラム７０１に対し、分割秘密情報を定義するコード７１２「Ｋ［］＝｛ｄｕｍｍｙ，Ｋ１，Ｋ２，Ｋ３｝；」とコード７１３「ｄａｔａ２＝ｆｕｎｃ（ｄａｔａ１，Ｋ）；」を追加する。
【００８７】
コード７１２中のｄｕｍｍｙは、ｆｕｎｃ（）が、説明の簡易化のため、配列Ｋ［］の先頭を使用しないこととしていることから挿入されたものであり、ダミーである以外の意味は特に持たない。
（関数ｆｕｎｃ（）についての説明）
ｆｕｎｃ（）は、ｄａｔａ１及び配列Ｋ［］＝｛ｄｕｍｍｙ，Ｋ１，Ｋ２，Ｋ３｝の先頭アドレスを引数に受け取る。
【００８８】
関数ｆｕｎｃ（）における処理について、図１０を用いて説明する。
まず、最終的に出力する戻り値となるＰを０で初期化し、各桁のキャリーを示すＣ１〜Ｃｎを０で初期化する（ステップＳ５０１）。
次に変数ｍを復号鍵のビット長で初期化する（ステップＳ５０２）。本実施形態では、復号鍵ＫＥＹのビット長は、３である。
【００８９】
次に、変数ｊ、ｔｍｐのそれぞれを０で初期化する（ステップＳ５０３）。
次に、変数ｉを１で初期化する（ステップＳ５０４）。
次に、ｉが分割数より大きいか否かを判定し（ステップＳ５０５）、大きい場合（ステップＳ５０５：ＹＥＳ）、後述するステップＳ５０９に移行し、大きくない場合（ステップＳ５０５：ＮＯ）、ｔｍｐにｄａｔａ１：ｊ＾Ｋｉ：ｊを代入する（ステップＳ５０６）。
【００９０】
ここで、Ｘ：ｊの記載はデータＸのｊビット目を示す。ｄａｔａ１：０は、ｄａｔａ１の０ビット目であり、ｉ＝１、ｊ＝０の場合、Ｋｉ：ｊはＫ１の０ビット目である。
次に、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，・・・ｔｍｐ＾Ｃｎ）の計算結果をＰｉに代入し（ステップＳ５０７）、ｉを１インクリメントし（ステップＳ５０８）、ステップＳ５０５に戻る。
【００９１】
ステップＳ５０５においてｉが分割数より大きいと判定された場合、ｆ（Ｐ１，Ｐ２，・・・Ｐｎ）を計算し、Ｐｔｍｐに代入し（ステップＳ５０９）、Ｐを（（Ｐｔｍｐ＜＜ｊ）｜Ｐ）で更新する（ステップＳ５１０）。
次に、ｊ＋１がｍより大きいか否かを判定し（ステップＳ５１１）、大きい場合（ステップＳ５１１：ＹＥＳ）には処理を終了し、大きくない場合（ステップＳ５１１：ＮＯ）、キャリーＣ１、Ｃ２、・・・Ｃｎを更新する（ステップＳ５１２）。
【００９２】
キャリーの更新には、関数ｃａｒｒｙ（）を用いて下式により行う。
Ｃ１  ←  ｃａｒｒｙ（ｄａｔａ１：ｊ，  Ｋ１：ｊ，  Ｃ１）
Ｃ２  ←  ｃａｒｒｙ（ｄａｔａ１：ｊ，  Ｋ２：ｊ，  Ｃ２）
・・・・
Ｃｎ  ←  ｃａｒｒｙ（ｄａｔａ１：ｊ，  Ｋｎ：ｊ，  Ｃｎ）
ここで、関数ｃａｒｒｙ（Ａ，Ｂ，Ｃ）は、引数Ａ、Ｂ、Ｃを加算する時に発生するキャリーを演算する関数である。
【００９３】
具体的には、関数ｃａｒｒｙ（Ａ，Ｂ，Ｃ）は、Ａ，Ｂ，Ｃのうち、２つが値「１」である場合に戻り値としてキャリー「１」を返却し、その他の場合、値「０」を返却する。上述した多数決演算を行う関数ｆ（）で代用してもよい。
次に、ｊを１インクリメントして（ステップＳ５１３）、ステップＳ５０５に移行する。
【００９４】
以上が、関数ｆｕｎｃ（）についての説明であるが、更に、具体的数字を当てはめた例で説明する。
（関数ｆｕｎｃ（）の動作についての、具体的数字の例による補足説明）
ｆｕｎｃ（）は、ｄａｔａ１及び配列Ｋ［］＝｛ｄｕｍｍｙ，Ｋ１，Ｋ２，Ｋ３｝の先頭アドレスを引数に受け取る。
【００９５】
以下、ｄａｔａ１＝０ｘ０３、ＫＥＹ＝０ｘ０３、Ｋ１＝０ｘ０５、Ｋ２＝０ｘ０３、Ｋ３＝０ｘ０２である場合を例とする。
コード７１１「ｄａｔａ２＝ｄａｔａ１＋ＫＥＹ；」によると、ｄａｔａ２は、０ｘ０３＋０ｘ０３＝０ｘ０６となるべきものであるので、ｆｕｎｃ（）の戻り値は、０ｘ０６とならなければならない。
【００９６】
次に、図１０のフローチャートに具体的数字を当てはめて、説明する。ただし、Ｋ１、Ｋ２、Ｋ３におけるビット値がすべて０である、上位５ビットについては、説明を割愛する。
まず、ステップＳ５０１により、Ｐ＝０、Ｃ１＝Ｃ２＝Ｃ３＝０となる。
ステップＳ５０２により、ｍ＝３となる。
【００９７】
ステップＳ５０３により、ｊ＝０、ｔｍｐ＝０となる。
（ａ）ｊ＝０のループ
（ｉ＝１についてのループ）
ステップＳ５０４により、ｉ＝１となる。
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
【００９８】
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット０である１と、Ｋ１のビット０である１の排他的論理和である０となる。
ステップＳ５０７により、Ｐ１は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（０＾０，０＾０，０＾０）＝０となる。
ステップＳ５０８により、ｉは２となる。
【００９９】
（ｉ＝２についてのループ）
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット０である１と、Ｋ２のビット０である１の排他的論理和である０となる。
ステップＳ５０７により、Ｐ２は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（０＾０，０＾０，０＾０）＝０となる。
【０１００】
ステップＳ５０８により、ｉは３となる。
（ｉ＝３についてのループ）
ｉは分割数３と同値でありステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット０である１と、Ｋ３のビット０である０の排他的論理和である１となる。
【０１０１】
ステップＳ５０７により、Ｐ３は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（１＾０，１＾０，１＾０）＝１となる。
ステップＳ５０８により、ｉは４となり、ステップＳ５０５において、ＹＥＳと判定されてステップＳ５０９に移行する。
（Ｐの計算）
ステップＳ５０９により、Ｐｔｍｐはｆ（０，０，１）＝０となる。
【０１０２】
ステップＳ５１０により、Ｐは０００となる。
（Ｃ１〜Ｃ３の計算）
ステップＳ５１２により、Ｃ１は、ｃａｒｒｙ（１，１，０）＝１となり、Ｃ２は、ｃａｒｒｙ（１，１，０）＝１となり、Ｃ３は、ｃａｒｒｙ（１，０，０）＝０となる。
（ｂ）ｊ＝１のループ
（ｉ＝１についてのループ）
ステップＳ５０４により、ｉ＝１となる。
【０１０３】
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット１である１と、Ｋ１のビット１である０の排他的論理和である１となる。
ステップＳ５０７により、Ｐ１は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（１＾１，１＾１，１＾０）＝０となる。
【０１０４】
ステップＳ５０８により、ｉは２となる。
（ｉ＝２についてのループ）
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット１である１と、Ｋ２のビット１である１の排他的論理和である０となる。
【０１０５】
ステップＳ５０７により、Ｐ２は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３）＝ｆ（０＾１，０＾１，０＾０）＝１となる。
ステップＳ５０８により、ｉは３となる。
（ｉ＝３についてのループ）
ｉは分割数３と同値でありステップＳ５０５においてＮＯに分岐する。
【０１０６】
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット１である１と、Ｋ３のビット１である１の排他的論理和である０となる。
ステップＳ５０７により、Ｐ３は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（０＾１，０＾１，０＾０）＝１となる。
ステップＳ５０８により、ｉは４となり、ステップＳ５０５において、ＹＥＳと判定されてステップＳ５０９に移行する。
【０１０７】
（Ｐの計算）
ステップＳ５０９により、Ｐｔｍｐはｆ（０，１，１）＝１となる。
ステップＳ５１０により、Ｐは０１０となる。
（Ｃ１〜Ｃ３の計算）
ステップＳ５１２により、Ｃ１は、ｃａｒｒｙ（１，０，１）＝１となり、Ｃ２は、ｃａｒｒｙ（１，１，１）＝１となり、Ｃ３は、ｃａｒｒｙ（１，１，０）＝１となる。
（ｃ）ｊ＝２のループ
（ｉ＝１についてのループ）
ステップＳ５０４により、ｉ＝１となる。
【０１０８】
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット２である０と、Ｋ１のビット２である１の排他的論理和である１となる。
ステップＳ５０７により、Ｐ１は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（１＾１，１＾１，１＾１）＝０となる。
【０１０９】
ステップＳ５０８により、ｉは２となる。
（ｉ＝２についてのループ）
ｉは分割数３より小さいのでステップＳ５０５においてＮＯに分岐する。
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット２である０と、Ｋ２のビット２である０の排他的論理和である０となる。
【０１１０】
ステップＳ５０７により、Ｐ２は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（０＾１，０＾１，０＾１）＝１となる。
ステップＳ５０８により、ｉは３となる。
（ｉ＝３についてのループ）
ｉは分割数３と同値でありステップＳ５０５においてＮＯに分岐する。
【０１１１】
ステップＳ５０６により、ｔｍｐは、ｄａｔａ１のビット２である０と、Ｋ３の２ビット目である０の排他的論理和である０となる。
ステップＳ５０７により、Ｐ３は、ｆ（ｔｍｐ＾Ｃ１，ｔｍｐ＾Ｃ２，ｔｍｐ＾Ｃ３，）＝ｆ（０＾１，０＾１，０＾１）＝１となる。
ステップＳ５０８により、ｉは４となり、ステップＳ５０５において、ＹＥＳと判定されてステップＳ５０９に移行する。
【０１１２】
（Ｐの計算）
ステップＳ５０９により、Ｐｔｍｐはｆ（０，１，１）＝１となる。
ステップＳ５１０により、Ｐは０ｘ０６となる。
ステップＳ５１１の判定に基づき、処理を終了する。
＜結合関数ｆ（）が満たすべき必要十分条件＞
第１及び第２実施形態にて述べた手法で、分割秘密情報及び結合関数ｆ（）を用いて、秘密情報を用いた演算結果と同じ演算結果を得るためには、結合関数ｆ（）が以下の３つの条件を満たさなくてはならない。
【０１１３】
（条件１）ｆ（０，０，・・・，０）＝０
（条件２）ｆ（１，１，・・・，１）＝１
（条件３）〜ｆ（ｘ１，ｘ２，・・・，ｘｎ）＝ｆ（〜ｘ１，〜ｘ２，・・・，〜ｘｎ）
（ただし、〜は否定を表す論理演算である。）
上記、関数ｆ（）が満たすべき条件についてさらに詳しく説明する。
【０１１４】
（条件１）と（条件２）は式が示すように、全ての入力値が０である場合、ｆ（）の出力値も０となることと、全ての入力値が１である場合、ｆ（）の出力値も１であることである。
また、（条件３）は、一般的に自己双対関数と呼ばれる関数の条件であり、ｆ（）関数に与える各入力値を全て否定（ＮＯＴ）した入力値によるｆ（）の結果は、元の入力値のｆ（）による出力値の否定（ＮＯＴ）であることを示している。
【０１１５】
このような条件を満たす関数ｆ（）の決め方は図４、図５の関数以外にも２のｘ乗通り（但し、ｘは２の（ｎ−１）乗−１）通り存在する（ｎは分割数）。
結合関数保持部１０５にこれらの条件を満たす関数を複数保持しておき、秘密情報毎に結合関数を変えることで、解析をさらに困難にできる。
さらに本実施形態では、予め結合関数保持部１０５が複数の関数を保持しておき、結合関数生成部１０７がその中から結合関数を指定するという方法を用いたが、結合関数指定部１０７が（条件１）〜（条件３）を満たすような関数ｆ（）を毎回作成し、当該関数ｆ（）を入力引数の各桁に適用する結合関数を生成することで、結合関数保持部１０５に予め結合関数を保持することなくプログラムを変化するようにしてもよい。
【０１１６】
例えば、（条件１）〜（条件３）を満たす関数ｆ（）は、以下のようにして生成することができる。
関数ｆ（）が取りうる引数の値の全パターンのエントリを持つ真理値表を用意し、まず、条件１及び条件２を満たすため、引数が全て０であるエントリに０を、引数が全て１であるエントリに１を代入する。
【０１１７】
その後、他のエントリについて、ランダムに０か１の値を代入するとともに、そのエントリの各引数を否定した引数のエントリに、代入した値を否定した値を入れる。
具体的な例としては、引数が３つの場合、「０，１，１」のエントリに「１」が代入されると「１，０，０」のエントリには「０」を代入する。
上記の処理を全てのエントリに値が代入されるまで繰り返せば、（条件１）〜（条件３）を満たす関数の真理値表が完成する。
【０１１８】
その後は、公知の手法を用いて真理値表を元に論理式を生成してその論理式が示す演算を行う関数を生成したり、生成した真理値表を参照するような関数を生成すれば、関数ｆ（）が得られる。
またこれらの関数ｆ（）は、耐タンパー化された環境で実行されるように実装することで、解析をさらに困難にすることができる。具体的には、特殊なハードウエアを使って関数ｆを実行する方法や、通常のプログラムとは隔離された環境で動作させる等、様々な方法が考えられる。さらにソフトウエアで実装する場合においても、関数ｆを一般に知られているプログラムを読みにくくするためのダミー変数を用いたダミー処理を追加したり、プログラム中に分岐処理を追加する等、読みにくくする難読化方法で解析しにくくしてもよい。
【０１１９】
なお、上記の第２実施形態では、ｄａｔａ１にＫ１〜Ｋ３を加算する処理と加算結果を結合する処理とを関数ｆｕｎｃ（）を用いてまとめて行っていたが、これに限られるものではない。
すなわち、第１実施形態と同様に、まず、ｄａｔａ１＋Ｋ１、ｄａｔａ１＋Ｋ２、ｄａｔａ１＋Ｋ３の演算結果を算出し、その結果を、桁上がりを反映させつつ結合させるような関数ｆｕｎｃ２（）を用いて結合するとしてもよい。
＜なお書き＞
なお、本発明を上記の実施の形態に基づいて説明してきたが、本発明は、上記の実施の形態に限定されないのはもちろんである。以下のような場合も本発明に含まれる。
（１）論理演算子として、「＾」を用いて説明したが、これに限らず、論理演算を行う他の演算子でもよい。
【０１２０】
例えば、論理演算子には、ＡＮＤ（論理積）やＯＲ（論理和）、ＮＯＴ（否定）、ＸＯＲ（排他的論理和）、ビットシフト演算などがある。暗号鍵を含む暗号アルゴリズムなどのプログラムでは比較的良く使用される演算であるため、プログラム中のこのような論理演算子は、解析者にとって暗号鍵のような秘密情報を不正に取得する手がかりになり易いものである。
【０１２１】
また、算術演算子として「＋」を使用して説明したが、これに限らず他の算術演算子であってもよい。
算術演算子とは、＋（加算）の他、−（減算）、×（積算）、÷（除算）を指し、暗号アルゴリズムでは比較的使用されることは少ないが、使用された場合はそれが特徴となり、論理演算子と同様、解析の手がかりになり得るものである。
【０１２２】
なお、加算ではなく減算の場合には、桁上がりの代わりに桁下がりが発生するので第２実施形態において計算結果に桁上がりを反映させた処理と同様に桁下がりを反映させる処理が必要になる。
（２）分割数指定部１０４は、ユーザ操作により入力された分割数を入力部１１を介して取得することとしていたが、他の方法によって、分割数を取得することとしてもよい。例えば、分割数を、予め不揮発性メモリ等に保持しておき、保持されている分割数を読み出して用いることとしてもよい。
（３）分割秘密情報生成部１０２は、分割秘密情報の生成を行わず、他の方法により分割秘密情報を生成することとしてもよい。
【０１２３】
例えば、真理値表４０２を予め用意しておき、分割前の秘密情報に対応するエントリを真理値表（例えば真理値表４０２）からランダムに探し出して、エントリに対応する、ｘ、ｙ、ｚを分割秘密情報として出力することとしてもよい。
（４）インターリーブ処理は、必ずしも必要ではなく、省略することとしてもよい。また、インターリーブ処理を第２実施形態に追加してもよい。
（５）ダミー追加処理における、ダミーのコードは、プログラムの結果に影響を与えない処理であれば新たに変数を追加して作成してもよいし、元々プログラムに存在していた変数を使って作成してもよい。また、既に説明したインターリーブ処理と組み合わせることにより分割秘密情報の位置がより拡散するようにダミーの演算処理を追加することでインターリーブの処理の効果を高めることに使用してもよい。
【０１２４】
このように、プログラムの実行結果に影響を及ぼさないダミーの演算処理を追加することで、分割秘密情報の演算の解析がさらに困難になる。但し、これらダミーの演算処理の追加は必須ではない。
（６）秘密情報の分割秘密情報への分割方法は、分割秘密情報の多数決により復元結果である秘密情報が得られるような分割方法に限らない。
【０１２５】
分割前の秘密情報を用いた演算と、分割秘密情報を用いた演算とが同じ結果が得られれば他の分割方法であってもよい。
（７）第２実施形態において、コード７１１「ｄａｔａ２＝ｄａｔａ１＋ＫＥＹ；」を、コード７１３「ｄａｔａ２＝ｆｕｎｃ（ｄａｔａ１，Ｋ）；」に置き換えているが、これには限らない。
【０１２６】
上述したように、関数ｆｕｎｃ（）は、複数のステップから構成されているので、演算結果が異なるものにならないように維持する限りにおいては、関数ｆｕｎｃ（）内の各ステップについて、第１実施形態でおこなっているような、インターリーブ処理や、ダミー追加処理や、結合関数追加処理を行うこととしてもよい。
（８）複数の分割秘密情報を結合する結合関数として、選択した一の結合関数を用いる例で説明したがこれに限らない。
【０１２７】
例えば、複数の分割秘密情報の各ビット桁毎に、用いる結合関数を変更することとしてもよいし、複数桁毎に、用いる結合関数を変更することとしてもよい。
また、第１及び第２実施形態では、分割秘密情報の値を１ビットずつ決定していく方法を取っているが、これに限られるものではない。
例えば、真理値表を結合関数ｆ（）の演算結果を参照して逆引きすることにより各引数の値を決定することとしてもよい。具体的には、ＫＥＹが「１」である場合には、真理値表４０２のｆ（ｘ，ｙ，ｚ）の値が１である行をランダムに選択し、選択した行に対応するｘ、ｙ、ｚの値を分散秘密情報のそれぞれに割り当てる。ＫＥＹの値が「０」である場合も同様である。
（９）第１及び第２実施形態では、実行プログラム生成装置に関する説明を行ったが、これらの装置により生成された特徴あるプログラム自体や、そのプログラムの各部をハードウェアで実現した情報処理実行装置等も本発明に含まれる。
【０１２８】
例えば、図１に示したプログラム６０５を実行形式に変換した前記実行プログラムを、ハードウェアで実現した情報処理実行装置１３００は、図１１に示すように、被演算情報記憶部１３０１と、分割秘密情報記憶部１３０２と、分割演算実行部１３０３〜１３０５と、結合演算実行部１３０６とから成る。
被演算情報記憶部１３０１は、被演算情報としてｄａｔａ１（１１５１）を記憶している。ここで、前記被演算情報は、情報処理実行装置１３００の外部から取得することとしてもよい。
【０１２９】
分割秘密情報記憶部１３０２は、秘密情報が分割数に分割された分割秘密情報として、Ｋ１（１３５２）と、Ｋ２（１３５３）と、Ｋ３（１３５４）とを記憶している。Ｋ１、Ｋ２、Ｋ３は、プログラム６０５におけるＫ１（６３２）と、Ｋ２（６３３）と、Ｋ３（６３４）に相当する。
分割演算実行部１３０３は、被演算情報記憶部１３０１からｄａｔａ１（１３５１）を取得し、分割秘密情報記憶部１３０２からＫ１（１３５２）を取得し、Ｐ１＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ１）を実行し、Ｐ１を結合演算実行部１３０６に出力する。
【０１３０】
分割演算実行部１３０３と同様に、分割演算実行部１３０４は、被演算情報記憶部１３０１からｄａｔａ１（１３５１）を取得し、分割秘密情報記憶部１３０２からＫ２（１３５３）を取得し、Ｐ２＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ２）を実行し、Ｐ２を結合演算実行部１３０６に出力する。
分割演算実行部１３０５は、被演算情報記憶部１３０１からｄａｔａ１（１３５１）を取得し、分割秘密情報記憶部１３０２からＫ３（１３５４）を取得し、Ｐ３＝ｆ＿ｘｏｒ（ｄａｔａ１，Ｋ３）を実行し、Ｐ３を結合演算実行部１３０６に出力する。
【０１３１】
分割演算実行部の数は、秘密情報に係る分割数と同じ数となる。
本変形例では、上述の実施形態と同じく、秘密情報ＫＥＹが分割数である３個の分割秘密情報Ｋ１、Ｋ２、Ｋ３に分割されていることとしているので、情報処理実行装置１３００は、３つの分割演算実行部１３０２〜１３０５を含んでいる。
結合演算実行部１３０６は、分割演算実行部１３０３からＰ１を取得し、分割演算実行部１３０４からＰ２を取得し、分割演算実行部１３０５からＰ３を取得し、ｄａｔａ２＝ｆ＿ｍａｊｏｒ（Ｐ１，Ｐ２，Ｐ３）を実行し、ｄａｔａ２を出力する。
（１０）第２実施形態では、関数ｆｕｎｃ（）は、結合関数保持部１０５に保持されているものとしたがこれに限られるものではない。結合関数保持部１０５には結合関数ｆ（）を保持しておき、結合関数保持部１０５から得た結合関数ｆ（）を用いて結合関数ｆ（）を用いて結合関数生成部１１０７が生成するものとしてもよい。
【０１３２】
また、この場合、結合関数ｆ（）は、上述した３つの性質が満たされている限り、結合関数４０１、４２１、４４１等の中から選択するとしても構わない。
（１１）第１及び第２実施形態では、分割秘密情報はランダムに生成するものとしたが、これに限られるものではない。例えば、分割前の秘密情報と同じ値を除いた範囲でランダムに選択するなどすれば、秘密情報そのものがメモリに現れること自体がなくなるので、秘密情報をより安全に保護できる。
（１２）上記実施形態においては、原プログラムを同結果が得られるプログラムへと変換し、変換されたプログラムを、実行プログラムにコンパイルして実行する例で説明したが、これに限らず、プログラムをコンピュータ上で実行できれば他の方法で実行してもよい。例えば、原プログラムを同結果が得られる他のプログラムへと変換し、変換されたプログラムを、インタープリンタが解釈できる中間コードに変換してもよい。前記中間コードは、インタープリンタ上で実行される。
（１３）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭ又は前記ハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、各装置は、その機能を達成する。ここで、コンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
（１４）上記の各装置を構成する構成要素の一部又は全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムに従って動作することにより、システムＬＳＩは、その機能を達成する。これらは個別に１チップ化されても良いし、一部又は全てを含むように１チップ化されても良い。
【０１３３】
ここでは、ＬＳＩとしたが、集積度の違いにより、ＩＣ、システムＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。
また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０１３４】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
（１５）上記の各装置を構成する構成要素の一部又は全部は、各装置に脱着可能なＩＣカード又は単体のモジュールから構成されているとしてもよい。前記ＩＣカード又は前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、などから構成されるコンピュータシステムである。前記ＩＣカード又は前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムに従って動作することにより、前記ＩＣカード又は前記モジュールは、その機能を達成する。このＩＣカード又はこのモジュールは、耐タンパ性を有するとしてもよい。
（１６）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
【０１３５】
また、本発明は、前記コンピュータプログラム又は前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ―ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなど、に記録したものとしてもよい。また、これらの記録媒体に記録されている前記コンピュータプログラム又は前記デジタル信号であるとしてもよい。
【０１３６】
また、本発明は、前記コンピュータプログラム又は前記デジタル信号を、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリとを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムに従って動作するとしてもよい。
【０１３７】
また、前記プログラム又は前記デジタル信号を前記記録媒体に記録して移送することにより、又は前記プログラム又は前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（１７）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【産業上の利用可能性】
【０１３８】
本発明のプログラム変換装置は、暗号化されたコンテンツを復号しつつ再生するプレーヤーなどのプログラムの生成を行うものでありり、コンテンツの制作、配布等を行うコンテンツ産業において使用されるものである。
【図面の簡単な説明】
【０１３９】
【図１】本発明のプログラム変換装置が扱うプログラムの一例を示す図である。
【図２】本発明の一実施形態に係る実行プログラム生成装置の内部構成を示すブロック図である。
【図３】自己双対関数の一例を示す図である。
【図４】自己双対関数の一例を示す図である。
【図５】自己双対関数の一例を示す図である。
【図６】分割秘密情報の生成処理を示すフローチャートである。
【図７】プログラム変換処理を示すフローチャートである。
【図８】本発明のプログラム変換装置が扱うプログラムの一例を示す図である。
【図９】本発明の一実施形態に係る実行プログラム生成装置の内部構成を示すブロック図である。
【図１０】関数ｆｕｎｃ（）の処理手順を示すフローチャートである。
【図１１】変形例に係る情報処理実行装置の構成を示すブロック図である。
【符号の説明】
【０１４０】
１０  実行プログラム生成装置
１１  入力部
１３  プログラム保持部
１３  変換プログラム生成部
１４  実行プログラム生成部
１０１  秘密演算指定部
１０２  分割秘密情報生成部
１０３  プログラム取得部
１０４  分割数指定部
１０５  結合関数保持部
１０６  プログラム変換部
１０７  結合関数生成部
１１０１  秘密演算指定部
１１０７  結合関数生成部
１１０６  プログラム変換部
１３００  変換プログラム生成部
【図１】
0004840782.tif 000002
【図２】
0004840782.tif 000003
【図３】
0004840782.tif 000004
【図４】
0004840782.tif 000005
【図５】
0004840782.tif 000006
【図６】
0004840782.tif 000007
【図７】
0004840782.tif 000008
【図８】
0004840782.tif 000009
【図９】
0004840782.tif 000010
【図１０】
0004840782.tif 000011
【図１１】
0004840782.tif 000012