(57)【特許請求の範囲】
【請求項１】
２進数に変換した場合にｎ個のビット全てが１であるべき数（２n−１）によるべき乗剰余演算ａ(2^n)-1 mod ｆを行うべき乗剰余演算装置であって、
被演算数ａが格納されるａレジスタと、
変数ｓが格納されるｓレジスタと、
変数ｔが格納されるｔレジスタと、
演算結果が格納されるｒレジスタと、
前記ｔレジスタ内の変数ｔによる自乗剰余演算を行う自乗剰余演算手段と、
前記ｔレジスタ内の変数ｔと、前記ａレジスタ内の被演算数ａまたは前記ｓレジスタ内の変数ｓとによる乗算剰余演算を行う乗算剰余演算手段と、
２進数に変換した（ｎ）を（ｎb-1，ｎb-2，・・・ｎ1，ｎ0）2、ｉ＝ｂ−２が０以上である場合、ｎi＝０の場合にレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行させその演算結果をレジスタｔに格納し、レジスタｔ内の変数ｔとレジスタｓ内の変数ｓの乗算剰余演算を前記乗算剰余演算手段により演算させてレジスタｓ内の変数ｓに代入し、変数ｉをデクリメントする第１演算制御手段と、
ｎi＝１の場合にレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行させその演算結果をレジスタｔに格納し、レジスタｔ内の変数ｔとレジスタｓ内の変数ｓの乗算剰余演算を前記乗算剰余演算手段により演算させてレジスタｓ内の変数ｓに代入し、さらにレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算を実行してレジスタｔ内の変数ｔに代入し、前記乗算剰余演算手段による前記レジスタａ内の被演算数ａとレジスタｔ内の変数ｔとの乗算剰余演算を実行してこの演算結果をレジスタｓ内の変数ｓに代入し、変数ｉをデクリメントする第２演算制御手段と、
ｉが０未満のとき、レジスタｓ内の変数ｓをレジスタｒに代入する第３演算制御手段と、
前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行した後にループ変数loopの値を２倍し、前記乗算剰余演算手段による前記レジスタａ内の被演算数ａとレジスタｔ内の変数ｔとの乗算剰余演算を実行した後にループ変数loopに１を加算するループ変数制御手段と、を備えるべき乗剰余演算装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、公開鍵暗号系における楕円曲線暗号処理における基本演算である楕円曲線上の点の演算に係り、特に楕円曲線上の点のスカラー倍算処理を高速に行う楕円曲線上の点の演算方法に関する。
【０００２】
【従来の技術】
近年のコンピュータネットワークの発達により、データベースの検索や電子メール、電子ニュースなどの電子化された情報をネットワークを経由して送受信する機会が急速に増加してきている。さらに、これらを利用して、オンラインショッピングなどのサービスも提供されつつある。しかし、それに伴って、ネットワーク上の電子化されたデータを盗聴したり、改竄したり、または他人になりすましてサービスを受けるなどの違法行為についての問題が浮上してきている。特に、無線を利用したネットワークにおいては、傍受が容易なためこれらを防止する対策が望まれている。
【０００３】
これらの問題に対して暗号技術（encryption technology）を応用した暗号化電子メールや利用者認証システムが提案され、種々のネットワークにも導入されつつあり、コンピュータネットワークにおいて暗号化は必須の技術となりつつある。
【０００４】
このような暗号技術の中の１つにディジタル署名すなわち認証に適した公開鍵暗号（public key cryptosystem）があるが、暗号化／復号化に大量の処理が必要なため高速化が望まれており、様々な高速化アルゴリズムも発表されている。
【０００５】
暗号化方式は、大別すると秘密鍵暗号系と公開鍵暗号系の２つに分類することができる。
秘密鍵暗号系は、送信者と受信者が同じ鍵を持つことにより暗号通信を行う方式である。すなわち、秘密鍵暗号系では、あるメッセージを秘密の暗号鍵に基づいて暗号化し相手に送り、受け手はこの暗号鍵を用いて暗号分を復号化しもとのメッセージに戻して情報を入手する。
【０００６】
公開鍵暗号系は、送信者は公開されている受信者の公開鍵でメッセージを暗号化して送信し、受信者は自分の秘密鍵でその暗号化メッセージを復号化することで通信を行う方式である。すなわち、公開鍵暗号系では、公開鍵は暗号化のための鍵、秘密鍵は公開鍵により暗号化された暗号を復号化するための鍵であり、公開鍵で暗号化した暗号が秘密鍵でのみ復号化することができる。
【０００７】
秘密鍵暗号系では、個人が秘密に保管しなければならない鍵の数が通信相手の数だけ必要であり、必要な総鍵数はｎ人のネットワークの場合、ｎ（ｎ−１）／２個である。また、はじめて通信をする相手に対しては、何らかの方法で秘密鍵の配送を行う必要があるという点で欠点がある。この問題を避けるために、大規模なネットワークでは、鍵管理センタを設置し、センタとの間の秘密鍵のみを保管し、暗号通信を行う場合はセンタから送信相手との秘密鍵を得る方法が用いられる。この場合秘密鍵の総数はｎとなる。
【０００８】
一方公開鍵暗号系では、個人が秘密に保管する鍵は自分の秘密鍵のみであり、必要な総秘密鍵数もｎ人のネットワークの場合、ｎ個である。また、はじめて通信する相手に対しては、公開鍵の配送を行えばよく、鍵管理センタを設置して、ユーザの公開鍵をｎ個公開簿に登録し、センタから送信相手の公開鍵を得る方法が用いられる。この場合、センタは公開鍵の改竄を防ぐだけで、秘密に保管する必要がない。ただし、公開鍵方式は秘密鍵方式に比べて鍵のビット数が大きいため保管に要するファイルサイズが大きくなるという問題を内包している。
【０００９】
また、認証の場合、秘密鍵暗号系では、例えば、送信するメッセージを秘密鍵で圧縮変換し、送信文に付加して送り、受信側では同様に圧縮変換して比較する方式がとられている。しかし、送受信が同じ鍵であるため受信者は認証データを偽造することができる。
【００１０】
これに対して、公開鍵暗号系では、秘密鍵で暗号化することができるのは本人だけであるという特徴を利用する。送信者はメッセージを圧縮変換して秘密鍵で暗号化し、送信文に付加して送り、受信者は送信者の公開鍵で付加されたデータを復号化し、同様に圧縮変換したものと比較する方式がとられている。この場合は受信者が不正できない。
【００１１】
このように、認証系では公開鍵暗号系の技術は必要不可欠であるといえる。しかし、公開鍵暗号系には、暗号化／復号化に大量の処理が必要であるという大きな欠点があるため、一般には処理の速い秘密鍵暗号系をメッセージの暗号化に、公開鍵暗号系は認証用にというように組み合わせて用いられる場合が多い。
【００１２】
公開鍵暗号系の中で、現在IEEE P1363, ANSI X 9.62などで標準化が進んでいるものに、楕円曲線暗号（Elliptic Curve Cryptography）がある。これは、楕円曲線の離散対数問題に基づくもので、N. Koblitz（"A course in number theory and cryptography", Spring-Verlag, 1997）と、V. Miller（"Use of elliptic curves in cryptography", Advances in Cryptology-Proceedings of Crypto '85, Lecture Notes in Computer Science, 218(1986), Spring-Verlag, pp 417-426）により提案された。
〔楕円曲線暗号に用いる楕円曲線〕
楕円曲線暗号に用いる主な楕円曲線は、素体上の楕円曲線（標準形：ｙ2＝ｘ3＋ａｘ＋ｂ（ｍｏｄ ｐ），ｐ：素数，ａ，ｂ：ＧＦ（ｐ）の元）と、２の拡大体上の楕円曲線（標準形：ｙ2＋ｘｙ＝ｘ3＋ａｘ2＋ｂ（ｍｏｄ  ｆ），ｆ：ｎ次既約多項式，ａ，ｂ：ＧＦ（２n）の元）である。この楕円曲線上の点Ｐ（ｘ，ｙ）および単位元となる無限遠点Οの集合は、加算に関して群をなす。楕円曲線暗号は、この点の演算による離散対数問題に基づく暗号である。  楕円曲線上の点の演算は以下のものが定義されている。
〔楕円曲線上の点の加算〕
素体上の楕円曲線の場合：
楕円曲線上の点Ｐ＝（ｘ1，ｙ1）とすると、−Ｐ＝（ｘ1，−ｙ1）と定義される。また、楕円曲線上の点Ｐ＝（ｘ1，ｙ1）、Ｑ＝（ｘ2，ｙ2）、Ｒ＝（ｘ3，ｙ3）とし、Ｒ＝Ｐ＋ＱかつＰ≠−Ｐである場合、Ｒ＝（ｘ3，ｙ3）は次のように定義される。
【００１３】
0004676071.tif 000002
２の拡大体上の楕円曲線の場合：
楕円曲線上の点Ｐ＝（ｘ1，ｙ1）とすると、−Ｐ＝（ｘ1，ｙ1＋ｘ1）と定義される。また、楕円曲線上の点Ｐ＝（ｘ1，ｙ1）、Ｑ＝（ｘ2，ｙ2）、Ｒ＝（ｘ3，ｙ3）とし、Ｒ＝Ｐ＋ＱかつＰ≠−Ｐである場合、Ｒ＝（ｘ3，ｙ3）は次のように定義される。
【００１４】
Ｐ≠Ｑのとき：
ｘ3＝λ2＋λ＋ｘ1＋ｘ2＋ａ
ｙ3＝λ（ｘ1＋ｘ3）＋ｘ3＋ｙ1
λ＝（ｙ2＋ｙ1）／（ｘ2＋ｘ1）
Ｐ＝Ｑのとき：
ｘ3＝ｘ12＋ｂ／ｘ12
ｙ3＝ｘ12（ｘ1＋ｙ1／ｘ1）ｘ3＋ｘ3
これらの演算は、素体（mod p）もしくは２の拡大体（mod f）上の演算であるので、割り算は各体の上での逆数との乗算を行うことで計算できる。
〔逆数演算〕
逆数の演算は、拡張ユークリッドの互除法とその応用およびフェルマーの小定理を利用した方法に大別できる。たとえば、フェルマーの小定理を利用したものは次のように表すことができる。
【００１５】
素体上の楕円曲線の場合：
ａ-1≡ａP-2 mod p
２の拡大体の場合：
ａ-1≡ａ2^m-2 mod f
ただし、2^m−2＝２m−２とする。
【００１６】
このことから、フェルマーの小定理を用いた逆数演算は、べき乗剰余で求めることが可能である。
〔べき乗剰余演算〕
べき乗剰余ａk mod ｃは、ａをｋ回乗算して剰余演算を行えば計算することができるが、ｋの値が大きくなることにより計算量が膨大になることから、通常は、乗算剰余と自乗剰余を組み合わせたバイナリメソッド（Binary Method）や事前計算表を用いてバイナリメソッドを複数ビット単位（window)で行うウインドウメソッド（Window Method）などを用いて計算を行う。
【００１７】
バイナリメソッドは、E. D. Knuthが、"The art of computer programing vol. 2, Seminumerical Algorithm, 2nd ed." (Addison-Wesley, Reading, Mass. 1981)で述べている方式で、乗数ｋを２進数表現（Binary表現）し、最上位ビットから最下位ビットまで順に検査していって、そのビットの値が０なら自乗剰余演算を行い、ビットの値が１であれば自乗剰余演算を行ってから乗算剰余演算を行うという方式である。これを以下のalgorithm 1に示す。
〈algorithm 1, Binary Method〉
ｒ＝ａk mod ｃを求める。
【００１８】
ｋをｍビットとしてその２進数表現をｋ＝（ｋm-1、ｋm-2、・・・ｋ1、ｋ0）2とする。
0004676071.tif 000003
ウインドウメソッドにはいろいろなバリエーションがあるが、ここではもっとも基本的なものについて示す。バイナリメソッドと同様に、倍数ｋを２進数表現し、最上位から最下位ビットまでウィンドウ（Window）を当てはめていく。
【００１９】
たとえば、ｋ＝27622793＝11010010101111101100010012に４bit Windowを当てはめる場合、
1101 00 1010 1111 1011 000 1001
のように５つのWindowを当てはめることができる。このとき、ａ0(00002)からａ15(11112)までの値を事前に計算で求めた４bitテーブルを用意しておく必要がある。このように、４bitテーブルを当てはめたWindow内の値の乗算剰余演算と、自乗剰余演算とを組み合わせることによって、ウインドウメソッドによるべき乗剰余演算を行うことができる。そのアルゴリズムを以下のalgorithm 2に示す。
〈algorithm 2，Window Method〉
ｒ＝ａk mod ｃを求める。
【００２０】
ｋをｍビットとしてその２進数表現をｋ＝（ｋm-1、ｋm-2、・・・ｋ1、ｋ0）2とする。
Windowサイズをwビットとする。
【００２１】
0004676071.tif 000004
【００２２】
【発明が解決しようとする課題】
上述のようなバイナリメソッドやウインドウメソッドは一般的なべき乗剰余演算において高速演算を可能とする方法であって、計算対象を特定した場合には、その計算対象の性質を利用した計算方法を用いることにより、より高速な処理が可能となると考えられる。
【００２３】
２の拡大体上の逆数演算（ａ-1 mod ｆ）は、（ａ(2^m-2) mod ｆ）で置き換えることが可能であり、さらに指数（２＾ｍ−２）を２進数表現した場合、最下位ビットを除く全てのビットが１であるという特徴を有している。このような性質を利用して、特定のものを計算対象とするべき乗剰余演算および２の拡大体上の逆数演算の高速化に関して考察する。
【００２４】
指数の特徴を利用した高速べき乗剰余演算として、Lambert, Robert, J.；International Publication Number（PCT国際公開番号）WO99/63426号"Accelerated Cryptographic Operations"で開示されているものが存在する。ここでは、素体上の平方剰余演算を高速に行う方法が開示されており、指数を２進数表現した場合に１が２のべき乗数個連続する場合にのみ高速計算が可能なべき乗剰余演算方法が示されている。これを以下にalgorithm 3として示す。
〈algorithm 3〉
目的：ａ(2^k-1) mod ｐを計算する。
【００２５】
0004676071.tif 000005
このようなアルゴリズムを使用する場合、（１）の処理においてＢを計算しているため、指数をビット表現した場合の連続する１の数（algorithm 3中のｋの値）が２のべき数個連続する場合、即ちｋ＝２bと表現できる場合にのみ適用可能となっている。また、このアルゴリズムは、素体上の平方剰余演算を行うという制限だけではなく、法ｐの値がたとえばｐ＝２160−２31−１などの特殊な場合であることが適用の条件となっており、適用範囲が極めて狭いものとなっている。
【００２６】
本発明では、２の拡大体上の逆数演算に限定したアルゴリズムによって、▲１▼逆数演算をバイナリメソッドやウインドウメソッドなどの一般的なべき乗剰余演算を利用する方法より高速化すること、▲２▼特殊な条件を設けずに２の拡大体上の逆数演算に常に適用可能な演算を実現することを目的とする。
【００３１】
【課題を解決するための手段】
本発明では、２進数に変換した場合にｎ個のビット全てが１であるべき数（２n−１）によるべき乗剰余演算ａ(2^n)-1 mod ｆを行うべき乗剰余演算装置であって、被演算数ａが格納されるａレジスタと、変数ｓが格納されるｓレジスタと、変数ｔが格納されるｔレジスタと、演算結果が格納されるｒレジスタと、前記ｔレジスタ内の変数ｔによる自乗剰余演算を行う自乗剰余演算手段と、前記ｔレジスタ内の変数ｔと、前記ａレジスタ内の被演算数ａまたは前記ｓレジスタ内の変数ｓとによる乗算剰余演算を行う乗算剰余演算手段と、２進数に変換した（ｎ）を（ｎb-1，ｎb-2，・・・ｎ1，ｎ0）2、ｉ＝ｂ−２が０以上である場合、ｎi＝０の場合にレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行させその演算結果をレジスタｔに格納し、レジスタｔ内の変数ｔとレジスタｓ内の変数ｓの乗算剰余演算を前記乗算剰余演算手段により演算させてレジスタｓ内の変数ｓに代入し、変数ｉをデクリメントする第１演算制御手段と、ｎi＝１の場合にレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行させその演算結果をレジスタｔに格納し、レジスタｔ内の変数ｔとレジスタｓ内の変数ｓの乗算剰余演算を前記乗算剰余演算手段により演算させてレジスタｓ内の変数ｓに代入し、さらにレジスタｓ内の変数ｓをレジスタｔ内の変数ｔに代入し、前記自乗剰余演算手段による変数ｔの自乗剰余演算を実行してレジスタｔ内の変数ｔに代入し、前記乗算剰余演算手段による前記レジスタａ内の被演算数ａとレジスタｔ内の変数ｔとの乗算剰余演算を実行してこの演算結果をレジスタｓ内の変数ｓに代入し、変数ｉをデクリメントする第２演算制御手段と、ｉが０未満のとき、レジスタｓ内の変数ｓをレジスタｒに代入する第３演算制御手段と、前記自乗剰余演算手段による変数ｔの自乗剰余演算をループ回数loopだけ実行した後にループ変数loopの値を２倍し、前記乗算剰余演算手段による前記レジスタａ内の被演算数ａとレジスタｔ内の変数ｔとの乗算剰余演算を実行した後にループ変数loopに１を加算するループ変数制御手段と、を備えるべき乗剰余演算装置を提供する。
【００３２】
【発明の実施の形態】
〔２の拡大体上の逆数演算〕
本発明の第１実施形態を図を用いて説明する。
【００３３】
フェルマーの小定理を利用した２の拡大体ＧＦ（２m）上における逆数ａ-1の剰余演算は、ａ(2^m)-2 mod ｆで計算することができる。この指数２m−２をバイナリ表現すると、最下位ビットを除くすべてのビットが１となる。本発明では、このことを利用して高速にべき乗演算を行うものであり、以下にそのアルゴリズムを示す。
〈algorithm 4〉
（ｍ−１）＝（ｍb-1，ｍb-2，…，ｍ1，ｍ0）2とし、ｒ＝ａ(2^m)-2 mod ｆを計算する。ｉ，ｊ，ｓ，ｔ，loopは一時定数である。
【００３４】
0004676071.tif 000006
このアルゴリズムを実行するためのべき剰余演算装置の構成例を図１に示す。
【００３５】
このべき乗剰余演算装置１は、被演算数ａが格納されるａレジスタ１１と、変数ｓが格納されるｓレジスタ１２と、変数ｔが格納されるｔレジスタ１３と、演算結果が格納されるｒレジスタ１４と、ｔレジスタ１３内の変数ｔによる自乗剰余演算を行う自乗剰余演算部１５と、ｔレジスタ１３内の変数ｔとａレジスタ１１内の被演算数ａまたはｓレジスタ１２内の変数ｓとによる乗算剰余演算を行う乗算剰余演算部１６とを備えている。
【００３６】
このようなべき剰余演算装置において、２の拡大体ＧＦ（２m）上における逆数ａ-1の剰余演算ａ-1 mod ｆ＝ａ(2^m)-2 mod ｆを行う場合のフローチャートを図２に示す。
【００３７】
ステップＳ１では、各パラメータに初期値をセットする初期化処理を実行する。ここでは、被演算数ａをａレジスタ１１にセットするとともに、ｓレジスタ１２にａレジスタ１１にセットされた被演算数ａの値を代入する。自乗剰余演算を連続して行う際に用いるループ変数loopを１にセットする。さらに、べき数（２m−２）を２進数に変換した場合に連続する１の数がｍ個であり、（ｍ−１）を２進数に変換した場合のビット数をｂとした場合、（ｍ−１）＝（ｍb-1，ｍb-2，・・・ｍ1，ｍ0）2となる。ここで、演算制御に用いる変数ｉの値をｂ−２にセットする。
【００３８】
ステップＳ２では、変数ｉの値が０以上であるか否かを判別する。変数ｉの値が０以上であればステップＳ３に移行し、変数ｉの値が０未満であればステップＳ１０に移行する。
【００３９】
ステップＳ３では、ｓレジスタ１２に格納されている変数ｓの値をｔレジスタ１３に代入する。
ステップＳ４では、自乗剰余演算部１５によりｔレジスタ１３内の変数ｔの自乗剰余演算ｔ×ｔ mod ｆを実行してｔレジスタ１３に格納する。この処理をループ変数loopの値と同じ回数だけ繰り返してステップＳ５に移行する。
【００４０】
ステップＳ５では、乗算剰余演算部１６により、ｓレジスタ１２内の変数ｓの値と、ｔレジスタ１３内の変数ｔの値との乗算剰余演算を行い、その演算結果をｓレジスタ１２に格納する。また、ループ変数loopを２倍してループ変数loopの値を更新する。
【００４１】
このステップＳ３〜ステップＳ５の処理により、変数ｓによるべき乗剰余演算ｓ2^loop×ｓ mod ｆを実行することとなる。
ステップＳ６では、変数ｉの現在の値に基づいてｍiの値が１であるか否かを判別する。ｍiの値が１である場合にはステップＳ７に移行し、そうでない場合（ｍiの値が０である場合）にはステップＳ１１に移行する。
【００４２】
ステップＳ７では、ｓレジスタ１２に格納されている変数ｓの値をｔレジスタ１３に代入する。ステップＳ８では、自乗剰余演算部１５によりｔレジスタ１３内の変数ｔの自乗剰余演算ｔ×ｔ mod ｆを実行してｔレジスタ１３に格納する。
【００４３】
ステップＳ９では、乗算剰余演算部１６により、ｔレジスタ１３内の変数ｔの値と、ａレジスタ１１内の被演算数ａの値との乗算剰余演算を行い、その演算結果をｓレジスタ１２に格納する。また、ループ変数loopに１を加算してループ変数loopの値を更新する。この後、ステップＳ１１に移行する。
【００４４】
ここでは、ｍiの値が１の場合に、ステップＳ２〜ステップＳ５の処理を実行した後に、ステップＳ７〜ステップＳ９の処理を実行して、変数ｓによるべき乗剰余演算ｓ2×ａ mod ｆを実行することとなる。
【００４５】
ステップＳ１１では、変数ｉの値をデクリメントし、ステップＳ２に移行する。
ステップＳ２において、変数ｉの値が０未満であると判断した場合には、ステップＳ１０に移行する。ステップＳ１０では、ｓレジスタ１２に格納されている変数ｓの値をｔレジスタｔに代入し、自乗剰余演算部１５によりｔレジスタ１３内の変数ｔの自乗剰余演算ｔ×ｔ mod ｆを実行してｒレジスタ１４に格納する。
【００４６】
ステップＳ１０では、ｓレジスタ１４内の変数ｓの値は、２進数に変換した場合にｍ個の１が連続するようなべき数による被演算数ａのべき乗剰余演算結果となっている。このｓレジスタ１４内の変数ｓを値をｔレジスタに代入して自乗剰余演算を行うことで、ｍ個の１が連続し最下位のビットが０であるようなべき数のべき乗剰余演算結果を得ることができる。
【００４７】
図１において、ｓレジスタ１３と自乗剰余演算部１５とを接続することにより、ステップＳ１０において、ｓレジスタ１２からｔレジスタ１３への数値代入を省略し、ｓレジスタ１３の値を直接自乗剰余演算するように構成することも可能である。
〔べき乗剰余演算〕
また、アルゴリズム４と同じ考え方で、２進数に変換した場合にｎ個のビット全てが１であるようなべき数（２n−１）によるべき乗剰余演算を行うことが可能である。この場合のべき乗剰余演算方法を、次のalgorithm 5に示す。このalgorithm 5では、剰余演算を"mod f"のように２の拡大体上の剰余として記載しているが、素体上においても同じアルゴリズムでべき乗剰余演算（mod p）を行うことが可能である。
〈algorithm 5〉
（ｎ）＝（ｎb-1，ｎb-2，…，ｎ1，ｎ0）2とし、ｒ＝ａ(2^n)-1 mod ｆを計算する。ｉ，ｊ，ｓ，ｔ，loopは一時定数である。
【００４８】
0004676071.tif 000007
〔逆数演算における他の演算方法との比較〕
上述したような本発明の方法を用いてｍ＝１６３の場合の計算手順と途中経過の値を表１に示す。
【００４９】
ｍ＝１６３の場合、（ｍ−１）を２進数に変換すると、(10100010)2となり、計算を行う逆数は、ａ-1＝ａ7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEと表すことができる。なお、表１中、ｌはループ変数loopの値を示すものとする。
【００５０】
【表１】
0004676071.tif 000008
また、ｍ＝１６３の場合の計算手順と途中経過の値を、バイナリメソッドを用いた場合の例を表２に、ウインドウメソッドを用いた場合の例を表３に示す。
【００５１】
【表２】
0004676071.tif 000009
【００５２】
【表３】
0004676071.tif 000010
この結果から、本発明のべき乗剰余演算方法を用いた場合には、自乗剰余演算の回数はバイナリメソッドやウインドウメソッドの場合とほぼ同程度の回数必要であるが、乗算剰余演算の回数を大幅に削減することが可能となる。したがって、自乗剰余演算の計算量と乗算剰余演算の計算量とが同等であると仮定した場合、本発明による演算方法を用いた逆数演算の計算量は、バイナリメソッドを用いた場合の５３％であり、ウインドウメソッドを用いた場合の７８％となる。ただし、ウインドウメソッドの場合、テーブルを作成するための事前演算に乗算剰余演算を３０回必要とし、これを全体の演算回数に合計している。
【００５３】
一般的に、２の拡大体の拡大次数ｍが大きくなるに従って、自乗剰余演算回数と乗算剰余演算回数を合計した計算量も増加するが、本発明、バイナリメソッドおよびウインドウメソッドの各方式による演算回数と、拡大次数ｍとの対応を図３に示す。ただし、ここではウインドウメソッドのウインドウ幅は５としている。
【００５４】
図３に示すように、バイナリメソッドでは、本発明の演算方法による場合とウインドウメソッドによる場合に比して傾きが大きくなり、拡大次数ｍが５００になると演算回数がほぼ１０００回に達してしまう。ウインドウメソッドの場合であっても、拡大次数ｍが５００であれば演算回数が６００を超えることとなる。これに対して、本発明の演算方法による逆数演算の場合には、拡大次数ｍが５００になっても演算回数の下限値、上限値ともに５００程度となり、他の方式による演算回数より大幅に演算回数を削減することが可能となる。
【００５５】
したがって、本発明の演算方法を２の拡大体の逆数演算に用いることにより、他の一般的な演算方法よりさらに高速な演算を可能とする。また、本発明の演算方法では、ウインドウメソッドのようにテーブルの事前計算を必要としないため、テーブルを格納しておくレジスタを必要とせず、テーブル参照の処理を省略することができる。
【００５６】
さらに、前述したWO99/63426号に開示されているLambertの演算方法では、素体上の乗算剰余演算（平方剰余演算）に限定されており、特殊な条件下での適用だけ許されるもので、本発明の演算方法との直接的な比較は不可能である。あえて、Lambertの演算方法による演算回数を近い条件で換算して図３に表示するとすれば、拡大次数ｍの値が２bとなる点だけがプロットされることとなる。この点における演算回数は本発明の演算方法の場合とほぼ同様の結果になると考えられるが、Lambertの演算方法が適用の範囲の狭いということが明白である。したがって、本発明による演算方法は、広い範囲で適用することが可能であり、かつ高速演算を実現することが可能であるという点で従来の方法にはないべき乗剰余演算方法および逆数演算方法を提供することとなる。
〔正規基底の適用〕
２の拡大体にはPolynomial Base(PB：多項式基底)とNormal Base(NB：正規基底)と呼ばれる基底がある。正規基底の場合、多項式基底の場合に比較して乗算剰余演算の計算量は大きいが、自乗剰余演算をｍビットデータの１ビットローテーションシフト演算で計算可能であるという性質をもっている。このローテーションシフト演算は計算量が極めて小さくなるため、自乗剰余演算による計算量をほぼ０と仮定することができる。したがって、本発明の演算方法では、バイナリメソッドやウインドウメソッドを用いた場合に比して乗算剰余演算の回数を削減することができる上、２の拡大体に正規基底を用いることにより自乗剰余演算における計算量をほぼ０と見なすことができることから、バイナリメソッドを用いた場合の６％、ウインドウメソッドを用いた場合の１５％の計算量で逆数演算が可能となる。
【００５７】
このような正規基底を用いた場合のアルゴリズムを以下に示す。
〈algorithm 6〉
（ｍ−１）＝（ｍb-1，ｍb-2，…，ｍ1，ｍ0）2とし、ｒ＝ａ(2^m)-2 mod ｆを計算する。ｉ，ｊ，ｓ，ｔ，loopは一時変数である。
【００５８】
0004676071.tif 000011
このアルゴリズムを実行するために、図５に示すようなべき乗剰余演算装置を構成する。
【００５９】
このべき乗剰余演算装置２１は、被演算数ａが格納されるａレジスタ１１と、変数ｓが格納されるｓレジスタ１２と、変数ｔが格納されるｔレジスタ１３と、演算結果が格納されるｒレジスタ１４と、ｔレジスタ１３内の変数ｔまたはｓレジスタ１２内の変数ｓを左ローテーションシフトするシフト演算部１７と、ｔレジスタ１３内の変数ｔとａレジスタ１１内の被演算数ａまたはｓレジスタ１２内の変数ｓとによる乗算剰余演算を行う乗算剰余演算部１６とを備えている。
【００６０】
このようなべき乗剰余演算装置２１を用いて、algorithm 6を処理するフローチャートを図４に示す。
ステップＳ２１では、各パラメータに初期値をセットする初期化処理を実行する。ここでは、被演算数ａをａレジスタ１１にセットするとともに、ｓレジスタ１２にａレジスタ１１にセットされた被演算数ａの値を代入する。ローテーションシフトを連続して行う際に用いるループ変数loopを１にセットする。さらに、べき数（２m−２）を２進数に変換した場合に連続する１の数がｍ個であり、（ｍ−１）を２進数に変換した場合のビット数をｂとした場合、（ｍ−１）＝（ｍb-1，ｍb-2，・・・ｍ1，ｍ0）2となる。ここで、演算制御に用いる変数ｉの値をｂ−２にセットする。
【００６１】
ステップＳ２２では、変数ｉの値が０以上であるか否かを判別する。変数ｉの値が０以上であればステップＳ２３に移行し、変数ｉの値が０未満であればステップＳ２８に移行する。
【００６２】
ステップＳ２３では、ｓレジスタ１２に格納されている変数ｓの値をｔレジスタ１３に代入する。
ステップＳ２４では、シフト演算部１７によりｔレジスタ１３内の変数ｔをループ変数loopの値だけ左ローテーションシフトし、ｔレジスタ１３に格納する。
【００６３】
ステップＳ２５では、乗算剰余演算部１６により、ｓレジスタ１２内の変数ｓの値と、ｔレジスタ１３内の変数ｔの値との乗算剰余演算を行い、その演算結果をｓレジスタ１２に格納する。また、ループ変数loopを２倍してループ変数loopの値を更新する。
【００６４】
ステップＳ２６では、変数ｉの現在の値に基づいてｍiの値が１であるか否かを判別する。ｍiの値が１である場合にはステップＳ２７に移行し、そうでない場合（ｍiの値が０である場合）にはステップＳ２９に移行する。
【００６５】
ステップＳ２７では、ｓレジスタ１２に格納されている変数ｓの値をｔレジスタ１３に代入し、シフト演算部１７によりｔレジスタ１３内の変数ｔを１ビットだけ左ローテーションシフトし、その値をｔレジスタ１３に代入する。さらに、乗算剰余演算部１６により、ｔレジスタ１３内の変数ｔの値と、ａレジスタ１１内の被演算数ａの値との乗算剰余演算を行い、その演算結果をｓレジスタ１２に格納する。また、ループ変数loopに１を加算してループ変数loopの値を更新する。この後、ステップＳ２９に移行する。
【００６６】
ステップＳ２９では、変数ｉの値をデクリメントし、ステップＳ２２に移行する。
ステップＳ２２において、変数ｉの値が０未満であると判断した場合には、ステップＳ２８に移行する。ステップＳ２８では、シフト演算部１７によりｓレジスタ１２に格納されている変数ｓの値を１ビットだけ左ローテーションシフトし、その値をｒレジスタ１４に格納する。
〔他の技術への応用〕
以上の実施形態では、２の拡大体上の楕円曲線における点の演算に関して説明を行っており、楕円曲線暗号への応用を示唆するものである。これとは別に、その他の信号処理や符号処理など、２の拡大体上の演算を使用するような分野への応用が可能である。また、逆数演算に適用した場合の実施形態を開示しているが、２進数に変換した場合に１が連続するようなべき数によるべき乗剰余演算に適用することが可能であり、素体上のべき乗剰余演算、２の拡大体上の他のべき乗剰余演算に利用することが可能である。
【００６７】
【発明の効果】
本発明によれば、バイナリメソッドやウインドウメソッドを用いた場合のべき乗剰余演算、逆数演算に比して計算量が大幅に削減することができ、高速演算を可能にする。また、ウインドウメソッドのように、事前にテーブルの作成を行うことがないため、テーブルを格納するためのレジスタを不要とし、テーブル参照の処理を省略することが可能である。
【図面の簡単な説明】
【図１】本発明の１実施形態の制御ブロック図。
【図２】その制御フローチャート。
【図３】２の拡大体の拡大次数ｍと計算量との関係を示す特性図。
【図４】正規基底を用いた場合のフローチャート。
【図５】正規基底を用いる場合の制御ブロック図。
【図１】
0004676071.tif 000012
【図２】
0004676071.tif 000013
【図３】
0004676071.tif 000014
【図４】
0004676071.tif 000015
【図５】
0004676071.tif 000016