(57)【要約】  秘密の通信又は認証を行う際に算出されるべき演算の処理の時間を従来よりも小さくすることのできる情報セキュリティ装置を提供することを目的とする。  対象データＸと秘密の値ｄとからウィンドウ法を用いてべき乗値Ｘ＾ｄを算出することにより、秘密の通信又は認証を行う情報セキュリティ装置であって、べき乗値Ｘ＾ｄを算出する過程において、乗算による演算にて出現した乱数Ｒに対して２乗演算を所定回数、例えば２５６回繰り返した直後の乗算にて、乱数除去数Ｓ（＝Ｒ＾（−２＾２５６））を用いて、乱数Ｒに対する２乗演算による演算結果をキャンセルすることで、従来のキャンセル処理を不要とする。
2008149496.tif 000002
【特許請求の範囲】
【請求項１】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置であって、
値ｄを取得する取得手段と、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、
前記主演算手段は、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする情報セキュリティ装置。
【請求項２】
前記情報セキュリティ装置は、さらに、
べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施す処理手段を備える
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項３】
前記第２ウィンドウは、前記第１ウィンドウから値ｖだけ先に存在し、
前記キャンセル値Ｓは、べき演算（ｖ＆２）の演算結果に対する前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの逆数であり、
前記主演算手段は、
前記乱数Ｒと、前記キャンセル値Ｓとを取得する取得部と、
変数Ｚを保持する変数保持部と、
初期値として変数Ｚに単位元を設定する初期化部と、
前記桁上演算により変数Ｚをウィンドウ幅だけ桁上げし、その結果を変数Ｚとする桁上演算部と、
演算対象のウィンドウについて、そのウィンドウ値ｗ及び元Ｘに基づくべき演算値を取得し、少なくとも変数Ｚと取得したべき演算値とを用いて前記ウィンドウ演算を施して演算結果を変数Ｚとするウィンドウ演算部と、
前記桁上演算部及びウィンドウ演算部に対して、全てのウィンドウについて、桁上演算とウィンドウ演算とを繰り返すように制御する制御部とを含み、
前記ウィンドウ演算部は、
前記第１のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、
前記第２のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとする
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項４】
前記ウィンドウ演算部は、
前記第１のウィンドウから連続するｉ個（ｉはｖより小さい値）のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行い、
前記第２のウィンドウから連続するｉ個のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行う
ことを特徴とする請求項３に記載の情報セキュリティ装置。
【請求項５】
前記各ウィンドウに含まれるビット数は、ｕ（ｕは１以上の整数）であり、
前記ウィンドウの個数は、ｌｅｎｄ／ｕ個であり、
値ｌｅｎｄは、前記値ｄのビット長以上である２のべき数のうち最小の値であり、
前記値ｖは、ｌｅｎｄ＝２ｖを満たし、
前記第１のウィンドウは先頭ウィンドウであり、前記第２のウィンドウは先頭ウィンドウからｌｅｎｄ／２ｕ＋１番目に位置するウィンドウであり、
先頭ウィンドウからｌｅｎｄ／２ｕ個のウィンドウ、及び先頭からｌｅｎｄ／２ｕ＋１番目のウィンドウから末尾のウィンドウまでのｌｅｎｄ／２ｕ個のウィンドウは、ｉ個のウィンドウからなる第１から第ｐのグループ、及び第ｐ＋１から第ｍのグループに分割され、
前記取得部は、さらに、第１から第ｐのグループに対して、演算対象のグループから次グループに演算対象が変更されるときに、演算対象の変更直前に用いた乱数とは異なる乱数を取得し、
前記ウィンドウ演算部は、第１から第ｐのグループそれぞれに対して、当該グループが演算対象である間は、当該グループに含まれるウィンドウそれぞれに対して、前記取得部にて取得された乱数を用いたウィンドウ演算による演算値を取得し、
前記取得部は、第ｐ＋１から第ｍのグループに含まれる第ｍ’のグループを演算対象とする際に、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を取得し、
前記ウィンドウ演算部は、前記第ｍ’のグループを演算対象としている間は、前記取得部にて取得されたキャンセル値を用いたウィンドウ演算による演算値を取得する
ことを特徴とする請求項４に記載の情報セキュリティ装置。
【請求項６】
前記取得部は、
ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを対応付けて予め記憶しており、
前記第１から第ｐのグループそれぞれに対して、当該グループが演算対象となる際に現時点で未選択の１個以上の乱数から１個の乱数を選択することで、当該グループで用いる乱数を取得し、
前記第ｍ’のグループに対して、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を選択することで、当該第ｍ’のグループで用いるキャンセル値を取得する
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項７】
前記取得部は、
前記異なる乱数の取得時において、現時点で保持している乱数Ｒに、所定数ｑに対するべき乗演算Ｒ＾ｑを行い、当該べき乗演算Ｒ＾ｑの演算結果を再度乱数Ｒとして保持し、
キャンセル値の取得時において、現時点で保持しているキャンセル値Ｓに、前記所定数ｑに対するべき乗演算Ｓ＾ｑを行い、当該べき乗演算Ｓ＾ｑを再度キャンセル値Ｓとして保持する
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項８】
前記取得部は、
第１のシード値Ｕと、前記値ｖに対する前記第１のシード値Ｕのべき演算（ｖ＆２）＆Ｕのキャンセル値である第２のシード値Ｖとを予め記憶しており、
前記取得部は、
前記第１のグループに対する演算に先立って、乱数ｒを生成し、前記第１、及び第２のシード値Ｕ、Ｖにおいて、乱数ｒに対するべき乗演算を施した値それぞれを乱数Ｒ及びキャンセル値Ｓとして保持する
ことを特徴とする請求項７に記載の情報セキュリティ装置。
【請求項９】
前記各グループは、１個のウィンドウからなる
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項１０】
前記ウィンドウは、１ビット長である
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項１１】
前記取得部は、
さらに、前記第１のウィンドウから前記第２のウィンドウまでに存在する第３のウィンドウを対象とする際に、前記乱数Ｒを前記乱数Ｒとは異なる乱数Ｒ’を取得し、
さらに、前記第３ウィンドウから当該第２ウィンドウまでに前記乱数Ｒ’に対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓ’を取得し、前記キャンセル値Ｓとともに保持し、
前記ウィンドウ演算部は、
前記第３のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒ’と、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、
前記第２のウィンドウにおいて、さらに、前記キャンセル値Ｓ’を用いたウィンドウ演算による演算値を取得する
ことを特徴とする請求項３に記載の情報セキュリティ装置。
【請求項１２】
前記取得部は、
前記キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め保持することにより、前記前記キャンセル値Ｓ及びＳ’を保持し、
前記取得部は、
前記第２のウィンドウを演算対象とする際に、前記値Ｔを取得することにより、前記キャンセル値Ｓ及びＳ’を取得する
ことを特徴とする請求項１１に記載の情報セキュリティ装置。
【請求項１３】
前記取得部は、
前記キャンセル値Ｓ及びＳ’とを予め保持しており、
前記キャンセル値Ｓ及びＳ’を用いた基本演算を施して値Ｔを算出して取得することにより、前記キャンセル値Ｓ及びＳ’を取得する
ことを特徴とする請求項１１に記載の情報セキュリティ装置。
【請求項１４】
前記群は、前記所定の集合を値ｎを法とする剰余体とし、基本演算を乗算とし、
前記元Ｘは、前記剰余体に含まれる値であり、
前記桁上演算は、前記剰余体上のべき乗算であり、
前記基本演算及び前記ウィンドウ演算は、前記剰余体上の乗算であり、
前記主演算部は、前記剰余体上のべき乗算及び前記剰余体上の乗算を用いて、前記べき乗演算ｄ＆Ｘ＝Ｘ＾ｄを算出する
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項１５】
前記群は、前記所定の集合を楕円曲線上の点の集合とし、、基本演算を加算とし、
前記元Ｘは、楕円曲線上の点であり、
前記桁上演算は、前記楕円曲線上のべき倍演算であり、
前記基本演算及び前記ウィンドウ演算は、前記楕円曲線上の加算であり、
前記主演算部は、前記楕円曲線上のべき倍演算及び前記楕円曲線上の加算を用いて、前記べき倍演算ｄ＆Ｘ＝ｄ＊Ｘを算出する
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項１６】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられる方法であって、
値ｄを取得する取得ステップと、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算ステップとを含み、
前記主演算ステップは、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする方法。
【請求項１７】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられるコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記記録媒体は、コンピュータに対して、
値ｄを取得する取得ステップと、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算ステップとを実行させるためのコンピュータプログラムを記録し、
前記主演算ステップは、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする記録媒体。
【請求項１８】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられる集積回路であって、
値ｄを取得する取得手段と、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、
前記主演算手段は、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする集積回路。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号処理を実行する際の電力消費量を計測することで暗号モジュールに埋め込まれている秘密の情報を解析する攻撃に対して、解析を困難にする技術に関するものである。
【背景技術】
【０００２】
近年、ハードウェアあるいはソフトウェアで実装された暗号モジュールが、暗号処理を行う際の副情報を手がかりにして、暗号鍵の解析を行う解読法が各種考案されている。不正な第三者が暗号鍵の解析し、秘密鍵を解読すると、解読された秘密鍵を用いて、正当な利用者になりすまして、秘密鍵を用いて不正行為を働くことができる。【０００３】
例えば、暗号鍵の解析を行う解読法としては、タイミング攻撃と呼ばれる解析方法がある。タイミング攻撃と呼ばれる解析方法では、暗号モジュールが暗号処理に要する時間が、暗号処理に用いている暗号鍵の値により、わずかではあるが異なることを利用して、暗号鍵の解析を行う。即ち、タイミング攻撃においては、暗号処理を行う際の処理時間という副情報を利用して、暗号鍵の解読を行っている。そのような解読法の中でも、暗号処理を行う際の電力消費量を副情報として、解読を行う解読方法は、Ｓｉｍｐｌｅ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ（単純電力解析攻撃）やＤｉｆｆｅｒｅｎｔｉａｌ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ（差分電力解析攻撃）といった各種の方法が考案されている。これらの解読法は、近年、高性能な計測機器が安価で手に入るようになった背景もあって、ＩＣカードのような暗号が実装された実際の製品に対しても解析が可能であることが報告されている。以下の記述では、上記のような暗号処理時における暗号モジュールの電力消費量の変化、すなわち、電力波形を手がかりにして、暗号鍵を解析する解読方法を総称して、「電力解析攻撃」と呼ぶ。タイミング攻撃については、非特許文献１、電力解析攻撃については、非特許文献２が詳しい。【０００４】
以下で、ＲＳＡ暗号への単純電力解析攻撃について説明する。ＲＳＡ暗号については、非特許文献３が詳しい。【０００５】
＜ＲＳＡ暗号の単純電力解析攻撃＞
ＲＳＡ暗号の復号化処理において、素数ｐ、ｑの積ｎ、ｎ未満の正整数である暗号文ｃと、正整数である秘密鍵ｄに対し、ｃ＾ｄ  ｍｏｄ  ｎの計算を行う。この計算方法として例えば、非特許文献４の９ページにおけるバイナリ法が知られている。以下では、バイナリ法について説明する。ｄ＝ｄ０＋ｄ１×２＋ｄ２×２＾２＋・・・＋ｄ＾（ｌｅｎ−１）×２＾（ｌｅｎ−１）、ｉ＝０，１，・・・，ｌｅｎ−１に対しｄｉ＝０または１とする。ここで、ｌｅｎはｄのビット数、"×"は整数の乗算、ｘ＾ｙはｘのｙ乗を示している。【０００６】
（バイナリ法）
・ステップ１−１：ｉ←ｌｅｎ−２，  ｚ←ｃ
・ステップ１−２：ｚ←ｚ＾２  ｍｏｄ  ｎ
・ステップ１−３：ｄｉが１であるかチェック。ｄｉ＝１である場合は、ｚ←ｚ×ｃ  ｍｏｄ  ｎ。【０００７】
・ステップ１−４：ｉ←ｉ−１。ｉが負であるかチェック。負である場合は、ｚを出力。それ以外は、ステップ１−２へ移る。【０００８】
上記方法では、ステップ１−２、１−３、１−４をループとして繰り返し計算している。このループ内で、ｄｉ（ｉ＝１，２，・・・，ｌｅｎ−１）に対して、ｄｉ＝１の場合は、ｚの２乗算とｃによる乗算を行い、ｄｉ＝０の場合は、ｚの２乗算のみを実行する。ｎは大きな数、例えば、１０２４ビットの整数である。通常は、２乗算は乗算より、計算の処理の効率化が図ることが可能なため、高速に処理可能になる。その場合、２乗算と乗算は処理が異なるため、電力波形が異なる。【０００９】
したがって、電力波形を計測することにより、２乗算、乗算の演算の順序を解析することが可能になる。さらに、ｄｉによりループ内の処理が異なることを利用して、その順序からｄｉの値を求められる。まとめると、以下のステップにより、単純電力解析攻撃が可能になる。【００１０】
（バイナリ法の単純電力解析攻撃）
・ステップ２−１：暗号文ｃを復号化し、その処理における電力波形を計測。【００１１】
・ステップ２−２：上記電力波形より、２乗算、乗算の演算の順序を求める。【００１２】
・ステップ２−３：上記順序より、ビットｄｉ（ｉ＝１，２，・・・，ｌｅｎ−１）を求める。【００１３】
＜従来のＲＳＡ暗号の単純電力解析攻撃対策＞
上記の単純電力解析攻撃では、バイナリ法のステップ１−３においてｄｉ＝１のときのみ乗算を行うことを利用して秘密鍵の解析を行っている。【００１４】
そこで、ｄｉ＝０のときに、１をｚに乗じる乗算をすることで、結果は変化しないが、ｄｉ＝０のときにも乗算を行うことで、２乗算、乗算の演算順序がｄの値に依存しなくなる、単純電力解析攻撃の対策方法も考案されている（非特許文献１参照）。【００１５】
上述したＲＳＡ暗号の単純電力解析攻撃対策では、ｄｉ＝１のときにｃ、ｄｉ＝０のときに１を乗じる乗算を行い、乗数が異なる。このことを利用してｄｉが０であるか１であるかを解析する攻撃（ＢｉｇＭａｃ攻撃と呼ばれる）が考案されている（非特許文献５参照）。この攻撃を使用すると、上述した単純電力解析攻撃対策をしても、ｄの値が解析されてしまう。なぜなら、乗数が同一の場合には、得られる電力波形が一致する部分が存在する可能性が高いので、単純電力解析により得られる乗算の電力波形は２種類に分類することができる（例えば、グループＡとグループＢ）。このとき、グループＡとグループＢｄｉのビット値との対応は２つの場合しかない。グループＡにはｄｉ＝１、グループＢにはｄｉ＝０がそれぞれ対応する場合と、グループＡにはｄｉ＝０、グループＢにはｄｉ＝１がそれぞれ対応する場合である。これら２つの場合それぞれに対して、例えば、再度暗号文を復号することで、どちらの対応付けが正しいかが分かる、つまり秘密鍵を取得することができる。【００１６】
そこで、特許文献１では、秘密鍵の解析を困難にするために、秘密鍵ｄを、所定のビット数からなる複数のブロックに分割し、バイナリ法における乗算時においてｄｉの値に関わらず値ｚにブロック毎に異なる乱数を乗算し、全てのｄｉに対する２乗算及び乗算の演算が終了した後に乗算した乱数を当該乱数のキャンセル値を用いてキャンセルする技術が開示されている。【００１７】
特許文献１では、暗号文ｃに対するｃ＾ｄの演算を行う前に、値Ｒ、及びＳを求める。ここで、Ｒ×Ｓ  ｍｏｄ  ｎ  ＝１である。【００１８】
そして、各ｄｉに対して２乗算及び乗算の演算を実行する。このとき、乗算の演算に用いる乱数がブロック毎に異なるように、値Ｒを用いて当該乱数を設定する。例えば、ｍ番目のブロックには乱数Ｒ＾ｍを用いて乗算することで、ブロック毎に異なる乱数を用いることができる。【００１９】
全てのブロックに対して２乗算及び乗算の演算が終了した後に、値Ｓを用いて、乱数Ｒよる影響を除去することで、ｃ＾ｄが得られる。【００２０】
この技術によると、ブロック毎には、ｄｉ＝０、１の対応付けが２つのパターンが存在する。しかしながら、２つの対応付けのパターンが全ブロックにおいて存在するので、秘密鍵ｄ全体に対しては、２＾（ブロック数）のパターンが存在することとなる。従って、秘密鍵の解析者は、２＾（ブロック数）のパターン全てをチェックしなければならないので、秘密鍵の解析は困難となる。
【特許文献１】特開２０００−１６５３７５号公報
【非特許文献１】Ｐａｕｌ  Ｋｏｃｈｅｒ．  Ｔｉｍｉｎｇ  ａｔｔａｃｋｓ  ｏｎ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎｓ  ｏｆ  Ｄｉｆｆｉｅ−Ｈｅｌｌｍａｎ，  ＲＳＡ，  ＤＳＳ，  ａｎｄ  ｏｔｈｅｒ  ｓｙｓｔｅｍｓ．  Ｉｎ  Ｎｅａｌ  Ｋｏｂｌｉｔｚ，  ｅｄｉｔｏｒ，  ＣＲＹＰＴＯ'９６，    ＬＮＣＳ  １１０９，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  １９９６，  ｐｐ．１０４−１１３．
【非特許文献２】Ｐ．  Ｋｏｃｈｅｒ，  Ｊ．  Ｊａ＿ｅ，  ａｎｄ  Ｂ．  Ｊｕｎ，  "Ｄｉ＿ｅｒｅｎｔｉａｌ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ，"  Ａｄｖａｎｃｅｓ  ｉｎ  Ｃｒｙｐｔｏｌｏｇｙ  −ＣＲＹＰＴＯ  '９９，  ＬＮＣＳ，  １６６６  ，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  １９９９，  ｐｐ．３８８−３９７．
【非特許文献３】岡本龍明、山本博資、「現代暗号」、産業図書（１９９７年）
【非特許文献４】Ｈ．Ｃｏｈｅｎ，"Ａ  Ｃｏｕｒｓｅ  ｉｎ  Ｃｏｍｐｕｔａｔｉｏｎａｌ  Ａｌｇｅｂｒａｉｃ  Ｎｕｍｂｅｒ  Ｔｈｅｏｒｙ"，ＧＴＭ  １３８，Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，１９９６，ｐ９
【非特許文献５】Ｃ．Ｄ．Ｗａｌｔｅｒ，"Ｓｌｉｄｉｎｇ  ｗｉｎｄｏｗｓ  ｓｕｃｃｕｍｂｓ  ｔｏ  Ｂｉｇ  Ｍａｃ  Ａｔｔａｃｋ"，  ＣＨＥＳ２００１，  ＬＮＣＳ２１６２，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  ２００１，  ｐｐ．２８６−２９９．
【非特許文献６】神永、渡邊、遠藤、大河内、"ＲＳＡ暗号の電力解析法による攻撃とその対策"、ＩＥＩＣＥ、Ｖｏｌ．  Ｊ８８−Ａ、Ｎｏ．５、ｐｐ．６０６−６１５、２００５
【発明の開示】
【発明が解決しようとする課題】
【００２１】
しかしながら、特許文献１に開示された技術では、全てのｄｉに対する２乗算及び乗算の演算が終了した後に乗算した乱数をキャンセルするので、その処理時間は大きなものとなる。なぜなら、例えば、先頭ビットｄ５１１に対する乗算の演算において乱数Ｒが出現すると、この乱数Ｒは、以降全てのビットに対する２乗算の演算に影響を及ぼし、その値はＲ＾（２＾（ｌｅｎ―１））となる。つまり、ｉ番目のビットｄｉにおいては乱数Ｒ＾ｍが出現し、以降全てのビットに対する２乗算の演算において、このＲ＾ｍも２乗算される。ここで、ｍは、ｄｉが属するブロックの番号である。そして、その結果、その値は、（Ｒ＾ｍ）＾（２＾（ｉ−１））となる。【００２２】
つまり、値Ｓを用いて乱数Ｒの影響を除去するためには、各ｄｉに対して、当該ｄｉに対する乗算にて出現した乱数Ｒ＾ｍによる最終的な２乗算結果（Ｒ＾ｍ）＾（２＾（ｉ−１））のキャンセル値（Ｓ＾ｍ）＾（−２＾（ｉ−１））を算出し、それら全てを乗算する必要がある。【００２３】
そのため、値Ｓを用いて乱数Ｒの影響を除去する処理の処理時間は大きなものとなるので、べき乗演算全体の処理時間も大きくなる。【００２４】
本発明は、上記の問題に鑑みて、秘密の通信又は認証を行う際に算出されるべき乗倍値の演算処理の時間を従来よりも小さくすることのできる情報セキュリティ装置、方法、プログラム及び集積回路を提供することを目的とする。
【課題を解決するための手段】
【００２５】
上記目的を達成するために、本発明の一実施態様である、所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置は、値ｄを取得する取得手段と、ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、前記主演算手段は、第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いることを特徴とする。
【発明の効果】
【００２６】
上記の構成によると、情報セキュリティ装置は、ウィンドウ法を用いて対象データＸに対するべき演算ｄ＆Ｘを算出する過程において、第１のウィンドウで出現した乱数Ｒに対する桁上演算による影響を、第２のウィンドウにおけるウィンドウ演算にてキャンセル値Ｓを用いることで打ち消している。これにより、情報セキュリティ装置は、全てのウィンドウに対する演算が終了した後に従来のように乱数Ｒによる影響をキャンセルする値を算出するキャンセル処理を必要としないので、従来よりもべき演算全体の処理時間が小さくなる。
【図面の簡単な説明】
【００２７】
【図１】べき乗演算装置１０００の構成を示すブロック図である。
【図２】乗数群格納部１１３０にて格納される乗数群を示す図である。
【図３】乱数群格納部１１４０にて格納される乱数群を示す図である。
【図４】乱数選択情報生成部１１７０による配列ＲＳＩを生成する動作を示す流れ図である。
【図５】べき乗演算装置１０００の動作を示す流れ図である。図６へ続く。
【図６】べき乗演算装置１０００の動作を示す流れ図である。図５から続く。
【図７】ＭＴ＿ｉの初期化処理の動作を示す流れ図である。
【図８】ＭＴ＿ｉの更新処理の動作を示す流れ図である。
【図９】秘密鍵を構成するサブブロック毎に、割り当てる乗数を変化させる具体例を示す図である。
【図１０】攻撃者による秘密鍵ｄのビットの分類、推測が困難となることを説明する図である。
【図１１】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを説明する図である。
【図１２】ｃｏｕｎｔ（＝ｉ）番目に出現した乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを説明する図である。
【図１３】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを、上位ビット及び下位ビットに分割して説明する図である。
【図１４】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１５へ続く。
【図１５】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１４から続き、図１６へ続く。
【図１６】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１５から続く。
【図１７】べき乗演算装置２０００の構成を示すブロック図である。
【図１８】乗数群格納部２１３０にて格納される乗数群を示す図である。
【図１９】乱数群格納部２１４０にて格納される乱数群を示す図である。
【図２０】べき乗演算装置２０００の動作を示す流れ図である。図２１へ続く。
【図２１】べき乗演算装置２０００の動作を示す流れ図である。図２０から続く。
【図２２】乱数群ＲＴの設定処理の動作を示す図である。
【図２３】べき乗演算装置３０００の構成を示すブロック図である。
【図２４】乗数群格納部３１３０にて格納される乗数群を示す図である。
【図２５】秘密鍵ｄを構成する複数の分割秘密情報の一例を示す図である。
【図２６】べき乗演算装置３０００の動作を示す流れ図である。図２７へ続く。
【図２７】べき乗演算装置３０００の動作を示す流れ図である。図２６から続く。
【図２８】ＭＴ＿ｉの初期化処理の動作を示す流れ図である。
【図２９】２乗演算処理の動作を示す流れ図である。
【図３０】ＭＴ＿ｉの更新処理の動作を示す流れ図である。
【図３１】２つの乱数Ｒ、Ｒ’と１つの乱数除去数Ｓとで、乱数Ｒ、Ｒ’に対する演算の影響をキャンセルする一例を示す図である。
【図３２】装置Ａと装置Ｂとの間で行われる楕円曲線を用いた鍵共有の一例について、その動作を示す流れ図である。
【符号の説明】
【００２８】
１０００、２０００、３０００    乗演算装置
１０１０、２０１０、３０１０    入出力部
１０２０、２０２０、３０２０    秘密鍵格納部
１０３０、２０３０、３０３０    カウンタ格納部
１０４０、２０４０、３０４０    カウンタ初期化部
１０５０、２０５０、３０５０    カウンタ更新部
１０６０、２０６０、３０６０    第１のカウンタ判定部
１０７０、２０７０、３０７０    第２のカウンタ判定部
１０８０、２０８０、３０８０    第３のカウンタ判定部
１０９０、２０９０    ビット判定部
１１００、２１００、３１００    乗算部
１１１０、２１１０、３１１０    ２乗算部
１１２０、２１２０、３１２０    中間値格納部
１１３０、２１３０、３１３０    乗数群格納部
１１４０、２１４０、３１４０    乱数群格納部
１１５０、２１５０、３１５０    乗数群設定部
１１６０、２１６０、３１６０    乗数群更新部
１１７０    乱数選択情報生成部
２１８０、３１８０    乱数シード格納部
２１９０、３１９０    乱数群設定部
３０９０    乗数選択部
【発明を実施するための最良の形態】
【００２９】
本発明の一実施態様である、所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置は、値ｄを取得する取得手段と、ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、前記主演算手段は、第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いることを特徴とする。【００３０】
この構成によると、情報セキュリティ装置は、ウィンドウ法を用いて対象データＸに対するべき演算ｄ＆Ｘを算出する過程において、第１のウィンドウで出現した乱数Ｒに対する桁上演算による影響を、第２のウィンドウにおけるウィンドウ演算にてキャンセル値Ｓを用いることで打ち消している。これにより、情報セキュリティ装置は、全てのウィンドウに対する演算が終了した後に従来のように乱数Ｒによる影響をキャンセルする値を算出するキャンセル処理を必要としないので、従来よりもべき演算全体の処理時間が小さくなる。【００３１】
ここで、前記情報セキュリティ装置は、さらに、べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施す処理手段を備えるとしてもよい。【００３２】
この構成によると、情報セキュリティ装置は、べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施すので、これら処理に要する処理時間は、従来よりも小さくなる。【００３３】
ここで、前記第２ウィンドウは、前記第１ウィンドウから値ｖだけ先に存在し、前記キャンセル値Ｓは、べき演算（ｖ＆２）の演算結果に対する前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの逆数であり、前記主演算手段は、前記乱数Ｒと、前記キャンセル値Ｓとを取得する取得部と、変数Ｚを保持する変数保持部と、初期値として変数Ｚに単位元を設定する初期化部と、前記桁上演算により変数Ｚをウィンドウ幅だけ桁上げし、その結果を変数Ｚとする桁上演算部と、演算対象のウィンドウについて、そのウィンドウ値ｗ及び元Ｘに基づくべき演算値を取得し、少なくとも変数Ｚと取得したべき演算値とを用いて前記ウィンドウ演算を施して演算結果を変数Ｚとするウィンドウ演算部と、前記桁上演算部及びウィンドウ演算部に対して、全てのウィンドウについて、桁上演算とウィンドウ演算とを繰り返すように制御する制御部とを含み、前記ウィンドウ演算部は、前記第１のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、前記第２のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとするとしてもよい。【００３４】
この構成によると、情報セキュリティ装置は、前記乱数Ｒに対する桁上演算による累積演算因数を、前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの演算結果の逆数であるキャンセル値Ｓを用いて、確実に打ち消すことができる。なぜなら、乱数Ｒが出現してから第２のウィンドウにおける桁上演算までの間に、値ｖ分の桁上げが行われているので、第２のウィンドウでウィンドウ演算が行われる際には、乱数Ｒに対する桁上演算による演算結果は、（ｖ＆２）＆Ｒとなっている。従って、情報セキュリティ装置は、第２のウィンドウでキャンセル値Ｓを用いたウィンドウ演算にて、この値（ｖ＆２）＆Ｒを打ち消すことができる。【００３５】
ここで、前記ウィンドウ演算部は、前記第１のウィンドウから連続するｉ個（ｉはｖより小さい値）のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行い、前記第２のウィンドウから連続するｉ個のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行うとしてもよい。【００３６】
この構成によると、情報セキュリティ装置は、第１のウィンドウから連続するｉ個のウィンドウそれぞれに対して、乱数Ｒを用いたウィンドウ演算を行い、第２のウィンドウから連続するｉ個のウィンドウそれぞれに対して、キャンセル値Ｒを用いたウィンドウ演算を行うことで、値ｄの解析を困難にすることができる。また、第１のウィンドウから連続するｉ個のウィンドウそれぞれに対して、当該ウィンドウから値ｖだけ先のウィンドウは、第２のウィンドウから連続するｉ個のウィンドウからなるグループに含まれているので、第１のウィンドウから連続するｉ個のウィンドウ毎に出現した乱数Ｒそれぞれにおける桁上演算による影響を、値ｖだけ先のウィンドウにおけるウィンドウ演算にて確実に打ち消すことができる。【００３７】
ここで、前記各ウィンドウに含まれるビット数は、ｕ（ｕは１以上の整数）であり、前記ウィンドウの個数は、ｌｅｎｄ／ｕ個であり、値ｌｅｎｄは、前記値ｄのビット長以上である２のべき数のうち最小の値であり、前記値ｖは、ｌｅｎｄ＝２ｖを満たし、前記第１のウィンドウは先頭ウィンドウであり、前記第２のウィンドウは先頭ウィンドウからｌｅｎｄ／２ｕ＋１番目に位置するウィンドウであり、先頭ウィンドウからｌｅｎｄ／２ｕ個のウィンドウ、及び先頭からｌｅｎｄ／２ｕ＋１番目のウィンドウから末尾のウィンドウまでのｌｅｎｄ／２ｕ個のウィンドウは、ｉ個のウィンドウからなる第１から第ｐのグループ、及び第ｐ＋１から第ｍのグループに分割され、前記取得部は、さらに、第１から第ｐのグループに対して、演算対象のグループから次グループに演算対象が変更されるときに、演算対象の変更直前に用いた乱数とは異なる乱数を取得し、前記ウィンドウ演算部は、第１から第ｐのグループそれぞれに対して、当該グループが演算対象である間は、当該グループに含まれるウィンドウそれぞれに対して、前記取得部にて取得された乱数を用いたウィンドウ演算による演算値を取得し、前記取得部は、第ｐ＋１から第ｍのグループに含まれる第ｍ’のグループを演算対象とする際に、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を取得し、前記ウィンドウ演算部は、前記第ｍ’のグループを演算対象としている間は、前記取得部にて取得されたキャンセル値を用いたウィンドウ演算による演算値を取得するとしてもよい。【００３８】
この構成によると、情報セキュリティ装置は、第１から第ｐのグループそれぞれに対して、当該グループからｐ番目先のグループを対応付けている。これにより、情報セキュリティ装置は、第１から第ｐのグループそれぞれにおいて、ウィンドウ演算部のウィンドウ演算により出現した乱数に対する桁上演算部の桁上検算による演算結果を、ｐ番目先のグループにおいて当該乱数に対応するキャンセル値を用いることで、確実に除去することができる。【００３９】
ここで、前記取得部は、ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを対応付けて予め記憶しており、前記第１から第ｐのグループそれぞれに対して、当該グループが演算対象となる際に現時点で未選択の１個以上の乱数から１個の乱数を選択することで、当該グループで用いる乱数を取得し、前記第ｍ’のグループに対して、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を選択することで、当該第ｍ’のグループで用いるキャンセル値を取得するとしてもよい。【００４０】
この構成によると、情報セキュリティ装置は、ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを予め記憶しているので、対象となるグループが変更されるたびに、乱数又はキャンセル値を生成する必要がないので、べき演算ｄ＆Ｘを算出する処理時間を短くすることができる。【００４１】
ここで、前記取得部は、前記異なる乱数の取得時において、現時点で保持している乱数Ｒに、所定数ｑに対するべき乗演算Ｒ＾ｑを行い、当該べき乗演算Ｒ＾ｑの演算結果を再度乱数Ｒとして保持し、キャンセル値の取得時において、現時点で保持しているキャンセル値Ｓに、前記所定数ｑに対するべき乗演算Ｓ＾ｑを行い、当該べき乗演算Ｓ＾ｑを再度キャンセル値Ｓとして保持するとしてもよい。【００４２】
この構成によると、情報セキュリティ装置は、保持している乱数又はキャンセル値を用いることで、容易に異なる乱数又はキャンセル値を生成することができる。【００４３】
ここで、前記取得部は、第１のシード値Ｕと、前記値ｖに対する前記第１のシード値Ｕのべき演算（ｖ＆２）＆Ｕのキャンセル値である第２のシード値Ｖとを予め記憶しており、前記取得部は、前記第１のグループに対する演算に先立って、乱数ｒを生成し、前記第１、及び第２のシード値Ｕ、Ｖにおいて、乱数ｒに対するべき乗演算を施した値それぞれを乱数Ｒ及びキャンセル値Ｓとして保持するとしてもよい。【００４４】
この構成によると、情報セキュリティ装置は、第１及び第２のシード値を予め記憶することにより、記憶容量を節約することができる。また、情報セキュリティ装置は、第１のグループに対する演算に先立って、乱数ｒを生成し、生成した乱数ｒと、第１及び第２のシード値とを用いて、乱数Ｒ及びキャンセル値Ｓを生成している。これにより、情報セキュリティ装置は、複数の対象データ毎に、第１のグループに用いられる乱数及び当該乱数に対応するキャンセル値を変更することができる。したがって、秘密鍵の解析者が複数の対象データを用いて、これら対象データに対する電力波形から秘密鍵を解析しようとしても、対象データ毎に主演算手段に用いられる乱数が異なるので、その電力波形も異なり、値ｄの解析が困難となる。【００４５】
ここで、前記各グループは、１個のウィンドウからなるとしてもよい。【００４６】
この構成によると、情報セキュリティ装置は、ウィンドウ毎に異なる乱数を用いて演算を行う。つまり、ウィンドウ毎に電力波形が異なるので、値ｄの解析が困難となる。【００４７】
ここで、前記ウィンドウは、１ビット長であるとしてもよい。【００４８】
この構成によると、情報セキュリティ装置は、秘密鍵を１ビット毎に分割してべき演算ｄ＆Ｘを算出するバイナリ法においても、全てのビットに対する演算が終了した後に乱数Ｒの影響を除去するキャンセル処理を必要としない。つまり情報セキュリティ装置は、バイナリ法を用いた場合でも、従来よりもべき演算ｄ＆Ｘに対する処理時間が小さくなる。【００４９】
ここで、前記取得部は、さらに、前記第１のウィンドウから前記第２のウィンドウまでに存在する第３のウィンドウを対象とする際に、前記乱数Ｒを前記乱数Ｒとは異なる乱数Ｒ’を取得し、さらに、前記第３ウィンドウから当該第２ウィンドウまでに前記乱数Ｒ’に対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓ’を取得し、前記キャンセル値Ｓとともに保持し、前記ウィンドウ演算部は、前記第３のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒ’と、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、前記第２のウィンドウにおいて、さらに、前記キャンセル値Ｓ’を用いたウィンドウ演算による演算値を取得するとしてもよい。【００５０】
この構成によると、情報セキュリティ装置は、第３のウィンドウにて乱数Ｒとは異なる乱数Ｒ’をウィンドウ演算部のウィンドウ演算において出現させることで、値ｄの解析をさらに困難にすることができる。また、情報セキュリティ装置は、第２のウィンドウにおいて乱数Ｒ及びＲ’に対する桁上演算による演算結果を除去するので、従来よりもべき演算ｄ＆Ｘに対する処理時間を小さくすることもできる。【００５１】
ここで、前記取得部は、前記キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め保持することにより、前記前記キャンセル値Ｓ及びＳ’を保持し、前記取得部は、前記第２のウィンドウを演算対象とする際に、前記値Ｔを取得することにより、前記キャンセル値Ｓ及びＳ’を取得するとしてもよい。【００５２】
この構成によると、情報セキュリティ装置は、キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め記憶しているので、べき演算ｄ＆Ｘの算出時にキャンセル値Ｓ及びＳ’を算出する必要がないので、べき演算ｄ＆Ｘに対する処理時間を短くすることができる。【００５３】
ここで、前記取得部は、前記キャンセル値Ｓ及びＳ’とを予め保持しており、前記キャンセル値Ｓ及びＳ’を用いた基本演算を施して値Ｔを算出して取得することにより、前記キャンセル値Ｓ及びＳ’を取得するとしてもよい。【００５４】
この構成によると、情報セキュリティ装置は、キャンセル値Ｓ及びＳ’とを予め記憶しているので、べき演算ｄ＆Ｘの算出時に、キャンセル値Ｓ及びＳ’を算出する必要がないので、べき演算ｄ＆Ｘに対する処理時間を短くすることができる。【００５５】
１．実施の形態１
以下、本発明の実施の形態１におけるべき乗演算装置１０００について、図面を参照しながら説明する。【００５６】
１．１  準備
べき乗演算装置１０００は、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用される。以下で、ＲＳＡ暗号方式及びＲＳＡ署名方式について説明する。【００５７】
（１）ＲＳＡ暗号方式
（１−１）鍵の生成
次に示すようにして公開鍵及び秘密鍵を計算する。【００５８】
（手順１−１）
ランダムに大きい素数ｐ，ｑを選択し、その積ｎ＝ｐ×ｑを計算する。【００５９】
（手順１−２）
（ｐ−１）及び（ｑ−１）の最小公倍数Ｌ＝ＬＣＭ（ｐ−１，ｑ−１）を計算する。【００６０】
（手順１−３）
Ｌと互いに素でＬより小さい自然数ｅをランダムに選ぶ。【００６１】
１≦ｅ≦Ｌ−１、ＧＣＤ（ｅ，Ｌ）＝１
ここで、ＧＣＤ（ｅ，Ｌ）は、ｅとＬの最大公約数を示している。【００６２】
（手順１−４）
ｅ×ｄ＝１    ｍｏｄ    Ｌを満たすｄを計算する。【００６３】
ＧＣＤ（ｅ，Ｌ）＝１より、このようなｄは必ず存在する。このようにして、得られた整数ｅ及び整数ｎが、公開鍵である。また、整数ｄが、秘密鍵である。ここで、ｘ  ｍｏｄ  ｙは、ｘをｙで割った余りを示す。【００６４】
（１−２）暗号文の生成
公開鍵である整数ｅ及び整数ｎを用いて、平文ｍに暗号演算を施して暗号文ｃを計算する。【００６５】
ｃ＝ｍ＾ｅ      ｍｏｄ    ｎ
なお、この明細書において、演算子＾は、べき乗を示す。例えば、Ａ＾ｘは、ｘ＞０のときはＡをｘ回乗じたものを示す。【００６６】
（１−３）復号文の生成
秘密鍵である整数ｄを用いて、暗号文ｃに復号演算を施して復号文ｍ'を計算する。【００６７】
ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎ
なお、
ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎ
＝（ｍ＾ｅ  ）＾ｄ    ｍｏｄ  ｎ
＝ｍ＾（ｅ×ｄ    ｍｏｄ  Ｌ）    ｍｏｄ  ｎ
＝ｍ＾１    ｍｏｄ  ｎ
＝ｍ    ｍｏｄ  ｎ
であるので、復号文ｍ'は、平文ｍと一致する。【００６８】
べき乗演算装置１０００は、この復号文の生成における上記のｃからｍ'を計算する箇所で使用する。このとき、べき乗演算装置１０００において対象データをｃとして、秘密鍵ｄを使用して、ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎを計算する。【００６９】
なお、ＲＳＡ暗号については、非特許文献３の１１０〜１１３ページに詳しく説明されている。【００７０】
（２）ＲＳＡ署名方式
（２−１）鍵の生成
鍵の生成方法については、ＲＳＡ暗号方式と同様である。【００７１】
（２−２）署名生成
メッセージデータＤに対して、以下のように署名データＳを計算する。【００７２】
まず、ハッシュ関数Ｈａｓｈを用いて、メッセージデータＤのハッシュ値ｈ＝Ｈａｓｈ（Ｄ）を計算する。【００７３】
次に、秘密鍵である整数ｄを用いて、ハッシュ値ｈをｄ乗して、署名データＳを計算する。【００７４】
Ｓ＝ｈ＾ｄ  ｍｏｄ  ｎ
（２−３）署名検証
署名データＳがメッセージデータＤの正しい署名であるかを、以下のように検証する。【００７５】
Ｈａｓｈ（Ｄ）とＳ＾ｅ  ｍｏｄ  ｎが等しいか否かを確認する。等しい場合は、署名データＳが正しい署名であるとして、受理する。等しくない場合は、署名データＳが正しくない署名であるとして、拒否する。【００７６】
べき乗演算装置１０００は、上記の署名生成におけるｈからＳを計算する箇所で使用する。このとき、べき乗演算装置１０００において対象データをｈとして、秘密鍵ｄを使用して、Ｓ＝ｈ＾ｄ    ｍｏｄ  ｎを計算する。【００７７】
なお、ＲＳＡ署名については、非特許文献３の１７５〜１７６ページに詳しく説明されている。【００７８】
１．２  べき乗演算装置１０００の構成
図１は、べき乗演算装置１０００の構成を示す図である。【００７９】
べき乗演算装置１０００は、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。【００８０】
べき乗演算装置１０００は、図１にて示すように、入出力部１０１０と、秘密鍵格納部１０２０と、カウンタ格納部１０３０と、カウンタ初期化部１０４０と、カウンタ更新部１０５０と、第１のカウンタ判定部１０６０と、第２のカウンタ判定部１０７０と、第３のカウンタ判定部１０８０と、ビット判定部１０９０と、乗算部１１００−０〜１１００−３１と、２乗算部１１１０と、中間値格納部１１２０と、乗数群格納部１１３０と、乱数群格納部１１４０と、乗数群設定部１１５０−０〜１１５０−３１と、乗数群更新部１１６０と、乱数選択情報生成部１１７０とから構成されている。【００８１】
なお、以下の説明において、記述されるｘ＿ｙは、ｘに下付きインデックスｙが付けられていることを示す。【００８２】
（１）中間値格納部１１２０
中間値格納部１１２０は、対象データＸと、べき乗演算時における中間値Ｚとを格納する領域を有している。【００８３】
（２）入出力部１０１０
入出力部１０１０は、対象データＸを外部から受け取ると、受け取った対象データＸを中間値格納部１１２０へ格納する。【００８４】
入出力部１０１０は、中間値Ｚに初期値として値“１”を設定して、中間値格納部１１２０へ格納する。【００８５】
入出力部１０１０は、対象データＸのべき乗演算が終了すると、演算が終了した旨を第１のカウンタ判定部１０６０から受け取る。入出力部１０１０は、その後、中間値格納部１１２０に格納されている中間値Ｚをべき乗演算結果として出力する。【００８６】
（３）秘密鍵格納部１０２０
秘密鍵格納部１０２０は、秘密鍵ｄを格納している。【００８７】
なお、秘密鍵ｄは、５１２ビットの整数であるとする。【００８８】
（４）乗数群格納部１１３０
乗数群格納部１１３０は、乗算部１１００−０〜１１００−３１で使用する乗数群ＭＴ＿０〜ＭＴ＿３１を格納する。【００８９】
具体的には、乗数群格納部１１３０は、図２にて示すように、乗数値Ｘ＿ｉ０及びＸ＿ｉ１からなる乗数群ＭＴ＿ｉを格納している。ここで、ｉは、０以上３１以下の整数である。【００９０】
（５）乱数群格納部１１４０
乱数群格納部１１４０は、乱数群ＲＴ＿０〜ＲＴ＿１５を格納する。【００９１】
具体的には、乱数群格納部１１４０は、図３にて示すように、乱数Ｒ＿ｉと乱数除去数Ｓ＿ｉとからなる乱数群ＲＴ＿ｉを格納している。ここで、ｉは０以上１５以下の整数である。【００９２】
また、乱数Ｒ＿ｉと乱数除去数Ｓ＿ｉは、以下の関係を満たす。【００９３】
Ｓ＿ｉ＝Ｒ＿ｉ＾（−２＾２５６）  ｍｏｄ  ｎ
つまり、Ｒ＿ｉ＾（２＾２５６）  ×  Ｓ＿ｉ  ＝  １の関係を満たしている。ここで、ｎはＲＳＡ暗号における大きな素数ｐ，ｑの積である。【００９４】
（６）カウンタ格納部１０３０
カウンタ格納部１０３０は、べき乗演算時に用いるカウンタ（ｃｏｕｎｔ）の値を格納する。【００９５】
（７）カウンタ初期化部１０４０
カウンタ初期化部１０４０は、べき乗演算の開始時において、カウンタｃｏｕｎｔを初期値（ｌｅｎｄ−１）に設定する。【００９６】
ここで、上述したように、ｌｅｎｄは秘密鍵ｄのビットサイズであり、本実施の形態では、ｌｅｎｄ＝５１２である。なお、ここではｌｅｎｄは秘密鍵ｄのビットサイズそのものとしているが、秘密鍵ｄとして入力可能なビット数であってもよい。例えば、秘密鍵ｄのビットサイズとしては５１２ビットを想定しているが、実際には秘密鍵ｄのビットサイズは５１２より小さいビット数、例えば、５１０ビットであってもよい。この場合は、秘密鍵ｄとして入力可能なビット数は、ｌｅｎｄ＝５１２である。つまり、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２のべき数であればよく、例えば、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２のべき数のうち最小の数である。また、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２の倍数であってもよく、例えば、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２の倍数のうち最小の数である。【００９７】
（８）カウンタ更新部１０５０
カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値を更新する。【００９８】
具体的には、カウンタ更新部１０５０は、
第２のカウンタ判定部１０７０、第３のカウンタ判定部１０８０及び乗数群設定部１１５０−０〜１１５０−３１からカウンタｃｏｕｎｔの値の更新を行う旨の更新指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。【００９９】
（９）第１のカウンタ判定部１０６０
第１のカウンタ判定部１０６０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が０であるかを判定する。【０１００】
０であると判定する場合には、第１のカウンタ判定部１０６０は、入出力部１０１０へ演算が終了した旨を通知する。【０１０１】
０でないと判断する場合には、第１のカウンタ判定部１０６０は、第３のカウンタ判定部１０８０へ判定を行う旨の指示を通知する。【０１０２】
（１０）第３のカウンタ判定部１０８０
第３のカウンタ判定部１０８０は、第１のカウンタ判定部１０６０から判定を行う旨の指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が１６で割り切れるか否か、すなわち、１６の倍数であるか否かを判定する。【０１０３】
１６で割り切れると判定する場合、第３のカウンタ判定部１０８０は、カウンタの更新指示をカウンタ更新部１０５０へ通知する。【０１０４】
１６で割り切れないと判断する場合、第３のカウンタ判定部１０８０は、第２のカウンタ判定部１０７０へ判定を行う旨の指示を通知する。【０１０５】
（１１）第２のカウンタ判定部１０７０
第２のカウンタ判定部１０７０は、第３のカウンタ判定部１０８０から判定を行う旨の指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、すなわち、８の倍数であるか否かを判定する。【０１０６】
カウンタｃｏｕｎｔの値が８で割り切れると判定する場合には、第２のカウンタ判定部１０７０は、乗数群更新部１１６０へ乗数群格納部１１３０にて格納されている乗数群ＭＴ＿ｉの更新を行う旨の更新指示を通知する。ここで、ｉは、（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１０７】
カウンタｃｏｕｎｔの値が８で割り切れないと判定する場合には、第２のカウンタ判定部１０７０は、カウンタの更新指示をカウンタ更新部１０５０へ通知する。【０１０８】
（１２）ビット判定部１０９０
ビット判定部１０９０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを用いて、秘密鍵格納部１０２０に格納されている秘密鍵ｄのｃｏｕｎｔビット目の値が０か１のどちらであるかを判定する。【０１０９】
ここで、秘密鍵ｄのｃｏｕｎｔビット目とは、下位のビットから順番に数えたときの順番、つまりｃｏｕｎｔ番目を示している。ただし、最下位ビットを０ビット目（０番目）としている。【０１１０】
（１３）乗算部１１００−０〜１１００−３１
乗算部１１００−０〜１１００−３１は同様の動作を行うので、ここでは、乗算部１１００−ｉについて説明する。なお、ｉは０以上３１以下の整数である。【０１１１】
乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉに格納されている乗数値Ｘ＿ｉ０または、乗数値Ｘ＿ｉ１を乗算し、その乗算結果を中間値格納部１１２０に格納する。【０１１２】
具体的には、乗算部１１００−ｉは、ビット判定部１０９０によるｃｏｕｎｔ番目のビットが０であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ０とを乗算する。また、乗算部１１００−ｉは、ビット判定部１０９０によるｃｏｕｎｔ番目のビットが１であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ１とを乗算する。【０１１３】
ここで、乗算部１１００−ｉは、中間値Ｚと乗数値Ｘ＿ｉ０を乗算する場合、Ｚ←Ｚ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。また、乗算部１１００−ｉは、中間値Ｚと乗数値Ｘ＿ｉ１を乗算する場合、Ｚ←Ｚ×Ｘ＿ｉ１  ｍｏｄ  ｎを実行する。ここで、←は右の計算結果を左の変数へ代入することを意味する。【０１１４】
（１４）２乗算部１１１０
２乗算部１１１０は、中間値格納部１１２０に格納されている中間値Ｚを２乗し、２乗した結果を中間値格納部１１２０に格納する。【０１１５】
具体的には、２乗算部１１１０は、Ｚ←Ｚ＾２  ｍｏｄ  ｎを実行する。【０１１６】
（１５）乱数選択情報生成部１１７０
乱数選択情報生成部１１７０は、乗数群設定部１１５０−１〜１１５０−３２において使用する乱数または乱数除去数を選択するための情報である乱数選択情報を生成する。【０１１７】
乱数選択情報生成部１１７０は、生成した乱数選択情報を一時的に保持する。【０１１８】
具体的には、乱数選択情報生成部１１７０は、乱数Ｒ＿ｋまたはＳ＿ｋの添え字ｋを順番に並べた配列を生成する。ここで、この配列は、１６個の要素が０から１５までのすべての値を含むように配置し、その１６個の要素の２回の繰り返しである３２個の要素を持つようにする。【０１１９】
例えば、乱数選択情報生成部１１７０は、配列ＲＳＩ（＝｛１４，１２，１１，２，４，８，９，０，１，６，１０，７，１３，３，１５，５，１４，１２，１１，２，４，８，９，０，１，６，１０，７，１３，３，１５，５｝）を生成する。ここで、当該配列は０番から始まるものとし、ｉ番目の要素をＲＳＩ＿ｉとする。この例の場合、０番目の要素（ＲＳＩ＿０）は"１４"である。また、この配列はランダムに発生させる必要がある。【０１２０】
ここで、ランダムに発生させる方法の例を、図４にて示す流れ図を用いて説明する。【０１２１】
乱数選択情報生成部１１７０は、０から１６！−１（＝２０，９２２，７８９，８８７，９９９）までの値のうち１つの値ＲＳＩＳをランダムに発生する（ステップＳ５）。【０１２２】
乱数選択情報生成部１１７０は、発生した値ＲＳＩＳをＹに設定し（Ｙ←ＲＳＩＳ）、全ての値が１６である１６個の要素からなる配列Ｖ（Ｖ←｛１６，１６，・・・，１６｝）を設定する（ステップＳ１０）。ここで、配列Ｖは０番から始まるものとし、ｉ番目の要素をＶ＿ｉとする。【０１２３】
乱数選択情報生成部１１７０は、カウンタｃｎｔを１６に設定する（ステップＳ１５）。【０１２４】
乱数選択情報生成部１１７０は、Ｙをｃｎｔで割った商をＹＳ、余りをＹＲとする（ステップＳ２０）。【０１２５】
乱数選択情報生成部１１７０は、配列Ｖの１６の値を持った要素の中で、ＹＲ番目の要素をｃｎｔ−１に設定する（ステップＳ２５）。【０１２６】
乱数選択情報生成部１１７０は、ステップＳ２０で得られた商ＹＳをＹに設定する（ステップＳ３０）。つまり、乱数選択情報生成部１１７０は、Ｙ←ＹＳを実行する。【０１２７】
乱数選択情報生成部１１７０は、ｃｎｔの値が２であるか否かを判定する（ステップＳ３５）。【０１２８】
ｃｎｔの値が２でないと判定する場合には（ステップＳ３５における「ＮＯ」）、乱数選択情報生成部１１７０は、カウンタｃｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｎｔの値として設定し（ステップＳ４０）、ステップＳ２０へ戻る。つまり、乱数選択情報生成部１１７０は、ｃｎｔ←ｃｎｔ−１を実行する。【０１２９】
ｃｎｔの値が２であると判定する場合には（ステップＳ３５における「ＹＥＳ」）、乱数選択情報生成部１１７０は、配列Ｖの各要素において値“１６”をもつ要素に対して、値“０”を設定する（ステップＳ４５）。【０１３０】
乱数選択情報生成部１１７０は、０以上１５以下の整数であるｉそれぞれに対して、ＲＳＩ＿ｉ及びＲＳＩ＿（ｉ＋１６）に、Ｖ＿ｉの値を設定し（ＲＳＩ＿ｉ←Ｙ＿ｉ、ＲＳＩ＿（ｉ＋１６）←Ｙ＿ｉ）、配列ＲＳＩ（＝｛ＲＳＩ＿０、ＲＳＩ＿１、・・・、ＲＳＩ＿３１｝）を一時的に保持する（ステップＳ５０）。【０１３１】
上記にて示す方法では、乱数選択情報生成部１１７０は、０から１６！−１までの値のうち１つの値ＲＳＩＳをランダムに発生し、以下の関係を満たすようにＲＳＩＳをＴ＿ｉに変換する。Ｔ＿ｉはｃｎｔがｉときのステップＳ２０にて得られる値ＹＲを示す。【０１３２】
ＲＳＩＳ＝（１６×１５×・・・×３）×Ｔ＿２＋・・・＋１６×１５×Ｔ＿１４＋１６×Ｔ＿１５＋Ｔ＿１６
ここで、Ｔ＿ｉは、０以上ｉ−１の整数であり、ｉは０以上１５以下の整数である。【０１３３】
この変換は１対１対応する。さらに、Ｔ＿ｉを用いて、配列Ｖの１６の値を持った要素の値を１５から１に置き換え、残りの１６の値を持った要素の値を０に置き換えることで、ランダムな１６個の要素を持つ配列を生成している。その配列を二つ並べることで、乱数選択情報を生成できる。【０１３４】
なお、上記で述べた方法以外にも、ランダムに発生できる方法であれば何でもよい。ただし、安全性の観点から、上記の方法のような１６！個のバリエーションを持つ発生方法の方が望ましい。【０１３５】
（１６）乗数群設定部１１５０−０〜１１５０−３１
乗数群設定部１１５０−０〜１１５０−３１は、同様の動作を行うので、ここでは、乗数群設定部１１５０−ｉについて説明する。なお、ｉは０以上３１以下の整数である。【０１３６】
乗数群設定部１１５０−ｉは、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉを初期化する。【０１３７】
具体的には、乗数群設定部１１５０−ｉは、対象データＸに対し、乱数選択情報生成部１１７０により生成された乱数選択情報ＲＳＩのｉ番目の要素ＲＳＩ＿ｉに従って、カウンタｃｏｕｎｔの値が２５６以上である場合に、乱数群格納部１１４０に格納されている乱数群ＲＴ＿（ＲＳＩ＿ｉ）の乱数Ｒ＿（ＲＳＩ＿ｉ）を用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。【０１３８】
乗数群設定部１１５０−ｉは、ｃｏｕｎｔが２５６より小さい場合に、乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。【０１３９】
なお、乗数群設定部１１５０−ｉは、Ｘ＿ｉ０及びＸ＿ｉ１の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。ここで、ＲＳは、Ｒ＿（ＲＳＩ＿ｉ）またはＳ＿（ＲＳＩ＿ｉ）である。【０１４０】
（１７）乗数群更新部１１６０
乗数群更新部１１６０は、第２のカウンタ判定部１０７０から乗数群ＭＴ＿ｉの更新を行う旨の更新指示を受け取ると、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘｉ＿０及びＸ＿ｉ１を更新する。ＭＴ＿ｉは、直前に乗数群設定部１１５０−ｉにより設定した乗数群である。【０１４１】
具体的には、乗数群更新部１１６０は、Ｘ＿ｉ０←（Ｘ＿ｉ０）＾２  ｍｏｄ  ｎ，Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。【０１４２】
１．３  べき乗演算装置１０００の動作
（１）全体の動作
ここでは、べき乗演算装置１０００の動作について、図５及び図６にて示す流れ図を用いて説明する。【０１４３】
入出力部１０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部１１２０に格納する（ステップＳ１００）。【０１４４】
入出力部１０１０は、中間値Ｚに１を設定し、中間値格納部１１２０に格納する（ステップＳ１０５）。【０１４５】
乱数選択情報生成部１１７０は、３２個の乱数選択情報からなる配列ＲＳＩ（＝｛ＲＳＩ＿０、ＲＳＩ＿１、・・・、ＲＳＩ＿３１｝）を生成し、生成した配列ＲＳＩを一時的に保持する（ステップＳ１１０）。【０１４６】
カウンタ初期化部１０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ１１５）。ここでは、カウンタ初期化部１０４０は、カウンタｃｏｕｎｔをｌｅｎｄ−１に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数である。【０１４７】
乗数群設定部１１５０−ｉは、対象データＸ、乱数選択情報生成部１１７０に格納されている乱数選択情報と乱数群格納部１１４０に格納されている乱数群を用いて、乗数群格納部１１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ１２０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１４８】
２乗算部１１１０は、中間値格納部１１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部１１２０に格納する（ステップＳ１２５）。【０１４９】
ビット判定部１０９０は、秘密鍵ｄのビットを判定する（ステップＳ１３０）。具体的には、ビット判定部１０９０は、秘密鍵ｄにおけるｃｏｕｎｔ番目のビットが０であるか１であるかの判定を行う。【０１５０】
０と判定される場合（ステップＳ１３０における「０」）、乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉ０を乗算し、その結果を中間値Ｚとして中間値格納部１１２０に格納する（ステップＳ１３５）。１と判定される場合（ステップＳ１３０における「１」）、乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数値Ｘ＿ｉ１を乗算し、その結果を中間値Ｚとして中間値格納部１１２０に格納する（ステップＳ１４０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１５１】
第１のカウンタ判定部１０６０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ１４５）。【０１５２】
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ１４５における「ＹＥＳ」）、入出力部１０１０は、中間値格納部１１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ１７５）。【０１５３】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ１４５における「ＮＯ」）、第３のカウンタ判定部１０８０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が１６で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が１６の倍数であるか否かの判定をする（ステップＳ１５０）。【０１５４】
カウンタｃｏｕｎｔの値が１６で割り切れると判定される場合は（ステップＳ１５０における「ＹＥＳ」）、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ１７０）。具体的には、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。その後、処理はステップＳ１２０へと戻る。【０１５５】
カウンタｃｏｕｎｔの値が１６で割り切れないと判定される場合は（ステップＳ１５０における「ＮＯ」）、第２のカウンタ判定部１０７０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が８の倍数であるか否かの判定をする（ステップＳ１５５）。【０１５６】
カウンタｃｏｕｎｔの値が８で割り切れると判定される場合は（ステップＳ１５５における「ＹＥＳ」）、乗数群更新部１１６０は、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ１６０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１５７】
カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ１６５）。具体的には、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。その後、処理はステップＳ１２５へと戻る。【０１５８】
カウンタｃｏｕｎｔの値が８で割り切れないと判定される場合は（ステップＳ１５５における「ＮＯ」）、処理はステップＳ１６５へと移り、ステップＳ１６５の実行後、ステップＳ１２５へと戻る。【０１５９】
（２）ＭＴ＿ｉの初期化処理
ここでは、図５におけるステップＳ１２０にて行われる乗数群ＭＴ＿ｉの初期化の処理について、図７にて示す流れ図を用いて説明する。【０１６０】
乗数群設定部１１５０−ｉは、カウンタｃｏｕｎｔの値が２５６以上であるか否かを判断する（ステップＳ２００）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１６１】
カウンタｃｏｕｎｔの値が２５６以上であると判断する場合には（ステップＳ２００における「ＹＥＳ」）、乗数群設定部１１５０−ｉは、配列ＲＳＩからｉ番目の要素ＲＳＩ＿ｉを取得し、取得したＲＳＩ＿ｉに基づき乱数群ＲＴ＿（ＲＳＩ＿ｉ）から乱数Ｒ＿（ＲＳＩ＿ｉ）を取得する（ステップＳ２０５）。【０１６２】
乗数群設定部１１５０−ｉは、取得した乱数Ｒ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定する（ステップＳ２１０）。乗数群設定部１１５０−ｉは、対象データＸに乗数値Ｘ＿ｉ０を乗算した結果を乗数値Ｘ＿ｉ１に設定する（ステップＳ２１５）。【０１６３】
カウンタｃｏｕｎｔの値が２５６以上でない、つまり２５６より小さいと判断する場合には（ステップＳ２００における「ＮＯ」）、乗数群設定部１１５０−ｉは、配列ＲＳＩからｉ番目の要素ＲＳＩ＿ｉを取得し、取得したＲＳＩ＿ｉに基づき乱数群ＲＴ＿（ＲＳＩ＿ｉ）から乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を取得する（ステップＳ２２０）。【０１６４】
乗数群設定部１１５０−ｉは、取得した乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定する（ステップＳ２２５）。乗数群設定部１１５０−ｉは、対象データＸに乗数値Ｘ＿ｉ０を乗算した結果を乗数値Ｘ＿ｉ１に設定する（ステップＳ２３０）。【０１６５】
（３）ＭＴ＿ｉの更新処理
ここでは、図６におけるステップＳ１６０にて行われる乗数群ＭＴ＿ｉの更新処理について、図８にて示す流れ図を用いて説明する。【０１６６】
乗数群更新部１１６０は、乗数群格納部１１３０に格納されているＭＴ＿ｉに含まれるＸ＿ｉ０を２乗し、その結果を再度Ｘ＿ｉ０とする（ステップＳ３００）。【０１６７】
乗数群更新部１１６０は、対象データＸにＸ＿ｉ０を乗算し、その結果をＸ＿ｉ１とする（ステップＳ３０５）。【０１６８】
ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。【０１６９】
１．４  実施の形態１の効果
実施の形態１では、べき乗演算装置１０００は、図５及び図６のステップＳ１２０、Ｓ１５０及びＳ１７０から分かるように、秘密鍵ｄのビット列を、１６ビットを１組とする３２個のブロックに分割し、ブロック毎に乗数群のインデックスを割り当てている。【０１７０】
さらに、べき乗演算装置１０００は、１６ビットからなるブロックを、８ビットを１組とする２個のサブブロックに分割し、元のブロックに割り当てられた乗数群を用いて、２つのサブブロックそれぞれに異なる乗算数を割り当てる。【０１７１】
例えば、図９にて示すように、５１２ビットからなる秘密鍵ｄのビット列をブロック０、ブロック１、・・・、ブロック３０、ブロック３１とし、各ブロックを２つのサブブロックに分割する。ここで、ブロックｉには乗数群ＭＴ＿ｉが割り当てられる。【０１７２】
図９では、ブロック０をサブブロック０−１、サブブロック０−２へと分割を示している。【０１７３】
べき乗演算装置１０００は、サブブロック０−１に対しては、図５にて示すステップＳ１２０にて初期化されたＭＴ＿０に含まれるＸ＿００（＝Ｒ＿０）、若しくはＸ＿０１（＝Ｘ×Ｘ＿００）を用いる。具体的には、べき乗演算装置１０００は、サブブロック０−１に含まれる秘密鍵ｄのビットｄ＿ｉが０の場合には、中間値ＺにＸ＿００を乗算し、秘密鍵ｄのビットｄ＿ｉが１の場合には、中間値ＺにＸ＿０１を乗算する。【０１７４】
べき乗演算装置１０００は、サブブロック０−２に対しては、図６にて示すステップＳ１６０にて更新されたＭＴ＿０に含まれるＸ＿００’（＝（Ｘ＿００）＾２（＝（Ｒ＿０）＾２））、若しくはＸ＿０１’（＝Ｘ×（Ｘ＿００）＾２）を用いる。具体的には、べき乗演算装置１０００は、ブロック０−１に含まれる秘密鍵ｄのビットｄ＿ｉが０の場合には、中間値ＺにＸ＿００’を乗算し、秘密鍵ｄのビットｄ＿ｉが１の場合には、中間値ＺにＸ＿０１’を乗算する。【０１７５】
このように、実施の形態１では、秘密鍵ｄを８ビットのブロックごとに乗数群更新部１１６０において、中間値Ｚに乗じる乗数値Ｘ＿０、Ｘ＿１を更新（変更）している。これにより、サブブロックごとに乗算数が異なるようになるので、乗算数が何であるかを解析することにより、秘密鍵ｄを求めるＢｉｇＭａｃ攻撃を防ぐことが可能となる。【０１７６】
以下で、詳細に説明する。【０１７７】
図１０は、実施の形態１のべき乗演算装置１０００の秘密鍵ｄに対する処理と、攻撃者による乗数の分類及びｄのビット推測について示している。サブブロック０−１では、ｄ＿ｉのビットが０の場合はＸ＿０＝Ｘ＿００を中間値Ｚに乗じ、１の場合はＸ＿１＝Ｘ＿０１を乗じる。サブブロック０−２では、Ｘ＿０をＸ＿００からＸ＿００’（＝（Ｘ＿００）＾２）、Ｘ＿１をＸ＿０１からＸ＿０１’（＝Ｘ×Ｘ＿００’）に更新（変更）しているため、ｄ＿ｊのビットが０の場合はＸ＿０＝Ｘ＿００’、１の場合はＸ＿１＝Ｘ＿０１’を乗じる。ここで、ｉは５１１から５０４の整数であり、ｊは５０３から４９６の整数である。【０１７８】
ここで、攻撃者は、消費電力波形より、サブブロック０−１の中に乗数が互いに異なるグループａ１とｂ１、サブブロック０−２の中に乗数が互いに異なるグループａ２とｂ２に波形を分類できる。しかし、攻撃者はグループａ１とｂ１のどちらがｄ＿ｉのビットが０、１に対応するか、グループａ２とｂ２のどちらがｄ＿ｊのビットが０、１に対応するかを知らない。そのため、攻撃者は、それぞれのサブブロック内でどちらかのグループをビット値０（または１）に対応すると仮定して、正しいか否かを確認する必要がある。ａ１、ｂ１がビット値０、１に対応するパターンは２通りあり、ａ２、ｂ２がビット値０、１に対応するパターンは２通りあるため、それぞれの組合せは２×２＝４通りある。したがって、攻撃者は４通りを試す必要がある。ここで、サブブロックの個数をＮＢとすると、攻撃者は２＾ＮＢ通りを試す必要がある。ＮＢを大きくすると、その分、攻撃者の試す時間がかかり、ＢｉｇＭａｃ攻撃に対する安全性が高まる。例えば、秘密鍵ｄを５１２ビットの整数とするとき、８ビットのブロックは５１２／８＝６４個存在する。そのため、攻撃者は２＾６４通りを試す必要となり、攻撃者の試す時間がかかることとなるので、ＢｉｇＭａｃ攻撃に対する安全性は高くなる。このように、ＢｉｇＭａｃ攻撃を防ぐことができる。【０１７９】
また、実施の形態１のべき乗演算装置１０００は、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数Ｒ＿０からＲ＿１５それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺している。【０１８０】
以下、その説明を行う。【０１８１】
なお、ここでは、説明を行う上での便宜上、配列ＲＳＩは、｛０、１、２、・・・１４、１５、０、１、２、・・・、１４、１５｝、つまり０から１５までの整数が並んだ配列が２つ並んでいるものとする。
言い換えると、（ｌｅｎｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数ｉに対して、ＲＴ＿ｉが対応しているものとする。【０１８２】
図１１にて示すように、ｃｏｕｎｔ＝５１１のとき、つまり、ｉ＝０のとき、図５におけるステップＳ１３５又はＳ１４０が実行されることにより、中間値ＺにＸ＿００（＝Ｒ＿０）が出現する。このときに出現したＲ＿０は、ｃｏｕｎｔ＝５１０から２５５までの間、ステップＳ１２５により２乗演算される。つまり、Ｒ＿０は２５６回の２乗演算が行われ、その結果は、Ｒ＿０＾（２＾２５６）となる。そのため、ｃｏｕｎｔ＝２５５のときのステップＳ１２５では、中間値Ｚに乗数Ｒ＿０＾（２＾２５６）が含まれている。また、ｃｏｕｎｔ＝２５５のときのステップＳ１１５では、図７にて示すように、乗数値Ｘ＿１６０及びＸ＿１６１にはＳ＿（ＲＳＩ＿１６）（＝Ｓ＿０）が含まれることになる。そして、ステップＳ１３５、又はＳ１４０において、中間値Ｚに乗数値Ｘ＿１６０、又はＸ＿１６１を乗算することにより、中間値Ｚに含まれる乗数Ｒ＿０＾（２＾２５６）がキャンセル、つまり乗数Ｒ＿０＾（２＾２５６）とＳ＿０との乗算により１となる。【０１８３】
また、同様に、ｃｏｕｎｔ＝５１０のとき、図５におけるステップＳ１３５又はＳ１４０が実行されることにより、中間値ＺにＸ＿００（＝Ｒ＿０）が出現する。このときに出現したＲ＿０は、ｃｏｕｎｔ＝５０９から２５４までの間、ステップＳ１２５により２乗演算される。つまり、ｃｏｕｎｔ＝２５５のときのステップＳ１２５では、中間値Ｚに乗数Ｒ＿０＾（２＾２５６）が含まれている。また、ｃｏｕｎｔ＝２５４のときのステップＳ１１５では、図７にて示すように、乗数値Ｘ＿１６０及びＸ＿１６１にはＳ＿０が含まれているので、ステップＳ１３５、又はＳ１４０において、中間値Ｚに乗数値Ｘ＿１６０、又はＸ＿１６１を乗算することにより、中間値Ｚに含まれる乗数Ｒ＿０＾（２＾２５６）がキャンセルされる。【０１８４】
以降、ｃｏｕｎｔ＝５０９以降において出現したＸ＿ｉ０が、順次キャンセルされることになる。そのため、ｃｏｕｎｔ＝０のときのステップＳ１３５又はＳ１４０が実行された後では、全てのＸ＿ｉ０がキャンセルされているので、中間値Ｚの値はＸ＾ｄとなっている。【０１８５】
また、図１２は、ｃｏｕｎｔ＝ｉ（ｉは、２５６以上５１１以下の整数）において出現する乗数値Ｘ＿ｊ０（＝Ｒ＿ｑ）に着目した場合における乗算数の遷移を示している。なお、ここでは、ｊは、（ｌｅｎｄ−ｉ―１）／１６以下の最大の整数であり、Ｒ＿ｑ＝Ｒ＿（ＲＳＩ＿ｊ）とする。【０１８６】
図１２では、先ず、ｃｏｕｎｔ＝ｉのときのステップＳ１３５又はＳ１４０において、Ｘ＿ｊ０（＝Ｒ＿ｑ）が中間値Ｚに出現する、つまり、Ｘ＿ｊ０（＝Ｒ＿ｑ）が中間値Ｚに含まれる。【０１８７】
ｃｏｕｎｔ＝ｉ−１のときのステップＳ１２５において、中間値Ｚが２乗演算され、２乗演算結果ＺにはＲ＿ｑ＾２が含まれる。【０１８８】
次に、ｃｏｕｎｔ＝ｉ−２のときのステップＳ１２５において、中間値Ｚ（Ｒ＿ｑ＾２を含む）が２乗演算され、２乗演算結果Ｚには（Ｒ＿ｑ＾２）＾２（＝Ｒ＿ｑ＾（２＾２））が含まれる。【０１８９】
つまり、ｃｏｕｎｔ＝ｉ−２55までの間、中間値Ｚの２乗演算を繰り返すことにより、中間値Ｚには、Ｒ＿ｑ＾（２＾２５５）が含まれている。【０１９０】
さらに、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１１５においては、ＭＴ＿ｉの初期化処理により、Ｘ＿（ｉ＋１６）０には必ずＳ＿ｑが設定されている。【０１９１】
Ｘ＿（ｉ＋１６）０にはＳ＿ｑが設定される理由を述べる。整数ｉが取り得る範囲により、ｃｏｕｎｔ＝ｉ−２５６の値は、必ず２５５以下の値となることから、Ｘ＿（ｉ＋１６）０にはＳ＿０からｓ＿１５の何れかが設定される。また、このときの（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６以下の最大の整数を求める。【０１９２】
（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６
＝（ｌｅｎｄ−（ｉ−２５６）―１）／１６
＝（ｌｅｎｄ−ｉ＋２５６―１）／１６
＝（ｌｅｎｄ−ｉ−１）／１６  ＋  ２５６／１６
＝（ｌｅｎｄ−ｉ−１）／１６  ＋  １６
したがって、（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６以下の最大の整数は、（ｌｅｎｄ−ｉ−１）／１６以下の最大の整数に、１６を加算した値、つまり、ｊ＋１６となる。配列ＲＳＩの生成方法により、ＲＳＩ＿ｊとＲＳＩ＿（ｊ＋１６）との値は同一であるので、Ｓ＿（ＲＳＩ＿ｊ）＝Ｓ＿（ＲＳＩ＿（ｊ＋１６））、つまり、Ｓ＿（ＲＳＩ＿（ｊ＋１６））＝Ｓ＿ｑとなる。【０１９３】
また、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１２５において、中間値Ｚ（Ｒ＿ｑ＾（２＾２５５）を含む）が２乗演算され、２乗演算結果ＺにはＲ＿ｑ＾（２＾２５６）が含まれる。【０１９４】
そして、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１３５又はＳ１４０において、中間値Ｚに乗算数Ｓ＿ｑが乗算されるので、中間値Ｚ含まれるＲ＿ｑ＾（２＾２５６）が相殺される。【０１９５】
このように、ｃｏｕｎｔ＝ｉのときに出現したＸ＿ｊ０は、ｃｏｕｎｔ＝ｉ−２５６のときの乗数演算（ステップＳ１３５、又はＳ１４０）にて、必ず相殺される。【０１９６】
また、図１３のように、秘密鍵ｄの上位ビット（ｄ＿２５６〜ｄ＿５１１）のブロック（ここでは、ブロック０からブロック１５）における乱数の影響を下位ビット（ｄ＿０からｄ＿２５５）のブロック（ここでは、ブロック１６からブロック３１）において相殺するように、乱数を用いて乗数群を設定することにより、乱数の影響を取り去るキャンセル演算が不要になる。【０１９７】
以下で、このことについて詳細に説明する。なお、ここでは、上記と同様に、説明を行う上での便宜上、配列ＲＳＩは、｛０、１、２、・・・１４、１５、０、１、２、・・・、１４、１５｝であるとする。【０１９８】
図１３において、ブロック０におけるサブブロック０−１に出現する乱数Ｒ＿０の影響はその後、乱数除去数Ｓ＿０を用いてブラインドするサブブロックに移るまでに、図１１、及び図１２にて示したように２乗演算を２５６回繰り返すため、Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎを中間値に乗じた状態となる。Ｓ＿０は、Ｓ＿０＝Ｒ＿０＾（−２＾２５６）ｍｏｄ  ｎを満たすため、これを掛けることで、乱数Ｒ＿０の影響（Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎ）は除去されることになる。【０１９９】
乗数群設定部１１５０−ｉにて設定した乗数群を乗数群更新部１１６０において更新した場合においても同様である。例えば、Ｒ＿０を用いてブラインドするサブブロックの後に乗数群を更新した場合、すなわち、Ｒ＿０＾２を用いてブラインドするサブブロックを考える。この場合においても、Ｓ＿０＾２を用いてブラインドするサブブロックで乱数の影響を除去できる。このように、乱数Ｒ＿ｊに対して所定回数（ここでは、２５６回）の２乗演算を行った後、乱数除去数Ｓ＿ｊにて、乱数Ｒ＿０の影響（Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎ）は除去するように、乱数Ｒ＿ｊが出現するサブブロックと対応する乱数除去数Ｓ＿ｊを含むサブブロックとを対にすることで、乱数の影響をすべて除去でき、キャンセル演算が不要になる。【０２００】
さらに、実施の形態１では、乗数群をブラインドする乱数のパターンを乱数選択情報生成部１１７０によりランダムに発生させるため、差分電力解析攻撃に対して攻撃者が統計情報を取りにくくなるため、差分電力解析攻撃への耐性がある。【０２０１】
なお、特許文献１においても、乗数群を更新する構成は記載されているが、乗数群の設定パターンをランダム化することや、キャンセル演算が不要になる構成は開示されていない。【０２０２】
（具体例）
ここでは、更なる具体例を用いて、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺していることを、図１４から図１６を用いて説明する。【０２０３】
なお、説明の便宜上、秘密鍵ｄの全てのビットは、値１であるとし、上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現する乱数は全て同一の値Ｒとする。【０２０４】
先頭ビットｄ＿５１１が演算対象、つまりｃｏｕｎｔ＝５１１のとき、べき演算装置１０００は、中間値Ｚを初期化、つまり中間値Ｚに値１を設定し、２乗演算及び乗算を実行する。ここでは、ｄ＿５１１＝１であるので、図１４に示すように、２乗演算及び乗算の実行後の中間値Ｚの値は、Ｘ×Ｒとなる。【０２０５】
ｃｏｕｎｔ＝５１０のとき、べき演算装置１０００は、中間値Ｚ（＝Ｘ×Ｒ）に対して２乗演算を施し、その結果を用いて乗算を施す。ここでは、ｄ＿５１０＝１であるので、図１４に示すように、乗算の実行後の中間値Ｚの値は、（Ｘ×Ｒ）＾２×Ｘ×Ｒとなる。【０２０６】
べき演算装置１０００は、２乗演算及び乗算をｃｏｕｎｔ＝２５６まで繰り返すと、中間値Ｚの値は、図１５に示すように、（Ｘ×Ｒ）＾（２＾２５５）×（Ｘ×Ｒ）＾（２＾２５４）×・・・×（Ｘ×Ｒ）＾２×Ｘ×Ｒとなる。【０２０７】
ｃｏｕｎｔ＝２５５のとき、べき乗演算装置１００は２乗演算を実行すると、中間値Ｚの値は、図１５に示すように、（Ｘ×Ｒ）＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×（Ｘ×Ｒ）＾２となる。ここで、実施の形態１にて示すように、乗算に用いる乱数が値Ｒから乱数除去数Ｓ（＝Ｒ＾（−２＾２５６））へと変更される。したがって、べき乗演算装置１００は乗算を実行すると、中間値Ｚの値は、ｃｏｕｎｔ＝５１１にて出現した乱数Ｒの影響、つまり値Ｒ＾（２＾２５６）が乱数除去数Ｓにより相殺され、その結果は、図１５に示すように、Ｘ＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×（Ｘ×Ｒ）＾２×Ｘとなる。【０２０８】
ｃｏｕｎｔ＝２５４のとき、べき乗演算装置１００は２乗演算を実行すると、中間値Ｚの値は、図１５に示すように、Ｘ＾（２＾２５７）×（Ｘ×Ｒ）＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×Ｘ＾２となる。次に、べき乗演算装置１００は乗算を実行すると、中間値Ｚの値は、ｃｏｕｎｔ＝５１０にて出現した乱数Ｒの影響、つまり値Ｒ＾（２＾２５６）が乱数除去数Ｓにより相殺され、その結果は、図１５に示すように、Ｘ＾（２＾２５７）×Ｘ＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×Ｘ＾２×Ｘとなる。【０２０９】
べき演算装置１０００は、２乗演算及び乗算をｃｏｕｎｔ＝０まで繰り返すことにより、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺することができる。【０２１０】
ｃｏｕｎｔ＝１において２乗演算及び乗算が実行された後は、ｃｏｕｎｔ＝２５６にて出現した乱数Ｒの影響（値Ｒ＾（２＾２５５））のみが中間値Ｚに残ることとなる。【０２１１】
そして、ｃｏｕｎｔ＝１において２乗演算が実行されることにより、中間値Ｚの値は、図１６にて示すように、Ｘ＾（２＾５１１）×Ｘ＾（２＾５１０）×・・・×（Ｘ×Ｒ）＾（２＾２５６）×Ｘ＾（２＾２５５）・・・×Ｘ＾４×Ｘ＾２となる。べき演算装置１０００は、この中間値Ｚに値Ｘ×Ｓを乗算することで、ｃｏｕｎｔ＝２５６にて出現した乱数Ｒの影響（値Ｒ＾（２＾２５６））を相殺し、その結果は、図１６にて示すように、Ｘ＾（２＾５１１）×Ｘ＾（２＾５１０）×・・・×Ｘ＾（２＾２５６）×Ｘ＾（２＾２５５）・・・×Ｘ＾４×Ｘ＾２×Ｘ＝Ｘ＾ｄとなる。【０２１２】
したがって、べき演算装置１０００は、べき乗演算値Ｘ＾ｄを算出する際に、ｃｏｕｎｔ＝５１１から０までの間、乗算にて乱数又は乱数除去数を出現させることで、差分電力解析攻撃による秘密鍵の解析を困難にすると同時に、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）それぞれに乗算時に出現した乱数の影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺することができる。【０２１３】
２．実施の形態２
図１７は、べき乗演算装置２０００の構成を示す図である。【０２１４】
べき乗演算装置２０００は、実施の形態１のべき乗演算装置１０００と同様に、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。【０２１５】
べき乗演算装置２０００は、実施の形態１のべき乗演算装置１０００と同様に、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用する。【０２１６】
２．１  べき乗演算装置２０００の構成
べき乗演算装置２０００は、図１７にて示すように、入出力部２０１０と、秘密鍵格納部２０２０と、カウンタ格納部２０３０と、カウンタ初期化部２０４０と、カウンタ更新部２０５０と、第１のカウンタ判定部２０６０と、第２のカウンタ判定部２０７０と、第３のカウンタ判定部２０８０と、ビット判定部２０９０と、乗算部２１００−０、２１００−１と、２乗算部２１１０と、中間値格納部２１２０と、乗数群格納部２１３０と、乱数群格納部２１４０と、乗数群設定部２１５０−０、２１５０−１と、乗数群更新部２１６０と、乱数シード格納部２１８０と、乱数群設定部２１９０とから構成されている。【０２１７】
なお、入出力部２０１０、秘密鍵格納部２０２０、カウンタ格納部２０３０、カウンタ初期化部２０４０、カウンタ更新部２０５０、第１のカウンタ判定部２０６０、第２のカウンタ判定部２０７０、ビット判定部２０９０、２乗算部２１１０、中間値格納部２１２０、及び乗数群更新部２１６０それぞれは、実施の形態１にて示す入出力部１０１０、秘密鍵格納部１０２０、カウンタ格納部１０３０、カウンタ初期化部１０４０、カウンタ更新部１０５０、第１のカウンタ判定部１０６０、第２のカウンタ判定部１０７０、ビット判定部１０９０、２乗算部１１１０、中間値格納部１１２０、及び乗数群更新部１１６０と同様であるので、ここでの説明は省略する。【０２１８】
以下、第３のカウンタ判定部２０８０、乗数群格納部２１３０、乗算部２１００−０、２１００−１、乱数群格納部２１４０、乗数群設定部２１５０−０、２１５０−１、乱数シード格納部２１８０、乱数群設定部２１９０のそれぞれについて説明する。【０２１９】
（１）第３のカウンタ判定部２０８０
第３のカウンタ判定部２０８０は、第１のカウンタ判定部２０６０から判定を行う旨の指示を受け取ると、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が２５６で割り切れるか否か、すなわち、２５６の倍数であるか否かを判定する。【０２２０】
２５６で割り切れると判定する場合、第３のカウンタ判定部２０８０は、更新指示をカウンタ更新部２０５０へ通知する。【０２２１】
２５６で割り切れないと判断する場合、第３のカウンタ判定部２０８０は、第２のカウンタ判定部２０７０へ判定を行う旨の指示を通知する。【０２２２】
（２）乗数群格納部２１３０
乗数群格納部２１３０は、乗算部２１００−０〜２１００−１で使用する乗数群ＭＴ＿０〜ＭＴ＿１を格納する。【０２２３】
具体的には、乗数群格納部２１３０は、図１８にて示すように、乗数値Ｘ＿ｉ０及びＸ＿ｉ１からなる乗数群ＭＴ＿ｉを格納している。ここで、ｉは、０、１である。【０２２４】
（３）乗算部２１００−０、２１００−１
乗算部２１００−０、２１００−１は同様の動作を行うので、ここでは、乗算部２１００−ｉについて説明する。なお、ｉは０または１である。【０２２５】
乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉに格納されている乗数値Ｘ＿ｉ０または、乗数値Ｘ＿ｉ１を乗算し、その乗算結果を中間値格納部１１２０に格納する。【０２２６】
具体的には、乗算部２１００−ｉは、ビット判定部２０９０によるｃｏｕｎｔ番目のビットが０であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ０とを乗算し、その結果を再度中間値Ｚとする。また、乗算部２１００−ｉは、ビット判定部２０９０によるｃｏｕｎｔ番目のビットが１であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ１とを乗算し、その結果を再度中間値Ｚとする。【０２２７】
（４）乱数群格納部２１４０
乱数群格納部２１４０は、乱数群ＲＴを格納する。【０２２８】
具体的には、乱数群格納部２１４０は、図１９にて示すように、乱数Ｒと乱数除去数Ｓとからなる乱数群ＲＴを格納している。【０２２９】
また、乱数Ｒと乱数除去数Ｓとは、以下の関係を満たす。【０２３０】
Ｓ＝Ｒ＾（−２＾２５６）  ｍｏｄ  ｎ
つまり、Ｒ＾（２＾２５６）  ×  Ｓ  ＝  １の関係を満たしている。【０２３１】
なお、乱数Ｒと乱数除去数Ｓは、乱数群設定部２１９０にて生成される。乱数群設定部２１９０については、後述する。【０２３２】
（５）乗数群設定部２１５０−０、２１５０−１
乗数群設定部２１５０−０、２１５０−１は、同様の動作を行うので、ここでは、乗数群設定部２１５０−ｉについて説明する。なお、ｉは０、１である。【０２３３】
乗数群設定部２１５０−ｉは、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを初期化する。【０２３４】
具体的には、乗数群設定部２１５０−ｉは、対象データＸに対し、カウンタｃｏｕｎｔの値が２５６以上である場合には、乱数群格納部２１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。【０２３５】
乗数群設定部２１５０−ｉは、ｃｏｕｎｔが２５６より小さい場合には、乱数群ＲＴに含まれる乱数除去数Ｓを用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。【０２３６】
なお、乗数群設定部２１５０−ｉは、Ｘ＿ｉ０及びＸ＿ｉ１の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。ここで、ＲＳは、ＲまたはＳである。【０２３７】
（６）乱数シード格納部２１８０
乱数シード格納部２１８０は、乱数シードＵと乱数除去シードＶを格納する。ＵとＶは予め格納されており、以下の式を満たす。【０２３８】
Ｖ＝Ｕ＾（−２＾２５６）  ｍｏｄ  ｎ
（７）乱数群設定部２１９０
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数シードＵと乱数除去シードＶを用いて、乱数群ＲＴの乱数Ｒと乱数除去数Ｓを生成し、乱数群格納部２１４０に格納する。【０２３９】
具体的には、ランダムな正整数値ｗを発生させて、以下の式を計算して、Ｒ、Ｓを求める。【０２４０】
Ｒ＝Ｕ＾ｗ  ｍｏｄ  ｎ
Ｓ＝Ｖ＾ｗ  ｍｏｄ  ｎ
これらのべき乗演算は単純にバイナリ法やＷｉｎｄｏｗ法などの従来の方法を用いて計算する。ｗは、例えば、３２ビットの乱数であるが、これに限らない。【０２４１】
２．２  べき乗演算装置２０００の動作
（１）全体の動作
ここでは、べき乗演算装置２０００の動作について、図２０及び図２１にて示す流れ図を用いて説明する。【０２４２】
入出力部２０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部２１２０に格納する（ステップＳ４００）。【０２４３】
入出力部２０１０は、中間値Ｚに１を設定し、中間値格納部２１２０に格納する（ステップＳ４０５）。【０２４４】
乱数群設定部２１９０は、乱数群ＲＴを生成し、生成した乱数群ＲＴを乱数群格納部２１４０に格納する（ステップＳ４１０）。【０２４５】
カウンタ初期化部２０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ４１５）。ここでは、カウンタ初期化部２０４０は、カウンタｃｏｕｎｔをｌｅｎｄ−１に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数である。【０２４６】
乗数群設定部２１５０−ｉは、対象データＸ、乱数群格納部２１４０に格納されている乱数群ＲＴを用いて、乗数群格納部２１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ４２０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。【０２４７】
２乗算部２１１０は、中間値格納部２１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部２１２０に格納する（ステップＳ４２５）。【０２４８】
ビット判定部２０９０は、秘密鍵ｄのビットを判定する（ステップＳ４３０）。具体的には、ビット判定部２０９０は、秘密鍵ｄにおけるｃｏｕｎｔ番目のビットが０であるか１であるかの判定を行う。【０２４９】
０と判定される場合（ステップＳ４３０における「０」）、乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉ０を乗算し、その結果を中間値Ｚとして中間値格納部２１２０に格納する（ステップＳ４３５）。１と判定される場合（ステップＳ４３０における「１」）、乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数値Ｘ＿ｉ１を乗算し、その結果を中間値Ｚとして中間値格納部２１２０に格納する（ステップＳ４４０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。【０２５０】
第１のカウンタ判定部２０６０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ４４５）。【０２５１】
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ４４５における「ＹＥＳ」）、入出力部２０１０は、中間値格納部２１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ４７５）。【０２５２】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ４４５における「ＮＯ」）、第３のカウンタ判定部２０８０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が２５６で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が２５６の倍数であるか否かの判定をする（ステップＳ４５０）。【０２５３】
カウンタｃｏｕｎｔの値が２５６で割り切れると判定される場合は（ステップＳ４５０における「ＹＥＳ」）、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ４７０）。具体的には、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部２０３０へ格納する。その後、処理はステップＳ４２０へと戻る。【０２５４】
カウンタｃｏｕｎｔの値が２５６で割り切れないと判定される場合は（ステップＳ４５０における「ＮＯ」）、第２のカウンタ判定部２０７０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が８の倍数であるか否かの判定をする（ステップＳ４５５）。【０２５５】
カウンタｃｏｕｎｔの値が８で割り切れると判定される場合は（ステップＳ４５５における「ＹＥＳ」）、乗数群更新部２１６０は、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ４６０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。【０２５６】
カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ４６５）。具体的には、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部２０３０へ格納する。その後、処理はステップＳ４２５へと戻る。【０２５７】
カウンタｃｏｕｎｔの値が８で割り切れないと判定される場合は（ステップＳ４５５における「ＮＯ」）、処理はステップＳ４６５へと移り、ステップＳ４６５の実行後、ステップＳ４２５へと戻る。【０２５８】
（２）乱数群ＲＴの設定処理
ここでは、図２０におけるステップＳ４１０にて行われる乱数群ＲＴの設定処理について、図２２にて示す流れ図を用いて説明する。【０２５９】
乱数群設定部２１９０は、ランダムな正整数ｗを発生させる（ステップＳ５００）。【０２６０】
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数シードＵと、正整数ｗとを用いて、乱数Ｒ（＝Ｕ＾ｗ  ｍｏｄ  ｎ）を算出する（ステップＳ５０５）。【０２６１】
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数除去シードＶと、正整数ｗとを用いて、乱数除去数Ｓ（＝Ｖ＾ｗ  ｍｏｄ  ｎ）を算出する（ステップＳ５１０）。【０２６２】
乱数群設定部２１９０は、算出した乱数Ｒと、乱数除去数Ｓとからなる乱数群ＲＴ（＝[Ｒ、Ｓ]）を乱数群格納部２１４０に格納する（ステップＳ５１５）。【０２６３】
（３）ＭＴ＿ｉの初期化処理
図２０におけるステップＳ４２０にて行われる乗数群ＭＴ＿ｉの初期化の処理は、図７にて示す流れ図を一部変更することで実現できるので、ここでは、その変更点のみについて説明する。【０２６４】
先ず、ステップＳ２０５を、カウンタｃｏｕｎｔの値が２５６以上であると判断する場合には（ステップＳ２００における「ＹＥＳ」）、乗数群設定部２１５０−ｉは、乱数群格納部２１４０に格納されている乱数群ＲＴの乱数Ｒを取得すると変更する。【０２６５】
次に、ステップＳ２１０を、乗数群設定部１１５０−ｉは、取得した乱数Ｒ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定すると変更する。【０２６６】
ステップＳ２２０を、カウンタｃｏｕｎｔの値が２５６以上でないと判断する場合には（ステップＳ２００における「ＮＯ」）、乗数群設定部２１５０−ｉは、乱数群格納部２１４０に格納されている乱数群ＲＴに含まれる乱数除去数Ｓを取得すると変更する。【０２６７】
最後に、ステップＳ２２５を、乗数群設定部２１５０−ｉは、取得した乱数除去数Ｓ）を乗数値Ｘ＿ｉ０に設定すると変更する。【０２６８】
図７にて示す動作の流れを上記のように変更することで、図２０におけるステップＳ４２０にて行われる乗数群ＭＴ＿ｉの初期化の処理が実現できる。【０２６９】
（４）ＭＴ＿ｉの更新処理
図２１におけるステップＳ４６０にて行われる乗数群ＭＴ＿ｉの更新処理は、図８にて示す動作の流れと同様の動作の流れにて実現できるので、ここでの説明は省略する。【０２７０】
２．３  実施の形態２の効果
実施の形態２は、実施の形態１と比べて乱数群による乗数群の設定方法が異なるのみであるので、実施の形態１と同様の効果がある。【０２７１】
差分電力解析攻撃に対しては、乱数シードに対しランダム値によるべき乗を行って乱数群を計算するため、乗数群をブラインドする乱数のパターンをランダム化することができ、攻撃者が統計情報を取りにくくなるため、差分電力解析攻撃への耐性がある。【０２７２】
３．実施の形態３
図２３は、べき乗演算装置３０００の構成を示す図である。【０２７３】
べき乗演算装置３０００は、実施の形態１、２のべき乗演算装置１０００、２０００と同様に、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。【０２７４】
べき乗演算装置３０００は、実施の形態１、２のべき乗演算装置１０００、２０００と同様に、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用する。【０２７５】
３．１  べき乗演算装置３０００の構成
べき乗演算装置３０００は、図２３にて示すように、入出力部３０１０と、秘密鍵格納部３０２０と、カウンタ格納部３０３０と、カウンタ初期化部３０４０と、カウンタ更新部３０５０と、第１のカウンタ判定部３０６０と、第２のカウンタ判定部３０７０と、第３のカウンタ判定部３０８０と、乗数選択部３０９０と、乗算部３１００と、２乗算部３１１０と、中間値格納部３１２０と、乗数群格納部３１３０と、乱数群格納部３１４０と、乗数群設定部３１５０−０、３１５０−１と、乗数群更新部３１６０と、乱数シード格納部３１８０と、乱数群設定部３１９０とから構成されている。【０２７６】
入出力部３０１０、秘密鍵格納部３０２０、カウンタ格納部３０３０、カウンタ更新部３０５０、第１のカウンタ判定部３０６０、２乗算部３１１０、及び中間値格納部３１２０のそれぞれは、実施の形態１にて示す入出力部１０１０、秘密鍵格納部１０２０、カウンタ格納部１０３０、カウンタ更新部１０５０、第１のカウンタ判定部１０６０、２乗算部１１１０、及び中間値格納部１１２０のそれぞれと同様であるので、ここでの説明は省略する。【０２７７】
また、乱数群格納部３１４０、乱数シード格納部３１８０、及び乱数群設定部３１９０のそれぞれは、実施の形態2にて示す乱数群格納部２１４０、乱数シード格納部２１８０、及び乱数群設定部２１９０のそれぞれと同様であるので、ここでの説明は省略する。【０２７８】
以下、乗数群格納部３１３０、カウンタ初期化部３０４０、第２のカウンタ判定部３０７０、第３のカウンタ判定部３０８０、乗数選択部３０９０、乗算部３１００、乗数群設定部３１５０−０、３１５０−１、及び乗数群更新部３１６０について説明する。【０２７９】
（１）乗数群格納部３１３０
乗数群格納部３１３０は、乗算部３１００で使用する乗数群ＭＴ＿０〜ＭＴ＿１を格納する。【０２８０】
具体的には、乗数群格納部３１３０は、図２４にて示すように、１６個の乗数値Ｘ＿ｉ０、Ｘ＿ｉ１、・・・、Ｘ＿ｉ１５からなる乗数群ＭＴ＿ｉ（ｉは０または１）を格納している。なお、Ｘ＿ｉ０からＸ＿ｉ１５を格納するのは、ｓｗ＝４であるためである。一般のｓｗに対しては、乗数群格納部２１３０は、乗数値Ｘ＿ｉ０，Ｘ＿ｉ１，・・・，Ｘ＿（ｉ（２＾ｓｗ−１））を格納する。【０２８１】
（２）カウンタ初期化部３０４０
カウンタ初期化部３０４０は、カウンタｃｏｕｎｔに値ｂを設定する。【０２８２】
ここで、値ｂ＝（ｌｅｎｄ／ｓｗ以上の最も小さい整数）−１である。ｌｅｎｄは秘密鍵ｄのビット数であり、例えばｌｅｎｄ＝５１２である。ｓｗは正整数であり、例えば、ｓｗ＝４である。なお、ｓｗは２、３や５以上であってもよい。【０２８３】
（３）第３のカウンタ判定部３０８０
第３のカウンタ判定部３０８０は、第１のカウンタ判定部２０６０から判定を行う旨の指示を受け取ると、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が６４で割り切れるか否か、すなわち、６４の倍数であるか否かを判定する。【０２８４】
６４で割り切れると判定する場合、第３のカウンタ判定部３０８０は、更新指示をカウンタ更新部３０５０へ通知する。【０２８５】
６４で割り切れないと判断する場合、第３のカウンタ判定部３０８０は、第２のカウンタ判定部３０７０へ判定を行う旨の指示を通知する。【０２８６】
（４）第２のカウンタ判定部３０７０
第２のカウンタ判定部３０７０は、第３のカウンタ判定部３０８０から判定を行う旨の指示を受け取ると、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が２で割り切れるか否か、すなわち、２の倍数であるか否かを判定する。【０２８７】
カウンタｃｏｕｎｔの値が２で割り切れると判定する場合には、第２のカウンタ判定部３０７０は、乗数群更新部３１６０へ乗数群格納部３１３０にて格納されている乗数群ＭＴ＿ｉの更新を行う旨の更新指示を通知する。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。【０２８８】
カウンタｃｏｕｎｔの値が２で割り切れないと判定する場合には、第２のカウンタ判定部３０７０は、カウンタの更新指示をカウンタ更新部３０５０へ通知する。【０２８９】
（５）乗数選択部３０９０
乗数選択部３０９０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔに対する分割秘密情報Ｄ＿ｃｏｕｎｔの値をインデックスｊ（ｊ＝Ｄ＿ｃｏｕｎｔ）として、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉｊを選択する。【０２９０】
ここで、分割秘密情報Ｄ＿ｃｏｕｎｔとは、秘密鍵ｄに対するビット列をｓｗビット毎に分割して得られる情報である。例えば、図２５に示すように、ｓｗ＝４である場合には、秘密鍵ｄのビット列は、４ビットからなる分割秘密情報Ｄ＿１２７、Ｄ＿１２６、・・・、Ｄ＿１、Ｄ＿０に分割される。なお、分割秘密情報Ｄ＿１２７、Ｄ＿１２６、・・・、Ｄ＿１、Ｄ＿０のそれぞれは、４ビットからなるので、各分割秘密情報は取り得る値の範囲は、１０進数表現で“０”から“１５”である。つまり、分割秘密情報Ｄ＿ｃｏｕｎｔの値は、０から１５の何れかであるので、乗数群格納部３１３０には対応する乗数値Ｘ＿ｉｊは必ず存在する。【０２９１】
（６）乗算部３１００
乗算部３１００は、中間値格納部３１２０に格納されている中間値Ｚと、乗数選択部３０９０で選択された乗数値Ｘ＿ｉｊを乗算し、その乗算結果を中間値格納部３１２０に格納する。【０２９２】
具体的には、乗算部３１００は、Ｚ←Ｚ×Ｘ＿ｉｊ  ｍｏｄ  ｎを実行する。【０２９３】
ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数であり、ｃｏｕｎｔはカウンタ格納部１０３０に格納されているカウンタである。【０２９４】
（７）乗数群設定部３１５０−０、３１５０−１
乗数群設定部３１５０−０、３１５０−１は、同様の動作を行うので、ここでは、乗数群設定部３１５０−ｉとして説明する。なお、ｉは０、１である。【０２９５】
乗数群設定部３１５０−ｉは、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを初期化する。【０２９６】
具体的には、乗数群設定部３１５０−ｉは、対象データＸに対し、カウンタｃｏｕｎｔの値が６４以上である場合に、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを用いて、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５を算出する。【０２９７】
乗数群設定部３１５０−ｉは、ｃｏｕｎｔが６４より小さい場合に、乱数群ＲＴに含まれる乱数除去数Ｓを用いて、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５を算出する。【０２９８】
なお、乗数群設定部３１５０−ｉは、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎ、Ｘ＿ｉ２←Ｘ×Ｘ＿ｉ１  ｍｏｄ  ｎ、・・・、Ｘ＿ｉ１５←Ｘ×Ｘ＿ｉ１４  ｍｏｄ  ｎ（＝Ｘ＾１５×ＲＳ  ｍｏｄ  ｎ）を実行する。ここで、ＲＳは、ＲまたはＳである。【０２９９】
（８）乗数群更新部３１６０
乗数群更新部３１６０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉの乗数Ｘ＿ｉ０及びＸ＿ｉ１を更新する。ＭＴ＿ｉは、直前に乗数群設定部３１５０−ｉにより設定した乗数群である。【０３００】
具体的には、乗数群更新部３１６０は、Ｘ＿ｊ０←Ｘ＿ｊ０＾２  ｍｏｄ  ｎ、Ｘ＿ｊ１←Ｘ×Ｘ＿ｊ０  ｍｏｄ  ｎ、Ｘ＿ｊ２←Ｘ×Ｘ＿ｊ１  ｍｏｄ  ｎ、・・・、Ｘ＿ｊ１５←Ｘ×Ｘ＿ｊ１４  ｍｏｄ  ｎを実行する。【０３０１】
３．２  べき乗演算装置３０００の動作
（１）全体の動作
ここでは、べき乗演算装置３０００の動作について、図２０及び図２１にて示す流れ図を用いて説明する。【０３０２】
入出力部３０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部３１２０に格納する（ステップＳ６００）。【０３０３】
入出力部３０１０は、中間値Ｚを値“１”に初期化し、中間値格納部３１２０に格納する（ステップＳ６０５）。【０３０４】
乱数群設定部３１９０は、乱数群ＲＴを生成し、生成した乱数群ＲＴを乱数群格納部３１４０に格納する（ステップＳ６１０）。【０３０５】
カウンタ初期化部３０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ６１５）。ここでは、カウンタ初期化部３０４０は、カウンタｃｏｕｎｔを値ｂ（＝（ｌｅｎｄ／ｓｗ以上の最も小さい整数）−１）に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数であり、ｓｗ＝４である。【０３０６】
乗数群設定部３１５０−ｉは、対象データＸ、乱数群格納部３１４０に格納されている乱数群ＲＴを用いて、乗数群格納部３１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ６２０）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。【０３０７】
２乗算部３１１０は、中間値格納部３１２０に格納されている中間値Ｚに対して、２乗演算処理を施し、その結果をＺとして中間値格納部３１２０に格納する（ステップＳ６２５）。【０３０８】
乗数選択部３０９０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉから乗数Ｘ＿ｉｊを選択する（ステップＳ６３０）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数であり、ｊ＝Ｄ＿ｃｏｕｎｔである。なお、Ｄ＿ｃｏｕｎｔは、カウンタｃｏｕｎｔに対する分割秘密情報が示す値である。【０３０９】
乗算部３１００は、中間値格納部３１２０に格納されている中間値Ｚと、乗数選択部３０９０で選択した乗数Ｘ＿ｉｊを乗算し、その結果を中間値格納部１１２０に格納する（ステップＳ６３５）。【０３１０】
第１のカウンタ判定部３０６０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ６４０）。【０３１１】
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ６４０における「ＹＥＳ」）、入出力部３０１０は、中間値格納部３１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ６７０）。【０３１２】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ６４０における「ＮＯ」）、第３のカウンタ判定部３０８０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が６４で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が６４の倍数であるか否かの判定をする（ステップＳ６４５）。【０３１３】
カウンタｃｏｕｎｔの値が６４で割り切れると判定される場合は（ステップＳ６４５における「ＹＥＳ」）、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ６６５）。具体的には、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部３０３０へ格納する。その後、処理はステップＳ６２０へと戻る。【０３１４】
カウンタｃｏｕｎｔの値が６４で割り切れないと判定される場合は（ステップＳ６４５における「ＮＯ」）、第２のカウンタ判定部３０７０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が２で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が２の倍数であるか否かの判定をする（ステップＳ６５０）。【０３１５】
カウンタｃｏｕｎｔの値が２で割り切れると判定される場合は（ステップＳ６５０における「ＹＥＳ」）、乗数群更新部３１６０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ６５５）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。【０３１６】
カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ６６０）。具体的には、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部３０３０へ格納する。その後、処理はステップＳ６２５へと戻る。【０３１７】
カウンタｃｏｕｎｔの値が２で割り切れないと判定される場合は（ステップＳ６５０における「ＮＯ」）、処理はステップＳ６６０へと移り、ステップＳ６６０の実行後、ステップＳ６２５へと戻る。【０３１８】
（２）乱数群ＲＴの設定処理
図２６におけるステップＳ６１０にて行われる乱数群ＲＴの設定処理は、図２２にて示す動作の流れと同様の動作の流れにて実現できるので、ここでの説明は省略する。【０３１９】
（３）ＭＴ＿ｉの初期化処理
ここでは、図２６におけるステップＳ６２０にて行われる乗数群ＭＴ＿ｉの初期化の処理について、図２８にて示す流れ図を用いて説明する。【０３２０】
乗数群設定部３１５０−ｉは、カウンタｃｏｕｎｔの値が６４以上であるか否かを判断する（ステップＳ７００）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。【０３２１】
カウンタｃｏｕｎｔの値が６４以上であると判断する場合には（ステップＳ７００における「ＹＥＳ」）、乗数群設定部３１５０−ｉは、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを取得する（ステップＳ７０５）。乗数群設定部３１５０−ｉは、取得した乱数Ｒを乗数値Ｘ＿ｉ０に設定する（ステップＳ７１０）。【０３２２】
カウンタｃｏｕｎｔの値が６４以上でないと判断する場合には（ステップＳ７００における「ＮＯ」）、乗数群設定部３１５０−ｉは、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数除去数Ｓを取得する（ステップＳ７１５）。乗数群設定部３１５０−ｉは、取得した乱数Ｓを乗数値Ｘ＿ｉ０に設定する（ステップＳ７２０）。【０３２３】
乗数群設定部３１５０−ｉは、カウンタｋに値“１”を設定する（ステップＳ７２５）。【０３２４】
乗数群設定部３１５０−ｉは、カウンタｋの値が１から１５の間、ステップＳ７３０からＳ７４５までを繰り返す（ステップＳ７３０）。【０３２５】
乗数群設定部３１５０−ｉは、乗数値Ｘ＿ｉｋに、対象データＸに乗数値Ｘ＿ｉ（ｋ−１）を乗算した結果を設定する（ステップＳ７３５）。【０３２６】
乗数群設定部３１５０−ｉは、カウンタｋの値に値“１”を加算して、加算した結果を再度カウンタｋの値として設定する（ステップＳ７４０）。【０３２７】
（４）２乗演算処理
ここでは、図２６におけるステップＳ６２５にて行われる２乗演算処理について、図２９にて示す流れ図を用いて説明する。【０３２８】
２乗算部３１１０は、カウンタｕに値“１”を設定する（ステップＳ８００）。【０３２９】
２乗算部３１１０は、カウンタｕの値が１からｓｗ（ここでは、４）までの間、ステップＳ８１０からＳ８２０までを繰り返す（ステップＳ８０５）。【０３３０】
２乗算部３１１０は、中間値格納部３１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部３１２０に格納する（ステップＳ８１０）。【０３３１】
２乗算部３１１０は、カウンタｕの値に値“１”を加算して、加算した結果を再度カウンタｕの値として設定する（ステップＳ８１５）。【０３３２】
これにより、べき乗演算装置３０００は、２乗演算処理を１回実行することで、Ｚ＾１６を算出することになる。【０３３３】
（５）ＭＴ＿ｉの更新処理
ここでは、図２７におけるステップＳ６５５にて行われる乗数群ＭＴ＿ｉの更新処理について、図３０にて示す流れ図を用いて説明する。【０３３４】
乗数群更新部３１６０は、乗数群格納部３１３０に格納されているＭＴ＿ｉに含まれるＸ＿ｉ０を２乗し、その結果を再度Ｘ＿ｉ０とする（ステップＳ８５０）。【０３３５】
乗数群更新部３１６０は、カウンタｍに値“１”を設定する（ステップＳ８５５）。【０３３６】
乗数群更新部３１６０は、カウンタｍの値が１から１５の間、ステップＳ８６５からＳ８７５までを繰り返す（ステップＳ８６０）。【０３３７】
乗数群更新部３１６０は、乗数値Ｘ＿ｉｍに、対象データＸに乗数値Ｘ＿ｉ（ｍ−１）を乗算した結果を設定する（ステップＳ８６５）。【０３３８】
乗数群更新部３１６０は、カウンタｍの値に値“１”を加算して、加算した結果を再度カウンタｍの値として設定する（ステップＳ８７０）。【０３３９】
３．３  実施の形態３の効果
実施の形態３では、ｄを２×４＝８ビットのブロックごとに乗数群更新部３１６０において、中間値Ｚに乗じる乗数Ｘ＿ｉ０，Ｘ＿ｉ１，・・・，Ｘ＿ｉ１５（ｉは０または１）を更新している。こうすることによって、実施の形態１及び２と同様にブロックごとに乗数が異なるようになり、乗数が何であるかを解析することにより、秘密鍵ｄを求めるＢｉｇＭａｃ攻撃を防ぐことが可能となる。【０３４０】
また、実施の形態３では、ウィンドウ法を用いたべき乗演算においてもキャンセル演算が不要となる。ここでは、ウィンドウの幅は４ビットであり、５１２ビットの秘密鍵ｄは、６４このウィンドウに分割される。【０３４１】
以下、キャンセル演算が不要となる理由を述べる。【０３４２】
乱数Ｒに対して所定回数（ここでは、６４回）の２乗演算処理を行った後、乱数除去数Ｓにて、乱数Ｒの影響（Ｒ＾（２＾２５６）  ｍｏｄ  ｎ）は除去するように、乱数Ｒが出現するウィンドウと対応する乱数除去数Ｓを含むウィンドウとを対にしているからである。【０３４３】
４．変形例
上記に説明した実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。【０３４４】
（１）実施の形態１〜３における秘密鍵ｄのビットサイズは、５１２に限らない。１０２４や２０４８であってもよい。また、べき乗演算装置では、Ｘ＾ｄ  ｍｏｄ  ｎを計算するが、ｄｐ＝ｄ  ｍｏｄ  ｐ−１，ｄｑ＝ｄ  ｍｏｄ  ｑ−１とし、Ｘ＾ｄｐ  ｍｏｄ  ｐとＸ＾ｄｑ  ｍｏｄ  ｑを計算し、中国人の剰余定理を用いることでＸ＾ｄ  ｍｏｄ  ｎを計算するとしてもよい。ここで、Ｘ＾ｄｐ  ｍｏｄ  ｐ及びＸ＾ｄｑ  ｍｏｄ  ｑを計算する際にべき乗演算装置を使用してもよい。この場合、例えば、Ｘ＾ｄｐ  ｍｏｄ  ｐを計算するときは、乗算部などで使用しているｍｏｄ  ｎをｍｏｄ  ｐとして、べき乗演算装置を実施する。この場合において、乗数群の設定時に、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｐ（ｉ＝０または１）におけるＸはｍｏｄ  ｐしたものでもよいが、これをｍｏｄ  ｎしたものとすることにより、入力のＸに依存してＸ  ｍｏｄ  ｐの演算が発生し、その際の電力を計測することによりｐの情報が漏れることを防ぐことが可能になる。また、ｑに対しても同様である。【０３４５】
（２）実施の形態１、２における第２のカウンタ判定部は、カウンタが８で割り切れるか否かを判定しているが、これに限らない。８以外の値、例えば、４で割り切れるか否かを判定してもよい。また、複数の正整数を含めたテーブルを保持し、このテーブルに格納されている正整数であるかを判定してもよい。なお、このテーブルに含める正整数は、８の倍数など、規則性のあるものだけでなく、規則性がないものであってもよい。また、これらの場合も、その正整数の値により、ｕは変化する。【０３４６】
また、実施の形態３においても同様に、第２のカウンタ判定部は、２以外の値、例えば、４で割り切れるか否かを判定してもよい。また、複数の正整数を含めたテーブルを保持し、このテーブルに格納されている正整数であるかを判定してもよい。【０３４７】
（３）実施の形態１における第３のカウンタ判定部は、カウンタが１６で割り切れることを判定し、その判定結果に応じて乗数群を設定するとしているがこれに限らない。例えば、３２や６４のような２のべき数で割り切れるとしてもよい。また、１６、３２や６４のように２のべき数だけでなく、奇数であってもよい。【０３４８】
（４）実施の形態１〜３における乗数群更新部において、乗数群の乗数値Ｘ＿ｉ０（ｉは０から３１までの値）を２乗しているが、これに限らない。例えば、３乗してもよい。つまり、更新後の乗数値は、更新前の乗数値Ｘ＿ｉ０を用いて変更される値となればよい。【０３４９】
（５）実施の形態１では、乱数群の個数を３２としていたが、これに限らない。例えば、乗数群の設定のバリエーション、すなわち、配列ＲＳＩに含める乱数選択情報の組み合わせの種類を２＾３２程度にしたい場合は、２６個あればよい。一般に、乱数群の個数ｇに対し、バリエーションの数はｇ／２の階乗個ある。【０３５０】
（６）実施の形態１、２では、べき値の上位ビットから下位への方向に、べき値のビットを判定して演算を実行しているが、下位ビットから上位への方向に、べき値のビットを判定して演算を実行してもよい。【０３５１】
その場合は、２乗算部は、２乗算を中間値に対してではなく、直前で設定した乗数群に対して実行し、乗数群を更新していく。また、乗数群更新部は不要であり、１番目に実行する乗数群設定部はＲを用いてブラインドするよう設定する。すなわち、乗数群ＭＴ＿０は、べき値の下位半分において、ビットごとに、（Ｒ，Ｘ×Ｒ）⇒（Ｒ＾２，（Ｘ×Ｒ）＾２）⇒（Ｒ＾４，（Ｘ×Ｒ）＾４）⇒・・・⇒（Ｒ＾（２＾２５５），（Ｘ×Ｒ）＾（２＾２５５））と変化していく。ここで、（Ｒ，Ｘ×Ｒ）はＸ＿００＝Ｒ，Ｘ＿０１＝Ｘ×Ｒであることを示している。さらに、２番目に実行する乗数群設定部は（Ｓ×Ｒ＾（２＾２５５））を用いてブラインドするよう設定する。このとき、その前の乗数群ＭＴ＿０のそれぞれの乗数にＳを乗じることで、乗数群ＭＴ＿１を設定する。その前に、２乗算部で乗数群ＭＴ＿０の各要素を２乗算する。すなわち、ＭＴ＿０＝（Ｒ＾（２＾２５５），（Ｘ×Ｒ）＾（２＾２５５））⇒ＭＴ＿０＝（Ｒ＾（２＾２５６），（Ｘ×Ｒ）＾（２＾２５６））⇒ＭＴ＿１＝（Ｓ×Ｒ＾（２＾２５６），Ｓ×（Ｘ×Ｒ）＾（２＾２５６））と求め、ＭＴ＿１の乗数をそれぞれＳ×Ｒ＾（２＾２５６），Ｓ×（Ｘ×Ｒ）＾（２＾２５６）とする。【０３５２】
さらに、例えば、実施の形態２における乱数シード格納部に格納する乱数シードＵ、乱数除去シードＶをＶ＝Ｕ＾（−２＾２５６−１）となるよう設定する。このように設定することにより、ＲとＳの関係もＳ＝Ｒ＾（−２＾２５６−１）となる。その結果、先で述べたＭＴ＿１の乗数は、Ｓ×Ｒ＾（２＾２５６）＝Ｒ＾（−１），Ｓ×（Ｘ×Ｒ）＾（２＾２５６）＝Ｘ＾（２＾２５６）×Ｒ＾（−１）となる。その結果、乗数群ＭＴ＿１を用いて乗算を実行することで、ＭＴ＿０の初期値である（Ｒ，Ｘ×Ｒ）を用いて乗算を実行したときの乱数Ｒの影響を相殺することができる。それ以降のビットに対しても、２乗算部の２乗算により、（Ｒ＾（−２），Ｘ＾（２＾２５７）×Ｒ＾（−２））、（Ｒ＾（−４），Ｘ＾（２＾２５８）×Ｒ＾（−４））、・・・、（Ｒ＾２５５，Ｘ＾（２＾５１１）×Ｒ＾（−２５５））と順次変化していくことで、それぞれの下位ビットの乱数の影響を対となる上位ビットの処理で相殺することが可能になる。【０３５３】
なお、実施の形態１においても、乱数群ＲＴ＿ｉに含まれるＲ＿ｉ、Ｓ＿ｉは、上述したようにＳ＝Ｒ＾（−２＾２５６−１）となるように設定すればよい。【０３５４】
（７）実施の形態１〜３では、複数の乗数群をそれぞれ設定しているが、一つの乗数群を用いて乗数群設定部では計算した結果を置き換えてもよい。【０３５５】
（８）実施の形態１における乱数群格納部に格納されている乱数の一部または全部を乱数シードとし、乱数除去数の一部または全部を乱数除去シードとして、それぞれを実施の形態２のようにべき乗して、それらの結果を掛け合わせることで乱数群を生成してもよい。また、同様に実施の形態１と３を組み合わせてもよい。【０３５６】
（９）実施の形態１〜３では、乱数と乱数除去数または乱数シードと乱数除去シードを予め格納しておくとしていたが、最初に暗号処理を行う際に、秘密鍵からそれらを計算して、格納するとしてもよい。その構成にすることで、装置を製造する時点では乱数と乱数除去数または乱数シードと乱数除去シードを格納する必要がなくなる。また、秘密鍵は外部から与えられるとしてもよい。さらに、暗号処理を実行するごとに、毎回秘密鍵から乱数と乱数除去数を計算して利用するとしてもよい。【０３５７】
（１０）実施の形態１〜３における乱数はどのような値でもよく、秘密鍵や公開鍵の値や、べき乗以外の機能において格納している値を流用してもよい。また、中国人の剰余定理を用いる場合も、ｍｏｄ  ｐにおける乱数Ｒｐとｍｏｄ  ｑにおける乱数Ｒｑを同じ値としてもよい。そうすることで、メモリサイズを削減できる。また、乱数でなく、乱数除去数を流用するとしてもよい。どちらの場合も、乱数と乱数除去数の関係は維持する必要がある。【０３５８】
（１１）実施の形態１〜３に他の電力差分攻撃対策、例えば、Ｅｘｐｏｎｅｎｔ  Ｂｌｉｄｉｎｇを追加で施してもよい。Ｅｘｐｏｎｅｎｔ  Ｂｌｉｎｄｉｎｇを用いる場合は、べき値が毎回ランダムに変化するため、安全性がより高まる。【０３５９】
（１２）実施の形態２に対し、中国人の剰余定理を用いる場合において、最初にｍｏｄ  ｐの乱数シード及び乱数除去シードのｗ乗を実行し、ｍｏｄ  ｐにおける乗数群を用いたべき乗演算が終了した後に、ｍｏｄ  ｑの乱数シード及び乱数除去シードのｗ乗を実行して、ｍｏｄ  ｐの乱数シード及び乱数除去シードの格納領域を書き替えるとしてもよい。そうすることで、乱数及び乱数除去数のメモリサイズを削減できる。【０３６０】
（１３）実施の形態２において、ｗ乗演算は従来の方法を用いるとしていたが、これを、電力差分攻撃対策を施したものとしてもよい。そうすることで、より安全性が高まる。【０３６１】
（１４）実施の形態１〜３では、乱数と乱数除去数の組み合わせで、乱数の影響を相殺していたが、これに限らない。３つ以上の乱数の組み合わせで、乱数の影響を相殺するとしてもよい。この場合、乱数群はこれらの互いに相殺する乱数の組とする。【０３６２】
（１４−１）以下、乱数Ｒ、Ｒ’の影響を乱数除去数Ｓで相殺する場合について、図３１用いて説明する。なお、説明を簡単に行うために、ｃｏｕｎｔ＝ｉ、ｊ、ｋに着目して説明する。【０３６３】
ここで、ｃｏｕｎｔ＝ｉのときに、乱数Ｒが初めて出現し、ｃｏｕｎｔ＝ｊのときに、更新された乱数Ｒ’が初めて出現するものとする。また、ｃｏｕｎｔ＝ｋのときに、これら乱数の影響を相殺するものとし、Ｓ＝Ｒ＾（−２＾ｐ）×Ｒ’＾（−２＾ｑ）とする。【０３６４】
図３１にて示すように、ｃｏｕｎｔ＝ｉのときに乱数Ｒが、ｃｏｕｎｔ＝ｊのときに乱数Ｒ’がそれぞれ出現し、ｃｏｕｎｔ＝ｋの時点における２乗演算により、乱数Ｒ及びＲ’それぞれに対して、合計ｐ回、ｑ回の２乗演算が施される。【０３６５】
そして、ｃｏｕｎｔ＝ｋの時点の乗算演算（例えば、図５にて示すステップＳ１３５、又は１４０）において、乱数除去数Ｓ（＝Ｒ＾（−２＾ｐ）×Ｒ’＾（−２＾ｑ））を用いることで、乱数Ｒ及びＲ’に対する演算結果（Ｒ＾（２＾ｐ）、及びＲ’＾（２＾ｐ））が相殺される。【０３６６】
このとき、べき乗演算装置は、乱数Ｒ、Ｒ’及び乱数除去数Ｓの３つの数からなる組を予め記憶してもよい。【０３６７】
または、べき乗演算装置は、乱数Ｒ、Ｒ’、乱数Ｒ、Ｒ’それぞれに対する乱数除去数Ｓ＿１、ｓ＿２とからなる４つの組を予め記憶しておき、乱数除去数Ｓ＿１とＳ＿２とから乱数除去数Ｓを算出してもよい。【０３６８】
なお、乱数除去数Ｓを算出するタイミングは、乱数Ｒ及びＲ’に対する演算結果（Ｒ＾（２＾ｐ）、及びＲ’＾（２＾ｐ））を相殺するための演算を施す前であればいつでもよい。【０３６９】
（１４−２）以下、乱数Ｒの影響を、乱数除去数Ｓ、Ｓ’で相殺する場合においては、乱数Ｒと、乱数除去数Ｓ、Ｓ’との関係を以下のようにすればよい。なお、乱数Ｒが出現してから乱数除去数Ｓによる乗算が行われる際には、乱数Ｒに対してｉ回の２乗演算が施されるものとする。【０３７０】
乱数Ｒと乱数除去数Ｓとの関係をＳ＝Ｒ＾（−２＾ｉ）とし、乱数Ｒと乱数除去数Ｓ’との関係をＳ’＝Ｒ＾（−２＾（ｉ＋１−ｊ））とする。なお、ｊはｉより小さい整数である。【０３７１】
この場合、乱数Ｒに対してｉ回の２乗演算が施された直後に、乱数除去数Ｓ（＝Ｒ＾（−２＾ｉ））による乗算を行うことで、値Ｒ＾（２＾ｉ）のうちの一部がキャンセルされ、値Ｒ＾（２＾（ｉ−ｊ））が残っている状態となる。この値Ｒ＾（２＾（ｉ−ｊ））に対して２乗演算が施され、演算結果は値Ｒ＾（２＾（ｉ−ｊ＋１））となり、乱数除去数Ｓ’（＝Ｒ＾（−２＾（ｉ＋１−ｊ）））を用いて乗算することにより、値Ｒ＾（２＾（ｉ−ｊ＋１））がキャンセルされる。【０３７２】
（１５）本発明は、べき乗を演算するのではなく、楕円曲線の点のスカラ倍点を演算するとしてもよい。その場合、べき乗演算装置１０００で実施している乗算は楕円加算であり、２乗算は楕円２倍算となる。また、「べき」は「スカラ」に対応する。【０３７３】
具体的には、実施の形態１にて示す乗算“Ｚ←Ｚ×Ｘｉ０”を楕円加算“Ｚ←Ｚ＋Ｘｉ０”に置き換わり、乗算“Ｚ←Ｚ×Ｘｉ１（＝Ｚ×Ｘ×ＲＳ）”を楕円加算“Ｚ←Ｚ＋Ｘｉ１（＝Ｚ＋Ｘ＋ＲＳ）”に置き換わる。また、実施の形態１にて示す２乗算“Ｚ←Ｚ＾２”は、楕円２倍算“Ｚ←２＊Ｚ（＝Ｚ＋Ｚ）”に置き換わる。【０３７４】
楕円曲線の点のスカラ倍点を演算する場合について、以下に具体例を示す。【０３７５】
ここでは、装置Ａと装置Ｂとの間で行われる鍵共有の一例について、図３２に示す流れ図を用いて説明する。【０３７６】
装置Ａは、秘密鍵ｘＡを設定して保持している（ステップＳ９０１）。また、装置Ｂは、秘密鍵ｘＢを設定して保持している（ステップＳ９３１）。【０３７７】
楕円曲線を保持している管理センタが存在し、管理センタには、管理センタ装置が設置９６０されている。管理センタに設置されている管理センタ装置９６０は、楕円曲線Ｅ：ｙ＾２＝ｘ＾３＋ａｘ＋ｂの適切なパラメータａ及びｂを選択して保持しており、また、素数ｐ及び楕円曲線Ｅ上の適切な元Ｇを選択して保持している（ステップＳ９１１）。【０３７８】
管理センタ装置９６０は、素数ｐ、楕円曲線Ｅ及び元Ｇを公開する（ステップＳ９１３）。【０３７９】
装置Ａは、公開鍵ＹＡ＝ｘＡ＊Ｇを算出し（ステップＳ９０２）、算出した公開鍵ＹＡを装置Ｂへ出力する（ステップＳ９０３）。また、装置Ｂは、公開鍵ＹＢ＝ｘＢ＊Ｇを算出し（ステップＳ９３２）、算出した公開鍵ＹＢを装置Ａへ出力する（ステップＳ９３３）。【０３８０】
次に、装置Ａは、共有鍵ｘＡ＊ＹＢを算出する（ステップＳ９０４）。ここで、共有鍵ｘＡ＊ＹＢ＝（ｘＡ×ｘＢ）＊Ｇである。【０３８１】
一方、装置Ｂは、共有鍵ｘＢ＊ＹＡを算出する（ステップＳ９３４）。ここで、共有鍵ｘＢ＊ＹＡ＝（ｘＢ×ｘＡ）＊Ｇ＝（ｘＡ×ｘＢ）＊Ｇ＝ｘＡ＊ＹＢである。【０３８２】
このようにして、装置Ａ及び装置Ｂは、同じセッション鍵を共有することができる。【０３８３】
ここで、楕円曲線上の離散対数問題を安全性の根拠としている。【０３８４】
また、記号＊は、楕円曲線に含まれる元を複数回加算する演算を示し、ｘ＊Ｇは、次式に示すように、楕円曲線に含まれる元Ｇをｘ回加算することを意味する。【０３８５】
ｘ＊Ｇ＝Ｇ＋Ｇ＋Ｇ＋・・・＋Ｇ
次に、楕円曲線上の楕円べき倍演算について、以下に簡単に説明する。【０３８６】
一例として、１００＊Ｐを計算する。【０３８７】
１００＊Ｐ＝２（２（Ｐ＋２（２（２（Ｐ＋２Ｐ）））））と表すと、１００＊Ｐは、楕円曲線上の点による６回の２倍算と２回の加算により計算される。【０３８８】
このように、楕円べき倍演算は、２倍算及び加算による演算に帰着する。【０３８９】
ここで、楕円曲線の方程式を  ｙ＾２＝ｘ＾３＋ａｘ＋ｂ  とし、楕円曲線上の任意の点Ｐの座標を（ｘ１、ｙ１）とし、任意の点Ｑの座標を（ｘ２、ｙ２）とする。ここで、Ｒ＝Ｐ＋Ｑで定まる点Ｒの座標を（ｘ３、ｙ３）とする。【０３９０】
点Ｐと点Ｑが等しくない場合、Ｒ＝Ｐ＋Ｑは、加算の演算となる。加算の公式を以下に示す。【０３９１】
ｘ３  ＝  ｛（ｙ２−ｙ１）／（ｘ２−ｘ１）｝＾２  −  ｘ１  −  ｘ２
ｙ３  ＝  ｛（ｙ２−ｙ１）／（ｘ２−ｘ１）｝（ｘ１−ｘ３）  −  ｙ１
点Ｐと点Ｑとが等しい場合、Ｒ＝Ｐ＋Ｑ＝Ｐ＋Ｐ＝２×Ｐとなり、Ｒ＝Ｐ＋Ｑは、２倍演算となる。２倍演算の公式を以下に示す。【０３９２】
ｘ３  ＝  ｛（３×ｘ１＾２＋ａ）／（２×ｙ１）｝＾２  −  （２×ｘ１）
ｙ３  ＝  ｛（３×ｘ１＾２＋ａ）／（２×ｙ）｝（ｘ１−ｘ３）  −  ｙ１
ここで、上記演算は、楕円曲線が定義されている有限体上での演算である。【０３９３】
なお、楕円曲線の演算公式については、“Ｅｆｆｉｃｉｅｎｔ  ｅｌｌｉｐｔｉｃ  ｃｕｒｖｅ  ｅｘｐｏｎｅｎｔｉａｔｉｏｎ”（Ｍｉｙａｊｉ，  Ｏｎｏ，  ａｎｄ  Ｃｏｈｅｎ著、Ａｄｖａｎｃｅｓ  ｉｎ  ｃｒｙｐｔｏｌｏｇｙ−ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＩＣＩＣＳ’９７，  Ｌｅｃｔｕｒｅ  ｎｏｔｅｓ  ｉｎ  ｃｏｍｐｕｔｅｒ  ｓｃｉｅｎｃｅ，１９９７，Ｓｐｒｉｎｇｅｒ−ｖｅｒｌａｇ，２８２−２９０．）に詳しく説明されている。【０３９４】
（１６）本発明における群とは、実施の形態１から３における“ｍｏｄ  ｎ”による集合である剰余体、及び上記（１５）における楕円曲線に相当する。【０３９５】
ここで、群とは、集合Ｇが以下に示す性質Ｇ０からＧ３を持つ場合をいう。【０３９６】
（Ｇ０）Ｇの任意の２つ元ａ，ｂに対して、積ａｂが定義されてＧに属する。【０３９７】
（Ｇ１）Ｇの任意の３元ａ，ｂ，ｃに対して、（ａｂ）ｃ＝ａ（ｂｃ）が成り立つ（結合法則）。【０３９８】
（Ｇ２）Ｇの任意の元ａに対して、ａｅ＝ｅａを満たすＧの元ｅが存在する（単位元の存在）。【０３９９】
（Ｇ３）Ｇの任意の元ａに対して、ａｂ＝ｂａ＝ｅを満たすＧの元ｂが存在する（逆元の存在）。【０４００】
なお、上記の群の定義は、剰余体における群に定義を示しているが、上記の定義において積を和と考えることで、楕円曲線上の群が定義される。【０４０１】
また、本発明における基本演算及びウィンドウ演算とは、実施の形態１から３における乗算、及び上記（１５）における楕円加算に相当する。【０４０２】
また、桁上演算とは、実施の形態１から３における２乗算（２＾ｖ）、及び上記（１５）における楕円２倍算（２＊ｖ）に相当する。【０４０３】
（１７）本発明は、べき乗演算装置でなく、これを利用するＲＳＡ暗号の復号化装置やＲＳＡ署名の署名生成装置であってもよい。また、秘密情報をべき値としたべき乗演算を実行する情報セキュリティ装置であってもよい。例えば、ＥｌＧａｍａｌ暗号の復号化装置であったり、ＤＳＡ署名の署名生成装置であったりしてもよい。【０４０４】
（１８）上記各実施の形態及び変形例は、次に示すような場合において適用される。【０４０５】
（１８−１）各実施の形態及び変形例は、公開鍵暗号方式における暗号文の復号や署名データの生成において適用される。これらについては、上記において、対象データＸのべき乗演算結果として説明している。【０４０６】
（１８−２）各実施の形態及び変形例は、認証において適用される。認証とは、メッセージが自称どおりの人物によって送られたこと、またメッセージが改ざんされていないことの検証である。また、各実施の形態及び変形例は、身分の証明において適用される。身分の証明とは、例えば、データへのアクセス権、又は施設へのアクセス権（入室権）を持つことの証明、又は自分が主張どおりの人物であることの証明である。さらに、各実施の形態及び変形例は、否認防止において適用される。否認防止とは、例えば、実は何かに同意したのに、同意していないと主張する者に対抗することをいう。【０４０７】
（１８−３）各実施の形態及び変形例は、鍵交換において適用される。鍵交換とは、例えば、２人の人が放送電波を使ってある秘密鍵暗号方式で使うための秘密鍵を共有することである。【０４０８】
（１８−４）各実施の形態及び変形例は、硬貨投げ（ビットコミットメントとも呼ばれる）において適用される。硬貨投げとは、例えば、別々の市に住む２人のチェスプレーヤが、電子メールで、誰が白を持つかを決めることである。【０４０９】
（１８−５）各実施の形態及び変形例は、秘密分散において適用される。秘密分散とは、例えば、ある秘密の情報が、共に働くｋ人の人によって利用可能であるが、ｋ−１人の人では、利用できないようにすることをいう。【０４１０】
（１８−６）各実施の形態及び変形例は、零知識証明において適用される。零知識証明とは、例えば、ある人が、数論的あるいは組み合わせ論的問題を解くことに成功したことを、解がなんであるかのわずかな情報さえ与えることなく、他人にこのことを納得させることをいう。【０４１１】
（１９）上記実施の形態１において、秘密鍵ｄに対する全てのビットに対して、ステップＳ１３５及びＳ１４０の何れかにおいて乱数Ｒ若しくは乱数除去数Ｓを用いたが、これに限定されない。【０４１２】
１つ以上の特定のビットそれぞれに対して乱数Ｒを用いて乗算を施してもよい。各特定のビットに対して、当該特定のビットにて出現した乱数Ｒに対して、所定回数の２乗演算を繰り返した直後における演算対象のビットに対して前記乱数Ｒに対応する乱数除去数Ｓを用いて乗算を施すことで、当該特定のビットにて出現した乱数Ｒに対する２乗演算の影響をキャンセルすることができる。このとき、特定のビットは最下位ビット以外のビットとする。【０４１３】
以下、特定のビットが１つの場合を用いて説明する。【０４１４】
５１１番目のビットから２５６番目のビットのうちｉ番目のビットに対して、乱数Ｒを用いて乗算を施して、その後、（ｉ−２５６）番目のビット、つまり、２乗演算が２５６回施された直後の演算対象のビットに対して前記乱数Ｒに対応する乱数除去数Ｓを用いて乗算を施す。このとき、他のビットにおいては、従来と同様に、ビット値が０である場合には、中間値Ｚに値１を乗算し、ビット値が１である場合には、中間値に対象データＸを乗算する。【０４１５】
また、実施の形態２においても同様に、１つ以上の特定のビットそれぞれに対して乱数Ｒを用いて乗算を施してもよい。このとき、特定のビットは最下位ビット以外のビットとする。【０４１６】
また、実施の形態３においても同様に、１つ以上の特定のウィンドウそれぞれに対して乱数Ｒを用いて乗算を施してもよい。このとき、特定のウィンドウは最下位のウィンドウ以外のウィンドウとする。【０４１７】
（２０）上記実施の形態１、２において、べき乗演算装置は、ビット毎に乗算に用いる乱数を更新してもよい。【０４１８】
また、上記実施の形態３においても同様に、べき乗演算装置は、ウィンドウ毎に乗算に用いる乱数を更新してもよい。【０４１９】
（２１）上記実施の形態１において、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾（ｄ＿ｉ）×ＲＳ＿（ＲＳＩ＿ｉ））としてもよい。ここで、ＲＳ＿（ＲＳＩ＿ｉ）は、Ｒ＿（ＲＳＩ＿ｉ）及びＳ＿（ＲＳＩ＿ｉ）の何れかである。【０４２０】
なぜなら、ｄ＿ｉが０である場合には、Ｘ＾（ｄ＿ｉ）＝１であるので、Ｘ＿ｉ＝Ｒ＿（ＲＳＩ＿ｉ）となり、Ｘ＿ｉ０と同値となる。また、ｄ＿ｉが１である場合には、Ｘ＾（ｄ＿ｉ）＝Ｘであるので、Ｘ＿ｉ＝Ｘ×Ｒ＿（ＲＳＩ＿ｉ）となり、Ｘ＿ｉ１と同値となる。【０４２１】
また、上記実施の形態２においても同様に、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾（ｄ＿ｉ）×ＲＳ）としてもよい。ここで、ＲＳは、Ｒ及びＳの何れかである。【０４２２】
また、上記実施の形態３においても同様に、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾ｗ×ＲＳ）としてもよい。ここで、ＲＳは、Ｒ及びＳの何れかであり、ｗはウィンドウが示す値である。【０４２３】
（２２）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。【０４２４】
（２３）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。【０４２５】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていても良いし、一部又は全てを含むように１チップ化されてもよい。【０４２６】
また、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。【０４２７】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適用等が可能性としてありえる。【０４２８】
（２４）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。【０４２９】
（２５）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。【０４３０】
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。【０４３１】
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。【０４３２】
また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。【０４３３】
また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。【０４３４】
（２６）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。【０４３５】
５．まとめ
（１）本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。【０４３６】
（２）上記（１）のべき乗演算装置において、前記組み合わせの各々は、丁度２個の前記乗数群設定部を含むとしてもよい。【０４３７】
（３）上記（２）のべき乗演算装置は、２個の前記乗数群設定部を含み、前記乗数群設定部集合は１つであるとしてもよい。【０４３８】
（４）上記（３）のべき乗演算装置は、さらに、カウンタを格納するカウンタ格納部と、カウンタの値を更新するカウンタ更新部と、カウンタの値を判定するカウンタ判定部とを備え、前記秘密情報判定部は、前記カウンタの値に基づき判定し、前記乗数群更新部は、前記カウンタ判定部の判定結果に基づき、前記乗数を更新するとしてもよい。【０４３９】
（５）上記（４）のべき乗演算装置において、２以上の前記乗数群設定部の中で、１番目に処理をする前記乗数群設定部である第１の乗数群設定部は、前記乗算部及び前記２乗算部より前に実行し、２以上の前記乗数群設定部の中で、２番目に処理をする前記乗数群設定部である第２の乗数群設定部は、前記カウンタ判定部において前記カウンタの値が前記べき値のビット列の真ん中であることを示す場合に実行するとしてもよい。【０４４０】
（６）上記（２）から（５）の何れかのべき乗演算装置は、さらに、予め与えられた１以上の乱数シードに基づいて前記乱数群を設定する乱数群設定部を備えるとしてもよい。【０４４１】
（７）上記（２）から（６）の何れかのべき乗演算装置において、前記乗数群設定部は、前記乱数群に含まれる前記乱数をランダムに選択するとしてもよい。【０４４２】
（８）上記（２）又は（６）のべき乗演算装置において、前記乱数群設定部は、１以上の前記乱数シードそのものを前記乱数群として設定するとしてもよい。【０４４３】
（９）上記（２）又は（６）のべき乗演算装置において、前記乱数群設定部は、ランダムなべき値であるランダムべき値を生成し、前記ランダムべき値をべき値として前記乱数シードをべき乗して、前記乱数を求めることで前記乱数群を設定するとしてもよい。【０４４４】
（１０）上記（１）から（９）の何れかのべき乗演算装置において、前記乗数群格納部は、２個の前記乗数Ｘ＿０、Ｘ＿１を格納し、前記乗数群更新部は、前記乗数Ｘ＿０、Ｘ＿１に対し、前記乗数Ｘ＿０を２乗した結果を前記乗数Ｘ＿０に対する更新乗数Ｘ＿０'とし、前記対象データと前記更新乗数Ｘ＿０を掛けた結果を前記乗数Ｘ＿１に対する更新乗数Ｘ＿１'とし、それぞれの前記更新乗数Ｘ＿０'、Ｘ＿１'を前記乗数群格納部に格納することを特徴とする（ｘ＿ｙは、ｘに下付きインデックスｙが付けられていることを示す。）。【０４４５】
（１１）上記（１）から（９）の何れかのべき乗演算装置において、前記乗数群格納部は、２＾ｋ（ｋは２以上）個の前記乗数Ｘ＿０、Ｘ＿１、Ｘ＿２、・・・、Ｘ＿（２＾ｋ）を格納し、前記乗数群更新部は、前記乗数Ｘ＿０、Ｘ＿１に対し、前記乗数Ｘ＿０を２乗した結果を前記乗数Ｘ＿０に対する更新乗数Ｘ＿０'とし、前記対象データと前記更新乗数Ｘ＿０を掛けた結果を前記乗数Ｘ＿１に対する更新乗数Ｘ＿１'とし、それぞれの前記更新乗数Ｘ＿０'、Ｘ＿１'を前記乗数群格納部に格納することを特徴とする（ｘ＾ｙはｘのｙ乗を示す。）。【０４４６】
（１２）また、本発明は、暗号文を入力し、秘密の数である秘密情報をべき値とした前記暗号文のべき乗演算結果を復号文として出力する復号化装置であって、前記暗号文の入力を受け付け、前記復号文を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。【０４４７】
（１３）また、本発明は、署名対象データを入力し、秘密の数である秘密情報をべき値とした前記署名対象データのべき乗演算結果を署名データとして出力する署名生成装置であって、前記署名対象データの入力を受け付け、前記署名データを出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。【０４４８】
（１４）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算方法であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力ステップと、前記秘密情報を格納する秘密情報格納ステップと、中間値を格納する中間値格納ステップと、前記秘密情報に対し、判定する秘密情報判定ステップ複数個の乗数からなる２以上の乗数群を格納する乗数群格納ステップと、複数個の乱数からなる乱数群を格納する乱数群格納ステップと、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定する２以上の乗数群設定ステップと、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行する乗算ステップと、前記中間値の２乗算を実行する２乗算ステップと、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新する乗数群更新ステップとを備え、前記乗算ステップで使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数群に含まれる複数個の前記乗数から選択し、すべての前記乗数群設定ステップは、前記乗数群設定ステップ、前記乗数群設定ステップ以外の１以上の乗数群設定ステップ、前記２以上の乗数群設定ステップで設定する前記乗数群を用いて乗算する前記乗算ステップ、前記２乗算ステップと前記乗数群更新ステップの処理の組み合わせによって、前記２以上の乗数群設定ステップで設定した前記乱数の影響を相殺することを特徴とする。【０４４９】
（１５）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置に実行させるプログラムであって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力ステップと、前記秘密情報を格納する秘密情報格納ステップ中間値を格納する中間値格納ステップと、前記秘密情報に対し、判定する秘密情報判定ステップと、複数個の乗数からなる２以上の乗数群を格納する乗数群格納ステップと、複数個の乱数からなる乱数群を格納する乱数群格納ステップと、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定する２以上の乗数群設定ステップと、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行する乗算ステップと、前記中間値の２乗算を実行する２乗算ステップと、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新する乗数群更新ステップとを前記べき乗演算装置に実行させ、前記乗算ステップで使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数群に含まれる複数個の前記乗数から選択し、すべての前記乗数群設定ステップは、前記乗数群設定ステップ、前記乗数群設定ステップ以外の１以上の乗数群設定ステップ、前記２以上の乗数群設定ステップで設定する前記乗数群を用いて乗算する前記乗算ステップ、前記２乗算ステップと前記乗数群更新ステップの処理の組み合わせによって、前記２以上の乗数群設定ステップで設定した前記乱数の影響を相殺することを特徴とする。【０４５０】
（１６）また、本発明は、上記（１５）に記載のプログラムを記録した媒体であることを特徴とする。【０４５１】
（１７）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置の集積回路であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。【０４５２】
（１８）本発明によると、ＢｉｇＭａｃ攻撃により安全性を低下することを防ぎつつ、対象データのべき乗演算を行う過程において、乱数Ｒの影響をキャンセルするので、従来のように別途キャンセル処理を必要としない。よって、その価値は大きい。
【産業上の利用可能性】
【０４５３】
本発明は、上記にて示すべき乗演算装置、公開鍵暗号による暗号文を復号する装置、及び公開鍵暗号による署名データを生成する装置の製造及び販売する産業において、経営的、継続的、反復的に利用可能である。【０４５４】
また、本発明によるべき乗演算装置を用いることで、ＢｉｇＭａｃ攻撃による秘密鍵の解析を困難にすることができる。
【図１】
2008149496.tif 000003
【図２】
2008149496.tif 000004
【図３】
2008149496.tif 000005
【図４】
2008149496.tif 000006
【図５】
2008149496.tif 000007
【図６】
2008149496.tif 000008
【図７】
2008149496.tif 000009
【図８】
2008149496.tif 000010
【図９】
2008149496.tif 000011
【図１０】
2008149496.tif 000012
【図１１】
2008149496.tif 000013
【図１２】
2008149496.tif 000014
【図１３】
2008149496.tif 000015
【図１４】
2008149496.tif 000016
【図１５】
2008149496.tif 000017
【図１６】
2008149496.tif 000018
【図１７】
2008149496.tif 000019
【図１８】
2008149496.tif 000020
【図１９】
2008149496.tif 000021
【図２０】
2008149496.tif 000022
【図２１】
2008149496.tif 000023
【図２２】
2008149496.tif 000024
【図２３】
2008149496.tif 000025
【図２４】
2008149496.tif 000026
【図２５】
2008149496.tif 000027
【図２６】
2008149496.tif 000028
【図２７】
2008149496.tif 000029
【図２８】
2008149496.tif 000030
【図２９】
2008149496.tif 000031
【図３０】
2008149496.tif 000032
【図３１】
2008149496.tif 000033
【図３２】
2008149496.tif 000034
【手続補正書】
【提出日】平成20年12月18日(2008.12.18)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置であって、
値ｄを取得する取得手段と、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、
前記主演算手段は、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする情報セキュリティ装置。
【請求項２】
前記情報セキュリティ装置は、さらに、
べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施す処理手段を備える
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項３】
前記第２ウィンドウは、前記第１ウィンドウから値ｖだけ先に存在し、
前記キャンセル値Ｓは、べき演算（ｖ＆２）の演算結果に対する前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの逆数であり、
前記主演算手段は、
前記乱数Ｒと、前記キャンセル値Ｓとを取得する取得部と、
変数Ｚを保持する変数保持部と、
初期値として変数Ｚに単位元を設定する初期化部と、
前記桁上演算により変数Ｚをウィンドウ幅だけ桁上げし、その結果を変数Ｚとする桁上演算部と、
演算対象のウィンドウについて、そのウィンドウ値ｗ及び元Ｘに基づくべき演算値を取得し、少なくとも変数Ｚと取得したべき演算値とを用いて前記ウィンドウ演算を施して演算結果を変数Ｚとするウィンドウ演算部と、
前記桁上演算部及びウィンドウ演算部に対して、全てのウィンドウについて、桁上演算とウィンドウ演算とを繰り返すように制御する制御部とを含み、
前記ウィンドウ演算部は、
前記第１のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、
前記第２のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとする
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項４】
前記ウィンドウ演算部は、
前記第１のウィンドウから連続するｉ個（ｉはｖより小さい値）のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行い、
前記第２のウィンドウから連続するｉ個のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行う
ことを特徴とする請求項３に記載の情報セキュリティ装置。
【請求項５】
前記各ウィンドウに含まれるビット数は、ｕ（ｕは１以上の整数）であり、
前記ウィンドウの個数は、ｌｅｎｄ／ｕ個であり、
値ｌｅｎｄは、前記値ｄのビット長以上である２のべき数のうち最小の値であり、
前記値ｖは、ｌｅｎｄ＝２ｖを満たし、
前記第１のウィンドウは先頭ウィンドウであり、前記第２のウィンドウは先頭ウィンドウからｌｅｎｄ／２ｕ＋１番目に位置するウィンドウであり、
先頭ウィンドウからｌｅｎｄ／２ｕ個のウィンドウ、及び先頭からｌｅｎｄ／２ｕ＋１番目のウィンドウから末尾のウィンドウまでのｌｅｎｄ／２ｕ個のウィンドウは、ｉ個のウィンドウからなる第１から第ｐのグループ、及び第ｐ＋１から第ｍのグループに分割され、
前記取得部は、さらに、第１から第ｐのグループに対して、演算対象のグループから次グループに演算対象が変更されるときに、演算対象の変更直前に用いた乱数とは異なる乱数を取得し、
前記ウィンドウ演算部は、第１から第ｐのグループそれぞれに対して、当該グループが演算対象である間は、当該グループに含まれるウィンドウそれぞれに対して、前記取得部にて取得された乱数を用いたウィンドウ演算による演算値を取得し、
前記取得部は、第ｐ＋１から第ｍのグループに含まれる第ｍ’のグループを演算対象とする際に、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を取得し、
前記ウィンドウ演算部は、前記第ｍ’のグループを演算対象としている間は、前記取得部にて取得されたキャンセル値を用いたウィンドウ演算による演算値を取得する
ことを特徴とする請求項４に記載の情報セキュリティ装置。
【請求項６】
前記取得部は、
ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを対応付けて予め記憶しており、
前記第１から第ｐのグループそれぞれに対して、当該グループが演算対象となる際に現時点で未選択の１個以上の乱数から１個の乱数を選択することで、当該グループで用いる乱数を取得し、
前記第ｍ’のグループに対して、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を選択することで、当該第ｍ’のグループで用いるキャンセル値を取得する
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項７】
前記取得部は、
前記異なる乱数の取得時において、現時点で保持している乱数Ｒに、所定数ｑに対するべき乗演算Ｒ＾ｑを行い、当該べき乗演算Ｒ＾ｑの演算結果を再度乱数Ｒとして保持し、
キャンセル値の取得時において、現時点で保持しているキャンセル値Ｓに、前記所定数ｑに対するべき乗演算Ｓ＾ｑを行い、当該べき乗演算Ｓ＾ｑを再度キャンセル値Ｓとして保持する
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項８】
前記取得部は、
第１のシード値Ｕと、前記値ｖに対する前記第１のシード値Ｕのべき演算（ｖ＆２）＆Ｕのキャンセル値である第２のシード値Ｖとを予め記憶しており、
前記取得部は、
前記第１のグループに対する演算に先立って、乱数ｒを生成し、前記第１、及び第２のシード値Ｕ、Ｖにおいて、乱数ｒに対するべき乗演算を施した値それぞれを乱数Ｒ及びキャンセル値Ｓとして保持する
ことを特徴とする請求項７に記載の情報セキュリティ装置。
【請求項９】
前記各グループは、１個のウィンドウからなる
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項１０】
前記ウィンドウは、１ビット長である
ことを特徴とする請求項５に記載の情報セキュリティ装置。
【請求項１１】
前記取得部は、
さらに、前記第１のウィンドウから前記第２のウィンドウまでに存在する第３のウィンドウを対象とする際に、前記乱数Ｒを前記乱数Ｒとは異なる乱数Ｒ’を取得し、
さらに、前記第３ウィンドウから当該第２ウィンドウまでに前記乱数Ｒ’に対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓ’を取得し、前記キャンセル値Ｓとともに保持し、
前記ウィンドウ演算部は、
前記第３のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒ’と、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、
前記第２のウィンドウにおいて、さらに、前記キャンセル値Ｓ’を用いたウィンドウ演算による演算値を取得する
ことを特徴とする請求項３に記載の情報セキュリティ装置。
【請求項１２】
前記取得部は、
前記キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め保持することにより、前記前記キャンセル値Ｓ及びＳ’を保持し、
前記取得部は、
前記第２のウィンドウを演算対象とする際に、前記値Ｔを取得することにより、前記キャンセル値Ｓ及びＳ’を取得する
ことを特徴とする請求項１１に記載の情報セキュリティ装置。
【請求項１３】
前記取得部は、
前記キャンセル値Ｓ及びＳ’とを予め保持しており、
前記キャンセル値Ｓ及びＳ’を用いた基本演算を施して値Ｔを算出して取得することにより、前記キャンセル値Ｓ及びＳ’を取得する
ことを特徴とする請求項１１に記載の情報セキュリティ装置。
【請求項１４】
前記群は、前記所定の集合を値ｎを法とする剰余体とし、基本演算を乗算とし、
前記元Ｘは、前記剰余体に含まれる値であり、
前記桁上演算は、前記剰余体上のべき乗算であり、
前記基本演算及び前記ウィンドウ演算は、前記剰余体上の乗算であり、
前記主演算部は、前記剰余体上のべき乗算及び前記剰余体上の乗算を用いて、前記べき乗演算ｄ＆Ｘ＝Ｘ＾ｄを算出する
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項１５】
前記群は、前記所定の集合を楕円曲線上の点の集合とし、、基本演算を加算とし、
前記元Ｘは、楕円曲線上の点であり、
前記桁上演算は、前記楕円曲線上のべき倍演算であり、
前記基本演算及び前記ウィンドウ演算は、前記楕円曲線上の加算であり、
前記主演算部は、前記楕円曲線上のべき倍演算及び前記楕円曲線上の加算を用いて、前記べき倍演算ｄ＆Ｘ＝ｄ＊Ｘを算出する
ことを特徴とする請求項１に記載の情報セキュリティ装置。
【請求項１６】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられる方法であって、
値ｄを取得する取得ステップと、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算ステップとを含み、
前記主演算ステップは、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする方法。
【請求項１７】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられるコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記記録媒体は、コンピュータに対して、
値ｄを取得する取得ステップと、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算ステップとを実行させるためのコンピュータプログラムを記録し、
前記主演算ステップは、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする記録媒体。
【請求項１８】
所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置で用いられる集積回路であって、
値ｄを取得する取得手段と、
ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、
前記主演算手段は、
第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、
第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いる
ことを特徴とする集積回路。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号処理を実行する際の電力消費量を計測することで暗号モジュールに埋め込まれている秘密の情報を解析する攻撃に対して、解析を困難にする技術に関するものである。
【背景技術】
【０００２】
近年、ハードウェアあるいはソフトウェアで実装された暗号モジュールが、暗号処理を行う際の副情報を手がかりにして、暗号鍵の解析を行う解読法が各種考案されている。不正な第三者が暗号鍵の解析し、秘密鍵を解読すると、解読された秘密鍵を用いて、正当な利用者になりすまして、秘密鍵を用いて不正行為を働くことができる。
例えば、暗号鍵の解析を行う解読法としては、タイミング攻撃と呼ばれる解析方法がある。タイミング攻撃と呼ばれる解析方法では、暗号モジュールが暗号処理に要する時間が、暗号処理に用いている暗号鍵の値により、わずかではあるが異なることを利用して、暗号鍵の解析を行う。即ち、タイミング攻撃においては、暗号処理を行う際の処理時間という副情報を利用して、暗号鍵の解読を行っている。そのような解読法の中でも、暗号処理を行う際の電力消費量を副情報として、解読を行う解読方法は、Ｓｉｍｐｌｅ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ（単純電力解析攻撃）やＤｉｆｆｅｒｅｎｔｉａｌ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ（差分電力解析攻撃）といった各種の方法が考案されている。これらの解読法は、近年、高性能な計測機器が安価で手に入るようになった背景もあって、ＩＣカードのような暗号が実装された実際の製品に対しても解析が可能であることが報告されている。以下の記述では、上記のような暗号処理時における暗号モジュールの電力消費量の変化、すなわち、電力波形を手がかりにして、暗号鍵を解析する解読方法を総称して、「電力解析攻撃」と呼ぶ。タイミング攻撃については、非特許文献１、電力解析攻撃については、非特許文献２が詳しい。
【０００３】
以下で、ＲＳＡ暗号への単純電力解析攻撃について説明する。ＲＳＡ暗号については、非特許文献３が詳しい。
＜ＲＳＡ暗号の単純電力解析攻撃＞
ＲＳＡ暗号の復号化処理において、素数ｐ、ｑの積ｎ、ｎ未満の正整数である暗号文ｃと、正整数である秘密鍵ｄに対し、ｃ＾ｄ  ｍｏｄ  ｎの計算を行う。この計算方法として例えば、非特許文献４の９ページにおけるバイナリ法が知られている。以下では、バイナリ法について説明する。ｄ＝ｄ０＋ｄ１×２＋ｄ２×２＾２＋・・・＋ｄ＾（ｌｅｎ−１）×２＾（ｌｅｎ−１）、ｉ＝０，１，・・・，ｌｅｎ−１に対しｄｉ＝０または１とする。ここで、ｌｅｎはｄのビット数、"×"は整数の乗算、ｘ＾ｙはｘのｙ乗を示している。
【０００４】
（バイナリ法）
・ステップ１−１：ｉ←ｌｅｎ−２，  ｚ←ｃ
・ステップ１−２：ｚ←ｚ＾２  ｍｏｄ  ｎ
・ステップ１−３：ｄｉが１であるかチェック。ｄｉ＝１である場合は、ｚ←ｚ×ｃ  ｍｏｄ  ｎ。
【０００５】
・ステップ１−４：ｉ←ｉ−１。ｉが負であるかチェック。負である場合は、ｚを出力。それ以外は、ステップ１−２へ移る。
上記方法では、ステップ１−２、１−３、１−４をループとして繰り返し計算している。このループ内で、ｄｉ（ｉ＝１，２，・・・，ｌｅｎ−１）に対して、ｄｉ＝１の場合は、ｚの２乗算とｃによる乗算を行い、ｄｉ＝０の場合は、ｚの２乗算のみを実行する。ｎは大きな数、例えば、１０２４ビットの整数である。通常は、２乗算は乗算より、計算の処理の効率化が図ることが可能なため、高速に処理可能になる。その場合、２乗算と乗算は処理が異なるため、電力波形が異なる。
【０００６】
したがって、電力波形を計測することにより、２乗算、乗算の演算の順序を解析することが可能になる。さらに、ｄｉによりループ内の処理が異なることを利用して、その順序からｄｉの値を求められる。まとめると、以下のステップにより、単純電力解析攻撃が可能になる。
（バイナリ法の単純電力解析攻撃）
・ステップ２−１：暗号文ｃを復号化し、その処理における電力波形を計測。
【０００７】
・ステップ２−２：上記電力波形より、２乗算、乗算の演算の順序を求める。
・ステップ２−３：上記順序より、ビットｄｉ（ｉ＝１，２，・・・，ｌｅｎ−１）を求める。
＜従来のＲＳＡ暗号の単純電力解析攻撃対策＞
上記の単純電力解析攻撃では、バイナリ法のステップ１−３においてｄｉ＝１のときのみ乗算を行うことを利用して秘密鍵の解析を行っている。
【０００８】
そこで、ｄｉ＝０のときに、１をｚに乗じる乗算をすることで、結果は変化しないが、ｄｉ＝０のときにも乗算を行うことで、２乗算、乗算の演算順序がｄの値に依存しなくなる、単純電力解析攻撃の対策方法も考案されている（非特許文献１参照）。
上述したＲＳＡ暗号の単純電力解析攻撃対策では、ｄｉ＝１のときにｃ、ｄｉ＝０のときに１を乗じる乗算を行い、乗数が異なる。このことを利用してｄｉが０であるか１であるかを解析する攻撃（ＢｉｇＭａｃ攻撃と呼ばれる）が考案されている（非特許文献５参照）。この攻撃を使用すると、上述した単純電力解析攻撃対策をしても、ｄの値が解析されてしまう。なぜなら、乗数が同一の場合には、得られる電力波形が一致する部分が存在する可能性が高いので、単純電力解析により得られる乗算の電力波形は２種類に分類することができる（例えば、グループＡとグループＢ）。このとき、グループＡとグループＢｄｉのビット値との対応は２つの場合しかない。グループＡにはｄｉ＝１、グループＢにはｄｉ＝０がそれぞれ対応する場合と、グループＡにはｄｉ＝０、グループＢにはｄｉ＝１がそれぞれ対応する場合である。これら２つの場合それぞれに対して、例えば、再度暗号文を復号することで、どちらの対応付けが正しいかが分かる、つまり秘密鍵を取得することができる。
【０００９】
そこで、特許文献１では、秘密鍵の解析を困難にするために、秘密鍵ｄを、所定のビット数からなる複数のブロックに分割し、バイナリ法における乗算時においてｄｉの値に関わらず値ｚにブロック毎に異なる乱数を乗算し、全てのｄｉに対する２乗算及び乗算の演算が終了した後に乗算した乱数を当該乱数のキャンセル値を用いてキャンセルする技術が開示されている。
【００１０】
特許文献１では、暗号文ｃに対するｃ＾ｄの演算を行う前に、値Ｒ、及びＳを求める。ここで、Ｒ×Ｓ  ｍｏｄ  ｎ  ＝１である。
そして、各ｄｉに対して２乗算及び乗算の演算を実行する。このとき、乗算の演算に用いる乱数がブロック毎に異なるように、値Ｒを用いて当該乱数を設定する。例えば、ｍ番目のブロックには乱数Ｒ＾ｍを用いて乗算することで、ブロック毎に異なる乱数を用いることができる。
【００１１】
全てのブロックに対して２乗算及び乗算の演算が終了した後に、値Ｓを用いて、乱数Ｒよる影響を除去することで、ｃ＾ｄが得られる。
この技術によると、ブロック毎には、ｄｉ＝０、１の対応付けが２つのパターンが存在する。しかしながら、２つの対応付けのパターンが全ブロックにおいて存在するので、秘密鍵ｄ全体に対しては、２＾（ブロック数）のパターンが存在することとなる。従って、秘密鍵の解析者は、２＾（ブロック数）のパターン全てをチェックしなければならないので、秘密鍵の解析は困難となる。
【特許文献１】特開２０００−１６５３７５号公報
【非特許文献１】Ｐａｕｌ  Ｋｏｃｈｅｒ．  Ｔｉｍｉｎｇ  ａｔｔａｃｋｓ  ｏｎ  ｉｍｐｌｅｍｅｎｔａｔｉｏｎｓ  ｏｆ  Ｄｉｆｆｉｅ−Ｈｅｌｌｍａｎ，  ＲＳＡ，  ＤＳＳ，  ａｎｄ  ｏｔｈｅｒ  ｓｙｓｔｅｍｓ．  Ｉｎ  Ｎｅａｌ  Ｋｏｂｌｉｔｚ，  ｅｄｉｔｏｒ，  ＣＲＹＰＴＯ'９６，    ＬＮＣＳ  １１０９，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  １９９６，  ｐｐ．１０４−１１３．
【非特許文献２】Ｐ．  Ｋｏｃｈｅｒ，  Ｊ．  Ｊａ＿ｅ，  ａｎｄ  Ｂ．  Ｊｕｎ，  "Ｄｉ＿ｅｒｅｎｔｉａｌ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ，" Ａｄｖａｎｃｅｓ  ｉｎ  Ｃｒｙｐｔｏｌｏｇｙ  −ＣＲＹＰＴＯ  '９９，  ＬＮＣＳ，  １６６６  ，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  １９９９，  ｐｐ．３８８−３９７．
【非特許文献３】岡本龍明、山本博資、「現代暗号」、産業図書（１９９７年）
【非特許文献４】Ｈ．Ｃｏｈｅｎ，"Ａ  Ｃｏｕｒｓｅ  ｉｎ  Ｃｏｍｐｕｔａｔｉｏｎａｌ  Ａｌｇｅｂｒａｉｃ  Ｎｕｍｂｅｒ  Ｔｈｅｏｒｙ"，ＧＴＭ  １３８，Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，１９９６，ｐ９
【非特許文献５】Ｃ．Ｄ．Ｗａｌｔｅｒ，"Ｓｌｉｄｉｎｇ  ｗｉｎｄｏｗｓ  ｓｕｃｃｕｍｂｓ  ｔｏ  Ｂｉｇ  Ｍａｃ  Ａｔｔａｃｋ"，  ＣＨＥＳ２００１，  ＬＮＣＳ２１６２，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，  ２００１，  ｐｐ．２８６−２９９．
【非特許文献６】神永、渡邊、遠藤、大河内、"ＲＳＡ暗号の電力解析法による攻撃とその対策"、ＩＥＩＣＥ、Ｖｏｌ．  Ｊ８８−Ａ、Ｎｏ．５、ｐｐ．６０６−６１５、２００５
【発明の開示】
【発明が解決しようとする課題】
【００１２】
しかしながら、特許文献１に開示された技術では、全てのｄｉに対する２乗算及び乗算の演算が終了した後に乗算した乱数をキャンセルするので、その処理時間は大きなものとなる。なぜなら、例えば、先頭ビットｄ５１１に対する乗算の演算において乱数Ｒが出現すると、この乱数Ｒは、以降全てのビットに対する２乗算の演算に影響を及ぼし、その値はＲ＾（２＾（ｌｅｎ―１））となる。つまり、ｉ番目のビットｄｉにおいては乱数Ｒ＾ｍが出現し、以降全てのビットに対する２乗算の演算において、このＲ＾ｍも２乗算される。ここで、ｍは、ｄｉが属するブロックの番号である。そして、その結果、その値は、（Ｒ＾ｍ）＾（２＾（ｉ−１））となる。
【００１３】
つまり、値Ｓを用いて乱数Ｒの影響を除去するためには、各ｄｉに対して、当該ｄｉに対する乗算にて出現した乱数Ｒ＾ｍによる最終的な２乗算結果（Ｒ＾ｍ）＾（２＾（ｉ−１））のキャンセル値（Ｓ＾ｍ）＾（−２＾（ｉ−１））を算出し、それら全てを乗算する必要がある。
そのため、値Ｓを用いて乱数Ｒの影響を除去する処理の処理時間は大きなものとなるので、べき乗演算全体の処理時間も大きくなる。
【００１４】
本発明は、上記の問題に鑑みて、秘密の通信又は認証を行う際に算出されるべき乗倍値の演算処理の時間を従来よりも小さくすることのできる情報セキュリティ装置、方法、プログラム及び集積回路を提供することを目的とする。
【課題を解決するための手段】
【００１５】
上記目的を達成するために、本発明の一実施態様である、所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置は、値ｄを取得する取得手段と、ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、前記主演算手段は、第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いることを特徴とする。
【発明の効果】
【００１６】
上記の構成によると、情報セキュリティ装置は、ウィンドウ法を用いて対象データＸに対するべき演算ｄ＆Ｘを算出する過程において、第１のウィンドウで出現した乱数Ｒに対する桁上演算による影響を、第２のウィンドウにおけるウィンドウ演算にてキャンセル値Ｓを用いることで打ち消している。これにより、情報セキュリティ装置は、全てのウィンドウに対する演算が終了した後に従来のように乱数Ｒによる影響をキャンセルする値を算出するキャンセル処理を必要としないので、従来よりもべき演算全体の処理時間が小さくなる。
【発明を実施するための最良の形態】
【００１７】
本発明の一実施態様である、所定の集合及びその元を用いる基本元により定義された群において、元Ｘを用いた基本演算をｄ回繰り返すべき演算ｄ＆Ｘを行うことにより、所定の情報を安全かつ確実に処理する情報セキュリティ装置は、値ｄを取得する取得手段と、ウィンドウ法を用いて、値ｄのウィンドウ毎に、桁上演算と、当該ウィンドウのウィンドウ値及び元Ｘに基づくウィンドウ演算とを行うことにより、べき演算ｄ＆Ｘを行う主演算手段とを備え、前記主演算手段は、第１のウィンドウにおけるウィンドウ演算において、乱数Ｒを用い、第２のウィンドウにおけるウィンドウ演算において、前記第１ウィンドウから当該第２ウィンドウまでに前記乱数Ｒに対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓを用いることを特徴とする。
【００１８】
この構成によると、情報セキュリティ装置は、ウィンドウ法を用いて対象データＸに対するべき演算ｄ＆Ｘを算出する過程において、第１のウィンドウで出現した乱数Ｒに対する桁上演算による影響を、第２のウィンドウにおけるウィンドウ演算にてキャンセル値Ｓを用いることで打ち消している。これにより、情報セキュリティ装置は、全てのウィンドウに対する演算が終了した後に従来のように乱数Ｒによる影響をキャンセルする値を算出するキャンセル処理を必要としないので、従来よりもべき演算全体の処理時間が小さくなる。
【００１９】
ここで、前記情報セキュリティ装置は、さらに、べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施す処理手段を備えるとしてもよい。
この構成によると、情報セキュリティ装置は、べき演算ｄ＆Ｘの演算結果を用いて、情報を復号し、又は情報にデジタル署名を施すので、これら処理に要する処理時間は、従来よりも小さくなる。
【００２０】
ここで、前記第２ウィンドウは、前記第１ウィンドウから値ｖだけ先に存在し、前記キャンセル値Ｓは、べき演算（ｖ＆２）の演算結果に対する前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの逆数であり、前記主演算手段は、前記乱数Ｒと、前記キャンセル値Ｓとを取得する取得部と、変数Ｚを保持する変数保持部と、初期値として変数Ｚに単位元を設定する初期化部と、前記桁上演算により変数Ｚをウィンドウ幅だけ桁上げし、その結果を変数Ｚとする桁上演算部と、演算対象のウィンドウについて、そのウィンドウ値ｗ及び元Ｘに基づくべき演算値を取得し、少なくとも変数Ｚと取得したべき演算値とを用いて前記ウィンドウ演算を施して演算結果を変数Ｚとするウィンドウ演算部と、前記桁上演算部及びウィンドウ演算部に対して、全てのウィンドウについて、桁上演算とウィンドウ演算とを繰り返すように制御する制御部とを含み、前記ウィンドウ演算部は、前記第１のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、前記第２のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとするとしてもよい。
【００２１】
この構成によると、情報セキュリティ装置は、前記乱数Ｒに対する桁上演算による累積演算因数を、前記乱数Ｒのべき演算（ｖ＆２）＆Ｒの演算結果の逆数であるキャンセル値Ｓを用いて、確実に打ち消すことができる。なぜなら、乱数Ｒが出現してから第２のウィンドウにおける桁上演算までの間に、値ｖ分の桁上げが行われているので、第２のウィンドウでウィンドウ演算が行われる際には、乱数Ｒに対する桁上演算による演算結果は、（ｖ＆２）＆Ｒとなっている。従って、情報セキュリティ装置は、第２のウィンドウでキャンセル値Ｓを用いたウィンドウ演算にて、この値（ｖ＆２）＆Ｒを打ち消すことができる。
【００２２】
ここで、前記ウィンドウ演算部は、前記第１のウィンドウから連続するｉ個（ｉはｖより小さい値）のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと、前記乱数Ｒと、変数Ｚとに基づくウィンドウ演算を行い、前記第２のウィンドウから連続するｉ個のウィンドウからなるグループに対して、当該グループに含まれるウィンドウ毎に、そのウィンドウ値ｗ及び元Ｘに対するべき演算値ｗ＆Ｘと前記キャンセル値Ｓと、変数Ｚとに基づくウィンドウ演算を行うとしてもよい。
【００２３】
この構成によると、情報セキュリティ装置は、第１のウィンドウから連続するｉ個のウィンドウそれぞれに対して、乱数Ｒを用いたウィンドウ演算を行い、第２のウィンドウから連続するｉ個のウィンドウそれぞれに対して、キャンセル値Ｒを用いたウィンドウ演算を行うことで、値ｄの解析を困難にすることができる。また、第１のウィンドウから連続するｉ個のウィンドウそれぞれに対して、当該ウィンドウから値ｖだけ先のウィンドウは、第２のウィンドウから連続するｉ個のウィンドウからなるグループに含まれているので、第１のウィンドウから連続するｉ個のウィンドウ毎に出現した乱数Ｒそれぞれにおける桁上演算による影響を、値ｖだけ先のウィンドウにおけるウィンドウ演算にて確実に打ち消すことができる。
【００２４】
ここで、前記各ウィンドウに含まれるビット数は、ｕ（ｕは１以上の整数）であり、前記ウィンドウの個数は、ｌｅｎｄ／ｕ個であり、値ｌｅｎｄは、前記値ｄのビット長以上である２のべき数のうち最小の値であり、前記値ｖは、ｌｅｎｄ＝２ｖを満たし、前記第１のウィンドウは先頭ウィンドウであり、前記第２のウィンドウは先頭ウィンドウからｌｅｎｄ／２ｕ＋１番目に位置するウィンドウであり、先頭ウィンドウからｌｅｎｄ／２ｕ個のウィンドウ、及び先頭からｌｅｎｄ／２ｕ＋１番目のウィンドウから末尾のウィンドウまでのｌｅｎｄ／２ｕ個のウィンドウは、ｉ個のウィンドウからなる第１から第ｐのグループ、及び第ｐ＋１から第ｍのグループに分割され、前記取得部は、さらに、第１から第ｐのグループに対して、演算対象のグループから次グループに演算対象が変更されるときに、演算対象の変更直前に用いた乱数とは異なる乱数を取得し、前記ウィンドウ演算部は、第１から第ｐのグループそれぞれに対して、当該グループが演算対象である間は、当該グループに含まれるウィンドウそれぞれに対して、前記取得部にて取得された乱数を用いたウィンドウ演算による演算値を取得し、前記取得部は、第ｐ＋１から第ｍのグループに含まれる第ｍ’のグループを演算対象とする際に、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を取得し、前記ウィンドウ演算部は、前記第ｍ’のグループを演算対象としている間は、前記取得部にて取得されたキャンセル値を用いたウィンドウ演算による演算値を取得するとしてもよい。
【００２５】
この構成によると、情報セキュリティ装置は、第１から第ｐのグループそれぞれに対して、当該グループからｐ番目先のグループを対応付けている。これにより、情報セキュリティ装置は、第１から第ｐのグループそれぞれにおいて、ウィンドウ演算部のウィンドウ演算により出現した乱数に対する桁上演算部の桁上検算による演算結果を、ｐ番目先のグループにおいて当該乱数に対応するキャンセル値を用いることで、確実に除去することができる。
【００２６】
ここで、前記取得部は、ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを対応付けて予め記憶しており、前記第１から第ｐのグループそれぞれに対して、当該グループが演算対象となる際に現時点で未選択の１個以上の乱数から１個の乱数を選択することで、当該グループで用いる乱数を取得し、前記第ｍ’のグループに対して、第（ｍ’―ｐ）のグループにて用いた乱数に対応するキャンセル値を選択することで、当該第ｍ’のグループで用いるキャンセル値を取得するとしてもよい。
【００２７】
この構成によると、情報セキュリティ装置は、ｐ個の互いに異なる乱数と、乱数それぞれに対応するキャンセル値とを予め記憶しているので、対象となるグループが変更されるたびに、乱数又はキャンセル値を生成する必要がないので、べき演算ｄ＆Ｘを算出する処理時間を短くすることができる。
ここで、前記取得部は、前記異なる乱数の取得時において、現時点で保持している乱数Ｒに、所定数ｑに対するべき乗演算Ｒ＾ｑを行い、当該べき乗演算Ｒ＾ｑの演算結果を再度乱数Ｒとして保持し、キャンセル値の取得時において、現時点で保持しているキャンセル値Ｓに、前記所定数ｑに対するべき乗演算Ｓ＾ｑを行い、当該べき乗演算Ｓ＾ｑを再度キャンセル値Ｓとして保持するとしてもよい。
【００２８】
この構成によると、情報セキュリティ装置は、保持している乱数又はキャンセル値を用いることで、容易に異なる乱数又はキャンセル値を生成することができる。
ここで、前記取得部は、第１のシード値Ｕと、前記値ｖに対する前記第１のシード値Ｕのべき演算（ｖ＆２）＆Ｕのキャンセル値である第２のシード値Ｖとを予め記憶しており、前記取得部は、前記第１のグループに対する演算に先立って、乱数ｒを生成し、前記第１、及び第２のシード値Ｕ、Ｖにおいて、乱数ｒに対するべき乗演算を施した値それぞれを乱数Ｒ及びキャンセル値Ｓとして保持するとしてもよい。
【００２９】
この構成によると、情報セキュリティ装置は、第１及び第２のシード値を予め記憶することにより、記憶容量を節約することができる。また、情報セキュリティ装置は、第１のグループに対する演算に先立って、乱数ｒを生成し、生成した乱数ｒと、第１及び第２のシード値とを用いて、乱数Ｒ及びキャンセル値Ｓを生成している。これにより、情報セキュリティ装置は、複数の対象データ毎に、第１のグループに用いられる乱数及び当該乱数に対応するキャンセル値を変更することができる。したがって、秘密鍵の解析者が複数の対象データを用いて、これら対象データに対する電力波形から秘密鍵を解析しようとしても、対象データ毎に主演算手段に用いられる乱数が異なるので、その電力波形も異なり、値ｄの解析が困難となる。
【００３０】
ここで、前記各グループは、１個のウィンドウからなるとしてもよい。
この構成によると、情報セキュリティ装置は、ウィンドウ毎に異なる乱数を用いて演算を行う。つまり、ウィンドウ毎に電力波形が異なるので、値ｄの解析が困難となる。
ここで、前記ウィンドウは、１ビット長であるとしてもよい。
この構成によると、情報セキュリティ装置は、秘密鍵を１ビット毎に分割してべき演算ｄ＆Ｘを算出するバイナリ法においても、全てのビットに対する演算が終了した後に乱数Ｒの影響を除去するキャンセル処理を必要としない。つまり情報セキュリティ装置は、バイナリ法を用いた場合でも、従来よりもべき演算ｄ＆Ｘに対する処理時間が小さくなる。
【００３１】
ここで、前記取得部は、さらに、前記第１のウィンドウから前記第２のウィンドウまでに存在する第３のウィンドウを対象とする際に、前記乱数Ｒを前記乱数Ｒとは異なる乱数Ｒ’を取得し、さらに、前記第３ウィンドウから当該第２ウィンドウまでに前記乱数Ｒ’に対する桁上演算により累積された累積演算因数を打ち消すキャンセル値Ｓ’を取得し、前記キャンセル値Ｓとともに保持し、前記ウィンドウ演算部は、前記第３のウィンドウにおいて、そのウィンドウ値ｗ及び元Ｘに対するべき演算ｗ＆Ｘの演算結果と、前記乱数Ｒ’と、変数Ｚとに基づくウィンドウ演算を行ってその演算結果を変数Ｚとし、前記第２のウィンドウにおいて、さらに、前記キャンセル値Ｓ’を用いたウィンドウ演算による演算値を取得するとしてもよい。
【００３２】
この構成によると、情報セキュリティ装置は、第３のウィンドウにて乱数Ｒとは異なる乱数Ｒ’をウィンドウ演算部のウィンドウ演算において出現させることで、値ｄの解析をさらに困難にすることができる。また、情報セキュリティ装置は、第２のウィンドウにおいて乱数Ｒ及びＲ’に対する桁上演算による演算結果を除去するので、従来よりもべき演算ｄ＆Ｘに対する処理時間を小さくすることもできる。
【００３３】
ここで、前記取得部は、前記キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め保持することにより、前記前記キャンセル値Ｓ及びＳ’を保持し、前記取得部は、前記第２のウィンドウを演算対象とする際に、前記値Ｔを取得することにより、前記キャンセル値Ｓ及びＳ’を取得するとしてもよい。
この構成によると、情報セキュリティ装置は、キャンセル値Ｓ及びＳ’に対して基本演算が施された値Ｔを予め記憶しているので、べき演算ｄ＆Ｘの算出時にキャンセル値Ｓ及びＳ’を算出する必要がないので、べき演算ｄ＆Ｘに対する処理時間を短くすることができる。
【００３４】
ここで、前記取得部は、前記キャンセル値Ｓ及びＳ’とを予め保持しており、前記キャンセル値Ｓ及びＳ’を用いた基本演算を施して値Ｔを算出して取得することにより、前記キャンセル値Ｓ及びＳ’を取得するとしてもよい。
この構成によると、情報セキュリティ装置は、キャンセル値Ｓ及びＳ’とを予め記憶しているので、べき演算ｄ＆Ｘの算出時に、キャンセル値Ｓ及びＳ’を算出する必要がないので、べき演算ｄ＆Ｘに対する処理時間を短くすることができる。
【００３５】
１．実施の形態１
以下、本発明の実施の形態１におけるべき乗演算装置１０００について、図面を参照しながら説明する。
１．１  準備
べき乗演算装置１０００は、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用される。以下で、ＲＳＡ暗号方式及びＲＳＡ署名方式について説明する。
【００３６】
（１）ＲＳＡ暗号方式
（１−１）鍵の生成
次に示すようにして公開鍵及び秘密鍵を計算する。
（手順１−１）
ランダムに大きい素数ｐ，ｑを選択し、その積ｎ＝ｐ×ｑを計算する。
【００３７】
（手順１−２）
（ｐ−１）及び（ｑ−１）の最小公倍数Ｌ＝ＬＣＭ（ｐ−１，ｑ−１）を計算する。
（手順１−３）
Ｌと互いに素でＬより小さい自然数ｅをランダムに選ぶ。
１≦ｅ≦Ｌ−１、ＧＣＤ（ｅ，Ｌ）＝１
ここで、ＧＣＤ（ｅ，Ｌ）は、ｅとＬの最大公約数を示している。
【００３８】
（手順１−４）
ｅ×ｄ＝１    ｍｏｄ    Ｌを満たすｄを計算する。
ＧＣＤ（ｅ，Ｌ）＝１より、このようなｄは必ず存在する。このようにして、得られた整数ｅ及び整数ｎが、公開鍵である。また、整数ｄが、秘密鍵である。ここで、ｘ  ｍｏｄ  ｙは、ｘをｙで割った余りを示す。
【００３９】
（１−２）暗号文の生成
公開鍵である整数ｅ及び整数ｎを用いて、平文ｍに暗号演算を施して暗号文ｃを計算する。
ｃ＝ｍ＾ｅ      ｍｏｄ    ｎ
なお、この明細書において、演算子＾は、べき乗を示す。例えば、Ａ＾ｘは、ｘ＞０のときはＡをｘ回乗じたものを示す。
【００４０】
（１−３）復号文の生成
秘密鍵である整数ｄを用いて、暗号文ｃに復号演算を施して復号文ｍ'を計算する。
ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎ
なお、
ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎ
＝（ｍ＾ｅ  ）＾ｄ    ｍｏｄ  ｎ
＝ｍ＾（ｅ×ｄ    ｍｏｄ  Ｌ）    ｍｏｄ  ｎ
＝ｍ＾１    ｍｏｄ  ｎ
＝ｍ    ｍｏｄ  ｎ
であるので、復号文ｍ'は、平文ｍと一致する。
【００４１】
べき乗演算装置１０００は、この復号文の生成における上記のｃからｍ'を計算する箇所で使用する。このとき、べき乗演算装置１０００において対象データをｃとして、秘密鍵ｄを使用して、ｍ'＝ｃ＾ｄ    ｍｏｄ  ｎを計算する。
なお、ＲＳＡ暗号については、非特許文献３の１１０〜１１３ページに詳しく説明されている。
【００４２】
（２）ＲＳＡ署名方式
（２−１）鍵の生成
鍵の生成方法については、ＲＳＡ暗号方式と同様である。
（２−２）署名生成
メッセージデータＤに対して、以下のように署名データＳを計算する。
【００４３】
まず、ハッシュ関数Ｈａｓｈを用いて、メッセージデータＤのハッシュ値ｈ＝Ｈａｓｈ（Ｄ）を計算する。
次に、秘密鍵である整数ｄを用いて、ハッシュ値ｈをｄ乗して、署名データＳを計算する。
Ｓ＝ｈ＾ｄ  ｍｏｄ  ｎ
（２−３）署名検証
署名データＳがメッセージデータＤの正しい署名であるかを、以下のように検証する。
【００４４】
Ｈａｓｈ（Ｄ）とＳ＾ｅ  ｍｏｄ  ｎが等しいか否かを確認する。等しい場合は、署名データＳが正しい署名であるとして、受理する。等しくない場合は、署名データＳが正しくない署名であるとして、拒否する。
べき乗演算装置１０００は、上記の署名生成におけるｈからＳを計算する箇所で使用する。このとき、べき乗演算装置１０００において対象データをｈとして、秘密鍵ｄを使用して、Ｓ＝ｈ＾ｄ    ｍｏｄ  ｎを計算する。
【００４５】
なお、ＲＳＡ署名については、非特許文献３の１７５〜１７６ページに詳しく説明されている。
１．２  べき乗演算装置１０００の構成
図１は、べき乗演算装置１０００の構成を示す図である。
べき乗演算装置１０００は、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。
【００４６】
べき乗演算装置１０００は、図１にて示すように、入出力部１０１０と、秘密鍵格納部１０２０と、カウンタ格納部１０３０と、カウンタ初期化部１０４０と、カウンタ更新部１０５０と、第１のカウンタ判定部１０６０と、第２のカウンタ判定部１０７０と、第３のカウンタ判定部１０８０と、ビット判定部１０９０と、乗算部１１００−０〜１１００−３１と、２乗算部１１１０と、中間値格納部１１２０と、乗数群格納部１１３０と、乱数群格納部１１４０と、乗数群設定部１１５０−０〜１１５０−３１と、乗数群更新部１１６０と、乱数選択情報生成部１１７０とから構成されている。
【００４７】
なお、以下の説明において、記述されるｘ＿ｙは、ｘに下付きインデックスｙが付けられていることを示す。
（１）中間値格納部１１２０
中間値格納部１１２０は、対象データＸと、べき乗演算時における中間値Ｚとを格納する領域を有している。
【００４８】
（２）入出力部１０１０
入出力部１０１０は、対象データＸを外部から受け取ると、受け取った対象データＸを中間値格納部１１２０へ格納する。
入出力部１０１０は、中間値Ｚに初期値として値“１”を設定して、中間値格納部１１２０へ格納する。
【００４９】
入出力部１０１０は、対象データＸのべき乗演算が終了すると、演算が終了した旨を第１のカウンタ判定部１０６０から受け取る。入出力部１０１０は、その後、中間値格納部１１２０に格納されている中間値Ｚをべき乗演算結果として出力する。
（３）秘密鍵格納部１０２０
秘密鍵格納部１０２０は、秘密鍵ｄを格納している。
【００５０】
なお、秘密鍵ｄは、５１２ビットの整数であるとする。
（４）乗数群格納部１１３０
乗数群格納部１１３０は、乗算部１１００−０〜１１００−３１で使用する乗数群ＭＴ＿０〜ＭＴ＿３１を格納する。
具体的には、乗数群格納部１１３０は、図２にて示すように、乗数値Ｘ＿ｉ０及びＸ＿ｉ１からなる乗数群ＭＴ＿ｉを格納している。ここで、ｉは、０以上３１以下の整数である。
【００５１】
（５）乱数群格納部１１４０
乱数群格納部１１４０は、乱数群ＲＴ＿０〜ＲＴ＿１５を格納する。
具体的には、乱数群格納部１１４０は、図３にて示すように、乱数Ｒ＿ｉと乱数除去数Ｓ＿ｉとからなる乱数群ＲＴ＿ｉを格納している。ここで、ｉは０以上１５以下の整数である。
【００５２】
また、乱数Ｒ＿ｉと乱数除去数Ｓ＿ｉは、以下の関係を満たす。
Ｓ＿ｉ＝Ｒ＿ｉ＾（−２＾２５６）  ｍｏｄ  ｎ
つまり、Ｒ＿ｉ＾（２＾２５６）  ×  Ｓ＿ｉ  ＝  １の関係を満たしている。ここで、ｎはＲＳＡ暗号における大きな素数ｐ，ｑの積である。
（６）カウンタ格納部１０３０
カウンタ格納部１０３０は、べき乗演算時に用いるカウンタ（ｃｏｕｎｔ）の値を格納する。
【００５３】
（７）カウンタ初期化部１０４０
カウンタ初期化部１０４０は、べき乗演算の開始時において、カウンタｃｏｕｎｔを初期値（ｌｅｎｄ−１）に設定する。
ここで、上述したように、ｌｅｎｄは秘密鍵ｄのビットサイズであり、本実施の形態では、ｌｅｎｄ＝５１２である。なお、ここではｌｅｎｄは秘密鍵ｄのビットサイズそのものとしているが、秘密鍵ｄとして入力可能なビット数であってもよい。例えば、秘密鍵ｄのビットサイズとしては５１２ビットを想定しているが、実際には秘密鍵ｄのビットサイズは５１２より小さいビット数、例えば、５１０ビットであってもよい。この場合は、秘密鍵ｄとして入力可能なビット数は、ｌｅｎｄ＝５１２である。つまり、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２のべき数であればよく、例えば、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２のべき数のうち最小の数である。また、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２の倍数であってもよく、例えば、ｌｅｎｄは、秘密鍵ｄのビットサイズ以上である２の倍数のうち最小の数である。
【００５４】
（８）カウンタ更新部１０５０
カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値を更新する。
具体的には、カウンタ更新部１０５０は、
第２のカウンタ判定部１０７０、第３のカウンタ判定部１０８０及び乗数群設定部１１５０−０〜１１５０−３１からカウンタｃｏｕｎｔの値の更新を行う旨の更新指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。
【００５５】
（９）第１のカウンタ判定部１０６０
第１のカウンタ判定部１０６０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が０であるかを判定する。
０であると判定する場合には、第１のカウンタ判定部１０６０は、入出力部１０１０へ演算が終了した旨を通知する。
【００５６】
０でないと判断する場合には、第１のカウンタ判定部１０６０は、第３のカウンタ判定部１０８０へ判定を行う旨の指示を通知する。
（１０）第３のカウンタ判定部１０８０
第３のカウンタ判定部１０８０は、第１のカウンタ判定部１０６０から判定を行う旨の指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が１６で割り切れるか否か、すなわち、１６の倍数であるか否かを判定する。
【００５７】
１６で割り切れると判定する場合、第３のカウンタ判定部１０８０は、カウンタの更新指示をカウンタ更新部１０５０へ通知する。
１６で割り切れないと判断する場合、第３のカウンタ判定部１０８０は、第２のカウンタ判定部１０７０へ判定を行う旨の指示を通知する。
（１１）第２のカウンタ判定部１０７０
第２のカウンタ判定部１０７０は、第３のカウンタ判定部１０８０から判定を行う旨の指示を受け取ると、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、すなわち、８の倍数であるか否かを判定する。
【００５８】
カウンタｃｏｕｎｔの値が８で割り切れると判定する場合には、第２のカウンタ判定部１０７０は、乗数群更新部１１６０へ乗数群格納部１１３０にて格納されている乗数群ＭＴ＿ｉの更新を行う旨の更新指示を通知する。ここで、ｉは、（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
カウンタｃｏｕｎｔの値が８で割り切れないと判定する場合には、第２のカウンタ判定部１０７０は、カウンタの更新指示をカウンタ更新部１０５０へ通知する。
【００５９】
（１２）ビット判定部１０９０
ビット判定部１０９０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを用いて、秘密鍵格納部１０２０に格納されている秘密鍵ｄのｃｏｕｎｔビット目の値が０か１のどちらであるかを判定する。
ここで、秘密鍵ｄのｃｏｕｎｔビット目とは、下位のビットから順番に数えたときの順番、つまりｃｏｕｎｔ番目を示している。ただし、最下位ビットを０ビット目（０番目）としている。
【００６０】
（１３）乗算部１１００−０〜１１００−３１
乗算部１１００−０〜１１００−３１は同様の動作を行うので、ここでは、乗算部１１００−ｉについて説明する。なお、ｉは０以上３１以下の整数である。
乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉに格納されている乗数値Ｘ＿ｉ０または、乗数値Ｘ＿ｉ１を乗算し、その乗算結果を中間値格納部１１２０に格納する。
【００６１】
具体的には、乗算部１１００−ｉは、ビット判定部１０９０によるｃｏｕｎｔ番目のビットが０であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ０とを乗算する。また、乗算部１１００−ｉは、ビット判定部１０９０によるｃｏｕｎｔ番目のビットが１であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ１とを乗算する。
ここで、乗算部１１００−ｉは、中間値Ｚと乗数値Ｘ＿ｉ０を乗算する場合、Ｚ←Ｚ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。また、乗算部１１００−ｉは、中間値Ｚと乗数値Ｘ＿ｉ１を乗算する場合、Ｚ←Ｚ×Ｘ＿ｉ１  ｍｏｄ  ｎを実行する。ここで、←は右の計算結果を左の変数へ代入することを意味する。
【００６２】
（１４）２乗算部１１１０
２乗算部１１１０は、中間値格納部１１２０に格納されている中間値Ｚを２乗し、２乗した結果を中間値格納部１１２０に格納する。
具体的には、２乗算部１１１０は、Ｚ←Ｚ＾２  ｍｏｄ  ｎを実行する。
（１５）乱数選択情報生成部１１７０
乱数選択情報生成部１１７０は、乗数群設定部１１５０−１〜１１５０−３２において使用する乱数または乱数除去数を選択するための情報である乱数選択情報を生成する。
【００６３】
乱数選択情報生成部１１７０は、生成した乱数選択情報を一時的に保持する。
具体的には、乱数選択情報生成部１１７０は、乱数Ｒ＿ｋまたはＳ＿ｋの添え字ｋを順番に並べた配列を生成する。ここで、この配列は、１６個の要素が０から１５までのすべての値を含むように配置し、その１６個の要素の２回の繰り返しである３２個の要素を持つようにする。
【００６４】
例えば、乱数選択情報生成部１１７０は、配列ＲＳＩ（＝｛１４，１２，１１，２，４，８，９，０，１，６，１０，７，１３，３，１５，５，１４，１２，１１，２，４，８，９，０，１，６，１０，７，１３，３，１５，５｝）を生成する。ここで、当該配列は０番から始まるものとし、ｉ番目の要素をＲＳＩ＿ｉとする。この例の場合、０番目の要素（ＲＳＩ＿０）は"１４"である。また、この配列はランダムに発生させる必要がある。
【００６５】
ここで、ランダムに発生させる方法の例を、図４にて示す流れ図を用いて説明する。
乱数選択情報生成部１１７０は、０から１６！−１（＝２０，９２２，７８９，８８７，９９９）までの値のうち１つの値ＲＳＩＳをランダムに発生する（ステップＳ５）。
乱数選択情報生成部１１７０は、発生した値ＲＳＩＳをＹに設定し（Ｙ←ＲＳＩＳ）、全ての値が１６である１６個の要素からなる配列Ｖ（Ｖ←｛１６，１６，・・・，１６｝）を設定する（ステップＳ１０）。ここで、配列Ｖは０番から始まるものとし、ｉ番目の要素をＶ＿ｉとする。
【００６６】
乱数選択情報生成部１１７０は、カウンタｃｎｔを１６に設定する（ステップＳ１５）。
乱数選択情報生成部１１７０は、Ｙをｃｎｔで割った商をＹＳ、余りをＹＲとする（ステップＳ２０）。
乱数選択情報生成部１１７０は、配列Ｖの１６の値を持った要素の中で、ＹＲ番目の要素をｃｎｔ−１に設定する（ステップＳ２５）。
【００６７】
乱数選択情報生成部１１７０は、ステップＳ２０で得られた商ＹＳをＹに設定する（ステップＳ３０）。つまり、乱数選択情報生成部１１７０は、Ｙ←ＹＳを実行する。
乱数選択情報生成部１１７０は、ｃｎｔの値が２であるか否かを判定する（ステップＳ３５）。
ｃｎｔの値が２でないと判定する場合には（ステップＳ３５における「ＮＯ」）、乱数選択情報生成部１１７０は、カウンタｃｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｎｔの値として設定し（ステップＳ４０）、ステップＳ２０へ戻る。つまり、乱数選択情報生成部１１７０は、ｃｎｔ←ｃｎｔ−１を実行する。
【００６８】
ｃｎｔの値が２であると判定する場合には（ステップＳ３５における「ＹＥＳ」）、乱数選択情報生成部１１７０は、配列Ｖの各要素において値“１６”をもつ要素に対して、値“０”を設定する（ステップＳ４５）。
乱数選択情報生成部１１７０は、０以上１５以下の整数であるｉそれぞれに対して、ＲＳＩ＿ｉ及びＲＳＩ＿（ｉ＋１６）に、Ｖ＿ｉの値を設定し（ＲＳＩ＿ｉ←Ｙ＿ｉ、ＲＳＩ＿（ｉ＋１６）←Ｙ＿ｉ）、配列ＲＳＩ（＝｛ＲＳＩ＿０、ＲＳＩ＿１、・・・、ＲＳＩ＿３１｝）を一時的に保持する（ステップＳ５０）。
【００６９】
上記にて示す方法では、乱数選択情報生成部１１７０は、０から１６！−１までの値のうち１つの値ＲＳＩＳをランダムに発生し、以下の関係を満たすようにＲＳＩＳをＴ＿ｉに変換する。Ｔ＿ｉはｃｎｔがｉときのステップＳ２０にて得られる値ＹＲを示す。
ＲＳＩＳ＝（１６×１５×・・・×３）×Ｔ＿２＋・・・＋１６×１５×Ｔ＿１４＋１６×Ｔ＿１５＋Ｔ＿１６
ここで、Ｔ＿ｉは、０以上ｉ−１の整数であり、ｉは０以上１５以下の整数である。
【００７０】
この変換は１対１対応する。さらに、Ｔ＿ｉを用いて、配列Ｖの１６の値を持った要素の値を１５から１に置き換え、残りの１６の値を持った要素の値を０に置き換えることで、ランダムな１６個の要素を持つ配列を生成している。その配列を二つ並べることで、乱数選択情報を生成できる。
なお、上記で述べた方法以外にも、ランダムに発生できる方法であれば何でもよい。ただし、安全性の観点から、上記の方法のような１６！個のバリエーションを持つ発生方法の方が望ましい。
【００７１】
（１６）乗数群設定部１１５０−０〜１１５０−３１
乗数群設定部１１５０−０〜１１５０−３１は、同様の動作を行うので、ここでは、乗数群設定部１１５０−ｉについて説明する。なお、ｉは０以上３１以下の整数である。
乗数群設定部１１５０−ｉは、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉを初期化する。
【００７２】
具体的には、乗数群設定部１１５０−ｉは、対象データＸに対し、乱数選択情報生成部１１７０により生成された乱数選択情報ＲＳＩのｉ番目の要素ＲＳＩ＿ｉに従って、カウンタｃｏｕｎｔの値が２５６以上である場合に、乱数群格納部１１４０に格納されている乱数群ＲＴ＿（ＲＳＩ＿ｉ）の乱数Ｒ＿（ＲＳＩ＿ｉ）を用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。
【００７３】
乗数群設定部１１５０−ｉは、ｃｏｕｎｔが２５６より小さい場合に、乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。
なお、乗数群設定部１１５０−ｉは、Ｘ＿ｉ０及びＸ＿ｉ１の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。ここで、ＲＳは、Ｒ＿（ＲＳＩ＿ｉ）またはＳ＿（ＲＳＩ＿ｉ）である。
【００７４】
（１７）乗数群更新部１１６０
乗数群更新部１１６０は、第２のカウンタ判定部１０７０から乗数群ＭＴ＿ｉの更新を行う旨の更新指示を受け取ると、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘｉ＿０及びＸ＿ｉ１を更新する。ＭＴ＿ｉは、直前に乗数群設定部１１５０−ｉにより設定した乗数群である。
【００７５】
具体的には、乗数群更新部１１６０は、Ｘ＿ｉ０←（Ｘ＿ｉ０）＾２  ｍｏｄ  ｎ，Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。
１．３  べき乗演算装置１０００の動作
（１）全体の動作
ここでは、べき乗演算装置１０００の動作について、図５及び図６にて示す流れ図を用いて説明する。
【００７６】
入出力部１０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部１１２０に格納する（ステップＳ１００）。
入出力部１０１０は、中間値Ｚに１を設定し、中間値格納部１１２０に格納する（ステップＳ１０５）。
乱数選択情報生成部１１７０は、３２個の乱数選択情報からなる配列ＲＳＩ（＝｛ＲＳＩ＿０、ＲＳＩ＿１、・・・、ＲＳＩ＿３１｝）を生成し、生成した配列ＲＳＩを一時的に保持する（ステップＳ１１０）。
【００７７】
カウンタ初期化部１０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ１１５）。ここでは、カウンタ初期化部１０４０は、カウンタｃｏｕｎｔをｌｅｎｄ−１に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数である。
乗数群設定部１１５０−ｉは、対象データＸ、乱数選択情報生成部１１７０に格納されている乱数選択情報と乱数群格納部１１４０に格納されている乱数群を用いて、乗数群格納部１１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ１２０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
【００７８】
２乗算部１１１０は、中間値格納部１１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部１１２０に格納する（ステップＳ１２５）。
ビット判定部１０９０は、秘密鍵ｄのビットを判定する（ステップＳ１３０）。具体的には、ビット判定部１０９０は、秘密鍵ｄにおけるｃｏｕｎｔ番目のビットが０であるか１であるかの判定を行う。
【００７９】
０と判定される場合（ステップＳ１３０における「０」）、乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉ０を乗算し、その結果を中間値Ｚとして中間値格納部１１２０に格納する（ステップＳ１３５）。１と判定される場合（ステップＳ１３０における「１」）、乗算部１１００−ｉは、中間値格納部１１２０に格納されている中間値Ｚと、乗数群格納部１１３０に格納されている乗数値Ｘ＿ｉ１を乗算し、その結果を中間値Ｚとして中間値格納部１１２０に格納する（ステップＳ１４０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
【００８０】
第１のカウンタ判定部１０６０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ１４５）。
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ１４５における「ＹＥＳ」）、入出力部１０１０は、中間値格納部１１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ１７５）。
【００８１】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ１４５における「ＮＯ」）、第３のカウンタ判定部１０８０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が１６で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が１６の倍数であるか否かの判定をする（ステップＳ１５０）。
カウンタｃｏｕｎｔの値が１６で割り切れると判定される場合は（ステップＳ１５０における「ＹＥＳ」）、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ１７０）。具体的には、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。その後、処理はステップＳ１２０へと戻る。
【００８２】
カウンタｃｏｕｎｔの値が１６で割り切れないと判定される場合は（ステップＳ１５０における「ＮＯ」）、第２のカウンタ判定部１０７０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が８の倍数であるか否かの判定をする（ステップＳ１５５）。
カウンタｃｏｕｎｔの値が８で割り切れると判定される場合は（ステップＳ１５５における「ＹＥＳ」）、乗数群更新部１１６０は、乗数群格納部１１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ１６０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
【００８３】
カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ１６５）。具体的には、カウンタ更新部１０５０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部１０３０へ格納する。その後、処理はステップＳ１２５へと戻る。
【００８４】
カウンタｃｏｕｎｔの値が８で割り切れないと判定される場合は（ステップＳ１５５における「ＮＯ」）、処理はステップＳ１６５へと移り、ステップＳ１６５の実行後、ステップＳ１２５へと戻る。
（２）ＭＴ＿ｉの初期化処理
ここでは、図５におけるステップＳ１２０にて行われる乗数群ＭＴ＿ｉの初期化の処理について、図７にて示す流れ図を用いて説明する。
【００８５】
乗数群設定部１１５０−ｉは、カウンタｃｏｕｎｔの値が２５６以上であるか否かを判断する（ステップＳ２００）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
カウンタｃｏｕｎｔの値が２５６以上であると判断する場合には（ステップＳ２００における「ＹＥＳ」）、乗数群設定部１１５０−ｉは、配列ＲＳＩからｉ番目の要素ＲＳＩ＿ｉを取得し、取得したＲＳＩ＿ｉに基づき乱数群ＲＴ＿（ＲＳＩ＿ｉ）から乱数Ｒ＿（ＲＳＩ＿ｉ）を取得する（ステップＳ２０５）。
【００８６】
乗数群設定部１１５０−ｉは、取得した乱数Ｒ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定する（ステップＳ２１０）。乗数群設定部１１５０−ｉは、対象データＸに乗数値Ｘ＿ｉ０を乗算した結果を乗数値Ｘ＿ｉ１に設定する（ステップＳ２１５）。
カウンタｃｏｕｎｔの値が２５６以上でない、つまり２５６より小さいと判断する場合には（ステップＳ２００における「ＮＯ」）、乗数群設定部１１５０−ｉは、配列ＲＳＩからｉ番目の要素ＲＳＩ＿ｉを取得し、取得したＲＳＩ＿ｉに基づき乱数群ＲＴ＿（ＲＳＩ＿ｉ）から乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を取得する（ステップＳ２２０）。
【００８７】
乗数群設定部１１５０−ｉは、取得した乱数除去数Ｓ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定する（ステップＳ２２５）。乗数群設定部１１５０−ｉは、対象データＸに乗数値Ｘ＿ｉ０を乗算した結果を乗数値Ｘ＿ｉ１に設定する（ステップＳ２３０）。
（３）ＭＴ＿ｉの更新処理
ここでは、図６におけるステップＳ１６０にて行われる乗数群ＭＴ＿ｉの更新処理について、図８にて示す流れ図を用いて説明する。
【００８８】
乗数群更新部１１６０は、乗数群格納部１１３０に格納されているＭＴ＿ｉに含まれるＸ＿ｉ０を２乗し、その結果を再度Ｘ＿ｉ０とする（ステップＳ３００）。
乗数群更新部１１６０は、対象データＸにＸ＿ｉ０を乗算し、その結果をＸ＿ｉ１とする（ステップＳ３０５）。
ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数である。
【００８９】
１．４  実施の形態１の効果
実施の形態１では、べき乗演算装置１０００は、図５及び図６のステップＳ１２０、Ｓ１５０及びＳ１７０から分かるように、秘密鍵ｄのビット列を、１６ビットを１組とする３２個のブロックに分割し、ブロック毎に乗数群のインデックスを割り当てている。
さらに、べき乗演算装置１０００は、１６ビットからなるブロックを、８ビットを１組とする２個のサブブロックに分割し、元のブロックに割り当てられた乗数群を用いて、２つのサブブロックそれぞれに異なる乗算数を割り当てる。
【００９０】
例えば、図９にて示すように、５１２ビットからなる秘密鍵ｄのビット列をブロック０、ブロック１、・・・、ブロック３０、ブロック３１とし、各ブロックを２つのサブブロックに分割する。ここで、ブロックｉには乗数群ＭＴ＿ｉが割り当てられる。
図９では、ブロック０をサブブロック０−１、サブブロック０−２へと分割を示している。
【００９１】
べき乗演算装置１０００は、サブブロック０−１に対しては、図５にて示すステップＳ１２０にて初期化されたＭＴ＿０に含まれるＸ＿００（＝Ｒ＿０）、若しくはＸ＿０１（＝Ｘ×Ｘ＿００）を用いる。具体的には、べき乗演算装置１０００は、サブブロック０−１に含まれる秘密鍵ｄのビットｄ＿ｉが０の場合には、中間値ＺにＸ＿００を乗算し、秘密鍵ｄのビットｄ＿ｉが１の場合には、中間値ＺにＸ＿０１を乗算する。
【００９２】
べき乗演算装置１０００は、サブブロック０−２に対しては、図６にて示すステップＳ１６０にて更新されたＭＴ＿０に含まれるＸ＿００’（＝（Ｘ＿００）＾２（＝（Ｒ＿０）＾２））、若しくはＸ＿０１’（＝Ｘ×（Ｘ＿００）＾２）を用いる。具体的には、べき乗演算装置１０００は、ブロック０−１に含まれる秘密鍵ｄのビットｄ＿ｉが０の場合には、中間値ＺにＸ＿００’を乗算し、秘密鍵ｄのビットｄ＿ｉが１の場合には、中間値ＺにＸ＿０１’を乗算する。
【００９３】
このように、実施の形態１では、秘密鍵ｄを８ビットのブロックごとに乗数群更新部１１６０において、中間値Ｚに乗じる乗数値Ｘ＿０、Ｘ＿１を更新（変更）している。これにより、サブブロックごとに乗算数が異なるようになるので、乗算数が何であるかを解析することにより、秘密鍵ｄを求めるＢｉｇＭａｃ攻撃を防ぐことが可能となる。
以下で、詳細に説明する。
【００９４】
図１０は、実施の形態１のべき乗演算装置１０００の秘密鍵ｄに対する処理と、攻撃者による乗数の分類及びｄのビット推測について示している。サブブロック０−１では、ｄ＿ｉのビットが０の場合はＸ＿０＝Ｘ＿００を中間値Ｚに乗じ、１の場合はＸ＿１＝Ｘ＿０１を乗じる。サブブロック０−２では、Ｘ＿０をＸ＿００からＸ＿００’（＝（Ｘ＿００）＾２）、Ｘ＿１をＸ＿０１からＸ＿０１’（＝Ｘ×Ｘ＿００’）に更新（変更）しているため、ｄ＿ｊのビットが０の場合はＸ＿０＝Ｘ＿００’、１の場合はＸ＿１＝Ｘ＿０１’を乗じる。ここで、ｉは５１１から５０４の整数であり、ｊは５０３から４９６の整数である。
【００９５】
ここで、攻撃者は、消費電力波形より、サブブロック０−１の中に乗数が互いに異なるグループａ１とｂ１、サブブロック０−２の中に乗数が互いに異なるグループａ２とｂ２に波形を分類できる。しかし、攻撃者はグループａ１とｂ１のどちらがｄ＿ｉのビットが０、１に対応するか、グループａ２とｂ２のどちらがｄ＿ｊのビットが０、１に対応するかを知らない。そのため、攻撃者は、それぞれのサブブロック内でどちらかのグループをビット値０（または１）に対応すると仮定して、正しいか否かを確認する必要がある。ａ１、ｂ１がビット値０、１に対応するパターンは２通りあり、ａ２、ｂ２がビット値０、１に対応するパターンは２通りあるため、それぞれの組合せは２×２＝４通りある。したがって、攻撃者は４通りを試す必要がある。ここで、サブブロックの個数をＮＢとすると、攻撃者は２＾ＮＢ通りを試す必要がある。ＮＢを大きくすると、その分、攻撃者の試す時間がかかり、ＢｉｇＭａｃ攻撃に対する安全性が高まる。例えば、秘密鍵ｄを５１２ビットの整数とするとき、８ビットのブロックは５１２／８＝６４個存在する。そのため、攻撃者は２＾６４通りを試す必要となり、攻撃者の試す時間がかかることとなるので、ＢｉｇＭａｃ攻撃に対する安全性は高くなる。このように、ＢｉｇＭａｃ攻撃を防ぐことができる。
【００９６】
また、実施の形態１のべき乗演算装置１０００は、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数Ｒ＿０からＲ＿１５それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺している。
以下、その説明を行う。
なお、ここでは、説明を行う上での便宜上、配列ＲＳＩは、｛０、１、２、・・・１４、１５、０、１、２、・・・、１４、１５｝、つまり０から１５までの整数が並んだ配列が２つ並んでいるものとする。
言い換えると、（ｌｅｎｎｄ−ｃｏｕｎｔ−１）／１６以下の最大の整数ｉに対して、ＲＴ＿ｉが対応しているものとする。
【００９７】
図１１にて示すように、ｃｏｕｎｔ＝５１１のとき、つまり、ｉ＝０のとき、図５におけるステップＳ１３５又はＳ１４０が実行されることにより、中間値ＺにＸ＿００（＝Ｒ＿０）が出現する。このときに出現したＲ＿０は、ｃｏｕｎｔ＝５１０から２５５までの間、ステップＳ１２５により２乗演算される。つまり、Ｒ＿０は２５６回の２乗演算が行われ、その結果は、Ｒ＿０＾（２＾２５６）となる。そのため、ｃｏｕｎｔ＝２５５のときのステップＳ１２５では、中間値Ｚに乗数Ｒ＿０＾（２＾２５６）が含まれている。また、ｃｏｕｎｔ＝２５５のときのステップＳ１１５では、図７にて示すように、乗数値Ｘ＿１６０及びＸ＿１６１にはＳ＿（ＲＳＩ＿１６）（＝Ｓ＿０）が含まれることになる。そして、ステップＳ１３５、又はＳ１４０において、中間値Ｚに乗数値Ｘ＿１６０、又はＸ＿１６１を乗算することにより、中間値Ｚに含まれる乗数Ｒ＿０＾（２＾２５６）がキャンセル、つまり乗数Ｒ＿０＾（２＾２５６）とＳ＿０との乗算により１となる。
【００９８】
また、同様に、ｃｏｕｎｔ＝５１０のとき、図５におけるステップＳ１３５又はＳ１４０が実行されることにより、中間値ＺにＸ＿００（＝Ｒ＿０）が出現する。このときに出現したＲ＿０は、ｃｏｕｎｔ＝５０９から２５４までの間、ステップＳ１２５により２乗演算される。つまり、ｃｏｕｎｔ＝２５５のときのステップＳ１２５では、中間値Ｚに乗数Ｒ＿０＾（２＾２５６）が含まれている。また、ｃｏｕｎｔ＝２５４のときのステップＳ１１５では、図７にて示すように、乗数値Ｘ＿１６０及びＸ＿１６１にはＳ＿０が含まれているので、ステップＳ１３５、又はＳ１４０において、中間値Ｚに乗数値Ｘ＿１６０、又はＸ＿１６１を乗算することにより、中間値Ｚに含まれる乗数Ｒ＿０＾（２＾２５６）がキャンセルされる。
【００９９】
以降、ｃｏｕｎｔ＝５０９以降において出現したＸ＿ｉ０が、順次キャンセルされることになる。そのため、ｃｏｕｎｔ＝０のときのステップＳ１３５又はＳ１４０が実行された後では、全てのＸ＿ｉ０がキャンセルされているので、中間値Ｚの値はＸ＾ｄとなっている。
また、図１２は、ｃｏｕｎｔ＝ｉ（ｉは、２５６以上５１１以下の整数）において出現する乗数値Ｘ＿ｊ０（＝Ｒ＿ｑ）に着目した場合における乗算数の遷移を示している。なお、ここでは、ｊは、（ｌｅｎｄ−ｉ―１）／１６以下の最大の整数であり、Ｒ＿ｑ＝Ｒ＿（ＲＳＩ＿ｊ）とする。
【０１００】
図１２では、先ず、ｃｏｕｎｔ＝ｉのときのステップＳ１３５又はＳ１４０において、Ｘ＿ｊ０（＝Ｒ＿ｑ）が中間値Ｚに出現する、つまり、Ｘ＿ｊ０（＝Ｒ＿ｑ）が中間値Ｚに含まれる。
ｃｏｕｎｔ＝ｉ−１のときのステップＳ１２５において、中間値Ｚが２乗演算され、２乗演算結果ＺにはＲ＿ｑ＾２が含まれる。
【０１０１】
次に、ｃｏｕｎｔ＝ｉ−２のときのステップＳ１２５において、中間値Ｚ（Ｒ＿ｑ＾２を含む）が２乗演算され、２乗演算結果Ｚには（Ｒ＿ｑ＾２）＾２（＝Ｒ＿ｑ＾（２＾２））が含まれる。
つまり、ｃｏｕｎｔ＝ｉ−２55までの間、中間値Ｚの２乗演算を繰り返すことにより、中間値Ｚには、Ｒ＿ｑ＾（２＾２５５）が含まれている。
【０１０２】
さらに、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１１５においては、ＭＴ＿ｉの初期化処理により、Ｘ＿（ｉ＋１６）０には必ずＳ＿ｑが設定されている。
Ｘ＿（ｉ＋１６）０にはＳ＿ｑが設定される理由を述べる。整数ｉが取り得る範囲により、ｃｏｕｎｔ＝ｉ−２５６の値は、必ず２５５以下の値となることから、Ｘ＿（ｉ＋１６）０にはＳ＿０からｓ＿１５の何れかが設定される。また、このときの（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６以下の最大の整数を求める。
【０１０３】
（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６
＝（ｌｅｎｄ−（ｉ−２５６）―１）／１６
＝（ｌｅｎｄ−ｉ＋２５６―１）／１６
＝（ｌｅｎｄ−ｉ−１）／１６  ＋  ２５６／１６
＝（ｌｅｎｄ−ｉ−１）／１６  ＋  １６
したがって、（ｌｅｎｄ−ｃｏｕｎｔ―１）／１６以下の最大の整数は、（ｌｅｎｄ−ｉ−１）／１６以下の最大の整数に、１６を加算した値、つまり、ｊ＋１６となる。配列ＲＳＩの生成方法により、ＲＳＩ＿ｊとＲＳＩ＿（ｊ＋１６）との値は同一であるので、Ｓ＿（ＲＳＩ＿ｊ）＝Ｓ＿（ＲＳＩ＿（ｊ＋１６））、つまり、Ｓ＿（ＲＳＩ＿（ｊ＋１６））＝Ｓ＿ｑとなる。
【０１０４】
また、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１２５において、中間値Ｚ（Ｒ＿ｑ＾（２＾２５５）を含む）が２乗演算され、２乗演算結果ＺにはＲ＿ｑ＾（２＾２５６）が含まれる。
そして、ｃｏｕｎｔ＝ｉ−２５６のときのステップＳ１３５又はＳ１４０において、中間値Ｚに乗算数Ｓ＿ｑが乗算されるので、中間値Ｚ含まれるＲ＿ｑ＾（２＾２５６）が相殺される。
【０１０５】
このように、ｃｏｕｎｔ＝ｉのときに出現したＸ＿ｊ０は、ｃｏｕｎｔ＝ｉ−２５６のときの乗数演算（ステップＳ１３５、又はＳ１４０）にて、必ず相殺される。
また、図１３のように、秘密鍵ｄの上位ビット（ｄ＿２５６〜ｄ＿５１１）のブロック（ここでは、ブロック０からブロック１５）における乱数の影響を下位ビット（ｄ＿０からｄ＿２５５）のブロック（ここでは、ブロック１６からブロック３１）において相殺するように、乱数を用いて乗数群を設定することにより、乱数の影響を取り去るキャンセル演算が不要になる。
【０１０６】
以下で、このことについて詳細に説明する。なお、ここでは、上記と同様に、説明を行う上での便宜上、配列ＲＳＩは、｛０、１、２、・・・１４、１５、０、１、２、・・・、１４、１５｝であるとする。
図１３において、ブロック０におけるサブブロック０−１に出現する乱数Ｒ＿０の影響はその後、乱数除去数Ｓ＿０を用いてブラインドするサブブロックに移るまでに、図１１、及び図１２にて示したように２乗演算を２５６回繰り返すため、Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎを中間値に乗じた状態となる。Ｓ＿０は、Ｓ＿０＝Ｒ＿０＾（−２＾２５６）ｍｏｄ  ｎを満たすため、これを掛けることで、乱数Ｒ＿０の影響（Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎ）は除去されることになる。
【０１０７】
乗数群設定部１１５０−ｉにて設定した乗数群を乗数群更新部１１６０において更新した場合においても同様である。例えば、Ｒ＿０を用いてブラインドするサブブロックの後に乗数群を更新した場合、すなわち、Ｒ＿０＾２を用いてブラインドするサブブロックを考える。この場合においても、Ｓ＿０＾２を用いてブラインドするサブブロックで乱数の影響を除去できる。このように、乱数Ｒ＿ｊに対して所定回数（ここでは、２５６回）の２乗演算を行った後、乱数除去数Ｓ＿ｊにて、乱数Ｒ＿０の影響（Ｒ＿０＾（２＾２５６）  ｍｏｄ  ｎ）は除去するように、乱数Ｒ＿ｊが出現するサブブロックと対応する乱数除去数Ｓ＿ｊを含むサブブロックとを対にすることで、乱数の影響をすべて除去でき、キャンセル演算が不要になる。
【０１０８】
さらに、実施の形態１では、乗数群をブラインドする乱数のパターンを乱数選択情報生成部１１７０によりランダムに発生させるため、差分電力解析攻撃に対して攻撃者が統計情報を取りにくくなるため、差分電力解析攻撃への耐性がある。
なお、特許文献１においても、乗数群を更新する構成は記載されているが、乗数群の設定パターンをランダム化することや、キャンセル演算が不要になる構成は開示されていない。
【０１０９】
（具体例）
ここでは、更なる具体例を用いて、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺していることを、図１４から図１６を用いて説明する。
【０１１０】
なお、説明の便宜上、秘密鍵ｄの全てのビットは、値１であるとし、上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現する乱数は全て同一の値Ｒとする。
先頭ビットｄ＿５１１が演算対象、つまりｃｏｕｎｔ＝５１１のとき、べき演算装置１０００は、中間値Ｚを初期化、つまり中間値Ｚに値１を設定し、２乗演算及び乗算を実行する。ここでは、ｄ＿５１１＝１であるので、図１４に示すように、２乗演算及び乗算の実行後の中間値Ｚの値は、Ｘ×Ｒとなる。
【０１１１】
ｃｏｕｎｔ＝５１０のとき、べき演算装置１０００は、中間値Ｚ（＝Ｘ×Ｒ）に対して２乗演算を施し、その結果を用いて乗算を施す。ここでは、ｄ＿５１０＝１であるので、図１４に示すように、乗算の実行後の中間値Ｚの値は、（Ｘ×Ｒ）＾２×Ｘ×Ｒとなる。
べき演算装置１０００は、２乗演算及び乗算をｃｏｕｎｔ＝２５６まで繰り返すと、中間値Ｚの値は、図１５に示すように、（Ｘ×Ｒ）＾（２＾２５５）×（Ｘ×Ｒ）＾（２＾２５４）×・・・×（Ｘ×Ｒ）＾２×Ｘ×Ｒとなる。
【０１１２】
ｃｏｕｎｔ＝２５５のとき、べき乗演算装置１００は２乗演算を実行すると、中間値Ｚの値は、図１５に示すように、（Ｘ×Ｒ）＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×（Ｘ×Ｒ）＾２となる。ここで、実施の形態１にて示すように、乗算に用いる乱数が値Ｒから乱数除去数Ｓ（＝Ｒ＾（−２＾２５６））へと変更される。したがって、べき乗演算装置１００は乗算を実行すると、中間値Ｚの値は、ｃｏｕｎｔ＝５１１にて出現した乱数Ｒの影響、つまり値Ｒ＾（２＾２５６）が乱数除去数Ｓにより相殺され、その結果は、図１５に示すように、Ｘ＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×（Ｘ×Ｒ）＾２×Ｘとなる。
【０１１３】
ｃｏｕｎｔ＝２５４のとき、べき乗演算装置１００は２乗演算を実行すると、中間値Ｚの値は、図１５に示すように、Ｘ＾（２＾２５７）×（Ｘ×Ｒ）＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×Ｘ＾２となる。次に、べき乗演算装置１００は乗算を実行すると、中間値Ｚの値は、ｃｏｕｎｔ＝５１０にて出現した乱数Ｒの影響、つまり値Ｒ＾（２＾２５６）が乱数除去数Ｓにより相殺され、その結果は、図１５に示すように、Ｘ＾（２＾２５７）×Ｘ＾（２＾２５６）×（Ｘ×Ｒ）＾（２＾２５５）×・・・×（Ｘ×Ｒ）＾４×Ｘ＾２×Ｘとなる。
【０１１４】
べき演算装置１０００は、２乗演算及び乗算をｃｏｕｎｔ＝０まで繰り返すことにより、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）に対する演算時に出現した乱数それぞれの影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺することができる。
ｃｏｕｎｔ＝１において２乗演算及び乗算が実行された後は、ｃｏｕｎｔ＝２５６にて出現した乱数Ｒの影響（値Ｒ＾（２＾２５５））のみが中間値Ｚに残ることとなる。
【０１１５】
そして、ｃｏｕｎｔ＝１において２乗演算が実行されることにより、中間値Ｚの値は、図１６にて示すように、Ｘ＾（２＾５１１）×Ｘ＾（２＾５１０）×・・・×（Ｘ×Ｒ）＾（２＾２５６）×Ｘ＾（２＾２５５）・・・×Ｘ＾４×Ｘ＾２となる。べき演算装置１０００は、この中間値Ｚに値Ｘ×Ｓを乗算することで、ｃｏｕｎｔ＝２５６にて出現した乱数Ｒの影響（値Ｒ＾（２＾２５６））を相殺し、その結果は、図１６にて示すように、Ｘ＾（２＾５１１）×Ｘ＾（２＾５１０）×・・・×Ｘ＾（２＾２５６）×Ｘ＾（２＾２５５）・・・×Ｘ＾４×Ｘ＾２×Ｘ＝Ｘ＾ｄとなる。
【０１１６】
したがって、べき演算装置１０００は、べき乗演算値Ｘ＾ｄを算出する際に、ｃｏｕｎｔ＝５１１から０までの間、乗算にて乱数又は乱数除去数を出現させることで、差分電力解析攻撃による秘密鍵の解析を困難にすると同時に、秘密鍵ｄの上位ビット（ｄ＿５１１〜ｄ＿２５６）それぞれに乗算時に出現した乱数の影響を下位ビット（ｄ＿２５５〜ｄ＿０）に対する演算（乗数演算）によって相殺することができる。
【０１１７】
２．実施の形態２
図１７は、べき乗演算装置２０００の構成を示す図である。
べき乗演算装置２０００は、実施の形態１のべき乗演算装置１０００と同様に、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。
【０１１８】
べき乗演算装置２０００は、実施の形態１のべき乗演算装置１０００と同様に、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用する。
２．１  べき乗演算装置２０００の構成
べき乗演算装置２０００は、図１７にて示すように、入出力部２０１０と、秘密鍵格納部２０２０と、カウンタ格納部２０３０と、カウンタ初期化部２０４０と、カウンタ更新部２０５０と、第１のカウンタ判定部２０６０と、第２のカウンタ判定部２０７０と、第３のカウンタ判定部２０８０と、ビット判定部２０９０と、乗算部２１００−０、２１００−１と、２乗算部２１１０と、中間値格納部２１２０と、乗数群格納部２１３０と、乱数群格納部２１４０と、乗数群設定部２１５０−０、２１５０−１と、乗数群更新部２１６０と、乱数シード格納部２１８０と、乱数群設定部２１９０とから構成されている。
【０１１９】
なお、入出力部２０１０、秘密鍵格納部２０２０、カウンタ格納部２０３０、カウンタ初期化部２０４０、カウンタ更新部２０５０、第１のカウンタ判定部２０６０、第２のカウンタ判定部２０７０、ビット判定部２０９０、２乗算部２１１０、中間値格納部２１２０、及び乗数群更新部２１６０それぞれは、実施の形態１にて示す入出力部１０１０、秘密鍵格納部１０２０、カウンタ格納部１０３０、カウンタ初期化部１０４０、カウンタ更新部１０５０、第１のカウンタ判定部１０６０、第２のカウンタ判定部１０７０、ビット判定部１０９０、２乗算部１１１０、中間値格納部１１２０、及び乗数群更新部１１６０と同様であるので、ここでの説明は省略する。
【０１２０】
以下、第３のカウンタ判定部２０８０、乗数群格納部２１３０、乗算部２１００−０、２１００−１、乱数群格納部２１４０、乗数群設定部２１５０−０、２１５０−１、乱数シード格納部２１８０、乱数群設定部２１９０のそれぞれについて説明する。
（１）第３のカウンタ判定部２０８０
第３のカウンタ判定部２０８０は、第１のカウンタ判定部２０６０から判定を行う旨の指示を受け取ると、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が２５６で割り切れるか否か、すなわち、２５６の倍数であるか否かを判定する。
【０１２１】
２５６で割り切れると判定する場合、第３のカウンタ判定部２０８０は、更新指示をカウンタ更新部２０５０へ通知する。
２５６で割り切れないと判断する場合、第３のカウンタ判定部２０８０は、第２のカウンタ判定部２０７０へ判定を行う旨の指示を通知する。
（２）乗数群格納部２１３０
乗数群格納部２１３０は、乗算部２１００−０〜２１００−１で使用する乗数群ＭＴ＿０〜ＭＴ＿１を格納する。
【０１２２】
具体的には、乗数群格納部２１３０は、図１８にて示すように、乗数値Ｘ＿ｉ０及びＸ＿ｉ１からなる乗数群ＭＴ＿ｉを格納している。ここで、ｉは、０、１である。
（３）乗算部２１００−０、２１００−１
乗算部２１００−０、２１００−１は同様の動作を行うので、ここでは、乗算部２１００−ｉについて説明する。なお、ｉは０または１である。
【０１２３】
乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉに格納されている乗数値Ｘ＿ｉ０または、乗数値Ｘ＿ｉ１を乗算し、その乗算結果を中間値格納部１１２０に格納する。
具体的には、乗算部２１００−ｉは、ビット判定部２０９０によるｃｏｕｎｔ番目のビットが０であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ０とを乗算し、その結果を再度中間値Ｚとする。また、乗算部２１００−ｉは、ビット判定部２０９０によるｃｏｕｎｔ番目のビットが１であると判定する場合には、中間値Ｚと乗数値Ｘ＿ｉ１とを乗算し、その結果を再度中間値Ｚとする。
【０１２４】
（４）乱数群格納部２１４０
乱数群格納部２１４０は、乱数群ＲＴを格納する。
具体的には、乱数群格納部２１４０は、図１９にて示すように、乱数Ｒと乱数除去数Ｓとからなる乱数群ＲＴを格納している。
また、乱数Ｒと乱数除去数Ｓとは、以下の関係を満たす。
【０１２５】
Ｓ＝Ｒ＾（−２＾２５６）  ｍｏｄ  ｎ
つまり、Ｒ＾（２＾２５６）  ×  Ｓ  ＝  １の関係を満たしている。
なお、乱数Ｒと乱数除去数Ｓは、乱数群設定部２１９０にて生成される。乱数群設定部２１９０については、後述する。
（５）乗数群設定部２１５０−０、２１５０−１
乗数群設定部２１５０−０、２１５０−１は、同様の動作を行うので、ここでは、乗数群設定部２１５０−ｉについて説明する。なお、ｉは０、１である。
【０１２６】
乗数群設定部２１５０−ｉは、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを初期化する。
具体的には、乗数群設定部２１５０−ｉは、対象データＸに対し、カウンタｃｏｕｎｔの値が２５６以上である場合には、乱数群格納部２１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。
【０１２７】
乗数群設定部２１５０−ｉは、ｃｏｕｎｔが２５６より小さい場合には、乱数群ＲＴに含まれる乱数除去数Ｓを用いて、Ｘ＿ｉ０及びＸ＿ｉ１を算出する。
なお、乗数群設定部２１５０−ｉは、Ｘ＿ｉ０及びＸ＿ｉ１の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎを実行する。ここで、ＲＳは、ＲまたはＳである。
【０１２８】
（６）乱数シード格納部２１８０
乱数シード格納部２１８０は、乱数シードＵと乱数除去シードＶを格納する。ＵとＶは予め格納されており、以下の式を満たす。
Ｖ＝Ｕ＾（−２＾２５６）  ｍｏｄ  ｎ
（７）乱数群設定部２１９０
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数シードＵと乱数除去シードＶを用いて、乱数群ＲＴの乱数Ｒと乱数除去数Ｓを生成し、乱数群格納部２１４０に格納する。
【０１２９】
具体的には、ランダムな正整数値ｗを発生させて、以下の式を計算して、Ｒ、Ｓを求める。
Ｒ＝Ｕ＾ｗ  ｍｏｄ  ｎ
Ｓ＝Ｖ＾ｗ  ｍｏｄ  ｎ
これらのべき乗演算は単純にバイナリ法やＷｉｎｄｏｗ法などの従来の方法を用いて計算する。ｗは、例えば、３２ビットの乱数であるが、これに限らない。
【０１３０】
２．２  べき乗演算装置２０００の動作
（１）全体の動作
ここでは、べき乗演算装置２０００の動作について、図２０及び図２１にて示す流れ図を用いて説明する。
入出力部２０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部２１２０に格納する（ステップＳ４００）。
【０１３１】
入出力部２０１０は、中間値Ｚに１を設定し、中間値格納部２１２０に格納する（ステップＳ４０５）。
乱数群設定部２１９０は、乱数群ＲＴを生成し、生成した乱数群ＲＴを乱数群格納部２１４０に格納する（ステップＳ４１０）。
カウンタ初期化部２０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ４１５）。ここでは、カウンタ初期化部２０４０は、カウンタｃｏｕｎｔをｌｅｎｄ−１に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数である。
【０１３２】
乗数群設定部２１５０−ｉは、対象データＸ、乱数群格納部２１４０に格納されている乱数群ＲＴを用いて、乗数群格納部２１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ４２０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。
２乗算部２１１０は、中間値格納部２１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部２１２０に格納する（ステップＳ４２５）。
【０１３３】
ビット判定部２０９０は、秘密鍵ｄのビットを判定する（ステップＳ４３０）。具体的には、ビット判定部２０９０は、秘密鍵ｄにおけるｃｏｕｎｔ番目のビットが０であるか１であるかの判定を行う。
０と判定される場合（ステップＳ４３０における「０」）、乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉ０を乗算し、その結果を中間値Ｚとして中間値格納部２１２０に格納する（ステップＳ４３５）。１と判定される場合（ステップＳ４３０における「１」）、乗算部２１００−ｉは、中間値格納部２１２０に格納されている中間値Ｚと、乗数群格納部２１３０に格納されている乗数値Ｘ＿ｉ１を乗算し、その結果を中間値Ｚとして中間値格納部２１２０に格納する（ステップＳ４４０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。
【０１３４】
第１のカウンタ判定部２０６０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ４４５）。
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ４４５における「ＹＥＳ」）、入出力部２０１０は、中間値格納部２１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ４７５）。
【０１３５】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ４４５における「ＮＯ」）、第３のカウンタ判定部２０８０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が２５６で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が２５６の倍数であるか否かの判定をする（ステップＳ４５０）。
カウンタｃｏｕｎｔの値が２５６で割り切れると判定される場合は（ステップＳ４５０における「ＹＥＳ」）、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ４７０）。具体的には、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部２０３０へ格納する。その後、処理はステップＳ４２０へと戻る。
【０１３６】
カウンタｃｏｕｎｔの値が２５６で割り切れないと判定される場合は（ステップＳ４５０における「ＮＯ」）、第２のカウンタ判定部２０７０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔの値が８で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が８の倍数であるか否かの判定をする（ステップＳ４５５）。
カウンタｃｏｕｎｔの値が８で割り切れると判定される場合は（ステップＳ４５５における「ＹＥＳ」）、乗数群更新部２１６０は、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ４６０）。ここで、ｉは（ｌｅｎｄ−ｃｏｕｎｔ−１）／２５６以下の最大の整数である。
【０１３７】
カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ４６５）。具体的には、カウンタ更新部２０５０は、カウンタ格納部２０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部２０３０へ格納する。その後、処理はステップＳ４２５へと戻る。
【０１３８】
カウンタｃｏｕｎｔの値が８で割り切れないと判定される場合は（ステップＳ４５５における「ＮＯ」）、処理はステップＳ４６５へと移り、ステップＳ４６５の実行後、ステップＳ４２５へと戻る。
（２）乱数群ＲＴの設定処理
ここでは、図２０におけるステップＳ４１０にて行われる乱数群ＲＴの設定処理について、図２２にて示す流れ図を用いて説明する。
【０１３９】
乱数群設定部２１９０は、ランダムな正整数ｗを発生させる（ステップＳ５００）。
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数シードＵと、正整数ｗとを用いて、乱数Ｒ（＝Ｕ＾ｗ  ｍｏｄ  ｎ）を算出する（ステップＳ５０５）。
乱数群設定部２１９０は、乱数シード格納部２１８０に格納されている乱数除去シードＶと、正整数ｗとを用いて、乱数除去数Ｓ（＝Ｖ＾ｗ  ｍｏｄ  ｎ）を算出する（ステップＳ５１０）。
【０１４０】
乱数群設定部２１９０は、算出した乱数Ｒと、乱数除去数Ｓとからなる乱数群ＲＴ（＝[Ｒ、Ｓ]）を乱数群格納部２１４０に格納する（ステップＳ５１５）。
（３）ＭＴ＿ｉの初期化処理
図２０におけるステップＳ４２０にて行われる乗数群ＭＴ＿ｉの初期化の処理は、図７にて示す流れ図を一部変更することで実現できるので、ここでは、その変更点のみについて説明する。
【０１４１】
先ず、ステップＳ２０５を、カウンタｃｏｕｎｔの値が２５６以上であると判断する場合には（ステップＳ２００における「ＹＥＳ」）、乗数群設定部２１５０−ｉは、乱数群格納部２１４０に格納されている乱数群ＲＴの乱数Ｒを取得すると変更する。
次に、ステップＳ２１０を、乗数群設定部１１５０−ｉは、取得した乱数Ｒ＿（ＲＳＩ＿ｉ）を乗数値Ｘ＿ｉ０に設定すると変更する。
【０１４２】
ステップＳ２２０を、カウンタｃｏｕｎｔの値が２５６以上でないと判断する場合には（ステップＳ２００における「ＮＯ」）、乗数群設定部２１５０−ｉは、乱数群格納部２１４０に格納されている乱数群ＲＴに含まれる乱数除去数Ｓを取得すると変更する。
最後に、ステップＳ２２５を、乗数群設定部２１５０−ｉは、取得した乱数除去数Ｓ）を乗数値Ｘ＿ｉ０に設定すると変更する。
【０１４３】
図７にて示す動作の流れを上記のように変更することで、図２０におけるステップＳ４２０にて行われる乗数群ＭＴ＿ｉの初期化の処理が実現できる。
（４）ＭＴ＿ｉの更新処理
図２１におけるステップＳ４６０にて行われる乗数群ＭＴ＿ｉの更新処理は、図８にて示す動作の流れと同様の動作の流れにて実現できるので、ここでの説明は省略する。
【０１４４】
２．３  実施の形態２の効果
実施の形態２は、実施の形態１と比べて乱数群による乗数群の設定方法が異なるのみであるので、実施の形態１と同様の効果がある。
差分電力解析攻撃に対しては、乱数シードに対しランダム値によるべき乗を行って乱数群を計算するため、乗数群をブラインドする乱数のパターンをランダム化することができ、攻撃者が統計情報を取りにくくなるため、差分電力解析攻撃への耐性がある。
【０１４５】
３．実施の形態３
図２３は、べき乗演算装置３０００の構成を示す図である。
べき乗演算装置３０００は、実施の形態１、２のべき乗演算装置１０００、２０００と同様に、べき乗を行う対象データである対象データＸを入力し、対象データに対して秘密鍵ｄをべき値とするべき乗演算結果（Ｘ＾ｄ）を出力する装置である。
【０１４６】
べき乗演算装置３０００は、実施の形態１、２のべき乗演算装置１０００、２０００と同様に、例えば、ＲＳＡ暗号方式の復号化やＲＳＡ署名方式の署名作成において、使用する。
３．１  べき乗演算装置３０００の構成
べき乗演算装置３０００は、図２３にて示すように、入出力部３０１０と、秘密鍵格納部３０２０と、カウンタ格納部３０３０と、カウンタ初期化部３０４０と、カウンタ更新部３０５０と、第１のカウンタ判定部３０６０と、第２のカウンタ判定部３０７０と、第３のカウンタ判定部３０８０と、乗数選択部３０９０と、乗算部３１００と、２乗算部３１１０と、中間値格納部３１２０と、乗数群格納部３１３０と、乱数群格納部３１４０と、乗数群設定部３１５０−０、３１５０−１と、乗数群更新部３１６０と、乱数シード格納部３１８０と、乱数群設定部３１９０とから構成されている。
【０１４７】
入出力部３０１０、秘密鍵格納部３０２０、カウンタ格納部３０３０、カウンタ更新部３０５０、第１のカウンタ判定部３０６０、２乗算部３１１０、及び中間値格納部３１２０のそれぞれは、実施の形態１にて示す入出力部１０１０、秘密鍵格納部１０２０、カウンタ格納部１０３０、カウンタ更新部１０５０、第１のカウンタ判定部１０６０、２乗算部１１１０、及び中間値格納部１１２０のそれぞれと同様であるので、ここでの説明は省略する。
【０１４８】
また、乱数群格納部３１４０、乱数シード格納部３１８０、及び乱数群設定部３１９０のそれぞれは、実施の形態2にて示す乱数群格納部２１４０、乱数シード格納部２１８０、及び乱数群設定部２１９０のそれぞれと同様であるので、ここでの説明は省略する。
以下、乗数群格納部３１３０、カウンタ初期化部３０４０、第２のカウンタ判定部３０７０、第３のカウンタ判定部３０８０、乗数選択部３０９０、乗算部３１００、乗数群設定部３１５０−０、３１５０−１、及び乗数群更新部３１６０について説明する。
【０１４９】
（１）乗数群格納部３１３０
乗数群格納部３１３０は、乗算部３１００で使用する乗数群ＭＴ＿０〜ＭＴ＿１を格納する。
具体的には、乗数群格納部３１３０は、図２４にて示すように、１６個の乗数値Ｘ＿ｉ０、Ｘ＿ｉ１、・・・、Ｘ＿ｉ１５からなる乗数群ＭＴ＿ｉ（ｉは０または１）を格納している。なお、Ｘ＿ｉ０からＸ＿ｉ１５を格納するのは、ｓｗ＝４であるためである。一般のｓｗに対しては、乗数群格納部２１３０は、乗数値Ｘ＿ｉ０，Ｘ＿ｉ１，・・・，Ｘ＿（ｉ（２＾ｓｗ−１））を格納する。
【０１５０】
（２）カウンタ初期化部３０４０
カウンタ初期化部３０４０は、カウンタｃｏｕｎｔに値ｂを設定する。
ここで、値ｂ＝（ｌｅｎｄ／ｓｗ以上の最も小さい整数）−１である。ｌｅｎｄは秘密鍵ｄのビット数であり、例えばｌｅｎｄ＝５１２である。ｓｗは正整数であり、例えば、ｓｗ＝４である。なお、ｓｗは２、３や５以上であってもよい。
【０１５１】
（３）第３のカウンタ判定部３０８０
第３のカウンタ判定部３０８０は、第１のカウンタ判定部２０６０から判定を行う旨の指示を受け取ると、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が６４で割り切れるか否か、すなわち、６４の倍数であるか否かを判定する。
６４で割り切れると判定する場合、第３のカウンタ判定部３０８０は、更新指示をカウンタ更新部３０５０へ通知する。
【０１５２】
６４で割り切れないと判断する場合、第３のカウンタ判定部３０８０は、第２のカウンタ判定部３０７０へ判定を行う旨の指示を通知する。
（４）第２のカウンタ判定部３０７０
第２のカウンタ判定部３０７０は、第３のカウンタ判定部３０８０から判定を行う旨の指示を受け取ると、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が２で割り切れるか否か、すなわち、２の倍数であるか否かを判定する。
【０１５３】
カウンタｃｏｕｎｔの値が２で割り切れると判定する場合には、第２のカウンタ判定部３０７０は、乗数群更新部３１６０へ乗数群格納部３１３０にて格納されている乗数群ＭＴ＿ｉの更新を行う旨の更新指示を通知する。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。
カウンタｃｏｕｎｔの値が２で割り切れないと判定する場合には、第２のカウンタ判定部３０７０は、カウンタの更新指示をカウンタ更新部３０５０へ通知する。
【０１５４】
（５）乗数選択部３０９０
乗数選択部３０９０は、カウンタ格納部１０３０に格納されているカウンタｃｏｕｎｔに対する分割秘密情報Ｄ＿ｃｏｕｎｔの値をインデックスｊ（ｊ＝Ｄ＿ｃｏｕｎｔ）として、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉの乗数値Ｘ＿ｉｊを選択する。
【０１５５】
ここで、分割秘密情報Ｄ＿ｃｏｕｎｔとは、秘密鍵ｄに対するビット列をｓｗビット毎に分割して得られる情報である。例えば、図２５に示すように、ｓｗ＝４である場合には、秘密鍵ｄのビット列は、４ビットからなる分割秘密情報Ｄ＿１２７、Ｄ＿１２６、・・・、Ｄ＿１、Ｄ＿０に分割される。なお、分割秘密情報Ｄ＿１２７、Ｄ＿１２６、・・・、Ｄ＿１、Ｄ＿０のそれぞれは、４ビットからなるので、各分割秘密情報は取り得る値の範囲は、１０進数表現で“０”から“１５”である。つまり、分割秘密情報Ｄ＿ｃｏｕｎｔの値は、０から１５の何れかであるので、乗数群格納部３１３０には対応する乗数値Ｘ＿ｉｊは必ず存在する。
【０１５６】
（６）乗算部３１００
乗算部３１００は、中間値格納部３１２０に格納されている中間値Ｚと、乗数選択部３０９０で選択された乗数値Ｘ＿ｉｊを乗算し、その乗算結果を中間値格納部３１２０に格納する。
具体的には、乗算部３１００は、Ｚ←Ｚ×Ｘ＿ｉｊ  ｍｏｄ  ｎを実行する。
【０１５７】
ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数であり、ｃｏｕｎｔはカウンタ格納部１０３０に格納されているカウンタである。
（７）乗数群設定部３１５０−０、３１５０−１
乗数群設定部３１５０−０、３１５０−１は、同様の動作を行うので、ここでは、乗数群設定部３１５０−ｉとして説明する。なお、ｉは０、１である。
【０１５８】
乗数群設定部３１５０−ｉは、乗数群格納部２１３０に格納されている乗数群ＭＴ＿ｉを初期化する。
具体的には、乗数群設定部３１５０−ｉは、対象データＸに対し、カウンタｃｏｕｎｔの値が６４以上である場合に、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを用いて、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５を算出する。
【０１５９】
乗数群設定部３１５０−ｉは、ｃｏｕｎｔが６４より小さい場合に、乱数群ＲＴに含まれる乱数除去数Ｓを用いて、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５を算出する。
なお、乗数群設定部３１５０−ｉは、Ｘ＿ｉ０、Ｘ＿ｉ１、Ｘ＿ｉ２、・・・、Ｘ＿ｉ１４、Ｘ＿ｉ１５の算出時には、Ｘ＿ｉ０←ＲＳ  ｍｏｄ  ｎ、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｎ、Ｘ＿ｉ２←Ｘ×Ｘ＿ｉ１  ｍｏｄ  ｎ、・・・、Ｘ＿ｉ１５←Ｘ×Ｘ＿ｉ１４  ｍｏｄ  ｎ（＝Ｘ＾１５×ＲＳ  ｍｏｄ  ｎ）を実行する。ここで、ＲＳは、ＲまたはＳである。
【０１６０】
（８）乗数群更新部３１６０
乗数群更新部３１６０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉの乗数Ｘ＿ｉ０及びＸ＿ｉ１を更新する。ＭＴ＿ｉは、直前に乗数群設定部３１５０−ｉにより設定した乗数群である。
具体的には、乗数群更新部３１６０は、Ｘ＿ｊ０←Ｘ＿ｊ０＾２  ｍｏｄ  ｎ、Ｘ＿ｊ１←Ｘ×Ｘ＿ｊ０  ｍｏｄ  ｎ、Ｘ＿ｊ２←Ｘ×Ｘ＿ｊ１  ｍｏｄ  ｎ、・・・、Ｘ＿ｊ１５←Ｘ×Ｘ＿ｊ１４  ｍｏｄ  ｎを実行する。
【０１６１】
３．２  べき乗演算装置３０００の動作
（１）全体の動作
ここでは、べき乗演算装置３０００の動作について、図２０及び図２１にて示す流れ図を用いて説明する。
入出力部３０１０は、対象データＸの入力を受け付け、受け付けた対象データＸを中間値格納部３１２０に格納する（ステップＳ６００）。
【０１６２】
入出力部３０１０は、中間値Ｚを値“１”に初期化し、中間値格納部３１２０に格納する（ステップＳ６０５）。
乱数群設定部３１９０は、乱数群ＲＴを生成し、生成した乱数群ＲＴを乱数群格納部３１４０に格納する（ステップＳ６１０）。
カウンタ初期化部３０４０は、カウンタｃｏｕｎｔを初期化する（ステップＳ６１５）。ここでは、カウンタ初期化部３０４０は、カウンタｃｏｕｎｔを値ｂ（＝（ｌｅｎｄ／ｓｗ以上の最も小さい整数）−１）に設定する。ここで、ｌｅｎｄは、秘密鍵ｄのビット数であり、ｓｗ＝４である。
【０１６３】
乗数群設定部３１５０−ｉは、対象データＸ、乱数群格納部３１４０に格納されている乱数群ＲＴを用いて、乗数群格納部３１３０に格納するＭＴ＿ｉを初期化、つまり乗数値Ｘ＿ｉ０とＸ＿ｉ１を初期化する（ステップＳ６２０）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。
２乗算部３１１０は、中間値格納部３１２０に格納されている中間値Ｚに対して、２乗演算処理を施し、その結果をＺとして中間値格納部３１２０に格納する（ステップＳ６２５）。
【０１６４】
乗数選択部３０９０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉから乗数Ｘ＿ｉｊを選択する（ステップＳ６３０）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数であり、ｊ＝Ｄ＿ｃｏｕｎｔである。なお、Ｄ＿ｃｏｕｎｔは、カウンタｃｏｕｎｔに対する分割秘密情報が示す値である。
乗算部３１００は、中間値格納部３１２０に格納されている中間値Ｚと、乗数選択部３０９０で選択した乗数Ｘ＿ｉｊを乗算し、その結果を中間値格納部１１２０に格納する（ステップＳ６３５）。
【０１６５】
第１のカウンタ判定部３０６０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が０であるか否かの判定をする（ステップＳ６４０）。
カウンタｃｏｕｎｔが０であると判定される場合（ステップＳ６４０における「ＹＥＳ」）、入出力部３０１０は、中間値格納部３１２０に格納されている中間値Ｚを（べき乗演算結果として）出力する（ステップＳ６７０）。
【０１６６】
カウンタｃｏｕｎｔが０でないと判定される場合（ステップＳ６４０における「ＮＯ」）、第３のカウンタ判定部３０８０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が６４で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が６４の倍数であるか否かの判定をする（ステップＳ６４５）。
カウンタｃｏｕｎｔの値が６４で割り切れると判定される場合は（ステップＳ６４５における「ＹＥＳ」）、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ６６５）。具体的には、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部３０３０へ格納する。その後、処理はステップＳ６２０へと戻る。
【０１６７】
カウンタｃｏｕｎｔの値が６４で割り切れないと判定される場合は（ステップＳ６４５における「ＮＯ」）、第２のカウンタ判定部３０７０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔの値が２で割り切れるか否か、つまりカウンタｃｏｕｎｔの値が２の倍数であるか否かの判定をする（ステップＳ６５０）。
カウンタｃｏｕｎｔの値が２で割り切れると判定される場合は（ステップＳ６５０における「ＹＥＳ」）、乗数群更新部３１６０は、乗数群格納部３１３０に格納されている乗数群ＭＴ＿ｉを更新する（ステップＳ６５５）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。
【０１６８】
カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔを更新する（ステップＳ６６０）。具体的には、カウンタ更新部３０５０は、カウンタ格納部３０３０に格納されているカウンタｃｏｕｎｔをデクリメント（１を減算）し、演算結果を再度カウンタｃｏｕｎｔの値としてカウンタ格納部３０３０へ格納する。その後、処理はステップＳ６２５へと戻る。
【０１６９】
カウンタｃｏｕｎｔの値が２で割り切れないと判定される場合は（ステップＳ６５０における「ＮＯ」）、処理はステップＳ６６０へと移り、ステップＳ６６０の実行後、ステップＳ６２５へと戻る。
（２）乱数群ＲＴの設定処理
図２６におけるステップＳ６１０にて行われる乱数群ＲＴの設定処理は、図２２にて示す動作の流れと同様の動作の流れにて実現できるので、ここでの説明は省略する。
【０１７０】
（３）ＭＴ＿ｉの初期化処理
ここでは、図２６におけるステップＳ６２０にて行われる乗数群ＭＴ＿ｉの初期化の処理について、図２８にて示す流れ図を用いて説明する。
乗数群設定部３１５０−ｉは、カウンタｃｏｕｎｔの値が６４以上であるか否かを判断する（ステップＳ７００）。ここで、ｉは（ｂ−ｃｏｕｎｔ）／６４以下の最大の整数である。
【０１７１】
カウンタｃｏｕｎｔの値が６４以上であると判断する場合には（ステップＳ７００における「ＹＥＳ」）、乗数群設定部３１５０−ｉは、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数Ｒを取得する（ステップＳ７０５）。乗数群設定部３１５０−ｉは、取得した乱数Ｒを乗数値Ｘ＿ｉ０に設定する（ステップＳ７１０）。
カウンタｃｏｕｎｔの値が６４以上でないと判断する場合には（ステップＳ７００における「ＮＯ」）、乗数群設定部３１５０−ｉは、乱数群格納部３１４０に格納されている乱数群ＲＴに含まれる乱数除去数Ｓを取得する（ステップＳ７１５）。乗数群設定部３１５０−ｉは、取得した乱数Ｓを乗数値Ｘ＿ｉ０に設定する（ステップＳ７２０）。
【０１７２】
乗数群設定部３１５０−ｉは、カウンタｋに値“１”を設定する（ステップＳ７２５）。
乗数群設定部３１５０−ｉは、カウンタｋの値が１から１５の間、ステップＳ７３０からＳ７４５までを繰り返す（ステップＳ７３０）。
乗数群設定部３１５０−ｉは、乗数値Ｘ＿ｉｋに、対象データＸに乗数値Ｘ＿ｉ（ｋ−１）を乗算した結果を設定する（ステップＳ７３５）。
【０１７３】
乗数群設定部３１５０−ｉは、カウンタｋの値に値“１”を加算して、加算した結果を再度カウンタｋの値として設定する（ステップＳ７４０）。
（４）２乗演算処理
ここでは、図２６におけるステップＳ６２５にて行われる２乗演算処理について、図２９にて示す流れ図を用いて説明する。
【０１７４】
２乗算部３１１０は、カウンタｕに値“１”を設定する（ステップＳ８００）。
２乗算部３１１０は、カウンタｕの値が１からｓｗ（ここでは、４）までの間、ステップＳ８１０からＳ８２０までを繰り返す（ステップＳ８０５）。
２乗算部３１１０は、中間値格納部３１２０に格納されている中間値Ｚを２乗し、その結果をＺとして中間値格納部３１２０に格納する（ステップＳ８１０）。
【０１７５】
２乗算部３１１０は、カウンタｕの値に値“１”を加算して、加算した結果を再度カウンタｕの値として設定する（ステップＳ８１５）。
これにより、べき乗演算装置３０００は、２乗演算処理を１回実行することで、Ｚ＾１６を算出することになる。
（５）ＭＴ＿ｉの更新処理
ここでは、図２７におけるステップＳ６５５にて行われる乗数群ＭＴ＿ｉの更新処理について、図３０にて示す流れ図を用いて説明する。
【０１７６】
乗数群更新部３１６０は、乗数群格納部３１３０に格納されているＭＴ＿ｉに含まれるＸ＿ｉ０を２乗し、その結果を再度Ｘ＿ｉ０とする（ステップＳ８５０）。
乗数群更新部３１６０は、カウンタｍに値“１”を設定する（ステップＳ８５５）。
乗数群更新部３１６０は、カウンタｍの値が１から１５の間、ステップＳ８６５からＳ８７５までを繰り返す（ステップＳ８６０）。
【０１７７】
乗数群更新部３１６０は、乗数値Ｘ＿ｉｍに、対象データＸに乗数値Ｘ＿ｉ（ｍ−１）を乗算した結果を設定する（ステップＳ８６５）。
乗数群更新部３１６０は、カウンタｍの値に値“１”を加算して、加算した結果を再度カウンタｍの値として設定する（ステップＳ８７０）。
３．３  実施の形態３の効果
実施の形態３では、ｄを２×４＝８ビットのブロックごとに乗数群更新部３１６０において、中間値Ｚに乗じる乗数Ｘ＿ｉ０，Ｘ＿ｉ１，・・・，Ｘ＿ｉ１５（ｉは０または１）を更新している。こうすることによって、実施の形態１及び２と同様にブロックごとに乗数が異なるようになり、乗数が何であるかを解析することにより、秘密鍵ｄを求めるＢｉｇＭａｃ攻撃を防ぐことが可能となる。
【０１７８】
また、実施の形態３では、ウィンドウ法を用いたべき乗演算においてもキャンセル演算が不要となる。ここでは、ウィンドウの幅は４ビットであり、５１２ビットの秘密鍵ｄは、６４このウィンドウに分割される。
以下、キャンセル演算が不要となる理由を述べる。
乱数Ｒに対して所定回数（ここでは、６４回）の２乗演算処理を行った後、乱数除去数Ｓにて、乱数Ｒの影響（Ｒ＾（２＾２５６）  ｍｏｄ  ｎ）は除去するように、乱数Ｒが出現するウィンドウと対応する乱数除去数Ｓを含むウィンドウとを対にしているからである。
【０１７９】
４．変形例
上記に説明した実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。
（１）実施の形態１〜３における秘密鍵ｄのビットサイズは、５１２に限らない。１０２４や２０４８であってもよい。また、べき乗演算装置では、Ｘ＾ｄ  ｍｏｄ  ｎを計算するが、ｄｐ＝ｄ  ｍｏｄ  ｐ−１，ｄｑ＝ｄ  ｍｏｄ  ｑ−１とし、Ｘ＾ｄｐ  ｍｏｄ  ｐとＸ＾ｄｑ  ｍｏｄ  ｑを計算し、中国人の剰余定理を用いることでＸ＾ｄ  ｍｏｄ  ｎを計算するとしてもよい。ここで、Ｘ＾ｄｐ  ｍｏｄ  ｐ及びＸ＾ｄｑ  ｍｏｄ  ｑを計算する際にべき乗演算装置を使用してもよい。この場合、例えば、Ｘ＾ｄｐ  ｍｏｄ  ｐを計算するときは、乗算部などで使用しているｍｏｄ  ｎをｍｏｄ  ｐとして、べき乗演算装置を実施する。この場合において、乗数群の設定時に、Ｘ＿ｉ１←Ｘ×Ｘ＿ｉ０  ｍｏｄ  ｐ（ｉ＝０または１）におけるＸはｍｏｄ  ｐしたものでもよいが、これをｍｏｄ  ｎしたものとすることにより、入力のＸに依存してＸ  ｍｏｄ  ｐの演算が発生し、その際の電力を計測することによりｐの情報が漏れることを防ぐことが可能になる。また、ｑに対しても同様である。
【０１８０】
（２）実施の形態１、２における第２のカウンタ判定部は、カウンタが８で割り切れるか否かを判定しているが、これに限らない。８以外の値、例えば、４で割り切れるか否かを判定してもよい。また、複数の正整数を含めたテーブルを保持し、このテーブルに格納されている正整数であるかを判定してもよい。なお、このテーブルに含める正整数は、８の倍数など、規則性のあるものだけでなく、規則性がないものであってもよい。また、これらの場合も、その正整数の値により、ｕは変化する。
【０１８１】
また、実施の形態３においても同様に、第２のカウンタ判定部は、２以外の値、例えば、４で割り切れるか否かを判定してもよい。また、複数の正整数を含めたテーブルを保持し、このテーブルに格納されている正整数であるかを判定してもよい。
（３）実施の形態１における第３のカウンタ判定部は、カウンタが１６で割り切れることを判定し、その判定結果に応じて乗数群を設定するとしているがこれに限らない。例えば、３２や６４のような２のべき数で割り切れるとしてもよい。また、１６、３２や６４のように２のべき数だけでなく、奇数であってもよい。
【０１８２】
（４）実施の形態１〜３における乗数群更新部において、乗数群の乗数値Ｘ＿ｉ０（ｉは０から３１までの値）を２乗しているが、これに限らない。例えば、３乗してもよい。つまり、更新後の乗数値は、更新前の乗数値Ｘ＿ｉ０を用いて変更される値となればよい。
（５）実施の形態１では、乱数群の個数を３２としていたが、これに限らない。例えば、乗数群の設定のバリエーション、すなわち、配列ＲＳＩに含める乱数選択情報の組み合わせの種類を２＾３２程度にしたい場合は、２６個あればよい。一般に、乱数群の個数ｇに対し、バリエーションの数はｇ／２の階乗個ある。
【０１８３】
（６）実施の形態１、２では、べき値の上位ビットから下位への方向に、べき値のビットを判定して演算を実行しているが、下位ビットから上位への方向に、べき値のビットを判定して演算を実行してもよい。
その場合は、２乗算部は、２乗算を中間値に対してではなく、直前で設定した乗数群に対して実行し、乗数群を更新していく。また、乗数群更新部は不要であり、１番目に実行する乗数群設定部はＲを用いてブラインドするよう設定する。すなわち、乗数群ＭＴ＿０は、べき値の下位半分において、ビットごとに、（Ｒ，Ｘ×Ｒ）⇒（Ｒ＾２，（Ｘ×Ｒ）＾２）⇒（Ｒ＾４，（Ｘ×Ｒ）＾４）⇒・・・⇒（Ｒ＾（２＾２５５），（Ｘ×Ｒ）＾（２＾２５５））と変化していく。ここで、（Ｒ，Ｘ×Ｒ）はＸ＿００＝Ｒ，Ｘ＿０１＝Ｘ×Ｒであることを示している。さらに、２番目に実行する乗数群設定部は（Ｓ×Ｒ＾（２＾２５５））を用いてブラインドするよう設定する。このとき、その前の乗数群ＭＴ＿０のそれぞれの乗数にＳを乗じることで、乗数群ＭＴ＿１を設定する。その前に、２乗算部で乗数群ＭＴ＿０の各要素を２乗算する。すなわち、ＭＴ＿０＝（Ｒ＾（２＾２５５），（Ｘ×Ｒ）＾（２＾２５５））⇒ＭＴ＿０＝（Ｒ＾（２＾２５６），（Ｘ×Ｒ）＾（２＾２５６））⇒ＭＴ＿１＝（Ｓ×Ｒ＾（２＾２５６），Ｓ×（Ｘ×Ｒ）＾（２＾２５６））と求め、ＭＴ＿１の乗数をそれぞれＳ×Ｒ＾（２＾２５６），Ｓ×（Ｘ×Ｒ）＾（２＾２５６）とする。
【０１８４】
さらに、例えば、実施の形態２における乱数シード格納部に格納する乱数シードＵ、乱数除去シードＶをＶ＝Ｕ＾（−２＾２５６−１）となるよう設定する。このように設定することにより、ＲとＳの関係もＳ＝Ｒ＾（−２＾２５６−１）となる。その結果、先で述べたＭＴ＿１の乗数は、Ｓ×Ｒ＾（２＾２５６）＝Ｒ＾（−１），Ｓ×（Ｘ×Ｒ）＾（２＾２５６）＝Ｘ＾（２＾２５６）×Ｒ＾（−１）となる。その結果、乗数群ＭＴ＿１を用いて乗算を実行することで、ＭＴ＿０の初期値である（Ｒ，Ｘ×Ｒ）を用いて乗算を実行したときの乱数Ｒの影響を相殺することができる。それ以降のビットに対しても、２乗算部の２乗算により、（Ｒ＾（−２），Ｘ＾（２＾２５７）×Ｒ＾（−２））、（Ｒ＾（−４），Ｘ＾（２＾２５８）×Ｒ＾（−４））、・・・、（Ｒ＾２５５，Ｘ＾（２＾５１１）×Ｒ＾（−２５５））と順次変化していくことで、それぞれの下位ビットの乱数の影響を対となる上位ビットの処理で相殺することが可能になる。
【０１８５】
なお、実施の形態１においても、乱数群ＲＴ＿ｉに含まれるＲ＿ｉ、Ｓ＿ｉは、上述したようにＳ＝Ｒ＾（−２＾２５６−１）となるように設定すればよい。
（７）実施の形態１〜３では、複数の乗数群をそれぞれ設定しているが、一つの乗数群を用いて乗数群設定部では計算した結果を置き換えてもよい。
（８）実施の形態１における乱数群格納部に格納されている乱数の一部または全部を乱数シードとし、乱数除去数の一部または全部を乱数除去シードとして、それぞれを実施の形態２のようにべき乗して、それらの結果を掛け合わせることで乱数群を生成してもよい。また、同様に実施の形態１と３を組み合わせてもよい。
【０１８６】
（９）実施の形態１〜３では、乱数と乱数除去数または乱数シードと乱数除去シードを予め格納しておくとしていたが、最初に暗号処理を行う際に、秘密鍵からそれらを計算して、格納するとしてもよい。その構成にすることで、装置を製造する時点では乱数と乱数除去数または乱数シードと乱数除去シードを格納する必要がなくなる。また、秘密鍵は外部から与えられるとしてもよい。さらに、暗号処理を実行するごとに、毎回秘密鍵から乱数と乱数除去数を計算して利用するとしてもよい。
【０１８７】
（１０）実施の形態１〜３における乱数はどのような値でもよく、秘密鍵や公開鍵の値や、べき乗以外の機能において格納している値を流用してもよい。また、中国人の剰余定理を用いる場合も、ｍｏｄ  ｐにおける乱数Ｒｐとｍｏｄ  ｑにおける乱数Ｒｑを同じ値としてもよい。そうすることで、メモリサイズを削減できる。また、乱数でなく、乱数除去数を流用するとしてもよい。どちらの場合も、乱数と乱数除去数の関係は維持する必要がある。
【０１８８】
（１１）実施の形態１〜３に他の電力差分攻撃対策、例えば、Ｅｘｐｏｎｅｎｔ  Ｂｌｉｄｉｎｇを追加で施してもよい。Ｅｘｐｏｎｅｎｔ  Ｂｌｉｎｄｉｎｇを用いる場合は、べき値が毎回ランダムに変化するため、安全性がより高まる。
（１２）実施の形態２に対し、中国人の剰余定理を用いる場合において、最初にｍｏｄ  ｐの乱数シード及び乱数除去シードのｗ乗を実行し、ｍｏｄ  ｐにおける乗数群を用いたべき乗演算が終了した後に、ｍｏｄ  ｑの乱数シード及び乱数除去シードのｗ乗を実行して、ｍｏｄ  ｐの乱数シード及び乱数除去シードの格納領域を書き替えるとしてもよい。そうすることで、乱数及び乱数除去数のメモリサイズを削減できる。
【０１８９】
（１３）実施の形態２において、ｗ乗演算は従来の方法を用いるとしていたが、これを、電力差分攻撃対策を施したものとしてもよい。そうすることで、より安全性が高まる。
（１４）実施の形態１〜３では、乱数と乱数除去数の組み合わせで、乱数の影響を相殺していたが、これに限らない。３つ以上の乱数の組み合わせで、乱数の影響を相殺するとしてもよい。この場合、乱数群はこれらの互いに相殺する乱数の組とする。
【０１９０】
（１４−１）以下、乱数Ｒ、Ｒ’の影響を乱数除去数Ｓで相殺する場合について、図３１用いて説明する。なお、説明を簡単に行うために、ｃｏｕｎｔ＝ｉ、ｊ、ｋに着目して説明する。
ここで、ｃｏｕｎｔ＝ｉのときに、乱数Ｒが初めて出現し、ｃｏｕｎｔ＝ｊのときに、更新された乱数Ｒ’が初めて出現するものとする。また、ｃｏｕｎｔ＝ｋのときに、これら乱数の影響を相殺するものとし、Ｓ＝Ｒ＾（−２＾ｐ）×Ｒ’＾（−２＾ｑ）とする。
【０１９１】
図３１にて示すように、ｃｏｕｎｔ＝ｉのときに乱数Ｒが、ｃｏｕｎｔ＝ｊのときに乱数Ｒ’がそれぞれ出現し、ｃｏｕｎｔ＝ｋの時点における２乗演算により、乱数Ｒ及びＲ’それぞれに対して、合計ｐ回、ｑ回の２乗演算が施される。
そして、ｃｏｕｎｔ＝ｋの時点の乗算演算（例えば、図５にて示すステップＳ１３５、又は１４０）において、乱数除去数Ｓ（＝Ｒ＾（−２＾ｐ）×Ｒ’＾（−２＾ｑ））を用いることで、乱数Ｒ及びＲ’に対する演算結果（Ｒ＾（２＾ｐ）、及びＲ’＾（２＾ｐ））が相殺される。
【０１９２】
このとき、べき乗演算装置は、乱数Ｒ、Ｒ’及び乱数除去数Ｓの３つの数からなる組を予め記憶してもよい。
または、べき乗演算装置は、乱数Ｒ、Ｒ’、乱数Ｒ、Ｒ’それぞれに対する乱数除去数Ｓ＿１、ｓ＿２とからなる４つの組を予め記憶しておき、乱数除去数Ｓ＿１とＳ＿２とから乱数除去数Ｓを算出してもよい。
【０１９３】
なお、乱数除去数Ｓを算出するタイミングは、乱数Ｒ及びＲ’に対する演算結果（Ｒ＾（２＾ｐ）、及びＲ’＾（２＾ｐ））を相殺するための演算を施す前であればいつでもよい。
（１４−２）以下、乱数Ｒの影響を、乱数除去数Ｓ、Ｓ’で相殺する場合においては、乱数Ｒと、乱数除去数Ｓ、Ｓ’との関係を以下のようにすればよい。なお、乱数Ｒが出現してから乱数除去数Ｓによる乗算が行われる際には、乱数Ｒに対してｉ回の２乗演算が施されるものとする。
【０１９４】
乱数Ｒと乱数除去数Ｓとの関係をＳ＝Ｒ＾（−２＾ｉ）とし、乱数Ｒと乱数除去数Ｓ’との関係をＳ’＝Ｒ＾（−２＾（ｉ＋１−ｊ））とする。なお、ｊはｉより小さい整数である。
この場合、乱数Ｒに対してｉ回の２乗演算が施された直後に、乱数除去数Ｓ（＝Ｒ＾（−２＾ｉ））による乗算を行うことで、値Ｒ＾（２＾ｉ）のうちの一部がキャンセルされ、値Ｒ＾（２＾（ｉ−ｊ））が残っている状態となる。この値Ｒ＾（２＾（ｉ−ｊ））に対して２乗演算が施され、演算結果は値Ｒ＾（２＾（ｉ−ｊ＋１））となり、乱数除去数Ｓ’（＝Ｒ＾（−２＾（ｉ＋１−ｊ）））を用いて乗算することにより、値Ｒ＾（２＾（ｉ−ｊ＋１））がキャンセルされる。
【０１９５】
（１５）本発明は、べき乗を演算するのではなく、楕円曲線の点のスカラ倍点を演算するとしてもよい。その場合、べき乗演算装置１０００で実施している乗算は楕円加算であり、２乗算は楕円２倍算となる。また、「べき」は「スカラ」に対応する。
具体的には、実施の形態１にて示す乗算“Ｚ←Ｚ×Ｘｉ０”を楕円加算“Ｚ←Ｚ＋Ｘｉ０”に置き換わり、乗算“Ｚ←Ｚ×Ｘｉ１（＝Ｚ×Ｘ×ＲＳ）”を楕円加算“Ｚ←Ｚ＋Ｘｉ１（＝Ｚ＋Ｘ＋ＲＳ）”に置き換わる。また、実施の形態１にて示す２乗算“Ｚ←Ｚ＾２”は、楕円２倍算“Ｚ←２＊Ｚ（＝Ｚ＋Ｚ）”に置き換わる。
【０１９６】
楕円曲線の点のスカラ倍点を演算する場合について、以下に具体例を示す。
ここでは、装置Ａと装置Ｂとの間で行われる鍵共有の一例について、図３２に示す流れ図を用いて説明する。
装置Ａは、秘密鍵ｘＡを設定して保持している（ステップＳ９０１）。また、装置Ｂは、秘密鍵ｘＢを設定して保持している（ステップＳ９３１）。
【０１９７】
楕円曲線を保持している管理センタが存在し、管理センタには、管理センタ装置が設置９６０されている。管理センタに設置されている管理センタ装置９６０は、楕円曲線Ｅ：ｙ＾２＝ｘ＾３＋ａｘ＋ｂの適切なパラメータａ及びｂを選択して保持しており、また、素数ｐ及び楕円曲線Ｅ上の適切な元Ｇを選択して保持している（ステップＳ９１１）。
管理センタ装置９６０は、素数ｐ、楕円曲線Ｅ及び元Ｇを公開する（ステップＳ９１３）。
【０１９８】
装置Ａは、公開鍵ＹＡ＝ｘＡ＊Ｇを算出し（ステップＳ９０２）、算出した公開鍵ＹＡを装置Ｂへ出力する（ステップＳ９０３）。また、装置Ｂは、公開鍵ＹＢ＝ｘＢ＊Ｇを算出し（ステップＳ９３２）、算出した公開鍵ＹＢを装置Ａへ出力する（ステップＳ９３３）。
次に、装置Ａは、共有鍵ｘＡ＊ＹＢを算出する（ステップＳ９０４）。ここで、共有鍵ｘＡ＊ＹＢ＝（ｘＡ×ｘＢ）＊Ｇである。
【０１９９】
一方、装置Ｂは、共有鍵ｘＢ＊ＹＡを算出する（ステップＳ９３４）。ここで、共有鍵ｘＢ＊ＹＡ＝（ｘＢ×ｘＡ）＊Ｇ＝（ｘＡ×ｘＢ）＊Ｇ＝ｘＡ＊ＹＢである。
このようにして、装置Ａ及び装置Ｂは、同じセッション鍵を共有することができる。
ここで、楕円曲線上の離散対数問題を安全性の根拠としている。
また、記号＊は、楕円曲線に含まれる元を複数回加算する演算を示し、ｘ＊Ｇは、次式に示すように、楕円曲線に含まれる元Ｇをｘ回加算することを意味する。
【０２００】
ｘ＊Ｇ＝Ｇ＋Ｇ＋Ｇ＋・・・＋Ｇ
次に、楕円曲線上の楕円べき倍演算について、以下に簡単に説明する。
一例として、１００＊Ｐを計算する。
１００＊Ｐ＝２（２（Ｐ＋２（２（２（Ｐ＋２Ｐ）））））と表すと、１００＊Ｐは、楕円曲線上の点による６回の２倍算と２回の加算により計算される。
【０２０１】
このように、楕円べき倍演算は、２倍算及び加算による演算に帰着する。
ここで、楕円曲線の方程式を  ｙ＾２＝ｘ＾３＋ａｘ＋ｂ  とし、楕円曲線上の任意の点Ｐの座標を（ｘ１、ｙ１）とし、任意の点Ｑの座標を（ｘ２、ｙ２）とする。ここで、Ｒ＝Ｐ＋Ｑで定まる点Ｒの座標を（ｘ３、ｙ３）とする。
点Ｐと点Ｑが等しくない場合、Ｒ＝Ｐ＋Ｑは、加算の演算となる。加算の公式を以下に示す。
【０２０２】
ｘ３  ＝  ｛（ｙ２−ｙ１）／（ｘ２−ｘ１）｝＾２  −  ｘ１  −  ｘ２
ｙ３  ＝  ｛（ｙ２−ｙ１）／（ｘ２−ｘ１）｝（ｘ１−ｘ３）  −  ｙ１
点Ｐと点Ｑとが等しい場合、Ｒ＝Ｐ＋Ｑ＝Ｐ＋Ｐ＝２×Ｐとなり、Ｒ＝Ｐ＋Ｑは、２倍演算となる。２倍演算の公式を以下に示す。
ｘ３  ＝  ｛（３×ｘ１＾２＋ａ）／（２×ｙ１）｝＾２  −  （２×ｘ１）
ｙ３  ＝  ｛（３×ｘ１＾２＋ａ）／（２×ｙ）｝（ｘ１−ｘ３）  −  ｙ１
ここで、上記演算は、楕円曲線が定義されている有限体上での演算である。
【０２０３】
なお、楕円曲線の演算公式については、“Ｅｆｆｉｃｉｅｎｔ  ｅｌｌｉｐｔｉｃ  ｃｕｒｖｅ  ｅｘｐｏｎｅｎｔｉａｔｉｏｎ”（Ｍｉｙａｊｉ，  Ｏｎｏ，  ａｎｄ  Ｃｏｈｅｎ著、Ａｄｖａｎｃｅｓ  ｉｎ  ｃｒｙｐｔｏｌｏｇｙ−ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＩＣＩＣＳ’９７，  Ｌｅｃｔｕｒｅ  ｎｏｔｅｓ  ｉｎ  ｃｏｍｐｕｔｅｒ  ｓｃｉｅｎｃｅ，１９９７，Ｓｐｒｉｎｇｅｒ−ｖｅｒｌａｇ，２８２−２９０．）に詳しく説明されている。
【０２０４】
（１６）本発明における群とは、実施の形態１から３における“ｍｏｄ  ｎ”による集合である剰余体、及び上記（１５）における楕円曲線に相当する。
ここで、群とは、集合Ｇが以下に示す性質Ｇ０からＧ３を持つ場合をいう。
（Ｇ０）Ｇの任意の２つ元ａ，ｂに対して、積ａｂが定義されてＧに属する。
（Ｇ１）Ｇの任意の３元ａ，ｂ，ｃに対して、（ａｂ）ｃ＝ａ（ｂｃ）が成り立つ（結合法則）。
【０２０５】
（Ｇ２）Ｇの任意の元ａに対して、ａｅ＝ｅａを満たすＧの元ｅが存在する（単位元の存在）。
（Ｇ３）Ｇの任意の元ａに対して、ａｂ＝ｂａ＝ｅを満たすＧの元ｂが存在する（逆元の存在）。
なお、上記の群の定義は、剰余体における群に定義を示しているが、上記の定義において積を和と考えることで、楕円曲線上の群が定義される。
【０２０６】
また、本発明における基本演算及びウィンドウ演算とは、実施の形態１から３における乗算、及び上記（１５）における楕円加算に相当する。
また、桁上演算とは、実施の形態１から３における２乗算（２＾ｖ）、及び上記（１５）における楕円２倍算（２＊ｖ）に相当する。
（１７）本発明は、べき乗演算装置でなく、これを利用するＲＳＡ暗号の復号化装置やＲＳＡ署名の署名生成装置であってもよい。また、秘密情報をべき値としたべき乗演算を実行する情報セキュリティ装置であってもよい。例えば、ＥｌＧａｍａｌ暗号の復号化装置であったり、ＤＳＡ署名の署名生成装置であったりしてもよい。
【０２０７】
（１８）上記各実施の形態及び変形例は、次に示すような場合において適用される。
（１８−１）各実施の形態及び変形例は、公開鍵暗号方式における暗号文の復号や署名データの生成において適用される。これらについては、上記において、対象データＸのべき乗演算結果として説明している。
（１８−２）各実施の形態及び変形例は、認証において適用される。認証とは、メッセージが自称どおりの人物によって送られたこと、またメッセージが改ざんされていないことの検証である。また、各実施の形態及び変形例は、身分の証明において適用される。身分の証明とは、例えば、データへのアクセス権、又は施設へのアクセス権（入室権）を持つことの証明、又は自分が主張どおりの人物であることの証明である。さらに、各実施の形態及び変形例は、否認防止において適用される。否認防止とは、例えば、実は何かに同意したのに、同意していないと主張する者に対抗することをいう。
【０２０８】
（１８−３）各実施の形態及び変形例は、鍵交換において適用される。鍵交換とは、例えば、２人の人が放送電波を使ってある秘密鍵暗号方式で使うための秘密鍵を共有することである。
（１８−４）各実施の形態及び変形例は、硬貨投げ（ビットコミットメントとも呼ばれる）において適用される。硬貨投げとは、例えば、別々の市に住む２人のチェスプレーヤが、電子メールで、誰が白を持つかを決めることである。
【０２０９】
（１８−５）各実施の形態及び変形例は、秘密分散において適用される。秘密分散とは、例えば、ある秘密の情報が、共に働くｋ人の人によって利用可能であるが、ｋ−１人の人では、利用できないようにすることをいう。
（１８−６）各実施の形態及び変形例は、零知識証明において適用される。零知識証明とは、例えば、ある人が、数論的あるいは組み合わせ論的問題を解くことに成功したことを、解がなんであるかのわずかな情報さえ与えることなく、他人にこのことを納得させることをいう。
【０２１０】
（１９）上記実施の形態１において、秘密鍵ｄに対する全てのビットに対して、ステップＳ１３５及びＳ１４０の何れかにおいて乱数Ｒ若しくは乱数除去数Ｓを用いたが、これに限定されない。
１つ以上の特定のビットそれぞれに対して乱数Ｒを用いて乗算を施してもよい。各特定のビットに対して、当該特定のビットにて出現した乱数Ｒに対して、所定回数の２乗演算を繰り返した直後における演算対象のビットに対して前記乱数Ｒに対応する乱数除去数Ｓを用いて乗算を施すことで、当該特定のビットにて出現した乱数Ｒに対する２乗演算の影響をキャンセルすることができる。このとき、特定のビットは最下位ビット以外のビットとする。
【０２１１】
以下、特定のビットが１つの場合を用いて説明する。
５１１番目のビットから２５６番目のビットのうちｉ番目のビットに対して、乱数Ｒを用いて乗算を施して、その後、（ｉ−２５６）番目のビット、つまり、２乗演算が２５６回施された直後の演算対象のビットに対して前記乱数Ｒに対応する乱数除去数Ｓを用いて乗算を施す。このとき、他のビットにおいては、従来と同様に、ビット値が０である場合には、中間値Ｚに値１を乗算し、ビット値が１である場合には、中間値に対象データＸを乗算する。
【０２１２】
また、実施の形態２においても同様に、１つ以上の特定のビットそれぞれに対して乱数Ｒを用いて乗算を施してもよい。このとき、特定のビットは最下位ビット以外のビットとする。
また、実施の形態３においても同様に、１つ以上の特定のウィンドウそれぞれに対して乱数Ｒを用いて乗算を施してもよい。このとき、特定のウィンドウは最下位のウィンドウ以外のウィンドウとする。
【０２１３】
（２０）上記実施の形態１、２において、べき乗演算装置は、ビット毎に乗算に用いる乱数を更新してもよい。
また、上記実施の形態３においても同様に、べき乗演算装置は、ウィンドウ毎に乗算に用いる乱数を更新してもよい。
（２１）上記実施の形態１において、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾（ｄ＿ｉ）×ＲＳ＿（ＲＳＩ＿ｉ））としてもよい。ここで、ＲＳ＿（ＲＳＩ＿ｉ）は、Ｒ＿（ＲＳＩ＿ｉ）及びＳ＿（ＲＳＩ＿ｉ）の何れかである。
【０２１４】
なぜなら、ｄ＿ｉが０である場合には、Ｘ＾（ｄ＿ｉ）＝１であるので、Ｘ＿ｉ＝Ｒ＿（ＲＳＩ＿ｉ）となり、Ｘ＿ｉ０と同値となる。また、ｄ＿ｉが１である場合には、Ｘ＾（ｄ＿ｉ）＝Ｘであるので、Ｘ＿ｉ＝Ｘ×Ｒ＿（ＲＳＩ＿ｉ）となり、Ｘ＿ｉ１と同値となる。
また、上記実施の形態２においても同様に、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾（ｄ＿ｉ）×ＲＳ）としてもよい。ここで、ＲＳは、Ｒ及びＳの何れかである。
【０２１５】
また、上記実施の形態３においても同様に、べき乗演算装置の乗算部にて用いられる演算式をＸ＿ｉ（＝Ｘ＾ｗ×ＲＳ）としてもよい。ここで、ＲＳは、Ｒ及びＳの何れかであり、ｗはウィンドウが示す値である。
（２２）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
【０２１６】
（２３）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。
【０２１７】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていても良いし、一部又は全てを含むように１チップ化されてもよい。
また、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０２１８】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適用等が可能性としてありえる。
（２４）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０２１９】
（２５）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。
【０２２０】
また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【０２２１】
また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（２６）上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
５．まとめ
（１）本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。
【０２２２】
（２）上記（１）のべき乗演算装置において、前記組み合わせの各々は、丁度２個の前記乗数群設定部を含むとしてもよい。
（３）上記（２）のべき乗演算装置は、２個の前記乗数群設定部を含み、前記乗数群設定部集合は１つであるとしてもよい。
（４）上記（３）のべき乗演算装置は、さらに、カウンタを格納するカウンタ格納部と、カウンタの値を更新するカウンタ更新部と、カウンタの値を判定するカウンタ判定部とを備え、前記秘密情報判定部は、前記カウンタの値に基づき判定し、前記乗数群更新部は、前記カウンタ判定部の判定結果に基づき、前記乗数を更新するとしてもよい。
【０２２３】
（５）上記（４）のべき乗演算装置において、２以上の前記乗数群設定部の中で、１番目に処理をする前記乗数群設定部である第１の乗数群設定部は、前記乗算部及び前記２乗算部より前に実行し、２以上の前記乗数群設定部の中で、２番目に処理をする前記乗数群設定部である第２の乗数群設定部は、前記カウンタ判定部において前記カウンタの値が前記べき値のビット列の真ん中であることを示す場合に実行するとしてもよい。
【０２２４】
（６）上記（２）から（５）の何れかのべき乗演算装置は、さらに、予め与えられた１以上の乱数シードに基づいて前記乱数群を設定する乱数群設定部を備えるとしてもよい。
（７）上記（２）から（６）の何れかのべき乗演算装置において、前記乗数群設定部は、前記乱数群に含まれる前記乱数をランダムに選択するとしてもよい。
（８）上記（２）又は（６）のべき乗演算装置において、前記乱数群設定部は、１以上の前記乱数シードそのものを前記乱数群として設定するとしてもよい。
【０２２５】
（９）上記（２）又は（６）のべき乗演算装置において、前記乱数群設定部は、ランダムなべき値であるランダムべき値を生成し、前記ランダムべき値をべき値として前記乱数シードをべき乗して、前記乱数を求めることで前記乱数群を設定するとしてもよい。
（１０）上記（１）から（９）の何れかのべき乗演算装置において、前記乗数群格納部は、２個の前記乗数Ｘ＿０、Ｘ＿１を格納し、前記乗数群更新部は、前記乗数Ｘ＿０、Ｘ＿１に対し、前記乗数Ｘ＿０を２乗した結果を前記乗数Ｘ＿０に対する更新乗数Ｘ＿０'とし、前記対象データと前記更新乗数Ｘ＿０を掛けた結果を前記乗数Ｘ＿１に対する更新乗数Ｘ＿１'とし、それぞれの前記更新乗数Ｘ＿０'、Ｘ＿１'を前記乗数群格納部に格納することを特徴とする（ｘ＿ｙは、ｘに下付きインデックスｙが付けられていることを示す。）。
【０２２６】
（１１）上記（１）から（９）の何れかのべき乗演算装置において、前記乗数群格納部は、２＾ｋ（ｋは２以上）個の前記乗数Ｘ＿０、Ｘ＿１、Ｘ＿２、・・・、Ｘ＿（２＾ｋ）を格納し、前記乗数群更新部は、前記乗数Ｘ＿０、Ｘ＿１に対し、前記乗数Ｘ＿０を２乗した結果を前記乗数Ｘ＿０に対する更新乗数Ｘ＿０'とし、前記対象データと前記更新乗数Ｘ＿０を掛けた結果を前記乗数Ｘ＿１に対する更新乗数Ｘ＿１'とし、それぞれの前記更新乗数Ｘ＿０'、Ｘ＿１'を前記乗数群格納部に格納することを特徴とする（ｘ＾ｙはｘのｙ乗を示す。）。
【０２２７】
（１２）また、本発明は、暗号文を入力し、秘密の数である秘密情報をべき値とした前記暗号文のべき乗演算結果を復号文として出力する復号化装置であって、前記暗号文の入力を受け付け、前記復号文を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。
【０２２８】
（１３）また、本発明は、署名対象データを入力し、秘密の数である秘密情報をべき値とした前記署名対象データのべき乗演算結果を署名データとして出力する署名生成装置であって、前記署名対象データの入力を受け付け、前記署名データを出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。
【０２２９】
（１４）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算方法であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力ステップと、前記秘密情報を格納する秘密情報格納ステップと、中間値を格納する中間値格納ステップと、前記秘密情報に対し、判定する秘密情報判定ステップ複数個の乗数からなる２以上の乗数群を格納する乗数群格納ステップと、複数個の乱数からなる乱数群を格納する乱数群格納ステップと、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定する２以上の乗数群設定ステップと、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行する乗算ステップと、前記中間値の２乗算を実行する２乗算ステップと、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新する乗数群更新ステップとを備え、前記乗算ステップで使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数群に含まれる複数個の前記乗数から選択し、すべての前記乗数群設定ステップは、前記乗数群設定ステップ、前記乗数群設定ステップ以外の１以上の乗数群設定ステップ、前記２以上の乗数群設定ステップで設定する前記乗数群を用いて乗算する前記乗算ステップ、前記２乗算ステップと前記乗数群更新ステップの処理の組み合わせによって、前記２以上の乗数群設定ステップで設定した前記乱数の影響を相殺することを特徴とする。
【０２３０】
（１５）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置に実行させるプログラムであって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力ステップと、前記秘密情報を格納する秘密情報格納ステップ中間値を格納する中間値格納ステップと、前記秘密情報に対し、判定する秘密情報判定ステップと、複数個の乗数からなる２以上の乗数群を格納する乗数群格納ステップと、複数個の乱数からなる乱数群を格納する乱数群格納ステップと、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定する２以上の乗数群設定ステップと、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行する乗算ステップと、前記中間値の２乗算を実行する２乗算ステップと、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新する乗数群更新ステップとを前記べき乗演算装置に実行させ、前記乗算ステップで使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数群に含まれる複数個の前記乗数から選択し、すべての前記乗数群設定ステップは、前記乗数群設定ステップ、前記乗数群設定ステップ以外の１以上の乗数群設定ステップ、前記２以上の乗数群設定ステップで設定する前記乗数群を用いて乗算する前記乗算ステップ、前記２乗算ステップと前記乗数群更新ステップの処理の組み合わせによって、前記２以上の乗数群設定ステップで設定した前記乱数の影響を相殺することを特徴とする。
【０２３１】
（１６）また、本発明は、上記（１５）に記載のプログラムを記録した媒体であることを特徴とする。
（１７）また、本発明は、対象データを入力し、秘密の数である秘密情報をべき値とした前記対象データのべき乗演算結果を出力するべき乗演算装置の集積回路であって、前記対象データの入力を受け付け、前記対象データのべき乗演算結果を出力する入出力部と、前記秘密情報を格納する秘密情報格納部と、中間値を格納する中間値格納部と、前記秘密情報に対し、判定する秘密情報判定部と、複数個の乗数からなる２以上の乗数群を格納する乗数群格納部と、複数個の乱数からなる乱数群を格納する乱数群格納部と、２以上の前記乗数群のそれぞれに対し、前記乱数群に含まれる前記乱数に基づいて、前記乗数群を設定して前記乗数群格納部に格納する２以上の乗数群設定部と、２以上の前記乗数群に対し、前記秘密情報判定部の判定結果に基づいて、前記中間値と、前記乗数群に属する前記乗数との乗算を実行し、乗算結果を前記中間値格納部に格納する乗算部と、前記中間値の２乗算を実行し、２乗算結果を前記中間値格納部に格納する２乗算部と、前記乗数群に含まれる前記乗数に基づいて、前記乗数群を更新して前記乗数群格納部に格納する乗数群更新部とを備え、前記乗算部で使用する前記乗数は、前記秘密情報判定部の判定結果に基づき、前記乗数格納部に格納されている複数個の前記乗数から選択し、すべての前記乗数群設定部は、前記乗数群設定部、前記乗数群設定部以外の１以上の乗数群設定部、前記２以上の乗数群設定部で設定する前記乗数群を用いて乗算する前記乗算部、前記２乗算部と前記乗数群更新部の処理の組み合わせによって、前記２以上の乗数群設定部で設定した前記乱数の影響を相殺することを特徴とする。
【０２３２】
（１８）本発明によると、ＢｉｇＭａｃ攻撃により安全性を低下することを防ぎつつ、対象データのべき乗演算を行う過程において、乱数Ｒの影響をキャンセルするので、従来のように別途キャンセル処理を必要としない。よって、その価値は大きい。
【産業上の利用可能性】
【０２３３】
本発明は、上記にて示すべき乗演算装置、公開鍵暗号による暗号文を復号する装置、及び公開鍵暗号による署名データを生成する装置の製造及び販売する産業において、経営的、継続的、反復的に利用可能である。
また、本発明によるべき乗演算装置を用いることで、ＢｉｇＭａｃ攻撃による秘密鍵の解析を困難にすることができる。
【図面の簡単な説明】
【０２３４】
【図１】べき乗演算装置１０００の構成を示すブロック図である。
【図２】乗数群格納部１１３０にて格納される乗数群を示す図である。
【図３】乱数群格納部１１４０にて格納される乱数群を示す図である。
【図４】乱数選択情報生成部１１７０による配列ＲＳＩを生成する動作を示す流れ図である。
【図５】べき乗演算装置１０００の動作を示す流れ図である。図６へ続く。
【図６】べき乗演算装置１０００の動作を示す流れ図である。図５から続く。
【図７】ＭＴ＿ｉの初期化処理の動作を示す流れ図である。
【図８】ＭＴ＿ｉの更新処理の動作を示す流れ図である。
【図９】秘密鍵を構成するサブブロック毎に、割り当てる乗数を変化させる具体例を示す図である。
【図１０】攻撃者による秘密鍵ｄのビットの分類、推測が困難となることを説明する図である。
【図１１】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを説明する図である。
【図１２】ｃｏｕｎｔ（＝ｉ）番目に出現した乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを説明する図である。
【図１３】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを、上位ビット及び下位ビットに分割して説明する図である。
【図１４】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１５へ続く。
【図１５】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１４から続き、図１６へ続く。
【図１６】乱数Ｒにべき乗演算を所定回数（２５６回）施した後に、キャンセルされることを具体例を用いて説明する図である。図１５から続く。
【図１７】べき乗演算装置２０００の構成を示すブロック図である。
【図１８】乗数群格納部２１３０にて格納される乗数群を示す図である。
【図１９】乱数群格納部２１４０にて格納される乱数群を示す図である。
【図２０】べき乗演算装置２０００の動作を示す流れ図である。図２１へ続く。
【図２１】べき乗演算装置２０００の動作を示す流れ図である。図２０から続く。
【図２２】乱数群ＲＴの設定処理の動作を示す図である。
【図２３】べき乗演算装置３０００の構成を示すブロック図である。
【図２４】乗数群格納部３１３０にて格納される乗数群を示す図である。
【図２５】秘密鍵ｄを構成する複数の分割秘密情報の一例を示す図である。
【図２６】べき乗演算装置３０００の動作を示す流れ図である。図２７へ続く。
【図２７】べき乗演算装置３０００の動作を示す流れ図である。図２６から続く。
【図２８】ＭＴ＿ｉの初期化処理の動作を示す流れ図である。
【図２９】２乗演算処理の動作を示す流れ図である。
【図３０】ＭＴ＿ｉの更新処理の動作を示す流れ図である。
【図３１】２つの乱数Ｒ、Ｒ’と１つの乱数除去数Ｓとで、乱数Ｒ、Ｒ’に対する演算の影響をキャンセルする一例を示す図である。
【図３２】装置Ａと装置Ｂとの間で行われる楕円曲線を用いた鍵共有の一例について、その動作を示す流れ図である。
【符号の説明】
【０２３５】
１０００、２０００、３０００    乗演算装置
１０１０、２０１０、３０１０    入出力部
１０２０、２０２０、３０２０    秘密鍵格納部
１０３０、２０３０、３０３０    カウンタ格納部
１０４０、２０４０、３０４０    カウンタ初期化部
１０５０、２０５０、３０５０    カウンタ更新部
１０６０、２０６０、３０６０    第１のカウンタ判定部
１０７０、２０７０、３０７０    第２のカウンタ判定部
１０８０、２０８０、３０８０    第３のカウンタ判定部
１０９０、２０９０    ビット判定部
１１００、２１００、３１００    乗算部
１１１０、２１１０、３１１０    ２乗算部
１１２０、２１２０、３１２０    中間値格納部
１１３０、２１３０、３１３０    乗数群格納部
１１４０、２１４０、３１４０    乱数群格納部
１１５０、２１５０、３１５０    乗数群設定部
１１６０、２１６０、３１６０    乗数群更新部
１１７０    乱数選択情報生成部
２１８０、３１８０    乱数シード格納部
２１９０、３１９０    乱数群設定部
３０９０    乗数選択部
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2008149496.tif 000035
【図２】
2008149496.tif 000036
【図３】
2008149496.tif 000037
【図４】
2008149496.tif 000038
【図５】
2008149496.tif 000039
【図６】
2008149496.tif 000040
【図７】
2008149496.tif 000041
【図８】
2008149496.tif 000042
【図９】
2008149496.tif 000043
【図１０】
2008149496.tif 000044
【図１１】
2008149496.tif 000045
【図１２】
2008149496.tif 000046
【図１３】
2008149496.tif 000047
【図１４】
2008149496.tif 000048
【図１５】
2008149496.tif 000049
【図１６】
2008149496.tif 000050
【図１７】
2008149496.tif 000051
【図１８】
2008149496.tif 000052
【図１９】
2008149496.tif 000053
【図２０】
2008149496.tif 000054
【図２１】
2008149496.tif 000055
【図２２】
2008149496.tif 000056
【図２３】
2008149496.tif 000057
【図２４】
2008149496.tif 000058
【図２５】
2008149496.tif 000059
【図２６】
2008149496.tif 000060
【図２７】
2008149496.tif 000061
【図２８】
2008149496.tif 000062
【図２９】
2008149496.tif 000063
【図３０】
2008149496.tif 000064
【図３１】
2008149496.tif 000065
【図３２】
2008149496.tif 000066
【国際調査報告】
2008149496.tif 000067
2008149496.tif 000068
2008149496.tif 000069