(57)【特許請求の範囲】
【請求項１】
所定の桁数でなる数値ブロックの値を被乗数に乗算した値を予め演算する事前計算手段と、整数を非隣接型符号付き２進数に変換するＮＡＦ変換手段と、非隣接型符号付き２進数を最上位ビットが０でない前記所定の桁数の数値ブロックに分解し、分解された数値ブロックと被乗数とを乗算した値を前記事前計算手段により演算した結果から取得して計算結果とするウィンドウ演算手段と、所定の桁数に満たなかった最終の数値ブロックについて当該数値ブロックと被乗数との乗算を実行する後処理手段とを備えるスカラー倍算装置におけるスカラー倍算演算方法であって、
所定の桁数でなる数値ブロックのうち、非隣接型符号付き２進数に現れるものであって最上位ビットが１となる数値ブロックの値を、被乗数に乗算した値を前記事前計算手段により予め演算する段階と、
前記事前計算手段により演算された値を数値ブロックの値と対応させたテーブルとしてテーブル記憶手段に格納する段階と、
乗数をＮＡＦ変換手段によって非隣接型符号付き２進数に変換する段階と、
前記ＮＡＦ変換手段によって非隣接型符号付き２進数に変換された乗数を、前記ウィンドウ演算手段により、上位ビットより順に最上位ビットが０でない前記所定の桁数でなる数値ブロックに分解し、分解された数値ブロックに応じて前記テーブル記憶手段に保存されたテーブルを参照し、事前計算手段によって演算された値を前記乗数と被乗数との演算結果として取得する段階と、
前記後処理手段により、前記テーブル記憶手段に格納されたテーブルを参照し、所定の桁数に満たない最終の数値ブロックの値に対応する値を取得してこの値に基づいて演算を実行する段階と、
を備えるスカラー倍算方法。
【請求項２】
前記事前計算手段により予め演算する段階は、最上位２ビットが"10"となる数値ブロックの値を、被乗数に乗算した値を予め演算することを特徴とする、請求項１に記載のスカラー倍算方法。
【請求項３】
前記事前計算手段は、前記テーブルを作成するために計算した途中の値を、前記テーブルに追加して保存しておくことを特徴とする、請求項１または２に記載のスカラー倍算方法。
【請求項４】
前記後処理手段は、非隣接型符号付き２進数に変換した乗数の値を最上位ビットが０でない所定の桁数でなる数値ブロックに分解した際に、最終の数値ブロックが前記所定の桁数に満たない場合に、この最終の数値ブロックのみ前記テーブルの値を組み合わせて演算することを特徴とする、請求項１〜３のいずれかに記載のスカラー倍算方法。
【請求項５】
楕円曲線上の点の演算に用いることを特徴とする、請求項１〜４のいずれかに記載のスカラー倍算方法。
【請求項６】
所定の桁数でなる数値ブロックのうち、非隣接型符号付き２進数に現れるものであって最上位ビットが１となる数値ブロックの値を、被乗数に乗算した値を予め演算する事前計算手段と、
前記事前計算手段によって演算された値を数値ブロックの値と対応させたテーブルとして保存するテーブル記憶手段と、
乗数を非隣接型符号付き２進数に変換するＮＡＦ変換手段と、
前記ＮＡＦ変換手段によって非隣接型符号付き２進数に変換された乗数を、上位ビットより順に、最上位ビットが０でない前記所定の桁数でなる数値ブロックに分解し、前記テーブル記憶手段に保存されたテーブルを参照し、事前計算手段によって演算された値を前記定数と被乗数との演算結果として取得するウィンドウ演算手段と、
非隣接型符号付き２進数に変換した乗数の値を最上位ビットが０でない所定の桁数でなる数値ブロックに分解した際に、最終の数値ブロックが前記所定の桁数に満たない場合に、前記テーブル記憶手段に保存されたテーブルを参照し、最終の数値ブロックの値に対応する値を取得してこの値に基づいて演算を実行する後処理手段と、
を備えるスカラー倍算装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、整数を乗数とするスカラー倍算の方法およびその装置に関し、特に、公開鍵暗号系である楕円曲線暗号処理における基本演算である楕円曲線上の点のスカラー倍算処理を行うために用いられるスカラー倍算方法およびその装置に関する。
【０００２】
【従来の技術】
近年のコンピュータネットワークの発達により、データベースの検索や電子メール、電子ニュースなどの電子化された情報をネットワークを経由して送受信する機会が急速の増加してきている。さらに、これらを利用して、オンラインショッピングなどのサービスも提供されつつある。しかし、それに伴って、ネットワーク上の電子化されたデータを盗聴したり、改竄したり、または他人になりすましてサービスを受けるなどの違法行為についての問題が浮上してきている。特に、無線を利用したネットワークにおいては、傍受が容易なためこれらを防止する対策が望まれている。
【０００３】
これらの問題に対して暗号技術を応用した暗号化電子メールや利用者認証システムが提案され、種々のネットワークにも導入されつつあり、コンピュータネットワークにおいて暗号化は必須の技術となりつつある。
【０００４】
暗号化方式は、大別すると秘密鍵暗号系と公開鍵暗号系の２つの分類することができる。
【０００５】
秘密鍵暗号系は、送信者と受信者が同じ鍵を持つことにより暗号通信を行う方式である。すなわち、秘密鍵暗号系では、あるメッセージを秘密の暗号鍵に基づいて暗号化し相手に送り、受け手はこの暗号鍵を用いて暗号分を複合化しもとのメッセージに戻して情報を入手する。
【０００６】
公開鍵暗号系は、送信者は公開されている受信者の公開鍵でメッセージを暗号化して送信し、受信者は自分の秘密鍵でその暗号化メッセージを復号することで通信を行う方式である。すなわち、公開鍵暗号系では、公開鍵は暗号化のための鍵、秘密鍵は公開鍵により暗号化された暗号を復号するための鍵であり、公開鍵で暗号化した暗号が秘密鍵でのみ復号することができる。
【０００７】
秘密鍵暗号系では、個人が秘密に保管しなければならない鍵の数が通信相手の数だけ必要であり、必要な総鍵数はｎ人のネットワークの場合、ｎ（ｎ−１）／２個である。また、はじめて通信をする相手に対しては、何らかの方法で秘密鍵の配送を行う必要があるという点で欠点がある。この問題を避けるために、大規模なネットワークでは、鍵管理センタを設置し、センタとの間の秘密鍵のみを保管し、暗号通信を行う場合はセンタから送信相手との秘密鍵を得る方法が用いられる。この場合秘密鍵の総数はｎとなる。
一方公開鍵暗号系では、個人が秘密に保管する鍵は自分の秘密鍵のみであり、必要な総秘密鍵数もｎ人のネットワークの場合、ｎ個である。また、はじめて通信する相手に対しては、公開鍵の配送を行えばよく、鍵管理センタを設置して、ユーザの公開鍵をｎ個公開簿に登録し、センタから送信相手の公開鍵を得る方法が用いられる。この場合、センタは公開鍵の改竄を防ぐだけで、秘密に保管する必要がない。ただし、公開鍵方式は秘密鍵方式に比べて鍵のビット数が大きいため保管に要するファイルサイズが大きくなるという問題を内包している。
【０００８】
また、認証の場合、秘密鍵暗号系では、例えば、送信するメッセージを秘密鍵で圧縮変換し、送信文に付加して送り、受信側では同様に圧縮変換して比較する方式がとられている。しかし、送受信が同じ鍵であるため受信者は認証データを偽造することができる。
【０００９】
これに対して、公開鍵暗号系では、秘密鍵で暗号化することができるのは本人だけであるという特徴を利用する。送信者はメッセージを圧縮変換して秘密鍵で暗号化し、送信文に付加して送り、受信者は送信者の公開鍵で付加されたデータを復号化し、同様に圧縮変換したものと比較する方式がとられている。この場合は受信者が不正できない。
【００１０】
このように、認証系では公開鍵暗号系の技術は必要不可欠であるといえる。しかし、公開鍵暗号系には、暗号化／復号化に大量の処理が必要であるという大きな欠点があるため、一般には処理の速い秘密鍵暗号系をメッセージの暗号化に、公開鍵暗号系は認証用にというように組み合わせて用いられる場合が多い。
【００１１】
公開鍵暗号系の中で、現在標準化が進んでいるものに、楕円曲線暗号（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＋ｂ（ｍｏｄ  ｆ），ｆ：既約多項式）である。この楕円曲線上の点Ｐ（ｘ，ｙ）および単位元となる無限遠点Οの集合は、加算に関して群をなす。楕円曲線は、この点の演算による離散対数問題に基づく暗号である。
〔楕円曲線の点の演算と離散対数問題〕
楕円曲線上の点の演算は以下のものが定義されている。
加算：Ｒ＝Ｐ＋Ｑ＝Ｑ＋Ｐ
２倍算：Ｒ＝２Ｐ＝Ｐ＋Ｐ
減算：Ｒ＝Ｐ−Ｑ
零点：Ο（無限遠点）＝Ｐ−Ｐ
スカラー倍算：ｋＰ＝Ｐ＋Ｐ＋・・・＋Ｐ（ｋ個のＰの和）
ここで、ｋＰとＰからｋを計算することは困難である。このことは、楕円曲線の離散対数問題と呼ばれており、この離散対数問題に関連する計算の困難性に基づいて公開鍵系の暗号とすることができる。
【００１２】
たとえば、公開鍵暗号系として知られる（有限体上の）ディッフィ−ヘルマン（Diffie-Hellman）鍵交換と同様の鍵交換方式を実現することができる。楕円曲線上のベースポイントをＧとし、Ａの秘密鍵をｓaとしＰａ＝ｓaＧを演算して公開鍵とする。また、Ｂの秘密鍵をｓbとし、Ｐｂ＝ｓbＧを演算してこれを公開鍵とする。ＡはＢの公開鍵Ｐｂと自分の秘密鍵ｓaから、ＫAB＝ｓaＰｂ＝ｓaｓbＧを演算することによって共通鍵を得ることができる。また、同様にして、ＢはＡの公開鍵Ｐａと自分の秘密鍵ｓbから、ＫBA＝ｓbＰａ＝ｓbｓaＧを演算することによって共通鍵を得ることができる。この方式は、ＥＣＤＨ（Elliptic Curve Diffie-Hellman）方式と呼ばれ、秘密鍵ｓa，ｓbをスカラー量として楕円曲線上の点Ｇ、Ｐａ、Ｐｂに乗算する必要があり、暗号化／復号化の際に大量の演算処理を必要とする。この他にＥＣＤＳＡ方式やＥＣＥＳ方式なども提案されているが、演算処理が大きくなる点については同様である。
〔楕円曲線上の点のスカラー倍算〕
楕円曲線上の点のスカラー倍算は上記のように定義されるが、ｋの値が大きくなると計算量が膨大となるため、通常は、加算と２倍算を組み合わせたバイナリメソッド（Binary Method）や加算と２倍算、減算を組み合わせたサインドバイナリメソッド（Signed Binary Method）、事前計算表を用いて用いてバイナリメソッドを複数ビット単位で行うウィンドウメソッド（Window Method）などを用いて計算を行うことが提案されている。
【００１３】
バイナリメソッドは、E. D. Knuthが、"The art of computer programing vol. 2, Seminumerical Algorithm, 2nd ed." (Addison-Wesley, Reading, Mass. 1981)で述べている方式で、乗数ｋを２進数表現（Binary表現）し、最上位ビットから最下位ビットまで順に検査していって、そのビットの値が０なら２倍算を行い、ビットの値が１であれば２倍算を行った後加算するという方式である。
【００１４】
サインドバイナリメソッドは、F. Morain and J. Olivosが、"Speeding up the computations on an elliptic curve using addition-subtraction chains." (Inform. Theory Appl. 24, 1990)で提案している方式であり、乗数ｋを符号付き２進数表現（Signed Bainary表現）し、最上位ビットから最下位ビットまで順に検査していき、そのビットの値が０なら２倍算を行い、ビットの値が１なら２倍算を行った後加算し、ビットの値が−１であれば２倍算を行った後減算を行うという方式である。符号付き２進数表現は、−１，０，１によって表現するものであって、１つの値について複数の表現方法があり、どの表現を採用するかによって演算の速度が異なってくる。
【００１５】
ウィンドウメソッドには、いろいろなバリエーションがあり、もっとも基本的なものでは、乗数ｋを２進数表現に変換し、最上位ビットから最下位ビットまでを所定の桁数でなる数値ブロックに分割し、予め演算したテーブルを当てはめていく。たとえば、ｋ＝27622793＝11010010101111101100010012である場合、この乗数ｋに上位から４ビットのウィンドウを当てはめるなら、
1101  0010  1011  1110  1100  0100  1
となる。この場合には、被乗数Ｐに４ビットの数値ブロックの値を乗算した値、0P（00002P）から15P（11112P）を事前に計算しておき、テーブルとして保存しておく必要がある。
【００１６】
数値ブロックの最上位ビットが１となるように４ビットのウィンドウを当てはめた場合には、上記乗数ｋは、
1101  00  1010  1111  1011  000  1001
と５つのウィンドウを当てはめることとなる。この場合には、最上位ビットが１となる数値ブロックについてのみ事前計算を行ってテーブルとして保存しておけばよいと考えられる。ただし、最終の数値ブロックは、所定の桁数（この場合４ビット）とならない可能性があるため、最上位ビットが１とならない数値ブロックについても事前計算を行ってテーブル化しておく必要があり、やはり、0P（00002P）から15P（11112P）のすべてを事前計算する必要がある。
【００１７】
このように、ウィンドウメソッドでは、当てはめたウィンドウの値の加算と、２倍算を組み合わせることで、スカラー倍算を計算することができる。
【００１８】
前述したようなサインドバイナリメソッドとウィンドウメソッドとを複合したものとして、宮地、小野、H. Cohenが、"Efficient elliptic curve exponetiation, ICICS '97, 1997" で提案したものがある（以下、ＭＯＣ方式と称す）。
【００１９】
このＭＯＣ方式では、乗数を２進数表現とし、これに所定の桁数でなるウィンドウを最下位のビットから順に割り当てていき、割り当てたウィンドウのすぐ上位のビットが１の場合、ウィンドウの値をマイナス２の補数とし、すぐ上位に１を加算する。例えば、上記乗数ｋ＝27622793＝11010010101111101100010012に４ビットのウィンドウを当てはめる場合、
11010010101111  1011  000  1001
となり、２つ目のウィンドウ"1011"の上位のビットは１である。したがって、このウィンドウの値を補数として、"0101"（下線付きをマイナスとする）とし、その上位ビットに１を加算する。
【００２０】
11010010110000  0101  000  1001
この後、さらにウィンドウを当てはめて行くことによって、次のようになる。
【００２１】
1101  00  1011  0000  0101  000  1001
このことにより、ＭＯＣ方式の場合、ウィンドウの数は、上述したような通常のウィンドウメソッドの場合よりも少なくすることができる。また、１つのウィンドウの上位に位置するビットは必ず０となるようにしているため、ウィンドウの１回割り当てあたりの平均処理ビット数は、ウィンドウ幅＋２となる。
【００２２】
バイナリメソッド、サインドバイナリメソッド、ウィンドウメソッド、宮地方式について、１６０ビット程度の楕円曲線の点の演算に用いた（ウィンドウメソッドについては４ビットウィンドウを用いた）場合の計算回数は以下のようになる。
【００２３】
【表１】
0003797808.tif 000002
【００２４】
【発明が解決しようとする課題】
上述したように、ウィンドウメソッド系の処理では、合計の加算回数が少なくなり、バイナリメソッド系の処理に比して高速な処理が可能になると考えられる。しかしながら、事前計算を必要としないバイナリメソッド系の平均加算回数に比してウィンドウメソッド系の加算回数は１／２程度に軽減されているに止まっている。
【００２５】
従来のウィンドウ方式において、スカラー倍算を高速化するためにはテーブルを大きくとる必要があり、このテーブルを格納しておく領域を確保する必要がある。しかしながら、上述したように、大きなテーブルを用意しても有効に利用しているとは言い難く、このテーブルを格納する領域を無駄にしている。また、テーブルを大きくすることで事前計算の処理に時間を要し、スカラー倍算自体は高速であるが、トータルでの高速化が考慮されていないといった問題を有している。このことは、ウィンドウメソッドを利用したＭＯＣ方式であっても同様のことが言える。
【００２６】
本発明の目的は、テーブル数を削減して有効利用することにより、テーブル格納領域を削減し、事前計算の回数を削減してトータルでの演算の高速化を図ることを可能としたスカラー倍算方法およびその装置を提案することにある。
【００２７】
【課題を解決するための手段】
本発明に係るスカラー倍算方法は、整数を乗数とするスカラー倍算において、乗数を非隣接型（nonadjacent form）符号付き２進数（以下、ＮＡＦと称す）に変換し、ＮＡＦに変換された乗数を上位ビットより順に最上位ビットが０でない所定の桁数でなる数値ブロックに分解して固定幅ウィンドウによるウィンドウ法を用いて演算することを特徴としている。
【００２８】
ＮＡＦは、０でないビット（１または−１）が連続しないような符号付き２進数表現であり、０でないビットの数が最小となる。したがって、加算回数を軽減することができる。また、ＮＡＦは０でないビットが隣接しないため、最上位ビットが０でない数値ブロックで分割した際に、出現する数値ブロックの種類が限られる。したがって、テーブルを必要最小限に削減することができ、事前計算の回数を軽減することができる。
【００２９】
ここで、所定の桁数でなる数値ブロックのうち、ＮＡＦに現れるものであって最上位ビットが１となる数値ブロックの値を、被乗数に乗算したものを予め演算してテーブルとして保存しておく構成にできる。例えば、ウィンドウ幅が４ビットの場合、最上位ビットが１となる値は、10102（＝６）、10012（＝７）、10002（＝８）、10012（＝９）、10102（＝１０）の５つだけであり、被乗数Ｐにこれを乗算した６Ｐ、７Ｐ、８Ｐ、９Ｐ、１０Ｐを事前計算してこれをテーブルとすればよいこととなる。
【００３０】
また、テーブルを作成するために計算した途中の値を、テーブルに追加して保存しておくように構成できる。
【００３１】
さらに、非隣接型符号付き２進数に変換した乗数の値を最上位ビットが０でない所定の桁数でなる数値ブロックに分解した際に、最終の数値ブロックが所定の桁数に満たない場合に、この最終の数値ブロックのみテーブルの値を組み合わせて演算するように構成できる。
【００３２】
最終の数値ブロックが所定の桁数に満たなかった場合には、所定の桁数であって最上位ビットが１となる数値ブロックのみで計算することができないため、テーブルを作成するために計算した途中の値とテーブルの値とを利用してこれを算出するようにする。たとえば、ウィンドウ幅が４ビットの場合に、最終の数値ブロックに１〜３ビットの値が残る可能性がある。したがって、最終の数値ブロックが採り得る値は、−１０Ｐ〜＋１０Ｐの範囲ですべての値をとり得る。前述の事前計算で、６Ｐ、７Ｐ、８Ｐ、９Ｐ、１０Ｐを計算する際に、途中で計算を行う２Ｐ、４Ｐをテーブルに追加して保存しておけば、±１ＰはＰの値をそのまま用い、±２または±４Ｐの場合２Ｐまたは４Ｐをそのまま使うことができ、±３Ｐの場合２Ｐ＋Ｐの演算を行い、±５Ｐの場合４Ｐ＋Ｐの演算を行うことで算出することが可能となる。
【００３３】
このようなスカラー倍算は、楕円曲線上の点の演算に用いることができ、楕円曲線暗号を演算する際に利用することができる。また、整数演算に用いることも可能である。
【００３４】
さらに、本発明に係るスカラー倍算装置では、所定の桁数でなる数値ブロックのうち、非隣接型符号付き２進数に現れるものであって最上位ビットが１となる数値ブロックの値を、被乗数に乗算した値を予め演算する事前計算手段と、事前計算手段によって演算された値をテーブルとして保存するテーブル記憶手段と、乗数を非隣接型符号付き２進数に変換するＮＡＦ変換手段と、ＮＡＦ変換手段によって非隣接型符号付き２進数に変換された乗数を、上位ビットより順に、最上位ビットが０でない所定の桁数でなる数値ブロックに分解し、テーブル記憶手段に保存されたテーブルを適用するウィンドウ演算手段と、非隣接型符号付き２進数に変換した乗数の値を最上位ビットが０でない所定の桁数でなる数値ブロックに分解した際に、最終の数値ブロックが所定の桁数に満たない場合に、この最終の数値ブロックのみテーブルの値を組み合わせて演算する後処理手段とを備えている。
【００３５】
【発明の実施の形態】
本発明に係るスカラー倍算装置の１実施形態を図１を用いて説明する。
【００３６】
このスカラー倍算装置１は、通常のＣＰＵおよびメモリを搭載したコンピュータにより実現されるものであって、主に記憶手段２と演算手段３とで構成される。
【００３７】
記憶手段２は、乗数ｋや被乗数Ｐおよび演算結果などを記憶しておく通常記憶部２１と、事前計算により作成されたテーブルを格納しておくテーブル記憶部２２とを備えている。
【００３８】
演算手段３は、所定の桁数でなる数値ブロックのうち、ＮＡＦに現れるものであって最上位ビットが１となるものについて、その値を被乗数Ｐに乗算した値を予め演算する事前計算手段３１を備えている。例えば、ウィンドウ幅が４ビットの場合、最上位ビットが１となる値は、10102（＝６）、10012（＝７）、10002（＝８）、10012（＝９）、10102（＝１０）の５つだけであり、被乗数にこれを乗算した６Ｐ、７Ｐ、８Ｐ、９Ｐ、１０Ｐを事前計算する。事前計算手段３１では、この６Ｐ、７Ｐ、８Ｐ、９Ｐ、１０Ｐとこの計算の途中で得られる２Ｐ、４Ｐについてテーブルとして記憶手段２のテーブル記憶部２２に保存する。
【００３９】
また、演算手段３は、乗数ｋをＮＡＦに変換するＮＡＦ変換手段３２を備えている。このＮＡＦ変換手段３２は、G. Reitwiesnerが"Binaryarithmetic, Advances in Computers, 1 (1960), pp. 231-308"で提案した変換方法などを実現するものであり、記憶手段２に格納されている乗数ｋを０でないビットが隣接しないようなサインドバイナリ表現に変換する。
【００４０】
さらに、演算手段３は、ＮＡＦに変換された乗数ｋを上位ビットから順に所定の桁数でなる数値ブロックに分解し、テーブル記憶部２２に格納されているテーブルを各数値ブロックに適用するウィンドウ演算手段３３を備えている。
【００４１】
また、演算手段３は、ＮＡＦに変換された乗数ｋを上位ビットから順に所定の桁数でなる数値ブロックに分解した際に、最終の数値ブロックが所定の桁数に満たない場合に、テーブルに格納されている値を用いてこの最終の数値ブロックの値を演算する後処理手段３４を備えている。
【００４２】
次に、本発明に係るスカラー倍算方法について詳細に説明する。
【００４３】
図２において、ステップＳ１では、被乗数Ｐおよび乗数ｋが入力される。この値はシステムが自動的に選択する数値であってもよく、ユーザが入力する任意の値であってもよい。
【００４４】
ステップＳ２では、被乗数Ｐに対する事前計算を行ってテーブルを作成するテーブル作成処理を実行する。
【００４５】
ステップＳ３では、乗数ｋをＮＡＦに変換するＮＡＦ変換処理を実行する。
【００４６】
ステップＳ４では、ＮＡＦに変換された乗数ｋをウィンドウメソッドを用いて上位のビットから順に所定の桁数でなる数値ブロックに分割し、テーブルの値を適用するとともに、２倍算および加算を行うウィンドウ演算処理を実行する。
【００４７】
ステップＳ５では、最終の数値ブロックが所定の桁数に満たない場合に、テーブルに格納された値を使ってこの最終ブロックの値を演算する後処理を実行する。
【００４８】
ステップＳ６では、演算結果を出力し、例えば記憶手段２に格納する。
〔事前計算〕
ステップＳ２におけるテーブル作成処理を図３にフローチャートとして示す。ここでは、ウィンドウ幅を４ビットとしたウィンドウメソッドを用いることとする。
【００４９】
ステップＳ１１では、被乗数Ｐに２をかけた値２Ｐ＝Ｐ＋Ｐを計算し、これを記憶手段２に格納する。ステップＳ１２では、被乗数Ｐに４をかけた値４Ｐ＝２Ｐ＋２Ｐを計算し、これを記憶手段２に格納する。
【００５０】
ステップＳ１３では、被乗数Ｐに８をかけた値８Ｐ＝４Ｐ＋４Ｐを計算し、これをテーブル記憶部２２のtable[2]として保存する。ステップＳ１４では、被乗数Ｐに７をかけた値７Ｐ＝８Ｐ−Ｐ＝table[2]−Ｐを計算し、これをテーブル記憶部２２のtable[1]として保存する。ステップＳ１５では、被乗数Ｐに９をかけた値９Ｐ＝８Ｐ＋Ｐ＝table[2]＋Ｐを計算し、これをテーブル記憶部２２のtable[3]として保存する。
【００５１】
ステップＳ１６では、被乗数Ｐに６をかけた値６Ｐ＝７Ｐ−Ｐ＝table[1]−Ｐを計算し、これをテーブル記憶部２２のtable[0]として保存する。ステップＳ１７では、被乗数Ｐに１０をかけた値１０Ｐ＝９Ｐ＋Ｐ＝table[3]＋Ｐを計算し、これをテーブル記憶部２２のtable[4]として保存する。
【００５２】
このことにより、テーブル記憶部２２には、図４に示すようなテーブルが作成されることとなる。すなわち、ａ＝０〜４について、table[ａ]の値がそれぞれ、６Ｐ，７Ｐ，８Ｐ，９Ｐ，１０Ｐとして格納される。また、このテーブルとは別に、計算途中で得られる値２Ｐ，４Ｐもこの記憶手段２内に保存されることとなる。
〔ＮＡＦへの変換〕
乗数ｋをＮＡＦに変換する方法は、前述したように、G. Reitwiesnerの提案する方法などを用いて実現することができる。
【００５３】
例えば、乗数ｋ＝27622793＝110100101011111011000010012をＮＡＦに変換した場合には、
10101010101000001010001001
となる（値が−１となるビットを"1"で示すこととする）。
〔ウィンドウ演算処理〕
ステップＳ４におけるウィンドウ演算処理について、図５に示すフローチャートに基づいて説明する。
【００５４】
ステップＳ２１では、乗数ｋの値をＮＡＦに変換したときの桁数がｎであれば（ｎ−１）の値を変数ｉとして取り込む。ここでは、乗数ｋをＮＡＦに変換したときの値が（ｋ159，ｋ158，ｋ157・・・ｋ1，ｋ0）でなりその桁数が１６０ビットである場合を想定し、ｉ＝１５９とする。ステップＳ２２では、ＮＡＦ変換した乗数ｋを上位ビットから４桁のウィンドウ幅で取り込み、ウィンドウ値Ｗ＝（ｋi，ｋi-1，ｋi-2，ｋi-3）とする。この時のウィンドウ値Ｗは、Ｗ＝（ｋ159，ｋ158，ｋ157，ｋ156）となる。ステップＳ２３では、この時のウィンドウ値Ｗから６を引いた値のテーブルを参照して、これを演算結果Ｒの初期値とする。たとえば、Ｗ＝10002＝８であれば、table[2]を参照して、Ｒ＝８Ｐとする。
【００５５】
ステップＳ２４では、変数ｉから４をデクリメントする。ステップＳ２５では、乗数ｋについて現在のウィンドウの下にさらにビットが存在するか否かを判別する。変数ｉの値が０よりも大きい場合に、次のビットが存在するとして、ステップＳ２６に移行する。ステップＳ２６では、乗数ｋについて現在のウィンドウの下に位置する次のビットｋiが０であるか否かを判別する。次のビットｋiが０であると判断した場合、ステップＳ２７に移行する。ステップＳ２７では、Ｒの値を２倍算し、Ｒ＝２Ｒとする。ステップＳ２８では変数ｉから１をデクリメントして、ステップＳ２５に移行する。
【００５６】
ステップＳ２６において、次のビットｋiが０でないと判断した場合には、ステップＳ２９に移行する。ステップＳ２９では、乗数ｋについて現在のウィンドウの下に位置するビット数が４ビット以下になったか否かを判別する。ここで、変数ｉの値が３以下であれば、乗数ｋについて現在のウィンドウの下に位置するビット数が４ビット以下になったと判断してメインルーチンに復帰する。また、変数ｉの数が４以上であれば、ステップＳ３０に移行する。
【００５７】
ステップＳ３０では、Ｒの値を２倍算し、Ｒ＝２Ｒとする。ステップＳ３１、Ｓ３２、Ｓ３３では、同様にＲの値を２倍算し、Ｒ＝２Ｒとする。したがって、ステップＳ３０〜Ｓ３３では、Ｒ＝２4Ｒを計算することとなる。
【００５８】
ステップＳ３４では、次のウィンドウについて、ウィンドウ値Ｗを取り込む。ステップＳ３５では、取り込んだウィンドウ値Ｗの値が０より大きいか否かを判別する。ウィンドウ値Ｗが０よりも大きい場合には、ステップＳ３６に移行する。ステップＳ３６では、（Ｗ−６）の値に対応するテーブルを参照し、Ｒの値に加算して、Ｒ＝Ｒ＋table[Ｗ−６]を計算する。したがって、このときのウィンドウ値Ｗ＝10012＝９であれば、Ｒ＝Ｒ＋table[3]＝Ｒ＋９Ｐを計算することとなる。また、ステップＳ３５において、ウィンドウ値Ｗが０よりも小さいと判別した場合には、ステップＳ３７に移行する。ステップＳ３７では、（−Ｗ−６）の値に対応するテーブルを参照し、Ｒの値からこれを減算して、Ｒ＝Ｒ−table[−Ｗ−６]を計算する。例えば、ウィンドウ値Ｗ＝10012＝−９であれば、Ｒ＝Ｒ−table[3]＝Ｒ−９Ｐを計算することとなる。ステップＳ３８では、変数ｉの値から４だけデクリメントし、ステップＳ２５に移行する。
【００５９】
ステップＳ２５において乗数ｋについて現在のウィンドウの下に次のビットが存在しないと判別した場合およびステップＳ２９において乗数ｋについて現在のウィンドウの下にあるビット数が４ビット以下になった場合には、メインルーチンに復帰する。
〔最終ウィンドウ処理〕
ウィンドウ演算処理において、最終のウィンドウについて所定の桁数以下となった場合には、ステップＳ５の後処理が必要となる。これは、図５において、変数ｉの値がステップＳ２５では０よりも大きくかつステップＳ２９において３以下であると判断された場合である。このときの最終ウィンドウ処理を図６に示すフローチャートに基づいて説明する。
【００６０】
ステップＳ４１では、最終ウィンドウのウィンドウ値Ｗに初期値として０を代入する。ステップＳ４２では、次のビットが存在するか否かを判別する。ここでは、変数ｉの値が０よりも大きい場合に、次のビットが存在すると判断してステップＳ４３に移行する。ステップＳ４３では、Ｗ＝２Ｗ＋ｋiを計算する。ステップＳ４４では、Ｒの値を２倍算して、Ｒ＝２Ｒを計算する。ステップＳ４５では、変数ｉの値から１だけデクリメントし、ステップＳ４２に移行する。
【００６１】
ステップＳ４２において、変数ｉの値が０以下になった場合、次のビットが存在しないと判断して、ステップＳ４６に移行する。
【００６２】
ステップＳ４６では、ウィンドウ値Ｗの値を判別して、対応するステップに分岐する。ウィンドウ値Ｗ＝０の場合、何もせずにメインルーチンに復帰する。
ウィンドウ値Ｗ＝６〜１０の場合には、ステップＳ４７に移行する。ステップＳ４７では、Ｒ＝Ｒ＋table[W−６]を計算する。ウィンドウ値Ｗの値が６〜１０の場合には、最終ウィンドウは４ビットであり、これに対応するテーブルが存在する。したがって、ウィンドウ値Ｗに対応するテーブルを参照して最終ウィンドウの計算を行う。
【００６３】
ウィンドウ値Ｗ＝−６〜−１０の場合には、ステップＳ４８に移行する。ステップＳ４８では、ステップＳ４７と同様にしてウィンドウ値Ｗに対応するテーブルを参照して、Ｒ＝Ｒ−table[−Ｗ−６]を計算する。
【００６４】
ウィンドウ値Ｗ＝１の場合、ステップＳ４９に移行する。ステップＳ４９では、Ｒ＝Ｒ＋Ｐを計算する。ウィンドウ値Ｗ＝−１の場合、ステップＳ５０に移行する。ステップＳ５０では、Ｒ＝Ｒ−Ｐを計算する。
ウィンドウ値Ｗ＝２の場合、ステップＳ５１に移行する。ステップＳ５１では、記憶手段２に保存しておいた（２Ｐ）の値を読み込んでこれをＲに加算し、Ｒ＝Ｒ＋２Ｐを計算する。ウィンドウ値Ｗ＝−２の場合、ステップＳ５２に移行する。ステップＳ５２では、記憶手段２に保存しておいた（２Ｐ）の値を読み込んで、Ｒからこれを減算し、Ｒ＝Ｒ−２Ｐを計算する。
【００６５】
ウィンドウ値Ｗ＝４の場合、ステップＳ５３に移行する。ステップＳ５３では、記憶手段２に保存しておいた（４Ｐ）の値を読み込んでこれをＲに加算し、Ｒ＝Ｒ＋４Ｐを計算する。ウィンドウ値Ｗ＝−４の場合、ステップＳ５４に移行する。ステップＳ５４では、記憶手段２に保存しておいた（４Ｐ）の値を読み込んでＲからこれを減算し、Ｒ＝Ｒ−４Ｐを計算する。
【００６６】
ウィンドウ値Ｗ＝３の場合、ステップＳ５５に移行する。ステップＳ５５では、記憶手段２に保存しておいた（２Ｐ）の値を読み込んでこれをＲに加算し、Ｒ＝Ｒ＋２Ｐを計算する。さらに、ステップＳ５６において、Ｒ＝Ｒ＋Ｐを計算する。ウィンドウ値Ｗ＝−３の場合、ステップＳ５７に移行する。ステップＳ５７では、記憶手段２に保存しておいた（２Ｐ）の値を読み込んで、Ｒからこれを減算し、Ｒ＝Ｒ−２Ｐを計算する。さらに、ステップＳ５８において、Ｒ＝Ｒ−Ｐを計算する。
【００６７】
ウィンドウ値Ｗ＝５の場合、ステップＳ５９に移行する。ステップＳ５９では、記憶手段２に保存しておいた（４Ｐ）の値を読み込んでこれをＲに加算し、Ｒ＝Ｒ＋４Ｐを計算する。さらに、ステップＳ６０において、Ｒ＝Ｒ＋Ｐを計算する。ウィンドウ値Ｗ＝−５の場合、ステップＳ６１に移行する。ステップＳ６１では、記憶手段２に保存しておいた（４Ｐ）の値を読み込んで、Ｒからこれを減算し、Ｒ＝Ｒ−４Ｐを計算する。さらに、ステップＳ６２において、Ｒ＝Ｒ−Ｐを計算する。
【００６８】
この後、メインルーチンに復帰する。メインルーチンでは、このようにして計算されたＲの値を演算結果として出力し、例えば、記憶手段２の所定領域に格納する。
〔ウィンドウメソッドにおける処理ビット数〕
本発明によれば、乗数ｋをＮＡＦ表現に変換し、最上位ビットが１となるようにウィンドウを当てはめているため、１ウィンドウあたりの処理ビット数は、ウィンドウ幅をｗとすると、平均ｗ＋１．５ビットとなる。ウィンドウ幅ｗ＝４とした場合、１ウィンドウあたりの処理ビット数は５．４ビットとなる。
【００６９】
また、２倍算を行う回数は、最終の数値ブロックについて省略することができるため、乗数ｋのビット数ｍ−４となり、ｍ＝１６０の場合２倍算の回数は１５６となる。乗数ｋに当てはめるウィンドウの平均個数は、この２倍算の回数を１ウィンドウあたりの処理ビット数で割った値となり、この回数が平均加算回数となる。前述の乗数ｋのビット数ｍ＝１６０で、ウィンドウ幅ｗ＝４とした場合には、ウィンドウの平均個数は１５６／５．４＝２８．９となり、これが平均加算回数となる。
〔テーブル個数〕
本発明において、ウィンドウ幅をｗとした場合、事前計算により作成すべきテーブル数は、以下のように表すことができる。
【００７０】
ｗが偶数の場合：２／３（２w-1−２）＋１
ｗが奇数の場合：２／３（２w-1−１）＋１
また、このテーブルを作成するために使用する値の個数は、（ｗ−２）個であり、合計すると次のようになる。
【００７１】
ｗが偶数の場合：２／３（２w-1−２）＋ｗ−１
ｗが奇数の場合：２／３（２w-1−１）＋ｗ−１
これに対し、従来のウィンドウメソッドおよびＭＯＣ方式の場合には、テーブル数は（２w−２）となる。したがって、テーブルの削減率は次のようになる。
ｗが偶数の場合：（２w＋３ｗ−７）／（３・２w−６）
ｗが奇数の場合：（２w＋３ｗ−５）／（３・２w−６）
これから、ウィンドウ幅ｗを３ビット、４ビット、５ビットとした場合のテーブルの削減率は、それぞれ２／３、１／２、７／１５となる。
〔最終ウィンドウ処理回数〕
ウィンドウ幅ｗとした場合の最終ウィンドウの取り得る値は次のようになる。
【００７２】
ｗが偶数の場合：最小−１／３（２w+1−２）、最大１／３（２w+1−２）
ｗが奇数の場合：最小−１／３（２w+1−１）、最大１／３（２w+1−１）
このうち後処理としての加算演算が不要なものは、保存している値が利用できる場合と、±Ｐ、０の場合である。前述したように、記憶手段２に格納している値の合計数は次のようになる。
【００７３】
ｗが偶数の場合：２／３（２w-1−２）＋ｗ−１
ｗが奇数の場合：２／３（２w-1−１）＋ｗ−１
これから、ウィンドウ幅ｗの場合の平均後処理回数は、次のようになる。
【００７４】
ｗが偶数の場合：（２w+1−６ｗ＋４）／（２w+2−１）
ｗが奇数の場合：（２w+1−６ｗ＋２）／（２w+2＋１）
通常よく用いられるウィンドウ幅ｗが３ビット、４ビット、５ビットの場合には、平均後処理回数はそれぞれ０，４／２１，１２／４３となる。例えば、ウィンドウ幅ｗが４ビットの場合、最終ウィンドウの取り得る値は−１０Ｐ〜＋１０Ｐの２１通りであり、後処理が必要となる場合は±３Ｐ、±５Ｐの４通りである。したがって、この場合の平均後処理回数は４／２１＝０．２回となる。
乗数ｋを２進数に変換した際の桁数ｍが１６０ビットの場合と２３９ビットの場合について、１加算または１ウィンドウあたりの平均処理ビット、平均２倍算回数、平均加算回数、事前計算回数、事後計算回数を、従来の方式と比較したものをそれぞれ表２および表３として示す。
【００７５】
【表２】
0003797808.tif 000003
【００７６】
【表３】
0003797808.tif 000004
この結果から、本発明によるスカラー倍算方法によれば、事前計算によって作成するテーブル数を１／２に削減することができ、テーブルを格納するための領域を小さくすることができる。また、事前計算の回数を少なくすることにより、合計計算回数を削減することができ、トータルでの処理速度を高速化することが可能となる。
〔他の実施形態〕
楕円曲線上の点のスカラー倍算だけでなく、被乗数Ｐを整数とすることで通常の整数演算においても高速な乗算方式を得ることができる。
【００７７】
【発明の効果】
本発明によれば、楕円曲線上の点のスカラー倍算について、事前計算により作成するテーブルの数を通常のウィンドウメソッド系の演算を用いる場合に比して約１／２に削減することができ、演算に必要な平均加算回数を全体で数％削減することができ、処理速度を高速化することが可能となる。
【図面の簡単な説明】
【図１】本発明の１実施形態の制御ブロック図。
【図２】その制御フローチャート。
【図３】テーブル作成処理のフローチャート。
【図４】テーブルの説明図。
【図５】ウィンドウ演算処理のフローチャート。
【図６】最終ウィンドウ処理のフローチャート。
【符号の説明】
１  スカラー倍算装置
２  記憶手段
３  演算手段
２１  通常記憶部
２２  テーブル記憶部
３１  事前計算手段
３２  ＮＡＦ変換手段
３３  ウィンドウ演算手段
３４  後処理手段
【図１】
0003797808.tif 000005
【図２】
0003797808.tif 000006
【図３】
0003797808.tif 000007
【図４】
0003797808.tif 000008
【図５】
0003797808.tif 000009
【図６】
0003797808.tif 000010