(57)【要約】  暗号処理装置は、楕円曲線暗号における個人鍵ｄを格納する個人鍵格納部と、ｂビットの乱数値ｓを生成する乱数生成部と、処理部を含む。ビット列Ｄは、個人鍵ｄ、または最上位ビットの値が０になるように個人鍵ｄを加工して得られるビット列であり、ビット列Ｄの長さｕとウィンドウサイズｋと正整数ｍの間にｕ＝ｍｋ＋ｂなる関係が成立する。処理部は、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］と各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］と補正値ｇを定める。なお、処理部は、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、以下の式が成立するという制約条件下で、上記の値を定める。【数１８】2011121661.tif 000020
2011121661.tif 000002
【特許請求の範囲】
【請求項１】
楕円曲線暗号における個人鍵ｄを格納する個人鍵格納部と、
符号つきまたは符号なしのｂビットの乱数値ｓを生成する乱数生成部と、
前記個人鍵格納部から前記個人鍵ｄを読み出し、前記個人鍵ｄ、または最上位ビットの値が０になるように前記個人鍵ｄを加工して得られるビット列であるビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］と０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］と補正値ｇを、前記ビット列Ｄと前記乱数値ｓとを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、
【数１６】
2011121661.tif 000018
が成立するという制約条件下で定める処理部
を備えることを特徴とする暗号処理装置。
【請求項２】
前記乱数値ｓ［ｉ］が＋ｓであるという仮定の下で前記ウィンドウ値ｗ［ｉ］として見積もられる値である第１の値が０以上２ｋ−１未満である、という第１の判定条件、または、前記ウィンドウ値ｗ［ｉ］の１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値と相殺するウィンドウ補正値により前記第１の値を補正した第２の値が０以上２ｋ−１以下である、という第２の判定条件が満たされるか否かを判断する判断部と、
前記第１の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第１の値に決定し、前記第２の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第２の値に決定し、前記第１の判定条件も前記第２の判定条件も満たされない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する決定部
を前記処理部が備えることを特徴とする請求項１に記載の暗号処理装置。
【請求項３】
前記第１の値は、
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットから前記乱数値ｓを引いた値の上位ｋビットであり、
ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて前記決定部が算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である符号つき（ｋ＋ｂ）ビット値から、前記乱数値ｓを引いた値の、上位ｋビットである
こと特徴とする請求項２に記載の暗号処理装置。
【請求項４】
前記決定部は、前記乱数値ｓ［ｉ］を−ｓと決定した場合、
前記第１の値が正であれば、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出するときに、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負の値によるウィンドウ補正を行い、
前記第１の値が負であれば、前記ウィンドウ補正を行わずに、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
こと特徴とする請求項２または３に記載の暗号処理装置。
【請求項５】
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットの値であり、ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である、符号つき（ｋ＋ｂ）ビット値ｄＨが、０以上２ｋ＋ｂ−１−１以下の第１の範囲または−２ｋ＋ｂ−１以下の第２の範囲に含まれるか否かを判断する判断部と、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じた値の上位ｋビットに決定し、前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第２の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じて２ｋ＋ｂなるウィンドウ補正値を加えた値の上位ｋビットに決定し、前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲にも前記第２の範囲にも含まれない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する決定部
を前記処理部が備えることを特徴とする請求項１に記載の暗号処理装置。
【請求項６】
前記決定部は、前記乱数値ｓ［ｉ］を−ｓと決定した場合、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが正であれば、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出するときに、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負のウィンドウ補正値によるウィンドウ補正を行い、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが負であれば、前記ウィンドウ補正を行わずに、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項５に記載の暗号処理装置。
【請求項７】
前記乱数生成部は、前記乱数値ｓとして、非ゼロの正の値のみを生成することを特徴とする請求項５または６に記載の暗号処理装置。
【請求項８】
前記処理部が−ｓと決定する前記乱数値ｓ［ｉ］に対応する前記ウィンドウ値ｗ［ｉ］の値域の最大値の符号を反転させた負数以上であり、かつ前記処理部が＋ｓと決定する前記乱数値ｓ［ｉ］に対応する前記ウィンドウ値ｗ［ｉ］の値域の最大値以下である各インデックスｈに対して、楕円曲線上の点（２ｂｈ＋ｓ）Ａの座標を計算するスカラ倍算部と、
前記負数以上かつ前記最大値以下の各インデックスｈについて、前記スカラ倍算部が計算した前記点（２ｂｈ＋ｓ）Ａの前記座標を、前記インデックスｈと対応づけて記憶するスカラ倍点情報格納部
をさらに備えることを特徴とする請求項１から７のいずれか１項に記載の暗号処理装置。
【請求項９】
楕円曲線暗号における個人鍵ｄを読み出し、
前記個人鍵ｄを処理対象のビット列Ｄとして認識するか、または、最上位ビットの値が０になるように前記個人鍵ｄを加工し、加工して得られたビット列を前記ビット列Ｄとして認識し、
符号つきまたは符号なしのｂビットの乱数値ｓを生成し、
前記ビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号付きｋビット値のウィンドウ値ｗ［ｉ］と、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号付きｂビット値の乱数値ｓ［ｉ］と、補正値ｇを、前記ビット列Ｄと前記乱数値ｓとを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、
【数１７】
2011121661.tif 000019
が成立するという制約条件下で定める
ことを特徴とする暗号処理方法。
【請求項１０】
前記乱数値ｓ［ｉ］が＋ｓであるという仮定の下で前記ウィンドウ値ｗ［ｉ］の値を見積もり、
見積もった値である第１の値が０以上２ｋ−１未満である、という第１の判定条件、または、前記ウィンドウ値ｗ［ｉ］の１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値と相殺するウィンドウ補正値により前記第１の値を補正した第２の値が０以上２ｋ−１以下である、という第２の判定条件が満たされるか否かを判断し、
前記第１の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第１の値に決定し、
前記第２の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第２の値に決定し、
前記第１の判定条件も前記第２の判定条件も満たされない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを含むことを特徴とする請求項９に記載の暗号処理方法。
【請求項１１】
前記第１の値は、
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットから前記乱数値ｓを引いた値の上位ｋビットであり、
ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である符号つき（ｋ＋ｂ）ビット値から、前記乱数値ｓを引いた値の、上位ｋビットである
ことを特徴とする請求項１０に記載の暗号処理方法。
【請求項１２】
前記乱数値ｓ［ｉ］を−ｓと決定した場合、
前記第１の値が正であれば、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出するときに、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負の値によるウィンドウ補正を行い、
前記第１の値が負であれば、前記ウィンドウ補正を行わずに、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項１０または１１に記載の暗号処理方法。
【請求項１３】
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットの値であり、ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である、符号つき（ｋ＋ｂ）ビット値ｄＨを計算し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが０以上２ｋ＋ｂ−１−１以下の第１の範囲または−２ｋ＋ｂ−１以下の第２の範囲に含まれるか否かを判断し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じた値の上位ｋビットに決定し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第２の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じて２ｋ＋ｂなるウィンドウ補正値を加えた値の上位ｋビットに決定し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲にも前記第２の範囲にも含まれない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項９に記載の暗号処理方法。
【請求項１４】
前記乱数値ｓ［ｉ］を−ｓと決定した場合、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが正であれば、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出するときに、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負のウィンドウ補正値による補正を行い、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが負であれば、前記ウィンドウ補正を行わずに、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項１３に記載の暗号処理方法。
【請求項１５】
前記乱数値ｓは非ゼロの正の値であることを特徴とする請求項１３または１４に記載の暗号処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は楕円曲線暗号に関する。
【背景技術】
【０００２】
近年、情報セキュリティ技術の重要性がますます高まってきている。また、情報セキュリティの基盤技術の１つとして、公開鍵暗号（public-key cryptography）が盛んに研究されている。【０００３】
公開鍵暗号にはいくつか種類があり、指数剰余演算を利用するRivest, Shamir, Adleman（ＲＳＡ）アルゴリズムや、楕円曲線上の点のスカラ倍算を利用する楕円曲線暗号（Elliptical Curve Cryptography；ＥＣＣ）などが知られている。【０００４】
公開鍵暗号の利用においては、セキュリティの維持のために、個人鍵（private key）を秘密に保つことが重要である。ところが、近年では個人鍵を解読する（break）ための、いくつかの攻撃手法が知られている。よって、公開鍵暗号を用いた処理を行う機器が耐タンパ性である（tamper-proof）ためには、少なくとも既知の攻撃手法に対する対策が当該機器において実装されている必要がある。【０００５】
例えば、サイドチャネル攻撃の１種として、電力解析（Power Analysis；ＰＡ）攻撃と呼ばれる攻撃手法が知られている。また、ＰＡには、単純電力解析（Simple Power Analysis；ＳＰＡ）と電力差分解析（Differential Power Analysis；ＤＰＡ）の２種類がある。【０００６】
よって、公開鍵暗号を用いた処理を行う機器には、ＳＰＡ攻撃に対する安全性とＤＰＡ攻撃に対する安全性が求められる。例えば、ＳＰＡ攻撃への対策の１つには「ウィンドウ法」と呼ばれる手法があり、ＤＰＡ攻撃への対策の１つにはデータをランダム化する手法がある。さらに、効率的な耐タンパ性の指数剰余演算および点のスカラ倍算を実現する暗号装置や、指数剰余演算を実行する暗号化方法において、ＰＡ攻撃を用いた個人鍵の推定を困難にし、高い耐タンパ性をもつ暗号プロセッサも提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００３−２３３３０７号公報
【特許文献２】国際公開ＷＯ２００９／１２２４６１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
楕円曲線上の点のスカラ倍算を行う装置において、ＳＰＡ攻撃への対策として、ウィンドウサイズがｋビットのウィンドウ法（あるいはその変種）が採用される場合、メモリには、ｋビットの各インデックスに対応して楕円曲線上の点を示すデータが格納される。したがって、メモリ使用量はウィンドウサイズｋの指数オーダであり、ウィンドウサイズｋが大きいほど、メモリ使用量も多い。【０００９】
他方で、近年では、サーバ・コンピュータやパーソナル・コンピュータなどの汎用的なコンピュータだけではなく、例えば組み込み機器などの他の様々な装置においても、暗号技術の利用が広まりつつある。スカラ倍算を行う装置には、装置の種類によらず、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する対策を実装することが求められる。【００１０】
ところが、ある種の装置のメモリ容量は、汎用的なコンピュータのメモリ容量と比べるとかなり少ない。そして、メモリ容量の少ない装置においては、なるべく少ないメモリ使用量で処理を実行することが好ましい。【００１１】
そこで本発明は、メモリ使用量を少なく抑えつつ、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性を保って、スカラ倍算を行う暗号処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
一態様による暗号処理装置は、個人鍵格納部と乱数生成部と処理部を備える。
前記個人鍵格納部は、楕円曲線暗号における個人鍵ｄを格納する。前記乱数生成部は、符号つきまたは符号なしのｂビットの乱数値ｓを生成する。【００１３】
また、前記処理部は、前記個人鍵格納部から前記個人鍵ｄを読み出し、前記個人鍵ｄ、または最上位ビットの値が０になるように前記個人鍵ｄを加工して得られるビット列であるビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］と０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］と補正値ｇを、前記ビット列Ｄと前記乱数値ｓとを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、
【数１】
2011121661.tif 000003
が成立するという制約条件下で定める。
【発明の効果】
【００１４】
ウィンドウ値ｗ［ｉ］を用いたウィンドウ演算は、ＳＰＡ攻撃に対して安全なスカラ倍算を実現する。また、乱数値ｓ［ｉ］の導入により、ＤＰＡ攻撃に対する安全性も実現される。【００１５】
そして、処理部が、各乱数値ｓ［ｉ］を、一律に乱数値ｓに定めるのではなく、上記制約条件下で適宜＋ｓまたは−ｓに定めることで、ウィンドウ値ｗ［ｉ］の絶対値の範囲の縮小が実現される。したがって、上記暗号処理装置によれば、ウィンドウ演算用に各インデックスに対応して楕円曲線上の点を示すデータを格納するためのメモリの量は、２ｋのオーダよりも少なくて済む。【００１６】
よって、上記暗号処理装置は、少ないメモリ使用量で、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性を保ってスカラ倍算を行うことを可能にする。
【図面の簡単な説明】
【００１７】
【図１】ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせる試みについて例示する図である。
【図２】図１の試みが失敗する理由を説明する図である。
【図３】第１〜第３実施形態に共通するアプローチを説明する図である。
【図４】第１〜第３実施形態でのアプローチを別の観点から示す図である。
【図５】ウィンドウ列の値が乱数列の値に依存して決まることを説明する図である。
【図６】第１〜第３実施形態の暗号処理装置の第１のハードウェア構成例を示す図である。
【図７】第１〜第３実施形態の暗号処理装置の第２のハードウェア構成例を示す図である。
【図８】第１〜第３実施形態の暗号処理装置の機能構成を説明する図である。
【図９】第１〜第３実施形態の暗号処理装置が、個人鍵と点からスカラ倍点を求める処理のフローチャートである。
【図１０】第１〜第３実施形態の暗号処理装置が、決定したウィンドウ列および乱数列、ならびに生成したスカラ倍点情報を利用して行う演算のフローチャートである。
【図１１】第１実施形態において暗号処理装置がウィンドウ列と乱数列と補正値を決定する処理のフローチャートである。
【図１２Ａ】第１実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その１）である。
【図１２Ｂ】第１実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その２）である。
【図１３】ウィンドウ列と乱数列と補正値を示すとともに、スカラ倍点情報格納部がランダム化テーブルデータを保持するテーブルを示す図である。
【図１４】ウィンドウサイズが３の場合のテーブルデータのエントリ数に関して、第１実施形態と第３の比較例と第４の比較例を比べる図である。
【図１５】第１実施形態においてスカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
【図１６】第１実施形態においてスカラ倍点情報格納部でインデックスとして使われる値についてまとめた図である。
【図１７】第２実施形態においてスカラ倍点情報格納部でインデックスとして使われる値についてまとめた図である。
【図１８】第２実施形態においてスカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
【図１９】第２実施形態において暗号処理装置がウィンドウ列と乱数列と補正値を決定する処理のフローチャートである。
【図２０Ａ】第２実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その１）である。
【図２０Ｂ】第２実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その２）である。
【図２１】ウィンドウ列と乱数列と補正値を示すとともに、スカラ倍点情報格納部がランダム化テーブルデータを保持するテーブルを示す図である。
【図２２】ウィンドウサイズが３の場合のテーブルデータのエントリ数に関して、第２実施形態と第３の比較例と第４の比較例を比べる図である。
【図２３】第３実施形態によるメモリ使用量の削減について説明する図である。
【図２４】第３実施形態において暗号処理装置がウィンドウ列と乱数列と補正値を決定する処理のフローチャートである。
【図２５Ａ】第３実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その１）である。
【図２５Ｂ】第３実施形態において決定される、ウィンドウ列と乱数列と補正値の具体例を示す図（その２）である。
【図２６】ウィンドウ列と乱数列と補正値を示すとともに、スカラ倍点情報格納部がランダム化テーブルデータを保持するテーブルを示す図である。
【図２７】ウィンドウサイズが３の場合のテーブルデータのエントリ数に関して、第３実施形態と第３の比較例と第４の比較例を比べる図である。
【図２８】０以下の乱数値を生成するように変形された第１実施形態において、スカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
【図２９】０以下の乱数値を生成するように変形された第１実施形態において、インデックスとして使われる値についてまとめた図である。
【図３０】０以下の乱数値を生成するように変形された第２実施形態において、スカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
【図３１】０以下の乱数値を生成するように変形された第２実施形態と、負の乱数値を生成するように変形された第３実施形態において、インデックスとして使われる値についてまとめた図である。
【図３２】テーブルデータのエントリ数を比較する表である。
【発明を実施するための形態】
【００１８】
以下、実施形態について、図面を参照しながら詳細に説明する。説明の順序は以下のとおりである。
後述の第１〜第３実施形態の暗号処理装置は、楕円曲線上の点に対するスカラ倍算を行うためのデータ（具体的には、後述のウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃ）を生成し、生成したデータを用いてスカラ倍算を行う装置である。そこで、第１〜第３実施形態についての理解を助けるために、まず、楕円曲線上の演算について説明する。また、第１〜第３実施形態についての理解を助けるために、第１〜第４の比較例についても説明する。
【００１９】
その後、本願の発明者が比較例についての検討から得た知見と、当該知見に基づいて発明者が開発した第１〜第３実施形態の処理方法の共通点について説明する。また、第１〜第３実施形態に共通の装置構成についても説明する。その後、第１〜第３実施形態について順に説明し、最後に、その他の実施形態などを説明する。
【００２０】
さて、楕円曲線上の演算について説明する。ＥＣＣで使われる楕円曲線のうちで主なものは、素体ＧＦ（ｐ）上で定義される式（１．１）の楕円曲線と、２の拡大体ＧＦ（２ｎ）上で定義される式（１．２）の楕円曲線である（なお、ＧＦはGalois fieldの略であり、ｐは素数である）。
y2=x3+αx+β(mod p), ただしα, β, x, y∈GF(p)        (1.1)
y2+xy=x3+αx2+β (mod F(x))
ただし、α, β, x, y∈GF(2n)かつF(x)はGF(2n)の既約多項式 (1.2)
【００２１】
式（１．１）で表される楕円曲線上の点Ｐは、式（１．１）を満たすｘとｙの組によりＰ＝（ｘ，ｙ）と表される。同様に、式（１．２）で表される楕円曲線上の点Ｐは、式（１．２）を満たすｘとｙの組によりＰ＝（ｘ，ｙ）と表される。また、楕円曲線上の特殊な点として無限遠点（point at infinity, or infinite point）が定義される。無限遠点を以下では「Ｏ」（大文字のオー）と表記する。
【００２２】
なお、本明細書の以下の議論は、式（１．１）の楕円曲線についても式（１．２）の楕円曲線についても同様に成り立つ。よって、以下では式（１．１）と（１．２）の区別について言及せずに、単に「楕円曲線」、「点Ｐ」、「点（ｘ，ｙ）」、「ｘ座標」、「ｙ座標」、「楕円曲線パラメタαおよびβ」などの表記を用いることがある。
【００２３】
楕円曲線上の点同士に対して、ある演算（以下「加算」といい、「＋」と表す）を定義すると、楕円曲線上の点の集合は可換群をなすことが知られている。無限遠点Ｏは零元（すなわち加算における単位元）にあたる。また、楕円曲線上の任意の点Ｐ（点Ｐは無限遠点Ｏでもよい）に対して式（１．３）が成り立つ。
P+O=O+P=P                                              (1.3)
【００２４】
以下では点Ｐの逆元を−Ｐと表記する。点−Ｐのｘ座標とｙ座標は、楕円曲線が定義される体ＧＦ（ｐ）またはＧＦ（２ｎ）上の加算または減算により計算することができる。具体的には、点Ｐ＝（ｘ，ｙ）の逆元である点−Ｐは、楕円曲線が式（１．１）で定義される場合は式（１．４）により表され、楕円曲線が式（１．２）で定義される場合は式（１．５）により表される。
-P=(x, -y)                                             (1.4)
-P=(x, x+y)                                            (1.5)
【００２５】
式（１．４）と（１．５）から理解されるように、点Ｐから点−Ｐを求めるための計算量（computational complexity）はわずかである。符号つきウィンドウ法や後述の第１〜第３実施形態では、逆元の計算容易性を利用することで、メモリ使用量の削減が図られる。上記のような逆元の計算容易性は、ＲＳＡ暗号で利用される素体上の除算の計算困難性と対照的である。
【００２６】
なお、ある点Ｐ１と点Ｐ２に対してＰ３＝Ｐ１＋Ｐ２と表される点Ｐ３のｘ座標とｙ座標も、点Ｐ１とＰ２のｘ座標とｙ座標を用いて、体ＧＦ（ｐ）またはＧＦ（２ｎ）上の加減乗除により計算することができる。ここで、Ｐ２＝Ｐ１である場合には、Ｐ３＝Ｐ１＋Ｐ１を２Ｐ１とも表し、点Ｐ１から点Ｐ３＝２Ｐ１を求める演算を２倍算（doubling）という。２倍算も、体ＧＦ（ｐ）またはＧＦ（２ｎ）上の加減乗除により実現される。
【００２７】
また、減算は、式（１．６）のように逆元の加算として定義される。
P1-P2=P1+(-P2)                                         (1.6)
【００２８】
さらに、楕円曲線上の点に対しては、スカラ倍算（scalar multiplication）と呼ばれる演算が定義される。スカラ倍算は、加算、減算、２倍算の組み合わせにより実現される。具体的には、スカラ値ｄと楕円曲線上の点Ｐに対して、Ｑ＝ｄＰと表現される点Ｑは、次の式（１．７）のように定義される。
【数２】
2011121661.tif 000004
【００２９】
なお、任意の整数ｄ１とｄ２と、楕円曲線上の任意の点Ｐに対して、次の式（１．８）と（１．９）が成立する。
d1P+d2P=(d1+d2)P                                       (1.8)
d1(d2P)=d2(d1P)=(d1d2)P                                (1.9)
【００３０】
ＥＣＣにおいては、スカラ値が個人鍵として使われ、秘密にされる。逆に、楕円曲線上の「ベースポイント（base point）」と呼ばれるある点Ｇ、楕円曲線のパラメタαおよびβは、公開される情報である。個人鍵ｄに対して、公開鍵はＶ＝ｄＧを満たす点Ｖにより与えられる。
【００３１】
たとえ点ＧとＶが攻撃者に知られていても、点ＧとＶから個人鍵ｄを計算することは、莫大な計算量を必要とするので非常に困難である。この計算困難性は、離散対数問題の計算困難性として知られている。
【００３２】
ところで、ＥＣＣは、Diffie-Hellman（ＤＨ）アルゴリズムによる鍵共有（key agreement）や、ディジタル署名アルゴリズム（Digital Signature Algorithm；ＤＳＡ）などに利用可能である。何の目的でＥＣＣが利用されるにしろ、ＥＣＣを利用した処理はスカラ倍算を含む。ＤＨ鍵共有を例に説明すれば次のとおりである。
【００３３】
例えば、第１の装置の個人鍵がｄＡであり、第２の装置の個人鍵がｄＢであるとする。すると、第１の装置の公開鍵ＱＡは、ベースポイントＧからＱＡ＝ｄＡＧと計算され、第２の装置の公開鍵ＱＢは、ベースポイントＧからＱＢ＝ｄＢＧと計算される。このように、公開鍵の生成のためにスカラ倍算が行われる。
【００３４】
また、第１の装置は自らの公開鍵ＱＡを第２の装置に送り、第２の装置は自らの公開鍵ＱＢを第１の装置に送る。すると、第１の装置はスカラ倍算によりｄＡＱＢを計算し、第２の装置もスカラ倍算によりｄＢＱＡを計算する。その結果、式（１．１０）に示すように、第１の装置と第２の装置は同じ鍵Ｋを共有することができる。
K=dAQB=dA(dBG)=dB(dAG)=dBQA                                 (1.10)
ＥＣＣが、上記に例示したＤＨ鍵共有以外の目的に利用される場合も、やはりスカラ倍算が行われる。
【００３５】
ところで、ＰＡ攻撃は、スカラ倍算を実行中の装置の消費電力を測定することで、個人鍵として使われるスカラ値ｄを解読しようとする、非破壊攻撃の１種である。よって、何の目的でＥＣＣが利用されるにしろ、個人鍵ｄの漏洩防止の対策としては、スカラ倍算を実行中の装置の消費電力波形が個人鍵ｄの特徴を示さないようにすることが有効である。
【００３６】
もしＰＡ攻撃に対して何の対策もとられないと、スカラ倍算を実行中の装置の消費電力波形の特徴から、個人鍵ｄが解読されてしまう危険性がある。具体的には、ＳＰＡ攻撃は、スカラ倍算を効率よく行うための演算手順に注目して、ある１回のスカラ倍算の処理中の消費電力波形から個人鍵ｄを解読しようとする攻撃手法である。また、ＤＰＡ攻撃は、複数の異なる点に対するスカラ倍算における電力波形の相違に注目して、個人鍵ｄを解読しようとする攻撃手法である。
【００３７】
後述の第１〜第３実施形態の暗号処理装置は、ＳＰＡ攻撃に対してもＤＰＡ攻撃に対しても安全であるように、かつ使用メモリ量を抑えるように、設計されている。そこで、第１〜第３実施形態の利点についての理解を助けるため、続いて、いくつかの比較例について説明する。
【００３８】
まず、第１の比較例として、「バイナリ法」について説明する。バイナリ法は、ＳＰＡ攻撃に対してもＤＰＡ攻撃に対しても脆弱である。
例えば個人鍵ｄが１６０ビットである場合、ｄは非常に大きな数（例えば、２１６０に近い数）である可能性がある。よって、式（１．７）の定義どおりにスカラ倍算を実行することは、非常に多くの回数の点の加算をともなうため、非現実的である。バイナリ法は、スカラ倍算の計算量のオーダを個人鍵ｄのビット数のオーダに抑えるための手法である。
【００３９】
ここで説明の便宜上、個人鍵ｄのビット長をｕとする。また、個人鍵ｄのｉビット目をｄ［ｉ］と表記する（０≦ｉ≦ｕ−１）。ｄ［０］が最下位ビット（Least Significant Bit；ＬＳＢ）でありｄ［ｕ−１］が最上位ビット（Most Significant Bit；ＭＳＢ）である。すると、式（２．１）より、式（２．２）が得られる。
【数３】
2011121661.tif 000005
dA=2u-1d[u-1]A+…+21d[1]A+20d[0]A                       (2.2)
【００４０】
バイナリ法は式（２．２）を利用した計算手順である。例えば、個人鍵ｄが（１１００１０１）２の場合について具体的に説明すると、バイナリ法は式（２．３）にしたがってスカラ倍算を実現する手法である。
dA=2(2(2(2(2(2(2O+A)+A)))+A))+A=26A+25A+22A+A          (2.3)
【００４１】
すなわち、スカラ倍算の結果を変数Ｖで表すことにすると、バイナリ法では式（２．４）のとおり、変数Ｖがまず無限遠点Ｏにより初期化される。
V=O                                      (2.4)
【００４２】
その後、ＭＳＢからＬＳＢへと順に、「２倍算により２Ｖを求め、その後、もしｄ［ｉ］＝１ならば点Ａの加算を行い、得られた結果を変数Ｖに代入する」という処理が繰り返される。具体的には、ｄ［６］＝１なので、式（２．５）のとおり、６ビット目に対応して２倍算と加算が行われる。
V=2O+A                                     (2.5)
【００４３】
そして、ｄ［５］＝１なので、式（２．６）のとおり、５ビット目に対応して２倍算と加算が行われる。
V=2(2O+A)+A                                  (2.6)
【００４４】
また、ｄ［４］＝０なので、式（２．７）のとおり、４ビット目に関しては２倍算のみが行われ、加算は行われない。
V=2(2(2O+A)+A)                                 (2.7)
【００４５】
同様に、ｄ［３］＝０なので、式（２．８）のとおり、３ビット目に関しても２倍算のみが行われ、加算は行われない。
V=2(2(2(2O+A)+A))                                (2.8)
【００４６】
次の２ビット目に関しては、ｄ［２］＝１なので、式（２．９）のとおり、２倍算と加算が行われる。
V=2(2(2(2(2O+A)+A)))+A                             (2.9)
【００４７】
また、次の１ビット目に関しては、ｄ［１］＝０なので、式（２．１０）のとおり、２倍算のみが行われ、加算は行われない。
V=2(2(2(2(2(2O+A)+A)))+A)                           (2.10)
【００４８】
そして、最後の０ビット目に関しては、ｄ［０］＝１なので、式（２．１１）のとおり、２倍算と加算が行われる。
V=2(2(2(2(2(2(2O+A)+A)))+A))+A                        (2.11)
【００４９】
以上のようにしてｄ［ｉ］＝１であるｉビット目に対応して加算された点Ａの係数は、式（２．１１）から理解されるように、２ｉである。よって、上記の式（２．４）〜（２．１１）とともに例示した手順により、確かに式（２．３）にしたがって、Ｖ＝ｄＡが得られる。
【００５０】
上記の例から明らかなとおり、バイナリ法によれば、２倍算の回数は個人鍵ｄのビット長ｕに等しく、加算の回数は個人鍵ｄのハミング重み（Hamming weight）に等しい。よって、バイナリ法によるスカラ倍算の計算量は、２ｕのオーダではなく、ｕのオーダに抑えられる。
【００５１】
ところで、もし２倍算のときの消費電力波形と加算のときの消費電力波形が区別可能であるとすると、バイナリ法はＳＰＡ攻撃に対して脆弱である。すなわち、バイナリ法の計算手順から、攻撃者は「２倍算の消費電力波形に続いて加算の消費電力波形が現れれば、ビット値ｄ［ｉ］は１である」と解析することができる。同様に、攻撃者は「２倍算の消費電力波形に続いて加算の消費電力波形が現れなければビット値ｄ［ｉ］は０である」と解析することができる。
【００５２】
また、バイナリ法はＤＰＡ攻撃に対しても脆弱である。なお、ＤＰＡ攻撃への安全性に関する説明の理解を助けるために、ＤＰＡ攻撃の概要を説明すれば次のとおりである。
すなわち、ＤＰＡ攻撃を行う攻撃者は、楕円曲線上のＬ個（Ｌ≧２）の既知の点Ａ１，Ａ２，…，ＡＬに対してそれぞれ個人鍵ｄによるスカラ倍算が行われるときの消費電力波形を観察することにより、個人鍵ｄを解読する。以下では、点Ａｊに対応して観察された消費電力をＰｏｗｊ（ｔ）と表記し、ＤＰＡ攻撃による個人鍵ｄの解読について説明する。なお、ｔは時刻情報を示す。
【００５３】
説明の便宜上、１ビット以上の長さのビット列同士の連結（concatenation）を“||”という記号で表すことにする。すると、個人鍵ｄは式（３．１）のように表される。
d=d[u-1]||d[u-2]||…||d[1]||d[0]            (3.1)
式（２．３）〜（２．１１）に例示したバイナリ法は、まず式（２．５）によりｄ［６］Ａを計算して変数Ｖに代入し、以下順次ビット数を増やしながら変数Ｖの値を更新していく方法である。すなわち、式（２．６）により（ｄ［６］｜｜ｄ［５］）Ａが計算され、式（２．７）により（ｄ［６］｜｜ｄ［５］｜｜ｄ［４］）Ａが計算され、式（２．８）により（ｄ［６］｜｜ｄ［５］｜｜ｄ［４］｜｜ｄ［３］）Ａが計算される。そして、式（２．９）により（ｄ［６］｜｜ｄ［５］｜｜ｄ［４］｜｜ｄ［３］｜｜ｄ［２］）Ａが計算され、式（２．１０）により（ｄ［６］｜｜ｄ［５］｜｜ｄ［４］｜｜ｄ［３］｜｜ｄ［２］｜｜ｄ［１］）Ａが計算される。最後に、式（２０）によりｄＡが得られる。
【００５４】
一般に、ハードウェアは、ロードまたはストアされるデータ値のハミング重みに応じた電力を消費する。そこで、攻撃者は、ＭＳＢ（すなわち（ｕ−１）ビット目）からＬＳＢ（すなわち０ビット目）まで順に、次の処理を行うことでビット値ｄ［ｉ］を解読する。
【００５５】
攻撃者は、ビット値ｄ［ｉ］を予想する。そして、攻撃者は、既に解読した上位のビット値ｄ［ｕ−１］，…，ｄ［ｉ＋１］と、予想したビット値ｄ［ｉ］を用いて、１≦ｊ≦Ｌなる各ｊについて、式（３．２）で表される点Ｂｊを計算する。
Bj=(d[u-1]||…||d[i])Aj                              (3.2)
【００５６】
さらに、攻撃者は、消費電力Ｐｏｗｊ（ｔ）を、点Ｂｊを表すデータ内の特定位置のビット値に応じて、２つの集合Ｓ０とＳ１のいずれかに分類する。以下、上記特定位置のビット値が０の集合をＳ０とし、上記特定位置のビット値が１の集合をＳ１とする。攻撃者は、集合Ｓ１に属する消費電力Ｐｏｗｊ（ｔ）の平均から、集合Ｓ０に属する消費電力Ｐｏｗｊ（ｔ）の平均を引いた差分波形Ｄｉｆｆ（ｔ）を求める。
【００５７】
もし、差分波形Ｄｉｆｆ（ｔ）にスパイクが出現していれば、攻撃者は、予想したビット値ｄ［ｉ］が正しいと判定する。逆に、差分波形Ｄｉｆｆ（ｔ）が平坦であれば、攻撃者は、予測したｄ［ｉ］の値が誤りだったと判定する。その結果、攻撃者は、ビット値ｄ［ｉ］を解読することができる。
【００５８】
このように、「ＭＳＢから順に、ビット数を増やしながら、（ｄ［ｕ−１］｜｜…｜｜ｄ［ｉ］）Ａの計算を行う」というバイナリ法の特徴を利用して、ＤＰＡ攻撃では、攻撃者がＭＳＢから順にビット値ｄ［ｉ］を解読してゆく。
【００５９】
以上のようにバイナリ法はＳＰＡ攻撃にもＤＰＡ攻撃にも脆弱である。それに対し、次に第２の比較例として挙げる「ウィンドウ法」は、ＳＰＡ攻撃に対して安全である。
バイナリ法では、式（２．４）〜（２．１１）に例示したように、個人鍵ｄの１ビットごとに、ビット値に応じて「２倍算と加算」または「２倍算」という処理が行われる。それに対して、ウィンドウ法では、個人鍵ｄのｋビットごとに、ビット値によらず常に「ｋ回の２倍算と１回の加算」という処理が行われる。よって、たとえ２倍算の消費電力波形と加算の消費電力波形が異なっていたとしても、ウィンドウ法によるスカラ倍算はＳＰＡ攻撃に対して安全である。
【００６０】
以下では説明の簡単化のため、個人鍵ｄのビット数ｕがウィンドウサイズｋで割り切れるものとする。すなわち、ｍ＝ｕ／ｋとすると、ｍは整数である。また、０≦ｉ≦（ｍ−１）なる各ｉについて、ｉ番目のウィンドウ値ｗ［i］は式（４．１）のように定義される。
w[i]=d[ik+k-1]||…||d[ik]                              (4.1)
【００６１】
なお、ｉ番目のウィンドウ値を表す“ｗ［ｉ］”という表記法における“［ｉ］”の意味は、個人鍵ｄのｉビット目を表す“ｄ［ｉ］”という表記法における“［ｉ］”の意味とは異なる。しかし、“［ｉ］”の意味は文脈から明らかなので、以下では適宜“ｗ［ｉ］”のような表記法を用いる。
【００６２】
例えば、ウィンドウサイズｋが３ビットであり、個人鍵ｄが（０１１１１１１０１）２である場合、ウィンドウ値は次の式（４．２）〜（４．４）のとおりである。以下では、ｗ［ｍ−１］，…，ｗ［１］，ｗ［０］のようなウィンドウ値の系列を「ウィンドウ列」（window sequence）ともいう。
w[2]=(011)2=3                                          (4.2)
w[1]=(111)2=7                                          (4.3)
w[0]=(101)2=5                                          (4.4)
【００６３】
また、ウィンドウ法では、スカラ倍算の対象として与えられる点Ａの座標を用いて、０≦ｈ≦２ｋ−１なる各ｈに対して、予め、スカラ倍点（scalar multiple）ｈＡが計算される。そして、計算されたスカラ倍点ｈＡは、インデックスｈと対応づけられてメモリに格納される。
【００６４】
以下では、インデックスｈに対応づけられたスカラ倍点ｈＡをｔａｂ［ｈ］と表記し、ｔａｂ［ｈ］（＝ｈＡ）を「テーブルデータ」ともいう。より詳しくは、テーブルデータｔａｂ［ｈ］は、スカラ倍点ｈＡのｘ座標とｙ座標の組により表される。
【００６５】
ウィンドウ法では、点ｄＡの計算は、式（４．５）のようにテーブルデータを用いて行われる。
dA=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2]   (4.5)
【００６６】
より具体的には、スカラ値ｄと点Ａのスカラ倍算の結果を変数Ｖで表すことにすると、ウィンドウ法では、式（４．６）のとおり、変数Ｖがまず無限遠点Ｏにより初期化される。
V=O                                          (4.6)
【００６７】
その後、ｉ＝ｍ−１からｉ＝０へと順に、「２倍算をｋ回（すなわち３回）行い、ｔａｂ［ｗ［ｉ］］を加算し、得られた結果を変数Ｖに代入する」という処理が行われる。すなわち、まずウィンドウ値ｗ［２］に対応して式（４．７）のとおり３回の２倍算と１回の加算が行われる。
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)
【００７０】
以上のように、ウィンドウ法によれば、個人鍵ｄに含まれるビット値の値によらず、同じ種類の処理が行われる。よって、ウィンドウ法はＳＰＡ攻撃に対して安全である。
【００７１】
続いて、第３の比較例として、ＳＰＡ攻撃に対してのみならずＤＰＡ攻撃に対しても安全となるようにウィンドウ法を改良した「ランダム化ウィンドウ法」について説明する。ランダム化ウィンドウ法では、ｂビットの乱数値ｓによってテーブルデータがランダム化される。ランダム化により、データの内容と消費電力の相関関係が隠される。すなわち、ランダム化により、攻撃者によるビット値の予測の正誤に応じて差分波形Ｄｉｆｆ（ｔ）が変化することはなくなる。したがって、ランダム化により、ＤＰＡ攻撃に対する安全性が実現される。
【００７２】
なお、乱数値ｓのビット数ｂは、例えば３０以下が好ましい。また、ｍを整数とし、個人鍵ｄのビット数をｕとすると、式（５．１）が成り立つものとする。
u=b+km                                                 (5.1)
【００７３】
例えば、個人鍵ｄが３７８＝（１０１１１１０１０）２であるとすると、ｕ＝９である。また、ウィンドウサイズｋが２であり、ｂが３であり、乱数値ｓが３＝（０１１）２であるとする。この場合、式（５．１）よりｍ＝３である。ランダム化ウィンドウ法では、０≦ｉ≦（ｍ−１）なる各ｉについてｋビットのウィンドウ値ｗ［ｉ］が計算され、さらに、式（５．２）が成立するようにｂビットの補正値ｃが計算される。
【数４】
2011121661.tif 000006
【００７４】
ここで、乱数値ｓはｂビットなので、式（５．２）から式（５．３）が得られる。
【数５】
2011121661.tif 000007
【００７５】
そして、式（５．３）から移項により式（５．４）が得られる。
【数６】
2011121661.tif 000008
【００７６】
式（５．４）の左辺は、個人鍵ｄと乱数値ｓから計算される値を示す。そして、式（５．４）の右辺は、式（５．４）の左辺により計算される値を最上位ビットからｋビットずつ区切ることでウィンドウ列が得られることと、式（５．４）の左辺により計算される値の最下位のｂビットが補正値ｃとなることを示す。
【００７７】
例えば、上記のとおりｄ＝３７８＝（１０１１１１０１０）２であり、乱数値ｓが３＝（０１１）２である場合、式（５．４）の左辺を計算すると、式（５．５）のとおりである。
378-(20×3+22×3+24×3)=378-(3+12+48)=315=(100111011)2  (5.5)
【００７８】
よって、式（５．５）により得られた値（１００１１１０１１）２を２ビットずつ区切ることでウィンドウ列ｗ［２］、ｗ［１］、ｗ［０］が得られる。また、この値（１００１１１０１１）２の最下位のｂ（＝３）ビットから補正値ｃが得られる。具体的には、式（５．６）〜（５．９）のとおりである。
w[2]=(10)2=2                                           (5.6)
w[1]=(01)2=1                                           (5.7)
w[0]=(11)2=3                                           (5.8)
c=(011)2=3                                             (5.9)
【００７９】
ランダム化ウィンドウ法では、以上のようにしてウィンドウ値ｗ［ｉ］（０≦ｉ≦ｍ−１）と補正値ｃが計算される。また、ランダム化ウィンドウ法ではさらに、スカラ倍算の対象である点Ａの座標を用いて、０≦ｈ≦２ｋ−１なる各ｈに対して、予め、インデックスｈと対応づけて式（５．１０）のテーブルデータが計算され、メモリに格納される。
tab[h]=(2bh+s)A                                       (5.10)
【００８０】
例えば、上記のとおりｂ＝３でありｓ＝（０１１）２＝３である場合、メモリにはテーブルデータとして次の式（５．１１）〜（５．１４）のデータが格納される。
tab[(00)2]=tab[0]=(23×0+3)A=3A                         (5.11)
tab[(01)2]=tab[1]=(23×1+3)A=11A                        (5.12)
tab[(10)2]=tab[2]=(23×2+3)A=19A                        (5.13)
tab[(11)2]=tab[3]=(23×3+3)A=27A                        (5.14)
【００８１】
そして、点ｄＡの計算は、式（５．１５）にしたがって行われる。
dA=22(22(22(O)+tab[w[2]])+tab[w[1]])+tab[w[0]]+cA
=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)
【００８２】
式（５．２）が満たされるように、式（５．５）により式（５．９）の補正値ｃが算出されているので、式（５．１５）の計算により確かにｄＡ（すなわちこの例では３７８Ａ）が得られる。
【００８３】
また、式（５．１５）は、個人鍵ｄのビット値によらず、「２倍算をｋ回（上記の例ではｋ＝２）行い、加算を１回行う」という処理がｍ回（上記の例ではｍ＝３）繰り返され、補正値ｃを用いた１回のスカラ倍算と点ｃＡの加算が行われることを示す。よって、ランダム化ウィンドウ法は、ウィンドウ法と同様にＳＰＡ攻撃に対して安全である。また、テーブルデータが乱数値ｓによってランダム化されているので、ランダム化ウィンドウ法は、ＤＰＡ攻撃に対しても安全である。
【００８４】
ところで、ウィンドウ法でもランダム化ウィンドウ法でも、ウィンドウサイズｋに応じて、２ｋ個のエントリがテーブル内に作成される。他方で、組み込み機器など、ある種の装置では、メモリ容量が少ないため、各種の処理を行うためのメモリ使用量を少なくすることが望ましい。
【００８５】
組み込み機器の１つの例はスマートカードである。また、組み込み機器の他の例は、プリンタなどの電子機器により認証される部品である。例えば、偽造品排除のために、二次電池あるいはプリンタカートリッジなどのアクセサリ部品に、「認証チップ」と呼ばれるLarge Scale Integration（ＬＳＩ）が組み込まれていてもよい。プリンタによるプリンタカートリッジの認証は、例えば、正規品以外のプリンタカートリッジでの印刷を不能にするために行われてもよい。もちろん、組み込み機器にはその他の様々な種類がある。
【００８６】
例えば、スマートカードや認証機能つきプリンタカートリッジなどの装置では特に、メモリ搭載量が少ない。よって、スカラ倍算に関しても、メモリ使用量を抑えた処理アルゴリズムが好ましい。
【００８７】
そこで、第４の比較例として、「符号つき（signed）ウィンドウ法」について次に説明する。符号つきウィンドウ法は、ウィンドウ法と同様にＳＰＡ攻撃に対して安全であり、かつウィンドウ法よりもメモリ使用量が少ない方法である。
【００８８】
具体的には、ウィンドウサイズをｋとすると、ウィンドウ法ではテーブルデータのエントリ数が２ｋ個であるのに対し、符号つきウィンドウ法ではテーブルデータのエントリ数が２ｋ−１＋１個である。よって、符号つきウィンドウ法のメモリ使用量は、ウィンドウ法のメモリ使用量の約半分である。同様に、符号つきウィンドウ法のメモリ使用量は、ランダム化ウィンドウ法のメモリ使用量の約半分である。
【００８９】
符号つきウィンドウ法は、「楕円曲線上の点Ｐから逆元である点−Ｐを求める計算の処理負荷は、比較的軽い（つまり逆元の計算コストが低い）」ということに注目した方法である（式（１．４）および（１．５）、ならびにその説明を参照）。符号つきウィンドウ法におけるテーブルデータのインデックスｈは、具体的には０≦ｈ≦２ｋ−１である。
【００９０】
例えば、ウィンドウサイズｋが３であるとする。すると、符号つきウィンドウ法で使われるインデックスは０、１、２、３、４の５つである。そして、これらの５つのインデックスに対応する対応するテーブルデータは、０Ａ、１Ａ、２Ａ、３Ａ、４Ａである。符号つきウィンドウ法では、次の式（６．１）〜（６．３）の関係を利用することにより、３つのインデックス５、６、７に対応するテーブルデータ５Ａ、６Ａ、７Ａが省略される。
5A=2kA-3A=8A-3A                                        (6.1)
6A=2kA-2A=8A-2A                                        (6.2)
7A=2kA-1A=8A-1A                                        (6.3)
【００９１】
例えば、ウィンドウサイズｋが３ビットであり、個人鍵ｄが２４１＝（０１１１１０００１）２であるとする。符号つきウィンドウ法では、まず、ウィンドウ法と同様にして仮のウィンドウ値が求められる。すなわち、仮のウィンドウ値は次の式（６．４）〜（６．６）のとおりである。なお、特に混乱のおそれはないので、以下では、仮のウィンドウ値と確定した実際のウィンドウ値をともにｗ［ｉ］と表記する。
w[2]=(011)2=3                                          (6.4)
w[1]=(110)2=6                                          (6.5)
w[0]=(001)2=1                                          (6.6)
【００９２】
そして、仮のウィンドウ値は最下位（すなわちｗ［０］）から順にスキャンされ、次のようにして各ウィンドウ値が確定される。すなわち、もしｗ［ｉ］≧２ｋ−１＋１であれば、仮のウィンドウ値ｗ［ｉ］から２ｋを引いた値（すなわちｗ［ｉ］−２ｋ）がウィンドウ値ｗ［ｉ］として設定される。また、ｉ番目の仮のウィンドウ値ｗ［ｉ］から２ｋの減算が行われた場合は、減算の影響をキャンセルするため、１つ上位の仮のウィンドウ値ｗ［ｉ＋１］には、１が足される。
【００９３】
なお、以下では上記の２ｋの減算を「ウィンドウ補正」といい、上記の１の加算を「キャリー（carry）補正」という。また、上記のｗ［ｉ］≧２ｋ−１＋１という条件の代わりに、ｗ［ｉ］≧２ｋ−１という条件を用いてもよいが、以下では説明の便宜上、ｗ［ｉ］≧２ｋ−１＋１という条件が用いられるものとする。
【００９４】
式（６．４）〜（６．６）の仮のウィンドウ値から、実際のウィンドウ値は、次のようにして求められる。
すなわち、式（６．６）よりｗ［０］＜２ｋ−１＋１が成立する。よって、０番目（つまり最下位）のウィンドウ値ｗ［０］は仮のウィンドウ値と同じく１である。
【００９５】
また、式（６．５）よりｗ［１］≧２ｋ−１＋１が成立する。よって、１番目のウィンドウ値は、仮のウィンドウ値６から８（＝２ｋ）を引くことで得られ、ｗ［１］＝−２と確定する。よって、キャリー補正により、式（６．４）の仮のウィンドウ値ｗ［２］には１が足され、ｗ［２］＝４となる。
【００９６】
そして、このキャリー補正された仮のウィンドウ値ｗ［２］＝４は、ｗ［２］＜２ｋ−１＋１を満たす。よって、２番目（つまり最上位）のウィンドウ値はｗ［２］＝４と確定する。
【００９７】
以上のようにして確定したウィンドウ値ｗ［０］〜ｗ［２］を用いて、符号つきウィンドウ法では式（６．７）により点ｄＡが計算される。
dA=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]]         (6.7)
【００９８】
より具体的には、スカラ倍算の結果を変数Ｖで表すことにすると、式（６．８）のとおり、変数Ｖがまず無限遠点Ｏにより初期化される。
V=O                                           (6.8)
【００９９】
その後、ｉ＝ｍ−１からｉ＝０へと順に、「２倍算をｋ回行い、ウィンドウ値ｗ［ｉ］が０以上ならｔａｂ［ｗ［ｉ］］を加算し、ウィンドウ値ｗ［ｉ］が負ならｔａｂ［−ｗ［ｉ］］を減算し、得られた結果を変数Ｖに代入する」という処理が行われる。なお、ｍは、個人鍵ｄのビット長ｕをウィンドウサイズｋで割った値であり、本例ではｍ＝３である。
【０１００】
式（６．８）の初期化に続いて、ｉ＝ｍ−１に対応する処理が行われる。すなわち、ウィンドウ値ｗ［２］（＝４）に対応して、式（６．９）のとおり３回の２倍算と１回の加算が行われる。
V=23(O)+tab[w[2]]                                (6.9)
【０１０１】
次に、ウィンドウ値ｗ［１］（＝−２）に対応して、式（６．１０）のとおり３回の２倍算と１回の減算が行われる。
V=23(23(O)+tab[w[2]])-tab[-w[1]]                    (6.10)
【０１０２】
そして、最後にウィンドウ値ｗ［０］（＝１）に対応して、式（６．１１）のとおり３回の２倍算と１回の減算が行われる。
V=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]]         (6.11)
【０１０３】
式（６．１１）の右辺を展開すると、下記の式（６．１２）のとおりである。また、上記のとおり本例において個人鍵ｄは２４１である。よって、以上説明した符号つきウィンドウ法により点ｄＡが正しく計算されることが理解されるであろう。
V=23(23(23(O)+tab[4])-tab[2])+tab[1]
=23(23(4A)-2A)+1A
=8(32A-2A)+1A
=241A                                                (6.12)
【０１０４】
なお、符号つきウィンドウ法は、ウィンドウ法と同様の理由から、ＳＰＡ攻撃に対しては安全であるが、ＤＰＡ攻撃に対しては脆弱である。
【０１０５】
さて、以上のとおり第１〜第４の比較例について説明したが、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対して安全なランダム化ウィンドウ法はメモリ消費量が比較的多く、メモリ消費量の少ない符号つきウィンドウ法はＤＰＡ攻撃に対しては脆弱である。すなわち、上記の４つの比較例の中には、「ＳＰＡ攻撃とＤＰＡ攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴を持つ手法は存在しない。
【０１０６】
他方、サイドチャネル攻撃の１種であるＰＡ攻撃は、組み込み機器に対しても行われる危険性が十分にあり、また、組み込み機器の中には、何らかの理由からメモリ容量が限られたものがある。よって、例えば組み込み機器のようにメモリ容量の小さな装置におけるスカラ倍算の処理は、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対して安全で、かつメモリ使用量が少ないことが好ましい。
【０１０７】
しかしながら、本願発明者が研究したところ、「ＳＰＡ攻撃とＤＰＡ攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴は、単純素朴にランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせることでは得られないことが判明した。むしろ、発明者は「ランダム化ウィンドウ法と符号つきウィンドウ法は、単純素朴に組み合わせることは不可能である」という知見を得た。この知見をもう少し詳しく述べると、次のとおりである。
【０１０８】
乱数の使用は、符号つきウィンドウ法の単純な適用を阻害する。そのため、ＳＰＡ攻撃への対策としてランダム化ウィンドウ法が採用されると、符号つきウィンドウ法の単純な適用によるメモリ使用量の削減は不可能となる。つまり、「符号つきウィンドウ法とランダム化ウィンドウ法の単純素朴な組み合わせによって、少ないメモリ使用量で、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性を確保しよう」という試みは、うまくいかない。
【０１０９】
上記知見は、後述の第１〜第３実施形態について理解するうえで有益なので、以下、上記知見について詳しく説明する。
図１は、ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせる試みについて例示する図である。以下に説明するとおり、図１に例示する試みは失敗に終わる。
【０１１０】
図１の例における個人鍵ｄは、式（７．１）に示す２３ビットの値である。
d=(01001010110100011011011)2                            (7.1)
また、図１の例における乱数値ｓは、式（７．２）に示す８ビットの値である。
s=(10001101)2                                           (7.2)
【０１１１】
したがって、図１の例ではｕ＝２３でありｂ＝８である。また、ウィンドウサイズｋが３であるとする。よって、式（５．１）の整数ｍ（すなわちウィンドウ列に含まれるウィンドウ値の数）は、式（７．３）より５である。
m=(u-b)/k=(23-8)/3=5                                   (7.3)
【０１１２】
上記のとおりランダム化ウィンドウ法では、式（５．２）が満たされるように、式（５．４）にしたがってウィンドウ値ｗ［ｉ］（０≦ｉ≦ｍ−１）と補正値ｃが決定される。そこで、図１の例でも、式（５．４）にしたがってランダム化ウィンドウ法と同様に、仮にウィンドウ値ｗ［ｉ］と補正値ｃが計算されると仮定する。すると、式（５．４）の左辺の計算結果は式（７．４）のとおりであるから、図１および式（７．５）〜（７．１０）に示したように仮のウィンドウ値ｗ［ｉ］と補正値ｃが得られる。
d-(20s+23s+26s+29s+212s)=(00110110101011010100110)2    (7.4)
w[4]=(001)2=1                                          (7.5)
w[3]=(101)2=5                                          (7.6)
w[2]=(101)2=5                                          (7.7)
w[1]=(010)2=2                                          (7.8)
w[0]=(110)2=6                                          (7.9)
c=(10100110)2                                         (7.10)
【０１１３】
続いて、上記の式（７．５）〜（７．９）のように得られた各ウィンドウ値ｗ［ｉ］に対して、符号つきウィンドウ法と同様にして、ウィンドウ補正とキャリー補正が行われると仮定する。図１の例ではウィンドウサイズｋが３なので、ｗ［ｉ］≧５（＝２ｋ−１＋１）のときにウィンドウ補正により仮のウィンドウ値ｗ［ｉ］から８（＝２ｋ）が引かれ、ウィンドウ値ｗ［ｉ＋１］に対してキャリー補正が行われる。
【０１１４】
すなわち、最下位のウィンドウ値ｗ［０］がｗ［０］≧２ｋ−１＋１の場合、ウィンドウ補正によりウィンドウ値ｗ［０］からは２ｋが引かれ、１つ上位のウィンドウ値ｗ［１］に対してキャリー補正が行われる。最下位以外のウィンドウ値ｗ［ｉ］（１≦ｉ≦ｍ−１）に関しては、仮のウィンドウ値ｗ［ｉ］とキャリー補正値の合計が２ｋ−１＋１以上の場合に、ウィンドウ補正が行われ、１つ上位のウィンドウ値ｗ［ｉ＋１］に対してキャリー補正が行われる。
【０１１５】
具体的には、図１に示すように、まず最下位の仮のウィンドウ値ｗ［０］＝６（≧５）に対してウィンドウ補正が行われ、ウィンドウ値ｗ［０］は式（７．１１）のように確定する。
w[0]=6-8=-2                                           (7.11)
【０１１６】
そして、次のウィンドウ値ｗ［１］に対してキャリー補正により１が足され、ウィンドウ値ｗ［１］は式（７．１２）のように確定する。なお、３＜５なのでウィンドウ値ｗ［１］に対するウィンドウ補正は行われない。
w[1]=2+1=3                                            (7.12)
【０１１７】
続いて、次のウィンドウ値ｗ［２］＝５（≧５）に対してウィンドウ補正が行われ、ウィンドウ値ｗ［２］は式（７．１３）のように確定する。
w[2]=5-8=-3                                           (7.13)
【０１１８】
そして、さらに次のウィンドウ値ｗ［３］に対して、キャリー補正により１が足される。キャリー補正されたウィンドウ値ｗ［３］は、５以上であるから、ウィンドウ補正の対象となる。したがって、ウィンドウ値ｗ［３］は式（７．１４）のように確定する。
w[3]=5+1-8=-2                                         (7.14)
【０１１９】
そして、次の（すなわち最上位の）ウィンドウ値ｗ［４］に対してはキャリー補正により１が足される。なお、キャリー補正されたウィンドウ値ｗ［４］は５未満なので、ウィンドウ補正の対象ではなく、結局、ウィンドウ値ｗ［４］は式（７．１５）のように確定する。
w[4]=1+1=2                                            (7.15)
【０１２０】
図１には、以上のようにして確定した式（７．１１）〜（７．１５）のウィンドウ値ｗ［０］〜ｗ［４］と、式（７．１０）の補正値ｃが示されている。以上のようにして得られたウィンドウ値ｗ［ｉ］の絶対値は、上記の例からも分かるとおり、２ｋ−１以下である。
【０１２１】
しかしながら、第４の比較例として挙げた符号つきウィンドウ法とは異なり、ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせようとした図１の例では、たとえすべてのウィンドウ値の絶対値が２ｋ−１以下でも、テーブルデータの削減ができない。すなわち、「ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせることで、耐タンパ性とメモリ使用量の抑制を両立させよう」という試みは失敗する。その理由について、図２を参照しながら以下に説明する。
【０１２２】
図２は、図１の試みが失敗する理由を説明する図である。図２は、図１と同様に、ウィンドウサイズｋが３であり乱数値ｓのビット長ｂが８の場合の例を示す。図２において、テーブル１０１は符号つきウィンドウ法に対応し、テーブル１０２は図１の試みに対応する。
【０１２３】
符号つきウィンドウ法によれば、２ｋ−１＋１以上のウィンドウ値からは、ウィンドウ補正により２ｋが引かれる。例えば、ｋ＝３の場合、５以上のウィンドウ値からは８が引かれる。
【０１２４】
よって、必要に応じてキャリー補正されたウィンドウ値が５ならば、ウィンドウ補正されたウィンドウ値は−３となる。そして、式（１．４）と（１．５）に示したように、楕円曲線上のある点からその逆元の点を得るための計算量は少ないので、スカラ倍点−３Ａは、スカラ倍点３Ａから少ない計算量で容易に求められる。
【０１２５】
よって、符号つきウィンドウ法によれば、テーブル１０１は、５というインデックスに対応づけてスカラ倍点５Ａのテーブルデータを保持する必要もないし、５というインデックスに対応づけてスカラ倍点−３Ａのテーブルデータを保持する必要もない。すなわち、符号つきウィンドウ法では、図２のテーブル１０１のように、テーブル１０１においてインデックスが５のエントリは省略可能であり、インデックスが３のエントリがその代わりに使われる。
【０１２６】
同様に、符号つきウィンドウ法によれば、テーブル１０１に示すようにインデックスが６と７のエントリも省略可能であり、インデックスが２と１のエントリがその代わりに使われる。その結果、符号つきウィンドウ法によれば、テーブル１０１は、２ｋ個のエントリを保持する必要がない。すなわち、テーブル１０１は、インデックスが２ｋ−１以下のエントリさえ保持すればよい。よって、符号つきウィンドウ法ではウィンドウ法（あるいはランダム化ウィンドウ法）と比べてメモリ使用量が少ない。
【０１２７】
それに対して、図１の試みに対応するテーブル１０２では、インデックスが２ｋ−１＋１以上のエントリも省略不可能であり、ウィンドウ法（あるいはランダム化ウィンドウ法）と比較してメモリ使用量を少なくすることは不可能である。その理由は次のとおりである。
【０１２８】
テーブル１０２において、インデックスが１のエントリのテーブルデータｔａｂ［１］は、（１×２８＋ｓ）Ａである。よって、テーブルデータｔａｂ［１］の減算は、点（−１×２８−ｓ）Ａの加算を意味する。同様に、テーブル１０２におけるテーブルデータｔａｂ［２］の減算は、点（−２×２８−ｓ）Ａの加算を意味し、テーブル１０２におけるテーブルデータｔａｂ［３］の減算は、点（−３×２８−ｓ）Ａの加算を意味する。
【０１２９】
それに対して、図１の試みでは、ウィンドウ補正やキャリー補正により初期ウィンドウ値が補正されることはあるが、乱数値ｓは一定である。そのため、例えば、必要に応じてキャリー補正が行われた後のウィンドウ値が５の場合、ウィンドウ値は−３に補正されるが、こうして−３に補正されたウィンドウ値に対応するのは点（−３×２８＋ｓ）Ａの加算である。
【０１３０】
そして、点（−３×２８＋ｓ）Ａは、インデックスが３のエントリのテーブルデータが表す点の逆元（−３×２８−ｓ）Ａではない。つまり、式（−３×２８＋ｓ）Ａと（−３×２８−ｓ）Ａでは、乱数値ｓの符号が異なる。
【０１３１】
よって、点（−３×２８＋ｓ）Ａは、インデックスが３のエントリのテーブルデータからわずかな計算量で計算される点ではない。よって、テーブル１０２は、ウィンドウ補正された−３というウィンドウ値に対応するテーブルデータとして、スカラ倍算点（−３×２８＋ｓ）Ａを保持する必要がある。すなわち、インデックス５に対応するエントリをテーブル１０２から省略することはできない。
【０１３２】
同様に、点（−２×２８＋ｓ）Ａは、インデックスが２のエントリのテーブルデータｔａｂ［２］＝（２×２８＋ｓ）Ａからわずかな計算量で計算可能な点（−２×２８−ｓ）Ａとは異なる。したがって、インデックス６に対応するエントリをテーブル１０２から省略することはできない。
【０１３３】
また、点（−１×２８＋ｓ）Ａは、インデックスが１のエントリのテーブルデータｔａｂ［１］＝（１×２８＋ｓ）Ａからわずかな計算量で計算可能な点（−１×２８−ｓ）Ａとは異なる。したがって、インデックス７に対応するエントリをテーブル１０２から省略することもできない。
【０１３４】
以上のとおり、結局、テーブル１０２のエントリ数を削減することはできない。したがって、耐タンパ性とメモリ使用量の抑制を両立させようとする図１の試みは失敗する。換言すれば、ランダム化ウィンドウ法における乱数の使用は、符号つきウィンドウ法の単純な適用を阻害する要素であるから、ランダム化ウィンドウ法と符号つきウィンドウ法を単純に組み合わせようという図１の試みは失敗するのである。
【０１３５】
なお、図２を参照して以上説明した事柄をより一般的に述べれば下記のとおりである。
図１の試みでは、ランダム化ウィンドウ法と同様に、式（５．２）を満たすように式（５．４）により初期ウィンドウ値と補正値が求められる。また、上記のとおり式（５．２）は式（５．３）のように書き換えられる。そして、式（５．３）の括弧の中は式（７．１６）のように書き換えられる。式（７．１６）の右辺は、インデックスｈに対応するエントリのテーブルデータｔａｂ［ｈ］が（２ｂｈ＋ｓ）Ａであることに対応している。
2ki+bw[i]+2kis=2ki(2bw[i]+s)                          (7.16)
【０１３６】
また、あるウィンドウ値ｗ［ｉ］がウィンドウ補正の対象となり、ウィンドウ値ｗ［ｉ＋１］に対してキャリー補正が行われる場合に注目して、省略記号を用いて式（５．３）を書き換えると、式（７．１７）が得られる。
d=c+…+2ki+bw[i]+2kis+2k(i+1)+bw[i+1]+2k(i+1)s+…       (7.17)
【０１３７】
ここで、互いに打ち消しあう−２ｋ（ｉ＋１）＋ｂという項と＋２ｋ（ｉ＋１）＋ｂという項を式（７．１７）の右辺に付け加えると、式（７．１８）が得られる。
d=c+…+2ki+bw[i]-2k(i+1)+b+2kis
+2k(i+1)+bw[i+1]+2k(i+1)+b+2k(i+1)s+…           (7.18)
そして、式（７．１８）を変形すると、式（７．１９）が得られる。
d=c+…+2ki((w[i]-2k)2b+s)+2k(i+1)((w[i+1]+1)2b+s)+…    (7.19)
【０１３８】
式（７．１９）において、（ｗ［ｉ］−２ｋ）はウィンドウ補正後のウィンドウ値を表し、（ｗ［ｉ＋１］＋１）はキャリー補正された１つ上位のウィンドウ値を表す。また、式（７．１９）における（（ｗ［ｉ］−２ｋ）２ｂ＋ｓ）は、「図１の試みでは、ウィンドウ補正後のウィンドウ値をインデックスｈとするテーブルデータとして、（２ｂ（ｈ−２ｋ）＋ｓ）が必要である」ということを示す。
【０１３９】
このように、式（７．１９）における乱数値ｓの符号は、式（７．１６）における乱数値ｓの符号と変わらない。よって、たとえ図１の試みのようにウィンドウ補正とキャリー補正が行われるとしても、乱数値ｓによりテーブルデータがランダム化される限り、テーブルデータは省略することができない。
【０１４０】
つまり、ｈ≧２ｋ−１＋１なるインデックスｈに対応する点（２ｂ（ｈ−２ｋ）＋ｓ）Ａは、テーブルデータｔａｂ［−（ｈ−２ｋ）］＝（−２ｂ（ｈ−２ｋ）＋ｓ）Ａの逆元ではない。よって、たとえウィンドウ補正とキャリー補正が行われるとしても、ｈ≧２ｋ−１＋１なるインデックスｈに対応するテーブルデータｔａｂ［ｈ］＝（２ｂ（ｈ−２ｋ）＋ｓ）Ａは、テーブルから省略することができない。
【０１４１】
図２のテーブル１０２の例は、ｋ＝３の場合について、たとえウィンドウ補正とキャリー補正が行われるとしても、ｈ＝５に対応するテーブルデータｔａｂ［５］がテーブルデータｔａｂ［３]の逆元ではないので省略不能であることを示している。同様に、図２のテーブル１０２の例は、テーブルデータｔａｂ［６］がテーブルデータｔａｂ［２］の逆元ではないので省略不能であることを示している。また、図２のテーブル１０２の例は、テーブルデータｔａｂ［７］がテーブルデータｔａｂ［１］の逆元ではないので省略不能であることも示している。
【０１４２】
以上説明したように、単純素朴にランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせようとする試みは失敗する。そこで、第１〜第３実施形態では、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性と、メモリ使用量の抑制とを両立させるために、図１の試みとは別のアプローチが取られる。
【０１４３】
以下に、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性とメモリ使用量の抑制とを両立するために第１〜第３実施形態で取られるアプローチの概要を、図３〜５を参照しながら説明する。
【０１４４】
図３は、第１〜第３実施形態に共通するアプローチを説明する図である。図３のテーブル１０３は、ウィンドウサイズｋが３であり乱数値ｓのビット長ｂが８の場合の例である。ＤＰＡ攻撃に対する安全性を確保するため、テーブル１０３が保持するテーブルデータは、乱数値ｓによってランダム化される。
【０１４５】
また、図１の試みが失敗する理由は、ウィンドウ補正の結果によらず常に一定の乱数値ｓを用いることにあった。この理由を考慮して、図３のアプローチでは、ウィンドウ値に応じて乱数値ｓの符号を反転する。すなわち、図３のアプローチでは、ウィンドウ補正の結果としてウィンドウ値が負になった場合には、乱数値ｓの符号も合わせて反転する。
【０１４６】
例えば、ｋ＝３の場合、必要に応じてキャリー補正されたウィンドウ値は、５（＝２ｋ−１＋１）以上のときにウィンドウ補正の対象となり、８（＝２ｋ）が減算される。ウィンドウ補正されたウィンドウ値は、結果として負になる。テーブル１０３に示されるように、図３のアプローチでは、こうして負に補正されたウィンドウ値には、元の乱数値ｓではなく、−ｓが対応づけられる。
【０１４７】
例えば、必要に応じてキャリー補正されたウィンドウ値が５のとき、ウィンドウ補正されたウィンドウ値は−３（＝５−８）であり、負である。よって、−３に補正されたウィンドウ値に、＋ｓではなく−ｓによりランダム化された点（−３×２８−ｓ）Ａを対応づけることにより、インデックスが５のエントリを省略することが可能となる。なぜなら、点（−３×２８−ｓ）Ａは点（３×２８＋ｓ）Ａの逆元であり、インデックスが３のエントリのテーブルデータから少ない計算量で計算可能だからである。
【０１４８】
同様に、必要に応じてキャリー補正されたウィンドウ値が６のとき、ウィンドウ補正されたウィンドウ値は−２（＝６−８）であり、負である。よって、−２に補正されたウィンドウ値に点（−２×２８−ｓ）Ａを対応づけることにより、インデックスが６のエントリを省略することが可能となる。なぜなら、点（−２×２８−ｓ）Ａは点（２×２８＋ｓ）Ａの逆元であり、インデックスが２のエントリのテーブルデータから少ない計算量で計算可能だからである。
【０１４９】
同様に、必要に応じてキャリー補正されたウィンドウ値が７のとき、ウィンドウ補正されたウィンドウ値は−１（＝７−８）であり、負である。よって、−１に補正されたウィンドウ値に点（−１×２８−ｓ）Ａを対応づけることにより、インデックスが７のエントリを省略することが可能となる。なぜなら、点（−１×２８−ｓ）Ａは点（１×２８＋ｓ）Ａの逆元であり、インデックスが１のエントリのテーブルデータから少ない計算量で計算可能だからである。
【０１５０】
このように、ウィンドウ補正の対象とならない０以上２ｋ−１以下のウィンドウ値には、乱数値ｓが対応づけられるが、ウィンドウ補正の対象となって負に補正されたウィンドウ値には、符号を反転させた乱数値−ｓが対応づけられる。そこで、以下では、あるウィンドウ値ｗ［ｉ］に対応する乱数値をｓ［ｉ］と表記する。乱数値ｓ［ｉ］は、ｉの値に応じて、＋ｓまたは−ｓのいずれかの値をとる。
【０１５１】
以上のように、ウィンドウ値ｗ［ｉ］に対応する乱数値ｓ［ｉ］を、ウィンドウ値ｗ［ｉ］に応じてｓ［ｉ］＝＋ｓまたはｓ［ｉ］＝−ｓと設定することで、ＤＰＡ攻撃に対する安全性を確保するためのランダム化と、メモリ使用量の抑制が両立可能となる。もちろん、ＳＰＡ攻撃に対する安全性は、ウィンドウの使用により確保される。よって、ある点Ａと個人鍵ｄに対してスカラ倍点ｄＡを求めるのに、図３のテーブル１０３のようなテーブルデータを生成し、生成したテーブルデータに基づいた演算を行う暗号処理装置は、様々な分野に好適である。
【０１５２】
なお、以下では表記の簡略化のため、あるｉに対応するウィンドウ値を「ウィンドウ値ｗ［ｉ］」と表現することもあるし、ウィンドウ列（すなわちウィンドウ値の系列ｗ［ｍ−１］，…，ｗ［１］，ｗ［０］）全体を「ウィンドウ列ｗ［ｉ］」と表現することもある。同様に、乱数値の系列ｓ［ｍ−１］，…，ｓ［１］，ｓ［０］を「乱数列」ともいい、あるｉに対応する乱数値を「乱数値ｓ［ｉ］」と表現することもあるし、乱数列全体を「乱数列ｓ［ｉ］」と表現することもある。
【０１５３】
図４は、以上説明した第１〜第３実施形態でのアプローチを別の観点から図示したものである。すなわち、ｕ（＝ｂ＋ｋｍ）ビットの個人鍵ｄとウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃの間には式（８．１）が成立する。
【数７】
2011121661.tif 000009
【０１５４】
そして、０≦ｉ≦ｍ−１なる各ｉについて、式（８．１）が成立するという制約条件のもとで、ウィンドウ値ｗ［ｉ］に応じて乱数値ｓ［ｉ］が＋ｓまたは−ｓに設定される。すなわち、必要に応じてキャリー補正とウィンドウ補正が行われたウィンドウ値ｗ［ｉ］が０以上ならば、乱数値ｓ［ｉ］は＋ｓに設定されるのが適切である。また、必要に応じてキャリー補正とウィンドウ補正が行われたウィンドウ値ｗ［ｉ］が負ならば、乱数値ｓ［ｉ］は−ｓに設定されるのが適切である。
【０１５５】
以上のように、式（８．１）が成立するという制約条件のもとで、ウィンドウ値ｗ［ｉ］に応じて乱数値ｓ［ｉ］が＋ｓまたは−ｓに設定されると、図３のテーブル１０３のように、ランダム化され、かつエントリ数の少ないテーブルを用いた演算が可能となる。すなわち、ＰＡ攻撃に対する安全性とメモリ使用量の抑制がともに実現される。
【０１５６】
ところが、実際に式（８．１）が成立するという制約条件のもとでウィンドウ値ｗ［ｉ］に応じて乱数値ｓ［ｉ］を＋ｓまたは−ｓと設定しようとすると、循環参照の取り扱いに関する困難が生じる。もちろん、第１〜第３実施形態の暗号処理装置は、その困難を克服するように設計されている。そこで、続いて、第１〜第３実施形態についての理解の助けとするために、上記困難について説明する。
【０１５７】
図３と図４を参照して説明したとおり、各乱数値ｓ［ｉ］は、対応するウィンドウ値ｗ［ｉ］に応じて決まる。換言すれば、乱数列ｓ［ｉ］の値は、ウィンドウ列ｗ［ｉ］の値に依存して決まる。他方で、図５を参照して以下に説明するとおり、ウィンドウ列ｗ［ｉ］の値は、乱数列ｓ［ｉ］の値に依存して決まる。よって、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］は互いに循環参照している。そのため、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］の値を決定する自明な方法はない。
【０１５８】
図５は、ウィンドウ列ｗ［ｉ］の値が乱数列ｓ［ｉ］の値に依存して決まることを説明する図である。図５においても、ウィンドウサイズはｋであり、乱数値ｓのビット長はｂであり、ｍは正整数であり、個人鍵ｄのビット長はｕ＝ｂ＋ｍｋである。よって、各ウィンドウ値ｗ［ｉ］と各乱数値ｓ［ｉ］は符号つきｋビット値であり、補正値ｃは符号つきｂビット値である。
【０１５９】
なお、本明細書において、Ｎが正整数のとき、「符号つきＮビット値」とは、Ｎビットで表される０以上（２Ｎ−１）以下の整数と、正または負の符号との組み合わせによって表される値のことである。よって、符号つきＮビット値は、−（２Ｎ−１）以上（２Ｎ−１）以下である。
【０１６０】
符号つきＮビット値は、符号を示す１ビットと上記Ｎビットをあわせた（Ｎ＋１）ビットにより表すこともできるが、（Ｎ＋１）ビットの２の補数表現とは異なる。例えば、−５の２の補数表現は“１０１１”である。他方、５＝（１０１）２なので、−５を符号つき３ビット値として表すと、−（１０１）２である。
【０１６１】
また、符号つきＮビット値の最上位または最下位の一部のビットのみを取り出す場合、取り出されたビット値の符号は、元の符号つきＮビット値の符号と同じである。例えば、符号つき４ビット値−（１０１１）２の最上位２ビットを取り出すと、−（１０）２＝−２が得られ、符号つき４ビット値−（１０１１）２の最下位２ビットを取り出すと、−（１１）２＝−３が得られる。
【０１６２】
なお、以下の説明では、符号つきＮビット値についても、ビット列のｉビット目を表す記号“［ｉ］”と連結を表す記号“｜｜”を用いる。符号つきＮビット値に関してこれらの記号が用いられる場合、正負の符号も継承される。例えば、ａ＝−（１０１１）２のとき、（ａ［３］｜｜ａ［２］）＝−（１０）２＝−２であり、（ａ［１］｜｜ａ［０］）＝−（１１）２＝−３である。
【０１６３】
図５は、式（８．１）から移項により得られる式（８．２）を表している。
【数８】
2011121661.tif 000010
【０１６４】
式（８．２）の左辺は、各乱数値ｓ［ｉ］をｉｋビット左シフトした値２ｉｋｓ［ｉ］の合計値を個人鍵ｄから減算した結果を表す。また、式（８．２）の右辺は、左辺が示す減算結果の上位ｍｋビットをｋビットずつ区切ることでウィンドウ列ｗ［ｉ］が得られることと、左辺が示す減算結果の下位ｂビットが補正値ｃとなることを示す。
【０１６５】
式（８．１）は式（５．２）および（５．３）と類似しており、式（８．２）は、式（５．３）から得られた式（５．４）と類似している。そして、第３の比較例では、式（５．５）の具体例に示したように、式（５．４）の左辺の値を計算することでウィンドウ列と補正値が一意に得られる。よって、式（８．２）は、一見すると、第３の比較例と同様にして、左辺の値を計算することでウィンドウ列と補正値を一意に導出するための式であるかのように見えるかもしれない。
【０１６６】
しかしながら、式（５．４）と式（８．２）には大きな違いがある。すなわち、式（５．４）では、ウィンドウの位置を示す変数ｉによらず一定の乱数値ｓが使われるのに対して、式（８．２）では、変数ｉによって乱数値ｓ［ｉ］が異なり、乱数値ｓ［ｉ］は＋ｓまたは−ｓである。
【０１６７】
そのため、残念ながら式（８．２）から一意にウィンドウ列と補正値を決定することはできない。つまり、各乱数値ｓ［ｉ］が２つの値をとりうるので、式（８．２）の左辺で個人鍵ｄから減じる値（すなわち各乱数値ｓ［ｉ］をｉｋビット左シフトした値２ｉｋｓ［ｉ］の合計値）には、２ｍ通りのパターンがある。よって、式（８．２）の左辺で個人鍵ｄから減じる値が２ｍ通りのパターンのいずれであるのかが決定されないと、式（８．２）の右辺からウィンドウ列ｗ［ｉ］と補正値ｃの値を確定することはできない。
【０１６８】
例えば、個人鍵ｄのビット長ｕが１６０であり、乱数値のビット長ｂが１０であり、ウィンドウサイズｋが３であるとすると、式（８．３）よりｍ＝５０である。
m=(u-b)/k=(160-10)/3=50                              (8.3)
この場合、式（８．２）の左辺で個人鍵ｄから減じる値は、２５０通りの厖大なパターンのうちの１つである。つまり、この場合、乱数列ｓ［ｉ］は、潜在的に可能な２５０通りのパターンのいずれか１つである。
【０１６９】
したがって、式（８．２）によってウィンドウ列ｗ［ｉ］と補正値ｃを計算しようとすると、乱数列ｓ［ｉ］として潜在的に可能な２５０通りのパターンのうちの１つを選択しない限り、ウィンドウ列ｗ［ｉ］と補正値ｃは得られない。すなわち、ウィンドウ列ｗ［ｉ］の値は乱数列ｓ［ｉ］の値に依存する。
【０１７０】
他方、図３と図４を参照して説明したとおり、乱数列ｓ［ｉ］の値はウィンドウ列ｗ［ｉ］の値に依存する。したがって、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］は互いに循環参照している。
【０１７１】
以上のような循環参照が存在すると、ウィンドウ列ｗ［ｉ］の値と乱数列ｓ［ｉ］の値と補正値ｃを一意に決定する自明な方法は存在しない。このことは、循環参照の存在しない第３の比較例においては式（５．４）に示すごとくウィンドウ列ｗ［ｉ］の値を一意に決定する自明な方法があることと対照的である。第１〜第３実施形態では、循環参照に起因する困難を克服するため、後述の方法にしたがって、ウィンドウ列ｗ［ｉ］の値と乱数列ｓ［ｉ］の値と補正値ｃが決定される。
【０１７２】
以上説明したとおり、第１〜第３実施形態の暗号処理装置は、図３に示したアプローチにしたがいつつ、循環参照に起因する困難を克服してウィンドウ列ｗ［ｉ］の値と乱数列ｓ［ｉ］の値と補正値ｃを決定するという点が共通する。さらに、第１〜第３実施形態の暗号処理装置は、他のいくつかの点でも共通する。そこで、以下では第１〜第３実施形態の暗号処理装置の共通点について図６〜１０を参照して説明し、その後、個々の実施形態について詳細に説明する。
【０１７３】
さて、図６は、第１〜第３実施形態の暗号処理装置の第１のハードウェア構成例を示す図である。
図６の暗号処理装置２００は、Central Processing Unit（ＣＰＵ）２０１、Read Only Memory（ＲＯＭ）２０２、Random Access Memory（ＲＡＭ）２０３、通信回路２０４、および通信インタフェイス（Ｉ／Ｆ）２０５を有する。通信回路２０４は、通信Ｉ／Ｆ２０５を介して他の装置との間で通信を行う。
【０１７４】
そして、ＣＰＵ２０１、ＲＯＭ２０２、ＲＡＭ２０３、および通信回路２０４は、バス２０６により互いに接続されている。また、暗号処理装置２００は、電源端子２０７とグランド端子２０８を有し、暗号処理装置２００内の各部へは、不図示の配線と電源端子２０７を介して電源電圧が供給される。暗号処理装置２００内の各部は、不図示の配線を介してグランド端子２０８とも接続されている。
【０１７５】
ＣＰＵ２０１は、ＲＯＭ２０２に予め記憶されたプログラムをＲＡＭ２０３にロードし、ＲＡＭ２０３をワーキングエリアとして用いながらプログラムを実行することで、各種の処理を行う。例えば、ＣＰＵ２０１は、図９の処理を行う。なお、後述するように、図９の処理は、図１０の処理を含み、図１１、１９または２４の処理も含む。
【０１７６】
なお、ＲＯＭ２０２の代わりにフラッシュメモリなどの他の種類の不揮発性記憶装置が使われてもよい。フラッシュメモリなどの書き換え可能な記憶装置がＲＯＭ２０２の代わりに使われる場合は、プログラムは、通信Ｉ／Ｆ２０５を介して暗号処理装置２００にダウンロードされ、暗号処理装置２００にインストールされてもよい。
【０１７７】
また、暗号処理装置２００は、通信Ｉ／Ｆ２０５を介して他の装置と通信することができる。例えば、暗号処理装置２００は、暗号処理装置２００自身の公開鍵などの情報を、通信Ｉ／Ｆ２０５を介して他の装置に送信してもよいし、他の装置の公開鍵などの情報を、通信Ｉ／Ｆ２０５を介して受信してもよい。
【０１７８】
通信Ｉ／Ｆ２０５の種類は、暗号処理装置２００の種類に応じた任意の種類でよい。例えば、暗号処理装置２００は、スマートカードでもよいし、プリンタカートリッジなどのアクセサリ部品に組み込まれるＬＳＩチップでもよいし、家電製品に組みこまれるＬＳＩチップでもよい。例えば、暗号処理装置２００が接触式スマートカードの場合は、通信Ｉ／Ｆ２０５は通信用端子を含んでもよいし、暗号処理装置２００が非接触式スマートカードの場合は、通信Ｉ／Ｆ２０５はアンテナを含んでもよい。
【０１７９】
通信回路２０４は、通信Ｉ／Ｆ２０５の種類と通信プロトコルに応じて、適宜の処理を行う。例えば、通信回路２０４は、ディジタル・アナログ変換、アナログ・ディジタル変換、変調、復調、符号化、復号などの処理を行ってもよい。
【０１８０】
なお、ＰＡ攻撃を行う攻撃者は、通信Ｉ／Ｆ２０５を介して楕円曲線上の点のデータを暗号処理装置２００に入力し、入力された点に関して暗号処理装置２００が処理を行っているときの消費電力を測定することで、暗号処理装置２００の個人鍵を推測する。例えば、攻撃者は、電源端子２０７に抵抗器を接続することで、消費電力の測定を行う。
【０１８１】
図７は、第１〜第３実施形態の暗号処理装置の第２のハードウェア構成例を示す図である。図７の暗号処理装置２１０は、ＣＰＵ２０１とＲＯＭ２０２の代わりにＥＣＣハードウェア回路２１１を有する。
【０１８２】
また、暗号処理装置２１０は、図６の暗号処理装置２００と同様のＲＡＭ２０３と通信回路２０４と通信Ｉ／Ｆ２０５を有する。そして、暗号処理装置２１０において、ＥＣＣハードウェア回路２１１とＲＡＭ２０３と通信回路２０４は互いにバス２０６で接続されている。また、暗号処理装置２１０にも図６の暗号処理装置２００と同様の電源端子２０７とグランド端子２０８がある。
【０１８３】
暗号処理装置２１０においては、ＲＯＭ２０２からプログラムを読み出して実行するＣＰＵ２０１の代わりに、ＥＣＣハードウェア回路２１１が図９の処理を行う。ＥＣＣハードウェア回路２１１は、例えば、Application Specific Integrated Circuit（ＡＳＩＣ）でもよいし、ＥＣＣハードウェア回路２１１の少なくとも一部がField Programmable Gate Array（ＦＰＧＡ）により実現されていてもよい。また、ＥＣＣハードウェア回路２１１も、不図示の配線により電源端子２０７およびグランド端子２０８と接続されている。
【０１８４】
なお、実施形態によっては、暗号処理装置が、汎用プロセッサとしての図６のＣＰＵ２０１と、ＣＰＵ２０１が実行するプログラムを格納する図６のＲＯＭ２０２と、コプロセッサとしての図７のＥＣＣハードウェア回路２１１を有していてもよい。そして、図９の処理の一部をＣＰＵ２０１が行い、残りの一部をＥＣＣハードウェア回路２１１が行ってもよい。その場合も、暗号処理装置は、図６および図７と同様に、ＲＡＭ２０３と通信回路２０４と通信Ｉ／Ｆ２０５を有する。
【０１８５】
図８は、第１〜第３実施形態の暗号処理装置の機能構成を説明する図である。図８に示す暗号処理装置３００は、図６または図７に例示したハードウェアにより実現されてもよい。
【０１８６】
暗号処理装置３００は処理部３０１を有し、処理部３０１は判断部３０２と決定部３０３を含む。暗号処理装置３００はさらに、個人鍵格納部３０４、乱数生成部３０５、取得部３０６、スカラ倍算部３０７、スカラ倍点情報格納部３０８、ウィンドウ演算部３０９、補正部３１０および結果処理部３１１を有する。
【０１８７】
処理部３０１は、ｕビットの個人鍵ｄとｂビットの乱数値ｓから、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを得るための処理を行う。
処理部３０１内の判断部３０２は、各乱数値ｓ［ｉ］を＋ｓと−ｓのいずれに設定するのが良いかを判断する。判断部３０２の判断基準は、実施形態に応じて異なるので、詳しくは後述する。
【０１８８】
また、処理部３０１内の決定部３０３は、判断部３０２の決定にしたがって、乱数値ｓ［ｉ］とウィンドウ値ｗ［ｉ］と補正値ｃを決定する。そして、決定部３０３は、決定した乱数値ｓ［ｉ］とウィンドウ値ｗ［ｉ］に応じた値（具体的には後述の補正済み差分値ｄｉｆｆ）を、次の乱数値ｓ［ｉ−１］についての判断のために判断部３０２にフィードバックする。また、決定部３０３は、決定したウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、決定した補正値ｃを補正部３１０に出力する。
【０１８９】
また、詳しくは後述するが、第１〜第３実施形態では、処理部３０１が個人鍵ｄに対する前処理を図９のステップＳ１０２で行い、補正部３１０が図９のステップＳ１０９〜Ｓ１１１の後処理を行う。そこで、処理部３０１は、個人鍵ｄのＬＳＢであるｄ［０］を、後処理のために補正部３１０に出力する。
【０１９０】
なお、判断部３０２と決定部３０３を含む処理部３０１は、図６のＣＰＵ２０１によって実現されてもよいし、図７のＥＣＣハードウェア回路２１１によって実現されてもよいし、ＣＰＵ２０１とＥＣＣハードウェア回路２１１の組み合わせにより実現されてもよい。また、処理部３０１がＣＰＵ２０１により実現される場合、判断部３０２を実現するためのプログラムモジュールと決定部３０３を実現するためのプログラムモジュールは、別個のプログラムモジュールでもよいし、あるいは１つに統合されていてもよい。
【０１９１】
また、個人鍵格納部３０４は、個人鍵ｄを格納しており、例えばＲＯＭ２０２により実現される。処理部３０１はこの個人鍵格納部３０４から個人鍵ｄを読み出す。なお、個人鍵ｄは符号なしの（unsigned）正の値である。
【０１９２】
乱数生成部３０５は、ｂビットの乱数値ｓを生成し、乱数値ｓを処理部３０１に出力する。説明の簡単化のため、以下の第１〜第２実施形態の説明では、乱数値ｓが０以上と仮定し、第３実施形態の説明では乱数値ｓが正であると仮定するが、乱数値ｓが負の場合の変形例についても、後述する。乱数生成部３０５は、ＣＰＵ２０１またはＥＣＣハードウェア回路２１１により実現される。
【０１９３】
取得部３０６は、スカラ倍算の対象である楕円曲線上の点Ａのｘｙ座標を取得し、取得した点Ａのｘｙ座標をスカラ倍算部３０７と補正部３１０に出力する。なお、取得部３０６は、暗号処理装置３００の不図示の記憶部から点Ａのｘｙ座標を読み出すことにより点Ａのｘｙ座標を取得してもよいし、外部装置と通信して外部装置から点Ａのｘｙ座標を受信することで点Ａのｘｙ座標を取得してもよい。
【０１９４】
例えば、点Ａは、暗号処理装置３００自身が予め決定したベースポイントでもよい。この場合、取得部３０６は、ベースポイントのｘｙ座標を記憶するための暗号処理装置３００内の不図示の記憶部を参照することで、点Ａのｘｙ座標を取得する。
【０１９５】
ベースポイントのｘｙ座標を記憶する記憶部は、例えばＲＯＭ２０２により実現されてもよい。そして、取得部３０６は、ＲＯＭ２０２からデータを読み出すＣＰＵ２０１またはＥＣＣハードウェア回路２１１により実現されてもよい。
【０１９６】
あるいは、点Ａは、暗号処理装置３００以外の装置から暗号処理装置３００に与えられる点でもよい。例えば、点Ａは、外部装置の公開鍵でもよい。外部装置の公開鍵は、例えば、ＤＨ鍵共有のために外部装置から暗号処理装置３００へと通知されることもあるし、ＤＳＡによる認証のために外部装置から暗号処理装置３００へと通知されることもある。
【０１９７】
点Ａが暗号処理装置３００以外の装置から暗号処理装置３００に与えられる点である場合、取得部３０６は、具体的には、通信Ｉ／Ｆ２０５と通信回路２０４により実現される。すなわち、取得部３０６は、外部装置から点Ａのｘｙ座標を受信することで、点Ａのｘｙ座標を取得する。
【０１９８】
また、スカラ倍算部３０７は、実施形態に応じて適宜に決められた範囲内の各インデックスｈに対して、点（２ｂｈ＋ｓ）Ａのｘｙ座標を計算する。点（２ｂｈ＋ｓ）Ａは、点Ａのスカラ倍点なので、以下では点（２ｂｈ＋ｓ）Ａを表す情報（すなわち点（２ｂｈ＋ｓ）Ａのｘｙ座標）を「スカラ倍点情報」ともいう。スカラ倍算部３０７は、インデックスとスカラ倍点情報をスカラ倍点情報格納部３０８に出力する。スカラ倍算部３０７は、ＣＰＵ２０１により実現されてもよいし、ＥＣＣハードウェア回路２１１により実現されてもよいし、両者の組み合わせにより実現されてもよい。
【０１９９】
また、スカラ倍点情報格納部３０８は、スカラ倍算部３０７が生成したスカラ倍点情報をインデックスと対応づけて格納する。スカラ倍点情報格納部３０８は、ＲＡＭ２０３により実現される。
【０２００】
なお、第１〜３実施形態のスカラ倍点情報格納部３０８は、スカラ倍点情報とインデックスをテーブル形式のデータとして格納するので、以下ではインデックスｈに対応づけられたスカラ倍点情報を、「テーブルデータ」ともいい、ｔａｂ［ｈ］とも表記する。また、テーブルデータｔａｂ［ｈ］は乱数値ｓによりランダム化されているので、以下ではテーブルデータｔａｂ［ｈ］を「ランダム化テーブルデータ」ともいう。
【０２０１】
もちろん、スカラ倍点情報のデータ形式は実施形態に応じて任意であり、テーブル形式以外のデータ形式も利用可能である。例えば、スカラ倍点情報格納部３０８は、単に、ベースアドレスとインデックスｈから一意に決定されるメモリアドレスに点（２ｂｈ＋ｓ）Ａのｘｙ座標を記憶するだけでもよい。つまり、スカラ倍点情報格納部３０８は、点（２ｂｈ＋ｓ）Ａのｘｙ座標をインデックスｈと対応づけて記憶してさえいればよく、インデックスｈ自体を明示的に記憶していなくてもよい。
【０２０２】
また、ウィンドウ演算部３０９は、処理部３０１により得られたウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］を用いて、スカラ倍点情報格納部３０８に格納されたスカラ倍点情報ｔａｂ［ｈ］を参照しながら、ウィンドウを利用した演算を行う。そして、ウィンドウ演算部３０９は、演算結果を補正部３１０に出力する。ウィンドウ演算部３０９は、ＣＰＵ２０１により実現されてもよいし、ＥＣＣハードウェア回路２１１により実現されてもよいし、両者の組み合わせにより実現されてもよい。
【０２０３】
具体的には、ウィンドウ演算部３０９は、処理部３０１により得られたウィンドウ値ｗ［ｉ］またはその符号を反転させた値−ｗ［ｉ］を、インデックスｈとして用いて、スカラ倍点情報格納部３０８を参照する。そして、ウィンドウ演算部３０９は、インデックスｈに対応するスカラ倍点情報ｔａｂ［ｈ］をスカラ倍点情報格納部３０８から読み出し、読み出したスカラ倍点情報ｔａｂ［ｈ］を用いた演算を実行する。ウィンドウ演算部３０９の詳しい動作は図１０とともに後述する。
【０２０４】
補正部３１０は、決定部３０３から入力される補正値ｃと取得部３０６から入力される点Ａのｘｙ座標から、点ｃＡを計算する。そして、補正部３１０は、ウィンドウ演算部３０９からの入力である楕円曲線上の点に点ｃＡを加算し、処理部３０１から通知された個人鍵ｄのＬＳＢであるｄ［０］の値を参照して後処理を行うことで、ウィンドウ演算部３０９の演算結果を補正する。結果として得られる点Ｖは、Ｖ＝ｄＡなる点である。補正部３１０は、点Ｖのｘｙ座標を結果処理部３１１に出力する。
【０２０５】
補正部３１０は、ＣＰＵ２０１により実現されてもよいし、ＥＣＣハードウェア回路２１１により実現されてもよいし、両者の組み合わせにより実現されてもよい。また、詳しくは図９のステップＳ１０７とともに後述するが、補正部３１０は、ローカルなテーブルデータを持つので、補正部３１０を実現するにはＲＡＭ２０３も用いられる。
【０２０６】
結果処理部３１１は、点Ｖのｘｙ座標を用いて適宜の処理を行う。例えば、結果処理部３１１は、点Ｖを他の装置に送信してもよいし、ＤＳＡによる認証のための処理を行ってもよいし、ＤＨ鍵共有のための処理を行ってもよい。結果処理部３１１は、ＣＰＵ２０１により実現されてもよいし、ＥＣＣハードウェア回路２１１により実現されてもよいし、両者の組み合わせにより実現されてもよい。また、処理の内容によっては、結果処理部３１１を実現するために、さらに、通信回路２０４と通信Ｉ／Ｆ２０５などが利用されてもよい。
【０２０７】
例えば、暗号処理装置３００が、ホスト（例えばプリンタなど）により認証されるアクセサリ部品（例えばプリンタカートリッジなど）に含まれる場合、結果処理部３１１は、ホストと通信するための通信回路２０４と通信Ｉ／Ｆ２０５を含む。
【０２０８】
続いて、図９と１０を参照して、第１〜第３実施形態の暗号処理装置３００が共通して行う処理について説明する。
図９は、第１〜第３実施形態の暗号処理装置３００が、個人鍵ｄと点Ａからスカラ倍点Ｖ＝ｄＡを求める処理のフローチャートである。なお、前述のとおり、暗号処理装置３００がスカラ倍点Ｖ＝ｄＡを求める目的は任意であり、換言すれば、結果処理部３１１がスカラ倍点Ｖをどのように利用するかということは任意である。
【０２０９】
ステップＳ１０１で処理部３０１は、個人鍵格納部３０４から個人鍵ｄを読み出す。なお、個人鍵ｄのビット長ｕと乱数値ｓのビット長ｂとウィンドウサイズｋの関係は、正整数ｍを用いて、式（８．４）のように表される。
u=b+km                                                 (8.4)
【０２１０】
したがって、個人鍵ｄは式（８．５）のとおりである。
d=d[u-1]||d[u-2]||…||d[1]||d[0]
=d[b+km-1]||d[b+km-2]||…||d[1]||d[0]                  (8.5)
【０２１１】
次のステップＳ１０２で処理部３０１は前処理を行う。ステップＳ１０２における前処理は、後述のステップＳ１０９〜Ｓ１１１における後処理と対になっている。
【０２１２】
具体的には、処理部３０１は、式（８．６）のように、ＭＳＢが０になるように個人鍵ｄを１ビット右シフトした値ｅを求める。式（８．６）を別の形式で表せば式（８．７）のとおりである。以下では式（８．６）と（８．７）により表される値ｅを、説明の便宜上「ダミー鍵」という。
e=0||d[u-1]||d[u-2]||…||d[1]
=0||d[b+km-1]||d[b+km-2]||…||d[1]                     (8.6)
【数９】
2011121661.tif 000011
【０２１３】
なお、詳しくは後述するが、第１〜第３実施形態では、キャリー補正が行われる。最上位のウィンドウ値ｗ［ｍ−１］に対応して生じるキャリー補正値を適切に処理するためのテクニックはいくつかあり、ステップＳ１０２の前処理とステップＳ１０９〜Ｓ１１１の後処理の組み合わせは、それらのテクニックのうちの一つである。他のテクニックについては後述する。
【０２１４】
式（８．６）の定義より、ダミー鍵ｅは個人鍵ｄと同じくｕビットの長さであり、ダミー鍵ｅのＭＳＢであるｅ［ｕ−１］は必ず０である。ＭＳＢが０であるという性質が、後述のステップＳ１０６の処理の単純化に資するので、第１〜第３実施形態ではステップＳ１０２の前処理が行われる。
【０２１５】
なお、処理部３０１は、ステップＳ１０２においてさらに、個人鍵ｄのＬＳＢであるｄ［０］を補正部３１０に出力する。
【０２１６】
次のステップＳ１０３では、乱数生成部３０５が乱数値ｓを生成し、生成した乱数値ｓを処理部３０１とスカラ倍算部３０７に出力する。そして、処理部３０１が、乱数値ｓを用いて、ダミー鍵ｅからウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを生成する。ステップＳ１０３の詳細は、実施形態に応じて異なり、具体的には図１１、１９、２４とともに後述する。
【０２１７】
第１〜第３実施形態のいずれにおいても、処理部３０１はステップＳ１０３で、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを、乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、式（８．８）が成立するという制約条件下で定める。
【数１０】
2011121661.tif 000012
【０２１８】
なお、式（８．８）は、式（８．１）と似ているが式（８．１）そのものとは異なる。式（８．８）は、ステップＳ１０２での前処理とステップＳ１０９〜Ｓ１１１の後処理の内容を反映している。
【０２１９】
すなわち、第１〜第３実施形態では、式（８．１）の個人鍵ｄをダミー鍵ｅに置き換えた式（８．９）が成立するという制約条件下で、処理部３０１がウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを定める。
【数１１】
2011121661.tif 000013
【０２２０】
ここで、式（８．６）の定義より式（８．１０）が成立する。また、式（８．８）は、式（８．１０）に式（８．９）を代入して得られる。したがって、「式（８．８）と（８．１０）が成立する」という制約条件は、「式（８．９）が成立する」という制約条件と同値である。
d=2e+d[0]                                             (8.10)
【０２２１】
そして、処理部３０１（より詳しくは決定部３０３）は、決定したウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、決定した補正値ｃを補正部３１０に出力する。
【０２２２】
すると、次のステップＳ１０４で取得部３０６は、点Ａのｘｙ座標を取得し、スカラ倍算部３０７と補正部３１０に点Ａのｘｙ座標を出力する。
そして、次のステップＳ１０５でスカラ倍算部３０７は、実施形態に応じて適宜決められた所定範囲内の各インデックスｈについて、乱数値ｓに応じたスカラ倍点情報（具体的には、ランダム化テーブルデータｔａｂ［ｈ］＝（２ｂｈ＋ｓ）Ａ）を生成する。なお、乱数値ｓは、上記のとおり、ステップＳ１０３で乱数生成部３０５により生成されたときに、乱数生成部３０５からスカラ倍算部３０７にも出力されている。
【０２２３】
また、上記所定範囲とは、具体的には、第１実施形態では−２≦ｈ≦２ｋ−１＋１であり、第２実施形態では−１≦ｈ≦２ｋ−１＋１であり、第３実施形態では−１≦ｈ≦２ｋ−１である。
【０２２４】
さらに、ステップＳ１０５でスカラ倍算部３０７は、インデックスｈと対応づけてランダム化テーブルデータｔａｂ［ｈ］をスカラ倍点情報格納部３０８に出力する。すると、スカラ倍点情報格納部３０８は、インデックスｈと対応づけてランダム化テーブルデータｔａｂ［ｈ］を格納する。
【０２２５】
そして、次のステップＳ１０６でウィンドウ演算部３０９は、ウィンドウ列［ｉ］と乱数列ｓ［ｉ］とランダム化テーブルデータｔａｂ［ｈ］を用いて、図１０に示す演算を実行し、計算結果を変数Ｖに格納する。以下、特に混乱のおそれはないので、変数Ｖが表す点を、点Ｖという。ウィンドウ演算部３０９は、図１０の演算の終了後、変数Ｖの内容（すなわち点Ｖのｘｙ座標）を補正部３１０に通知する。
【０２２６】
また、次のステップＳ１０７では、補正部３１０が、補正値ｃと点Ａのｘｙ座標から、点ｃＡのｘｙ座標を計算する。ステップＳ１０７における計算は、第２比較例として説明した単純なウィンドウ法または第４比較例として説明した符号つきウィンドウ法によって行われる。
【０２２７】
ステップＳ１０７におけるウィンドウサイズをｑとすると、補正部３１０は、具体的には、２ｑ個のエントリを有するローカルなテーブルを作成し、作成したテーブルのデータを使って、ウィンドウ法によって点ｃＡのｘｙ座標を計算する。あるいは、補正部３１０は、２ｑ−１＋１個のエントリを有するローカルなテーブルを作成し、作成したテーブルのデータを使って、符号つきウィンドウ法によって点ｃＡのｘｙ座標を計算する。ウィンドウサイズｑは、式（８．４）に“ｋ”として示したウィンドウサイズと同じでもよいし、ウィンドウサイズｋと異なっていてもよい。
【０２２８】
なお、ステップＳ１０７で単純なウィンドウ法または符号つきウィンドウ法が利用される理由は次のとおりである。
たとえ暗号処理装置３００が同じ個人鍵ｄを用いて何度も図９の処理を行うとしても、補正値ｃは、図９の処理が実行されるたびに、乱数値ｓに応じてランダムに変化する。よって、点ｃＡの計算は、ＤＰＡ攻撃に対して安全である。また、上述のとおり、ウィンドウ法と符号つきウィンドウ法はＳＰＡ攻撃に対して安全である。よって、補正部３１０はウィンドウ法または符号つきウィンドウ法によって点ｃＡを計算することで、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性を確保することができる。
【０２２９】
以上のようにして点ｃＡを計算すると、補正部３１０は、次のステップＳ１０８において、ウィンドウ演算部３０９から通知された点Ｖに点ｃＡを加算し、加算の結果を変数Ｖに格納する。ステップＳ１０３で得られたウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃは式（８．９）を満たすので、ステップＳ１０８の処理の結果として得られる点Ｖは、点ｅＡである。
【０２３０】
続くステップＳ１０９〜Ｓ１１１は、ステップＳ１０２の前処理に対応する後処理である。具体的には、ステップＳ１０９で補正部３１０は、点Ｖに対して２倍算を行い、結果として得られた点２Ｖを新たに変数Ｖに格納する。
【０２３１】
そして、次のステップＳ１１０で補正部３１０は、処理部３０１から通知されたビット値ｄ［０］が１であるか否かを判断する。もし、ｄ［０］＝１であれば、処理はステップＳ１１１に移行する。逆に、ｄ［０］＝０であれば、処理はステップＳ１１２に移行する。
【０２３２】
ステップＳ１１１で補正部３１０は、点Ｖに点Ａを加算し、加算の結果を変数Ｖに格納する。
なお、ステップＳ１０９〜Ｓ１１１の後処理の意味を補足すると、次のとおりである。式（８．１０）より式（８．１１）が成り立つ。
dA=(2e+d[0])A=2(eA)+d[0]A                            (8.11)
【０２３３】
そして、上記のとおりステップＳ１０８が終了した時点での点Ｖは、Ｖ＝ｅＡである。よって、ステップＳ１０９の２倍算の結果として得られる点Ｖは、Ｖ＝２（ｅＡ）である。
【０２３４】
また、式（１．７）のスカラ倍算の定義より、ｄ［０］＝０のとき、点ｄ［０］Ａは無限遠点Ｏであり、式（１．３）に示すように無限遠点Ｏは零元である。よって、ｄ［０］＝０のときは、式（８．１１）より、ステップＳ１０９で得られた点Ｖ＝２（ｅＡ）がすなわち点ｄＡである。そのため、上記のステップＳ１１０でｄ［０］＝０と判断された場合、ステップＳ１１１の加算は不要であるから処理はステップＳ１１０からステップＳ１１２へと進む。
【０２３５】
他方、ｄ［０］＝１のとき、点ｄ［０］Ａとは点Ａ自身である。よって、ｄ［０］＝１のときは、式（８．１１）より、ステップＳ１０９で得られた点Ｖ＝２（ｅＡ）に点Ａを加算した点が、点ｄＡである。そのため、上記のステップＳ１１０でｄ［０］＝１と判断された場合、ステップＳ１１１で点Ａの加算が行われ、その後、処理がステップＳ１１２へ進む。
【０２３６】
最後に、ステップＳ１１２で補正部３１０は、点Ｖのｘｙ座標を結果処理部３１１に出力する。こうして出力される点Ｖは、Ｖ＝ｄＡなる点である。
【０２３７】
以上で図９の処理は終了するが、図９のステップの実行順序は実施形態に応じて、適宜変更されてもよい。例えば、ステップＳ１０４での点Ａの取得は、ステップＳ１０５の前でありさえすれば、いつでもよい。また、ステップＳ１０６とＳ１０７の実行順序は逆でもよいし、ステップＳ１０６とＳ１０７が並行して実行されてもよい。
【０２３８】
また、前述のとおりステップＳ１０３の処理は乱数値ｓの生成を含むが、乱数値ｓが生成されてスカラ倍算部３０７に出力された後では、ステップＳ１０３の残りの部分とステップＳ１０５が並行して実行されてもよい。さらに、もし、乱数値ｓの生成後、ステップＳ１０５が完了した後もまだステップＳ１０３の処理が続く場合には、ステップＳ１０３と並行してステップＳ１０６が実行されてもよい。例えば、ウィンドウ演算部３０９がステップＳ１０６でウィンドウ値ｗ［ｉ］と乱数値ｓ［ｉ］を用いて処理を行うのと並行して、処理部３０１がステップＳ１０３でウィンドウ値ｗ［ｉ−Ｍ］と乱数値ｓ［ｉ−Ｍ］を求めてもよい（ただしＭ≧２である）。
【０２３９】
さて、図１０は、第１〜第３実施形態の暗号処理装置が、決定したウィンドウ列ｗ［ｉ］および乱数列ｓ［ｉ］、ならびに生成したスカラ倍点情報を利用して行う演算のフローチャートである。すなわち、図１０は、図９のステップＳ１０６の処理のフローチャートである。なお、具体的なデータが図１０の処理によってどのように処理されるのかについては、図１３、２１、２６とともに後述する。
【０２４０】
さて、ステップＳ２０１でウィンドウ演算部３０９は、変数Ｖを無限遠点Ｏに初期化する。
そして、次のステップＳ２０２でウィンドウ演算部３０９は、ループ変数ｉを（ｍ−１）に初期化する。すなわち、ウィンドウ演算部３０９は、最上位のウィンドウ値ｗ［ｍ−１］に注目する。
【０２４１】
続いて、ステップＳ２０３でウィンドウ演算部３０９は、２倍算の回数を数えるためのループ変数ｊを１に初期化する。
そして、次のステップＳ２０４でウィンドウ演算部３０９は、変数Ｖの示す点Ｖに対して２倍算を行い、２倍算の結果を変数Ｖに格納する。
【０２４２】
次のステップＳ２０５でウィンドウ演算部３０９は、変数ｊの値がウィンドウサイズｋと等しいか否かを判断する。そして、ｊ≠ｋの場合（すなわちｊ＜ｋの場合）、処理はステップＳ２０６に移行し、ｊ＝ｋの場合、処理はステップＳ２０７に移行する。
【０２４３】
ステップＳ２０６でウィンドウ演算部３０９は、変数ｊの値を１だけインクリメントする。そして、処理はステップＳ２０４に戻る。以上のステップＳ２０３〜Ｓ２０６の処理は、２倍算をｋ回連続して行う処理である。
【０２４４】
また、ステップＳ２０７でウィンドウ演算部３０９は、乱数値ｓ［ｉ］が乱数値ｓと等しいか否かを判断する。なお、図９のステップＳ１０３に関して説明したように、各乱数値ｓ［ｉ］は＋ｓまたは−ｓであるから、ステップＳ２０７の判断は、換言すれば、「ｓ［ｉ］＝＋ｓかそれともｓ［ｉ］＝−ｓか」という判断である。
【０２４５】
乱数値ｓが０以上に限定されている実施形態では、ウィンドウ演算部３０９は、乱数値ｓ［ｉ］の符号を参照して「符号が正を示していればｓ［ｉ］＝＋ｓであり、符号が負を示していればｓ［ｉ］＝−ｓである」と判断してもよい。また、負の乱数値ｓを利用する実施形態でも、ウィンドウ演算部３０９は、乱数値ｓの符号と乱数値ｓ［ｉ］の符号を比較するだけで、乱数値ｓ［ｉ］が乱数値ｓと等しいか否かを判断することができる。
【０２４６】
そして、ｓ［ｉ］＝＋ｓの場合、処理はステップＳ２０８に移行し、ｓ［ｉ］＝−ｓの場合、処理はステップＳ２０９に移行する。
ステップＳ２０８でウィンドウ演算部３０９は、ウィンドウ値ｗ［ｉ］をインデックスとして用いてスカラ倍点情報格納部３０８を参照し、ウィンドウ値ｗ［ｉ］に対応するテーブルデータｔａｂ［ｗ［ｉ］］を得る。そして、ウィンドウ演算部３０９は、点Ｖにテーブルデータｔａｂ［ｗ［ｉ］］が表す点を加算し、加算結果を新たな点Ｖとして記憶する。
【０２４７】
すなわち、ステップＳ２０８でウィンドウ演算部３０９は、式（８．１２）の演算を行う。そして、処理はステップＳ２１０へ移行する。
V=V+tab[w[i]]                                          (8.12)
【０２４８】
また、ステップＳ２０９でウィンドウ演算部３０９はウィンドウ値ｗ［ｉ］の符号を反転させた値−ｗ［ｉ］をインデックスとして用いてスカラ倍点情報格納部３０８を参照し、テーブルデータｔａｂ［−ｗ［ｉ］］を得る。そして、ウィンドウ演算部３０９は、テーブルデータｔａｂ［−ｗ［ｉ］］が表す点を点Ｖから減算し、減算結果を新たな点Ｖとして記憶する。換言すれば、ウィンドウ演算部３０９は、テーブルデータｔａｂ［−ｗ［ｉ］］が表す点の逆元を計算し、計算した逆元を点Ｖに加算し、加算結果を新たな点Ｖとして記憶する。
【０２４９】
すなわち、ステップＳ２０９でウィンドウ演算部３０９は、式（８．１３）の演算を行う。そして、処理はステップＳ２１０へ移行する。
V=V-tab[-w[i]]                                         (8.13)
ステップＳ２１０でウィンドウ演算部３０９は、ループ変数ｉの値を１だけデクリメントする。そして、処理はステップＳ２１１に移行する。
【０２５０】
ステップＳ２１１でウィンドウ演算部３０９は、ループ変数ｉの値が０以上であるか否かを判断する。そして、ｉ≧０の場合、まだ最下位のウィンドウ値ｗ［ｉ］と乱数値ｓ［ｉ］の組まで注目し終わっていないので、処理はステップＳ２０３に戻る。他方、ｉ＜０の場合（つまりｉ＝−１の場合）、既にすべてのウィンドウ値ｗ［ｉ］と乱数値ｓ［ｉ］の組に注目し終わっているので、処理はステップＳ２１２に移行する。
【０２５１】
ステップＳ２１２でウィンドウ演算部３０９は、点Ｖを返り値として補正部３１０に出力する。そして、図１０の処理は終了する。
続いて、第１実施形態について説明する。第１実施形態に関しては、まず、図９のステップＳ１０３に相当する図１１の処理を説明する。続いて、個人鍵ｄと乱数値ｓの数値例を含む図１２Ａ〜１３を参照して、図９〜１１の処理の具体例を説明する。図１１の各ステップの意味などについては、図１４〜１６を参照して後述する。
【０２５２】
図１１は、第１実施形態において暗号処理装置３００がウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを決定する処理のフローチャートである。すなわち、図１１は、第１実施形態における、図９のステップＳ１０３のフローチャートである。
【０２５３】
ステップＳ３０１で判断部３０２は、式（９．１）に示すように、符号つき（ｋ＋ｂ）ビット値ｄＨを初期化する。すなわち、判断部３０２は、処理部３０１が得たダミー鍵ｅの先頭の（ｋ＋ｂ）ビットを、符号つき（ｋ＋ｂ）ビット値ｄＨとして設定する。
dH=e[b+km-1]||…||e[k(m-1)]                             (9.1)
【０２５４】
次のステップＳ３０２で乱数生成部３０５は、ｂビットの乱数値ｓを生成し、乱数値ｓを処理部３０１とスカラ倍算部３０７に出力する。なお、説明の簡単化のため、第１実施形態では０≦ｓとする。乱数値ｓが負の場合については、第１実施形態の変形例として後述する。よって、ステップＳ３０２で生成される乱数値ｓは式（９．２）を満たす。
0≦s≦2b-1                                               (9.2)
【０２５５】
次のステップＳ３０３で処理部３０１は、ループ変数ｉを（ｍ−１）に初期化する。そして、処理はステップＳ３０４に移行する。
ステップＳ３０４で処理部３０１内の判断部３０２は、判断基準値（ｄＨ−ｓ）の値を計算し、計算した値が下記の範囲Ｒ１〜Ｒ４のいずれに含まれるかを判断し、判断結果を決定部３０３に通知する。
・範囲Ｒ１：−２ｋ＋ｂ−１以下
・範囲Ｒ２：（−２ｋ＋ｂ−１＋１）以上−１以下
・範囲Ｒ３：０以上（２ｋ＋ｂ−１−１）以下
・範囲Ｒ４：２ｋ＋ｂ−１以上
【０２５６】
そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に含まれるとき、処理はステップＳ３０５に移行し、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に含まれるとき、処理はステップＳ３０８に移行する。また、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に含まれるとき、処理はステップＳ３１０に移行し、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に含まれるとき、処理はステップＳ３１２に移行する。ステップＳ３０４における判断の意味については、図１５〜１６とともに後述する。
【０２５７】
ここで、範囲Ｒ１とＲ２の境界値−２ｋ＋ｂ−１を範囲Ｒ１とＲ２のいずれに含めるか、範囲Ｒ２とＲ３の境界値０を範囲Ｒ２とＲ３のいずれに含めるか、範囲Ｒ３とＲ４の境界値２ｋ＋ｂ−１を範囲Ｒ３とＲ４のいずれに含めるかは、実施形態に応じて任意である。しかし、好ましい定義は、上記のとおりである。なぜなら、上記のように範囲Ｒ１〜Ｒ４を定義することで、以下のような処理の簡略化が可能となり、処理が簡略化される分、判断部３０２がステップＳ３０４を実行するのにかかる時間が短縮化されるという効果が得られるからである。
【０２５８】
すなわち、ステップＳ３０４の処理の簡略化のため、判断部３０２は、判断基準値（ｄＨ−ｓ）の符号と（ｋ＋ｂ−１）番目のビット（すなわちＭＳＢ）の値をチェックすることで、判断基準値（ｄＨ−ｓ）がどの範囲に含まれるかを判断してもよい。
【０２５９】
具体的には、判断基準値（ｄＨ−ｓ）は、符号が負でＭＳＢの値が１ならば、範囲Ｒ１に含まれる。また、判断基準値（ｄＨ−ｓ）は、符号が負でＭＳＢの値が０ならば、範囲Ｒ２に含まれる。そして、判断基準値（ｄＨ−ｓ）は、符号が正でＭＳＢの値が０ならば、範囲Ｒ３に含まれる。また、判断基準値（ｄＨ−ｓ）は、符号が正でＭＳＢの値が１ならば、範囲Ｒ４に含まれる。
【０２６０】
なお、第１実施形態では、個人鍵ｄではなくダミー鍵ｅに対して図１１の処理が行われる。そして、ダミー鍵ｅは、符号なしの正の値である個人鍵ｄから式（８．６）のようにして得られた値なので、０≦e[b+km-1]||…||e[k(m-1)]＝0||…||e[k(m-1)]≦２ｋ＋ｂ−１−１である。よって、判断基準値（ｄＨ−ｓ）の定義から、ｉ＝ｍ−１の場合、判断基準値（ｄＨ−ｓ）は、範囲Ｒ２またはＲ３に含まれる。よって、後述のステップＳ３０７またはＳ３１４におけるキャリー補正は、ｉ＝ｍ−１の場合には生じない。
【０２６１】
第１実施形態は、以上のようにｉ＝ｍ−１の場合のキャリー補正が生じないように保証することで、図９のステップＳ１０６に相当する図１０の処理を簡略化するように設計されている。すなわち、ｉ＝ｍ−１の場合のキャリー補正が生じないと保証されていると、図１０のステップＳ２０１の初期化が、変数Ｖを無限遠点Ｏに設定するという単純な処理で済む。
【０２６２】
換言すれば、第１実施形態では、ダミー鍵ｅを使うことで、最上位のウィンドウ値ｗ［ｍ−１］に対応するキャリー補正値が０になることが保証される。そして、その保証のもとでは、最上位のキャリー補正値に関する処理として妥当なのは、「何もしない」ということである。こうして、第１実施形態では、ダミー鍵ｅの導入にともなう図９のステップＳ１０２の前処理とステップＳ１０９〜Ｓ１１１の後処理により、キャリー補正値の適切な取り扱いが実現される。
【０２６３】
さて、ステップＳ３０５で決定部３０３は、乱数値ｓ［ｉ］を＋ｓと決定する。また、次のステップＳ３０６で決定部３０３は、ウィンドウ補正値ｔ［ｉ］を＋２ｋ＋ｂと決定する。
【０２６４】
そして、続くステップＳ３０７で決定部３０３は、ウィンドウ補正値ｔ［ｉ］＝２ｋ＋ｂの影響を相殺するために、１つ上位のウィンドウ値ｗ［ｉ＋１］に対するキャリー補正を行う。すなわち、決定部３０３は、ウィンドウ値ｗ［ｉ＋１］を１だけデクリメントする。
【０２６５】
以上のステップＳ３０５〜Ｓ３０７の実行順序は任意に入れ換えられてもよく、ステップＳ３０５〜Ｓ３０７は並列に実行されてもよい。ステップＳ３０５〜Ｓ３０７の実行後、処理はステップＳ３１５に移行する。
【０２６６】
また、ステップＳ３０８で決定部３０３は、乱数値ｓ［ｉ］を−ｓと決定する。次のステップＳ３０９で決定部３０３は、ウィンドウ補正値ｔ［ｉ］を０と決定する。
なお、ステップＳ３０８とＳ３０９の実行順序は入れ換えられてもよく、ステップＳ３０８とＳ３０９は並列に実行されてもよい。ステップＳ３０８とＳ３０９の実行後、処理はステップＳ３１５に移行する。
【０２６７】
また、ステップＳ３１０で決定部３０３は、乱数値ｓ［ｉ］を＋ｓと決定する。次のステップＳ３１１で決定部３０３は、ウィンドウ補正値ｔ［ｉ］を０と決定する。
なお、ステップＳ３１０とＳ３１１の実行順序は入れ換えられてもよく、ステップＳ３１０とＳ３１１は並列に実行されてもよい。ステップＳ３１０とＳ３１１の実行後、処理はステップＳ３１５に移行する。
【０２６８】
また、ステップＳ３１２で決定部３０３は、乱数値ｓ［ｉ］を−ｓと決定する。次のステップＳ３１３で決定部３０３は、ウィンドウ補正値ｔ［ｉ］を−２ｋ＋ｂと決定する。
そして、続くステップＳ３１４で決定部３０３は、ウィンドウ補正値ｔ［ｉ］＝−２ｋ＋ｂの影響を相殺するために、１つ上位のウィンドウ値ｗ［ｉ＋１］に対するキャリー補正を行う。すなわち、決定部３０３は、ウィンドウ値ｗ［ｉ＋１］を１だけインクリメントする。
【０２６９】
以上のステップＳ３１２〜Ｓ３１４の実行順序は任意に入れ換えられてもよく、ステップＳ３１２〜Ｓ３１４は並列に実行されてもよい。ステップＳ３１２〜Ｓ３１４の実行後、処理はステップＳ３１５に移行する。
【０２７０】
そして、ステップＳ３１５では、決定部３０３が、式（９．３）に示す符号つき（ｋ＋ｂ）ビット値である補正済み差分値ｄｉｆｆを計算する。また、決定部３０３は、補正済み差分値ｄｉｆｆを判断部３０２にフィードバックする。
diff=dH-s[i]+t[i]                                      (9.3)
【０２７１】
続くステップＳ３１６で決定部３０３は、補正済み差分値ｄｉｆｆの上位ｋビットをウィンドウ値ｗ［ｉ］として設定する。すなわち、ウィンドウ値ｗ［ｉ］は式（９．４）のとおりである。なお、符号つきＮビット値の定義より、ウィンドウ値ｗ［ｉ］の符号は、補正済み差分値ｄｉｆｆの符号に等しい。
w[i]=diff[k+b-1]||…||diff[b]                           (9.4)
【０２７２】
その後、ステップＳ３１７で処理部３０１は、ループ変数ｉの値が０か否かを判断する。ループ変数ｉの値が０でない場合（すなわちｉ＞０の場合）、処理はステップＳ３１８に移行する。他方、ループ変数ｉの値が０の場合、処理はステップＳ３１９に移行する。
【０２７３】
ステップＳ３１８で判断部３０２は、補正済み差分値ｄｉｆｆの下位ｂビットを取り出し、取り出した符号つきｂビット値の２ｋ倍にダミー鍵ｅの（ｋｉ−１）ビット目からｋ（ｉ−１）ビット目までのｋビットを足した値を計算する。そして、判断部３０２は、計算した値を新たに符号つき（ｋ＋ｂ）ビット値ｄＨとして記憶する。すなわち、判断部３０２は、次の判断に備えて、式（９．５）にしたがって符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[b-1]||…||diff[0])2k+(e[ki-1]||…||e[k(i-1)])   (9.5)
【０２７４】
また、ステップＳ３１９で判断部３０２は、補正済み差分値ｄｉｆｆの下位ｂビットを新たに符号つき（ｋ＋ｂ）ビット値ｄＨとして記憶する。すなわち、判断部３０２は、式（９．６）にしたがって符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=diff[b-1]||…||diff[0]                               (9.6)
【０２７５】
ステップＳ３１８またはステップＳ３１９での符号つき（ｋ＋ｂ）ビット値ｄＨの更新後、処理はステップＳ３２０に移行する。そして、ステップＳ３２０で処理部３０１は、ループ変数ｉを１だけデクリメントする。
【０２７６】
また、次のステップＳ３２１で処理部３０１は、ループ変数ｉが０以上か否かを判断する。そして、ｉ≧０の場合、処理はステップＳ３０４に戻り、ｉ＜０の場合、処理はステップＳ３２２に移行する。
【０２７７】
ステップＳ３２２で判断部３０２は、式（９．６）により得た符号つき（ｋ＋ｂ）ビット値ｄＨを決定部３０３に通知する。すると、決定部３０３は、式（９．７）に示すように、符号つき（ｋ＋ｂ）ビット値ｄＨを補正値ｃとして決定する。
c=dH                                                      (9.7)
【０２７８】
そして、次のステップＳ３２３で決定部３０３は、決定したウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、決定した補正値ｃを補正部３１０に出力する。以上で図１１の処理は終了する。
【０２７９】
続いて、具体的な数値を例として図１２Ａ〜１２Ｂを参照して、第１実施形態についてさらに詳しく説明する。
図９のステップＳ１０２で処理部３０１が得たダミー鍵ｅが、式（９．８）に示す１５ビットの値であるとする。なお、式（９．８）に対応する個人鍵ｄの具体例は、図１３とともに後述する。
e=(010110010010101)2=11413                             (9.8)
【０２８０】
続いて、図９のステップＳ１０３に相当する図１１の処理が開始される。なお、図１２Ａ〜１２Ｂの例では、ウィンドウサイズｋは３であり、乱数値ｓのビット長ｂは６であるとする。したがって、式（９．９）のとおりｍ＝３である。
m=(u-b)/k=(15-6)/3=3                                   (9.9)
【０２８１】
図１１の処理が開始されると、ステップＳ３０１で判断部３０２は、式（９．１０）のように符号つき（ｋ＋ｂ）ビット値ｄＨを初期化する。
dH=e[14]||…||e[6]=(010110010)2=178                    (9.10)
【０２８２】
また、ステップＳ３０２で乱数生成部３０５が、ｂ（＝６）ビットの乱数値ｓとして式（９．１１）の値を生成したとする。
s=(001101)2=13                                        (9.11)
すると、続くステップＳ３０３では、処理部３０１が式（９．９）よりループ変数ｉを２（＝ｍ−１）に初期化する。そして、ステップＳ３０４で判断部３０２は、式（９．１０）と（９．１１）より、判断基準値（ｄＨ−ｓ）を式（９．１２）のとおり計算する。
dH-s=178-13=165=(010100101)2=(010 || 100101)2         (9.12)
【０２８３】
式（９．１２）の判断基準値（ｄＨ−ｓ）は正である。また、判断基準値（ｄＨ−ｓ）のＭＳＢは０である。よって、判断基準値（ｄＨ−ｓ）は範囲Ｒ３に属する。
【０２８４】
よって、決定部３０３は、ステップＳ３１０で乱数値ｓ［２］を式（９．１３）のとおり＋ｓに決定し、ステップＳ３１１でウィンドウ補正値ｔ［２］を式（９．１４）のとおり０に決定する。また、ウィンドウ補正値ｔ［２］が０なので、キャリー補正は行われない。
s[2]=+s=13=(001101)2                                  (9.13)
t[2]=0=(0000000000)2                                  (9.14)
【０２８５】
そして、ステップＳ３１５で決定部３０３は、式（９．３）にしたがい、具体的には式（９．１５）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[2]+t[2]
=178-13+0
=165
=2×26+37
=(010100101)2
=(010 || 100101)2                                 (9.15)
【０２８６】
さらに、ステップＳ３１６で決定部３０３は、式（９．１６）のようにウィンドウ値ｗ［２］を計算する。なお、ここで得られるウィンドウ値ｗ［２］は、まだ確定していない。なぜなら、後にループ変数ｉが１となった段階で、キャリー補正によってウィンドウ値ｗ［２］がインクリメントまたはデクリメントされる潜在的可能性があるからである。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2               (9.16)
【０２８７】
また、ｉ＝２なので、処理がステップＳ３１８に進む。ステップＳ３１８で判断部３０２は、式（９．５）にしたがい、具体的には式（９．１７）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=37×23+(010)2
=296+2
=298
=(100101010)2                                       (9.17)
【０２８８】
その後、ステップＳ３２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝１となる。そして、ｉ≧０なので処理はステップＳ３２１からステップＳ３０４に戻る。
【０２８９】
ステップＳ３０４では、判断部３０２が、式（９．１７）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨを用いて、判断基準値（ｄＨ−ｓ）を式（９．１８）のとおり計算する。
dH-s=298-13=285=(100 || 011101)2                      (9.18)
式（９．１８）の判断基準値（ｄＨ−ｓ）は、正であり、ＭＳＢが１である。よって、判断基準値（ｄＨ−ｓ）は範囲Ｒ４に属する。
【０２９０】
よって、決定部３０３は、ステップＳ３１２で乱数値ｓ［１］を式（９．１９）のとおり−ｓに決定し、ステップＳ３１３でウィンドウ補正値ｔ［１］を式（９．２０）のとおり−２ｋ＋ｂに決定する。
s[1]=-s=-13=-(001101)2                                (9.19)
t[1]=-23+6=-512=-(1000000000)2                        (9.20)
【０２９１】
そして、ウィンドウ補正値ｔ［１］が非ゼロなので、ステップＳ３１４で決定部３０３はキャリー補正を行う。すなわち、決定部３０３は、式（９．１６）で求めたウィンドウ値ｗ［２］に１を足す。その結果、ウィンドウ値ｗ［２］は式（９．２１）の値に確定する。
w[2]=2+1=3                                            (9.21)
【０２９２】
さらに、ステップＳ３１５で決定部３０３は、式（９．３）にしたがい、具体的には式（９．２２）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[1]+t[1]
=298+13-512
=-201
=-3×26-9
=-(011001001)2
=-(011 || 001001)2                                (9.22)
【０２９３】
さらに、ステップＳ３１６で決定部３０３は、式（９．２３）のようにウィンドウ値ｗ［１］を計算する。なお、ここで得られるウィンドウ値ｗ［１]は、後にキャリー補正される潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3             (9.23)
【０２９４】
また、ｉ＝１なので処理がステップＳ３１８に進む。そして、ステップＳ３１８で判断部３０２は、式（９．５）にしたがい、具体的には式（９．２４）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-9×23+(101)2
=-72+5
=-67
=-(001000011)2                                      (9.24)
【０２９５】
その後、ステップＳ３２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝０となる。そして、ｉ≧０なので処理はステップＳ３２１からステップＳ３０４に戻る。
【０２９６】
ステップＳ３０４では、判断部３０２が、式（９．２４）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨを用いて、判断基準値（ｄＨ−ｓ）を式（９．２５）のとおり計算する。
dH-s=-67-13=-80=-(001 || 010000)2                     (9.25)
式（９．２５）の判断基準値（ｄＨ−ｓ）は、負であり、ＭＳＢが０である。よって、符号つき（ｋ＋ｂ）ビット値ｄＨは範囲Ｒ２に属する。
【０２９７】
よって、決定部３０３は、ステップＳ３０８で乱数値ｓ［０］を式（９．２６）のとおり−ｓに決定し、ステップＳ３０９でウィンドウ補正値ｔ［０］を式（９．２７）のとおり０に決定する。
s[0]=-s=-13=-(001101)2                                (9.26)
t[0]=0=(0000000000)2                                  (9.27)
【０２９８】
なお、ウィンドウ補正値ｔ［０］が０なので当然キャリー補正も行われない。換言すれば、決定部３０３は、キャリー補正値を暗黙的に０に設定している。よって、１つ上位のウィンドウ値ｗ［１］は、式（９．２３）に示した−３という値に確定する。
【０２９９】
さらに、ステップＳ３１５で決定部３０３は、式（９．３）にしたがい、具体的には式（９．２８）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[0]+t[0]
=-67+13+0
=-54
=-(000 || 110110)2                                (9.28)
【０３００】
さらに、ステップＳ３１６で決定部３０３は、式（９．２９）のようにウィンドウ値ｗ［０］を計算する。なお、ウィンドウ値ｗ［０］は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0       (9.29)
【０３０１】
また、ｉ＝０なので処理がステップＳ３１９に進む。そして、ステップＳ３１９で判断部３０２は、式（９．６）にしたがい、具体的には式（９．３０）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])=-(110110)2=-54               (9.30)
【０３０２】
その後、ステップＳ３２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝−１となる。よって、ｉ＜０なので処理はステップＳ３２１からステップＳ３２２に進む。したがって、ステップＳ３２２で決定部３０３は、式（９．３１）のとおり補正値ｃを得る。
c=dH=-54                                              (9.31)
【０３０３】
最後に、ステップＳ３２３で決定部３０３は、式（９．３２）に示すウィンドウ列ｗ［ｉ］と、式（９．３３）に示す乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、式（９．３１）に示す補正値ｃを補正部３１０に出力する。式（９．３２）は、式（９．２１）、（９．２３）、（９．２９）から明らかであり、式（９．３３）は、式（９．１３）、（９．１９）、（９．２６）から明らかである。
w[2]= 3, w[1]= -3, w[0]=  0                           (9.32)
s[2]=13, s[1]=-13, s[0]=-13                           (9.33)
【０３０４】
以上のようにして、図９のステップＳ１０３に相当する図１１の処理が終了すると、図９のステップＳ１０４で取得部３０６が点Ａのｘｙ座標を取得する。そして、ステップＳ１０５でスカラ倍算部３０７が、−２≦ｈ≦２ｋ−１＋１＝５なる範囲の各インデックスｈについて、乱数ｓ＝１３（式（９．１１）参照）に応じたスカラ倍点情報として、式（９．３４）のランダム化テーブルデータｔａｂ［ｈ］を生成する。
tab[h]=(2bh+s)A=(26h+13)A=(64h+13)A                   (9.34)
【０３０５】
そして、スカラ倍点情報格納部３０８は、生成されたランダム化テーブルデータｔａｂ［ｈ］を、インデックスｈと対応づけて格納する。
【０３０６】
図１３は、以上のようにして得られた、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを示すとともに、スカラ倍点情報格納部３０８がランダム化テーブルデータｔａｂ［ｈ］を保持するテーブル１０４を示す図である。
【０３０７】
図１１〜１２Ｂを参照して上記で説明した処理によれば、図１３に示すとおり、式（８．９）が成立する。具体的には、図１２Ａ〜１２Ｂの例におけるｋ＝３、ｂ＝６、ｍ＝３、ｅ＝１１４１３という値および式（９．３１）〜（９．３３）に示した値を式（８．９）の各変数に代入すると、下記の式（９．３５）が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-54+64×0+1×(-13)+512×(-3)+8×(-13)+4096×3+64×13
=11413                                                 (9.35)
【０３０８】
また、式（９．３４）に示したように、図１３のテーブル１０４には、−２≦ｈ≦５なる範囲の各インデックスｈに対応して、それぞれ、スカラ倍点−１１５Ａ、−５１Ａ、１３Ａ、７７Ａ、１４１Ａ、２０５Ａ、２６９Ａ、３３３Ａのｘｙ座標が記憶されている。
【０３０９】
よって、図９のステップＳ１０６に相当する図１０の処理と、図９のステップＳ１０７〜Ｓ１１１により、式（９．３６）のようにスカラ倍点ｄＡのｘｙ座標が計算される。
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A (9.36)
【０３１０】
すなわち、式（９．３６）における無限遠点Ｏは、図１０のステップＳ２０１の初期化に対応する。また、式（９．３６）における“２３”は、図１０のステップＳ２０３〜Ｓ２０６で行われるｋ（＝３）回の２倍算に対応する。
【０３１１】
そして、式（９．３３）よりｓ［２］＝＋ｓなので、ｉ＝２のときステップＳ２０８が実行され、このことが式（９．３６）における“＋ｔａｂ［ｗ［２］］”に対応する。同様に、式（９．３３）よりｓ［１］＝−ｓなので、ｉ＝１のときステップＳ２０９が実行され、このことが式（９．３６）における“−ｔａｂ［−ｗ［１］］”に対応する。そして、式（９．３３）よりｓ［０］＝−ｓなので、ｉ＝０のときステップＳ２０９が実行され、このことが式（９．３６）における“−ｔａｂ［−ｗ［０］］”に対応する。
【０３１２】
そして、式（９．３６）における“＋ｃＡ”は、図９のステップＳ１０７〜Ｓ１０８に対応する。そして、式（９．３６）の右辺の最初の“２”は、図９のステップＳ１０９の２倍算に対応し、式（９．３６）の“＋ｄ［０］Ａ”は、図９のステップＳ１１０〜Ｓ１１１に対応する。
【０３１３】
なお、この式（９．３６）の右辺において、ステップＳ１０９の２倍算の対象を示す部分を変形すると、次の式（９．３７）が得られる。式（９．３７）も、第１実施形態において式（８．９）が成立することを示している。
23(23(23(O)+tab[3])-tab[3])-tab[0]+cA
=8(8(O+205A)-205A)-13A-54A
=8(1640A-205A)-67A
=8(1435A)-67A
=11413A                                                (9.37)
【０３１４】
そして、図１３に例示するように、式（９．８）のダミー鍵ｅは、式（９．３８）または（９．３９）に示す個人鍵ｄから得られる。図１３には、例として、式（９．３８）の個人鍵ｄを示してある。
d=(101100100101010)2=22826                            (9.38)
d=(101100100101011)2=22827                            (9.39)
【０３１５】
個人鍵ｄが式（９．３８）で示される場合、式（９．３８）よりｄ［０］＝０なので、式（９．３７）を式（９．３６）の右辺に代入すると、式（９．４０）が得られる。
2(11413A)+d[0]A=22826A+O=22826A=dA                  (9.40)
【０３１６】
また、個人鍵ｄが式（９．３９）で示される場合、式（９．３９）よりｄ［０］＝１なので、式（９．３７）を式（９．３６）の右辺に代入すると、式（９．４１）が得られる。
2(11413A)+d[0]A=22826A+A=22827A=dA                    (9.41)
【０３１７】
以上から、第１実施形態によれば、図９〜１１に示した処理により、確かに所望の点ｄＡが得られる。
【０３１８】
さて、第１実施形態では、図９のステップＳ１０５に関して説明したとおり、スカラ倍点情報格納部３０８に格納されるスカラ倍点情報ｔａｂ［ｈ］に対応するインデックスｈの範囲は、−２≦ｈ≦２ｋ−１＋１である。よって、第１実施形態において、スカラ倍点情報格納部３０８が有するテーブルのエントリ数は、（２ｋ−１＋４）個である。
【０３１９】
図１４は、ウィンドウサイズｋが３の場合のテーブルデータのエントリ数に関して、第１実施形態と第３の比較例と第４の比較例を比べる図である。
図１４において、テーブル１０５は、第１実施形態においてスカラ倍点情報格納部３０８がスカラ倍点情報を記憶するためのテーブルである。ｋ＝３なので、テーブル１０５には、−２≦ｈ≦２３−１＋１＝５なる各インデックスｈについて、テーブルデータｔａｂ［ｈ］として点（ｈ×２ｂ＋ｓ）Ａのｘｙ座標が格納されている。つまり、テーブル１０５のエントリ数は８個である。
【０３２０】
また、テーブル１０６は、第４の比較例として説明した符号つきウィンドウ法においてウィンドウサイズｋが３の場合のテーブルである。テーブル１０６には、０≦ｈ≦２３−１＝４なる各インデックスｈについて、テーブルデータｔａｂ［ｈ］として点ｈＡのｘｙ座標が格納されている。つまり、テーブル１０６のエントリ数は５個である。
【０３２１】
また、テーブル１０７は、第３の比較例として説明したランダム化ウィンドウ法においてウィンドウサイズｋが３の場合のテーブルである。テーブル１０７には、０≦ｈ≦２３−１＝７なる各インデックスｈについて、テーブルデータｔａｂ［ｈ］として点（ｈ×２ｂ＋ｓ）Ａのｘｙ座標が格納されている。つまり、テーブル１０７のエントリ数は８個である。
【０３２２】
以上のテーブル１０５〜１０７を比較すると、符号つきウィンドウ法のテーブル１０６は、エントリ数がテーブル１０５より少ない点で有利だが、符号つきウィンドウ法には、ＤＰＡ攻撃に対して脆弱であるという欠点がある。それに対し、第１実施形態によるテーブル１０５は、テーブル１０６と比較すると、ｈ＝−２、ｈ＝−１、ｈ＝２ｋ−１＋１という３つのインデックスに対応する３つのエントリが多い。しかし、第１実施形態は、ＤＰＡ攻撃に対しても安全な方法を提供するという点で、符号つきウィンドウ法よりも優れている。また、エントリ数が２ｋ−１のオーダであるという点では、第１実施形態によるテーブル１０５は、テーブル１０６と同じである。
【０３２３】
また、ランダム化ウィンドウ法のテーブル１０７のエントリ数は２ｋのオーダである。上記のようにｋ＝３の場合にはテーブル１０６と１０７のエントリ数は同じだが、ｋ≧４の場合は、オーダの違いの影響で、第１実施形態のテーブルのエントリ数はランダム化ウィンドウ法のテーブルのエントリ数よりも小さい。よって、第１実施形態は、ＰＡ攻撃に対する安全性とメモリ使用量の抑制をともに実現するという優れた効果を有する。
【０３２４】
ところで、テーブル１０６と比べてテーブル１０５で増加している３つのエントリ、すなわち、ｈ＝−２、ｈ＝−１、ｈ＝２ｋ−１＋１という３つのインデックスに対応するエントリは、乱数により生じる誤差を吸収する役割を果たす。以下では、なぜスカラ倍点情報のインデックスｈの範囲が−２≦ｈ≦２ｋ−１＋１であるのかという理由を、図１１のステップＳ３０４の判断の意味とともに、図１５〜１６を参照しながら説明する。
【０３２５】
上記のとおり、図１１のステップＳ３０４で決定部３０３は、判断基準値（ｄＨ−ｓ）を計算する。この判断基準値（ｄＨ−ｓ）の計算は、意味的には、「乱数値ｓ［ｉ］が＋ｓである」という仮定の下でウィンドウ値ｗ［ｉ］を見積もることに相当する。その理由は次のとおりである。
【０３２６】
前処理を考慮して、図４における個人鍵ｄをダミー鍵ｅに置き換えたうえで図４を解釈すると、符号つき（ｋ＋ｂ）ビット値ｄＨは、図４の（ｗ［ｉ］｜｜ｓ［ｉ］）に相当する。よって、ウィンドウ値ｗ［ｉ］は、符号つき（ｋ＋ｂ）ビット値ｄＨから乱数値ｓ［ｉ］を引いた値の上位ｋビットである。したがって、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、符号つき（ｋ＋ｂ）ビット値ｄＨから乱数値ｓを引いた判断基準値（ｄＨ−ｓ）の上位ｋビットである。
【０３２７】
そして、第１実施形態では、図３に示すように、処理部３０１はウィンドウ値ｗ［ｉ］の絶対値を２ｋ−１以下にしようとし、それにより、スカラ倍点情報格納部３０８のメモリ消費量の抑制が図られる。そこで、第１実施形態の処理部３０１は、具体的には、「乱数値ｓ［ｉ］が＋ｓである」という仮定の下でウィンドウ値ｗ［ｉ］を見積もり、見積もったウィンドウ値ｗ［ｉ］に応じて、仮定が妥当であるか否かを判断する。そして、処理部３０１は、判断の結果に応じて、上記仮定を正式に採用して乱数値ｓ［ｉ］を＋ｓに決定するか、または乱数値ｓ［ｉ］を−ｓと決定する。
【０３２８】
以上説明したようなｓ［ｉ］＝＋ｓという仮定の下での見積もりと、見積もりの結果に応じたウィンドウ値ｗ［ｉ］と乱数値ｓ［ｉ］の決定と、スカラ倍点情報のインデックスｈの範囲の関係について、続いて、図１５〜１６を参照して説明する。
【０３２９】
図１５は、第１実施形態においてスカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。図１５は、ウィンドウサイズｋが２であり、かつ乱数値ｓの長さｂが３である場合の例である。
【０３３０】
図１１のステップＳ３０４に関して説明した範囲Ｒ１〜Ｒ４の定義より、符号つき５（＝ｋ＋ｂ）ビット値である判断基準値（ｄＨ−ｓ）は、式（９．４２）を満たす場合（より具体的には、式（９．４３）を満たす場合）に、範囲Ｒ１に属する。
-2k+b+1≦dH-s≦-2k+b-1                                  (9.42)
-25+1=-(100000)2+1≦dH-s≦-24=-(10000)2                 (9.43)
【０３３１】
図１５には、範囲Ｒ１に属する場合の判断基準値（ｄＨ−ｓ）を、矩形Ｅ１０１により示してある。なお、矩形Ｅ１０１の左端の白丸は、−３２（＝−２５＝−２ｋ＋ｂ）が範囲Ｒ１に含まれないことを示し、矩形Ｅ１０１の右端の黒丸は、−１６（＝−２４＝−２ｋ＋ｂ−１）が範囲Ｒ１に含まれることを示す。他の矩形の左端と右端の白丸または黒丸も、同様の意味を示す。
【０３３２】
また、判断基準値（ｄＨ−ｓ）は、式（９．４４）を満たす場合（より具体的には、式（９．４５）を満たす場合）に、範囲Ｒ２に属する。図１５には、範囲Ｒ２に属する場合の判断基準値（ｄＨ−ｓ）を、矩形Ｅ１０２により示してある。
-2k+b-1+1≦dH-s≦-1                                     (9.44)
-24+1=-(01111)2≦dH-s≦-1=-(00001)2                     (9.45)
【０３３３】
また、判断基準値（ｄＨ−ｓ）は、式（９．４６）を満たす場合（より具体的には、式（９．４７）を満たす場合）に、範囲Ｒ３に属する。図１５には、範囲Ｒ３に属する場合の判断基準値（ｄＨ−ｓ）を、矩形Ｅ１０３により示してある。
0≦dH-s≦2k+b-1-1                                       (9.46)
0≦dH-s≦24-1=(01111)2                                  (9.47)
【０３３４】
また、判断基準値（ｄＨ−ｓ）は、式（９．４８）を満たす場合（より具体的には、式（９．４９）を満たす場合）に、範囲Ｒ４に属する。図１５には、範囲Ｒ４に属する場合の判断基準値（ｄＨ−ｓ）を、矩形Ｅ１０４により示してある。
2k+b-1≦dH-s≦2k+b-1                                    (9.48)
24=(10000)2≦dH-s≦25-1=(11111)2                        (9.49)
【０３３５】
続いて、上記の矩形Ｅ１０１〜Ｅ１０４が示す判断基準値（ｄＨ−ｓ）の範囲とウィンドウ値ｗ［ｉ］の範囲の関係について、範囲Ｒ３、Ｒ１、Ｒ２、Ｒ４の順で、説明していく。
【０３３６】
図１５の矩形Ｅ１０３に示すように、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合、判断基準値（ｄＨ−ｓ）の符号は正であり、判断基準値（ｄＨ−ｓ）のＭＳＢの値は０である。また、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は判断基準値（ｄＨ−ｓ）の上位ｋビットである。よって、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、符号が正であり、絶対値が０以上２ｋ−１未満である。
【０３３７】
つまり、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、ウィンドウ補正の必要がない。したがって、当然キャリー補正値も０である。そして、このように望ましいウィンドウ値ｗ［ｉ］が得られたのだから、ｓ［ｉ］＝＋ｓという仮定は妥当である。そのため、決定部３０３は、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合、図１１のステップＳ３１０〜Ｓ３１１の処理を行う。
【０３３８】
その結果、決定部３０３がステップＳ３１５で計算する補正済み差分値ｄｉｆｆの範囲は、図１５に矩形Ｅ１１３として示すとおり、矩形Ｅ１０３に対応する範囲Ｒ３とまったく同じである。したがって、ステップＳ３１６で補正済み差分値ｄｉｆｆの上位ｋビットとして得られるウィンドウ値ｗ［ｉ］は、０以上２ｋ−１−１以下（図１５のようにｋ＝２の場合、０以上１以下）である。
【０３３９】
また、図１５の矩形Ｅ１０１に示すように、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属する場合、判断基準値（ｄＨ−ｓ）の絶対値は２ｋ＋ｂ−１以上である。つまり、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］の絶対値は、２ｋ−１以上である。よって、この場合、スカラ倍点情報格納部３０８のメモリ使用量を抑えるためには、ウィンドウ補正を行うことが適切である。そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属する場合、判断基準値（ｄＨ−ｓ）の符号は負なので、この場合のウィンドウ補正は、具体的には、正の数を足す補正である。
【０３４０】
そして、符号つきｋビットのウィンドウ値ｗ［ｉ］に対して２ｋを足す補正は、図４、１２Ａ、１２Ｂから理解されるように、符号つき（ｋ＋ｂ）ビット値（ｗ［ｉ］｜｜ｓ［ｉ］）に対して２ｋ＋ｂを足す補正と同じことである。よって、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合、図１１のステップＳ３０６に示すように、決定部３０３はウィンドウ補正値ｔ［ｉ］を２ｋ＋ｂと決定する。なお、この正のウィンドウ補正値ｔ［ｉ］＝２ｋ＋ｂは、１つ上位のウィンドウ値ｗ［ｉ＋１］への負のキャリー補正値（つまり−１）と相殺する。
【０３４１】
そして、判断基準値（ｄＨ−ｓ）にウィンドウ補正値ｔ［ｉ］＝２ｋ＋ｂを足した値は、式（９．４２）より式（９．５０）の範囲に含まれる。
-2k+b+1+2k+b=1≦dH-s+t[i]≦-2k+b-1+2k+b=2k+b-1          (9.50)
【０３４２】
式（９．５０）が示す１以上２ｋ＋ｂ−１以下という範囲は、図１５において矩形Ｅ１１１により示されている。この矩形Ｅ１１１が示す範囲は、両端点を除いて、上述の矩形Ｅ１１３が示す範囲と同じである。つまり、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属する場合、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、ウィンドウ補正値ｔ［ｉ］＝２ｋ＋ｂによって補正されることで、符号が正であり絶対値が２ｋ−１以下という好ましい値になる。
【０３４３】
よって、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属する場合、ｓ［ｉ］＝＋ｓという仮定は妥当である。よって、決定部３０３は、図１１のステップＳ３０５に示すように、正式にｓ［ｉ］＝＋ｓと決定する。また、上記のとおり決定部３０３は、ステップＳ３０６でウィンドウ補正値ｔ［ｉ］を２ｋ＋ｂに決定し、ステップＳ３０７では、ウィンドウ補正値ｔ［ｉ］と相殺するキャリー補正値−１を１つ上位のウィンドウ値ｗ［ｉ＋１］に足す。
【０３４４】
その結果、決定部３０３がステップＳ３１５で計算する補正済み差分値ｄｉｆｆの範囲は、図１５の矩形Ｅ１１１が示す範囲（すなわち上記式（９．５０）の範囲である。よって、ステップＳ３１６で補正済み差分値ｄｉｆｆの上位ｋビットとして得られるウィンドウ値ｗ［ｉ］は、０以上２ｋ−１以下（図１５のようにｋ＝２の場合、０以上２以下）である。
【０３４５】
また、図１５の矩形Ｅ１０２に示すように、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、判断基準値（ｄＨ−ｓ）の符号は負である。そして、上記のとおり、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、判断基準値（ｄＨ−ｓ）の上位ｋビットであるから、やはり負である。
【０３４６】
ここで、第１実施形態で採用される図３のアプローチによれば、処理部３０１は、ウィンドウ値ｗ［ｉ］と乱数値ｓ［ｉ］の符号を揃えようとする。
つまり、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、判断部３０２は、「ｓ［ｉ］＝＋ｓという仮定は、負のウィンドウ値ｗ［ｉ］と適合しない」と判断する。すなわち、判断部３０２は、「ｓ［ｉ］＝＋ｓという仮定が妥当でなかった」と判断する。そこで、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、決定部３０３は、図１１のステップＳ３０８に示すように、乱数値ｓ［ｉ］を−ｓに決定する。
【０３４７】
また、ｓ［ｉ］＝−ｓのとき、式（９．５１）が成立する。そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、式（９．４４）と（９．５１）から、式（９．５２）が得られる。
dH-s[i]=dH+s=(dH-s)+2s                                (9.51)
-2k+b-1+1+2s≦dH-s[i]≦-1+2s                            (9.52)
【０３４８】
図１５において、矩形Ｅ１０２を＋２ｓ移動させた矩形Ｅ１１２は、式（９．５１）の（ｄＨ−ｓ［ｉ］）の範囲（すなわち式（９．５２）が示す範囲）を図示したものである。
【０３４９】
ここで、乱数値ｓは０≦ｓ≦２ｂ−１である。また、ウィンドウサイズｋは２以上の任意の整数である。よって、式（９．５３）が成立する。
0≦2s≦2b+1-2≦2b+k-1-2                                  (9.53)
【０３５０】
式（９．５２）と（９．５３）より、乱数値ｓがいかに大きくても、矩形Ｅ１１２が示す範囲の最大値は２ｋ＋ｂ−１に満たない。また、式（９．５２）と（９．５３）より、乱数値ｓがいかに小さくても、矩形Ｅ１１２が示す範囲の最小値は−２ｋ＋ｂ−１より大きい。したがって、矩形Ｅ１１２が示す範囲に含まれる値のＭＳＢの値は０である。つまり、（ｄＨ−ｓ［ｉ］）の上位ｋビットの絶対値は２ｋ−１未満である。
【０３５１】
よって、（ｄＨ−ｓ［ｉ］）の上位ｋビットが示す値は、ウィンドウ補正をしなくても、絶対値が２ｋ−１未満という、ウィンドウ値ｗ［ｉ］として好適な値である。よって、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、決定部３０３は図１１のステップＳ３０９のとおり、ウィンドウ補正値ｔ［ｉ］を０に設定する。
【０３５２】
そして、ｔ［ｉ］＝０なので、決定部３０３がステップＳ３１５で計算する補正済み差分値ｄｉｆｆの範囲は、図１５の矩形Ｅ１１２が表す範囲と同じである。
ところで、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、上記のように決定部３０３はｓ［ｉ］＝−ｓと決定した。よって、図１０のステップＳ２０７とＳ２０９に示すとおり、ウィンドウ演算部３０９は、ウィンドウ値ｗ［ｉ］ではなく、ウィンドウ値ｗ［ｉ］の符号を反転させた値−ｗ［ｉ］をインデックスとして用いて、スカラ倍点情報格納部３０８を参照する。
【０３５３】
つまり、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合に決定部３０３が決定するウィンドウ値ｗ［ｉ］の符号を反転させた値−ｗ［ｉ］に対応するエントリが、スカラ倍点情報格納部３０８のテーブルには存在しなくてはならない。そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合のウィンドウ値ｗ［ｉ］は、図１５の矩形Ｅ１１２が示す範囲に含まれる値の上位ｋビットである。よって、矩形Ｅ１１２が示す範囲の符号を反転させた範囲に含まれる値の上位ｋビットが、テーブルのインデックスとして使われる。
【０３５４】
図１５では、矩形Ｅ１１２が示す範囲の符号を反転させた範囲を、矩形Ｅ１２２により示している。式（９．５２）とｔ［ｉ］＝０より、式（９．５４）が得られるので、矩形Ｅ１２２が示す範囲は、式（９．５５）のとおりである。
-2k+b-1+1+2s≦dH-s[i]+t[i]=diff≦-1+2s                  (9.54)
-2s+1≦-diff≦2k+b-1-1-2s                               (9.55)
【０３５５】
つまり、式（９．５５）と図１５の矩形Ｅ１２２が示すように、負数の上位ｋビットがインデックスとして使われうる。具体的には、−１がインデックスとして使われうる。その理由は次のとおりである。
【０３５６】
乱数値ｓは０≦ｓ≦２ｂ−１なので、−２ｂ＋１＋２≦−２ｓ≦０である。よって、式（９．５５）における（−２ｓ＋１）が−２ｂ＋１未満になることはないが、（−２ｓ＋１）が−２ｂ未満になることはありうる。そして、−２ｂを符号つき（ｋ＋ｂ）ビット値として表現したビット列の上位ｋビットは、（ｋ−１）ビットの０の後に１というビットが続く、負の符号を持つビット列である。
【０３５７】
したがって、矩形Ｅ１２２が示す範囲に含まれる値の上位ｋビット（すなわちインデックスとして使われる符号つきｋビット値）は、乱数値ｓの値によっては、−１（つまり、符号が負で、（ｋ−１）ビットの０の後に１ビットの１が続くビット列）のこともある。そのため、第１実施形態では、スカラ倍点情報格納部３０８のテーブルには、−１というインデックスに対応づけられたテーブルデータｔａｂ［−１］＝（−１×２ｂ＋ｓ）Ａのエントリが設けられる。
【０３５８】
なお、−０は＋０と等しいので、ウィンドウ値ｗ［ｉ］が０の場合は、乱数値ｓ［ｉ］が−ｓであろうと＋ｓであろうと、ウィンドウ演算部３０９がスカラ倍点情報格納部３０８を参照するのに用いるインデックスは０である。つまり、−ｄｉｆｆ＜０であっても、−ｄｉｆｆの上位ｋビットがすべて０ならば、インデックスは０である（正確には、キャリー補正の影響がない場合には、補正済み差分値ｄｉｆｆの上位ｋビットがすべて０ならば、補正済み差分値ｄｉｆｆの正負によらず、インデックスは０である）。
【０３５９】
また、図１５の矩形Ｅ１０４に示すように、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合、判断基準値（ｄＨ−ｓ）は２ｋ＋ｂ−１以上である。つまり、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］は、２ｋ−１以上である。
【０３６０】
よって、この場合、スカラ倍点情報格納部３０８のメモリ使用量を抑えるためには、ウィンドウ補正を行うことが適切である。そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合、判断基準値（ｄＨ−ｓ）が正なので、この場合のウィンドウ補正は、具体的には、負の数を足す補正である。
【０３６１】
より具体的には、決定部３０３は、図１１のステップＳ３１３に示すように、ウィンドウ補正値ｔ［ｉ］を−２ｋ＋ｂと決定する。この負のウィンドウ補正値ｔ［ｉ］＝−２ｋ＋ｂは、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値（つまり＋１）と相殺する。
【０３６２】
そして、判断基準値（ｄＨ−ｓ）にウィンドウ補正値ｔ［ｉ］＝−２ｋ＋ｂを足した値は、式（９．４８）より式（９．５６）の範囲に含まれる。
2k+b-1-2k+b=-2k+b-1≦dH-s+t[i]≦2k+b-1-2k+b=-1          (9.56)
【０３６３】
式（９．５６）の範囲に含まれるのは負数のみである。そして、ｓ［ｉ］＝＋ｓという仮定の下で見積もられるウィンドウ値ｗ［ｉ］を、絶対値が小さくなるように補正した値は、判断基準値（ｄＨ−ｓ）をウィンドウ補正値ｔ［ｉ］で補正した値の上位ｋビットである。したがって、式（９．５６）が成り立つとき、見積もったウィンドウ値ｗ［ｉ］を補正した値も負である。
【０３６４】
よって、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合と同様に、判断部３０２は、「ｓ［ｉ］＝＋ｓという仮定は、補正されて負となったウィンドウ値ｗ［ｉ］と適合しない」と判断する。すなわち、判断部３０２は、「ｓ［ｉ］＝＋ｓという仮定が妥当でなかった」と判断する。
【０３６５】
そこで、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合、決定部３０３は、図１１のステップＳ３１２に示すように、乱数値ｓ［ｉ］を−ｓに決定する。
また、ｓ［ｉ］＝−ｓのとき、上述の式（９．５１）が成立する。そして、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合、式（９．５１）と（９．５６）から、式（９．５７）が得られる。
-2k+b-1+2s≦dH-s[i]+t[i]≦-1+2s                         (9.57)
【０３６６】
図１５において、矩形Ｅ１０４を（−２ｋ＋ｂ＋２ｓ）移動させた矩形Ｅ１１４は、式（９．５７）の範囲を図示したものである。矩形Ｅ１１４が示す範囲は、左端点以外は矩形Ｅ１１２が示す範囲と同じである。よって、範囲Ｒ２に関する上記の議論と同様の議論が成り立つ。
【０３６７】
すなわち、図１５の矩形Ｅ１２４は、矩形Ｅ１１４が示す範囲の符号を逆転した範囲を示す。そして、矩形Ｅ１２４が示す範囲の上位ｋビットが、テーブルのインデックスとして使われる。具体的には、インデックスとして使われる符号つきｋビット値は、乱数値ｓの値によっては、−１のこともある。
【０３６８】
以上、図１５を参照して説明したとおり、第１実施形態によれば、キャリー補正の影響を考慮しなければ、スカラ倍点情報格納部３０８でインデックスとして使われる値は、−１以上２ｋ−１以下である。したがって、キャリー補正の影響を考慮すれば、スカラ倍点情報格納部３０８でインデックスとして使われる値は、−２以上（２ｋ−１＋１）以下である。そして、図１６は、第１実施形態においてスカラ倍点情報格納部３０８でインデックスとして使われる値についてまとめた図である。なお、図１６も、図１５と同様に、ウィンドウサイズｋが２の場合の例を示す。
【０３６９】
図１６には、図１５と同じく、範囲Ｒ１に対応する矩形Ｅ１１１、範囲Ｒ２に対応する矩形Ｅ１１２とその符号を反転させた矩形Ｅ１２２、範囲Ｒ３に対応する矩形Ｅ１１３、範囲Ｒ４に対応する矩形Ｅ１１４とその符号を反転させた矩形Ｅ１２４を示した。図１５に関して説明したとおり、スカラ倍点情報格納部３０８でインデックスとして使われる値は、矩形Ｅ１１１、Ｅ１２２、Ｅ１１３およびＥ１２４がそれぞれ示す範囲に含まれる値の上位ｋビットである。また、図１６には、乱数値ｓの最大値である（２ｂ−１）の大きさを両矢印で示した。図１６に示すとおり、ウィンドウ値ｗ［ｉ］における大きさ１が、２ｂの大きさに相当するので、乱数値ｓの最大値は、ウィンドウ値ｗ［ｉ］における大きさ１に満たない。
【０３７０】
矩形Ｅ１１１に対応するウィンドウ値ｗ［ｉ］は、そのままインデックスとして使われる。矩形Ｅ１１１に対応するウィンドウ値ｗ［ｉ］は、０以上２ｋ−１以下（ｋ＝２の場合、０以上２以下）である。
【０３７１】
矩形Ｅ１１２に対応するウィンドウ値ｗ［ｉ］は、そのままではインデックスとしては使われず、ウィンドウ値ｗ［ｉ］の符号を反転した値がインデックスとして使われる。すなわち、インデックスとして使われる値は、矩形Ｅ１２２が表す範囲に含まれる値の上位ｋビットである。
【０３７２】
したがって、図１５に関して説明したように、矩形Ｅ１２２に対応してインデックスとして使われる値の最小値は−１である。また、矩形Ｅ１２２に対応してインデックスとして使われる値の最大値は、乱数値ｓに応じて異なるが、（２ｋ−１−１）か（２ｋ−１−２）である。図１６には、ウィンドウサイズｋが２の場合での具体例として、矩形Ｅ１２２に対応してインデックスとして使われる値が−１以上０以下の例が示されている。
【０３７３】
矩形Ｅ１１３に対応するウィンドウ値ｗ［ｉ］は、そのままインデックスとして使われる。矩形Ｅ１１３に対応するウィンドウ値ｗ［ｉ］は、０以上（２ｋ−１−１）以下（ｋ＝２の場合、０以上１以下）である。
【０３７４】
矩形Ｅ１１４に対応するウィンドウ値ｗ［ｉ］は、そのままではインデックスとしては使われず、ウィンドウ値ｗ［ｉ］の符号を反転した値がインデックスとして使われる。すなわち、インデックスとして使われる値は、矩形Ｅ１２４が表す範囲に含まれる値の上位ｋビットである。
【０３７５】
したがって、図１５に関して説明したように、矩形Ｅ１２４に対応してインデックスとして使われる値の最小値は−１である。また、矩形Ｅ１２４に対応してインデックスとして使われる値の最大値は、乱数値ｓに応じて異なるが、ｓ＝０の場合に最も大きく、すなわち２ｋ−１である。図１６には、ウィンドウサイズｋが２の場合での具体例として、矩形Ｅ１２４に対応してインデックスとして使われる値が−１以上０以下の例が示されている。
【０３７６】
以上から、補正済み差分値ｄｉｆｆの上位ｋビットを取り出すことで得られるウィンドウ値ｗ［ｉ］（すなわち、まだキャリー補正されていないウィンドウ値ｗ［ｉ］）に対応するインデックスの範囲は、図１６に示す−１以上２ｋ−１以下の範囲Ｕ１のとおりである。より具体的には、ｋ＝２の場合、範囲Ｕ１は、−１以上２以下の範囲である。
【０３７７】
ところが、補正済み差分値ｄｉｆｆから得られたウィンドウ値ｗ［ｉ］は、後に＋１または−１のキャリー補正値により補正されることがある。よって、実際にスカラ倍点情報格納部３０８のインデックスとして使われる可能性がある値の範囲は、−２以上（２ｋ−１＋１）以下である。
【０３７８】
図１６には、ウィンドウサイズｋが２で乱数値ｓのビット数ｂが３の場合のスカラ倍点情報格納部３０８のテーブルデータを図示してある。すなわち、図１６には、−２≦ｈ≦２ｋ−１＋１＝３なる各インデックスｈと、インデックスｈに対応する値（ｈ×２３＋ｓ）Ａが示されている。
【０３７９】
さて、続いて第２実施形態について説明する。第２実施形態は、スカラ倍点情報格納部３０８のインデックスとして使われる可能性がある値の範囲を第１実施形態よりも狭めることで、さらにメモリの節約を図る実施形態である。
【０３８０】
そこで、第２実施形態に関しては、まず、どのようにしたらインデックスの範囲を狭めることが可能なのかについて、図１７〜１８を参照して説明する。その後、図１９〜２２を参照して第２実施形態における暗号処理装置３００の動作の詳細を説明する。
【０３８１】
図１７は、第２実施形態においてスカラ倍点情報格納部３０８でインデックスとして使われる値についてまとめた図である。図１７の形式は第１実施形態に関する図１６と同様である。以下、図１７と図１６を比較しながら説明する。
【０３８２】
図１６のとおり、第１実施形態においてキャリー補正される前のウィンドウ値ｗ［ｉ］が−１となる可能性がある理由は、判断基準値（ｄＨ−ｓ）が範囲Ｒ２またはＲ４に属するとき、矩形Ｅ１２２またはＥ１２４が示す範囲の最小値が（−２ｓ＋１）だからである。具体的には、乱数値ｓが（２ｂ−１）のときに、補正済み差分値ｄｉｆｆの符号を反転させた−ｄｉｆｆの最小値が最も小さくなる（つまり、矩形Ｅ１２２またはＥ１２４の左端の位置が最も左になる）。すなわち、乱数値ｓが（２ｂ−１）のときに、−ｄｉｆｆの最小値（−２ｓ＋１）が（−２ｂ＋１−１）となる。
【０３８３】
そして、図１６と１７に示すように、ウィンドウ値ｗ［ｉ］における大きさ１は、補正済み差分値ｄｉｆｆにおける２ｂの大きさに相当する。そこで、第１実施形態では、−ｄｉｆｆの最小値が（−２ｂ＋１−１）の場合に対処するため、−１というインデックスに対応するエントリがスカラ倍点情報格納部３０８に作られる。さらに、キャリー補正が行われる場合に備えて、第１実施形態では、−２というインデックスに対応するエントリも、スカラ倍点情報格納部３０８に作られる。
【０３８４】
つまり、キャリー補正がされる前の段階で、ｓ［ｉ］＝−ｓという乱数値に対応してｗ［ｉ］＝１というウィンドウ値が設定され、さらにキャリー補正値が＋１である場合、ｓ［ｉ］＝−ｓという乱数値とｗ［ｉ］＝２というウィンドウ値がペアになる。よって、ウィンドウ演算部３０９は、−ｗ［ｉ］＝−２というインデックスを用いてスカラ倍点情報格納部３０８を参照し、ｔａｂ［−２］＝（−２×２ｂ＋ｓ）Ａなる点を得る。第１実施形態では、このような場合に備えて、スカラ倍算部３０７が、−２なるインデックスに対応するテーブルデータｔａｂ［−２］を生成し、スカラ倍点情報格納部３０８に格納する。
【０３８５】
ところで、図１７に示すように、ウィンドウ値ｗ［ｉ］における大きさ１が、補正済み差分値ｄｉｆｆにおける２ｂの大きさに相当するので、乱数値ｓの最大値は、ウィンドウ値ｗ［ｉ］における大きさ１に満たない。つまり、図１６の矩形Ｅ１２２とＥ１２４は０より左側の部分の大きさが２ｓだが、この０より左側の部分の大きさをｓにすることができれば、１つのエントリ（つまり−２というインデックスに対応するエントリ）の必要性をなくすことができる。
【０３８６】
そこで、第２実施形態では、第１実施形態の図１６の矩形Ｅ１１１、Ｅ１１２、Ｅ１１３、Ｅ１１４が、それぞれ−ｓだけずれた図１７の矩形Ｅ２１１、Ｅ２１２、Ｅ２１３、Ｅ２１４に置き換えられる。
【０３８７】
上記のとおり、乱数値ｓの最大値は、ウィンドウ値ｗ［ｉ］における大きさ１に満たない。よって、０以上２ｋ−１以下のウィンドウ値ｗ［ｉ］に対応する図１６の矩形Ｅ１１１を−ｓずらした図１７の矩形Ｅ２１１に対応するウィンドウ値ｗ［ｉ］の範囲は、ｓ＞０ならば０以上（２ｋ−１−１）以下であり、ｓ＝０ならば０以上２ｋ−１以下である。なお、−０＝＋０＝０なので、補正済み差分値ｄｉｆｆが正でも負でも、その上位ｋビットがすべて０であれば、キャリー補正前のウィンドウ値ｗ［ｉ］は０である。
【０３８８】
そして、図１６の矩形Ｅ１１２を−ｓずらした図１７の矩形Ｅ２１２が示す範囲の符号を反転させた範囲は、図１７において矩形Ｅ２２２により示される。そして、矩形Ｅ２２２が示す範囲の最小値は（−ｓ＋１）である。よって、たとえ乱数値ｓが最大の（２ｂ−１）であったとしても、矩形Ｅ２２２が示す範囲の最小値の上位ｋビットはすべて０である。つまり、矩形Ｅ２２２が−１なるインデックスに対応することはない。
【０３８９】
また、０以上（２ｋ−１−１）以下のウィンドウ値ｗ［ｉ］に対応する図１６の矩形Ｅ１１３を−ｓずらした図１７の矩形Ｅ２１３に対応するウィンドウ値ｗ［ｉ］の範囲は、０以上（２ｋ−１−１）以下である。
【０３９０】
そして、図１６の矩形Ｅ１１４を−ｓずらした図１７の矩形Ｅ２１４が示す範囲の符号を反転させた範囲は、図１７において矩形Ｅ２２４により示される。そして、矩形Ｅ２２４が示す範囲の最小値は（−ｓ＋１）である。よって、たとえ乱数値ｓが最大の（２ｂ−１）であったとしても、矩形Ｅ２２４が示す範囲の最小値の上位ｋビットはすべて０である。つまり、矩形Ｅ２２４が−１なるインデックスに対応することはない。
【０３９１】
以上から、第２実施形態では、補正済み差分値ｄｉｆｆの上位ｋビットを取り出すことで得られるウィンドウ値ｗ［ｉ］（すなわち、まだキャリー補正されていないウィンドウ値ｗ［ｉ］）に対応するインデックスの範囲は、図１７の範囲Ｕ２のとおりである。つまり、範囲Ｕ２は、０以上２ｋ−１以下であり、ｋ＝２の場合、０以上２以下である。
【０３９２】
したがって、キャリー補正を考慮すると、第２実施形態で使われるインデックスは−１以上（２ｋ−１＋１）以下であり、ｋ＝２の場合、−１以上３以下である。図１７には、ウィンドウサイズｋが２で乱数値ｓのビット数ｂが３の場合のスカラ倍点情報格納部３０８のテーブルデータを図示してある。すなわち、図１７には、−１≦ｈ≦２ｋ−１＋１＝３なる各インデックスｈと、インデックスｈに対応する値（ｈ×２３＋ｓ）Ａが示されている。
【０３９３】
さて、続いて、図１７の矩形Ｅ２１１、Ｅ２１２、Ｅ２１３、およびＥ２１４に対応して決定部３０３がウィンドウ値ｗ［ｉ］を決定するためには、具体的には判断部３０２が何を基準にして判断を行えばよいのかを、図１８を参照して説明する。図１８は、第２実施形態においてスカラ倍点情報格納部３０８のインデックスとして使われる値の範囲について模式的に説明する図である。図１８の形式は第１実施形態に関する図１５と同様である。
【０３９４】
結論から述べれば、第２実施形態では、判断部３０２は符号つき（ｋ＋ｂ）ビット値ｄＨそのものを、判断の基準として用いる。そして、符号つき（ｋ＋ｂ）ビット値ｄＨの値が範囲Ｒ１〜Ｒ４のいずれに属するのかに応じて、決定部３０３は異なる処理を行う。
【０３９５】
すなわち、図１８の矩形Ｅ２０１は、範囲Ｒ１に属する場合の符号つき（ｋ＋ｂ）ビット値ｄＨを示す。矩形Ｅ２０１が示す範囲Ｒ１は、式（１０．１）のとおりであり、図１８のようにウィンドウサイズｋが２で乱数値ｓの長さｂが３の場合は、具体的には式（１０．２）のとおりである。
-2k+b+1≦dH≦-2k+b-1                                    (10.1)
-25+1=-(11111)2≦dH≦-24=-(10000)2                      (10.2)
【０３９６】
また、矩形Ｅ２０２は、範囲Ｒ２に属する場合の符号つき（ｋ＋ｂ）ビット値ｄＨを示す。矩形Ｅ２０２が示す範囲Ｒ２は、式（１０．３）のとおりであり、図１８の例では具体的には式（１０．４）のとおりである。
-2k+b-1+1≦dH≦-1                                       (10.3)
-24+1=-(01111)2≦dH≦-1=-(00001)2                       (10.4)
【０３９７】
そして、矩形Ｅ２０３は、範囲Ｒ３に属する場合の符号つき（ｋ＋ｂ）ビット値ｄＨを示す。矩形Ｅ２０３が示す範囲Ｒ３は、式（１０．５）のとおりであり、図１８の例では具体的には式（１０．６）のとおりである。
0≦dH≦2k+b-1-1                                         (10.5)
0≦dH≦24-1=(01111)2                                    (10.6)
【０３９８】
また、矩形Ｅ２０４は、範囲Ｒ４に属する場合の符号つき（ｋ＋ｂ）ビット値ｄＨを示す。矩形Ｅ２０４が示す範囲Ｒ４は、式（１０．７）のとおりであり、図１８の例では具体的には式（１０．８）のとおりである。
2k+b-1≦dH≦2k+b-1                                      (10.7)
24=(10000)2≦dH≦25-1=(11111)2                          (10.8)
【０３９９】
続いて、矩形Ｅ２０１〜Ｅ２０４が示す符号つき（ｋ＋ｂ）ビット値ｄＨの範囲とウィンドウ値ｗ［ｉ］の範囲の関係について、範囲Ｒ３、Ｒ１、Ｒ２、Ｒ４の順で、図１５と比較しながら説明していく。
【０４００】
第１実施形態において、決定部３０３は、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属する場合に、乱数値ｓ［ｉ］を＋ｓに決定し、ウィンドウ補正値ｔ［ｉ］を０に決定する。第２実施形態においては、決定部３０３は、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に属する場合に、同様に乱数値ｓ［ｉ］を＋ｓに決定し、ウィンドウ補正値ｔ［ｉ］を０に決定する。
【０４０１】
ここで、補正済み差分値ｄｉｆｆは、第２実施形態においても第１実施形態の式（９．３）と同様に定義される。よって、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に属する場合、式（１０．５）、ｓ［ｉ］＝＋ｓ、およびｔ［ｉ］＝０から、式（１０．９）が得られる。
0-s+0≦diff=dH-s[i]+t[i]≦2k+b-1-1-s+0                  (10.9)
【０４０２】
そして、式（１０．９）が表す補正済み差分値ｄｉｆｆの範囲は、図１８の矩形Ｅ２１３のとおりである。図１８の矩形Ｅ２１３は図１７の矩形Ｅ２１３と同じであるから、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に属する場合、キャリー補正の影響がなければ、インデックスは図１７に示す所望の範囲Ｕ２に収まる。
【０４０３】
続いて範囲Ｒ１について説明する。第１実施形態では、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属する場合に、決定部３０３は、ウィンドウ補正値ｔ［ｉ］を２ｋ＋ｂと決定し、１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値を−１と決定し、乱数値ｓ［ｉ］を＋ｓに決定する。第２実施形態では、決定部３０３は、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に属する場合に、ウィンドウ補正値ｔ［ｉ］とキャリー補正値と乱数値ｓ［ｉ］を同様に決定する。
【０４０４】
すると、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に属する場合、式（９．３）の補正済み差分値ｄｉｆｆの定義、式（１０．１）、ｓ［ｉ］＝＋ｓ、およびｔ［ｉ］＝２ｋ＋ｂから、式（１０．１０）が得られる。
-2k+b+1-s+2k+b=-s+1≦diff=dH-s[i]+t[i]≦-2k+b-1-s+2k+b=2k+b-1-s (10.10)
【０４０５】
そして、式（１０．１０）が表す補正済み差分値ｄｉｆｆの範囲は、図１８の矩形Ｅ２１１のとおりである。図１８の矩形Ｅ２１１は図１７の矩形Ｅ２１１と同じであるから、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に属する場合も、キャリー補正の影響がなければ、インデックスは図１７に示す所望の範囲Ｕ２に収まる。
【０４０６】
続いて範囲Ｒ２について説明する。第１実施形態では、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合に、決定部３０３は、乱数値ｓ［ｉ］を−ｓに決定し、ウィンドウ補正値ｔ［ｉ］を０に設定する。第２実施形態では、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合に、決定部３０３は、同様に乱数値ｓ［ｉ］を−ｓに決定し、ウィンドウ補正値ｔ［ｉ］を０に設定する。
【０４０７】
すると、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ２に属する場合、式（９．３）の補正済み差分値ｄｉｆｆの定義、式（１０．３）、ｓ［ｉ］＝−ｓ、およびｔ［ｉ］＝０から、式（１０．１１）が得られる。
-2k+b-1+1+s+0≦diff=dH-s[i]+t[i]≦-1+s+0               (10.11)
【０４０８】
そして、式（１０．１１）が表す補正済み差分値ｄｉｆｆの範囲は、図１８の矩形２１２のとおりである。図１８の矩形Ｅ２１２は図１７の矩形Ｅ２１２と同じである。よって、矩形Ｅ２１２が表す式（１０．１１）の範囲の符号を反転させた範囲（すなわち矩形Ｅ２２２が表す範囲）は、式（１０．１２）のとおりである。
-s+1≦-diff≦2k+b-1-1-s                                (10.12)
【０４０９】
よって、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ２に属する場合も、キャリー補正の影響がなければ、インデックスは図１７に示す所望の範囲Ｕ２に収まる。
【０４１０】
続いて範囲Ｒ４について説明する。第１実施形態では、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合に、決定部３０３は、ウィンドウ補正値ｔ［ｉ］を−２ｋ＋ｂと決定し、１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値を＋１と決定し、乱数値ｓ［ｉ］を−ｓと決定する。第２実施形態では、決定部３０３は、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に属する場合に、ウィンドウ補正値ｔ［ｉ］とキャリー補正値と乱数値ｓ［ｉ］を同様に決定する。
【０４１１】
すると、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に属する場合、式（９．３）の補正済み差分値ｄｉｆｆの定義、式（１０．７）、ｓ［ｉ］＝−ｓ、およびｔ［ｉ］＝−２ｋ＋ｂから、式（１０．１３）が得られる。
2k+b-1+s-2k+b=-2k+b-1+s≦diff=dH-s[i]+t[i]≦2k+b-1+s-2k+b=s-1 (10.13)
【０４１２】
そして、式（１０．１３）が表す補正済み差分値ｄｉｆｆの範囲は、図１８の矩形Ｅ２１４のとおりである。図１８の矩形Ｅ２１４は図１７の矩形Ｅ２１４と同じである。よって、矩形Ｅ２１４が表す式（１０．１３）の範囲の符号を反転させた範囲（すなわち矩形Ｅ２２４が表す範囲）は、式（１０．１４）のとおりである。
-s+1≦-diff≦2k+b-1-s                                  (10.14)
【０４１３】
よって、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に属する場合も、キャリー補正の影響がなければ、インデックスは図１７に示す所望の範囲Ｕ２に収まる。
【０４１４】
以上図１６と１７を参照して説明したことをまとめれば、第２実施形態では、判断部３０２が、符号つき（ｋ＋ｂ）ビット値ｄＨから乱数値ｓを引いた値（ｄＨ−ｓ）ではなく、符号つき（ｋ＋ｂ）ビット値ｄＨそのものの値を判断基準として用いる。それにより、第２実施形態では、「−ｓなる乱数値ｓ［ｉ］に対応するウィンドウ値ｗ［ｉ］が、１に設定され、さらにキャリー補正によって２に決定される」という事態が起こらなくなり、スカラ倍点情報格納部３０８のインデックスとして−２は不要となる。つまり、第２実施形態によれば、判断部３０２の判断基準を変えるだけで、スカラ倍点情報格納部３０８のメモリ消費量のさらなる削減が達成される。
【０４１５】
以下では、以上説明した第２実施形態について、さらに具体的に説明する。
図１９は、第２実施形態において暗号処理装置３００がウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを決定する処理のフローチャートである。すなわち、図１９は、第２実施形態における、図９のステップＳ１０３のフローチャートである。
【０４１６】
図１９のステップＳ４０１〜Ｓ４０３は、第１実施形態に関する図１１のステップＳ３０１〜Ｓ３０３と同様であり、ステップＳ４０５〜Ｓ４２３は、図１１のステップＳ４０５〜Ｓ４２３と同様である。よって、これらのステップについては説明を割愛する。
【０４１７】
図１９において、第１実施形態に関する図１１と異なるのは、ステップＳ４０４である。ステップＳ４０４において判断部３０２は、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１〜Ｒ４のいずれに含まれるかを判断する。範囲Ｒ１〜Ｒ４は、第１実施形態と同様に、以下のように定義される。
・範囲Ｒ１：−２ｋ＋ｂ−１以下
・範囲Ｒ２：（−２ｋ＋ｂ−１＋１）以上−１以下
・範囲Ｒ３：０以上（２ｋ＋ｂ−１−１）以下
・範囲Ｒ４：２ｋ＋ｂ−１以上
【０４１８】
そして、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に含まれるとき、処理はステップＳ４０５に移行し、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ２に含まれるとき、処理はステップＳ４０８に移行する。また、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に含まれるとき、処理はステップＳ４１０に移行し、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に含まれるとき、処理はステップＳ４１２に移行する。
【０４１９】
なお、ステップＳ４０４の処理の簡略化のため、判断部３０２は、符号つき（ｋ＋ｂ）ビット値ｄＨの符号とＭＳＢの値をチェックすることで、符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に含まれるかを判断してもよい。
【０４２０】
すなわち、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が負でＭＳＢの値が１ならば、範囲Ｒ１に含まれる。また、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が負でＭＳＢの値が０ならば、範囲Ｒ２に含まれる。そして、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でＭＳＢの値が０ならば、範囲Ｒ３に含まれる。また、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でＭＳＢの値が１ならば、範囲Ｒ４に含まれる。
【０４２１】
続いて、個人鍵ｄと乱数値ｓの数値例を含む図２０Ａ〜２１を参照して、第２実施形態における図９、１０、１９の処理の具体例を説明する。
図９のステップＳ１０２で処理部３０１が得たダミー鍵ｅが、式（１０．１５）に示す１５ビットの値であるとする。なお、式（１０．１５）に対応する個人鍵ｄの具体例は、図２１とともに後述する。
e=(010101011101100)2=10988                           (10.15)
【０４２２】
続いて、図９のステップＳ１０３に相当する図１９の処理が開始される。なお、図２０Ａ〜２０Ｂの例では、ウィンドウサイズｋは３であり、乱数値ｓのビット長ｂは６であるとする。したがって、式（９．９）と同じく、ｍ＝３である。
【０４２３】
図１９の処理が開始されると、ステップＳ４０１で判断部３０２は、式（１０．１６）のように符号つき（ｋ＋ｂ）ビット値ｄＨを初期化する。
dH=e[14]||…||e[6]=(010101011)2=171                   (10.16)
【０４２４】
また、ステップＳ４０２で乱数生成部３０５が、ｂ（＝６）ビットの乱数値ｓとして式（１０．１７）の値を生成したとする。
s=(010010)2=18                                       (10.17)
【０４２５】
すると、続くステップＳ４０３では、処理部３０１がループ変数ｉを２（＝ｍ−１）に初期化する。そして、ステップＳ４０４で判断部３０２は、式（１０．１６）の符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。式（１０．１６）より、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でＭＳＢの値が０なので、範囲Ｒ３に属する。
【０４２６】
よって、決定部３０３は、ステップＳ４１０で乱数値ｓ［２］を式（１０．１８）のとおり＋ｓに決定し、ステップＳ４１１でウィンドウ補正値ｔ［２］を式（１０．１９）のとおり０に決定する。また、ウィンドウ補正値ｔ［２］が０なので、キャリー補正は行われない。
s[2]=+s=18=(010010)2                                 (10.18)
t[2]=0=(0000000000)2                                 (10.19)
【０４２７】
そして、ステップＳ４１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１０．２０）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[2]+t[2]
=171-18+0
=153
=2×26+25
=(010011001)2
=(010 || 011001)2                                (10.20)
【０４２８】
さらに、ステップＳ４１６で決定部３０３は、式（１０．２１）のようにウィンドウ値ｗ［２］を計算する。なお、ここで得られるウィンドウ値ｗ［２］は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2              (10.21)
【０４２９】
また、ｉ＝２なので、処理がステップＳ４１８に進む。ステップＳ４１８で判断部３０２は、式（９．５）にしたがい、具体的には式（１０．２２）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=25×23+(101)2
=200+5
=205
=(011001101)2                                      (10.22)
【０４３０】
その後、ステップＳ４２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝１となる。そして、ｉ≧０なので処理はステップＳ４２１からステップＳ４０４に戻る。
【０４３１】
ステップＳ４０４では、判断部３０２が、式（１０．２２）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でありＭＳＢの値が０なので、範囲Ｒ３に属する。
【０４３２】
よって、決定部３０３は、ステップＳ４１０で乱数値ｓ［１］を式（１０．２３）のとおり＋ｓに決定し、ステップＳ４１１でウィンドウ補正値ｔ［１］を式（１０．２４）のとおり０に決定する。また、ウィンドウ補正値ｔ［１］が０なので、ウィンドウ値ｗ［２］へのキャリー補正は行われず、ウィンドウ値ｗ［２］は式（１０．２１）の値に確定する。
s[1]=+s=18=(010010)2                                 (10.23)
t[1]=0=(0000000000)2                                 (10.24)
【０４３３】
そして、ステップＳ４１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１０．２５）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[1]+t[1]
=205-18+0
=187
=2×26+59
=(010111011)2
=(010 || 111011)2                                (10.25)
【０４３４】
さらに、ステップＳ４１６で決定部３０３は、式（１０．２６）のようにウィンドウ値ｗ［１］を計算する。なお、ここで得られるウィンドウ値ｗ［１］は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=(010)2=2              (10.26)
【０４３５】
また、ｉ＝１なので、処理がステップＳ４１８に進む。ステップＳ４１８で判断部３０２は、式（９．５）にしたがい、具体的には式（１０．２７）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=59×23+(100)2
=472+4
=476
=(111011100)2                                      (10.27)
【０４３６】
その後、ステップＳ４２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝０となる。そして、ｉ≧０なので処理はステップＳ４２１からステップＳ４０４に戻る。
【０４３７】
ステップＳ４０４では、判断部３０２が、式（１０．２７）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でありＭＳＢの値が１なので、範囲Ｒ４に属する。
【０４３８】
よって、決定部３０３は、ステップＳ４１２で乱数値ｓ［０］を式（１０．２８）のとおり−ｓに決定し、ステップＳ４１３でウィンドウ補正値ｔ［０］を式（１０．２９）のとおり−２ｋ＋ｂに決定する。
s[0]=-s=-18=-(010010)2                               (10.28)
t[0]=-2k+b=-29=-(1000000000)2                        (10.29)
【０４３９】
そして、ウィンドウ補正値ｔ［０］が非ゼロなので、ステップＳ４１４で決定部３０３はキャリー補正を行う。すなわち、決定部３０３は、式（１０．２６）で求めたウィンドウ値ｗ［１］に１を足す。その結果、ウィンドウ値ｗ［１］は式（１０．３０）の値に確定する。
w[1]=2+1=3                                           (10.30)
【０４４０】
さらに、ステップＳ４１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１０．３１）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[0]+t[0]
=476+18-512
=-18
=-(000010010)2
=-(000 || 010010)2                               (10.31)
【０４４１】
さらに、ステップＳ４１６で決定部３０３は、式（１０．３２）のようにウィンドウ値ｗ［０］を計算する。なお、ウィンドウ値ｗ［０］は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0      (10.32)
【０４４２】
また、ｉ＝０なので処理がステップＳ４１９に進む。そして、ステップＳ４１９で判断部３０２は、式（９．６）にしたがい、具体的には式（１０．３３）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])=-(010010)2=-18              (10.33)
【０４４３】
その後、ステップＳ４２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝−１となる。よって、ｉ＜０なので処理はステップＳ４２１からステップＳ４２２に進む。したがって、ステップＳ４２２で決定部３０３は、式（１０．３４）のとおり補正値ｃを得る。
c=dH=-18                                             (10.34)
【０４４４】
最後に、ステップＳ４２３で決定部３０３は、式（１０．３５）に示すウィンドウ列ｗ［ｉ］と、式（１０．３６）に示す乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、式（１０．３４）に示す補正値ｃを補正部３１０に出力する。式（１０．３５）は、式（１０．２１）、式（１０．３０）、式（１０．３２）から明らかであり、式（１０．３６）は、式（１０．１８）、式（１０．２３）、式（１０．２８）から明らかである。
w[2]= 2, w[1]= 3, w[0]=  0                           (10.35)
s[2]=18, s[1]=18, s[0]=-18                           (10.36)
【０４４５】
以上のようにして、図９のステップＳ１０３に相当する図１１の処理が終了すると、図９のステップＳ１０４で取得部３０６が点Ａのｘｙ座標を取得する。そして、ステップＳ１０５でスカラ倍算部３０７が、−１≦ｈ≦２ｋ−１＋１＝５なる範囲の各インデックスｈについて、乱数ｓ＝１８（式（１０．１７）参照）に応じたスカラ倍点情報として、式（１０．３７）のランダム化テーブルデータｔａｂ［ｈ］を生成する。
tab[h]=(2bh+s)A=(26h+18)A=(64h+18)A                  (10.37)
【０４４６】
そして、スカラ倍点情報格納部３０８は、生成されたランダム化テーブルデータｔａｂ［ｈ］を、インデックスｈと対応づけて格納する。
【０４４７】
図２１は、以上のようにして得られた、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを示すとともに、スカラ倍点情報格納部３０８がランダム化テーブルデータｔａｂ［ｈ］を保持するテーブル１０８を示す図である。
【０４４８】
図１９〜２０Ｂを参照して上記で説明した処理によれば、図２１に示すとおり、式（８．９）が成立する。具体的には、図１９〜２０Ｂの例におけるｋ＝３、ｂ＝６、ｍ＝３、ｅ＝１０９８８という値および式（１０．３４）〜（１０．３６）に示した値を式（８．９）の各変数に代入すると、下記の式（１０．３８）が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-18+64×0+1×(-18)+512×3+8×18+4096×2+64×18
=10988                                                (10.38)
【０４４９】
また、式（１０．３７）に示したように、図２１のテーブル１０８には、−１≦ｈ≦５なる範囲の各インデックスｈに対応して、それぞれ、スカラ倍点−４６Ａ、１８Ａ、８２Ａ、１４６Ａ、２１０Ａ、２７４Ａ、３３８Ａのｘｙ座標が記憶されている。
【０４５０】
よって、図９のステップＳ１０６に相当する図１０の処理と、図９のステップＳ１０７〜Ｓ１１１により、最終的には、式（１０．３９）のようにスカラ倍点ｄＡのｘｙ座標が計算される。なお、この式（１０．３９）と図９および図１０との対応関係は、第１実施形態の式（９．３６）に関する説明から明らかなので、説明を省略する。
dA=2(23(23(23(O)+tab[w[2]])+tab[w[1]])-tab[-w[0]]+cA)+d[0]A  (10.39)
【０４５１】
そして、この式（１０．３９）の右辺において、ステップＳ１０９の２倍算の対象を示す部分を変形すると、次の式（１０．４０）が得られる。式（１０．４０）も、第２実施形態において式（８．９）が成立することを示している。
23(23(23(O)+tab[2])+tab[3])-tab[0]+cA
=8(8(O+146A)+210A)-18A-18A
=8(1168A+210A)-36A
=8(1378A)-36A
=10988A                                               (10.40)
【０４５２】
そして、図２１に例示するように、式（１０．１５）のダミー鍵ｅは、式（１０．４１）または（１０．４２）に示す個人鍵ｄから得られる。図２１には、例として、式（１０．４２）の個人鍵ｄを示してある。
d=(101010111011000)2=21976                           (10.41)
d=(101010111011001)2=21977                           (10.42)
【０４５３】
個人鍵ｄが式（１０．４１）で示される場合、式（１０．４１）よりｄ［０］＝０なので、式（１０．４０）を式（１０．３９）の右辺に代入すると、式（１０．４３）が得られる。
2(10988A)+d[0]A=21976A+O=21976A=dA                   (10.43)
【０４５４】
また、個人鍵ｄが式（１０．４２）で示される場合、式（１０．４２）よりｄ［０］＝１なので、式（１０．４０）を式（１０．３９）の右辺に代入すると、式（１０．４４）が得られる。
2(10988A)+d[0]A=21976A+A=21977A=dA                   (10.44)
【０４５５】
以上から、第２実施形態によれば、図９、１０、１９に示した処理により、確かに所望の点ｄＡが得られる。
【０４５６】
さて、第２実施形態では、スカラ倍点情報格納部３０８に格納されるスカラ倍点情報ｔａｂ［ｈ］に対応するインデックスｈの範囲は、−１≦ｈ≦２ｋ−１＋１である。よって、第２実施形態において、スカラ倍点情報格納部３０８が有するテーブルのエントリ数は、（２ｋ−１＋３）個である。
【０４５７】
図２２は、ウィンドウサイズｋが３の場合のテーブルデータのエントリ数に関して、第２実施形態と第３の比較例と第４の比較例を比べる図である。
図２２において、テーブル１０６と１０７は図１４と同じである。つまり、テーブル１０６は、第４の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル１０７は第３の比較例として説明したランダム化ウィンドウ法のテーブルである。
【０４５８】
そして、テーブル１０９が、第２実施形態においてスカラ倍点情報格納部３０８がスカラ倍点情報を記憶するためのテーブルである。ｋ＝３なので、テーブル１０９には、−１≦ｈ≦２３−１＋１＝５なる各インデックスｈについて、テーブルデータｔａｂ［ｈ］として点（ｈ×２ｂ＋ｓ）Ａのｘｙ座標が格納されている。つまり、テーブル１０９のエントリ数は７個である。
【０４５９】
以上のテーブル１０６、１０７、１０９を比較すると、第２実施形態のテーブル１０９は、ＰＡ攻撃に対して安全な方法を提供しつつ、テーブル１０６と同様にエントリ数が２ｋ−１のオーダに抑えられているという利点を持つ。つまり、第２実施形態のテーブル１０９は、テーブル１０６と比べて安全性の点で優位であり、テーブル１０７と比べてメモリ消費量が少ない点で優位である。
【０４６０】
さて、続いて第３実施形態について説明する。第３実施形態は、スカラ倍点情報格納部３０８のインデックスとして使われる可能性がある値の範囲を第２実施形態よりも狭めることで、さらにメモリの節約を図る実施形態である。
【０４６１】
そこで、第３実施形態に関しては、まず、どのようにしたらインデックスの範囲を狭めることが可能なのかについて、図２３を参照して説明する。その後、図２４〜２７を参照して第３実施形態における暗号処理装置３００の動作の詳細を説明する。
【０４６２】
図２３は、第３実施形態によるメモリ使用量の削減について説明する図である。以下、図２３を、第２実施形態に関する図１７および１８と比較しながら説明する。
具体的には第３実施形態では、乱数値ｓを非ゼロの値に限定することで、インデックスの範囲が狭まり、スカラ倍点情報格納部３０８のメモリ使用量が減る。乱数値ｓを非ゼロの値に限定することでメモリ使用量が減る理由は、第２実施形態についてｓ＝０の場合とｓ＞０の場合に分けて検討すると、明らかである。以下、図１７、１８、２３を参照して、その理由について説明する。
【０４６３】
図１７と１８において、矩形Ｅ２１１が示す範囲は、式（１０．１０）のとおりであり、矩形Ｅ２１３が示す範囲は、式（１０．９）のとおりである。このように、図１７と１８に示した矩形Ｅ２１１とＥ２１３がそれぞれ表す範囲は、境界値が範囲内に含まれるか否かという点以外は同じである。
【０４６４】
そこで、図示の便宜上、図２３では矩形Ｅ２１１とＥ２１３の代わりに、矩形Ｅ２１１が表す範囲と矩形Ｅ２１３が表す範囲の和（union）を示す矩形を用いることにする。矩形Ｅ２１１が表す範囲と矩形Ｅ２１３が表す範囲の和は、式（１０．９）と（１０．１０）より、式（１１．１）のとおりである。
-s≦diff≦2k+b-1-s                                      (11.1)
【０４６５】
よって、ｓ＝０の場合は、矩形Ｅ２１１が表す範囲と矩形Ｅ２１３が表す範囲の和は、式（１１．１）より式（１１．２）のとおりであり、式（１１．２）の範囲が図２３では矩形Ｅ２３１により表されている。
0≦diff≦2k+b-1                                         (11.2)
【０４６６】
また、ｓ＞０の場合は、矩形Ｅ２１１が表す範囲と矩形Ｅ２１３が表す範囲の和は、式（１１．１）より式（１１．３）のとおりであり、式（１１．３）の範囲が図２３では矩形Ｅ２５１により表されている。
-s≦diff≦2k+b-1-s<2k+b-1                               (11.3)
【０４６７】
また、図１７と１８において、矩形Ｅ２１２が示す範囲は、式（１０．１１）のとおりであり、矩形Ｅ２１４が示す範囲は、式（１０．１３）のとおりである。このように、図１７と１８に示した矩形Ｅ２１２とＥ２１４がそれぞれ表す範囲は、境界値が範囲内に含まれるか否かという点以外は同じである。
【０４６８】
そこで、図示の便宜上、図２３では矩形Ｅ２１２とＥ２１４の代わりに、矩形Ｅ２１２が表す範囲と矩形Ｅ２１４が表す範囲の和を示す矩形を用いることにする。矩形Ｅ２１２が表す範囲と矩形Ｅ２１４が表す範囲の和は、式（１０．１１）と（１０．１３）より、式（１１．４）のとおりである。
-2k+b-1+s≦diff≦s-1                                    (11.4)
【０４６９】
よって、ｓ＝０の場合は、矩形Ｅ２１２が示す範囲と矩形Ｅ２１４が表す範囲の和は、式（１１．４）より式（１１．５）のとおりであり、式（１１．５）の範囲が図２３では矩形Ｅ２３２により表されている。
-2k+b-1≦diff≦-1                                       (11.5)
【０４７０】
したがって、矩形Ｅ２３２が表す式（１１．５）の範囲の符号を反転すると、式（１１．６）のとおりである。式（１１．６）の範囲は、図２３では矩形Ｅ２４２により表されている。
1≦-diff≦2k+b-1                                        (11.6)
【０４７１】
また、ｓ＞０の場合は、矩形Ｅ２１２が示す範囲と矩形Ｅ２１４が表す範囲の和は、図２３では矩形Ｅ２５２により表されている。そして、矩形Ｅ２５２が表す範囲の符号を反転すると、式（１１．７）のとおりである。式（１１．７）の範囲は、図２３では矩形Ｅ２６２により表されている。
-2b<-s+1≦-diff≦2k+b-1-s<2k+b-1                        (11.7)
【０４７２】
したがって、キャリー補正の影響がないと仮定すると、ｓ＝０のときのインデックスの範囲Ｕ３は、式（１１．２）と式（１１．６）より、０以上２ｋ＋ｂ−１以下の（ｋ＋ｂ）ビット値の上位ｋビットがとりうる範囲である。すなわち、範囲Ｕ３は、０以上２ｋ−１以下であり、図２３のようにｋ＝２、ｂ＝３の場合は、０以上２以下である。
【０４７３】
それに対して、キャリー補正の影響がないと仮定した場合におけるｓ＞０のときのインデックスの範囲Ｕ４は、式（１１．３）と式（１１．７）より、−ｓ以上（２ｋ＋ｂ−１−ｓ）以下の（ｋ＋ｂ）ビット値の上位ｋビットがとりうる範囲である。そして、０＜ｓ＜２ｂであり、−０＝＋０＝０なので、範囲Ｕ４は、０以上（２ｋ−１−１）以下であり、図２３のようにｋ＝２、ｂ＝３の場合は、０以上１以下である。
【０４７４】
つまり、乱数値ｓを非ゼロの値に限定することで、キャリー補正前のウィンドウ値に対応するインデックスの範囲から、２ｋ−１が除外される。したがって、キャリー補正を考慮すると、乱数値ｓを非ゼロの値に限定することで（２ｋ−１＋１）というインデックスの必要性をなくせる。よって、乱数値ｓを非ゼロの値に限定することで、スカラ倍点情報格納部３０８のエントリ数が、第２実施形態よりも１つ減る。
【０４７５】
例えば、図２３のようにｋ＝２、ｂ＝３の場合は、ｓ＝０ならば、インデックスの範囲は−１から３（＝２ｋ−１＋１）であり、スカラ倍点情報格納部３０８のテーブルには５つのインデックスに対応する５つのエントリが含まれる。それに対して、ｓ＞０ならば、インデックスの範囲は−１から２（＝２ｋ−１）であり、スカラ倍点情報格納部３０８のテーブルには４つのインデックスに対応する４つのエントリが含まれる。
【０４７６】
このように、第３実施形態によれば、乱数生成部３０５が生成する乱数値ｓを非ゼロの値に限定するだけで、スカラ倍点情報格納部３０８のメモリ消費量のさらなる削減が達成される。
【０４７７】
以下では、以上説明した第３実施形態について、さらに具体的に説明する。
図２４は、第３実施形態において暗号処理装置３００がウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを決定する処理のフローチャートである。すなわち、図２４は、第３実施形態における、図９のステップＳ１０３のフローチャートである。
【０４７８】
図２４のステップＳ５０１は、第２実施形態に関する図１９のステップＳ４０１と同様であり、図２４のステップＳ５０３〜Ｓ５２３は、図１９のステップＳ４０３〜Ｓ４２３と同様である。よって、これらのステップについては説明を割愛する。
【０４７９】
図２４において、第２実施形態に関する図１９と異なるのは、ステップＳ５０２である。ステップＳ５０２において乱数生成部３０５は、ｂビットで、かつ非ゼロの乱数値ｓを生成する。なお、説明の簡単化のため、乱数値ｓは正とする。乱数値ｓが負の場合については、第３実施形態の変形例として後述する。よって、ステップＳ５０２で生成される乱数値ｓは式（１１．８）を満たす。
0<s≦2b-1                                              (11.8)
【０４８０】
続いて、図２５Ａ〜２６を参照して、第３実施形態における図９、１０、２４の処理の具体例を説明する。
【０４８１】
図９のステップＳ１０２で処理部３０１が得たダミー鍵ｅが、式（１１．９）に示す１５ビットの値であるとする。なお、式（１１．９）に対応する個人鍵ｄの具体例は、図２６とともに後述する。
e=(011001000111110)2=12862                            (11.9)
【０４８２】
続いて、図９のステップＳ１０３に相当する図２４の処理が開始される。なお、図２５Ａ〜２６の例では、ウィンドウサイズｋは３であり、乱数値ｓのビット長ｂは６であるとする。したがって、式（９．９）と同じく、ｍ＝３である。
【０４８３】
図２４の処理が開始されると、ステップＳ５０１で判断部３０２は、式（１１．１０）のように符号つき（ｋ＋ｂ）ビット値ｄＨを初期化する。
dH=e[14]||…||e[6]=(011001000)2=200                   (11.10)
【０４８４】
また、ステップＳ５０２で乱数生成部３０５が、ｂ（＝６）ビットの非ゼロの乱数値ｓとして式（１１．１１）の値を生成したとする。
s=(100110)2=38                                       (11.11)
【０４８５】
すると、続くステップＳ５０３では、処理部３０１がループ変数ｉを２（＝ｍ−１）に初期化する。そして、ステップＳ５０４で判断部３０２は、式（１１．１０）の符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。式（１１．１０）より、符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でＭＳＢの値が０なので、範囲Ｒ３に属する。
【０４８６】
よって、決定部３０３は、ステップＳ５１０で乱数値ｓ［２］を式（１１．１２）のとおり＋ｓに決定し、ステップＳ５１１でウィンドウ補正値ｔ［２］を式（１１．１３）のとおり０に決定する。また、ウィンドウ補正値ｔ［２］が０なので、キャリー補正は行われない。
s[2]=+s=38=(100110)2                                 (11.12)
t[2]=0=(0000000000)2                                 (11.13)
【０４８７】
そして、ステップＳ５１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１１．１４）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[2]+t[2]
=200-38+0
=162
=2×26+34
=(010100010)2
=(010 || 100010)2                                (11.14)
【０４８８】
さらに、ステップＳ５１６で決定部３０３は、式（１１．１５）のようにウィンドウ値ｗ［２］を計算する。なお、ここで得られるウィンドウ値ｗ［２］は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2              (11.15)
【０４８９】
また、ｉ＝２なので、処理がステップＳ５１８に進む。ステップＳ５１８で判断部３０２は、式（９．５）にしたがい、具体的には式（１１．１６）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=34×23+(111)2
=272+7
=279
=(100010111)2                                      (11.16)
【０４９０】
その後、ステップＳ５２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝１となる。そして、ｉ≧０なので処理はステップＳ５２１からステップＳ５０４に戻る。
【０４９１】
ステップＳ５０４では、判断部３０２が、式（１１．１６）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が正でありＭＳＢの値が１なので、範囲Ｒ４に属する。
【０４９２】
よって、決定部３０３は、ステップＳ５１２で乱数値ｓ［１］を式（１１．１７）のとおり−ｓに決定し、ステップＳ５１３でウィンドウ補正値ｔ［１］を式（１１．１８）のとおり−２ｋ＋ｂに決定する。
s[1]=-s=-38=-(100110)2                               (11.17)
t[1]=-2k+b=-29=-(1000000000)2                        (11.18)
【０４９３】
そして、ウィンドウ補正値ｔ［１］が非ゼロなので、ステップＳ５１４で決定部３０３はキャリー補正を行う。すなわち、決定部３０３は、式（１１．１５）で求めたウィンドウ値ｗ［２］に１を足す。その結果、ウィンドウ値ｗ［２］は式（１１．１９）の値に確定する。
w[2]=2+1=3                                           (11.19)
【０４９４】
さらに、ステップＳ５１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１１．２０）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[1]+t[1]
=279+38-512
=-195
=-3×26-3
=-(011000011)2
=-(011 || 000011)2                               (11.20)
【０４９５】
そして、ステップＳ５１６で決定部３０３は、式（１１．２１）のようにウィンドウ値ｗ［１］を計算する。なお、ここで得られるウィンドウ値ｗ［１］は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3            (11.21)
【０４９６】
また、ｉ＝１なので、処理がステップＳ５１８に進む。ステップＳ５１８で判断部３０２は、式（９．５）にしたがい、具体的には式（１１．２２）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-3×23+(110)2
=-24+6
=-18
=-(000010010)2                                     (11.22)
【０４９７】
その後、ステップＳ５２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝０となる。そして、ｉ≧０なので処理はステップＳ５２１からステップＳ５０４に戻る。
【０４９８】
ステップＳ５０４では、判断部３０２が、式（１１．２２）のように更新された符号つき（ｋ＋ｂ）ビット値ｄＨがどの範囲に属するかを判断する。符号つき（ｋ＋ｂ）ビット値ｄＨは、符号が負でありＭＳＢの値が０なので、範囲Ｒ２に属する。
【０４９９】
よって、決定部３０３は、ステップＳ５０８で乱数値ｓ［０］を式（１１．２３）のとおり−ｓに決定し、ステップＳ５０９でウィンドウ補正値ｔ［０］を式（１１．２４）のとおり０に決定する。また、ウィンドウ補正値ｔ［０］が０なので、ウィンドウ値ｗ［１］へのキャリー補正は行われず、ウィンドウ値ｗ［１］は式（１１．２１）の値に確定する。
s[0]=-s=-38=-(100110)2                               (11.23)
t[0]=0=(0000000000)2                                 (11.24)
【０５００】
そして、ステップＳ５１５で決定部３０３は、式（９．３）にしたがい、具体的には式（１１．２５）のようにして、補正済み差分値ｄｉｆｆを計算する。
diff=dH-s[0]+t[0]
=-18+38+0
=20
=(000010100)2
=(000 || 010100)2                                (11.25)
【０５０１】
さらに、ステップＳ５１６で決定部３０３は、式（１１．２６）のようにウィンドウ値ｗ［０］を計算する。なお、ウィンドウ値ｗ［０］は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=(000)2=0              (11.26)
【０５０２】
また、ｉ＝０なので処理がステップＳ５１９に進む。そして、ステップＳ５１９で判断部３０２は、式（９．６）にしたがい、具体的には式（１１．２７）のようにして、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[5]||…||diff[0])=(010100)2=20                (11.27)
【０５０３】
その後、ステップＳ５２０で処理部３０１がループ変数ｉをデクリメントするのでｉ＝−１となる。よって、ｉ＜０なので処理はステップＳ５２１からステップＳ５２２に進む。したがって、ステップＳ５２２で決定部３０３は、式（１１．２８）のとおり補正値ｃを得る。
c=dH=20                                              (11.28)
【０５０４】
最後に、ステップＳ５２３で決定部３０３は、式（１１．２９）に示すウィンドウ列ｗ［ｉ］と、式（１１．３０）に示す乱数列ｓ［ｉ］をウィンドウ演算部３０９に出力し、式（１１．２８）に示す補正値ｃを補正部３１０に出力する。式（１１．２９）は、式（１１．１９）、式（１１．２１）、式（１１．２６）から明らかであり、式（１１．３０）は、式（１１．１２）、式（１１．１７）、式（１１．２３）から明らかである。
w[2]= 3, w[1]= -3, w[0]= 0                           (11.29)
s[2]=38, s[1]=-38, s[0]=-38                          (11.30)
【０５０５】
以上のようにして、図９のステップＳ１０３に相当する図１１の処理が終了すると、図９のステップＳ１０４で取得部３０６が点Ａのｘｙ座標を取得する。そして、ステップＳ１０５でスカラ倍算部３０７が、−１≦ｈ≦２ｋ−１＝４なる範囲の各インデックスｈについて、乱数ｓ＝３８（式（１１．１１）参照）に応じたスカラ倍点情報として、式（１１．３１）のランダム化テーブルデータｔａｂ［ｈ］を生成する。
tab[h]=(2bh+s)A=(26h+38)A=(64h+38)A                  (11.31)
【０５０６】
そして、スカラ倍点情報格納部３０８は、生成されたランダム化テーブルデータｔａｂ［ｈ］を、インデックスｈと対応づけて格納する。
【０５０７】
図２６は、以上のようにして得られた、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを示すとともに、スカラ倍点情報格納部３０８がランダム化テーブルデータｔａｂ［ｈ］を保持するテーブル１１０を示す図である。
【０５０８】
図２４〜２５Ｂを参照して上記で説明した処理によれば、図２６に示すとおり、式（８．９）が成立する。具体的には、図２４〜２５Ｂの例におけるｋ＝３、ｂ＝６、ｍ＝３、ｅ＝１２８６２という値および式（１１．２８）〜（１１．３０）に示した値を式（８．９）の各変数に代入すると、下記の式（１１．３２）が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=20+64×0+1×(-38)+512×(-3)+8×(-38)+4096×3+64×38
=12862                                                (11.32)
【０５０９】
また、式（１１．３１）に示したように、図２６のテーブル１１０には、−１≦ｈ≦４なる範囲の各インデックスｈに対応して、それぞれ、スカラ倍点−２６Ａ、３８Ａ、１０２Ａ、１６６Ａ、２３０Ａ、２９４Ａのｘｙ座標が記憶されている。
【０５１０】
よって、図９のステップＳ１０６に相当する図１０の処理と、図９のステップＳ１０７〜Ｓ１１１により、最終的には、式（１１．３３）のようにスカラ倍点ｄＡのｘｙ座標が計算される。なお、この式（１１．３３）と図９および図１０との対応関係は、第１実施形態の式（９．３６）に関する説明から明らかなので、説明を省略する。
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A  (11.33)
【０５１１】
なお、この式（１１．３３）の右辺において、ステップＳ１０９の２倍算の対象を示す部分を変形すると、次の式（１１．３４）が得られる。式（１１．３４）も、第３実施形態において式（８．９）が成立することを示している。
23(23(23(O)+tab[3])-tab[3])-tab[0]+20A
=8(8(O+230A)-230A)-38A+20A
=8(1840A-230A)-18A
=8(1610A)-18A
=12862A                                               (11.34)
【０５１２】
そして、図２６に例示するように、式（１１．９）のダミー鍵ｅは、式（１１．３５）または（１１．３６）に示す個人鍵ｄから得られる。図２１には、例として、式（１１．３５）の個人鍵ｄを示してある。
d=(110010001111100)2=25724                           (11.35)
d=(110010001111101)2=25725                           (11.36)
【０５１３】
個人鍵ｄが式（１１．３５）で示される場合、式（１１．３５）よりｄ［０］＝０なので、式（１１．３４）を式（１１．３３）の右辺に代入すると、式（１１．３７）が得られる。
2(12862A)+d[0]A=25724A+O=25724A=dA                   (11.37)
【０５１４】
また、個人鍵ｄが式（１１．３６）で示される場合、式（１１．３６）よりｄ［０］＝１なので、式（１１．３４）を式（１１．３３）の右辺に代入すると、式（１１．３８）が得られる。
2(12862A)+d[0]A=25724A+A=25725A=dA                   (11.38)
【０５１５】
以上から、第３実施形態によれば、図９、１０、２４に示した処理により、確かに所望の点ｄＡが得られる。
【０５１６】
さて、第３実施形態では、スカラ倍点情報格納部３０８に格納されるスカラ倍点情報ｔａｂ［ｈ］に対応するインデックスｈの範囲は、−１≦ｈ≦２ｋ−１である。よって、第３実施形態においてスカラ倍点情報格納部３０８が有するテーブルのエントリ数は、（２ｋ−１＋２）個である。
【０５１７】
図２７は、ウィンドウサイズｋが３の場合のテーブルデータのエントリ数に関して、第３実施形態と第３の比較例と第４の比較例を比べる図である。
図２７において、テーブル１０６と１０７は図１４と同じである。つまり、テーブル１０６は、第４の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル１０７は第３の比較例として説明したランダム化ウィンドウ法のテーブルである。
【０５１８】
そして、テーブル１１１が、第３実施形態においてスカラ倍点情報格納部３０８がスカラ倍点情報を記憶するためのテーブルである。ｋ＝３なので、テーブル１１１には、−１≦ｈ≦２３−１＝４なる各インデックスｈについて、テーブルデータｔａｂ［ｈ］として点（ｈ×２ｂ＋ｓ）Ａのｘｙ座標が格納されている。つまり、テーブル１１１のエントリ数は６個である。
【０５１９】
以上のテーブル１０６、１０７、１１１を比較すると、第３実施形態のテーブル１１１は、ＰＡ攻撃に対して安全な方法を提供しつつ、テーブル１０６と同様にエントリ数が２ｋ−１のオーダに抑えられているという利点を持つ。つまり、第３実施形態のテーブル１１１は、テーブル１０６と比べて安全性の点で優位であり、テーブル１０７と比べてメモリ消費量が少ない点で優位である。
【０５２０】
ところで、本発明は上記の第１〜第３実施形態に限られるものではない。
例えば、個人鍵ｄの長さｕ、ウィンドウサイズｋ、および乱数値ｓの長さｂに関して、上記の説明では便宜上、具体的な数値をいくつか例示した。しかし、ｕ、ｋ、ｂの具体的な値は実施形態に応じて任意である。また、ｋやｂの具体的な値は、暗号処理装置３００を含む暗号通信システムにおけるシステムパラメタとして固定的に予め決められていてもよいし、暗号処理装置３００によって決められる可変値であってもよい。
【０５２１】
また、第１実施形態では、処理部３０１は、ｓ［ｉ］＝＋ｓと仮定してウィンドウ値ｗ［ｉ］を見積もる。しかし、実施形態によっては、処理部３０１は、ｓ［ｉ］＝−ｓと仮定してウィンドウ値ｗ［ｉ］を見積もってもよい。
【０５２２】
また、第１〜第３実施形態では、決定部３０３がウィンドウ演算部３０９に乱数列ｓ［ｉ］を出力している。しかし、図１０のステップＳ２０７に示すように、ウィンドウ演算部３０９は、「乱数値ｓ［ｉ］が＋ｓなのか、それとも−ｓなのか」ということさえ認識することさえできればよい。
【０５２３】
したがって、実施形態によっては、決定部３０３は、乱数列ｓ［ｉ］自体をウィンドウ演算部３０９に出力する代わりに、各ｉについて「乱数値ｓ［ｉ］が＋ｓなのか、それとも−ｓなのか」ということを示す情報をウィンドウ演算部３０９に出力してもよい。例えば、決定部３０３は、乱数列ｓ［ｉ］の代わりに、各ｉに対応する１ビットのフラグの列（すなわち合計ｍビットのフラグ列）を出力してもよい。
【０５２４】
また、第１〜第３実施形態では、最上位のキャリー補正値を適切に扱うためのテクニックとして、ダミー鍵ｅが導入されている。しかし、実施形態に応じて、最上位のキャリー補正値を適切に扱うための別のテクニックが使われてもよい。以下に、２つのテクニックを例示する。
【０５２５】
１つ目のテクニックは、ダミー鍵ｅを使わない方法である。すなわち、この１つ目のテクニックによれば、図９のステップＳ１０２が省略され、ステップＳ１０３に相当する図１１、１９、または２４の処理では、ダミー鍵ｅの代わりに個人鍵ｄそのものが使われる。例えば、図１１のステップＳ３０１（または、図１９のステップＳ４０１もしくは図２４のステップＳ５０１）で判断部３０２は、式（９．１）の代わりに式（１２．１）により、符号つき（ｋ＋ｂ）ビット値ｄＨを初期化する。
dH=d[b+km-1]||…||d[k(m-1)]                            (12.1)
【０５２６】
また、図１１のステップＳ３１８（または、図１９のステップＳ４１８もしくは図２４のステップＳ５１８）で判断部３０２は、式（９．５）の代わりに式（１２．２）により、符号つき（ｋ＋ｂ）ビット値ｄＨを更新する。
dH=(diff[b-1]||…||diff[0])2k+(d[ki-1]||…||d[k(i-1)])  (12.2)
【０５２７】
このようにダミー鍵ｅが使われない場合、個人鍵ｄのＭＳＢであるｄ［ｕ−１］の値が１である可能性がある。よって、たとえｉ＝ｍ−１であっても、図１１のステップＳ３０４で判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属すると判断されて、キャリー補正が生じる可能性がある。あるいは、たとえｉ＝ｍ−１であっても、図１９のステップＳ４０４または図２４のステップＳ５０４で符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に属すると判断されて、キャリー補正が生じる可能性がある。
【０５２８】
そこで、この１つ目のテクニックでは、ｉ＝ｍ−１のときに図１１のステップＳ３１４（または、図１９のステップＳ４１４もしくは図２４のステップＳ５１４）を実行する場合、決定部３０３は、ウィンドウ値ｗ［ｍ］を１と設定する。つまり、決定部３０３は、ウィンドウ値ｗ［ｍ］の初期値を０とみなしてキャリー補正を行う。
【０５２９】
こうして設定されるウィンドウ値ｗ［ｍ］は、ｕビットの個人鍵ｄの範囲を超えた上位の桁に対応する。すなわち、ウィンドウ値ｗ［ｍ］は、説明の便宜上、ここでは“ｗ［ｍ］”という記号を用いて「ウィンドウ値」と呼んでいるが、キャリー補正値を表すだけであり、テーブルデータを引くためのインデックスとしては利用されない。
【０５３０】
そして、この１つ目のテクニックでは、図９のステップＳ１０６に相当する図１０の処理のステップＳ２０１の初期化が、点Ｖを式（１２．３）のように設定する処理に置き換えられる。
V=2bw[m]A                                             (12.3)
【０５３１】
式（１２．３）のように点Ｖを設定するには、ウィンドウ演算部３０９は、具体的には次のように動作すればよい。すなわち、ウィンドウ演算部３０９は、最上位のキャリー補正値を表すウィンドウ値ｗ［ｍ］が０か１かを判断する。そして、ウィンドウ演算部３０９は、ｗ［ｍ］＝０ならば変数Ｖに無限遠点Ｏを格納し、ｗ［ｍ］＝１ならば変数Ｖに点Ａを格納する。その後、ウィンドウ演算部３０９は、「点Ｖに対して２倍算を行い、２倍算の結果を新たに変数Ｖに格納する」という処理をｂ回繰り返す。
【０５３２】
なお、図１０のステップＳ２０２以降の処理と、図９のステップＳ１０７〜Ｓ１０８には変更はない。また、この１つ目のテクニックではダミー鍵ｅを使わないので、ダミー鍵ｅを使うための後処理である図９のステップＳ１０９〜Ｓ１１１は省略される。
【０５３３】
すると、例えばｍ＝４の場合、ステップＳ１１２で補正部３１０が出力する点は、式（１２．４）のとおり、所望の点ｄＡである。なお、式（１２．４）における“±ｔａｂ［±ｗ［ｉ］］”なる記法は、「ｓ［ｉ］＝＋ｓならば＋ｔａｂ［ｗ［ｉ］]、ｓ［ｉ］＝−ｓならば−ｔａｂ［−ｗ［ｉ］］」ということを示すための省略記法である。
dA=2k(2k(2k(2k+b(w[4]A)±tab[±w[3]])±tab[±w[2]])±tab[±w[1]])
±tab[±w[0]]+cA                                   (12.4)
【０５３４】
すなわち、この１つ目のテクニックによれば、処理部３０１は、式（１２．５）が成立するという制約条件下で、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを決定する。
【数１２】
2011121661.tif 000014
【０５３５】
２つ目のテクニックは、上記の第１〜第３実施形態におけるのとは異なるダミー鍵を使う方法である。説明の便宜上、全ビットの値が０で長さｚのビット列を“ｚｅｒｏ（ｚ）”と表すことにすると、この２つ目のテクニックでは、図９のステップＳ１０２で処理部３０１は、式（８．６）のダミー鍵ｅの代わりに、式（１２．６）のダミー鍵ｒを求める。以下、混乱を避けるため、「ダミー鍵ｒ」のことを、「ダミー鍵ｅ」とは別の「ゼロ埋めビット列」という名前で呼ぶことにする。
r=zero(z)||d                                          (12.6)
【０５３６】
なお、この２つ目のテクニックでは、個人鍵ｄ自体の長さではなく、ゼロ埋めビット列ｒの長さが記号“ｕ”により表されるものとする。すなわち、個人鍵ｄの長さは（ｕ−ｚ）である。
【０５３７】
そして、ゼロ埋めビット列ｒの長さｕに関して式（８．４）が成立するように、整数ｍ、乱数値ｓのビット長ｂ、およびウィンドウサイズｋの値が定められる。逆の観点から説明すれば、ゼロ埋めビット列ｒの生成のために個人鍵ｄに足されるビットの数ｚは、式（８．４）を満たす正整数ｍが存在するように、選ばれる。
【０５３８】
なお、乱数値ｓが０以上に限定されている場合は、ｚ＝１でもよい。後述の変形例のように負の乱数値ｓを許す場合は、ｚ＞１である。また、例えば個人鍵ｄのビット長（ｕ−ｚ）と乱数値ｓのビット長ｂとウィンドウサイズｋが、システムパラメタとして固定的に決められている環境などにおいては、好適な設定の一例は、ｚ＝ｋという設定である。
【０５３９】
式（１２．６）によれば、ゼロ埋めビット列ｒのＭＳＢは０と保証される。したがって、図１１のステップＳ３０４に関して説明したのと同じ理由から、ｉ＝ｍ−１のときにキャリー補正が生じないことが保証される。よって、図９のステップＳ１０６に対応する図１０の処理は、第１〜第３実施形態とまったく同じである。
【０５４０】
また、式（１２．６）によれば、個人鍵ｄとゼロ埋めビット列ｒは、ビット長が異なるだけで、表す数値は等しい。よって、この２つ目のテクニックを用いる場合、ｄＡ＝ｒＡであるから、図９のステップＳ１０９〜Ｓ１１１の後処理は不要であり、省略される。
【０５４１】
以上説明した２つ目のテクニックによれば、処理部３０１は、式（８．１）が成立するという制約条件下で、ウィンドウ列ｗ［ｉ］と乱数列ｓ［ｉ］と補正値ｃを決定する。
なお、図９〜１１、１９、２４に示した第１〜第３実施形態でのダミー鍵ｅを用いるテクニックと、上記２つのテクニックの共通点は次のとおりである。すなわち、いずれの場合においても、処理部３０１は、個人鍵ｄに基づくビット列Ｄと乱数値ｓを用いて、ビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、下記の値を定める。
・０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］
・０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］
・補正値ｇ
【０５４２】
具体的には、処理部３０１は、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、式（１２．７）が成立するという制約条件下で、上記の値を定める。
【数１３】
2011121661.tif 000015
【０５４３】
つまり、第１〜第３実施形態は、式（１２．７）におけるビット列Ｄと補正値ｇが、具体的には式（１２．８）の場合に相当し、より具体的には、式（１２．８）において右シフト量ｆが１の場合に相当する。後述のように乱数生成部３０５が負の乱数値ｓを生成する場合は、式（１２．８）の右シフト量ｆは、２以上が適切である。
D=zero(f)||d[u-1]||…||d[f] かつ g=c                   (12.8)
【０５４４】
なお、式（１２．８）の場合、式（１２．７）の制約条件は、任意のｆに対して、式（１２．９）の制約条件と同値である。
【数１４】
2011121661.tif 000016
【０５４５】
この式（１２．９）の制約条件は、右シフト量ｆが１の場合の式（８．８）を一般化した制約条件である。また、任意のｆに対してダミー鍵ｅは式（１２．１０）のとおりである。すなわち、式（１２．１０）は、右シフト量ｆが１の場合の式（８．７）を一般化した式である。
【数１５】
2011121661.tif 000017
【０５４６】
また、上記の１つ目のテクニックは、式（１２．７）におけるビット列Ｄと補正値ｇが具体的には式（１２．１１）の場合に相当する。
D=d かつ g=2km+bw[m]+c                               (12.11)
【０５４７】
そして、上記の２つ目のテクニックは、式（１２．７）におけるビット列Ｄと補正値ｇが具体的には式（１２．１２）の場合に相当する。
D=zero(z)||d かつ g=c                                (12.12)
【０５４８】
ところで、上記の説明では、説明の簡単化のため乱数値ｓを非負と仮定したが、ｓ≦０であってもよい。以下に、第１〜第３実施形態それぞれに関して、変形例として、ｓ≦０あるいはｓ＜０の場合を説明する。
【０５４９】
図２８は、０以下の乱数値を生成するように変形された第１実施形態において、スカラ倍点情報格納部３０８のインデックスとして使われる値の範囲について模式的に説明する図である。
【０５５０】
図２８において、矩形Ｅ３０１、Ｅ３０２、Ｅ３０３、Ｅ３０４は、それぞれ、第１実施形態に関する図１５の矩形Ｅ１０１、Ｅ１０２、Ｅ１０３、Ｅ１０４と同じである。よって、乱数値ｓ［ｉ］が＋ｓであるという仮定が正式に採用される場合（すなわち、判断基準値（ｄＨ−ｓ）が範囲Ｒ１またはＲ３に属する場合）の補正済み差分値ｄｉｆｆの範囲を示す矩形Ｅ３１１とＥ３１３も、図１５の矩形Ｅ１１１とＥ１１３と同じである。
【０５５１】
図１５と２８で異なるのは、乱数値ｓ［ｉ］が＋ｓであるという仮定が妥当ではないという判断にしたがい、決定部３０３が乱数値ｓ［ｉ］を−ｓに決定する場合（すなわち、判断基準値（ｄＨ−ｓ）が範囲Ｒ２またはＲ４に属する場合）である。
【０５５２】
判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属する場合、図１５の第１実施形態では、式（９．５１）に示すように、矩形Ｅ１０２を＋２ｓ移動させた矩形Ｅ１１２が、補正済み差分値ｄｉｆｆの範囲を示す。図２８の変形例においても、矩形Ｅ３０２を＋２ｓ移動させた矩形Ｅ３１２が補正済み差分値ｄｉｆｆの範囲を示す点は図１５と同様である。ただし、図２８の変形例では、ｓ≦０であるから、＋２ｓの移動とは、負の方向への移動であり、図１５のような正の方向への移動ではない。
【０５５３】
よって、矩形Ｅ３１２が表す範囲の符号を反転させた範囲を表す矩形Ｅ３２２の左端は｜２ｓ｜の位置にあり、矩形Ｅ３２２の右端は（２ｋ＋ｂ−１＋｜２ｓ｜）の位置にある。そして、乱数値ｓによっては、｜２ｓ｜＞２ｂとなることがあるので、矩形Ｅ３２２が示す範囲の上位ｋビットは、最大で、（２ｋ−１＋１）という値をとる可能性がある。
【０５５４】
したがって、キャリー補正の影響を考慮に入れると、スカラ倍点情報格納部３０８のインデックスとして、（２ｋ−１＋２）なる値が使われる可能性がある。つまり、図１５の第１実施形態と比べると、図２８の変形例では、スカラ倍点情報格納部３０８において、（２ｋ−１＋２）なるインデックスに対応するエントリが増える。
【０５５５】
判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合についても同様の議論が成り立つ。すなわち、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属する場合、図２８においては、ウィンドウ補正を含めて（−２ｋ＋ｂ＋２ｓ）だけ矩形Ｅ３０４を移動させた矩形Ｅ３１４が、補正済み差分値ｄｉｆｆの範囲を示す。よって、矩形Ｅ３１４が表す範囲の符号を反転させた範囲を表す矩形Ｅ３２４の左端は｜２ｓ｜の位置にあり、矩形Ｅ３２４の右端は（２ｋ＋ｂ−１＋｜２ｓ｜）の位置にある。
【０５５６】
したがって、矩形Ｅ３２４が示す範囲の上位ｋビットは、最大で、（２ｋ−１＋１）という値をとる可能性がある。つまり、キャリー補正の影響を考慮に入れると、スカラ倍点情報格納部３０８のインデックスとして、（２ｋ−１＋２）なる値が使われる可能性がある。
【０５５７】
しかし、図１５の第１実施形態と比べると、図２８の変形例で不要となるエントリもある。すなわち、図１５の第１実施形態では、矩形Ｅ１２２とＥ１２４の左端の位置が−２ｂ以下の値に対応する可能性があるので、スカラ倍点情報格納部３０８は、キャリー補正の影響を考慮に入れて、−２（＝−１−１）なるインデックスに対応するエントリを有する。ところが、図２８の変形例では、この−２なるインデックスに対応するエントリは不要である。
【０５５８】
なぜなら、図２８に示すように、矩形Ｅ３２２とＥ３２４が表す範囲は、どちらも正の値のみを含むからである。つまり、図２８の変形例では、補正済み差分値ｄｉｆｆの符号を反転した−ｄｉｆｆの上位ｋビットが−１になることはない。したがって、スカラ倍点情報格納部３０８には、−２なるインデックスに対応するエントリは不要である。
【０５５９】
よって、乱数生成部３０５が０以下の乱数値ｓを生成するように変形された図２８の変形例では、使われるインデックスの範囲が第１実施形態とは異なるが、エントリの数は同じである。
【０５６０】
つまり、第１実施形態に関する図１６と同様の形式で表現した図２９にまとめたように、図２８の変形例では、−１から（２ｋ−１＋２）までの（２ｋ−１＋４）個のインデックスが使われる。
【０５６１】
図２９には、図２８の矩形Ｅ３１１、Ｅ３１２、Ｅ３２２、Ｅ３１３、Ｅ３１４、およびＥ３２４を示した。また、図２８〜２９は、ウィンドウサイズｋが２であり、乱数値ｓが符号つき３ビット値である（すなわちｂ＝３である）場合の例である。よって、図２９に示すように、図２８の変形例では、−１から（２ｋ−１＋２）まで（すなわち、−１から４まで）の各インデックスｈに対応して、スカラ倍点情報格納部３０８は、テーブルデータｔａｂ［ｈ］＝（ｈ×２３＋ｓ）Ａを保持する。
【０５６２】
続いて、第２実施形態の変形例について説明する。図３０は、０以下の乱数値を生成するように変形された第２実施形態において、スカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
【０５６３】
図３０において、矩形Ｅ４０１、Ｅ４０２、Ｅ４０３、Ｅ４０４は、それぞれ、第２実施形態に関する図１８の矩形Ｅ２０１、Ｅ２０２、Ｅ２０３、Ｅ２０４と同じである。
そして、判断基準として使われる符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に属する場合の補正済み差分値ｄｉｆｆの範囲は、図１８では、右端が（２ｋ＋ｂ−１−ｓ）の位置にある矩形Ｅ２１１により示される。同様に、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に属する場合の補正済み差分値ｄｉｆｆの範囲は、図１８では、右端が（２ｋ＋ｂ−１−ｓ）の位置にある矩形Ｅ２１３により示される。
【０５６４】
それに対して、図３０の変形例では、ｓ≦０なので、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ１に属する場合の補正済み差分値ｄｉｆｆの範囲は、右端が（２ｋ＋ｂ−１−ｓ）＝（２ｋ＋ｂ−１＋｜ｓ｜）の位置にある矩形Ｅ４１１により示される。同様に、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ３に属する場合の補正済み差分値ｄｉｆｆの範囲は、右端が（２ｋ＋ｂ−１＋｜ｓ｜）の位置にある矩形Ｅ４１３により示される。
【０５６５】
ただし、乱数値ｓは符号つきｂビット値なので、｜ｓ｜＜２ｂである。よって、矩形Ｅ４１１または矩形Ｅ４１３が示す範囲の右端に対応する値の上位ｋビットは、２ｋ−１より大きくはない。つまり、矩形Ｅ４１１と矩形Ｅ４１３の右端が２ｋ＋ｂ−１の位置より右にあっても、インデックスの増加にはつながらない。
【０５６６】
また、判断基準として使われる符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ２に属する場合の補正済み差分値ｄｉｆｆの範囲は、図１８では、右端がｓの位置にある矩形Ｅ２１２により示される。したがって、図１８では、インデックスの範囲を示す矩形Ｅ２２２の左端の位置は、−ｓの位置である。同様に、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４の補正済み差分値ｄｉｆｆの範囲は、図１８では、右端がｓの位置にある矩形Ｅ２１４により示される。したがって、図１８ではインデックスの範囲を示す矩形Ｅ２２４の左端の位置は、−ｓの位置である。
【０５６７】
それに対して、図３０の変形例では、ｓ≦０なので、符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ２に属する場合の補正済み差分値ｄｉｆｆの範囲は、右端がｓ＝−｜ｓ｜の位置にある矩形Ｅ４１２により示される。したがって、図３０では、インデックスの範囲を示す矩形Ｅ４２２の左端の位置は、｜ｓ｜の位置であり、０よりも右側である。また、矩形Ｅ４２２の右端の位置は、（２ｋ＋ｂ−１＋｜ｓ｜）の位置であり、２ｋ＋ｂ−１の位置より右である。しかし、｜ｓ｜＜２ｂなので、矩形Ｅ４２２の右端が２ｋ＋ｂ−１の位置より右にあっても、インデックスの増加にはつながらない。
【０５６８】
同様のことは符号つき（ｋ＋ｂ）ビット値ｄＨが範囲Ｒ４に属する場合の補正済み差分値ｄｉｆｆの範囲を示す矩形Ｅ４１４と、矩形Ｅ４１４が示す範囲の符号を反転させた範囲を示す矩形Ｅ４２４についても成り立つ。すなわち、インデックスの範囲を示す矩形Ｅ４２４は、右端が２ｋ＋ｂ−１の位置より右にあるが、インデックスの増加をもたらすことはない。
【０５６９】
以上から、第２実施形態は、たとえ乱数生成部３０５が０以下の乱数値を生成するように変形されても、スカラ倍点情報格納部３０８で使われるインデックスの範囲は変わらない。
【０５７０】
ただし、乱数値ｓが非ゼロに限定される第３実施形態は、乱数生成部３０５が負の乱数値を生成するように変形されると、図３１を参照して以下に説明するとおり、インデックスの個数も変わってしまう。
【０５７１】
図３１は、０以下の乱数値を生成するように変形された第２実施形態と、負の乱数値を生成するように変形された第３実施形態において、インデックスとして使われる値についてまとめた図である。図３１は、第３実施形態によるメモリ使用量の削減について説明する図２３と同様の形式の図である。すなわち、図３１では、乱数値ｓが負の場合と、乱数値ｓが０の場合が別々に図示されている。
【０５７２】
乱数値ｓが負の場合に関して、図３１には、図３０の矩形Ｅ４１１が表す範囲と矩形Ｅ４１３が表す範囲の和を表す矩形Ｅ４３１と、図３０の矩形Ｅ４１２が表す範囲と矩形Ｅ４１４が表す範囲の和を表す矩形Ｅ４３２が示されている。また、図３１には、矩形Ｅ４３２が表す範囲の符号を反転させた範囲を表す矩形Ｅ４４２も示されている。
【０５７３】
図３１に示すとおり、ｓ＜０のとき、０＜｜ｓ｜なので、矩形Ｅ４３１と矩形Ｅ４４２が表す範囲は正の値のみを含む。また、０＜｜ｓ｜なので、矩形Ｅ４３１と矩形Ｅ４４２の右端は、２ｋ−１なるインデックスに対応する位置よりも右にある。したがって、乱数値ｓを非ゼロに限定したｓ＜０の場合であっても、キャリー補正の影響がない段階で、２ｋ−１なるインデックスが使われる可能性があり、キャリー補正を考慮に入れると、（２ｋ−１＋１）なるインデックスが使われる可能性がある。
【０５７４】
また、乱数値ｓが０の場合に関して、図３１には、図３０の矩形Ｅ４１１が表す範囲と矩形Ｅ４１３が表す範囲の和を表す矩形Ｅ４５１と、図３０の矩形Ｅ４１２が表す範囲と矩形Ｅ４２４が表す範囲の和を表す矩形Ｅ４５２が示されている。また、図３１には、矩形Ｅ４５２が表す範囲の符号を反転させた範囲を表す矩形Ｅ４６２も示されている。
【０５７５】
図３１に示すとおり、ｓ＝０の場合は、インデックスの範囲を示す矩形Ｅ４５１と矩形Ｅ４６２は、図２３の矩形Ｅ２３１とＥ２４２と同じである。よって、第２実施形態と同じく、図３０の変形例でｓ＝０の場合、キャリー補正を考慮に入れると、−１から（２ｋ−１＋１）までのインデックスが使われる可能性がある。
【０５７６】
つまり、第３実施形態には、乱数値ｓを非ゼロに限定することでメモリ消費量を第２実施形態よりも少なくする効果があるが、乱数生成部３０５が負の乱数値を生成する変形例では、乱数値ｓを非ゼロに限定しても、エントリ数は変わらない。逆の観点から説明すれば、単に乱数値ｓを非ゼロの値に限定するのではなく、第３実施形態のように乱数値ｓを正の非ゼロの値に限定することで、メモリ消費量の削減効果が生まれる。
【０５７７】
以上、いくつかの観点から様々な変形例について説明したが、第１〜第３実施形態および以上の様々な変形例について概括すれば下記のとおりである。
処理部３０１は、個人鍵格納部３０４から楕円曲線暗号における個人鍵ｄを読み出し、処理対象のビット列Ｄを認識する。処理部３０１は、個人鍵ｄ自体を処理対象のビット列Ｄとして認識してもよい。あるいは、処理部３０１は、ＭＳＢの値が０になるように個人鍵ｄを加工し、加工して得られたビット列を処理対象のビット列Ｄとして認識してもよい。上記のダミー鍵ｅとゼロ埋めビット列ｒは、ＭＳＢの値が０になるように処理部３０１が個人鍵ｄを加工することで得られるビット列Ｄの具体例である。
【０５７８】
また、乱数生成部３０５は符号つきまたは符号なしのｂビットの乱数値ｓを生成し、正整数ｍに関して、ビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する。処理部３０１は、正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］と０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］と補正値ｇを定める。具体的には、処理部３０１は、ビット列Ｄと乱数値ｓを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、式（１２．７）が成立するという制約条件下でこれらの値を定める。
【０５７９】
より具体的には、第１実施形態またはその変形例では、処理部３０１内の判断部３０２は、以下のいずれかの判定条件が満たされるか否かを判断する。
・乱数値ｓ［ｉ］が＋ｓであるという仮定の下でウィンドウ値ｗ［ｉ］として見積もられる値である第１の値が０以上２ｋ−１未満である、という第１の判定条件
・１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値と相殺するウィンドウ補正値により第１の値を補正した第２の値が０以上２ｋ−１以下である、という第２の判定条件
なお、上記の第１の値は、ｉ＝ｍ−１の場合は、ビット列Ｄの上位（ｋ＋ｂ）ビット（例えば、図１１のステップＳ３０１で設定される符号つき（ｋ＋ｂ）ビット値ｄＨの初期値）から乱数値ｓを引いた値の上位ｋビットである。
【０５８０】
また、ｉ＜ｍ−１の場合は、上記の第１の値は、符号つき（ｋ＋ｂ）ビット値から乱数値ｓを引いた値の、上位ｋビットである。なお、ここでの符号つき（ｋ＋ｂ）ビット値とは、ｉ＜ｊ≦ｍ−１なる各ｊについて決定部３０３が算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与をビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である。より正確には、ｊ＝ｉ＋１なるｊに関しては、ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺されるウィンドウ値ｗ［ｊ］の寄与は、キャリー補正前のウィンドウ値ｗ［ｊ］の寄与である。また、この符号つき（ｋ＋ｂ）ビット値の具体例は、第１実施形態においては、図１１のステップＳ３１８で更新された符号つき（ｋ＋ｂ）ビット値ｄＨである。
【０５８１】
上記の第１と第２の判定条件に関する判断の具体的手順は、例えば次のとおりである。すなわち、判断基準値（ｄＨ−ｓ）が範囲Ｒ３に属するとき、判断部３０２は、「第１の判定条件が満たされる」と判断してもよい。また、判断基準値（ｄＨ−ｓ）が範囲Ｒ１に属するとき、判断部３０２は、「第２の判定条件が満たされる」と判断してもよい。
【０５８２】
そして、第１の判定条件が満たされる場合、処理部３０１内の決定部３０３は、図１１のステップＳ３１０、Ｓ３１１、Ｓ３１５、Ｓ３１６に例示したように、乱数値ｓ［ｉ］を＋ｓと決定し、ウィンドウ値ｗ［ｉ］を第１の値に決定する。また、第２の判定条件が満たされる場合、決定部３０３は、図１１のステップＳ３０５〜Ｓ３０７、Ｓ３１５、Ｓ３１６に例示したように、乱数値ｓ［ｉ］を＋ｓと決定し、ウィンドウ値ｗ［ｉ］を第２の値に決定する。
【０５８３】
逆に、第１の判定条件も第２の判定条件も満たされない場合、決定部３０３は、乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した乱数値ｓ［ｉ］に応じてウィンドウ値ｗ［ｉ］を算出する。
【０５８４】
その際、決定部３０３は、第１の値が正であれば、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負の値によるウィンドウ補正を行う。例えば、第１実施形態の例では、判断基準値（ｄＨ−ｓ）が範囲Ｒ４に属していれば、決定部３０３は図１１のステップＳ３１３でウィンドウ補正値ｔ［ｉ］を負の値に設定することで、ウィンドウ補正を行う。
【０５８５】
また、乱数値ｓ［ｉ］を−ｓと決定した場合に、前記第１の値が負であれば、決定部３０３は、ウィンドウ補正を行わずに、−ｓに決定した乱数値ｓ［ｉ］に応じてウィンドウ値ｗ［ｉ］を算出する。例えば、第１実施形態の例では、判断基準値（ｄＨ−ｓ）が範囲Ｒ２に属していれば、決定部３０３はウィンドウ補正を行わない。
【０５８６】
以上は、第１実施形態またはその変形例における処理部３０１の動作である。第２実施形態、第３実施形態、またはその変形例における処理部３０１の動作は、概括すれば以下のとおりである。
【０５８７】
すなわち、判断部３０２は、符号つき（ｋ＋ｂ）ビット値ｄＨが、０以上２ｋ＋ｂ−１−１以下の第１の範囲（つまり範囲Ｒ３）または−２ｋ＋ｂ−１以下の第２の範囲（つまり範囲Ｒ１）に含まれるか否かを判断する。
【０５８８】
ここでの符号つき（ｋ＋ｂ）ビット値ｄＨは、ｉ＝ｍ−１の場合は、ビット列Ｄの上位（ｋ＋ｂ）ビットであり、具体例は、図１９のステップＳ４０１または図２４のステップＳ５０１で設定される値である。また、ｉ＜ｍ−１の場合は、符号つき（ｋ＋ｂ）ビット値ｄＨは、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与をビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である。具体例は、図１９のステップＳ４１８または図２４のステップＳ５１８で設定される値である。なお、より正確には、ｊ＝ｉ＋１なるｊに関しては、ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺されるウィンドウ値ｗ［ｊ］の寄与は、キャリー補正前のウィンドウ値ｗ［ｊ］の寄与である。
【０５８９】
そして、決定部３０３は、符号つき（ｋ＋ｂ）ビット値ｄＨが第１の範囲に含まれる場合、乱数値ｓ［ｉ］を＋ｓと決定し、ウィンドウ値ｗ［ｉ］を、符号つき（ｋ＋ｂ）ビット値ｄＨから乱数値ｓを減じた値の上位ｋビットに決定する。この動作の例は、図１９のステップＳ４１０、Ｓ４１１、Ｓ４１５、Ｓ４１６および図２４のステップＳ５１０、Ｓ５１１、Ｓ５１５、Ｓ５１６に示したとおりである。
【０５９０】
また、符号つき（ｋ＋ｂ）ビット値ｄＨが第２の範囲に含まれる場合、決定部３０３は、乱数値ｓ［ｉ］を＋ｓと決定し、ウィンドウ値ｗ［ｉ］を、符号つき（ｋ＋ｂ）ビット値ｄＨから乱数値ｓを減じて２ｋ＋ｂなるウィンドウ補正値を加えた値の上位ｋビットに決定する。この動作の例は、図１９のステップＳ４０５〜Ｓ４０７、Ｓ４１５、Ｓ４１６および図２４のステップＳ５０５〜Ｓ５０７、Ｓ５１５、Ｓ５１６に示したとおりである。
【０５９１】
そして、符号つき（ｋ＋ｂ）ビット値ｄＨが第１の範囲にも第２の範囲にも含まれない場合、決定部３０３は、乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した乱数値ｓ［ｉ］に応じてウィンドウ値ｗ［ｉ］を算出する。
【０５９２】
その際、決定部３０３は、具体的には、符号つき（ｋ＋ｂ）ビット値ｄＨが正であれば、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負のウィンドウ補正値によるウィンドウ補正を行う。この動作の例は、図１９のステップＳ４１２〜４１６および図２４のステップＳ５１２〜Ｓ５１６に示したとおりである。
【０５９３】
逆に、乱数値ｓ［ｉ］を−ｓと決定した場合において、符号つき（ｋ＋ｂ）ビット値ｄＨが負であれば、決定部３０３は、ウィンドウ補正を行わずに、乱数値ｓ［ｉ］に応じてウィンドウ値ｗ［ｉ］を算出する。この動作の例は、図１９のステップＳ４０８、Ｓ４０９、Ｓ４１５、Ｓ４１６および図２４のステップＳ５０８、Ｓ５０９、Ｓ５１５、Ｓ５１６に示したとおりである。
【０５９４】
また、以上説明したいずれの実施形態においても、スカラ倍算部３０７が楕円曲線上の点（２ｂｈ＋ｓ）Ａの座標を計算するインデックスｈの範囲は、次のとおりである。すなわち、インデックスｈは、処理部３０１が−ｓと決定する乱数値ｓ［ｉ］に対応するウィンドウ値ｗ［ｉ］の値域の最大値（例えば、第１実施形態では２、第２実施形態と第３実施形態では１）の符号を反転させた負数以上である。かつ、インデックスｈは、処理部３０１が＋ｓと決定する乱数値ｓ［ｉ］に対応するウィンドウ値ｗ［ｉ］の値域の最大値（例えば、第１実施形態と第２実施形態では２ｋ−１＋１、第３実施形態では２ｋ−１）以下である。
【０５９５】
最後に、以上説明した第１〜第３実施形態およびそれらの変形例、ならびに２つの比較例におけるテーブルデータのエントリ数についてまとめると、図３２のとおりである。
すなわち、第１〜第３実施形態は、いずれもＰＡ攻撃に対して安全（つまりＳＰＡ攻撃とＤＰＡ攻撃の双方に対して安全）である。また、第３の比較例として説明したランダム化ウィンドウ法も、ＰＡ攻撃に対して安全である。しかし、第４の比較例として説明した、メモリ節約効果のある符号つきウィンドウ法は、ＤＰＡ攻撃に対して脆弱である。
【０５９６】
そして、第１実施形態では、ｓ≧０の場合のスカラ倍点情報のインデックスの範囲は、−２≦ｈ≦２ｋ−１＋１であり、変形例として説明したｓ≦０の場合のインデックスの範囲は、−１≦ｈ≦２ｋ−１＋２である。よって、スカラ倍点情報のエントリ数は、いずれにせよ（２ｋ−１＋４）個である。例えば、ウィンドウサイズｋが２、３、４の場合それぞれのエントリ数は、６個、８個、１２個である。
【０５９７】
また、第２実施形態では、ｓ≧０の場合も、変形例として説明したｓ≦０の場合も、スカラ倍点情報のインデックスの範囲は、−１≦ｈ≦２ｋ−１＋１である。よって、スカラ倍点情報のエントリ数は（２ｋ−１＋３）個である。例えば、ウィンドウサイズｋが２、３、４の場合それぞれのエントリ数は、５個、７個、１１個である。
【０５９８】
また、乱数値ｓを非ゼロの値に限定した第３実施形態では、ｓ＞０の場合とｓ＜０の場合でスカラ倍点情報のインデックスの範囲が異なり、したがって、エントリ数も異なる。具体的には、ｓ＞０の場合、インデックスの範囲は−１≦ｈ≦２ｋ−１であり、エントリ数は（２ｋ−１＋２）個である。例えば、ウィンドウサイズｋが２、３、４の場合それぞれのエントリ数は、４個、６個、１０個である。ｓ＜０の場合のインデックスの範囲とエントリ数は、第２実施形態と同じである。
【０５９９】
第３の比較例では、テーブルデータのインデックスの範囲は０≦ｈ≦２ｋ−１であり、エントリ数は２ｋ個である。例えば、ウィンドウサイズｋが２、３、４の場合それぞれのエントリ数は、４個、８個、１６個である。
【０６００】
よって、第１実施形態と第３の比較例を比べると、ｋが３以上のとき第１実施形態でのエントリ数は第３の比較例でのエントリ数以下であり、特にｋが４以上のとき第１実施形態でのエントリ数は第３の比較例でのエントリ数より少ない。
【０６０１】
また、第２実施形態と第３の比較例を比べると、ｋが３以上のとき第２実施形態でのエントリ数は第３の比較例でのエントリ数より少ない。同様のことは、第３実施形態においてｓ＜０の場合にも成り立つ。
【０６０２】
さらに、ｓ＞０の場合に関して第３実施形態と第３の比較例を比べると、ｋが２以上のとき第３実施形態でのエントリ数は第３の比較例でのエントリ数以下であり、特にｋが３以上のとき第３実施形態でのエントリ数は第３の比較例でのエントリ数より少ない。
【０６０３】
すなわち、第１〜第３実施形態でのエントリ数は、２ｋ−１のオーダであるのに対し、第３の比較例でのエントリ数は、２ｋのオーダである。よって、第１〜第３実施形態でのエントリ数は、ウィンドウサイズｋによっては第３の比較例でのエントリ数を超えることもありうるものの、多くの場合は、第３の比較例でのエントリ数より少ない。また、ウィンドウサイズは、ｋ≧３であることが多い。したがって、実用上はほとんどの場合において、第１〜第３実施形態は、メモリ使用量の点で第３の比較例に対する優位性を持つ。
【０６０４】
また、第４の比較例では、テーブルデータのインデックスの範囲は０≦ｈ≦２ｋ−１であり、エントリ数は（２ｋ−１＋１）個である。例えば、ウィンドウサイズｋが２、３、４の場合それぞれのエントリ数は、３個、５個、９個である。このように、ウィンドウサイズｋによらず、第４の比較例でのエントリ数は常に第１〜第３実施形態でのエントリ数よりも１〜３個少ないが、第４の比較例にはＤＰＡ攻撃に対する脆弱性がある。よって、第１〜第３実施形態は、安全性において第４の比較例に対する優位性を持つ。
【０６０５】
以上、図３２に示したように、第１〜第３実施形態およびその変形例によれば、ＳＰＡ攻撃とＤＰＡ攻撃の双方に対する安全性と、メモリ使用量の抑制が、ともに実現される。したがって、第１〜第３実施形態およびその変形例の暗号処理装置は、様々な分野に好適であり、特に、スマートカードや組み込み機器などのメモリ容量が少ない装置に好適である。
【図１】
2011121661.tif 000021
【図２】
2011121661.tif 000022
【図３】
2011121661.tif 000023
【図４】
2011121661.tif 000024
【図５】
2011121661.tif 000025
【図６】
2011121661.tif 000026
【図７】
2011121661.tif 000027
【図８】
2011121661.tif 000028
【図９】
2011121661.tif 000029
【図１０】
2011121661.tif 000030
【図１１】
2011121661.tif 000031
【図１２Ａ】
2011121661.tif 000032
【図１２Ｂ】
2011121661.tif 000033
【図１３】
2011121661.tif 000034
【図１４】
2011121661.tif 000035
【図１５】
2011121661.tif 000036
【図１６】
2011121661.tif 000037
【図１７】
2011121661.tif 000038
【図１８】
2011121661.tif 000039
【図１９】
2011121661.tif 000040
【図２０Ａ】
2011121661.tif 000041
【図２０Ｂ】
2011121661.tif 000042
【図２１】
2011121661.tif 000043
【図２２】
2011121661.tif 000044
【図２３】
2011121661.tif 000045
【図２４】
2011121661.tif 000046
【図２５Ａ】
2011121661.tif 000047
【図２５Ｂ】
2011121661.tif 000048
【図２６】
2011121661.tif 000049
【図２７】
2011121661.tif 000050
【図２８】
2011121661.tif 000051
【図２９】
2011121661.tif 000052
【図３０】
2011121661.tif 000053
【図３１】
2011121661.tif 000054
【図３２】
2011121661.tif 000055
【手続補正書】
【提出日】平成24年7月31日(2012.7.31)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
楕円曲線暗号における個人鍵ｄを格納する個人鍵格納部と、
符号つきまたは符号なしのｂビットの乱数値ｓを生成する乱数生成部と、
前記個人鍵格納部から前記個人鍵ｄを読み出し、前記個人鍵ｄ、または最上位ビットの値が０になるように前記個人鍵ｄを加工して得られるビット列であるビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｋビット値のウィンドウ値ｗ［ｉ］と０≦ｉ≦（ｍ−１）なる各ｉに対応する符号つきｂビット値の乱数値ｓ［ｉ］と補正値ｇを、前記ビット列Ｄと前記乱数値ｓとを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、
【数１６】
2011121661.tif 000056
が成立するという制約条件下で定める処理部
を備えることを特徴とする暗号処理装置。
【請求項２】
前記乱数値ｓ［ｉ］が＋ｓであるという仮定の下で前記ウィンドウ値ｗ［ｉ］として見積もられる値である第１の値が０以上２ｋ−１未満である、という第１の判定条件、または、前記ウィンドウ値ｗ［ｉ］の１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値と相殺するウィンドウ補正値により前記第１の値を補正した第２の値が０以上２ｋ−１以下である、という第２の判定条件が満たされるか否かを判断する判断部と、
前記第１の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第１の値に決定し、前記第２の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第２の値に決定し、前記第１の判定条件も前記第２の判定条件も満たされない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する決定部
を前記処理部が備えることを特徴とする請求項１に記載の暗号処理装置。
【請求項３】
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットの値であり、ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である、符号つき（ｋ＋ｂ）ビット値ｄＨが、０以上２ｋ＋ｂ−１−１以下の第１の範囲または−２ｋ＋ｂ−１以下の第２の範囲に含まれるか否かを判断する判断部と、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じた値の上位ｋビットに決定し、前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第２の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じて２ｋ＋ｂなるウィンドウ補正値を加えた値の上位ｋビットに決定し、前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲にも前記第２の範囲にも含まれない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する決定部
を前記処理部が備えることを特徴とする請求項１に記載の暗号処理装置。
【請求項４】
前記乱数生成部は、前記乱数値ｓとして、非ゼロの正の値のみを生成することを特徴とする請求項３に記載の暗号処理装置。
【請求項５】
楕円曲線暗号における個人鍵ｄを読み出し、
前記個人鍵ｄを処理対象のビット列Ｄとして認識するか、または、最上位ビットの値が０になるように前記個人鍵ｄを加工し、加工して得られたビット列を前記ビット列Ｄとして認識し、
符号つきまたは符号なしのｂビットの乱数値ｓを生成し、
前記ビット列Ｄの長さｕとウィンドウサイズｋとの間にｕ＝ｍｋ＋ｂなる関係が成立する正整数ｍに関して、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号付きｋビット値のウィンドウ値ｗ［ｉ］と、０≦ｉ≦（ｍ−１）なる各ｉに対応する符号付きｂビット値の乱数値ｓ［ｉ］と、補正値ｇを、前記ビット列Ｄと前記乱数値ｓとを用いて、各乱数値ｓ［ｉ］を＋ｓまたは−ｓに決定しながら、
【数１７】
2011121661.tif 000057
が成立するという制約条件下で定める
ことを特徴とする暗号処理方法。
【請求項６】
前記乱数値ｓ［ｉ］が＋ｓであるという仮定の下で前記ウィンドウ値ｗ［ｉ］の値を見積もり、
見積もった値である第１の値が０以上２ｋ−１未満である、という第１の判定条件、または、前記ウィンドウ値ｗ［ｉ］の１つ上位のウィンドウ値ｗ［ｉ＋１］へのキャリー補正値と相殺するウィンドウ補正値により前記第１の値を補正した第２の値が０以上２ｋ−１以下である、という第２の判定条件が満たされるか否かを判断し、
前記第１の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第１の値に決定し、
前記第２の判定条件が満たされる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を前記第２の値に決定し、
前記第１の判定条件も前記第２の判定条件も満たされない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを含むことを特徴とする請求項５に記載の暗号処理方法。
【請求項７】
ｉ＝ｍ−１の場合は、前記ビット列Ｄの上位（ｋ＋ｂ）ビットの値であり、ｉ＜ｍ−１の場合は、ｉ＜ｊ≦ｍ−１なる各ｊについて算出したウィンドウ値ｗ［ｊ］と乱数値ｓ［ｊ］の寄与を前記ビット列Ｄの上位（ｋ（ｍ−ｉ）＋ｂ）ビットから減殺した値である、符号つき（ｋ＋ｂ）ビット値ｄＨを計算し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが０以上２ｋ＋ｂ−１−１以下の第１の範囲または−２ｋ＋ｂ−１以下の第２の範囲に含まれるか否かを判断し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じた値の上位ｋビットに決定し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第２の範囲に含まれる場合、前記乱数値ｓ［ｉ］を＋ｓと決定し、前記ウィンドウ値ｗ［ｉ］を、前記符号つき（ｋ＋ｂ）ビット値ｄＨから前記乱数値ｓを減じて２ｋ＋ｂなるウィンドウ補正値を加えた値の上位ｋビットに決定し、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが前記第１の範囲にも前記第２の範囲にも含まれない場合、前記乱数値ｓ［ｉ］を−ｓと決定し、−ｓと決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項５に記載の暗号処理方法。
【請求項８】
前記乱数値ｓ［ｉ］を−ｓと決定した場合、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが正であれば、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出するときに、１つ上位のウィンドウ値ｗ［ｉ＋１］への正のキャリー補正値と相殺する負のウィンドウ補正値による補正を行い、
前記符号つき（ｋ＋ｂ）ビット値ｄＨが負であれば、前記ウィンドウ補正を行わずに、−ｓに決定した前記乱数値ｓ［ｉ］に応じて前記ウィンドウ値ｗ［ｉ］を算出する
ことを特徴とする請求項７に記載の暗号処理方法。
【請求項９】
前記乱数値ｓは非ゼロの正の値であることを特徴とする請求項７または８に記載の暗号処理方法。
【国際調査報告】
2011121661.tif 000058
2011121661.tif 000059
2011121661.tif 000060
2011121661.tif 000061