(57)【要約】  署名生成装置（２０００）は、署名プログラム（１０）を実行する。署名プログラム（１０）は、乱数（１４）を用いた確率的署名生成方式で、電子署名を生成する。署名生成装置（２０００）は、署名プログラム（１０）に含まれる処理のうち、乱数（１４）を利用する処理を、セキュア記憶領域（４０）にロードして実行する。さらに、乱数（１４）は、セキュア記憶領域（４０）に記憶される。
2020065958.tif 000002
【特許請求の範囲】
【請求項１】
確率的署名方式で電子署名を生成する署名プログラムを実行する実行部を有し、
前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
前記実行部は、前記署名プログラムに含まれる処理のうち、前記乱数を利用する処理を、セキュアな記憶領域にロードして実行し、
前記乱数は前記セキュアな記憶領域に格納される、署名生成装置。
【請求項２】
前記セキュアな記憶領域は、Trusted Execution Environment（TEE）を構成する記憶領域であり、
前記実行部は、前記乱数を利用する処理を、TEE によって実現されるセキュアな実行環境で動作させる、請求項１に記載の署名生成装置。
【請求項３】
前記署名プログラムは、
複数の乱数を含み、
前記複数の乱数のうちの１つを用いて前記電子署名を生成し、
前記実行部は、前記複数の乱数を前記セキュアな記憶領域に格納する、請求項１又は２に記載の署名生成装置。
【請求項４】
前記署名プログラムは、乱数を生成して前記セキュアな記憶領域に格納し、前記生成した乱数を利用して前記電子署名を生成する、請求項１又は２に記載の署名生成装置。
【請求項５】
確率的署名方式で電子署名を生成する署名プログラムを取得する取得部と、
前記取得した署名プログラムから、電子署名の生成に利用される乱数を記憶領域に格納する処理を検出し、その処理が前記乱数をセキュアな記憶領域に格納するように、前記署名プログラムを改変する第１改変部と、
前記取得した署名プログラムから、前記乱数を扱う処理を検出し、その処理が前記セキュアな記憶領域にロードして実行されるように、前記署名プログラムを改変する第２改変部と、を有する署名プログラム生成装置。
【請求項６】
コンピュータによって実行される署名生成方法であって、
確率的署名方式で電子署名を生成する署名プログラムを実行し、
前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
前記署名プログラムに含まれる処理のうち、前記乱数を利用する処理は、セキュアな記憶領域にロードして実行され、
前記乱数は前記セキュアな記憶領域に格納される、署名生成方法。
【請求項７】
前記セキュアな記憶領域は、Trusted Execution Environment（TEE）を構成する記憶領域であり、
前記乱数を利用する処理を、TEE によって実現されるセキュアな実行環境で動作させる、請求項６に記載の署名生成方法。
【請求項８】
前記署名プログラムは、
複数の乱数を含み、
前記複数の乱数のうちの１つを用いて前記電子署名を生成し、
前記複数の乱数を前記セキュアな記憶領域に格納する、請求項６又は７に記載の署名生成方法。
【請求項９】
前記署名プログラムは、乱数を生成して前記セキュアな記憶領域に格納し、前記生成した乱数を利用して前記電子署名を生成する、請求項６又は７に記載の署名生成方法。
【請求項１０】
コンピュータによって実行される署名プログラム生成方法であって、
確率的署名方式で電子署名を生成する署名プログラムを取得し、
前記取得した署名プログラムから、電子署名の生成に利用される乱数を記憶領域に格納する処理を検出し、その処理が前記乱数をセキュアな記憶領域に格納するように、前記署名プログラムを改変し、
前記取得した署名プログラムから、前記乱数を扱う処理を検出し、その処理が前記セキュアな記憶領域にロードして実行されるように、前記署名プログラムを改変する、署名プログラム生成方法。
【請求項１１】
署名プログラムであって、
メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
当該署名プログラムに含まれる処理のうち、前記乱数を利用する処理は、セキュアな記憶領域にロードして実行され、
前記乱数は前記セキュアな記憶領域に格納される、署名プログラム。
【請求項１２】
前記セキュアな記憶領域は、Trusted Execution Environment（TEE）を構成する記憶領域であり、
前記乱数を利用する処理は、TEE によって実現されるセキュアな実行環境で動作する、請求項１１に記載の署名プログラム。
【請求項１３】
複数の乱数を含み、
前記複数の乱数のうちの１つを用いて前記電子署名を生成し、
前記複数の乱数は、前記セキュアな記憶領域に格納される、請求項１１又は１２に記載の署名プログラム。
【請求項１４】
乱数を生成して前記セキュアな記憶領域に格納し、前記生成した乱数を利用して前記電子署名を生成する、請求項１１又は１２に記載の署名プログラム。
【請求項１５】
確率的署名方式で電子署名を生成する署名プログラムを取得し、
前記取得した署名プログラムから、電子署名の生成に利用される乱数を記憶領域に格納する処理を検出し、その処理が前記乱数をセキュアな記憶領域に格納するように、前記署名プログラムを改変し、
前記取得した署名プログラムから、前記乱数を扱う処理を検出し、その処理が前記セキュアな記憶領域にロードして実行されるように、前記署名プログラムを改変する、署名プログラムの生成プログラム。
【請求項１６】
確率的署名方式で電子署名を生成する署名プログラムを実行する実行部を有し、
前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
前記署名プログラムにおいて、前記乱数及び前記乱数を扱う処理が難読化されている、署名生成装置。
【請求項１７】
コンピュータによって実行される署名生成方法であって、
確率的署名方式で電子署名を生成する署名プログラムを実行し、
前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
前記署名プログラムにおいて、前記乱数及び前記乱数を扱う処理が難読化されている、署名生成方法。
【請求項１８】
署名プログラムであって、
メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成し、
前記乱数及び前記乱数を扱う処理が難読化されている、署名プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は電子署名に関する。
【背景技術】
【０００２】
装置のマルウェア感染や装置の不正入手などにより、攻撃者に装置の実行環境をコントロールされる事例が発生している。例えば root 権限を奪取されると、OS（Operating System）による機密情報へのアクセス制御が無効化され、機密情報にアクセスされてしまう。また、装置上で動作するプログラムに対して静的解析や動的解析を実行することができ、解析により例えば暗号、署名、認証の秘密鍵などの機密情報が漏洩することがある。【０００３】
装置の実行環境のコントロールが可能な攻撃者から機密情報を保護するための技術の例としてホワイトボックス実装や Trusted execution environment（TEE）がある。ホワイトボックス実装は装置の実行環境のコントロールが可能な攻撃者からソフトウエア的に暗号プログラムの秘密鍵を保護する技術である。例えば非特許文献１では、AES や RSA 暗号、楕円曲線暗号などのような標準的な暗号方式のプログラムの秘密鍵を装置の実行環境のコントロールが可能な攻撃者から保護することができることが述べられている。また、TEE はハードウエア的にセキュアな領域を作成し、秘密鍵や知的財産を含むプログラムなどのような機密情報をセキュアな領域内で扱うことで保護する技術である。例えば、非特許文献２の Intel SGX や非特許文献３の ARM TrustZone などを用いて実現される。【０００４】
一般に高い安全性を満たす署名方式は、署名生成時に乱数を用いる確率的署名方式である。上述した技術を用いて、装置の実行環境のコントロールが可能な攻撃者に対して署名や認証で用いる秘密鍵を保護することが可能である。確率的署名方式には、例えば DSA（Digital Signature Algorithm）などがある。【０００５】
確率的署名方式に関する先行技術文献としては、例えば、特許文献１がある。特許文献１は、電子署名を構成する要素の数を少なくすることで、通信量や計算量を削減する技術を開示している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−１８６００３号公報
【非特許文献】
【０００７】
【非特許文献１】Datasheet: Cloakware Software Protection、［online］、２０１７年、Irdeto、［２０１８年６月２９日検索］、インターネット<URL: https://resources.irdeto.com/cloakware-software-protection/datasheet-cloakware-software-protection>
【非特許文献２】Intel Software Guard Extensions、［online］、Intel、［２０１８年６月２９日検索］、インターネット<URL: https://software.intel.com/en-us/sgx>
【非特許文献３】TrustZone、［online］、ARM、［２０１８年９月２８日検索］、インターネット<URL: https://developer.arm.com/technologies/trustzone>
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明者は、確率的署名方式の署名プログラムにおいて、秘密鍵が直接漏洩しなくても、その他のデータから秘密鍵が復元されてしまう恐れがあることを見いだした。本発明はこのような課題に鑑みてなされたものであり、その目的の一つは、確率的署名方式の署名プログラムの安全性を向上させる技術を提供することである。
【課題を解決するための手段】
【０００９】
本発明の第１の署名生成装置は、確率的署名方式で電子署名を生成する署名プログラムを実行する実行部を有する。前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。前記実行部は、前記署名プログラムに含まれる処理のうち、前記乱数を利用する処理を、セキュアな記憶領域にロードして実行する。前記乱数は前記セキュアな記憶領域に格納される。【００１０】
本発明の第２の署名生成装置は、確率的署名方式で電子署名を生成する署名プログラムを実行する実行部を有する。前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。前記署名プログラムにおいて、前記乱数及び前記乱数を扱う処理が難読化されている。【００１１】
本発明の署名プログラム生成装置は、１）確率的署名方式で電子署名を生成する署名プログラムを取得する取得部と、２）前記取得した署名プログラムから、電子署名の生成に利用される乱数を記憶領域に格納する処理を検出し、その処理が前記乱数をセキュアな記憶領域に格納するように、前記署名プログラムを改変する第１改変部と、３）前記取得した署名プログラムから、前記乱数を扱う処理を検出し、その処理が前記セキュアな記憶領域にロードして実行されるように、前記署名プログラムを改変する第２改変部と、を有する。【００１２】
本発明の第１の署名生成方法は、コンピュータによって実行される。当該署名生成方法は、確率的署名方式で電子署名を生成する署名プログラムを実行する。前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。前記署名プログラムに含まれる処理のうち、前記乱数を利用する処理は、セキュアな記憶領域にロードして実行される。前記乱数は前記セキュアな記憶領域に格納される。【００１３】
本発明の第２の署名生成方法は、コンピュータによって実行される。当該署名生成方法は、確率的署名方式で電子署名を生成する署名プログラムを実行する。前記署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。前記署名プログラムにおいて、前記乱数及び前記乱数を扱う処理が難読化されている。【００１４】
本発明の署名プログラム生成方法は、コンピュータによって実行される。当該署名プログラム生成方法は、１）確率的署名方式で電子署名を生成する署名プログラムを取得し、２）前記取得した署名プログラムから、電子署名の生成に利用される乱数を記憶領域に格納する処理を検出し、その処理が前記乱数をセキュアな記憶領域に格納するように、前記署名プログラムを改変し、３）前記取得した署名プログラムから、前記乱数を扱う処理を検出し、その処理が前記セキュアな記憶領域にロードして実行されるように、前記署名プログラムを改変する。【００１５】
本発明の第１の署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。当該署名プログラムに含まれる処理のうち、前記乱数を利用する処理は、セキュアな記憶領域にロードして実行される。前記乱数は前記セキュアな記憶領域に格納される。【００１６】
本発明の第２の署名プログラムは、メッセージを取得して、乱数及び秘密鍵を用いて前記メッセージから電子署名を生成する。前記乱数及び前記乱数を扱う処理は、難読化されている。【００１７】
本発明における署名プログラムの生成プログラムは、コンピュータに、本発明の署名プログラム生成方法を実行させる。
【発明の効果】
【００１８】
本発明によれば、確率的署名方式の署名プログラムの安全性を向上させる技術が提供される。
【図面の簡単な説明】
【００１９】
上述した目的、およびその他の目的、特徴および利点は、以下に述べる好適な実施の形態、およびそれに付随する以下の図面によってさらに明らかになる。【００２０】
【図１】署名生成装置で動作する署名プログラムの動作の概要を表している。
【図２】署名生成装置の構成の概要を例示する図である。
【図３】実施形態１の署名生成装置の機能構成を例示する図である。
【図４】署名生成装置を実現するための計算機を例示する図である。
【図５】実施形態１の署名生成装置によって実行される処理の流れを例示するフローチャートである。
【図６】乱数を内部に含む署名プログラムを概念的に例示する図である。
【図７】乱数生成器を有する署名プログラムを概念的に例示する図である。
【図８】乱数生成器の構成を例示する第１の図である。
【図９】乱数生成器の構成を例示する第２の図である。
【図１０】乱数生成器の構成を例示する第３の図である。
【図１１】署名プログラムをセキュアプログラムと通常の実行環境で動作するプログラムとに切り分けて例示する図である。
【図１２】署名プログラム生成装置の動作の概要を表す図である。
【図１３】署名プログラム生成装置の機能構成を例示する図である。
【図１４】署名プログラム生成装置を実現するための計算機を例示する図である。
【図１５】署名プログラム生成装置が行う処理の流れを例示するフローチャートである。
【図１６】署名プログラムの動作の具体例を例示する図である。
【発明を実施するための形態】
【００２１】
以下、本発明の実施の形態について、図面を用いて説明する。尚、すべての図面において、同様な構成要素には同様の符号を付し、適宜説明を省略する。また、特に説明する場合を除き、各ブロック図において、各ブロックは、ハードウエア単位の構成ではなく、機能単位の構成を表している。
【００２２】
［実施形態１］
＜概要＞
図１と図２は、本実施形態の署名生成装置２０００の概要を表す図である。図１は、署名生成装置２０００で動作する署名プログラム１０の動作の概要を表している。署名生成装置２０００は、署名プログラム１０を実行する。署名プログラム１０は、確率的署名生成方式で電子署名を生成する。具体的には、署名プログラム１０は、メッセージ２０を取得し、秘密鍵１２及び乱数１４を用いて、メッセージ２０から電子署名３０を生成する。確率的署名方式の署名アルゴリズムには、DSA などの既知のアルゴリズムを採用することができる。
【００２３】
ここで、後述するように、確率的署名方式で電子署名を生成する場合、秘密鍵が直接漏洩しなくても、乱数が漏洩してしまうと、その乱数を利用して秘密鍵を算出することができてしまう恐れがある。すなわち、乱数が漏洩してしまうと、秘密鍵が漏洩してしまう恐れがある。
【００２４】
そこで署名生成装置２０００は、以下で説明する方法で、乱数１４の保護を実現する。なお、秘密鍵１２自体の保護には、既存の方法を利用することができる。
【００２５】
図２は、署名生成装置２０００の構成の概要を例示する図である。署名プログラム１０は、乱数１４を、セキュアな記憶領域（以下、セキュア記憶領域４０）で扱う。セキュア記憶領域４０は、例えば、Trusted Execution Environment（TEE）を構成する記憶領域である。具体的には、署名生成装置２０００は、署名プログラム１０に含まれる処理のうち、乱数１４を利用する処理を、セキュア記憶領域４０にロードして実行する。さらに、乱数１４は、セキュア記憶領域４０に記憶される。
【００２６】
ここで、セキュア記憶領域４０に格納されたデータは、セキュア記憶領域４０にロードされて実行される処理からしかアクセスできないように構成される。そのため、セキュア記憶領域４０以外にロードされて実行される処理からは、例えその処理が root 権限で実行されたとしても、セキュア記憶領域４０に格納されている乱数１４にアクセスできない。
【００２７】
よって、乱数１４をセキュア記憶領域４０に記憶させ、なおかつ署名プログラム１０に含まれる処理のうち、乱数１４を扱う処理をセキュア記憶領域４０にロードして実行するようにすることで、署名プログラム１０が乱数１４を使って電子署名３０を生成できるようにしつつ、他の処理から乱数１４がアクセスされてしまうことを防ぐことができる。よって、乱数１４を保護しつつ、乱数１４を利用した電子署名３０の生成を実現することができる。
【００２８】
＜作用効果＞
本発明者は、確率的署名方式では、秘密鍵の漏洩を防ぐために、乱数を保護する必要があることを見いだした。乱数を保護しなければならない理由は、乱数やその他の公開された情報を用いて、秘密鍵を算出できてしまう恐れがあるからである。以下、DSA を例として、秘密鍵の算出方法を説明する。
【００２９】
まず、DSA では以下のように鍵の生成、署名生成、及び署名の検証を行う。
＜＜鍵生成＞＞
（１）素数 p および p-1 を割り切る素数 q を生成する。
（２）乗法群 Z_{p}^{*} での位数が q となるような原始元 g を定める。
（３）集合{0,1,...,q-1}に含まれる要素xを定め、y=g^{x} mod p を計算する。
ここで、x は秘密鍵とし、p、q、g、yを公開鍵とする。
【００３０】
＜＜署名生成＞＞
（１）{0,1,...,q-1} に含まれかつ p-1 と互いに疎な要素をランダムに取り出し、乱数kとする。
（２）次のようにメッセージ m に対する署名(r,s)を計算する。
r=(g^{k} mod p) mod q
s=k^{-1}(h(m)+xr) mod q
【００３１】
＜＜署名検証＞＞
（１）r'=(g^{h(m)s^{-1}}y^{rs^{-1}} mod p) mod q を計算する。
（２）rとr'が等しいかをチェックする。
（２−１）等しい場合、検証成功とする。
（２−２）等しくない場合、検証失敗とする。
【００３２】
上記の DSA において、メッセージ、公開鍵、署名生成で使われた乱数、及び署名を得られた攻撃者は、以下のように秘密鍵を計算することができる．
x=(s-h(m))/r mod q
【００３３】
このように乱数は、秘密鍵の算出に利用することができる。一方で、乱数は署名検証には利用されないため、外部に公開する必要がない。このことから本発明の発明者は、乱数を適切に保護して乱数が外部に漏洩しないようにすることで、秘密鍵の安全性、ひいては署名プログラムの安全性を向上させることができることを見いだした。
【００３４】
本実施形態の署名生成装置２０００によれば、乱数１４がセキュア記憶領域４０で扱われるように、署名プログラム１０が実行される。具体的には、乱数１４を扱う処理は、保護記憶領域にロードされて実行される。また、乱数１４を記憶領域に記憶する際には、セキュア記憶領域４０に記憶される。このようにすることで、乱数１４が外部に漏洩することを防ぐことができる。これにより、乱数１４に基づいて秘密鍵１２が漏洩してしまうことを防ぐことができる。
【００３５】
なお、図１を参照した上述の説明は、署名生成装置２０００の理解を容易にするための例示であり、署名生成装置２０００の機能を限定するものではない。以下、本実施形態の署名生成装置２０００についてさらに詳細に説明する。
【００３６】
＜署名生成装置２０００の機能構成の例＞
図３は、実施形態１の署名生成装置２０００の機能構成を例示する図である。署名生成装置２０００は、実行部２０２０を有する。実行部２０２０は、署名プログラム１０を実行する。署名プログラム１０のうち、乱数１４を扱う処理は、セキュア記憶領域４０にロードされて実行される。また、乱数１４は、セキュア記憶領域４０に記憶される。
【００３７】
＜署名生成装置２０００のハードウエア構成＞
署名生成装置２０００の各機能構成部は、各機能構成部を実現するハードウエア（例：ハードワイヤードされた電子回路など）で実現されてもよいし、ハードウエアとソフトウエアとの組み合わせ（例：電子回路とそれを制御するプログラムの組み合わせなど）で実現されてもよい。以下、署名生成装置２０００の各機能構成部がハードウエアとソフトウエアとの組み合わせで実現される場合について、さらに説明する。
【００３８】
図４は、署名生成装置２０００を実現するための計算機１０００を例示する図である。計算機１０００は任意の計算機である。例えば計算機１０００は、Personal Computer（PC）やサーバマシンなどである。計算機１０００は、署名生成装置２０００を実現するために設計された専用の計算機であってもよいし、汎用の計算機であってもよい。
【００３９】
計算機１０００は、バス１０２０、プロセッサ１０４０、メモリ１０６０、ストレージデバイス１０８０、入出力インタフェース１１００、及びネットワークインタフェース１１２０を有する。バス１０２０は、プロセッサ１０４０、ストレージデバイス１０８０、入出力インタフェース１１００、及びネットワークインタフェース１１２０が、相互にデータを送受信するためのデータ伝送路である。ただし、プロセッサ１０４０などを互いに接続する方法は、バス接続に限定されない。
【００４０】
プロセッサ１０４０は、CPU（Central Processing Unit）、GPU（Graphics Processing Unit）、FPGA（Field-Programmable Gate Array）などの種々のプロセッサである。メモリ１０６０は、RAM（Random Access Memory）などを用いて実現される主記憶装置である。ストレージデバイス１０８０は、ハードディスク、SSD（Solid State Drive）、メモリカード、又は ROM（Read Only Memory）などを用いて実現される補助記憶装置である。
【００４１】
入出力インタフェース１１００は、計算機１０００と入出力デバイスとを接続するためのインタフェースである。例えば入出力インタフェース１１００には、キーボードなどの入力装置や、ディスプレイ装置などの出力装置が接続される。ネットワークインタフェース１１２０は、計算機１０００を通信網に接続するためのインタフェースである。この通信網は、例えば LAN（Local Area Network）や WAN（Wide Area Network）である。ネットワークインタフェース１１２０が通信網に接続する方法は、無線接続であってもよいし、有線接続であってもよい。
【００４２】
ストレージデバイス１０８０は、実行部２０２０を実現するプログラムモジュールや、署名プログラム１０を記憶している。プロセッサ１０４０は、実行部２０２０を実現するプログラムモジュールをメモリ１０６０に読み出して実行することで、署名プログラム１０を実行する。
【００４３】
＜＜セキュア記憶領域４０について＞＞
セキュア記憶領域４０は、root 権限を持つプログラムであっても自由にはアクセスできないように保護された記憶領域である。例えばセキュア記憶領域４０は、TEE を構成する記憶領域である。TEE は、通常の実行環境から隔離されたセキュアな実行環境である。
【００４４】
TEE を利用する場合、通常の実行環境で動作する OS に加え、セキュアな実行環境で動作するセキュア OS が稼働する。セキュア記憶領域４０は、通常の実行環境で動作するプログラムからはアクセスできず、セキュア OS 上で動作するプログラム（以下、セキュアプログラム）からしかアクセスできない。そのため、通常の実行環境で動作するプログラムが root 権限を得たとしても、そのプログラムはセキュア記憶領域４０にアクセスできない。なお、セキュア OS 上で動作するプログラムからしかアクセスできないセキュアな記憶領域を実現する技術には、既存の技術を利用することができる。
【００４５】
通常の実行環境で動作するプログラムは、所定の API（Application Programming Interface）を通じて、セキュアプログラムに処理を依頼する。処理を依頼されたセキュアプログラムは、セキュア記憶領域４０を利用して処理を実行し、その結果を依頼元に返す。依頼元のプログラムは、セキュアプログラムから返された結果を利用する。
【００４６】
このような構成とすることで、通常の実行環境で動作するプログラムからはセキュア記憶領域４０に格納されたデータに直接アクセスできないようにしつつ、セキュア記憶領域４０に記憶されたデータを利用した所定の処理を行うことができる。セキュア記憶領域４０に記憶されたデータを扱える処理が所定の処理に限定されているため、セキュア記憶領域４０に記憶されたデータの安全性が向上する。
【００４７】
＜処理の流れ＞
図５は、実施形態１の署名生成装置２０００によって実行される処理の流れを例示するフローチャートである。実行部２０２０は、署名プログラム１０を取得する（Ｓ１０２）。実行部２０２０は、署名プログラム１０をメモリにロードする（Ｓ１０４）。実行部２０２０は、メモリにロードした署名プログラム１０を実行することで、メッセージ２０から電子署名３０を生成する（Ｓ１０６）。
【００４８】
＜署名プログラム１０の構成＞
署名プログラム１０は、確率的署名方式でメッセージ２０から電子署名３０を生成するプログラムである。電子署名３０の生成には、秘密鍵１２及び乱数１４が利用される。前述したように、確率的署名方式のアルゴリズムには、 DSA などの種々の既存のアルゴリズムを利用することができる。
【００４９】
署名プログラム１０は、その内部に予め乱数１４を含むように構成されているか、またはその内部で乱数１４を生成するように構成されている。以下、乱数１４に関し、署名プログラム１０の構成方法を具体的にいくつか例示する。
【００５０】
＜＜予め内部に乱数を含む構成＞＞
この構成では、署名プログラム１０は、その内部に複数の乱数１４を予め含んでいる。言い換えると、署名プログラム１０において、複数の乱数１４が予め定義されている。署名プログラム１０は、新たに電子署名を生成する際、複数の乱数１４のうちの１つを利用する。
【００５１】
例えば、署名プログラム１０において、乱数１４の配列 r を予め定義しておく。署名プログラム１０は、乱数配列 r に格納されている乱数１４を、先頭から順に使用していく。例えば i 回目に電子署名を生成する際、署名プログラム１０は、r[i] を乱数１４として使用する。
【００５２】
このケースでは、署名プログラム１０を構成する処理のうち、少なくとも、乱数配列 r や乱数 r[i] を使用する処理が、セキュア記憶領域４０に記憶される。また、乱数配列 r や乱数 r[i] がセキュア記憶領域４０に記憶される。図６は、乱数を内部に含む署名プログラム１０を概念的に例示する図である。
【００５３】
このように内部で予め乱数を定義しておく方法によれば、電子署名の生成の際に乱数を生成する必要がないため、電子署名の生成に要する時間を短くすることができる。
【００５４】
なお、内部に予め乱数を含めておく場合、署名プログラム１０が扱える乱数の数が有限であるため、署名プログラム１０が電子署名を生成できる回数が有限となる。例えば図６では、乱数の個数がｎ個であるため、電子署名を生成できる回数がｎ回である。そのため、署名プログラム１０の内部に含まれている乱数を使い切ったら、新たな署名プログラム１０を取得する（署名プログラム１０を更新する）必要がある。
【００５５】
そこで例えば、署名プログラム１０は、その内部に含まれている乱数を使い切ったタイミングや、残りの乱数の数が少なくなったタイミングで、その旨をユーザに通知するように構成される。この通知を受けたユーザは、署名生成装置２０００を操作して署名プログラム１０を新たに取得する。そして、乱数を使い切った後は、新たに取得した署名プログラム１０を使用するようにする。
【００５６】
署名プログラム１０の更新は、ユーザに通知することなく、署名生成装置２０００によって自動で行われるようにしてもよい。
【００５７】
＜＜署名プログラム１０の内部で乱数を生成する構成＞＞
この場合、署名プログラム１０の内部には、乱数を生成するプログラムが含まれる。このプログラムのことを、乱数生成器と呼ぶ。この場合、少なくとも乱数生成器は、セキュア記憶領域４０にロードされる。また、乱数生成器によって生成される乱数は、セキュア記憶領域４０に記憶される。
【００５８】
図７は、乱数生成器１６を有する署名プログラム１０を概念的に例示する図である。図７において、乱数生成器１６は、セキュア記憶領域４０に記憶されている。また、乱数生成器１６から出力される乱数１４が、セキュア記憶領域４０に記憶されている。
【００５９】
乱数生成器１６の構成方法は様々である。以下では、乱数生成器１６の構成方法を具体的に例示する。
【００６０】
＜＜＜乱数生成器１６の構成の例１＞＞＞
図８は、乱数生成器１６の構成を例示する第１の図である。この例において、乱数生成器１６は、一方向性を持つハッシュ関数として実現されている。この場合、乱数生成器１６は、その内部に予め乱数シードを含み、外部からノンスを取得するように構成される。言い換えれば、乱数シードが予め署名プログラム１０に含まれている。乱数生成器１６は、乱数シードとノンスに基づくハッシュ値を算出し、そのハッシュ値を乱数１４として出力する。ここで、乱数シードとノンスに基づくハッシュ値を算出するハッシュ関数には、既存の種々のハッシュ関数を利用することができる。
【００６１】
この例では、乱数１４に加え、署名プログラム１０に予め含まれている乱数シードもセキュア記憶領域４０に格納することが好適である。
【００６２】
＜＜＜乱数生成器１６の構成の例２＞＞＞
図９は、乱数生成器１６の構成を例示する第２の図である。この例において、乱数生成器１６は、内部状態を持つ疑似乱数生成器（PRNG）を用いて実現されている。具体的には、乱数生成器１６は、その内部に予め乱数シードを含み、乱数シードと内部状態とに基づいて、疑似乱数を出力する。ただし、乱数生成器１６から出力される乱数が決定的になるのを避けるため、乱数生成器１６は、内部状態の初期値を外部から取得する。ここで、内部状態と乱数シードに基づいて疑似乱数を生成する技術には、既存の技術を利用することができる。
【００６３】
この例では、乱数１４に加え、乱数シード及び内部状態をセキュア記憶領域４０に格納することが好適である。ここで、内部状態は、乱数生成器１６によって更新される。そのため、乱数生成器１６は、更新した内部状態をセキュア記憶領域４０に格納するように構成される。
【００６４】
＜＜乱数生成器１６の構成の例３＞＞
図１０は、乱数生成器１６の構成を例示する第３の図である。この例において、乱数生成器１６は、外部から取得したノンスを用いて乱数シードを生成し、その乱数シードと内部状態を用いて疑似乱数を生成する疑似乱数生成器として実現される。例えば乱数生成器１６は、一方向性ハッシュ関数に秘密鍵１２とノンスを入力することで得られるハッシュ値を、乱数シードとして扱う。乱数生成器１６は、得られた乱数シードと内部状態に基づいて、疑似乱数を出力する。ここで出力される疑似乱数が、乱数１４として扱われる。
【００６５】
この例では、内部状態をセキュア記憶領域４０に格納することが好適である。そのため、乱数生成器１６は、乱数生成器１６の内部状態をセキュア記憶領域４０に格納するように構成される。また、乱数生成器１６が生成した乱数シードを記憶領域に格納する場合、乱数生成器１６は、生成した乱数シードをセキュア記憶領域４０に格納するように構成される。
【００６６】
＜署名プログラム１０の取得：Ｓ１０２＞
署名生成装置２０００は、署名プログラム１０を取得する（Ｓ１０２）。署名生成装置２０００が署名プログラム１０を取得する方法は様々である。例えば署名生成装置２０００は、任意の記憶装置に記憶されている署名プログラム１０を、その記憶装置から読み出すことで取得する。その他にも例えば、署名生成装置２０００は、他の装置から送信される署名プログラム１０を受信することで、署名プログラム１０を取得する。この「他の装置」は、例えば、署名プログラム１０を生成する装置（後述する署名プログラム生成装置３０００）である。
【００６７】
＜署名プログラム１０のロード：Ｓ１０４＞
署名生成装置２０００は、署名プログラム１０をメモリ上にロードして実行する。この際、署名プログラム１０のうち、乱数１４を扱う処理は、セキュア記憶領域４０にロードされる。例えば TEE を利用する場合、乱数１４を扱う処理は、セキュア OS によってセキュア記憶領域４０にロードされることにより、TEE によって実現されるセキュアな実行環境で動作する。すなわち、乱数１４を扱う処理は、前述したセキュアプログラムとして動作する。ここで、TEE を構成する記憶領域などのセキュア記憶領域４０に所定のプログラムをロードする技術には、既存の技術を利用することができる。
【００６８】
＜電子署名の生成：Ｓ１０６＞
署名プログラム１０は、メッセージ２０から電子署名３０を生成する（Ｓ１０８）。ここで前述したように、署名プログラム１０のうち、乱数１４を扱う処理は、セキュア記憶領域４０にロードして実行される。乱数１４を扱う処理は、例えば、前述した乱数生成器１６や、秘密鍵１２や乱数１４に基づいて電子署名３０を算出する処理である。例えば TEE を利用する場合、これらの処理は、セキュアプログラムとして動作する。
【００６９】
図１１は、署名プログラム１０をセキュアプログラムと通常の実行環境で動作するプログラムとに切り分けて例示する図である。図１１では、乱数生成器１６を実行する処理と、電子署名３０を生成する処理とが、セキュアな実行環境で動作している。通常の実行環境では、署名プログラム１０の全体的な流れを実現する処理が実行されており、その中で、乱数生成器１６を実行する処理と、電子署名３０を生成する処理とが呼び出されている。この呼び出しは、規定の API を用いて行われる。
【００７０】
なお、乱数１４を保護する方法と同様の方法により、秘密鍵１２を保護することも可能である。すなわち、１）秘密鍵１２を利用する処理をセキュア記憶領域４０にロードし、なおかつ２）秘密鍵１２をセキュア記憶領域４０に格納するようにする。ただし、秘密鍵１２を保護する方法は、必ずしも乱数１４を保護する方法と同一である必要はなく、既存の種々の方法を利用することもできる。
【００７１】
また、署名プログラム１０全体をセキュア記憶領域４０にロードし、署名プログラム１０全体をセキュアな実行環境で動作させることも可能である。ただし一般に、処理の実行に要する時間は、セキュアな実行環境を利用する場合よりも、通常の実行環境を利用する場合の方が短い。そのため、セキュアな実行環境で動作させるプログラムは必要最小限（署名プログラム１０では、乱数１４を利用する処理）に限定することが好適である。
【００７２】
＜電子署名３０の出力＞
署名プログラム１０は、生成した電子署名３０を出力する。ここで、電子署名を出力する方法は任意である。例えば署名プログラム１０は、電子署名３０を任意の記憶装置に格納する。その他にも例えば、署名プログラム１０は、電子署名３０を他の装置に送信してもよい。
【００７３】
＜署名プログラム１０の生成＞
署名プログラム１０は、１）その内部の処理のうち、少なくとも、乱数１４を扱う処理が、セキュア記憶領域４０にロードされる、及び２）乱数１４がセキュア記憶領域４０に記憶されるという要件を満たす必要がある。署名プログラム１０は、このような要件を満たすようにプログラム作成者によって設計・実装されることで生成されてもよいし、このような要件を満たさない署名プログラム（例えば、一般的な署名プログラム）を改変することで生成されてもよい。後者の場合、署名プログラムの改変は、人手で行われてもよいし、コンピュータによって自動で行われてもよい。
【００７４】
以下、後者のように、前述の要件を満たさない署名プログラムを改変して、前述の要件を満たす署名プログラムに改変するコンピュータを、署名プログラム生成装置３０００と呼ぶ。署名プログラム生成装置３０００について、さらに詳しく説明する。
【００７５】
図１２は、署名プログラム生成装置３０００の動作の概要を表す図である。署名プログラム生成装置３０００は、改変前署名プログラム６０を取得し、改変前署名プログラム６０を改変して、署名プログラム１０を生成する。具体的には、署名プログラム生成装置３０００は、改変前署名プログラム６０の中から、乱数１４を扱う処理を検出する。署名プログラム生成装置３０００は、検出した処理がセキュア記憶領域４０にロードされて実行されるように、改変前署名プログラム６０を改変する。具体的には、TEE を利用する場合、検出した処理をセキュアな実行環境で動作するプログラムに改変する。なお、プログラムの中から所定のデータを扱う処理を検出する技術、及びその処理をセキュアな実行環境で動作する処理に改変する技術には、既存の技術を利用することができる。
【００７６】
また、署名プログラム生成装置３０００は、乱数１４を扱う処理の中から、乱数１４を記憶領域に格納する処理を検出する。そして署名プログラム生成装置３０００は、乱数１４を記憶領域に格納する処理を改変して、その処理が乱数１４をセキュア記憶領域４０に格納するようにする。ここで、所定のデータを記憶領域に格納する処理を検出する技術、及びそのデータの格納先を通常の記憶領域からセキュアな記憶領域に変更する技術には、既存の技術を利用することができる。
【００７７】
＜＜作用効果＞＞
署名プログラム生成装置３０００によれば、乱数１４が漏洩する危険のある署名プログラムを、乱数１４が漏洩されない署名プログラム（署名プログラム１０）に改変することができる。よって、乱数１４が保護された安全な署名生成プログラムを容易に生成することができる。
【００７８】
＜＜機能構成の例＞＞
図１３は、署名プログラム生成装置３０００の機能構成を例示する図である。例えば署名プログラム生成装置３０００は、図１３に示すように、取得部３０２０、第１改変部３０４０、及び第２改変部３０６０を有する。取得部３０２０は、改変前署名プログラム６０（確率的署名方式で電子署名を生成する署名プログラム）を取得する。第１改変部３０４０は、改変前署名プログラム６０から、電子署名の生成に利用される乱数（乱数１４）を記憶領域に格納する処理を検出する。さらに第１改変部３０４０は、検出した処理が乱数１４をセキュア記憶領域４０に格納するように、改変前署名プログラム６０を改変する。第２改変部３０６０は、改変前署名プログラム６０から、乱数１４を扱う処理を検出する。さらに第２改変部３０６０は、検出した処理がセキュア記憶領域４０にロードして実行されるように、改変前署名プログラム６０を改変する。
【００７９】
＜＜署名プログラム生成装置３０００のハードウエア構成の例＞＞
署名プログラム生成装置３０００の各機能構成部は、各機能構成部を実現するハードウエア（例：ハードワイヤードされた電子回路など）で実現されてもよいし、ハードウエアとソフトウエアとの組み合わせ（例：電子回路とそれを制御するプログラムの組み合わせなど）で実現されてもよい。以下、署名プログラム生成装置３０００の各機能構成部がハードウエアとソフトウエアとの組み合わせで実現される場合について、さらに説明する。
【００８０】
図１４は、署名プログラム生成装置３０００を実現するための計算機４０００を例示する図である。計算機４０００は任意の計算機である。例えば計算機４０００は、Personal Computer（PC）やサーバマシンなどである。計算機４０００は、署名プログラム生成装置３０００を実現するために設計された専用の計算機であってもよいし、汎用の計算機であってもよい。
【００８１】
計算機４０００は、バス４０２０、プロセッサ４０４０、メモリ４０６０、ストレージデバイス４０８０、入出力インタフェース４１００、及びネットワークインタフェース４１２０を有する。バス４０２０、プロセッサ４０４０、メモリ４０６０、ストレージデバイス４０８０、入出力インタフェース４１００、及びネットワークインタフェース４１２０の機能はそれぞれ、バス１０２０、プロセッサ１０４０、ストレージデバイス１０８０、入出力インタフェース１１００、及びネットワークインタフェース１１２０の機能と同様である。
【００８２】
ストレージデバイス４０８０には、署名プログラム生成装置３０００の各機能構成部を実現するプログラムモジュールが記憶されている。プロセッサ４０４０は、ストレージデバイス４０８０に記憶されているプログラムモジュールを実行することで、署名プログラム生成装置３０００の各機能構成部の機能を実現する。
【００８３】
＜＜処理の流れ＞＞
図１５は、署名プログラム生成装置３０００が行う処理の流れを例示するフローチャートである。取得部３０２０は、改変前署名プログラム６０を取得する（Ｓ２０２）。第１改変部３０４０は、改変前署名プログラム６０から、乱数１４を記憶領域に格納する処理を検出する（Ｓ２０４）。第１改変部３０４０は、検出した処理が乱数１４をセキュア記憶領域４０に格納するように、改変前署名プログラム６０を改変する（Ｓ２０６）。第２改変部３０６０は、改変前署名プログラム６０から、乱数１４を扱う処理を検出する（Ｓ２０８）。第２改変部３０６０は、検出した処理がセキュア記憶領域４０にロードして実行されるように、改変前署名プログラム６０を改変する（Ｓ２１０）。
【００８４】
また、署名プログラム生成装置３０００は、改変前署名プログラム６０を改変することで生成した署名プログラム１０を出力する。例えば署名プログラム生成装置３０００は、署名生成装置２０００に対して署名プログラム１０を送信する。その他にも例えば、署名プログラム生成装置３０００は、任意の記憶装置に署名プログラム１０を格納してもよい。
【００８５】
なお、取得部３０２０が改変前署名プログラム６０を取得する方法は任意である。例えば取得部３０２０は、記憶装置に記憶されている改変前署名プログラム６０を、その記憶装置から取得する。その他にも例えば、取得部３０２０は、他の装置から送信される改変前署名プログラム６０を受信することで、改変前署名プログラム６０を取得する。
【００８６】
［実施形態２］
実施形態２の署名生成装置２０００は、実施形態１の署名生成装置２０００と同様に、署名プログラムを用い、メッセージ２０について電子署名３０を生成する。以降で説明する点を除き、実施形態２の署名生成装置２０００は、実施形態１の署名生成装置２０００と同様の機能を有する。
【００８７】
実施形態２の署名生成装置２０００は、署名プログラムの少なくとも一部が難読化されている点、及びセキュア記憶領域４０を要しない点で、実施形態１の署名生成装置２０００と相違する。ここでいう「プログラムの難読化」とは、プログラム内の静的な機密情報の復元が困難なようにプログラムを実装することを意味する。なお、このような難読化が施された署名プログラムは、ホワイトボックス実装された署名プログラムとも呼ばれる。
【００８８】
実施形態２の署名生成装置２０００では、署名プログラム７０が動作する。署名プログラム７０は、実施形態１における署名プログラム１０と同様に、確率的署名方式で電子署名を生成する。より具体的には、署名プログラム７０は、メッセージ２０を取得し、秘密鍵及び乱数を用いて、メッセージ２０から電子署名３０を生成する。
【００８９】
ただし、署名プログラム７０には、乱数１４自体と、乱数１４を扱う処理とが、難読化された状態で含められている。そのため、乱数１４と乱数１４を扱う処理をセキュアな記憶領域で扱わなくても、乱数１４が漏洩することを防ぐことができる（すなわち、乱数１４を保護できる）。なお、乱数１４を扱う処理をセキュアな記憶領域で扱う必要がないため、実行部２０２０は、乱数１４を扱う処理も通常の記憶領域にロードして実行する。
【００９０】
ここで、実施形態１でも述べたとおり、秘密鍵１２を保護する方法は、必ずしも乱数１４を保護する方法と同一である必要はなく、既存の種々の方法を利用することもできる。すなわち、秘密鍵１２については、秘密鍵１２を難読化することで保護してもよいし、その他の既存の手法で保護してもよい。
【００９１】
図１６は、署名プログラム７０の動作の具体例を例示する図である。前述したように、DSA では、次のようにメッセージ m に対する署名(r,s)を計算する。
r=(g^{k} mod p) mod q
s=k^{-1}(h(m)+xr) mod q
【００９２】
署名プログラム７０では、上述した r と s を算出する処理が難読化されている。乱数 k は、r と s を算出する処理の中で、k=a*k' として算出される。a は難読化した状態で予め署名プログラム７０に含められるデータである。k' は、難読化されていない仮の乱数であり、署名プログラム７０に予め含められていてもよいし、乱数生成器によって生成されてもよい。
【００９３】
ここで、ｒを算出する処理では、数学的に困難とされている離散対数問題を解くことが要求される r=(g^{k} mod p) mod q の形で処理結果が出力される。そのため、a*k' を計算すること、ひいては a を計算することが困難であり、現実的には不可能であるといえる。また ｓ を算出する処理では、算出する式 s=(a*k')^{-1}(h(m)-xr) mod 内に二つの未知変数 a と x が存在する。そのため、乱数の算出に利用した正確な未知変数 a と x を計算することは困難であり、現実的には不可能であるといえる。そのため、攻撃者がデータ a を得ることはできない。
【００９４】
このように、乱数 k は、難読化された状態で署名プログラム７０に含められているデータ a を利用して、難読化された処理の中で算出され、なおかつ計算結果としては出力されない。すなわち、乱数 k は難読化された処理の中でのみ扱われる。よって、攻撃者は乱数 k を得ることができない。
【００９５】
なお、r の算出において g^{a*k'} が利用されればよいため、a の代わりに g^{a} を難読化した状態で署名プログラム７０に含めておいてもよい。この場合、g^{a*k'} を {g^{a}}^{k'} という計算で算出できる。
【００９６】
また、図１６の例では、秘密鍵 x 及びそれを扱う処理（すなわち、s を算出する処理）も難読化されている。そのため、攻撃者は、乱数 k と同様に、秘密鍵 x を得ることもできない。
【００９７】
＜作用効果＞
本実施形態の署名生成装置２０００によれば、電子署名３０の生成に利用される署名プログラム７０において、乱数１４自体と乱数１４を扱う処理が難読化されている。そのため、たとえ攻撃者に root 権限を乗っ取られても、攻撃者は乱数１４を得ることができない。そのため、乱数の漏洩によって秘密鍵が算出されてしまうことを防ぐことができる。よって、秘密鍵の安全性、ひいては署名プログラムの安全性を向上させることができる。
【００９８】
＜機能構成の例＞
実施形態２の署名生成装置２０００の機能構成は、実施形態１の署名生成装置２０００の機能構成と同様に、例えば図３で表される。実施形態２の署名生成装置２０００を例示する図である。署名生成装置２０００の実行部２０２０は、署名プログラム７０を実行する。署名プログラム７０は、メッセージ２０を取得し、秘密鍵１２及び乱数１４を用いて、メッセージ２０から電子署名３０を生成する。ここで、署名プログラム７０において、乱数１４自体、及び乱数１４を扱う処理は、難読化されている。
【００９９】
＜ハードウエア構成の例＞
実施形態２の署名生成装置２０００のハードウエア構成は、実施形態１の署名生成装置２０００のハードウエア構成と同様に、例えば図４で表れる。ただし、実施形態２の署名生成装置２０００のストレージデバイス１０８０には、実施形態２の実行部２０２０を実現するプログラムモジュール及び署名プログラム７０が記憶されている。
【０１００】
＜処理の流れ＞
実施形態２の署名生成装置２０００によって実行される処理の流れは、実施形態１の署名生成装置２０００によって実行される処理の流れと同様に、例えば図５で表される。
【０１０１】
以上、図面を参照して本発明の実施形態について述べたが、これらは本発明の例示であり、上記各実施形態の構成を組み合わせた構成や、上記以外の様々な構成を採用することもできる。
【図１】
2020065958.tif 000003
【図２】
2020065958.tif 000004
【図３】
2020065958.tif 000005
【図４】
2020065958.tif 000006
【図５】
2020065958.tif 000007
【図６】
2020065958.tif 000008
【図７】
2020065958.tif 000009
【図８】
2020065958.tif 000010
【図９】
2020065958.tif 000011
【図１０】
2020065958.tif 000012
【図１１】
2020065958.tif 000013
【図１２】
2020065958.tif 000014
【図１３】
2020065958.tif 000015
【図１４】
2020065958.tif 000016
【図１５】
2020065958.tif 000017
【図１６】
2020065958.tif 000018
【国際調査報告】
2020065958.tif 000019
2020065958.tif 000020
2020065958.tif 000021
2020065958.tif 000022
2020065958.tif 000023
2020065958.tif 000024
2020065958.tif 000025
2020065958.tif 000026
2020065958.tif 000027
2020065958.tif 000028