(57)【要約】  楕円曲線暗号に関し、メモリ使用量を少なく抑えつつ、SPA攻撃とDPA攻撃の双方に対する安全性を保って、スカラー倍算を行う暗号処理を提供する。乱数生成部は、ｂビットの2進数の乱数ｓを生成する。ウィンドウ値決定部は、現在の秘密鍵dの最下位からｋビットを取り出して2進数のウィンドウ列w(i)として計算する。補正値計算部は、ウィンドウ列w(i)の最上位ビットが0ならば、ウィンドウ列w(i)の上位ビット側に乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、ウィンドウ列w(i)の最上位ビットが1ならば、2進法におけるウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dからビット列-xを減算して新たな秘密鍵dのビット列とする。制御部は、ウィンドウ値決定部の処理と補正値計算部の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる。以上の処理の後に出力された秘密鍵dと、乱数sと、各ウィンドウ列と、補正値d’とを用いて、暗号演算を実行する。
2012090288.tif 000002
【特許請求の範囲】
【請求項１】
ｂビットの2進数の乱数ｓを生成する乱数生成部と、
b,m,k,i,を０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からｋビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定部と、
前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算部と、
前記ウィンドウ値決定部の処理と前記補正値計算部の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる制御部と、
前記制御部での動作が終了した後に得られる前記各ウィンドウ列w(i)を格納するウィンドウ値格納部と、
前記制御部での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する補正値格納部と、
前記乱数生成部が生成した乱数sを格納する乱数格納部と、
前記秘密鍵dと、前記乱数格納部に格納された乱数sと、前記ウィンドウ値格納部に格納された各ウィンドウ列と、前記補正値格納部に格納された補正値d’とを用いて、暗号演算を実行する暗号演算実行部と、
を備えることを特徴とする暗号処理装置。
【請求項２】
前記乱数生成部は、前記乱数を、前記ウィンドウ列w(i)または前記ビット列vが取り得る値iごとに乱数s(i)として生成し、
前記補正値計算部は、前記ウィンドウ列w(i)または前記ビット列vに、前記ウィンドウ列w(i)または前記ビット列vごとの乱数s(w(i))またはs(v)を結合し、
前記乱数格納部は、前記ウィンドウ列w(i)または前記ビット列vが取り得る値iごとの乱数s(i)を格納する、
ことを特徴とする請求項１に記載の暗号処理装置。
【請求項３】
b,m,k,i,jを０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’とを用いて、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する暗号処理装置であって、
前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成するランダム化テーブル生成部と、
前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の２倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行する符号付ランダム化ウィンドウ法計算部と、
前記出力変数Vの値を暗号演算の結果として出力する出力部と、
を備えることを特徴とする暗号処理装置。
【請求項４】
前記乱数格納部には、前記ウィンドウ列の値ごとの乱数が格納され、
前記ランダム化テーブル生成部は、前記kビットのビット列の値に対応する乱数を前記kビットのビット列に結合する、
ことを特徴とする請求項３に記載の暗号処理装置。
【請求項５】
コンピュータが、
ｂビットの2進数の乱数ｓを生成し、
b,m,k,i,を０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からｋビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定処理を実行し、
前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算処理を実行し、
前記ウィンドウ値決定処理と前記補正値計算処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させ、
前記繰り返しの実行が終了した後に得られる前記各ウィンドウ列w(i)を出力し、
前記繰り返しの実行が終了した後に得られる秘密鍵dのビット列を補正値d’として出力し、
前記秘密鍵dおよび前記乱数sを出力し、
それぞれ出力された前記秘密鍵dと、前記乱数sと、前記各ウィンドウ列と、前記補正値d’とを用いて、暗号演算を実行する、
ことを特徴とする暗号処理方法。
【請求項６】
コンピュータが、
b,m,k,i,jを０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’を入力して、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する暗号処理方法であって、
前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成し、
前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の２倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行し、
前記出力変数Vの値を暗号演算の結果として出力する、
ことを特徴とする暗号処理方法。
【請求項７】
楕円曲線暗号を処理するコンピュータが、
ｂビットの2進数の乱数ｓを生成し、
b,m,k,i,を０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からｋビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定処理を実行し、
前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算処理を実行し、
前記ウィンドウ値決定処理と前記補正値計算処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させ、
前記繰り返しの実行が終了した後に得られる前記各ウィンドウ列w(i)を出力し、
前記繰り返しの実行が終了した後に得られる秘密鍵dのビット列を補正値d’として出力し、
前記秘密鍵dおよび前記乱数sを出力し、
それぞれ出力された前記秘密鍵dと、前記乱数sと、前記各ウィンドウ列と、前記補正値d’とを用いて、暗号演算を行う、
処理を実行させるためのプログラム。
【請求項８】
b,m,k,i,jを０を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’を入力して、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行するコンピュータに、
前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成し、
前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の２倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行し、
前記出力変数Vの値を暗号演算の結果として出力する、
処理を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、楕円曲線暗号装置、暗号処理方法、およびプログラムに関する。
【背景技術】
【０００２】
近年、情報セキュリティ技術の重要性がますます高まってきている。また、情報セキュリティの基盤技術の１つとして、公開鍵暗号（public-key cryptography）が盛んに研究されている。【０００３】
公開鍵暗号にはいくつか種類があり、べき乗剰余演算を利用するRivest, Shamir, Adleman（RSA）アルゴリズムや、楕円曲線上の点のスカラー倍算を利用する楕円曲線暗号（Elliptical Curve Cryptography；ECC）などが知られている。【０００４】
公開鍵暗号の利用においては、セキュリティの維持のために、個人鍵（private key）を秘密に保つことが重要である。ところが、近年では個人鍵を解読する（break）ための、いくつかの攻撃手法が知られている。よって、公開鍵暗号を用いた処理を行う機器が耐タンパ性である（tamper-proof）ためには、少なくとも既知の攻撃手法に対する対策が当該機器において実装されている必要がある。【０００５】
例えば、サイドチャネル攻撃の１種として、電力解析（Power Analysis；ＰＡ）攻撃と呼ばれる攻撃手法が知られている。また、ＰＡには、単純電力解析（Simple Power Analysis；SPA）と電力差分解析（Differential Power Analysis；DPA）の２種類がある。【０００６】
よって、公開鍵暗号を用いた処理を行う機器には、SPA攻撃に対する安全性とDPA攻撃に対する安全性が求められる。例えば、SPA攻撃への対策の１つには「ウィンドウ法（以下「window法」と称する）」と呼ばれる手法があり、DPA攻撃への対策の１つにはデータをランダム化する手法がある。さらに、効率的な耐タンパ性の指数剰余演算および点のスカラー倍算を実現する暗号装置や、指数剰余演算を実行する暗号化方法において、ＰＡ攻撃を用いた個人鍵の推定を困難にし、高い耐タンパ性をもつ暗号プロセッサも提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０００−１３２０９６号公報
【特許文献２】特開２００３−２３３３０７号公報
【特許文献３】国際公開ＷＯ２００９／１２２４６１号公報
【非特許文献】
【０００８】
【非特許文献１】[IEEE P1363] IEEE P1363/D13 (Draft Version 13, November 12, 1999) main document, Standard Specifications for Public Key Cryptography, http://grouper.ieee.org/groups/1363/P1363/draft.html
【非特許文献２】[Kocher99] P.Kocher, J,Jaffe and B.Jun "Differential Power Anaysis", Crypto'99, LNCS 1666, pp.388-397, Springer-Verlag, 1999.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
楕円曲線上の点のスカラー倍算を行う装置において、SPA攻撃への対策として、ウィンドウサイズがｋビットのwindow法（あるいはその変種）が採用される場合、メモリには、ｋビットの各インデックスに対応して楕円曲線上の点を示すデータが格納される。したがって、メモリ使用量はウィンドウサイズｋの指数オーダであり、ウィンドウサイズｋが大きいほど、メモリ使用量も多い。【００１０】
他方で、近年では、サーバ・コンピュータやパーソナル・コンピュータなどの汎用的なコンピュータだけではなく、例えば組み込み機器などの他の様々な装置においても、暗号技術の利用が広まりつつある。スカラー倍算を行う装置には、装置の種類によらず、SPA攻撃とDPA攻撃の双方に対する対策を実装することが求められる。【００１１】
ところが、ある種の装置のメモリ容量は、汎用的なコンピュータのメモリ容量と比べるとかなり少ない。そして、メモリ容量の少ない装置においては、なるべく少ないメモリ使用量で処理を実行することが好ましい。【００１２】
そこで本発明の課題は、メモリ使用量を少なく抑えつつ、SPA攻撃とDPA攻撃の双方に対する安全性を保って、スカラー倍算を行う暗号処理装置、方法、およびプログラムを提供することである。
【課題を解決するための手段】
【００１３】
一態様によれば、ｂビットの2進数の乱数ｓを生成する乱数生成部と、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からｋビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定部と、  前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算部と、前記ウィンドウ値決定部の処理と前記補正値計算部の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる制御部と、前記制御部での動作が終了した後に得られる前記各ウィンドウ列w(i)を格納するウィンドウ値格納部と、  前記制御部での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する補正値格納部と、前記乱数生成部が生成した乱数sを格納する乱数格納部と、前記秘密鍵dと、前記乱数格納部に格納された乱数sと、前記ウィンドウ値格納部に格納された各ウィンドウ列と、前記補正値格納部に格納された補正値d’とを用いて、暗号演算を実行する暗号演算実行部と、を備えることを特徴とする暗号処理装置を提供する。
【発明の効果】
【００１４】
一態様によれば、window法であることによりSPAに対して安全であり、テーブルデータがランダム化されたことによりDPAに対しても安全であり、テーブルサイズの削減をも実現でき、キャリー制御も単純な暗号演算処理装置を提供できる。
【図面の簡単な説明】
【００１５】
【図１】電力解析の概要を説明する図である。
【図２】単純電力解析(SPA)と電力差分解析(DPA)の説明図である。
【図３】バイナリ法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。
【図４】バイナリ法による点のスカラー倍算処理の説明図である。
【図５】図３のバイナリ法に対してSPAを用いた場合の電力波形例を示す図である。
【図６】DPAにおける差分波形による個人鍵ビットの判定動作の説明図である。
【図７】データのランダム化によるDPA対策法の説明図である。
【図８】window法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。
【図９】window法を用いた点のスカラー倍算処理の説明図である。
【図１０】window法に対してSPAを用いた場合の電力波形例を示す図である。
【図１１】一般的なwindow法（第２の比較例）とランダム化window法(第３の比較例)の違いの説明図である。
【図１２】ランダム化window法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。
【図１３】一般的なwindow法（第２の比較例）と符号つきwindow法(第４の比較例)の比較説明図である。
【図１４】ランダム化window法（第３の比較例）と符号つきウィンドウ法（第４の比較例）の組合せができない理由の説明図である。
【図１５】各種手法の効果の比較を示した図表である。
【図１６】第１〜第３実施形態の暗号処理装置の第１のハードウェア構成例を示す図である。
【図１７】第１〜第３実施形態の暗号処理装置の第２のハードウェア構成例を示す図である。
【図１８】第１〜第３実施形態の暗号処理装置のwindow値決定ユニットの機能構成を説明する図である。
【図１９】第１〜第３実施形態の暗号処理装置の点のスカラ倍算計算ユニットの機能構成を説明する図である。
【図２０】第１の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。
【図２１】第１の実施形態におけるwindow値決定アルゴリズムの動作説明図である。
【図２２】第１の実施形態における点のスカラ倍算アルゴリズムを示すフローチャートである。
【図２３】第２の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。
【図２４】第２の実施形態におけるwindow値決定アルゴリズムの動作説明図である。
【図２５】第２の実施形態における点のスカラ倍算アルゴリズムを示すフローチャートである。
【図２６】第３の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。
【図２７】第３の実施形態におけるwindow値決定アルゴリズムの動作説明図である。
【図２８】第３の実施形態におけるべき乗剰余演算アルゴリズムを示すフローチャートである。
【図２９】第１〜第３の実施形態と各種手法の効果の比較を示した図表である。
【発明を実施するための形態】
【００１６】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。説明の順序は以下のとおりである。
後述の第１〜第３の実施形態の暗号処理装置は、楕円曲線上の点に対するスカラー倍算を行うためのデータ（具体的には、後述のウィンドウ列w[i]と乱数列s[i]と補正値d’）を生成し、生成したデータを用いてスカラー倍算を行う装置である。そこで、第１〜第３の実施形態についての理解を助けるために、まず、楕円曲線上の演算について説明する。また、第１〜第３の実施形態についての理解を助けるために、第１〜第４の比較例についても説明する。
【００１７】
その後、本願の発明者が比較例についての検討から得た知見と、当該知見に基づいて発明者が開発した第１〜第３の実施形態の処理方法の共通点について説明する。また、第１〜第３の実施形態に共通の装置構成についても説明する。その後、第１〜第３の実施形態について順に説明し、最後に、その他の実施形態などを説明する。
【００１８】
＜ECCの演算の概略＞
さて、楕円曲線上の演算について説明する。ECCで使われる楕円曲線のうちで主なものは、素体ＧＦ（ｐ）上で定義される式（１．１）の楕円曲線と、2の拡大体GF(2m)上で定義される式（１．２）の楕円曲線である（なお、GFはGalois fieldの略であり、pは素数である）。
【００１９】
y2=x3+ａx+ｂ(mod p)              (1.1)
ただし、ｐは素数
a,bは楕円曲線パラメータ（0≦a,b＜p）
a,b,x,y∈GF(p)
y2+xy=x3+ａx2+ｂ (mod f(x))              (1.2)
ただし、f(x)はGF(2m)の多項式
a,bは楕円曲線パラメータ（0≦a,b＜p）
a,b,x,y∈GF(2m)
【００２０】
上述のように、a,bは、楕円曲線パラメータと呼ばれ、楕円曲線を一意に決定するためのパラメータである。
【００２１】
式（１．１）で表される楕円曲線上の点Aは、式（１．１）を満たすxとyの組によりA=(x,y)と表される。同様に、式（１．２）で表される楕円曲線上の点Aは、式（１．２）を満たすxとyの組によりA=(x,y)と表される。
【００２２】
また、楕円曲線上の特殊な点として無限遠点（point at infinity, or infinite point）とベースポイントが定義される。無限遠点を以下では「O」（大文字のオー）、ベースポイントを以下では「G」と表記する。ベースポイントGは、楕円曲線上の点の一つで、楕円曲線暗号の利用者間で共通して使用され、公開鍵／個人鍵ペア生成をはじめ、楕円曲線暗号を用いた各種機能において使用される。
【００２３】
なお、本明細書の以下の議論は、式（１．１）の楕円曲線についても式（１．２）の楕円曲線についても同様に成り立つ。よって、以下では式（１．１）と（１．２）の区別について言及せずに、単に「楕円曲線」、「点A」、「点（x,y）」、「x座標」、「y座標」、「楕円曲線パラメータａおよびｂ」などの表記を用いることがある。
【００２４】
楕円曲線上の点同士に対して、ある演算（以下「加算」といい、「+」と表す）を定義すると、楕円曲線上の点の集合は可換群をなすことが知られている。無限遠点Oは零元（すなわち加算における単位元）にあたる。また、楕円曲線上の任意の点A（点Aは無限遠点Oでもよい）に対して式（１．３）が成り立つ。
A+O=O+A=A                                        (1.3)
【００２５】
以下では点Aの逆元を−Aと表記する。点−Aのx座標とy座標は、楕円曲線が定義される体GF(p)またはGF(2m)上の加算または減算により計算することができる。具体的には、点A=（x,y）の逆元である点−Aは、楕円曲線が式（１．１）で定義される場合は式（１．４）により表され、楕円曲線が式（１．２）で定義される場合は式（１．５）により表される。
-A=(x, -y)                                        (1.4)
-A=(x, x+y)                                       (1.5)
【００２６】
式（１．４）と（１．５）から理解されるように、点Aから点−Aを求めるための計算量（computational complexity）はわずかである。符号付window法や後述の第１〜第３の実施形態では、逆元の計算容易性を利用することで、メモリ使用量の削減が図られる。上記のような逆元の計算容易性は、RSA暗号で利用される素体上の除算の計算困難性と対照的である。
【００２７】
なお、ある点A１と点A２に対してA３=A１+A２と表される点A３のx座標とy座標も、点A１とA２のx座標とy座標を用いて、体GF(p)またはGF(2m)上の加減乗除により計算することができる。ここで、A２＝A１である場合には、A３＝A１＋A１を２A１とも表し、点A１から点A３＝２A１を求める演算を２倍算（doubling）という。２倍算も、体GF(p)またはGF(2m)上の加減乗除により実現される。
【００２８】
また、減算は、式（１．６）のように逆元の加算として定義される。
A1-A2=A1+(-A2)                      (1.6)
【００２９】
さらに、楕円曲線上の点Aに対しては、スカラー値と呼ばれる整数xを用いて、スカラー倍算（scalar multiplication）と呼ばれる演算が定義される。点のスカラー倍算は、楕円曲線上の点A、スカラー値と呼ばれる整数xから、
V=xA                                             (1.7)
を満たす楕円曲線上の点Vを計算する処理である。
【００３０】
ECCでは、xを秘密情報とした処理が行われる。例えばECDH鍵交換の場合、通信相手の公開鍵となる楕円曲線上の点をA、個人鍵をdとすると、
V=dA                                             (1.8)
を満たす楕円曲線上の点Vを計算することで、安全な鍵共有を実現する。個人鍵dの値を知らない第三者は正しい共有鍵の値を算出することができない。
【００３１】
式（１．８）においては、dが個人鍵であり、攻撃者などの不正な第三者に漏洩してはならない値である。すなわち、ECCにおいては、dの値の保護が重要な耐タンパ機能となる。
【００３２】
数学的には、式（１．８）においてd以外の値が既知だとしても、dを計算する計算量が大きすぎるため、現実的な時間内にｄを求めることが難しい離散対数問題として知られている。より具体的には、楕円曲線パラメータ(Elliptic Curve Parameter)が160ビット以上の場合、A,Vの値を知っていたとしても、dの値を求めることが困難であることが知られている。
【００３３】
楕円曲線暗号における公開鍵（public key）と個人鍵（private key）として、前述したベースポイントG、個人鍵を表すスカラー値dに対し、公開鍵はV=dGを満たすVにより与えられる。すなわち、公開鍵Vは楕円曲線上の点であり、個人鍵dはスカラー値である。たとえ点GとVが攻撃者に知られていても、点GとVから個人鍵dを計算することは、莫大な計算量を必要とするので非常に困難である。これも、前述した離散対数問題の計算困難性として知られている。
【００３４】
さらに、ECCは、Diffie-Hellman（DH）アルゴリズムによる鍵共有（key agreement）や、ディジタル署名アルゴリズム（Digital Signature Algorithm;DSA）などにも利用可能である。何の目的でECCが利用されるにしろ、ECCを利用した処理はスカラー倍算を含む。DH鍵共有を例に説明すれば次のとおりである。
【００３５】
例えば、第１の装置の個人鍵がdＡであり、第２の装置の個人鍵がdＢであるとする。すると、第１の装置の公開鍵QＡは、ベースポイントGからQＡ=dＡGと計算され、第２の装置の公開鍵QＢは、ベースポイントGからQＢ=dＢGと計算される。このように、公開鍵の生成のためにスカラー倍算が行われる。
【００３６】
また、第１の装置は自らの公開鍵QＡを第２の装置に送り、第２の装置は自らの公開鍵QＢを第１の装置に送る。すると、第１の装置はスカラー倍算によりdＡQＢを計算し、第２の装置もスカラー倍算によりdＢQＡを計算する。その結果、式（１．９）に示すように、第１の装置と第２の装置は同じ鍵Kを共有することができる。
K=dAQB=dA(dBG)=dB(dAG)=dBQA                             (1.9)
【００３７】
ECCが、上記に例示したDH鍵共有以外の目的に利用される場合も、やはりスカラー倍算が行われる。
【００３８】
＜電力解析（PA）について＞
このように、数学的に求めることが困難な個人鍵dは、電力解析（Power Analysis;PA）を用いることで容易に解読することができることが知られている。PAの基本メカニズムは、式（１．８）を計算する点のスカラー倍算の処理手順に大きな関連がある。以下では、点のスカラー倍算の演算手順について説明したうえで、スカラー倍算に対するＰＡを説明する。
【００３９】
ＰＡは、1998年に発見された解析法（非特許文献２）である。図１に示されるように、暗号機能を実行中（以下、暗号処理）のスマートカード等のデバイスの消費電力を測定し、測定されたデータを用いることでデバイスの内部に格納されたユーザの秘密情報を推定、解析する方法である。（図１）
【００４０】
＜PAの種類：単純電力解析（SPA）と電力差分解析（DPA）＞
PAには、単純電力解析(Simple Power Analysis, SPA)と、電力差分解析(Differential Power Analysis, DPA)の２種類がある（図２）。いずれの攻撃も、暗号デバイスの内部状態を電力波形を用いて観察することで、個人鍵を解読する攻撃である。
【００４１】
SPAは、単一の電力波形を用いた攻撃法である。図２（ａ）に示されるように、処理内容と暗号鍵の相関関係を利用して、電力波形の形状から、暗号デバイスで実行されている処理内容を直接的に観察することで、個人鍵（暗号鍵、秘密鍵）を解読する。
【００４２】
DPAは、複数の電力波形の差分を用いた攻撃法である。図２（ｂ）に示されるように、処理内容と暗号鍵の相関関係を利用して、複数の電力波形の差分から、暗号デバイス内部で処理されているデータ値を間接的に観察することで、個人鍵（暗号鍵、秘密鍵）を解読する。
【００４３】
以上のように、PA攻撃は、スカラー倍算を実行中の装置の消費電力を測定することで、個人鍵として使われるスカラー値dを解読しようとする、非破壊攻撃の一種である。よって、何の目的でECCが利用されるにしろ、個人鍵dの漏洩防止の対策としては、スカラー倍算を実行中の装置の消費電力波形が個人鍵dの特徴を示さないようにすることが有効である。もしPA攻撃に対して何の対策もとられないと、スカラー倍算を実行中の装置の消費電力波形の特徴から、個人鍵dが解読されてしまう危険性がある。SPAとDPAは異なる種類の攻撃法であるため、PAに対する対策を行うためにはSPAとDPAの両方に対する対策法が必要である。
【００４４】
後述の第１〜第３の実施形態の暗号処理装置は、SPA攻撃に対してもDPA攻撃に対しても安全であるように、かつ使用メモリ量を抑えるように、設計されている。そこで、第１〜第３の実施形態の利点についての理解を助けるため、続いて、いくつかの比較例について説明する。
【００４５】
＜バイナリ法（第１の比較例）＞
まず、第１の比較例として、「バイナリ法」について説明する。バイナリ法は、SPA攻撃に対してもDPA攻撃に対しても脆弱である。
【００４６】
例えば個人鍵dが160ビットである場合、dは非常に大きな数（例えば、2160に近い数）である可能性がある。よって、式（１．８）の定義どおりにスカラー倍算を実行することは、非常に多くの回数の点の加算をともなうため、非現実的である。バイナリ法は、スカラー倍算の計算量のオーダを個人鍵dのビット数のオーダに抑えるための手法である。
【００４７】
点のスカラー倍算におけるバイナリ法のアルゴリズムを図３に、処理概略を図４に示す。
【００４８】
ここで説明の便宜上、個人鍵dのビット長をuとする。また、個人鍵dのiビット目をd[i]と表記する（0≦i≦u-1）。d[0]が最下位ビット（Least Significant Bit;LSB）でありd[u-1]が最上位ビット（Most Significant Bit;MSB）である。すると、uビットの個人鍵dは、式（２．１）のように表現される。
d=d[u-1]|| … ||d[1]||d[0]                             (2.1)
ここで、“||”は、１ビット以上の長さのビット列同士の連結（concatenation）を示す。
【００４９】
すると、式（２．１）より、式（２．２）が得られる。
dA=2u-1d[u-1]A+…+21d[1]A+20d[0]A                          (2.2)
【００５０】
バイナリ法は式（２．２）を利用した計算手順である。式（２．２）において、dのビット値d[i]を上位ビットから下位ビット(すなわちi=u-1から0)の順にスキャンし、dのビット値d[i]に応じて、下記式（２．３）の演算を行う。
ｄ[i] =1の場合：2倍算(v := 2×v)の後に、加算(v:=v+a )を実行。
ｄ[i] =0の場合：2倍算(v := 2×v)のみを実行。
(2.3)
【００５１】
例えば、個人鍵dが(1100101)2の場合について具体的に説明すると、バイナリ法は式（２．４）にしたがってスカラー倍算を実現する手法である。
dA=2(2(2(2(2(2(2O+A)+A)))+A))+A=26A+25A+22A+A           (2.4)
【００５２】
すなわち、スカラー倍算の結果を変数Vで表すことにすると、バイナリ法では式（２．５）のとおり、変数Vがまず無限遠点Oにより初期化される（図３の３０１行）。
V=O                                            (2.5)
【００５３】
その後、MSBからLSBへと順に（図３の３０２行から３０５行のループ処理）、式（２．３）が実行される。すなわち、２倍算により2Vを求め（図３の３０３行）、その後、もしd[i]=1ならば点Aの加算を行い、得られた結果を変数Vに代入する（図３の３０４行）、という処理が繰り返される。そして、最終的に変数Vに得られた値が出力される（図３の３０６行）。ここで、図３の３０３行の「ECDBL(V)」は、変数Vの値に対して２倍算2Vを計算する関数処理を示す。また、図３の３０４行「ECADD(V,A)」は、変数Vの値に変数Aの値を加算する関数処理を示す。
【００５４】
具体的には、d[6]=1なので、式（２．６）のとおり、６ビット目に対応して２倍算と加算が行われる（図４のＤ６とＡ６）。
V=2O+A                                         (2.6)
【００５５】
そして、d[5]=1なので、式（２．７）のとおり、５ビット目に対応して２倍算と加算が行われる（図４のＤ５とＡ５）。
V=2(2O+A)+A                                    (2.7)
【００５６】
また、d[4]=0なので、式（２．８）のとおり、４ビット目に関しては２倍算のみが行われ、加算は行われない（図４のＤ４）。
V=2(2(2O+A)+A)                                 (2.8)
【００５７】
同様に、d[3]=0なので、式（２．９）のとおり、３ビット目に関しても２倍算のみが行われ、加算は行われない（図４のＤ３）。
V=2(2(2(2O+A)+A))                              (2.9)
【００５８】
次の２ビット目に関しては、d[2]=1なので、式（２．１０）のとおり、２倍算と加算が行われる（図４のＤ２とＡ２）。
V=2(2(2(2(2O+A)+A)))+A                         (2.10)
【００５９】
また、次の１ビット目に関しては、d[1]=0なので、式（２．１１）のとおり、２倍算のみが行われ、加算は行われない（図４のＤ１）。
V=2(2(2(2(2(2O+A)+A)))+A)                      (2.11)
【００６０】
そして、最後の０ビット目に関しては、d[0]=1なので、式（２．１２）のとおり、２倍算と加算が行われる（図４のＤ０とＡ０）。
V=2(2(2(2(2(2(2O+A)+A)))+A))+A                 (2.12)
以上のようにしてd[i]=1であるiビット目に対応して加算された点Aの係数は、式（２．１２）から理解されるように、2ｉである。よって、上記の式（２．５）〜（２．１２）とともに例示した手順により、確かに式（２．４）にしたがって、V=dAが得られる。
【００６１】
上記の例から明らかなとおり、バイナリ法によれば、２倍算の回数は個人鍵dのビット長uに等しく、加算の回数は個人鍵dのハミング重み（Hamming weight）に等しい。よって、バイナリ法によるスカラー倍算の計算量は、2ｕのオーダではなく、uのオーダに抑えられる。
【００６２】
ここで、バイナリ法においては、２倍算と加算の演算シーケンスが、そのままdのビット値と連動しており、SPAはこの性質を利用してdを解読する。つまり、図５の電力波形例に示されるように、点の加算と２倍算の処理の違いを、電力波形を用いて区別できるような環境においては、以下のような解読が可能となる。すなわち、２倍算のあとに加算を実行しているならば指数dのビット値は1であると解読できる（図５の５０１または５０３）。一方、２倍算のみを実行しているならば指数dのビット値は0であると解読できる（図５の５０２）。この解読をdの全ビットについて行うことでSPAが成功する。
【００６３】
SPAへの対策法として、dのビット値に関係なく加算と２倍算の演算パターンを一定化する方法が知られており、後に述べるwindow法もこの対策法を実現する手法である。
また、バイナリ法はDPA攻撃に対しても脆弱である。なお、DPA攻撃への安全性に関する説明の理解を助けるために、DPAによる攻撃を行う場合の基本アイデアを説明する。
【００６４】
バイナリ法は、d=d[u-1]|| … ||d[1] ||d[0]（式（２．１））に対して、dAを計算するために、
d[u-1]A→(d[u-1]||d[u-2])A→(d[u-1]||d[u-2]||d[u-3])A→...
のように、スカラー値（d）のビットを上位から１つずつ増やしながら、最終的にdAを計算する。
【００６５】
図３に示す変数iに関するループ処理（図３の３０２から３０５）を１回実行するごとに、指数が1ビット増えた計算結果が変数Vに格納される。
例えば、d=(1101)2の場合、
(1)2A→(11)2A→(110)2A→(1101)2A
の順に計算を行う。
【００６６】
DPAを行う攻撃者は、「スカラー値のビット値を1つずつ増やしながら計算を行う」というバイナリ法の性質を利用して、dのビットを1ビットずつ予想しながら、その予想が正しいかどうかを電力波形により識別することを繰り返す。一般的な総当り法による攻撃の場合、個人鍵の解読はdに比例した手間が必要であるのに対し、DPAを用いることで、log2dに比例した手間で個人鍵を解読することができる。
【００６７】
例えば、dの最上位ビットが0の場合、0A (mod n)で表されるデータ値が暗号デバイス内部で計算され、内部のメモリにロード／ストアされる。一方、dの最上位ビットが、１の場合、1A (mod n)で表されるデータ値が暗号デバイス内部で計算され、内部のメモリにロード／ストアされる。
【００６８】
暗号デバイスを含めた一般的なハードウェアは、ロード・ストアされるデータ値のハミング重み（'1'）に比例した電力を消費するという性質が知られており、DPAはこの性質を利用することで、ロード／ストアされたデータ値が1Aもしくは0Aのいずれであるかを判別することができる。この結果、例えばdの最上位ビットが1であることが分かった後に、1つ下位のビット値を解読するためには、同様の手順を用いて、ロード／ストアされたデータ値が(10)2Aもしくは(11)2Aのいずれであるかを判別する。
【００６９】
DPAの具体的な手順は以下の(DPA-1)から(DPA-6)に示される。
(DPA-1)     暗号文VとしてV=Mj(j=1,2,…,L)を入力した消費電力
Powj(t) (j=1,2,…,L)を測定する。
ただし、tは時刻情報である。
(DPA-2)     i:=u-1;に初期化する
(DPA-3)     攻撃者は、d[i]のビット値を予想する。
【００７０】
(DPA-4)     攻撃者は、既知のMj,d[u-1]||… ||d[i+1]と、
予想されたd[i]から、
Gj=(d[u-1]||…||d[i+1]||d[i])Mj
の値をj=1,2,..,Lそれぞれについて計算する。
この計算の結果に応じて、以下に示す基準により、
L個の消費電力データPowj(t)を２つのグループに分類する。
グループ1 ：Mjに対し、Gjのx座標(またはy座標、のどちらか
に着目)の最下位ビットが1となるPowj(t)の集合
グループ0 ：Mjに対し、Gjのx座標(またはy座標、のどちらか
に着目)の最下位ビットが0となるPowj(t)の集合
【００７１】
(DPA-5)     上記でグループ分けした消費電力データに対し、
(グループ1に属するPowj(t)の平均)−(グループ0に属するPowj(t)の平均)
で示される差分波形Diff(t)を作成する。
その結果、図６（ａ）に示すようなスパイクが差分波形に現れる場合、
予想したd[i]が正しいと判定し、
図６（ｂ）に示すような平坦な波形の場合、
予想したd[i]が誤っていると判定する。
【００７２】
(DPA-6)     i:=i-1と計算した結果、i30の場合、まだ解読していないビット
があるため、(DPA-3)に戻る。i<0の場合、全てのdのビット値
が解読できたので終了する。
【００７３】
DPA-5において、d[i]の予想が正しい場合は、Gjで表される常にデータ値のx座標(y座標)の最下位ビットが全て'1'となる消費電力のグループ１から、x座標(y座標)の最下位ビットが全て'0'となる消費電力のグループ０を引いているので、この'0','1'の消費出力差がスパイクとして出現する（図６（ａ））。d[i]の予想が誤っている場合は、Gjのx座標(y座標)の最下位ビットはグループ0,1ともに'0'と'1'が混在しているため、消費電力の差が発生しないので、平坦な波形となる（図６（ｂ））。
【００７４】
DPA対策法として、図７に示すデータのランダム化と呼ばれる方法が知られている。DPA対策なしの場合、図７（ａ）に示すような挙動となる。すなわち、計算データ値の系列d[u-1]A→(d[u-1]||d[u-2])A→(d[u-1]||d[u-2]||d[u-3])A→...が個人鍵d[i]の値から一意に決定する。これに対し、図7（ｂ）に示すように、乱数を用いてこの計算データ値をかく乱することで、計算データの系列値がランダム化される。このため、消費電力と個人鍵の相関を隠蔽し、DPAに安全な処理を実現することができる。なお、演算の最後には、ランダム化した分を補正するための正規化の処理が実行され、最終的にスカラー倍算値dAが得られる。後に述べる「ランダム化window法」と呼ばれる方法（第３の比較例）では、window法をベースとすることでSPA対策を実現しつつ、データのランダム化を併用することでDPA対策も同時に実現している。
【００７５】
＜window法を用いたべき乗剰余処理によるＰＡ対策法（第２の比較例）＞
SPAに対する対策法のひとつとして、window法と呼ばれる方法が知られている。第２の比較例として、window法を用いたECCの点のスカラー倍算アルゴリズムを図８に、window法の概略を図９に示す。バイナリ法が個人鍵dを1ビットずつスキャンするのに対して、window法はkビット単位でまとめてスキャンを行うという違いがある。例えば、d=(101001)2に対して点のスカラー倍算を行う場合、
バイナリ法：1A→(10)2A→(101)2A→(1010)2A→(10100)2A→(101001)2A
3ビットwindow法：(101)2A→(101001)2A
の順にそれぞれ計算を行う。
【００７６】
kビット単位の演算を行うために、window法は、個人鍵dをkビットごとに分割する。これは、図８の８０６行に示す処理により、分割されたkビット値をw[i]に格納することで行う。
【００７７】
続く８０７行では、このw[i]を索引値としたテーブルデータtab[w[i]]を用いた加算処理を行う。このテーブルデータはtab[x]と表記され、８０２行、８０３行において、tab[x] = xAと表記されるデータをx=0,1,..,2k- 1の2k個についてそれぞれ事前計算することで与えられるデータである。w[i]のように、window法で索引されるテーブルデータを決定する値のことをwindow値と呼び、w[m-1],w[m-2],…,w[0]のようなwindow値の系列をwindow列（window sequence）と呼ぶ。
【００７８】
バイナリ法では、式（２．５）〜（２．１２）に例示したように、個人鍵dの1ビットごとに、ビット値に応じて「２倍算と加算」または「２倍算」という処理が行われる。それに対して、window法では、個人鍵dのkビットごとに、ビット値によらず常に「k回の２倍算と1回の加算」という処理が行われる。よって、たとえ２倍算の消費電力波形と加算の消費電力波形が異なっていたとしても、window法によるスカラー倍算はSPA攻撃に対して安全である。
【００７９】
以下では説明の簡単化のため、個人鍵dのビット数uがウィンドウサイズkで割り切れるものとする。すなわち、m=u/kとすると、mは整数である。また、0≦i≦(m-1)なる各iについて、i番目のウィンドウ値w[i]は式（４．１）のように定義される（図８の８０６行）。
w[i]=d[ik+k-1]||…||d[ik]                                (4.1)
【００８０】
なお、i番目のウィンドウ値を表す“w[i]”という表記法における“[i]”の意味は、個人鍵dのiビット目を表す“d[i]”という表記法における“[i]”の意味とは異なる。しかし、“[i]”の意味は文脈から明らかなので、以下では適宜“w[i]”のような表記法を用いる。
【００８１】
例えば、ウィンドウサイズkが3ビットであり、個人鍵dが(011111101)2である場合、ウィンドウ値は次の式（４．２）〜（４．４）のとおりである。
w[2]=(011)2=3                                          (4.2)
w[1]=(111)2=7                                          (4.3)
w[0]=(101)2=5                                          (4.4)
【００８２】
前述したように、window法では、スカラー倍算の対象として与えられる点Aの座標を用いて、０≦x≦2ｋ-1なる各xに対して、予め、スカラー倍点（scalar multiple）xAが計算される。そして、計算されたスカラー倍点xAは、インデックスxと対応づけられてメモリに格納される（図８の８０２行と８０３行）。このインデックスxに対応づけられたスカラー倍点xAを、前述したようにtab[x]と表記し、tab[x]（=xA）を「テーブルデータ」ともいう。より詳しくは、テーブルデータtab[x]は、スカラー倍点xAのx座標とy座標の組により表される。
【００８３】
いま、ウィンドウサイズkが3ビットである場合には、インデックスxは、(000)2,(001)2,(010)2,(011)2,(100)2,(101)2,(110)2,(111)2の８通りの値を取り得る。したがって、テーブルデータも、図９（ｂ）に示されるように、８通りの値となる。なお、tab[(000) 2]（図９中ではtab[000]と表記している）については、(000)2A=無限遠点Oとなる（図８の８０２行）。
【００８４】
インデックスxに対応するテーブルデータtab[x]の実際の計算処理としては、xA=(x-1)A+Aであるから、インデックスx-1に対応するテーブルデータtab[x-1]にAを加算する処理を、x=1から2k-1まで繰り返し実行すればよい。これを計算するのが図８の８０３行である。なお、「ECADD」の意味は、図３の３０４行の場合と同じである。ここで、x=0に相当するテーブルデータの初期値は、図８の８０２行において、tab[0]=tab[(000) 2]=Oとして計算される。
【００８５】
window法では、点dAの計算は、式（４．５）のようにテーブルデータを用いて行われる。
dA=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2]         (4.5)
【００８６】
より具体的には、スカラー値dと点Aのスカラー倍算の結果を変数Vで表すことにすると、window法では、式（４．６）のとおり、変数Vがまず無限遠点Oにより初期化される（図８の８０１行）。
V=O                                                (4.6)
【００８７】
その後、前述した８０２行と８０３行のテーブルデータの作成処理の後、i=m-1からi=0へと順に、以下のループ処理（図８の８０４行から８０８行）が実行される。すなわち、「２倍算をk回（すなわち３回）行い（図８の８０５行）、ｔａｂ［w[i]］を加算し（図８の８０６行と８０７行）、得られた結果を変数Vに代入する（図８の８０７行）」という処理が行われる。なお、図８の８０５行の「ECDBL」の意味は、図３の３０３行の場合と同じである。
【００８８】
より具体的には、まずウィンドウ値ｗ［２］に対応して式（４．７）のとおり、３回の２倍算と１回の加算が行われる（図９のＤ２とＡ２）。
V=23(O)+tab[(011)2]                             (4.7)
【００８９】
次に、ウィンドウ値ｗ［１］に対応して式（４．８）のとおり、３回の２倍算と１回の加算が行われる（図９のＤ１とＡ１）。
V=23(23(O)+tab[(011)2])+tab[(111)2]                  (4.8)
【００９０】
そして、最後にウィンドウ値ｗ［０］に対応して式（４．９）のとおり、３回の２倍算と１回の加算が行われる（図９のＤ０とＡ０）。
V=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2]       (4.9)
【００９１】
window法で用いるテーブルデータは、入力値に応じて動的に計算する必要があるため、これらのデータはRAMに格納される。すなわち、windowのビット長kを大きくするほど、テーブルの個数が多くなり、必要なRAMサイズが大きくなる。
【００９２】
バイナリ法と異なり、window法では、個人鍵dのビット値（スカラー値）に関係なく、常に点の２倍算をk回と加算1回を繰り返す。よって図１０に示すように、点の２倍算と加算の波形から個人鍵を解読することは不可能となるため、SPAに安全となる。
【００９３】
＜ランダム化window法によるSPA,DPA対策法（第３の比較例）＞
window法を用いることで、SPAを防ぐことはできるが、DPAを防ぐことはできない。前述した(DPA-1)から(DPA-6)によるDPAの手順では、dのビットを1ビットずつ予想しながらその予想が正しいかどうかを電力波形により識別することを繰り返した。これを応用すれば、window法におけるkビットずつｄのビットを予想しながら１ビットの場合と同様にその予想が正しいかどうかを電力波形により識別することを繰り返せば、window法へのDPAの適用が可能となる。計算量は増えるが、予想時のkに相当するビット数を可変させながら処理を繰り返すことにより、window法におけるkビットの様々な値に対応できる。
【００９４】
これに対して、window法においてデータのランダム化を実行することで、SPAとDPAを同時に防ぐ方法が、知られている（特許文献２）。この方法はランダム化window法と呼ばれる演算法である。第２の比較例であるwindow法と第３の比較例としてのランダム化window法の違いを図１１に示す。
【００９５】
ランダム化window法においては、テーブルデータが一時的な乱数によりランダム化される。
すなわち、一般的なwindow法のテーブルデータにおいては、tab[x] = xAのように、インデックス値xからテーブルデータが一意に与えられるのに対し、ランダム化window法ではtab[x] = (2bx+s)A（ただし、sはbビット乱数を満たす小さな整数値）のように、点のスカラー倍算を1回実行するごとに変化する乱数sを用いてテーブルデータをランダム化することが特徴である。
【００９６】
テーブルデータがランダム化されることで、点のスカラー倍算を計算する際のデータがランダム化されるため、個人鍵dの各ビットを予測することが困難になり、DPAに安全となる。すなわち、ランダム化により、データの内容と消費電力の相関関係が隠され、これによって、攻撃者によるビット値の予測の正誤に応じて差分波形が変化することはなくなる。さらに、window法と同様に、点の2倍算、加算の演算パターンが個人鍵dに関係なく常に一定化されるため、SPAにも安全となる。
【００９７】
図１１に示されるように、一般的なwindow法においては個人鍵dからwindow列w[i]を作成する（図１１（ａ））。これに対して、ランダム化window法においては、個人鍵dと乱数sからwindow列w[i]と補正値d’を作成するという違いがある（図１１（ｂ））。補正値d’は、演算途中における中間データをランダム化しつつ、最終的な演算結果をdAとするための調整を行うための値である。
【００９８】
より具体的には、一般的なwindow法においては、図１１（ａ）に示されるように、例えばk=2ビットのwindow列である各インデックス値(00)2,(01)2,(10)2,(11)2に対して、そのインデックス値がそのままスカラー倍算されてテーブルデータが計算された。すなわち、(00)2A, (01)2A,(10)2A,(11)2A（図中では、「00A,01A,10A,11A」と表記）が、テーブルデータとして計算された。そして、実際のスカラー倍算演算の実行時には、個人鍵dからkビットずつ切り出されたwindow列をインデックスとするテーブルデータが取得され、加算処理が実行された。
【００９９】
一方、ランダム化window法では、図１１（ｂ）に示されるように、個人鍵dとスカラー倍算演算ごとに異なるbビットの乱数sとから、window列w[2],w[1],w[0]と補正値d’を作成する。補正値d’は、演算途中における中間データをランダム化しつつ、最終的な演算結果をdAとするための調整を行うための値である。すなわちまず、テーブルデータの作成のために、上記window列として現れ得るビット列、例えば(00)2,(01)2,(10)2,(11)2の各ビット列の下位ビット側に、bビットの乱数列、例えば(011)2が結合された各ビット列が生成される。例えば、(00011)2,(01011)2,(10011)2,(11011)2が生成される。そして、これらの各ビット列がスカラー倍算されたテーブルデータ、例えば(00011)2A,(01011)2A,(10011)2A,(11011)2A（図中では、「(00011)A, (01011)A,(10011)A,(11011)A」と表記）が予め計算される。各計算結果は、上記window列として現れ得るビット列、例えば(00)2,(01)2,(10)2,(11)2をインデックス値とするテーブルエントリに記憶される。そして、実際のスカラー倍算演算の実行時には、前述した個人鍵dと乱数sとから作成されているwindow列w[2],w[1],w[0]をインデックスとするテーブルデータが取得され、加算処理が実行される。
【０１００】
最後に、前述した個人鍵dと乱数sとから作成されている補正値d’を使ってスカラー倍算した結果を、最終的な加算結果にさらに加算することにより、求めたいスカラー倍算値dAが得られるように調整する。
【０１０１】
ここで、乱数sのビット数をb、また、mを整数とし、個人鍵dのビット数をuとすると、式（５．１）が成り立つものとする。
u=b+km                                                 (5.1)
【０１０２】
なお、乱数sのビット数bは、例えば30以下が好ましい。例えば、個人鍵dが378=(101111010)２であるとすると、u=9である。また、ウィンドウサイズkが2であり、bが3であり、乱数sが3=(011)２であるとする。この場合、式（５．１）よりm=3である。ランダム化window法では、0≦i≦(m-1)なる各iについてkビットのウィンドウ値w[i]が計算され、さらに、式（５．２）が成立するようにbビットの補正値d’が計算される。
【０１０３】
【数１】
2012090288.tif 000003
【０１０４】
ここで、乱数sはbビットなので、式（５．２）から式（５．３）が得られる。
【０１０５】
【数２】
2012090288.tif 000004
【０１０６】
そして、式（５．３）から移項により式（５．４）が得られる。
【０１０７】
【数３】
2012090288.tif 000005
【０１０８】
式（５．４）の左辺は、個人鍵dと乱数sから計算される値を示す。そして、式（５．４）の右辺は、式（５．４）の左辺により計算される値を最上位ビットからkビットずつ区切ることでウィンドウ列が得られることと、式（５．４）の左辺により計算される値の最下位の0〜b+kビットが補正値d’となることを示す。
ランダム化window法を用いた点のスカラー倍算アルゴリズムを、図１２に示す。
【０１０９】
まず、変数Vに、初期値として無限遠点Oをセットする（図１２の１２０１行）。
次に、bビットの乱数sを発生させる（図１２の１２０２行）。
【０１１０】
次に、発生させた乱数sとスカラー倍算の対象である点Aの座標を用いて、0≦x≦２k-1なる各xに対して、予め、インデックスxと対応づけて式（５．５）のテーブルデータが以下に示すアルゴリズムにより計算され、メモリに格納される。
tab[x]=(2bx+s)A                                       (5.5)
この計算アルゴリズムとしてまず、初期値として、インデックス0、例えば(00)2に対するテーブルデータtab[0]を、tab[0]=sAとして計算する（図１２の１２０３行）。この計算の根拠は、(00)2に乱数sを結合して得られるwindow列(00||s)2に対するスカラー倍算が、(00||s)2A=sAとなることによる。
【０１１１】
次に、tab[0]を初期値として、順次インクリメントされるインデックスxに対応するテーブルデータtab[x]の計算が実行される。この計算処理は、次のようにして実行される。すなわちまず、スカラー倍算されるビット列は(x||s)2である。そして、(x||s)2A=(x-1||s)2A+sAである。したがって、インデックスxに対するテーブルデータtab[x]は、インデックスx-1に対応するテーブルデータtab[x-1]に2bAを加算する処理を、x=1から2k-1まで繰り返し実行することで算出できる。これを計算するのが図１２の１２０４行である。
【０１１２】
例えば、上記のとおりb=3でありs=(011)2=3である場合、メモリにはテーブルデータとして次の式（５．６）〜（５．９）のデータが格納される。
tab[(00)2]=tab[0]=(23×0+3)A=3A                         (5.6)
tab[(01)2]=tab[1]=(23×1+3)A=11A                        (5.7)
tab[(10)2]=tab[2]=(23×2+3)A=19A                        (5.8)
tab[(11)2]=tab[3]=(23×3+3)A=27A                        (5.9)
【０１１３】
次に、前述の（５．４）式に基づいて、個人鍵dと乱数Sを入力として、window列w[m-1],…,w[0]と、補正値d’が計算される（図１２の１２０５行）。
【０１１４】
例えば、d=378=(101111010)2であり、乱数sが3=(011)2である場合、式（５．４）の左辺を計算すると、式（５．１０）のとおりである。
378-(20×3+22×3+24×3)=378-(3+12+48)=315=(100111011)2    (5.10)
【０１１５】
よって、式（５．１０）により得られた値(100111011)2を２ビットずつ区切ることでウィンドウ列w[2],w[1],w[0]が得られる。また、この値(100111011)2の最下位のb=3ビットから補正値d’が得られる。具体的には、式（５．１１）〜（５．１４）のとおりである。
【０１１６】
w[2]=(10)2=2                                            (5.11)
w[1]=(01)2=1                                            (5.12)
w[0]=(11)2=3                                            (5.13)
d’=(011)2=3                                            (5.14)
【０１１７】
ランダム化window法では、以上のようにしてウィンドウ列w[i]（0≦i≦m-1）と補正値d’が計算される。
【０１１８】
以上のようにして、テーブルデータと、window列、および補正値が求まった後、実際の点Aのスカラー倍算ｄＡが実行される。より詳しくは、i=m-1からi=0へと順に以下のループ処理（図１２の１２０６行から１２０９行）と、その後に最後の１２１０行の処理が実行される。すなわち、ループ処理として、「２倍算をk回（例えば３回）行い（図１２の１２０７行）、ｔａｂ［w[i]］を加算し、得られた結果を変数Vに代入する（図１２の１２０８行）」という処理が行われる。そして、ループ処理の終了後に、補正値d’によるスカラー倍算d’Aが計算されて、その計算結果が変数Vに加算される（図１２の１２１０行）。
【０１１９】
具体的には、例えば下記の式（５．１５）の計算が実行される。
dA=22(22(22(O)+tab[w[2]])+tab[w[1]])+tab[w[0]]+d’A
=4(4(4(O)+19A)+11A)+27A+3A
=4(4(O+19A)+11A)+27A+3A
=4(4(19A)+11A)+27A+3A
=4(76A+11A)+27A+3A
=4(87A)+27A+3A
=348A+27A+3A
=378A                                              (5.15)
【０１２０】
式（５．２）が満たされるように、式（５．４）により式（５．１４）の補正値d’が算出されているので、式（５．１５）の計算により確かにｄA（すなわちこの例では378A）が得られる。
【０１２１】
また、式（５．１５）は、個人鍵ｄのビット値によらず、「２倍算をｋ回（上記の例ではｋ＝２）行い、加算を１回行う」という処理がｍ回（上記の例ではｍ＝３）繰り返され、補正値d’を用いた１回のスカラー倍算と点Ａの加算が行われることを示す。よって、ランダム化window法は、window法と同様にSPA攻撃に対して安全である。また、テーブルデータが乱数sによってランダム化されているので、ランダム化window法は、DPA攻撃に対しても安全である。
【０１２２】
＜符号付window法によるテーブルデータの削減（第４の比較例）＞
ところで、window法でもランダム化window法でも、ウィンドウサイズkに応じて、2k個のエントリがテーブル内に作成される。他方で、組み込み機器など、ある種の装置では、メモリ容量が少ないため、各種の処理を行うためのメモリ使用量を少なくすることが望ましい。
【０１２３】
組み込み機器の１つの例はスマートカードである。また、組み込み機器の他の例は、プリンタなどの電子機器により認証される部品である。例えば、偽造品排除のために、二次電池あるいはプリンタカートリッジなどのアクセサリ部品に、「認証チップ」と呼ばれるLarge Scale Integration（LSI）が組み込まれていてもよい。プリンタによるプリンタカートリッジの認証は、例えば、正規品以外のプリンタカートリッジでの印刷を不能にするために行われてもよい。もちろん、組み込み機器にはその他の様々な種類がある。
【０１２４】
例えば、スマートカードや認証機能つきプリンタカートリッジなどの装置では特に、メモリ搭載量が少ない。よって、スカラー倍算に関しても、メモリ使用量を抑えた処理アルゴリズムが好ましい。
【０１２５】
そこで、第４の比較例として、「符号付（signed）window法」について次に説明する。符号付window法は、window法と同様にSPA攻撃に対して安全であり、かつwindow法よりもメモリ使用量が少ない方法である。
【０１２６】
前述したwindow法は、RSA暗号(べき乗剰余演算)にも適用することができるが、ECC（点のスカラー倍算）に特化することで、テーブルデータをおよそ半分に削減できる方法が知られている。これが「符号付window法」と呼ばれる手法である。
【０１２７】
言い換えれば、符号付window法は、「楕円曲線上の点Aから逆元である点-Aを求める計算の処理負荷は、比較的軽い（つまり逆元の計算コストが低い）」ということに注目した方法である（式（１．４）および（１．５）、ならびにその説明を参照）。
【０１２８】
図１３に、一般的なwindow法（同図（ａ））と符号付window法（同図ｋび）の比較を示す。windowのビット長kとした場合、一般的なwindow法は、windowのビット長kに対し、2k個のテーブルデータが必要となる。これに対し、符号付window法では、2k-1+1個のテーブルデータでよいため、テーブルデータを格納するために必要なRAMのサイズを半減させることができる。
【０１２９】
図１３（ａ）に示す3ビットwindow法の場合、0A, 1A, …, 7Aの8個のテーブルデータが必要となる。これに対し、図１３（ｂ）に示す3ビット符号つきwindow法の場合、0A,1A,…,4Aの5個のテーブルデータが必要となる。すなわち、3ビット符号付window法は、3ビットwindow法に比較して、3個のテーブルデータを削減できる。一般的なwindow法の場合、個人鍵dをkビット単位に分割し、そのままwindow値とする。これに対し符号つきwindow法においては、同様に個人鍵dをkビット単位に分割するが、その値が一定値(2k-1もしくは2k-1+1以上)の場合、window値に対し2kをマイナスする(window補正)。このマイナスの影響をキャンセルするために、一つ上位のwindow値に+1を加算する(carry補正)。図１３（ｂ）の3ビット符号付window法の場合、3ビット分割された各window値のうち、4以上ならばそのwindow値から8をマイナスする。このマイナス演算により4A,5A,6A,7Aはそれぞれ-4A,
-3A, -2A, -1Aに変更されるが、これらは4A,3A,2A,1Aのテーブルデータを用いた点の減算処理を実行することで計算を行うことができるので、5A,6A,7Aのテーブルは不要となる。
【０１３０】
ここで、window値から2kを減算して得られるスカラー値、すなわち(window値-2k)は、-(2k-window値)である。そして、(2k-window値)は、window値に対する2の補数に等しい。したがって、(window値-2k)は、-(window値に対する2の補数)である。すなわち、window値から2kを減算して得られるスカラー値を使った点Aのスカラー倍算値は、window値に対する2の補数をスカラー値として使った点Aのスカラー倍算の演算結果に負符号を付けたものに等しくなる。そして、window値が2k-1もしくは2k-1+1以上である場合には、2の補数は必ず2k-1以下もしくは2k-1-1以下になる。
【０１３１】
そこで、あらかじめwindow値が0から2k-1までの2k-1+1個のスカラー値に対応するスカラー倍算値0Aから2k-1Aを計算し、window値0から2k-1のそれぞれをインデックス値とするテーブルの各エントリに格納しておく。そして、window値が2k-1もしくは2k-1+1以上である場合におけるwindow値から2kを減算して得られるスカラー値を使った点Aのスカラー倍算値は、次のようにして求めることができる。すなわち、window値に対する2の補数をインデックス値として上記2k-1+1個のスカラー倍算値の演算結果0Aから2k-1Aが格納されたテーブルを参照して対応するスカラー倍算値の演算結果を取得し、その取得結果に負符号を付ければよい。もちろん、window値が2k-1もしくは2k-1+1未満である場合には、window値をそのままインデックス値として上記2k-1+1個のスカラー倍算値の演算結果0Aから2k-1Aが格納されたテーブルを参照して対応するスカラー倍算値の演算結果を取得すればよい。このようにして、テーブルサイズが、2k-1+1に削減できる。
【０１３２】
例えば、ウィンドウサイズkが3であるとする。すると、符号付window法で使われるインデックスは0,1,2,3,4の5つである。そして、これらの5つのインデックスに対応する対応するテーブルデータは、0A,1A,2A,3A,4Aである。符号付window法では、次の式（６．１）〜（６．３）の関係を利用することにより、３つのインデックス5,6,7に対応するテーブルデータ5A,6A,7Aが省略される。
【０１３３】
5A=2kA-3A=8A-3A                                         (6.1)
6A=2kA-2A=8A-2A                                         (6.2)
7A=2kA-1A=8A-1A                                         (6.3)
【０１３４】
例えば、ウィンドウサイズkが3ビットであり、個人鍵dが241=(011110001)2であるとする。符号付window法では、まず、window法と同様にして仮のウィンドウ値が求められる。すなわち、仮のウィンドウ値は次の式（６．４）〜（６．６）のとおりである。なお、特に混乱のおそれはないので、以下では、仮のウィンドウ値と確定した実際のウィンドウ値をともにw[i]と表記する。
【０１３５】
w[2]=(011)2=3                                           (6.4)
w[1]=(110)2=6                                           (6.5)
w[0]=(001)2=1                                           (6.6)
【０１３６】
そして、仮のウィンドウ値は最下位（すなわちw[0]）から順にスキャンされ、次のようにして各ウィンドウ値が確定される。すなわち、もしw[i]≧2k-1+1であれば、仮のウィンドウ値w[i]から2kを引いた値（すなわちw[i]-2k）がウィンドウ値w[i]として設定される。また、i番目の仮のウィンドウ値w[i]から2kの減算が行われた場合は、減算の影響をキャンセルするため、１つ上位の仮のウィンドウ値w[i+1]には、1が足される。
【０１３７】
なお、以下では上記の2kの減算を「ウィンドウ補正」といい、上記の１の加算を「キャリー（carry）補正」という。また、上記のw[i]≧2k-1+1という条件の代わりに、w[i]≧2k-1という条件を用いてもよいが、以下では説明の便宜上、w[i]≧2k-1+1という条件が用いられるものとする。
【０１３８】
式（６．４）〜（６．６）の仮のウィンドウ値から、実際のウィンドウ値は、次のようにして求められる。
すなわち、式（６．６）よりw[0]＜2k-1+1が成立する。よって、0番目（つまり最下位）のウィンドウ値w[0]は仮のウィンドウ値と同じく1である。
【０１３９】
また、式（６．５）よりw[1]≧2k-1+1が成立する。よって、1番目のウィンドウ値は、仮のウィンドウ値６から8（=2k）を引くことで得られ、w[1]=-2と確定する。よって、キャリー補正により、式（６．４）の仮のウィンドウ値w[2]には1が足され、w[2]=4となる。
【０１４０】
そして、このキャリー補正された仮のウィンドウ値w[2]=4は、w[2]＜2k-1+1を満たす。よって、2番目（つまり最上位）のウィンドウ値はw[2]=4と確定する。
以上のようにして確定したウィンドウ値w[0]〜w[2]を用いて、符号付window法では式（６．７）により点dAが計算される。
dA=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]]            (6.7)
【０１４１】
より具体的には、スカラー倍算の結果を変数Vで表すことにすると、式（６．８）のとおり、変数Vがまず無限遠点Oにより初期化される。
V=O                                             (6.8)
【０１４２】
その後、i=m-1からi=0へと順に、「２倍算をk回行い、ウィンドウ値w[i]が0以上ならtab[w[i]]を加算し、ウィンドウ値w[i]が負ならtab[-w[i]]を減算し、得られた結果を変数Vに代入する」という処理が行われる。なお、mは、個人鍵dのビット長uをウィンドウサイズkで割った値であり、本例ではm=3である。
【０１４３】
式（６．８）の初期化に続いて、i=m-1に対応する処理が行われる。すなわち、ウィンドウ値w[2]（=4）に対応して、式（６．９）のとおり3回の２倍算と1回の加算が行われる。
V=23(O)+tab[w[2]]                                 (6.9)
【０１４４】
次に、ウィンドウ値w[1]（=-2）に対応して、式（６．１０）のとおり3回の２倍算と1回の減算が行われる。
V=23(23(O)+tab[w[2]])-tab[-w[1]]                    (6.10)
【０１４５】
そして、最後にウィンドウ値w[0]（=1）に対応して、式（６．１１）のとおり3回の２倍算と1回の減算が行われる。
V=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]]          (6.11)
【０１４６】
式（６．１１）の右辺を展開すると、下記の式（６．１２）のとおりである。また、上記のとおり本例において個人鍵dは241である。よって、以上説明した符号付window法により点dAが正しく計算されることが理解されるであろう。
【０１４７】
V=23(23(23(O)+tab[4])-tab[2])+tab[1]
=23(23(4A)-2A)+1A
=8(32A-2A)+1A
=241A                                                (6.12)
【０１４８】
なお、符号付window法は、window法と同様の理由から、SPA攻撃に対しては安全であるが、DPA攻撃に対しては脆弱である。
【０１４９】
＜符号付ランダムwindow法の検討（第３＋第４の比較例）＞
さて、以上のとおり第１〜第４の比較例について説明したが、SPA攻撃とDPA攻撃の双方に対して安全なランダム化window法はメモリ消費量が比較的多く、メモリ消費量の少ない符号付window法はDPA攻撃に対しては脆弱である。すなわち、上記の４つの比較例の中には、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴を持つ手法は存在しない。
【０１５０】
他方、サイドチャネル攻撃の一種であるPA攻撃は、組み込み機器に対しても行われる危険性が十分にあり、また、組み込み機器の中には、何らかの理由からメモリ容量が限られたものがある。よって、例えば組み込み機器のようにメモリ容量の小さな装置におけるスカラー倍算の処理は、SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ないことが好ましい。
【０１５１】
しかしながら、本願発明者が研究したところ、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴は、単純素朴にランダム化window法と符号付window法を組み合わせることでは得られないことが判明した。むしろ、発明者は「ランダム化window法と符号付window法は、単純素朴に組み合わせることは不可能である」という知見を得た。この知見をもう少し詳しく述べると、次のとおりである。
【０１５２】
乱数の使用は、符号付window法の単純な適用を阻害する。そのため、SPA攻撃への対策としてランダム化window法が採用されると、符号付window法の単純な適用によるメモリ使用量の削減は不可能となる。つまり、「符号付window法とランダム化window法の単純素朴な組み合わせによって、少ないメモリ使用量で、SPA攻撃とDPA攻撃の双方に対する安全性を確保しよう」という試みは、うまくいかない。
【０１５３】
この知見について、より詳しく説明すれば、以下の通りである。
第４の比較例である符号付window法と第３の比較例であるランダム化window法を組み合わせてSPAにもDPAにも耐性を持つ点のスカラー倍算を実現することは困難である。例えば図１４の例の場合、以下のようになる。なお、下記手順１．〜５．は、図１４中の手順１．〜５．に、それぞれ対応している。
【０１５４】
１．上位側から3個目のウィンドウで110となるため、window値を010とし、スカラー倍算の処理の際には点の減算処理を行うこととなる。この系列のsは+s→-sとなる。
【０１５５】
２．3個目のwindow値を010としたため、2個目のwindow値に1ビットのキャリーが上がる。
【０１５６】
３．手順２．で上がったキャリーにより、2個目のwindow値に+1が加算され、100となる。
【０１５７】
４．手順３．で3個目のwindow値が100になることにより、-4Aを参照することとなり、sの符号が+s→-sへと変更になる。
【０１５８】
５．手順４．で2個目のsが-sとなったことにより、手順１．で3個目のwindow値を確定した際に想定していたsと異なってしまう（+s）ため、3個目のwindow値を決定できない。
【０１５９】
上記により、上位から下位に向かってwindow値を決定していくアルゴリズムについて、window値を一意に決定できなくなる。
【０１６０】
以上説明したことをまとめると、図１５に示される表となる。まず、前述した第３の比較例であるランダム化window法は、DPA攻撃に対して（およびSPA攻撃にも）有効であり、キャリー制御も単純であるが、テーブルサイズが2kと大きい。一方、前述した第４の比較例である符号付window法は、キャリー制御が単純でテーブルサイズは2k-1+1と小さいが、DPA攻撃に対して脆弱である。そして、第３比較例であるランダム化window法と第４の比較例である符号付window法は、単純な方法では組み合わせられない。つまり、テーブルサイズが通常のwindow法の約半分（2k-1+1個）となるような方法は単純な組み合わせでは実現できない。
【０１６１】
そこで、本出願では、DPAに対して安全で、テーブルサイズが通常のwindow法の約半分(2k-1+1)で、キャリー制御が単純な手法を提供する。
【０１６２】
課題を解決するために本出願は以下の特徴を持つ。
・（s||window値）の形の系列
・下位側から上位側へ向かって、出願手法に基づいた生成法によるwindow値の生成
【０１６３】
一つ目の特徴である（s||window値）の形の系列を使用することにより、window法で計算する途中結果がランダム化されるため、DPAに対して安全になる。またwindow法を用いていることにより、SPAに対しても安全となる。
【０１６４】
さらに、二つ目の特徴である下位側から上位側へ向かってのwindow値生成を後述するアルゴリズムで実行することにより、キャリーの制御が不要な簡単な手法で安全なスカラー倍算が実現できる。
【０１６５】
図１６は、第１〜第３の実施形態の暗号処理装置の第１のハードウェア構成例を示す図である。
図１６の暗号処理装置１６００は、Central Processing Unit（ＣＰＵ）１６０１、Read Only Memory（ＲＯＭ）１６０２、Random Access Memory（ＲＡＭ）１６０３、通信回路１６０４、および通信インタフェース（Ｉ／Ｆ）１６０５を有する。通信回路１６０４は、通信Ｉ／Ｆ１６０５を介して他の装置との間で通信を行う。
【０１６６】
そして、ＣＰＵ１６０１、ＲＯＭ１６０２、ＲＡＭ１６０３、および通信回路１６０４は、バス１６０６により互いに接続されている。また、暗号処理装置１６００は、電源端子１６０７とグランド端子１６０８を有し、暗号処理装置１６００内の各部へは、不図示の配線と電源端子１６０７を介して電源電圧が供給される。暗号処理装置１６００内の各部は、不図示の配線を介してグランド端子１６０８とも接続されている。
【０１６７】
ＣＰＵ１６０１は、ＲＯＭ１６０２に予め記憶されたプログラムをＲＡＭ１６０３にロードし、ＲＡＭ１６０３をワーキングエリアとして用いながらプログラムを実行することで、各種の処理を行う。例えば、ＣＰＵ１６０１は、図２０、図２２、図２３、図２５、図２６、図２８のフローチャートで示される制御処理を実行する。
【０１６８】
なお、ＲＯＭ１６０２の代わりにフラッシュメモリなどの他の種類の不揮発性記憶装置が使われてもよい。フラッシュメモリなどの書き換え可能な記憶装置がＲＯＭ１６０２の代わりに使われる場合は、プログラムは、通信Ｉ／Ｆ１６０５を介して暗号処理装置１６００にダウンロードされ、暗号処理装置１６００にインストールされてもよい。
【０１６９】
また、暗号処理装置１６００は、通信Ｉ／Ｆ１６０５を介して他の装置と通信することができる。例えば、暗号処理装置１６００は、暗号処理装置１６００自身の公開鍵などの情報を、通信Ｉ／Ｆ１６０５を介して他の装置に送信してもよいし、他の装置の公開鍵などの情報を、通信Ｉ／Ｆ１６０５を介して受信してもよい。
【０１７０】
通信Ｉ／Ｆ１６０５の種類は、暗号処理装置１６００の種類に応じた任意の種類でよい。例えば、暗号処理装置１６００は、スマートカードでもよいし、プリンタカートリッジなどのアクセサリ部品に組み込まれるＬＳＩチップでもよいし、家電製品に組みこまれるＬＳＩチップでもよい。例えば、暗号処理装置１６００が接触式スマートカードの場合は、通信Ｉ／Ｆ１６０５は通信用端子を含んでもよいし、暗号処理装置１６００が非接触式スマートカードの場合は、通信Ｉ／Ｆ１６０５はアンテナを含んでもよい。
【０１７１】
通信回路１６０４は、通信Ｉ／Ｆ１６０５の種類と通信プロトコルに応じて、適宜の処理を行う。例えば、通信回路１６０４は、ディジタル・アナログ変換、アナログ・ディジタル変換、変調、復調、符号化、復号などの処理を行ってもよい。
【０１７２】
なお、PA攻撃を行う攻撃者は、通信Ｉ／Ｆ１６０５を介して楕円曲線上の点のデータを暗号処理装置１６００に入力し、入力された点に関して暗号処理装置１６００が処理を行っているときの消費電力を測定することで、暗号処理装置１６００の個人鍵を推測する。例えば、攻撃者は、電源端子１６０７に抵抗器を接続することで、消費電力の測定を行う。
【０１７３】
図１７は、第１〜第３の実施形態の暗号処理装置の第２のハードウェア構成例を示す図である。図１７の暗号処理装置１６１０は、ＣＰＵ１６０１とＲＯＭ１６０２の代わりにECCハードウェア回路１６１１を有する。
【０１７４】
また、暗号処理装置１６１０は、図１６の暗号処理装置１６００と同様のＲＡＭ１６０３と通信回路１６０４と通信Ｉ／Ｆ１６０５を有する。そして、暗号処理装置１６１０において、ECCハードウェア回路１６１１とＲＡＭ１６０３と通信回路１６０４は互いにバス１６０６で接続されている。また、暗号処理装置１６１０にも図１６の暗号処理装置１６００と同様の電源端子１６０７とグランド端子１６０８がある。
【０１７５】
暗号処理装置１６１０においては、ＲＯＭ１６０２からプログラムを読み出して実行するＣＰＵ１６０１の代わりに、ECCハードウェア回路１６１１が図２０、図２２、図２３、図２５、図２６、図２８のフローチャートで示される制御処理を行う。ECCハードウェア回路１６１１は、例えば、Application Specific Integrated Circuit（ＡＳＩＣ）でもよいし、ECCハードウェア回路１６１１の少なくとも一部がField Programmable Gate Array（ＦＰＧＡ）により実現されていてもよい。また、ECCハードウェア回路１６１１も、不図示の配線により電源端子１６０７およびグランド端子１６０８と接続されている。
【０１７６】
なお、実施形態によっては、暗号処理装置が、汎用プロセッサとしての図１６のＣＰＵ１６０１と、ＣＰＵ１６０１が実行するプログラムを格納する図１６のＲＯＭ１６０２と、コプロセッサとしての図１７のECCハードウェア回路１６１１を有していてもよい。そして、図２０、図２２、図２３、図２５、図２６、図２８のフローチャートで示される制御処理の一部をＣＰＵ１６０１が行い、残りの一部をECCハードウェア回路１６１１が行ってもよい。その場合も、暗号処理装置は、図１６および図１７と同様に、ＲＡＭ１６０３と通信回路１６０４と通信Ｉ／Ｆ１６０５を有する。
【０１７７】
図１８および図１９は、第１〜第３の実施形態の暗号処理装置の機能構成を説明する図である。図１８に示されるwindows値決定ユニット１８００および図１９に示される点のスカラー倍算計算ユニット１９００は、図１６または図１７に例示したハードウェアにより実現することができる。
【０１７８】
まず、図１８のwindows値決定ユニット１８００は、乱数生成部１８０１、windows値決定部１８０２、補正値計算部１８０３、制御部１８０４、window値格納部１８０５、補正値格納部１８０６、および乱数格納部１８０７を備える。
【０１７９】
乱数生成部１８０１は、ｂビットの2進数の乱数ｓを生成する。
windows（ウィンドウ）値決定部１８０２は、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からｋビットを取り出して2進数のwindow（ウィンドウ）列w(i)として計算する。
【０１８０】
補正値計算部１８０３は、window列w(i)の最上位ビットが0ならば、window列w(i)の上位ビット側に乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とする。また、補正値計算部１８０３は、window列w(i)の最上位ビットが1ならば、2進法におけるwindow列w(i)に対する基数の補数のビット列vを計算する。そして、そのビット列vの上位ビット側に乱数ｓを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dからビット列-xを減算して新たな秘密鍵dのビット列とする。
【０１８１】
制御部１８０４は、windows値決定部１８０２の処理と補正値計算部１８０３の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる。
【０１８２】
window（ウィンドウ）値格納部１８０５は、制御部１８０４での動作が終了した後に得られる各window列w(i)を格納する。
補正値格納部１８０６は、制御部１８０４での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する。
【０１８３】
乱数格納部１８０７は、乱数生成部１８０１が生成した乱数sを格納する。
次に、図１９の点のスカラー倍算計算ユニット１９００は、ランダム化テーブル生成部１９０１、符号付ランダム化window法計算部１９０２、および制御部１９０３を備える。同ユニット１９００は、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して図１８のwindows値決定ユニット１８００が算出した乱数sと、各ウィンドウ列w(i)と、補正値d’とから、秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する。（ここで、b,m,k,i,jは０を含む自然数とする。）
ランダム化テーブル生成部１９０１は、window列w(i)のビット数に対応するビット数kのビット列の値を順次変化させながら、kビットのビット列の上位ビット側に乱数sを結合して得られるインデックス値をスカラー値として点Aに対するスカラー倍算を実行し、sそのスカラー倍算の計算結果を、インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成する。
【０１８４】
符号付ランダム化window（ウィンドウ）法計算部１９０２は、補正値d’をスカラー値として点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定する。そして、符号付ランダム化window法計算部１９０２は、各ウィンドウ列w(j)について、上位ビット側から下位ビット側に向けて、以下の第１および第２の一連の処理を、繰り返し実行する。すなわち、同計算部１９０２は、第１の処理として、楕円曲線上の２倍算を各ウィンドウ列のビット数に対応する回数=k回実行する処理を実行する。次に、同計算部１９０２は、第２の処理として、ウィンドウ列w(j)の最上位ビットが0ならば、ウィンドウ列w(j)をインデックスとしてランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算する。一方、ウィンドウ列w(j)の最上位ビットが1ならば、2進法におけるウィンドウ列w(j)に対する基数の補数のビット列をインデックスとしてランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を出力変数Vに加算する。
【０１８５】
制御部１９０３は、符号付ランダム化window法計算部１９０２における上述の各ウィンドウ列w(j)についての上位ビット側から下位ビット側に向けての繰り返し実行を制御する。
【０１８６】
そして、制御部１９０３は、上記繰り返しの結果最終的に得られた出力変数Vの値を暗号演算の結果として出力する。
【０１８７】
図１８および図１９で、乱数生成部１８０１、windows値決定部１８０２、補正値計算部１８０３、制御部１８０４、ランダム化テーブル生成部１９０１、符号付ランダム化window法計算部１９０２、および制御部１９０３は、以下の構成として実現できる。すなわち、これらの各部は、図１６のＣＰＵ１６０１が実行する処理であってもよいし、図１７のECCハードウェア回路１６１１が実行する処理であってもよいし、ＣＰＵ１６０１とECCハードウェア回路１６１１の組み合わせにより実行される処理であってもよい。その場合に、これらの処理を実行するプログラムは、図１６または図１７のＲＯＭ１６０２またはＲＡＭ１６０３に記憶させて、実行することができる。また、秘密鍵dは、例えば図１６または図１７のＲＯＭ１６０２に記憶させることができる。また、図１８のwindow値格納部１８０５、補正値格納部１８０６、および乱数格納部１８０７は、例えば図１６または図１７のＲＡＭ１６０３に記憶させることができる。
【０１８８】
図１９において、点Aは、第１〜第３の実施形態の暗号処理装置以外の装置から第１〜第３の実施形態の暗号処理装置に与えられる点でもよい。例えば、点Aは、外部装置の公開鍵でもよい。外部装置の公開鍵は、例えば、DH鍵共有のために外部装置から第１〜第３の実施形態の暗号処理装置へと通知されることもあるし、DSAによる認証のために外部装置から第１〜第３の実施形態の暗号処理装置へと通知されることもある。
【０１８９】
点Aが第１〜第３の実施形態の暗号処理装置以外の装置から第１〜第３の実施形態の暗号処理装置に与えられる点である場合、点Aは、通信Ｉ／Ｆ１６０５と通信回路１６０４により取得される。
【０１９０】
図１９の制御部１９０３は、出力変数Vの値のxy座標を用いて適宜の処理を行う。例えば、制御部１９０３は、点Vを他の装置に送信してもよいし、DSAによる認証のための処理を行ってもよいし、DH鍵共有のための処理を行ってもよい。制御部１９０３は、場合によっては、通信回路１６０４と通信Ｉ／Ｆ１６０５を利用して、点Vを外部に出力してもよい。例えば、第１〜第３の実施形態の暗号処理装置が、ホスト（例えばプリンタなど）により認証されるアクセサリ部品（例えばプリンタカートリッジなど）に含まれる場合、制御部１９０３は、ホストと通信するための通信回路１６０４と通信Ｉ／Ｆ１６０５を含む。
【０１９１】
次に、図１８のwindows値決定ユニット１８００および図１９の点のスカラー倍算計算ユニット１９００の具体的な処理を示す第１の実施形態について、以下に説明する。
【０１９２】
図２０は、図１８のwindows値決定ユニット１８００の処理を表す、第１の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
【０１９３】
入力としては、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵d=d[b+m×k]||・・・||d[1]||d[0]が入力されて処理が開始される。ここで、kはwindow値のビット数、mはwindow列の個数、bは乱数ｓのビット数である。
【０１９４】
そしてまず、ｂビットの2進数の乱数ｓが生成される（ステップ２２０１）。これは、図１８の乱数生成部１８０１の機能に対応する。
次に、変数iの値がm-1に、変数Lの値が0に初期化される（ステップ２２０２）。
【０１９５】
次に、現在の秘密鍵dのビット列の最下位からkビットが取り出されてwindow列w(i)とされる（ステップ２２０３）。これは、図１８のwindows値決定部１８０２の機能に対応する。
【０１９６】
次に、window列w(i)の最上位ビット（MSB：Most Significant Bit）が1であるか否かが判定される（ステップ２２０４）。
【０１９７】
window列w(i)の最上位ビットの最上位ビットが0ならば、window列w(i)の上位ビット側に乱数ｓを結合して得られる2進数のビット列x=(s||w(i))を得る（ステップ２２０４→２２０５）。
【０１９８】
続いて、現在の秘密鍵dからビット列xを減算し、その減算結果が０未満になっているか否かが判定される（ステップ２２２０）。
上記減算結果が０未満になっていなければ、上記減算結果が新たな秘密鍵dのビット列とされる（ステップ２２２０→２２０６）。
上記減算結果が０未満になった場合については後述する。
【０１９９】
一方、window列w(i)の最上位ビットの最上位ビットが1ならば、2進法におけるwindow列w(i)に対する基数の補数のビット列vを計算する（ステップ２２０７）。より具体的には、window列w(i)とビット列2k-1との間で対応するビット毎に排他的論理和（XOR：エクスクルーシブオア）が演算されることにより、window列w(i)の各ビットが反転され、その反転結果に1が加算され、その加算結果がvとされる。
【０２００】
次に、上記ビット列vの上位ビット側に乱数ｓを結合してビット列x=(s||v)を得る（ステップ２２０８）。
そして、上記ビット列xに負符号をつけたビット列-xを、現在の秘密鍵dから減算し、新たな秘密鍵dのビット列とする。すなわち、d=d-(-x)=d+xを計算する（ステップ２２０６′）。
【０２０１】
以上のステップ２２０４から２２０９までの一連の処理は、図１８の補正値計算部１８０３の機能に対応する。
次に、上記ステップ２２０６または２２０６′により新たな秘密鍵dが算出できたら、その秘密鍵dのビット列がｋビット右シフトされ、最下位kビットが捨てられる（ステップ２２１０）。ここで、「ｄ>>k」は、秘密鍵dをkビット右シフトさせる演算を表す。
【０２０２】
次に、変数iの値が-1される（ステップ２２１１）。
そして、変数iの値が0以上であるか否かが判定される（ステップ２２１２）。
変数iの値が0以上であれば、ステップ２２０３に戻って、再度ステップ２２０３から２２０９までの一連の処理が実行される（ステップ２２１２→２２０３）。
【０２０３】
変数iの値が0未満になったときには、ステップ２２１３に移行する（ステップ２２１２→２２１３）。
また、前述のステップ２２２０でd-xの値が0未満になったときにも、変数Lの値に現在のi+1の値がセットされた後に（ステップ２２２０→２２２１）、ステップ２２１３に移行する。この処理については、後述する。
【０２０４】
以上のステップ２２１０から２２１２、およびステップ２２２０，２２２１の制御処理は、図１８の制御部１８０４の機能に対応する。
【０２０５】
最後に、現在の秘密鍵dの値が補正値d’とされる（ステップ２２１３）。
そして、最終的に得られたwindow列w[0]〜w[m-1]、乱数ｓ、補正値d’、およびwindow開始位置を示す変数Lの値が出力されて、window値決定アルゴリズムの処理が終了する。
【０２０６】
以上の第１の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図２１の説明図を用いながら説明する。
【０２０７】
まず、kは前述したようにwindow値のビット長であり、事前に決定しておくパラメータである。また、bは前述したように乱数ｓのビット長であり、最低値を事前に決定しておくパラメータである。秘密鍵dの長さ(u)とk,bによりmの値も定まる。一例として以下のように定めることができる。
【０２０８】
【数４】
2012090288.tif 000006
ここで、mを決めたことによりbが変化する。
【０２０９】
別の例としては以下でもよい。
【０２１０】
【数５】
2012090288.tif 000007
【０２１１】
また、以下のようにしてもよい。
【０２１２】
【数６】
2012090288.tif 000008
【０２１３】
さらに、以下のようにしてもよい。
【０２１４】
【数７】
2012090288.tif 000009
【０２１５】
他にも多数の導出法が考えられる。
【０２１６】
推奨されるパラメータ長としては、下記のような例となる。
k=2,3,4,5等
b=10,12,16,20,30,40,50,60,70,80,90,100など任意の長さ
dの長さu=512,1024,2048,3072,4096,
160,192,224,256,384,521,163,233,239,283,409,571等
【０２１７】
ここで例えば、k=2,b=4,d=(10110111001011)2 ，（dの長さu=14ビット）である場合の楕円曲線暗号演算処理を考える。このとき、数４式の計算例により、
h=u−b=10
m=5
b=u−k×m=14-2×5=4(変化なし)
となる。
【０２１８】
この条件のもとで、まずステップ２２０１により、b=4ビットの乱数として、例えば(1011)2が生成される。
次に、ステップ２２０２により、i=m-1=5-1=4、L=0と初期化される。
【０２１９】
次に、第1周目のステップ２２０３により、図２１に示されるように、dの最下位から2ビットを取り出してw[4]=(11)2 とする。
次に、第1周目のステップ２２０４により、w[4]の最上位ビットは1であると判定される。
【０２２０】
この結果、第1周目のステップ２２０７により、w[4]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
続いて、第1周目のステップ２２０８により、x=(s||v)=(101101)2が算出される。
【０２２１】
そして、第1周目のステップ２２０９により、図２１に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(10110111001011)2 +(101101)2 =(10110111111000)2として新たな秘密鍵dが算出される。
【０２２２】
次に、第1周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(101101111110)2が算出される。
次に、第1周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=3となる。
【０２２３】
次に、第1周目のステップ２２１２により、変数i=3は0以上であると判定され、第2周目のステップ２２０３に戻る。
次に、第2周目のステップ２２０３により、図２１に示されるように、dの最下位から2ビットを取り出してw[3]=(10)2 とする。
【０２２４】
次に、第2周目のステップ２２０４により、w[3]の最上位ビットは1であると判定される。
この結果、第2周目のステップ２２０７により、w[3]=(10)2 に対して2の補数が演算され、v=(10)2が算出される。
【０２２５】
続いて、第2周目のステップ２２０８により、x=(s||v)=(101110)2が算出される。
そして、第2周目のステップ２２０９により、図２１に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(101101111110)2 +(101110)2 =(101110101100)2として新たな秘密鍵dが算出される。
【０２２６】
次に、第2周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1011101011)2が算出される。
次に、第2周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=2となる。
【０２２７】
次に、第2周目のステップ２２１２により、変数i=2は0以上であると判定され、第3周目のステップ２２０３に戻る。
次に、第3周目のステップ２２０３により、図２１に示されるように、dの最下位から2ビットを取り出してw[2]=(11)2 とする。
【０２２８】
次に、第3周目のステップ２２０４により、w[2]の最上位ビットは1であると判定される。
この結果、第3周目のステップ２２０７により、w[2]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
【０２２９】
続いて、第3周目のステップ２２０８により、x=(s||v)=(101101)2が算出される。
そして、第3周目のステップ２２０９により、図２１に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(1011101011)2 +(101101)2 =(1100011000)2として新たな秘密鍵dが算出される。
【０２３０】
次に、第3周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11000110)2が算出される。
次に、第3周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=1となる。
【０２３１】
次に、第3周目のステップ２２１２により、変数i=1は0以上であると判定され、第4周目のステップ２２０３に戻る。
次に、第4周目のステップ２２０３により、図２１に示されるように、dの最下位から2ビットを取り出してw[1]=(10)2 とする。
【０２３２】
次に、第4周目のステップ２２０４により、w[1]の最上位ビットは1であると判定される。
この結果、第4周目のステップ２２０７により、w[1]=(10)2 に対して2の補数が演算され、v=(10)2が算出される。
【０２３３】
続いて、第4周目のステップ２２０８により、x=(s||v)=(101110)2が算出される。
そして、第4周目のステップ２２０９により、図２１に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11000110)2 +(101110)2 =(11110100)2として新たな秘密鍵dが算出される。
【０２３４】
次に、第4周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111101)2が算出される。
次に、第4周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=0となる。
【０２３５】
次に、第4周目のステップ２２１２により、変数i=0は0以上であると判定され、第5周目のステップ２２０３に戻る。
次に、第5周目のステップ２２０３により、図２１に示されるように、dの最下位から2ビットを取り出してw[0]=(01)2 とする。
【０２３６】
次に、第5周目のステップ２２０４により、w[0]の最上位ビットは1ではないと判定される。
この結果、第5周目のステップ２２０５により、図２１に示されるように、x=(s||w[0])=(101101)2が算出される。
【０２３７】
次に、第5周目のステップ２２２０により、d-x=(111101)2-(101101)2 =(010000)2は、0未満ではないと判定される。
続いて、第5周目のステップ２２０６により、上記d-x=(010000)2が新たな秘密鍵dの値とされる。
【０２３８】
次に、第5周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(0100)2が算出される。
次に、第5周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=-1となる。
【０２３９】
次に、第5周目のステップ２２１２により、変数i=-1は0以上ではないと判定され、ステップ２２１３に進む。この結果、最終的に得られている秘密鍵d=(0100)2が、図２１に示されるように、補正値d’とされる。
【０２４０】
以上の処理の結果、最終的に得られたwindow列w[0]〜w[4]、乱数ｓ、補正値d’、およびwindow開始位置を示す変数L=0の値（w[0]から開始を示す）が出力されて、window値決定アルゴリズムの処理が終了する。
【０２４１】
以上説明したwindow値決定アルゴリズムの処理では、まず、秘密鍵dの下位ビットからkビットずつのwindow列w[i]が取り出される。そして、そのwindow列の最上位ビットが1である場合には、図１３で説明した場合と同じ原理で、window列w[i]に対して2の補数が演算されてwindow値が補正されることにより、window法におけるテーブルサイズの半減化が行われる。これと共に、本実施形態では、window列の上位ビット側に乱数ｓが結合される。そして、window値の補正と乱数ｓの結合による秘密鍵dのずれ分が、ステップ２２０６または２２０６′およびステップ２２１０によって補正され、次のkビットのwindow列の切り出しは、この補正された秘密鍵dに対して行われる。このようにして、本実施形態では、下位ビット側で行われた、テーブルサイズ半減化のためのwindow値の補正とランダム化のための乱数ｓの上位ビット側への結合による秘密鍵dのずれが秘密鍵dの上位ビット側に伝搬されてゆく。この結果、必要数のwindow列w[m-1]〜w[0]が切り出された後に残った秘密鍵dのビット列を、補正値d’として出力することができる。
【０２４２】
以上のようにして決定されたwindow列w[0]〜w[m-1]と補正値d’と乱数ｓを用いることにより、ランダム化と符号付window法を同時に達成することが可能となる。
なお、パラメータu,k,b,mの選択条件により、すべてのwindowが処理される前に、d-xの値が0未満になる可能性がある。この場合には、ステップ２２２０→２２２１→２２１３により、d-xの値が0未満になる直前までのwindow列と、その時点の秘密鍵dの値を補正値d’として出力するように制御する。このとき、最後に打ち切られたwindow列のサフィックスが変数L=i+1として出力される。すなわち、出力されるwindow列は、通常はステップ２２０２によりL=0のままとなるためw[0]〜w[m-1]となるが、d-x<0の条件が成立した場合には、L=0とはならないためw[0]≠w[L]〜w[m-1]が出力されることになる。つまり、変数Lは、暗号演算処理におけるwindow開始位置を示している。
【０２４３】
図２２は、図１９の点のスカラー倍算計算ユニット１９００の処理を表す、第１の実施形態における点のスカラー倍算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
【０２４４】
入力としては、図２０のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数ｓ、補正値d’、window開始位置Lである。また、スカラー倍算のための楕円曲線上の点Aが入力される。
【０２４５】
そしてまず、ステップ２３０１〜２３０７において、符号付ランダムwindow法のためのテーブル生成フェーズの処理が実行される。この制御処理は、図１９のランダム化テーブル生成部１９０１の機能に対応する。
【０２４６】
ここでは、上位bビットに乱数ｓが設定され、下位kビットの値が0から2k-1まで変化するビット列に対して、スカラー倍算演算が実行される。そして、そのスカラー倍算結果が、下位kビットの値をインデックス値とするテーブルのエントリに格納されてゆく。
【０２４７】
まず、乱数ｓをスカラー値とする点Aに対するスカラー倍算sAが計算され、その結果が変数Uに格納される（ステップ２３０１）。この計算には、通常のバイナリ法を適用することができる。
【０２４８】
次に、乱数ｓが上位ビット側に配置された状態でのスカラー倍算結果を得るために、ステップ２３０１で算出された変数Uの値に対して2倍算=2Uを実行して新たな変数Uの値とする演算処理がk回実行される（ステップ２３０２）。あるいは、U=2kUなる2k倍算処理を公知の高速化技術によって計算してもよい。これにより、下位kビットのwindow列に乱数ｓが結合された状態での、乱数ｓに対するスカラー倍算の演算成分が得られる。
【０２４９】
このようにして得られた演算成分に対して、下位kビットのwindow列を変化させることによるスカラー倍算の演算成分が加算されて、テーブルデータが作成される。
すなわちまず、変数Uの値がそのまま、下位kビットによる値が0である場合のテーブルエントリT[0]に格納される（ステップ２３０３）。これは、下位kビットによる値が0のときは、それによるスカラー倍算の演算成分も0であるからである。
【０２５０】
次に、変数iの初期値が1とされる（ステップ２３０４）。
次に、U=U+Aの点の加算処理が計算され、その結果がテーブルエントリT[i]に格納される（ステップ２３０５）。
【０２５１】
次に、変数iの値が+1される（ステップ２３０６）。
そして、変数iの値が2k-1以下であるか否かが判定される（ステップ２３０７）。
変数iの値が2k-1以下であれば、ステップ２３０５に戻って、次のテーブルエントリの計算が実行される。
【０２５２】
以上のステップ２３０５から２３０７までの繰り返し処理は、変数iに対応する下位kビットの値が1ずつ増えると、点Aに対するスカラー倍算の結果がAずつ増えてゆくことを利用したスカラー倍算の演算処理である。このようにして、T[0]からT[2k-1]までのテーブルデータが作成される。なお、テーブルデータのサイズは、2k個の約半分の2k-1+1個でよいことに留意する。
【０２５３】
変数iの値が2k-1に達すると、テーブル生成フェーズを終了し、次に実際の暗号処理である点のスカラー倍算フェーズの処理になる。これは、ステップ２３０８から２３１６までの部分である。この制御処理は、図１９の符号付ランダム化window法計算部１９０２の機能に対応する。
【０２５４】
まず、V=d’Aとして、補正値d’に対するスカラー倍算成分が算出される（ステップ２３０８）。この計算には、通常のバイナリ法による演算を適用することができる。それは、補正値d’の値は、たとえ解読されたとしても秘密鍵dの解読は依然として困難にしておくことができるからである。変数Vは、暗号処理の出力値が最終的に得られる出力変数である。
【０２５５】
次に、変数jの値がwindow列の最初のサフィックスLに初期化される（ステップ２３０９）。
次に、ステップ２３１０から２３１６のループ処理により、秘密鍵dの上位ビット側から下位ビット側に向けて、テーブル生成フェーズで生成されたテーブルを参照しながらスカラー倍算を計算する繰り返し処理が実行される。
【０２５６】
まず、出力変数Vの値に対して2倍算2Vを実行する処理がk回実行される（ステップ２３１０）。あるいは、V=2kVなる2k倍算処理を公知の高速化技術によって計算してもよい。この処理により、補正値d’と最初の上位側window列w[L]との桁位置が合わせられる。
【０２５７】
次に、window列w(j)の最上位ビット（MSB）が1であるか否かが判定される（ステップ２３１１）。
window列w(i)の最上位ビットの最上位ビットが0ならば、window列w(j)をインデックスとするテーブルデータT[w(j)]が取得され、出力変数Vに加算される（ステップ２３１２）。
【０２５８】
一方、window列w(i)の最上位ビットの最上位ビットが1ならば、2進法におけるwindow列w(j)に対する基数の補数のビット列indexを計算する（ステップ２３１３）。より具体的には、window列w(j)とビット列2k-1との間で対応するビット毎に排他的論理和（XOR）が演算されることにより、window列w(j)の各ビットが反転され、その反転結果に1が加算され、その加算結果が変数indexの値とされる。
【０２５９】
次に、変数indexの値をインデックスとするテーブルデータT[index]が取得され、出力変数Vに加算される（ステップ２３１４）。
ステップ２３１２または２３１４の処理の後、変数jの値が+1される（ステップ２３１５）。
【０２６０】
そして、変数jの値がm-1以下であるか否かが判定される（ステップ２３１６）。
変数jの値がm-1以下であれば、さらに下位側のwindow列に対するスカラー倍算処理を実行するために、ステップ２３１０の処理に戻る。
【０２６１】
変数jの値がm-1を超えれば、秘密鍵d全体に対する点Aのスカラー倍算と等価な処理を終了し、出力変数Vの値を暗号演算処理の結果として出力し、図２２の点のスカラー倍算アルゴリズムの処理を終了する（ステップ２３１１の判定がno）。
【０２６２】
以上の第１の実施形態における点のスカラー倍算アルゴリズムの処理の具体的な数値計算例について説明する。
ここで入力されるwindow列w[0]〜w[4]、乱数ｓ、補正値d’、 window開始位置を示す変数Lは、前述した図２１の数値計算例で得られたものである。
【０２６３】
始めに、テーブル生成フェーズの数値計算例である。
まず、ステップ２３０１で、乱数ｓ=(1011)2（図２１参照）を使って、U=(1011)2 ×Aが計算される。
【０２６４】
次に、ステップ２３０２で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1011)2×A=4×11×A=44Aとなる。
次に、ステップ２３０３で、インデックス値0に対応するテーブルエントリT[0]に、U=44Aが格納される。
【０２６５】
次に、ステップ２３０４で、変数i=1と初期設定される。
次に、第1周目のステップ２３０５で、U=U+A=45Aがインデックス値1に対応するテーブルエントリT[1]に格納される。
【０２６６】
次に、第1周目のステップ２３０６で、変数i=i+1=2とされる。
次に、第1周目のステップ２３０７で、変数i=2≦21=2の判定がｙｅｓとなり、第2周目のステップ２３０５に戻る。
【０２６７】
次に、第2周目のステップ２３０５で、U=U+A=46Aがインデックス値1に対応するテーブルエントリT[2]に格納される。
次に、第2周目のステップ２３０６で、変数i=i+1=3とされる。
【０２６８】
次に、第2周目のステップ２３０７で、変数i=3≦21=2の判定がｎｏとなり、テーブル生成フェーズを終了する。
以上により、T[0],T[1],T[2]の2k-1+1=3個のテーブルデータが生成される。
【０２６９】
次に、点のスカラー倍算フェーズの数値計算例である。
まず、ステップ２３０８で、補正値d’=(0100)2 であるから（図２１参照）、V=d’A=(0100)2 ×A=4Aが計算される。
【０２７０】
次に、ステップ２３０９で、変数j=L=0とされる。
次に、第1周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×4A=16Aとなる。
【０２７１】
次に、第1周目のステップ２３１１で、上位側1番目のwindow列w[0]=(01)2（図２１参照）について、そのMSBが1ではないと判定される。
この結果、第1周目のステップ２３１２で、V=V+T[w[0]]=V+T[1]=16A+45A=61Aと計算される。
【０２７２】
次に、第1周目のステップ２３１５で、変数j=j+1=1となる。
次に、第1周目のステップ２３１６で、変数j=1≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第2周目のステップ２３１０に戻る。
【０２７３】
次に、第2周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×61A=244Aとなる。
次に、第2周目のステップ２３１１で、上位側2番目のwindow列w[1]=(10)2（図２１参照）について、そのMSBが1であると判定される。
【０２７４】
この結果、第2周目のステップ２３１３で、w[1]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
次に、V=V-T[Index]=V-T[2]=244A-46A=198Aが計算される。
【０２７５】
次に、第2周目のステップ２３１５で、変数j=j+1=2となる。
次に、第2周目のステップ２３１６で、変数j=2≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第3周目のステップ２３１０に戻る。
【０２７６】
次に、第3周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×198A=792Aとなる。
次に、第3周目のステップ２３１１で、上位側3番目のwindow列w[2]=(11)2（図２１参照）について、そのMSBが1であると判定される。
【０２７７】
この結果、第3周目のステップ２３１３で、w[2]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=792A-45A=747Aが計算される。
【０２７８】
次に、第3周目のステップ２３１５で、変数j=j+1=3となる。
次に、第3周目のステップ２３１６で、変数j=3≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第4周目のステップ２３１０に戻る。
【０２７９】
次に、第4周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×747A=2988Aとなる。
次に、第4周目のステップ２３１１で、上位側4番目のwindow列w[3]=(10)2（図２１参照）について、そのMSBが1であると判定される。
【０２８０】
この結果、第4周目のステップ２３１３で、w[3]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
次に、V=V-T[Index]=V-T[2]=2988A-46A=2942Aが計算される。
【０２８１】
次に、第4周目のステップ２３１５で、変数j=j+1=4となる。
次に、第4周目のステップ２３１６で、変数j=4≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第5周目のステップ２３１０に戻る。
【０２８２】
次に、第5周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×2942A=11768Aとなる。
次に、第5周目のステップ２３１１で、上位側5番目のwindow列w[4]=(11)2（図２１参照）について、そのMSBが1であると判定される。
【０２８３】
この結果、第5周目のステップ２３１３で、w[4]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=11768A-45A=11723Aが計算される。
【０２８４】
次に、第5周目のステップ２３１５で、変数j=j+1=5となる。
次に、第5周目のステップ２３１６で、変数j=5≦m−1=5−1=4の判定がｎｏとなる。
【０２８５】
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でスカラー倍算を行った結果（(10110111001011)2×A = 11723A）と一致する。そして、本実施形態は、window法であることによりSPAに対して安全であり、テーブルデータがランダム化されたことによりDPAに対しても安全であり、テーブルサイズの削減（2k-1+1個）をも実現でき、かつキャリー制御も単純な暗号演算処理の実現が可能となる。
【０２８６】
次に、図１８のwindows値決定ユニット１８００および図１９の点のスカラー倍算計算ユニット１９００の具体的な処理を示す第２の実施形態について、以下に説明する。
第２の実施形態では、第１の実施形態の処理に加えて、window列の値毎に異なる乱数ｓ(i)が使用される。この結果、より攪乱性を高めることが可能となる。
【０２８７】
図２３は、図１８のwindows値決定ユニット１８００の処理を表す、第２の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
【０２８８】
図２３において、第１の実施形態における図２０のフローチャートと同じ処理を実行するステップには、同じ番号を付してある。
図２３の処理が図２０の処理と異なるのはまず、乱数生成フェーズの処理である。この処理では、変数jの値が0に初期化された後（ステップ２４０１）、変数jの値が2k-1まで増加させられながら（ステップ２４０３、２４０４）、各変数j毎に、bビットの乱数s(j)が生成される（ステップ２４０２）。
【０２８９】
そして、図２０のステップ２２０５に対応する図２３のステップ２４０５では、window列w(i)の上位ビット側に、そのwindow列w(i)の値に対応する乱数ｓ(w(i))を結合して得られる2進数のビット列x=(s(w(i))||w(i))を得る。
【０２９０】
また、図２０のステップ２２０８に対応する図２３のステップ２４０６では、ビット列vの上位ビット側に、そのビット列vの値に対応する乱数ｓ(v)を結合してビット列x=(s(v)||v)を得る（ステップ２４０６）。
【０２９１】
このようにして決定されたwindow値w[0]〜w[m-1]が、各window列毎の乱数s[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数Lと共に出力されることになる。
以上の第２の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図２４の説明図を用いながら説明する。
【０２９２】
まず、u,k,b,mの決定の仕方は、第１の実施形態の場合と同様である。
ここで例えば、k=2,b=4,d=(11010010101111) 2 ，（dの長さu=14ビット）である場合の楕円曲線暗号を考える。このとき、数４式の計算例により、
h=u−b=10
m=5
b=u−k×m=14-2×5=4(変化なし)
となる。
【０２９３】
この条件のもとで、まずステップ２４０１で、変数j=0に初期設定される。
次に、第1周目のステップ２４０２で、4ビットの乱数s(0)として、例えば(0111)2が生成される。
【０２９４】
次に、第1周目のステップ２０４３で変数j=j+1=1とされる。
そして、第１周目のステップ２４０４で、変数j=1≦22-1=2の判定がｙｅｓとなり、第2周目のステップ２４０２に戻る。
【０２９５】
次に、第2周目のステップ２４０２で、4ビットの乱数s(1)として、例えば(1001)2が生成される。
次に、第2周目のステップ２０４３で変数j=j+1=2とされる。
【０２９６】
そして、第2周目のステップ２４０４で、変数j=2≦22-1=2の判定がｙｅｓとなり、第3周目のステップ２４０２に戻る。
次に、第3周目のステップ２４０２で、4ビットの乱数s(2)として、例えば(1100)2が生成される。
【０２９７】
次に、第3周目のステップ２０４３で変数j=j+1=3とされる。
そして、第3周目のステップ２４０４で、変数j=3≦22-1=2の判定がｎｏとなり、乱数生成フェーズの処理を終了する。
【０２９８】
次に、ステップ２２０２により、i=m-1=5-1=4、L=0と初期化される。
次に、第1周目のステップ２２０３により、図２４に示されるように、dの最下位から2ビットを取り出してw[4]=(11)2 とする。
【０２９９】
次に、第1周目のステップ２２０４により、w[4]の最上位ビットは1であると判定される。
この結果、第1周目のステップ２２０７により、w[4]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
【０３００】
続いて、第1周目のステップ２４０６により、v=(01)2に対応する乱数s(v)=s((01)2)を使って、x=(s((01)2)||v)=(100101)2が算出される。
そして、第1周目のステップ２２０９により、図２４に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11010010101111)2 +(100101)2 =(11010011010100)2として新たな秘密鍵dが算出される。
【０３０１】
次に、第1周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(110100110101)2が算出される。
次に、第1周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=3となる。
【０３０２】
次に、第1周目のステップ２２１２により、変数i=3は0以上であると判定され、第2周目のステップ２２０３に戻る。
次に、第2周目のステップ２２０３により、図２４に示されるように、dの最下位から2ビットを取り出してw[3]=(01)2 とする。
【０３０３】
次に、第2周目のステップ２２０４により、w[3]の最上位ビットは1ではないと判定される。
この結果、第2周目のステップ２４０５により、図２４に示されるように、w[3]= (01)2に対応する乱数s(w[3])=s((01)2)を使って、x=(s((01)2)||w[3])=(100101)2が算出される。
【０３０４】
次に、第2周目のステップ２２２０により、d-x=(110100110101)2-(100101)2=(110100010000)2は、0未満ではないと判定される。
続いて、第2周目のステップ２２０６により、上記d-x=(110100010000)2が新たな秘密鍵dの値とされる。
【０３０５】
次に、第2周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1101000100)2が算出される。
次に、第2周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=2となる。
【０３０６】
次に、第2周目のステップ２２１２により、変数i=2は0以上であると判定され、第3周目のステップ２２０３に戻る。
次に、第3周目のステップ２２０３により、図２４に示されるように、dの最下位から2ビットを取り出してw[2]=(00)2 とする。
【０３０７】
次に、第3周目のステップ２２０４により、w[2]の最上位ビットは1ではないと判定される。
この結果、第3周目のステップ２４０５により、図２４に示されるように、w[2]= (00)2に対応する乱数s(w[2])=s((00)2)を使って、x=(s((00)2)||w[2])=(011100)2が算出される。
【０３０８】
次に、第3周目のステップ２２２０により、d-x=(1101000100)2-(011100)2=(1100101000)2は、0未満ではないと判定される。
続いて、第3周目のステップ２２０６により、上記d-x=(1100101000)2が新たな秘密鍵dの値とされる。
【０３０９】
次に、第3周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11001010)2が算出される。
次に、第3周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=1となる。
【０３１０】
次に、第3周目のステップ２２１２により、変数i=1は0以上であると判定され、第4周目のステップ２２０３に戻る。
次に、第4周目のステップ２２０３により、図２４に示されるように、dの最下位から2ビットを取り出してw[1]=(10)2とする。
【０３１１】
次に、第4周目のステップ２２０４により、w[1]の最上位ビットは1であると判定される。
この結果、第4周目のステップ２２０７により、w[1]=(10)2に対して2の補数が演算され、v=(10)2が算出される。
【０３１２】
続いて、第4周目のステップ２４０６により、v=(10)2に対応する乱数s((10)2)を使って、x=(s((10)2)||v)=(110010)2が算出される。
そして、第4周目のステップ２２０９により、図２４に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11001010)2+(110010)2=(11111100)2として新たな秘密鍵dが算出される。
【０３１３】
次に、第4周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111111)2が算出される。
次に、第4周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=0となる。
【０３１４】
次に、第4周目のステップ２２１２により、変数i=0は0以上であると判定され、第5周目のステップ２２０３に戻る。
次に、第5周目のステップ２２０３により、図２４に示されるように、dの最下位から2ビットを取り出してw[0]=(11)2とする。
【０３１５】
次に、第5周目のステップ２２０４により、w[0]の最上位ビットは1であると判定される。
この結果、第5周目のステップ２２０７により、w[0]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
【０３１６】
続いて、第5周目のステップ２４０６により、v=(01)2に対応する乱数s((01)2)を使って、x=(s((01)2)||v)=(100101)2が算出される。
そして、第5周目のステップ２２０９により、図２４に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(111111)2+(100101)2=(1100100)2として新たな秘密鍵dが算出される。
【０３１７】
次に、第5周目のステップ２２１０により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11001)2が算出される。
次に、第5周目のステップ２２１１により、変数iの値が-1される。すなわち、i=i-1=-1となる。
【０３１８】
次に、第5周目のステップ２２１２により、変数i=-1は0以上ではないと判定され、ステップ２２１３に進む。この結果、最終的に得られている秘密鍵d=(11001)2が、図２４に示されるように、補正値d’とされる。
【０３１９】
以上の処理の結果、最終的に得られたwindow列w[0]〜w[4]、乱数ｓ[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数L=0の値が出力されて、window値決定アルゴリズムの処理が終了する。
【０３２０】
図２５は、図１９の点のスカラー倍算計算ユニット１９００の処理を表す、第２の実施形態における点のスカラー倍算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
【０３２１】
図２５において、第１の実施形態における図２２のフローチャートと同じ処理を実行するステップには、同じ番号を付してある。
図２５の処理が図２２の処理と異なるのは、ステップ２５０１〜２５１０のテーブル生成フェーズの処理である。ステップ２３０８〜２３１６の点のスカラー倍算フェーズの処理は、図２２と同じである。
【０３２２】
入力としては、図２３のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数ｓ[0]〜s[2k-1]、補正値d’、window開始位置を示す変数Lである。また、スカラー倍算のための楕円曲線上の点Aが入力される。
【０３２３】
まず、変数iの値が0に初期化される（ステップ２５０１）。この変数iは、テーブルのエントリを決定する。
次に、現在の変数iに対応する乱数ｓ[i]をスカラー値とする点Aに対するスカラー倍算ｓ[i]Aが計算され、その結果が変数Uに格納される（ステップ２５０２）。この計算には、通常のバイナリ法を適用することができる。
【０３２４】
次に、乱数ｓ[i]が上位ビット側に配置された状態でのスカラー倍算結果を得るために、ステップ２５０２で算出された変数Uの値に対して2倍算=2Uを実行して新たな変数Uの値とする演算処理がk回実行される（ステップ２５０３）。あるいは、U=2kUなる2k倍算処理を公知の高速化技術によって計算してもよい。これにより、下位kビットのwindow列に乱数ｓ[i]が結合された状態での、乱数ｓ[i]に対するスカラー倍算の演算成分が得られる。
【０３２５】
次に、変数jの値が0に初期化される（ステップ２５０４）。
続いて、変数jの値が増加させられながら（ステップ２５０７）、変数jの値が変数iの値よりも小さい限り（ステップ２５０５）、U=U+Aの点の加算処理が繰り返し計算される（ステップ２５０６）。
【０３２６】
そして、変数jの値が変数iの値に到達した時点で、変数Uの加算結果がテーブルエントリT[i]に格納される（ステップ２５０８）。
次に、変数iの値が+1される（ステップ２５０９）。
【０３２７】
そして、変数iの値が2k-1以下であるか否かが判定される（ステップ２５１０）。
変数iの値が2k-1以下であれば、ステップ２５０２に戻って、次のテーブルエントリの計算が実行される。
【０３２８】
以上のようにして、テーブルエントリ毎に異なる乱数s[i]を使ったテーブルデータT[i]を作成することが可能となり、これにより、テーブルデータの攪乱性がさらに向上し、DPAに対する耐性を強くすることが可能となる。
【０３２９】
以後、ステップ２３０８〜２３１６の点のスカラー倍算フェーズでは、このテーブルデータT[i]の内容を使って、暗号演算処理が実行される。
以上の第２の実施形態における点のスカラー倍算アルゴリズムの処理の具体的な数値計算例について説明する。
【０３３０】
ここで入力されるwindow列w[0]〜w[4]、乱数ｓ[0]〜s[2]、補正値d’、window開始位置を示す変数Lは、前述した図２４の数値計算例で得られたものである。  始めに、テーブル生成フェーズの数値計算例である。
【０３３１】
まず、ステップ２５０１で、変数i=0とされる。
次に、変数iの第1周目のステップ２５０２で、乱数ｓ[0]=(0111)2（図２４参照）を使って、U=(0111)2 ×Aが計算される。
【０３３２】
次に、変数iの第1周目のステップ２５０３で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(0111)2×A=4×7×A=28Aとなる。
次に、変数iの第1周目のステップ２５０４で、変数j=0とされる。
【０３３３】
次に、変数iの第1周目における変数jの第1周目のステップ２５０５で、j=0<i=0の判定がｎｏとなる。
この結果、変数iの第1周目のステップ２５０８で、インデックス値0に対応するテーブルエントリT[0]に、U=28Aが格納される。
【０３３４】
次に、第1周目のステップ２５０９で、変数i=i+1=1とされる。
次に、第1周目のステップ２５１０で、変数i=1≦21=2の判定がｙｅｓとなり、第2周目のステップ２５０２に戻る。
【０３３５】
次に、変数iの第2周目のステップ２５０２で、乱数ｓ[1]=(1001)2（図２４参照）を使って、U=(1001)2 ×Aが計算される。
次に、変数iの第2周目のステップ２５０３で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1001)2×A=4×9×A=36Aとなる。
【０３３６】
次に、変数iの第2周目のステップ２５０４で、変数j=0とされる。
次に、変数iの第2周目における変数jの第1周目のステップ２５０５で、j=0<i=1の判定がｙｅｓとなる。
この結果、変数iの第2周目における変数jの第1周目のステップ２５０６で、U=U+A=36A+A=37Aが計算される。
【０３３７】
次に、変数iの第2周目における変数jの第1周目のステップ２５０７で、変数j=j+1=1とされ、変数jの第2周目のステップＳ２５０５に戻る。
【０３３８】
次に、変数iの第2周目における変数jの第2周目のステップ２５０５で、j=1<i=1の判定がｎｏとなる。
この結果、変数iの第2周目のステップ２５０８で、インデックス値1に対応するテーブルエントリT[1]に、U=37Aが格納される。
【０３３９】
次に、第2周目のステップ２５０９で、変数i=i+1=2とされる。
次に、第2周目のステップ２５１０で、変数i=2≦21=2の判定がｙｅｓとなり、第3周目のステップ２５０２に戻る。
【０３４０】
次に、変数iの第3周目のステップ２５０２で、乱数ｓ[2]=(1100)2（図２４参照）を使って、U=(1100)2 ×Aが計算される。
次に、変数iの第3周目のステップ２５０３で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1100)2×A=4×12×A=48Aとなる。
【０３４１】
次に、変数iの第3周目のステップ２５０４で、変数j=0とされる。
次に、変数iの第3周目における変数jの第1周目のステップ２５０５で、j=0<i=2の判定がｙｅｓとなる。
この結果、変数iの第3周目における変数jの第1周目のステップ２５０６で、U=U+A=48A+A=49Aが計算される。
【０３４２】
次に、変数iの第3周目における変数jの第1周目のステップ２５０７で、変数j=j+1=1とされ、変数jの第2周目のステップＳ２５０５に戻る。
【０３４３】
次に、変数iの第3周目における変数jの第2周目のステップ２５０５で、j=1<i=2の判定がｙｅｓとなる。
この結果、変数iの第3周目における変数jの第2周目のステップ２５０６で、U=U+A=49A+A=50Aが計算される。
【０３４４】
次に、変数iの第3周目における変数jの第2周目のステップ２５０７で、変数j=j+1=2とされ、変数jの第3周目のステップＳ２５０５に戻る。
次に、変数iの第3周目における変数jの第3周目のステップ２５０５で、j=2<i=2の判定がｎｏとなる。
この結果、変数iの第3周目のステップ２５０８で、インデックス値2に対応するテーブルエントリT[2]に、U=50Aが格納される。
【０３４５】
次に、第3周目のステップ２５０９で、変数i=i+1=3とされる。
次に、第3周目のステップ２５１０で、変数i=3≦21=2の判定がｎｏとなり、乱数生成フェーズの処理を終了する。
以上により、T[0],T[1],T[2]の2k-1+1=3個のテーブルデータが生成される。
【０３４６】
次に、点のスカラー倍算フェーズの数値計算例である。
まず、ステップ２３０８で、補正値d’=(11001)2 であるから（図２４参照）、V=d’A=(11001)2 ×A=25Aが計算される。
【０３４７】
次に、ステップ２３０９で、変数j=L=0とされる。
次に、第1周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×25A=100Aとなる。
【０３４８】
次に、第1周目のステップ２３１１で、上位側1番目のwindow列w[0]=(11)2（図２４参照）について、そのMSBが1であると判定される。
この結果、第1周目のステップ２３１３で、w[0]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
【０３４９】
次に、V=V-T[Index]=V-T[1]=100A-37A=63Aが計算される。
次に、第1周目のステップ２３１５で、変数j=j+1=1となる。
【０３５０】
次に、第1周目のステップ２３１６で、変数j=1≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第2周目のステップ２３１０に戻る。
【０３５１】
次に、第2周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×63A=252Aとなる。
【０３５２】
次に、第2周目のステップ２３１１で、上位側2番目のwindow列w[1]=(10)2（図２４参照）について、そのMSBが1であると判定される。
この結果、第2周目のステップ２３１３で、w[1]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
【０３５３】
次に、V=V-T[Index]=V-T[2]=252A-50A=202Aが計算される。
次に、第2周目のステップ２３１５で、変数j=j+1=2となる。
【０３５４】
次に、第2周目のステップ２３１６で、変数j=2≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第3周目のステップ２３１０に戻る。
【０３５５】
次に、第3周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×202A=808Aとなる。
【０３５６】
次に、第3周目のステップ２３１１で、上位側3番目のwindow列w[2]=(00)2（図２４参照）について、そのMSBが1ではないと判定される。
この結果、第3周目のステップ２３１２で、V=V+T[w[2]]=V+T[0]=808A+28A=836Aと計算される。
【０３５７】
次に、第3周目のステップ２３１５で、変数j=j+1=3となる。
次に、第3周目のステップ２３１６で、変数j=3≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第4周目のステップ２３１０に戻る。
【０３５８】
次に、第4周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×836A=3344Aとなる。
【０３５９】
次に、第4周目のステップ２３１１で、上位側4番目のwindow列w[3]=(01)2（図２４参照）について、そのMSBが1ではないと判定される。
この結果、第4周目のステップ２３１２で、V=V+T[w[3]]=V+T[1]=3344A+37A=3381Aと計算される。
【０３６０】
次に、第4周目のステップ２３１５で、変数j=j+1=4となる。
次に、第4周目のステップ２３１６で、変数j=4≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第5周目のステップ２３１０に戻る。
【０３６１】
次に、第5周目のステップ２３１０で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×3381A=13524Aとなる。
【０３６２】
次に、第5周目のステップ２３１１で、上位側5番目のwindow列w[4]=(11)2（図２４参照）について、そのMSBが1であると判定される。
この結果、第5周目のステップ２３１３で、w[4]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
【０３６３】
次に、V=V-T[Index]=V-T[1]=13524A-37A=13487Aが計算される。
次に、第5周目のステップ２３１５で、変数j=j+1=5となる。
【０３６４】
次に、第5周目のステップ２３１６で、変数j=5≦m−1=5−1=4の判定がｎｏとなる。
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でスカラー倍算を行った結果（(11010010101111)2×A = 13487A）と一致する。そして、本実施形態は、第１の実施形態と同様の効果に加えて、テーブルデータがエントリ毎の乱数s[i]でランダム化されたことによりDPAに対してさらに安全である。
【０３６５】
次に、第３の実施形態について、以下に説明する。第３の実施形態では、第２の実施形態と同様にwindow列の値毎に異なる乱数ｓ(i)を使用することで攪乱性を高める技術を、楕円曲線暗号以外のべき乗剰余演算（RSA）暗号処理に適用したものである。
【０３６６】
第３の実施形態は、図１８のwindows値決定ユニット１８００と同様の構成、および図１９の点のスカラー倍算計算ユニット１９００の代わりにべき乗剰余計算ユニットが実装される構成において実施することができる。
【０３６７】
図２６は、第３の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
まず、ステップ３４０１から３４０４は、乱数生成フェーズの処理である。この処理では、変数jの値が0に初期化された後（ステップ３４０１）、変数jの値が2k-1で増加させられながら（ステップ３４０３、３４０４）、各変数j毎に、bビットの乱数s(j)が生成される（ステップ３４０２）。
【０３６８】
上記乱数生成フェーズの処理により、window値として変化し得る0から2k-1までの値毎に、bビットの乱数s(j)が生成される。  次に、ステップ３４０５から３４１５のwindow値決定フェーズの処理について説明する。
【０３６９】
まず、変数iの値がm-1に、変数Lの値が0に初期化される（ステップ３４０５）。
次に、現在の秘密鍵dのビット列の最下位からkビットが取り出されてwindow列w(i)とされる（ステップ３４０６）。
【０３７０】
次に、window列w(i)の上位ビット側に、そのwindow列w(i)の値に対応する乱数ｓ(w(i))を結合して得られる2進数のビット列x=(s(w(i))||w(i))を得る（ステップ３４０８）。
続いて、現在の秘密鍵dからビット列xを減算し、その減算結果が０未満になっているか否かが判定される（ステップ３４２０）。
【０３７１】
上記減算結果が０未満になっていなければ、上記減算結果が新たな秘密鍵dのビット列とされる（ステップ３４２０→３４０９）。
次に、上記ステップ３４０９により新たな秘密鍵dが算出できたら、その秘密鍵dのビット列がｋビット右シフトされ、最下位kビットが捨てられる（ステップ３４１０）。
【０３７２】
次に、変数iの値が-1される（ステップ３４１４）。
そして、変数iの値が0以上であるか否かが判定される（ステップ３４１５）。
変数iの値が0以上であれば、ステップ３４０６に戻って、再度ステップ３４０６から３４１５までの一連の処理が実行される（ステップ３４１５→３４０６）。
【０３７３】
上述の動作が繰り返される結果、変数iの値が0未満になったときには、ステップ３４１６に移行する（ステップ３４１５→３４１６）。
また、前述のステップ３４２０でd-xの値が0未満になったときにも、変数Lの値に現在のi+1の値がセットされた後に（ステップ３４２０→３４２１）、ステップ３４１６に移行する。この処理については、後述する。
【０３７４】
最後に、現在の秘密鍵dの値が補正値d’とされる（ステップ３４１６）。
そして、最終的に得られたwindow列w[0]〜w[m-1]、乱数ｓ[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数Lの値が出力されて、window値決定アルゴリズムの処理が終了する。
【０３７５】
以上の第３の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図２７の説明図を用いながら説明する。
【０３７６】
ここで例えば、k=2,b=4,d=(100011000101101)2 ，（dの長さu=15ビット）である場合のべき乗剰余演算暗号（RSA暗号等）演算処理を考える。このとき、数４式の計算例により、
h=u−b=11
m=5
b=u−k×m=15-2×5=5(変化あり)
となる。
この条件のもとで、まずステップ３４０１で、変数j=0に初期設定される。
【０３７７】
次に、第1周目のステップ３４０２で、5ビットの乱数s(0)として、例えば(01011)2が生成される。
次に、第1周目のステップ３４０３で変数j=j+1=1とされる。
そして、第１周目のステップ３４０４で、変数j=1≦22-1=3の判定がｙｅｓとなり、第2周目のステップ３４０２に戻る。
【０３７８】
次に、第2周目のステップ３４０２で、5ビットの乱数s(1)として、例えば(11000)2が生成される。
次に、第2周目のステップ３４０３で変数j=j+1=2とされる。
そして、第2周目のステップ３４０４で、変数j=2≦22-1=3の判定がｙｅｓとなり、第3周目のステップ２４０２に戻る。
【０３７９】
次に、第3周目のステップ３４０２で、5ビットの乱数s(2)として、例えば(11011)2が生成される。
次に、第3周目のステップ３４０３で変数j=j+1=3とされる。
そして、第3周目のステップ３４０４で、変数j=3≦22-1=3の判定がｙｅｓとなり、第4周目のステップ３４０２に戻る。
【０３８０】
次に、第4周目のステップ３４０２で、5ビットの乱数s(3)として、例えば(00101)2が生成される。
次に、第4周目のステップ３４０３で変数j=j+1=4とされる。
そして、第4周目のステップ３４０４で、変数j=4≦22-1=3の判定がｎｏとなり、乱数生成フェーズの処理を終了する。
【０３８１】
次に、ステップ３４０５により、i=m-1=5-1=4、L=0と初期化される。
次に、第1周目のステップ３４０６により、図２７に示されるように、dの最下位から2ビットを取り出してw[4]=(01)2 とする。
次に、第1周目のステップ３４０８により、図２７に示されるように、w[4]= (01)2に対応する乱数s(w[4])=s((01)2)を使って、x=(s((01)2)||w[4])=(1100001)2が算出される。
【０３８２】
次に、第1周目のステップ３４２０により、d-x=(100011000101101)2-(1100001)2=(100010111001100)2は、0未満ではないと判定される。
続いて、第1周目のステップ３４２０により、上記d-x=(100010111001100)2が新たな秘密鍵dの値とされる。
【０３８３】
次に、第1周目のステップ３４１３により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1000101110011)2が算出される。
次に、第1周目のステップ３４１４により、変数iの値が-1される。すなわち、i=i-1=3となる。
【０３８４】
次に、第1周目のステップ３４１５により、変数i=3は0以上であると判定され、第2周目のステップ３４０６に戻る。
次に、第2周目のステップ３４０６により、図２７に示されるように、dの最下位から2ビットを取り出してw[3]=(11)2 とする。
【０３８５】
次に、第2周目のステップ３４０８により、図２７に示されるように、w[3]= (11)2に対応する乱数s(w[3])=s((11)2)を使って、x=(s((11)2)||w[3])=(0010111)2が算出される。
次に、第2周目のステップ３４２０により、d-x=(1000101110011)2-(0010111)2=(1000101011100)2は、0未満ではないと判定される。
続いて、第2周目のステップ３４２０により、上記d-x=(1000101011100)2が新たな秘密鍵dの値とされる。
【０３８６】
次に、第2周目のステップ３４１３により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(10001010111)2が算出される。
次に、第2周目のステップ３４１４により、変数iの値が-1される。すなわち、i=i-1=2となる。
次に、第2周目のステップ３４１５により、変数i=2は0以上であると判定され、第3周目のステップ３４０６に戻る。
【０３８７】
次に、第3周目のステップ３４０６により、図２７に示されるように、dの最下位から2ビットを取り出してw[2]=(11)2 とする。
次に、第3周目のステップ３４０８により、図２７に示されるように、w[2]= (11)2に対応する乱数s(w[2])=s((11)2)を使って、x=(s((11)2)||w[2])=(0010111)2が算出される。
【０３８８】
次に、第3周目のステップ３４２０により、d-x=(10001010111)2-(0010111)2=(10001000000)2は、0未満ではないと判定される。
続いて、第3周目のステップ３４２０により、上記d-x=(10001000000)2が新たな秘密鍵dの値とされる。
【０３８９】
次に、第3周目のステップ３４１３により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(100010000)2が算出される。
次に、第3周目のステップ３４１４により、変数iの値が-1される。すなわち、i=i-1=1となる。
【０３９０】
次に、第3周目のステップ３４１５により、変数i=1は0以上であると判定され、第4周目のステップ３４０６に戻る。
次に、第4周目のステップ３４０６により、図２７に示されるように、dの最下位から2ビットを取り出してw[1]=(00)2 とする。
【０３９１】
次に、第4周目のステップ３４０８により、図２７に示されるように、w[1]= (00)2に対応する乱数s(w[1])=s((00)2)を使って、x=(s((00)2)||w[1])=(0101100)2が算出される。
次に、第4周目のステップ３４２０により、d-x=(100010000)2-(0101100)2=(11100100)2は、0未満ではないと判定される。
続いて、第4周目のステップ３４２０により、上記d-x=(11100100)2が新たな秘密鍵dの値とされる。
【０３９２】
次に、第4周目のステップ３４１３により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111001)2が算出される。
次に、第4周目のステップ３４１４により、変数iの値が-1される。すなわち、i=i-1=0となる。
次に、第4周目のステップ３４１５により、変数i=0は0以上であると判定され、第5周目のステップ３４０６に戻る。
【０３９３】
次に、第5周目のステップ３４０６により、図２７に示されるように、dの最下位から2ビットを取り出してw[0]=(01)2 とする。
次に、第5周目のステップ３４０８により、図２７に示されるように、w[0]= (01)2に対応する乱数s(w[0])=s((01)2)を使って、x=(s((01)2)||w[0])=(1100001)2が算出される。
【０３９４】
次に、第5周目のステップ３４２０により、d-x=(111001)2-(1100001)2は、0未満であると判定される。
この結果、第5周目のステップ３４２１により、L=i+1=0+1=1とされる。これにより、window列w[0]は採用されない。
【０３９５】
その後、ステップ３４１６に移り、現在の秘密鍵dの値が、補正値d’=(111001)2とされる。
なお、ステップ３４２０でd-x＜０の判定がｙｅｓとならずに、ステップ３４１５で変数iの値が0未満になったと判定された場合、すなわち設定された数だけwindow列が決定ｓわれた場合にも、ステップ３４１６に移行して、補正値d‘が算出される。
【０３９６】
以上により、最終的に、window列w[1]〜w[4]と、乱数s[0]〜s[3]と、補正値d‘と、window開始位置を示す変数Lが出力されて、処理を終了する。
【０３９７】
図２８は、第３の実施形態におけるべき乗剰余演算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
【０３９８】
入力としては、図２３のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数ｓ[0]〜s[2k-1]、補正値d’、window開始位置を示す変数Lである。また、入力値Aと、べき乗剰余演算のためのモジュロ数ｎが入力される。
【０３９９】
まず、変数iの値が0に初期化される（ステップ３５０１）。この変数iは、テーブルのエントリを決定する。
次に、現在の変数iに対応する乱数ｓ[i]をべき乗値とする入力値Aに対するべき乗剰余演算「As[i] mod n」が計算され、その結果が変数Uに格納される（ステップ３５０２）。この計算には、通常のバイナリ法を適用することができる。
【０４００】
次に、乱数ｓ[i]が上位ビット側に配置された状態でのべき乗剰余演算結果を得るために、ステップ３５０２で算出された変数Uの値に対してU=U2をk回実行して新たな変数Uの値とする演算処理が実行される（ステップ３５０３）。これにより、下位kビットのwindow列に乱数ｓ[i]が結合された状態での、乱数ｓ[i]に対するべき乗剰余演算の演算成分が得られる。
【０４０１】
次に、変数jの値が0に初期化される（ステップ３５０４）。
続いて、変数jの値が増加させられながら（ステップ３５０７）、変数jの値が変数iの値よりも小さい限り（ステップ３５０５）、「U=U×A mod n」の演算処理が繰り返し計算される（ステップ３５０６）。
そして、変数jの値が変数iの値に到達した時点で、変数Uの加算結果がテーブルエントリT[i]に格納される（ステップ３５０８）。
【０４０２】
次に、変数iの値が+1される（ステップ３５０９）。
そして、変数iの値が2k-1以下であるか否かが判定される（ステップ３５１０）。
変数iの値が2k-1以下であれば、ステップ３５０２に戻って、次のテーブルエントリの計算が実行される。
【０４０３】
以上のようにして、テーブルエントリ毎に異なる乱数s[i]を使ったテーブルデータT[i]を作成することが可能となり、これにより、テーブルデータの攪乱性がさらに向上し、DPAに対する耐性を強くすることが可能となる。
【０４０４】
変数iの値が2k-1に達すると、テーブル生成フェーズを終了し、次に実際の暗号処理であるべき乗剰余演算フェーズの処理になる。これは、ステップ３５１１から３５１９までの部分である。
【０４０５】
まず、「V=Ad’ mod n」として、補正値d’に対するべき乗剰余演算成分が算出される（ステップ３５１１）。この計算には、通常のバイナリ法による演算を適用することができる。それは、補正値d’の値は、たとえ解読されたとしても秘密鍵dの解読は依然として困難にしておくことができるからである。変数Vは、暗号処理の出力値が最終的に得られる出力変数である。
【０４０６】
次に、変数jの値がwindow列の最初のサフィックスLに初期化される（ステップ３５１２）。
次に、ステップ３５１４から３５１９のループ処理により、秘密鍵dの上位ビット側から下位ビット側に向けて、テーブル生成フェーズで生成されたテーブルを参照しながらべき乗剰余演算を計算する繰り返し処理が実行される。
【０４０７】
まず、出力変数Vの値に対して2乗剰余演算を実行して新たなVの値とする処理「V=V2  mod n」がk回実行される（ステップ３５１４）。この処理により、補正値d’と最初の上位側window列w[L]との桁位置が合わせられる。
【０４０８】
次に、window列w(j)をインデックスとするテーブルデータT[w(j)]が取得され、これを用いて、「V-V×T[w(j)] mod n」の演算が実行される（ステップ３５１５）。
その後、変数jの値が+1される（ステップ３５１８）。
【０４０９】
そして、変数jの値がm-1以下であるか否かが判定される（ステップ３５１９）。
変数jの値がm-1以下であれば、さらに下位側のwindow列に対するべき乗剰余演算処理を実行するために、ステップ３５１４の処理に戻る。
【０４１０】
変数jの値がm-1を超えれば、秘密鍵d全体に対する入力値Aのべき乗剰余演算と等価な処理を終了し、出力変数Vの値を暗号演算処理の結果として出力し、図２８のべき乗剰余演算アルゴリズムの処理を終了する（ステップ３５１９の判定がno）。
【０４１１】
以上の第３の実施形態におけるべき乗剰余演算アルゴリズムの処理の具体的な数値計算例について説明する。
ここで入力されるwindow列w[1]〜w[4]、乱数ｓ[0]〜s[3]、補正値d’、 window開始位置を示す変数Lは、前述した図２７の数値計算例で得られたものである。
【０４１２】
始めに、テーブル生成フェーズの数値計算例である。
まず、ステップ３５０１で、変数i=0とされる。
次に、変数iの第1周目のステップ３５０２で、乱数ｓ[0]=(01011)2（図２７参照）を使って、U=A(01011)mod n が計算される。
【０４１３】
次に、変数iの第1周目のステップ３５０３で、U=U4 mod n=A(01011)× 4 mod n=A44 mod nの演算が実行される。
次に、変数iの第1周目のステップ３５０４で、変数j=0とされる。
【０４１４】
次に、変数iの第1周目における変数jの第1周目のステップ３５０５で、j=0<i=0の判定がｎｏとなる。
この結果、変数iの第1周目のステップ３５０８で、インデックス値0に対応するテーブルエントリT[0]に、U= A44mod nが格納される。
【０４１５】
次に、第1周目のステップ３５０９で、変数i=i+1=1とされる。
次に、第1周目のステップ３５１０で、変数i=1≦22-1=3の判定がｙｅｓとなり、第2周目のステップ３５０２に戻る。
【０４１６】
次に、変数iの第2周目のステップ３５０２で、乱数ｓ[1]=(11000)2（図２７参照）を使って、U=A(11000) mod n が計算される。
次に、変数iの第2周目のステップ３５０３で、U=U4 mod n=A(11000)×4 mod n=A96 mod nが実行される。
【０４１７】
次に、変数iの第2周目のステップ３５０４で、変数j=0とされる。
次に、変数iの第2周目における変数jの第1周目のステップ３５０５で、j=0<i=1の判定がｙｅｓとなる。
【０４１８】
この結果、変数iの第2周目における変数jの第1周目のステップ３５０６で、U=U×A mod n = A97 mod nが計算される。
次に、変数iの第2周目における変数jの第1周目のステップ３５０７で、変数j=j+1=1とされ、変数jの第2周目のステップＳ３５０５に戻る。
【０４１９】
次に、変数iの第2周目における変数jの第2周目のステップ３５０５で、j=1<i=1の判定がｎｏとなる。
この結果、変数iの第2周目のステップ３５０８で、インデックス値1に対応するテーブルエントリT[1]に、U=A97mod nが格納される。
【０４２０】
次に、第2周目のステップ３５０９で、変数i=i+1=2とされる。
次に、第2周目のステップ３５１０で、変数i=2≦22-1=3の判定がｙｅｓとなり、第3周目のステップ３５０２に戻る。
【０４２１】
次に、変数iの第3周目のステップ３５０２で、乱数ｓ[2]=(11011)2（図２７参照）を使って、U=A11011mod nが計算される。
次に、変数iの第3周目のステップ３５０３で、U=U4 mod n=A(11011)×4 mod n=A108 mod n Uの演算が実行される。
【０４２２】
次に、変数iの第3周目のステップ３５０４で、変数j=0とされる。
次に、変数iの第3周目における変数jの第1周目のステップ３５０５で、j=0<i=2の判定がｙｅｓとなる。
【０４２３】
この結果、変数iの第3周目における変数jの第1周目のステップ３５０６で、U=U×A mod n=A109 mod nが計算される。
次に、変数iの第3周目における変数jの第1周目のステップ３５０７で、変数j=j+1=1とされ、変数jの第2周目のステップＳ３５０５に戻る。
【０４２４】
次に、変数iの第3周目における変数jの第2周目のステップ３５０５で、j=1<i=2の判定がｙｅｓとなる。
この結果、変数iの第3周目における変数jの第2周目のステップ３５０６で、U=U×A mod n=A110 mod nが計算される。
【０４２５】
次に、変数iの第3周目における変数jの第2周目のステップ３５０７で、変数j=j+1=2とされ、変数jの第3周目のステップＳ３５０５に戻る。
次に、変数iの第3周目における変数jの第3周目のステップ３５０５で、j=2<i=2の判定がｎｏとなる。
【０４２６】
この結果、変数iの第3周目のステップ３５０８で、インデックス値2に対応するテーブルエントリT[2]に、U=A110mod nが格納される。
次に、第3周目のステップ３５０９で、変数i=i+1=3とされる。
【０４２７】
次に、第3周目のステップ３５１０で、変数i=3≦22-1=3の判定がｙｅｓとなり、第4周目のステップ３５０２に戻る。
次に、変数iの第4周目のステップ３５０２で、乱数ｓ[3]=(00101)2（図２７参照）を使って、U=A00101mod nが計算される。
【０４２８】
次に、変数iの第4周目のステップ３５０３で、U=U4 mod n=A(00101)×4 mod n=A20 mod nの演算が実行される。
次に、変数iの第4周目のステップ３５０４で、変数j=0とされる。
【０４２９】
次に、変数iの第4周目における変数jの第1周目のステップ３５０５で、j=0<i=3の判定がｙｅｓとなる。
この結果、変数iの第4周目における変数jの第1周目のステップ３５０６で、U=U×A mod n=A21 mod nが計算される。
【０４３０】
次に、変数iの第4周目における変数jの第1周目のステップ３５０７で、変数j=j+1=1とされ、変数jの第2周目のステップＳ３５０５に戻る。
次に、変数iの第4周目における変数jの第2周目のステップ３５０５で、j=1<i=3の判定がｙｅｓとなる。
この結果、変数iの第4周目における変数jの第2周目のステップ３５０６で、U=U×A mod n=A22 mod nが計算される。
【０４３１】
次に、変数iの第4周目における変数jの第2周目のステップ３５０７で、変数j=j+1=2とされ、変数jの第3周目のステップＳ３５０５に戻る。
【０４３２】
次に、変数iの第4周目における変数jの第3周目のステップ３５０５で、j=2<i=3の判定がｙｅｓとなる。
この結果、変数iの第4周目における変数jの第3周目のステップ３５０６で、U=U×A mod n=A23 mod nが計算される。
【０４３３】
次に、変数iの第4周目における変数jの第3周目のステップ３５０７で、変数j=j+1=3とされ、変数jの第4周目のステップＳ３５０５に戻る。
【０４３４】
次に、変数iの第4周目における変数jの第4周目のステップ３５０５で、j=3<i=3の判定がｎｏとなる。
この結果、変数iの第4周目のステップ３５０８で、インデックス値3に対応するテーブルエントリT[3]に、U=A23mod nが格納される。
【０４３５】
次に、第4周目のステップ３５０９で、変数i=i+1=4とされる。
次に、第4周目のステップ３５１０で、変数i=4≦22-1=3の判定がｎｏとなり、乱数生成フェーズの処理を終了する。
以上により、T[0],T[1],T[2],T[3]の2k=4個のテーブルデータが生成される。
【０４３６】
次に、べき乗剰余演算フェーズの数値計算例である。
まず、ステップ３５１１で、補正値d’=(111001)2 であるから（図２７参照）、V=Ad’mod n=A(111001)mod n=A57 mod nが計算される。
【０４３７】
次に、ステップ３５１２で、変数j=L=1とされる（図２７より、window列の開始位置はw[1]である）。
次に、第1周目のステップ３５１４で、V=V2 mod nをk回=(A57)2 )2  mod n = A228mod nが計算される。
【０４３８】
次に、第1周目のステップ３５１５で、V=V×T[w[1]]=A228 ×A44mod n=A272 mod nが計算される。
次に、第1周目のステップ３５１８で、変数j=j+1=2となる。
【０４３９】
次に、第1周目のステップ３５１９で、変数j=2≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第2周目のステップ３５１４に戻る。
次に、第2周目のステップ３５１４で、V=V2 mod nをk回=(A272)2 )2  mod n = A1088mod nが計算される。
【０４４０】
次に、第2周目のステップ３５１５で、V=V×T[w[2]]=A1088 ×A23mod n=A1111 mod nが計算される。
次に、第2周目のステップ３５１８で、変数j=j+1=3となる。
【０４４１】
次に、第2周目のステップ３５１９で、変数j=3≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第3周目のステップ３５１４に戻る。
次に、第3周目のステップ３５１４で、V=V2 mod nをk回=(A1111)2 )2  mod n = A4444mod nが計算される。
【０４４２】
次に、第3周目のステップ３５１５で、V=V×T[w[3]]=A4444 ×A23mod n=A4467mod nが計算される。
次に、第3周目のステップ３５１８で、変数j=j+1=4となる。
【０４４３】
次に、第3周目のステップ３５１９で、変数j=4≦m−1=5−1=4の判定がｙｅｓとなる。
この結果、第4周目のステップ３５１４に戻る。
次に、第4周目のステップ３５１４で、V=V2 mod nをk回=(A4467)2 )2  mod n = A17868mod nが計算される。
【０４４４】
次に、第4周目のステップ３５１５で、V=V×T[w[4]]=A17868 ×A97mod n=A17965mod nが計算される。
次に、第4周目のステップ３５１８で、変数j=j+1=5となる。
【０４４５】
次に、第4周目のステップ３５１９で、変数j=5≦m−1=5−1=4の判定がｎｏとなる。
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でべき乗剰余演算を行った結果（A11010010101111  mod n=A17965 mod n）と一致し、かつ、DPA,SPAに対して安全な処理を実現している。
【０４４６】
図１５の図表に追記する形で本実施形態の効果をまとめれば、図２９のようになる。この図より、第１および第２の実施形態により、DPA（およびSPA）に対して安全で、テーブルサイズが通常のwindow法の約半分(2k-1+1)で、キャリー制御が単純な暗号演算処理を提供することが可能となる。
【０４４７】
また、図２９には掲載していないが、第２および第３の実施形態により、テーブルデータの攪乱性が高く、DPAに対してさらに安全な暗号演算処理を提供することが可能となる。
【０４４８】
さらに、第３の実施形態は、べき乗剰余演算において、DPAに対してさらに安全な暗号演算処理を提供することが可能となる。
【符号の説明】
【０４４９】
１６００、１６１０  暗号処理装置
１６０１  ＣＰＵ（Central Processing Unit）
１６０２  ＲＯＭ（Read Only Memory）
１６０３  ＲＡＭ（Random Access Memory）
１６０４  通信回路
１６０５  通信インタフェース（Ｉ／Ｆ）
１６０６  バス
１６０７  電源端子
１６０８  グランド端子
１６１１  ECCハードウェア回路
１８００  windows値決定ユニット
１８０１  乱数生成部
１８０２  windows値決定部
１８０３  補正値計算部
１８０４、１９０３  制御部
１８０５  window値格納部
１８０６  補正値格納部
１８０７  乱数格納部
１９００  点のスカラー倍算ユニット
１９０１  ランダム化テーブル生成部
１９０２  符号付ランダム化window法計算部
【図１】
2012090288.tif 000010
【図２】
2012090288.tif 000011
【図３】
2012090288.tif 000012
【図４】
2012090288.tif 000013
【図５】
2012090288.tif 000014
【図６】
2012090288.tif 000015
【図７】
2012090288.tif 000016
【図８】
2012090288.tif 000017
【図９】
2012090288.tif 000018
【図１０】
2012090288.tif 000019
【図１１】
2012090288.tif 000020
【図１２】
2012090288.tif 000021
【図１３】
2012090288.tif 000022
【図１４】
2012090288.tif 000023
【図１５】
2012090288.tif 000024
【図１６】
2012090288.tif 000025
【図１７】
2012090288.tif 000026
【図１８】
2012090288.tif 000027
【図１９】
2012090288.tif 000028
【図２０】
2012090288.tif 000029
【図２１】
2012090288.tif 000030
【図２２】
2012090288.tif 000031
【図２３】
2012090288.tif 000032
【図２４】
2012090288.tif 000033
【図２５】
2012090288.tif 000034
【図２６】
2012090288.tif 000035
【図２７】
2012090288.tif 000036
【図２８】
2012090288.tif 000037
【図２９】
2012090288.tif 000038
【国際調査報告】
2012090288.tif 000039
2012090288.tif 000040
2012090288.tif 000041
2012090288.tif 000042