(57)【要約】【課題】モンゴメリ乗算アルゴリズムで必要となる逆元：ｍ’＝−ｍ−１ｍｏｄｂの計算を、汎用の演算器を用いて高速に計算する。またモンゴメリ乗算アルゴリズムを用いたべき乗剰余演算をパイプライン実行するときに、１つのｘｙＲ−１ｍｏｄｍ演算と次のｘｙＲ−１ｍｏｄｍ演算とを並列計算できるよう構成する。【解決手段】ｍ  ＝  ｋ  ＋  １とすると、ｍ  （  ｍ  ＋  ２  ）  ＝  ｋ２  −  １、さらにｍ  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ＝  ｋ４  −  １となり、同様な操作を繰り返すと最終的に、ｍ  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ・・・  ＝  ｋ２＾ｎ  −  １とできる。この原理を応用して逆元をもとめる。また除算で一般的な引き放し法の原理を応用してモンゴメリ乗算アルゴリズムを改良し、演算の途中結果によらずに確定的に演算結果が決まるようにする。【選択図】図１
2004226516.tif 000002
【特許請求の範囲】
【請求項１】
計算機のプロセッサによって、ｂ＝２ｎとし、ｎ，ｍを整数とするとき、ｍ’＝−ｍ−１ｍｏｄｂを計算する方法において、
（１）初期値として、変数ｍ’を格納する第１の記憶手段に定数１を設定し、変数ｋを格納する第２の記憶手段に入力された値ｍを設定するステップと、
（２）変数ｋに２を加えたｋ＋２の値に前記変数ｍ’を乗ずる演算を前記ｂをモジュラスとする剰余演算の下で行って得られた値を前記第１の記憶手段上の変数ｍ’に設定するステップと、
（３）上記（２）で得られたｋ＋２の値に変数ｋを乗ずる演算を前記ｂをモジュラスとする剰余演算の下で行って得られた値を前記第２の記憶手段上の変数ｋに設定するステップと、
（４）上記（２）及び（３）のステップをパラメータｆ＝ｌｏｇ２ｎ＋１回まで行った後に得られた値ｍ’を出力するステップとを有することを特徴とするべき乗剰余演算方法。
【請求項２】
計算機に、ｂ＝２ｎとし、ｎ，ｍを整数とするとき、ｍ’＝−ｍ−１ｍｏｄｂを計算させるプログラムであって、前記計算機に、
（１）初期値として、変数ｍ’を格納する第１の記憶手段に定数１を設定し、変数ｋを格納する第２の記憶手段に入力された値ｍを設定するステップと、
（２）変数ｋに２を加えたｋ＋２の値に前記変数ｍ’を乗ずる演算を前記ｂをモジュラスとする剰余演算の下で行って得られた値を前記第１の記憶手段上の変数ｍ’に設定するステップと、
（３）上記（２）で得られたｋ＋２の値に変数ｋを乗ずる演算を前記ｂをモジュラスとする剰余演算の下で行って得られた値を前記第２の記憶手段上の変数ｋに設定するステップと、
（４）上記（２）及び（３）のステップをパラメータｆ＝ｌｏｇ２ｎ＋１回まで行った後に得られた値ｍ’を出力するステップと
を実行させるためのプログラム。
【請求項３】
変数ｘ，ｙ，ｅ及びｍが各々ビット長ｎの整数とし、Ｒ＝２ｎとしたときに、ｙ＝ｘｅｍｏｄｍの計算を始めにｘ＝ｘＲｍｏｄｍの計算を行ってｙ＝１と置いた後に、ｅのビット値が１の場合にｙ＝ｘｙＲ−１ｍｏｄｍを計算し、ｅのビット値にかかわらずｘ＝ｘｘＲ−１ｍｏｄｍを計算するアルゴリズムを適用し、
上記ｙ＝ｘｙＲ−１ｍｏｄｍの計算について、ｂ＝２ｎとするとき、ｍ’＝−ｍ−１ｍｏｄｂとして
ｕ＝ｘｙｍ’ｍｏｄｂ；  ｙ＝（ｘｙ＋ｕｍ）／ｂ
を計算し、ｙ≧ｍの場合にｙ＝ｙ−ｍを計算するべき乗剰余演算方法において、
上記ｘｙＲ−１ｍｏｄｍの計算について、
ｕ＝ｘｙｍ’ｍｏｄｂを計算し、
もしｘｙ＞０であればｙ＝（ｘｙ＋ｕｍ）／ｂ−ｍを計算し、
ｘｙ＜０であればｙ＝（ｘｙ＋ｕｍ）／ｂ＋ｍを計算し、ｙ＝０ならばそのままとし、
得られたｘ及びｙの値を次のｅのビット値についての計算の入力として用い、ｅの全ビット値について上記計算を行った後にｙ＞０ならばｙの最終結果を目的の計算結果とし、ｙ≦０ならばｙ＝ｙ＋ｍの値を目的の計算結果とし、１つのｘｙＲ−１ｍｏｄｍ演算と次のｘｙＲ−１ｍｏｄｍ演算とを並列演算するように構成したことを特徴とするべき乗剰余演算方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、暗号演算で用いられるべき乗剰余演算を高速にかつ低コストで実行する技術に関する。
【０００２】
【従来の技術】
まず本発明の基礎となっているモンゴメリ乗算アルゴリズムについて説明する。  モンゴメリ乗算アルゴリズムは、ＲＳＡ暗号、ＤＳＳ、ＤＨ（Ｄｉｆｆｉｅ−Ｈｅｌｌｍａｎ）鍵交換等の演算で用いるべき乗剰余計算、ｙ＝ｘｅｍｏｄｍ（ｙ，ｘ，ｅ及びｍは整数で、鍵長がｎのときｍ＜２ｎとする）、を高速に処理するアルゴリズムとして広く知られている。モンゴメリ乗算に関しては、例えばＨａｎｄｂｏｏｋ  ｏｆ  Ａｐｐｌｉｅｄ  Ｃｒｙｐｔｏｇｒａｐｈｙ，  Ａｌｆｒｅｄ  Ｊ．  Ｍｅｎｅｚｅｓ，  Ｐａｕｌ  Ｃ．  ｖａｎ  Ｏｏｒｓｈｏｔ，  Ｓｃｏｔｔ  Ａ．  Ｖａｎｓｔｏｎｅ（非特許文献１）に記述されている。  まずここではＲＳＡ演算アルゴリズムへのモンゴメリ乗算アルゴリズムの適用について述べることにする。
【０００３】
事前準備として本明細書で用いる表記方法の説明を行っておく。整数ｍをｂ進数、ｎ桁で表わすと、
ｍ  ＝  ｍｎ−１・ｂｎ−１  ＋  …  ＋  ｍ１・ｂ１  ＋  ｍ０・ｂ０（ｍ０，ｍ１  …  ｍｎ−１は整数で、０≦  ｍ０，ｍ１  …  ｍｎ−１＜ｂ）となるが、これを
ｍ  ＝  （ｍｎ−１  …  ｍ１  ｍ０）ｂ  と表わすことにする。
また本明細書ではアルゴリズムの表記をＣ言語の表記方法にしたがって示す。
【０００４】
ＲＳＡ演算で行うべき乗剰余演算（ｙ＝ｘｅｍｏｄｍ、ここでｙ，ｘ，ｅ及びｍは整数、鍵長がｎとする）は剰余定理によって以下のように展開できる。
2004226516.tif 000003
これに対しモンゴメリ乗算アルゴリズムを適用するために、上記の（ｘ＊ｙ）ｍｏｄｍあるいは（ｘ＊ｘ）ｍｏｄｍの計算に対し以下のように変形を加える。
2004226516.tif 000004
【０００５】
ここでｙ＝（ｘ＊ｙ）Ｒ−１ｍｏｄｍ（もしくはｘ＝（ｘ＊ｘ）Ｒ−１ｍｏｄｍ）の部分に対しモンゴメリ乗算アルゴリズムを適用すると以下となる。
2004226516.tif 000005
上記のアルゴリズム３で、ｂとしては通常２のべき乗数が選ばれることが多い。これは計算機内での数値が２進法で表わされているため、ｂを２のべき乗にすることで上記の（１）や（２）式でのｂに関わる計算部分が簡単になるためである。ｂを２のべき乗とするとｇｃｄ（ｍ，ｂ）＝１の条件からｍは奇数であることが必要条件となるが、例えばＲＳＡ演算では鍵の強度の観点からｍを大きな素数の積とするため、実用上は奇数と考えてよい。またＤｉｆｆｉｅ−Ｈｅｌｌｍａｎ鍵交換アルゴリズムにおいても、ｍには大きな素数を選択するため、ｍが偶数となることは実質的に有り得ないため、この必要条件が問題となることはない。
【０００６】
ここで上記のアルゴリズム３でｂ＝２ｎ  （ここでのｎとはｍ＜２ｎなる整数）の場合には以下のようになる。
2004226516.tif 000006
図９は、上記アルゴリズム３−１をハードウェアで実装した場合の計算の手順を示す図である。図９で例えばＹ，Ｘを各々被乗数、乗数とすると、乗数Ｘを下位から一定の長さで分割し、乗算器によって順にＹに乗算して得た値を縦方向に同じ桁が並ぶように配列すると、図示するような平行四辺形で表現される。まずＹ・ｘ０，Ｙ・ｘ１，・・・，Ｙ・ｘｎ−１の乗算結果をＣＳＡ（ｃａｒｒｙ  ｓａｖｅ  ａｄｄｅｒ）によって加算すると、Ｘ・Ｙが得られる。ここでｘ０，ｙ０は最下位桁の値、ｘｎ−１，ｙｎ−１は最上位桁の値を示す。このＸ・Ｙの演算結果の下位半分のみを取り出したものをＬとする。Ｌにｍ’を乗算してその演算結果の下位半分のみを取り出したものがＵとなる。Ｕにｍを乗算した結果にＸ・Ｙを加算し、上位半分のみを取り出すと新しいＹが得られる。最後にＹ≧ｍであればＹ＝Ｙ−ｍの剰余演算を行って目的のＹが得られる。
【０００７】
ＲＳＡの鍵長は、５１２ビットあるいは１０２４ビット以上と長いため、上記アルゴリズムの乗算部分を１マシンサイクルで実行するのはゲート数の観点から困難であり、数サイクルに分割して実行される。また上記計算手順によれば乗算が３回行われるが、２回目および３回目の乗算はいずれも以前の乗算の結果と固定値との乗算となっている。したがって前者を乗数、後者を被乗数とすることによって、１つ前の乗算が実行開始されて最下位桁から順に結果が出力されていくと、その結果を用いて順次次に続く乗算を開始することができる。このため乗算器の個数を十分に用意すると、いわゆるパイプライン実行することが可能となり性能を向上させることができる。
【０００８】
またモンゴメリ乗算の特徴の１つとして、演算の準備段階でｍ’＝−ｍ−１ｍｏｄｂなるｍ’を求める処理が必要となる。この処理内容は、ｂの値の選び方により計算方法は大きく変わる。上述したように、実用的にはｂは２のべき乗としてよいから、例えばｂ＝２の場合が最も簡単であり、ｍ’＝１の固定値となる。ただしｇｃｄ（ｍ，ｂ）＝１からｍは奇数でなくてはならない。しかしｂ＝２ｎとしてｎがある程度小さいうちは、ｂ＝２の場合の拡張となり、計算なしに求めることも可能である。すなわちｍのｂ進数での最下位桁の値とｍ’の値の対応表を予め作成しておき、計算時にこの対応表から値を引いてくるといった方法をとることができる。しかしｎがある程度大きい値となると、計算を行ってｍ’を求めることになる。この計算の方法として、例えば特開平１０−２０７６８９号公報「逆元計算装置及び逆元計算方法」（特許文献１）がある。これはｂ＝２の場合の逆元を求めておき、これを繰り返し計算によってｂ＝２ｎへと拡張していく方法である。この計算のための専用演算器をもつと、演算自体は加算におけるキャリーの伝播を排除することができ、高速に実行することができる。
【０００９】
【特許文献１】
特開平１０−２０７６８９号公報
【非特許文献１】
Ｈａｎｄｂｏｏｋ  ｏｆ  Ａｐｐｌｉｅｄ  Ｃｒｙｐｔｏｇｒａｐｈｙ，  Ａｌｆｒｅｄ  Ｊ．  Ｍｅｎｅｚｅｓ他，  ＣＲＣ  Ｐｒｅｓｓ，  Ｏｃｔｏｂｅｒ  １６，  １９９６，  ｐ６００〜６０３
【００１０】
【発明が解決しようとする課題】
本発明が解決しようとする課題は２つある。まず第１の課題について述べる。従来の技術で引用した特許文献１の技術は、キャリーの伝播を排除することができる方式であるが、この利点を十分に発揮するためには専用演算器が必要である。この専用演算器は、実はアルゴリズム３で比較的ｂを小さくした場合の（１）及び（２）式を実行するための専用演算器と似ており、ゲートの共有化をはかることができる。しかしこの技術が大きな効果を発揮するのは、逆元の計算量が多くなる場合、すなわちｂが大きい場合であって、この場合にはアルゴリズム３の（１）及び（２）式を実行するための専用演算器とは構成が大きく異なるため、ゲートの共有化は困難となる。専用演算器を用いないとすると汎用的な加算器を用いることになり、この場合には、繰り返し計算の中で１回ごとにキャリーの伝播を伴う計算を必要とするため、この発明の性能上の効果は小さくなる。なおここでいうｂが小さい場合とは、あらかじめ逆元の対応表を作成しておけるぐらい小さいことを意味する。
【００１１】
ところでｂが大きい場合、例えばアルゴリズム３−１のようなｂ＝２ｎの場合であって、この場合、同アルゴリズムの（１）式、（２）式から明確なように乗算器が必要となる。ＲＳＡ演算はデータ幅が５１２ビット、あるいは１０２４ビット以上と大きいが、実際の演算器のインプリメンテーションでは適切なゲート数におさえるため、１２８ビットあるいは２５６ビット幅のようにより幅の狭い乗算器を実装することになる。このような状況にあって、さらに逆元を求めるための専用演算器を別途追加するのは実装上、ゲート数の増大をまねき困難である。それよりその分のゲート数を乗算器のビット幅を広げるために使用した方が性能が向上する。このような観点から特許文献１の技術は、そのアルゴリズムに関しては優れているが、ＲＳＡ演算器への適用を考えた場合に実装上の実効的効果は小さいといえる。
【００１２】
本発明の第１の目的は、逆元専用演算器を用いないで高速に逆元を計算する技術を提供することにある。
【００１３】
次に第２の課題について述べる。従来の技術でも述べたように、アルゴリズム３−１において、（１）式および（２）式の３回分の乗算は、データ依存があるものの、最下位桁から順次、次の乗算を開始することができ、乗算器等の必要なハードウエアがあればパイプライン実行をおこなうことができ、性能を向上させることができる。ここでさらに３回の乗算を実行した後についても考える。アルゴリズム３−１は、アルゴリズム２の（２）式ないし（３）式に相当するが、これらの式の計算を行った結果の間には以下のような依存関係がある。ここでアルゴリズム２の（２）式はｉｆ文の条件の成立／不成立により実行するかどうか決まるため、以下の３とおりとなる。
（ａ）（２）式→（３）式：データ依存関係なく並列実行が可能
（ｂ）（３）式→（２）式：ｘでデータ依存関係あり、ｙはデータ依存関係なし
（ｃ）（３）式→（３）式：ｘでデータ依存関係あり
上記の３項目のうち、（ａ）はデータの依存関係がないため並列実行が可能である。つまりパイプライン実行が可能である。（ｃ）はｘでデータ依存関係があり、しかもアルゴリズム３−１の（３）式からｙがｍ以上であるかどうかによってｙが決まる。ｙ≧ｍのような大小関係の比較は、ｙからｍを減じ、符号が負かどうかの判定をおこなう必要があるため、ここで行いたいような最下位桁から順次計算を行いながら次の計算にその結果を使用していくようなことはできない。つまりパイプライン実行ができないのである。（ｂ）についても同様の問題があるが、（２）式を実行するのはｊ［ｉ］＝＝１の場合であって、実行的にはｆｏｒループによる繰り返し計算において、２回に１回程度しか（２）式は実行されないと考えられる。したがってデータ依存関係があって、しかもｆｏｒループによる繰り返しで毎回計算が必要な（３）式の計算によって、ＲＳＡ演算の性能は決まるのである。
【００１４】
本発明の第２の目的は、（ｃ）に関わるパイプライン実行を阻む問題を解決し、モンゴメリ乗算を用いたべき乗剰余演算の性能を向上できる計算技術を提供することにある。
【００１５】
【課題を解決するための手段】
第１の課題を解決するための本発明は、ｍ’＝−ｍ−１ｍｏｄｂを計算する技術であり、
（１）初期値として、変数ｍ’を格納する第１の記憶手段に定数１を設定し、変数ｋを格納する第２の記憶手段に入力された値ｍを設定するステップと、
（２）変数ｋに２を加えたｋ＋２の値に変数ｍ’を乗ずる演算をｂをモジュラスとする剰余演算の下で行って得られた値を第１の記憶手段上の変数ｍ’に設定するステップと、
（３）上記（２）で得られたｋ＋２の値に変数ｋを乗ずる演算をｂをモジュラスとする剰余演算の下で行って得られた値を第２の記憶手段上の変数ｋに設定するステップと、
（４）上記（２）及び（３）のステップをパラメータｆ＝ｌｏｇ２ｎ＋１回まで行った後に得られた値ｍ’を出力するステップと
を有するべき乗剰余演算技術を特徴とする。
【００１６】
第２の課題を解決するための本発明は、上記ｘｙＲ−１ｍｏｄｍの計算について、
ｕ＝ｘｙｍ’ｍｏｄｂを計算し、
もしｘｙ＞０であればｙ＝（ｘｙ＋ｕｍ）／ｂ−ｍを計算し、
ｘｙ＜０であればｙ＝（ｘｙ＋ｕｍ）／ｂ＋ｍを計算し、ｙ＝０ならばそのままとし、
得られたｘ及びｙの値を次のｅのビット値についての計算の入力として用い、ｅの全ビット値について上記計算を行った後にｙ＞０ならばｙの最終結果を目的の計算結果とし、ｙ≦０ならばｙ＝ｙ＋ｍの値を目的の計算結果とし、１つのｘｙＲ−１ｍｏｄｍ演算と次のｘｙＲ−１ｍｏｄｍ演算とを並列演算するように構成したべき乗剰余演算技術を特徴とする。
【００１７】
【発明の実施の形態】
（１）第１の課題を解決するための実施形態
まず第１の課題を解決するためのアルゴリズムについて説明する。まずモンゴメリ乗算アルゴリズムで用いる逆元とはｍ’＝−ｍ−１ｍｏｄｂであるから、ｍｍ’ｍｏｄｂ＝ｂ−１となるｍ’を求めるアルゴリズムを考える。ＲＳＡ演算、Ｄｅｆｆｉｅ−Ｈｅｌｌｍａｎ鍵交換アルゴリズムを計算機上で実装する場合には、ｂは２のべき乗でｍは奇数としてよい。そうするとｍ＝ｋ−１とすると
ｍ  （  ｍ  ＋  ２  ）  ＝  ｋ２  −  １、さらにｍ  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ＝  ｋ４  −  １
となり、同様な操作を繰り返すと最終的に、
ｍ  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ・・・  ＝  ｋ２＾ｎ  −  １
とできる。ｍ＝ｋ−１でｍは奇数であるからｋは偶数、つまりｋ＝２ｉと表わせるから、
ｍ  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ・・・  ｍｏｄ  ｂ  ＝  ｛  （２ｉ）２＾ｎ  −  １  ｝  ｍｏｄ  ｂ  ＝  ｂ  −  １
となる。つまりｍ’  ＝  （  ｍ  ＋  ２  ）  ｛  ｍ  （  ｍ  ＋  ２  ）  ＋  ２  ｝  ・・・  ｍｏｄ  ｂとすればよい。
【００１８】
図１は、第１の課題を解決するためのアルゴリズムをＣ言語の表記方法で表現したものである。このアルゴリズムでｂ＝２ｎ（ｎは鍵長）とすると、ｎが２のべき乗数であれば、
ｆ＝ｌｏｇ２ｎ＋１
となり、整数となる。
【００１９】
図２は、このアルゴリズムを実行する計算機のプログラムの処理の流れを示すフローチャートである。この計算機は、プロセッサとメモリを有し、プログラムはメモリに格納されており、またプロセッサは、このプログラム中の命令を解読して実行する機構、データを格納するレジスタ、加算器及び乗算器を備える汎用計算機とする。計算機は、まず定数ｎ，ｍの値を入力あるいは他の呼出元プログラムから受け取る（ステップ５１）。ｍはｎビット長の数値とする。次にパラメータｆ＝ｌｏｇ２ｎ＋１の計算を行い、その計算結果のｆの値をデータレジスタ又はメモリに格納する（ステップ５２）。次にデータレジスタ又はメモリ上の第１の記憶領域上の変数ｍ’に１の値を設定し、データレジスタ又はメモリ上の第２の記憶領域上の変数ｋに入力されたｍの値を設定し、データレジスタ又はメモリ上のループカウンタｉを０に設定する（ステップ５３）。ここで第１の記憶領域及び第２の記憶領域は、各々ｎビット長の記憶領域とする。
【００２０】
次にデータレジスタ上でｋ＋２の加算を行った値に変数ｍ’を乗算しその下半分のｎビットのみを取り出して新しいｍ’として第１の記憶領域に保存し、データレジスタ上のｋ＋２の値に第２の記憶領域上の変数ｋを乗算しその下半分のｎビットのみを取り出して新しいｋとして第２の記憶領域に保存する（ステップ５４）。次にループカウンタｉに１を加える（ステップ５５）。次にｉとｆを比較し、ｉ＜ｆでなければ（ステップ５６Ｎｏ）、ステップ５４に戻る。ｉ＜ｆとなったとき（ステップ５６Ｙｅｓ）、計算結果のｍ’の値を出力あるいは呼出元プログラムに返す（ステップ５７）。ただしステップ５４の最終回のｋ＝ｋ（ｋ＋２）ｍｏｄｂの計算は実行しなくともよい。
【００２１】
上記アルゴリズムが実行する計算は、乗算、加算および剰余演算から成っており、アルゴリズム３−１の（１）式及び（２）式を計算できる汎用計算機があれば実行可能である。すなわち追加の専用演算器は必要とされない。
【００２２】
次に第１の課題を解決するためのアルゴリズムを汎用的なプロセッサで実行した場合の実施例の効果について述べる。上記プログラムを実行する際には、ステップ５４において２ｌｏｇ２ｎ回の乗算とｌｏｇ２ｎ回の加算が必要である。従来技術として、例えば特許文献１の技術ではｎ回の加算が必要である。乗算と加算のコストの比較を一般化するのは困難であるが、まずオーダとして本発明がｌｏｇ２ｎ、従来技術ではｎであるので、回数が大幅に削減できることは明白である。通常ｎは５１２，１０２４，２０４８が多く用いられるが、ｎ＝１０２４で両者の比較を定量的に行うと以下のようになる。
【００２３】
一般的なプロセッサは６４ビットの乗算器と加算器を持っており、これらの実行時間比は通常２対１である。ｎ＝１０２４の場合、１０２４ビットデータの乗算、加算が必要となるが、各々６４ビット乗算が２５６回、６４ビット加算が１６回となる。ここで用いる乗算では、乗算結果に対し剰余演算（ｍｏｄｂ）の計算を行うために、乗算結果の上位半分は不要となるので、実際には６４ビット乗算は１６×１６／２＋１６＝１３６回となる。従って性能比は以下となる
従来技術／本発明  ＝  （ｎ＊１６）  ／（２ｌｏｇ  ２  ｎ  ＊２＊１３６  ＋  ｌｏｇ  ２  ｎ  ＊１６）＝〜  ３
つまり本実施例によれば、従来技術に比べて３倍程度性能向上するという効果がある。暗号強度の観点から鍵長が長くなる傾向にあるため、本発明の効果はより大きくなっていくことになる。専用演算器を用いればさらに高速になるが、本発明は、逆元を求めるだけのために専用演算器を置かないことを特徴とするので、専用演算器の構成及び効果について言及しない。
（２）第２の課題を解決するための実施形態
次に第２の課題を解決するためのアルゴリズムについて説明する。アルゴリズム３−１を前提として、ここの（３）式でｙ（以下では入力のｙと区別するためＹとする）に入力される値の大きさは以下のようになる。
ｕ  ＝  ｘｙｍ’  ｍｏｄ  ｂ  から  ０  ＜＝  ｕ  ＜  ｂであるから、
０  ＜  Ｙ  ＝  （ｘｙ  ＋  ｕｍ）  ／  ｂ  ＜  （ｘｙ  ＋  ｂｍ）／ｂ  ＝  ｘｙ／ｂ  ＋  ｍ  −−−−  （１）
ここで０  ＜＝  ｘ，ｙ  ＜  ｍ  ＜  ｂであるから、０  ＜＝  ｘｙ／ｂ  ＜  ｍ  −−−−  （２）
したがって、（１）と（２）から０  ＜  Ｙ  ＜  ２ｍとなる。
【００２４】
Ｙ−ｍの範囲は、上記の（１）式から−ｍ＜Ｙ−ｍ＜ｘｙ／ｂであるから、｜Ｙ−ｍ｜＜ｍである。ここでアルゴリズム３−１の（３）式で、ｙ≧ｍでもｙ＜ｍでもｙの大きさに関係なくｙ＝ｙ−ｍを演算したとすると次の演算でどうなるかを考える。Ｙ＝（ｘｙ＋ｕｍ）／ｂであり、｜ｘ｜＜ｍ，｜ｙ｜＜ｍであるから、以下のようになる。
ｘｙ  ＞  ０  ならば、０  ＜  Ｙ  ＝  （ｘｙ  ＋  ｕｍ）  ／  ｂ  ＜  （ｘｙ  ＋  ｂｍ）／ｂ  ＝  ｘｙ／ｂ  ＋  ｍ  ＜  ２ｍであり、｜  Ｙ−ｍ  ｜  ＜＝  ｍである。
ｘｙ  ＜  ０  ならば、−２ｍ  ＜    （ｘｙ  −  ｂｍ）／ｂ  ＝  ｘｙ／ｂ  −  ｍ  ＜  Ｙ  ＝  （ｘｙ  ＋  ｕｍ）  ／  ｂ  ＜  ０であり、｜  Ｙ＋ｍ  ｜  ＜  ｍである。
（ｘｙ＝０の場合は、Ｙ＝０）
つまりｘもｙもモンゴメリ乗算開始時の入力データであるから、入力データの符号を見て同符号であればｙ−ｍを、異符号であればｙ＋ｍを結果として出力すれば、結果は常にその絶対値がｍより小さくなり発散していくことはない。これによってアルゴリズム３−１の（３）式に相当する部分は入力データの符号により確定的に演算を行うことができるようになる。つまりこれによって、前のｘｙＲ−１ｍｏｄｍ演算と並列に次のｘｙＲ−１ｍｏｄｍ演算を実行できるようになるのである。
【００２５】
図３は、第２の課題を解決するためのアルゴリズムをＣ言語の表記方法で表現したものである。ここでｂ＝２ｎであり、ｍ’は上記のようにｍ’＝−ｍ−１ｍｏｄｂを計算した結果である。図３の（２）、（３）式は入力データの符号のみで、実行の要否を決定することができ、ｙの下位桁から出力される結果をそれより上位の桁の結果を待たずに次の演算に用いることが可能となる。最終的な結果ｙは｜ｙ｜＜ｍとなるため、アルゴリズム２を以下のようにする必要がある。
2004226516.tif 000007
次に図３のアルゴリズムとアルゴリズム２−２を用いた専用演算器の実施例について説明する。図４は、図３のアルゴリズムとアルゴリズム２−２を用いた専用演算器の例である。この専用演算器は、３つの演算器、すなわちＸ２Ｒ−１ｍｏｄｍの演算を行う演算器４０、ＸＹＲ−１ｍｏｄｍの演算を行う演算器４１および演算器４２を含んでいる。１０，１１，１２はセレクタ、２０はラッチ、３０はシフタである。ＴＲＧはトリガである。アルゴリズム２−２のＸ＝（Ｘ＊Ｒ）ｍｏｄｍの計算は、汎用演算器を用いて行っておくものとする。
【００２６】
演算器４０の内部は、鍵長の１／４倍のデータ幅の乗算器８個、加算器、データラッチおよびそれらを制御する回路から成る。演算器４０内部の動作を説明する図が図５である。これは図３のアルゴリズムを実行しているにすぎないが、異なる点が２点ある。図３でいうｘｙは、図５ではＸＸであるため、常に図３の（２）式が実行されることになる。図５は図９の従来例と同様に乗算の演算部分を平行四辺形の形で表わしている。その中に記載した数字は、ｎ／４ビットのサイズをもつ各部分を実行するマシンサイクルの順序番号を示している。（）で囲んだサイクル番号は、同じサイクル番号の上の結果と同じになるので計算の必要がないことを示す。計算は下位桁から順に上位の桁の方に向けて実行される。すなわちＸ２Ｒ−１ｍｏｄｍの計算を行うために１３サイクル要し、３つの乗算（ＸＸ，ｍ’Ｌ，ｍＵ）が１サイクルずれでパイプライン実行できるような実行順序となっている。さらに１０サイクル目以降は実行結果を下の桁から順次出力するが、その結果がまた演算器４０に入力されて次のＸ２Ｒ−１ｍｏｄｍ演算の実行が開始される。
【００２７】
また演算器４１の内部は、鍵長の１／４倍のデータ幅の乗算器８個、加算器、データラッチおよびそれらを制御する回路から成る。演算器４１内部の動作を説明する図が図６である。図６は図５と同様に平行四辺形の中に記載した数字は各部分を実行するサイクルを示している。すなわちＸＹＲ−１ｍｏｄｍの計算を行うために１３サイクル要し、３つの乗算（ＸＹ，ｍ’Ｌ，ｍＵ）が１サイクルずれでパイプライン実行できるような実行順序となっている。ＸＹＲ−１ｍｏｄｍは、アルゴリズム２−２でｊ［ｉ］＝＝１の場合のみ実行される。これは演算器４１内部でＹからの入力データを保持しているラッチをＴＲＧ＝１の場合のみ更新し、それ以外の場合は更新しないという方法で実現できる。
【００２８】
図４の専用演算器によって演算が開始されるとき、演算器のラッチがリセットされ、セレクタ１０，１１，１２は各々ｅ，ｘ，１を選択し、各々ラッチ２０あるいは演算器４０、４１に入力する。ｍとＲは演算中は固定値となるので、外部から同じ信号が演算器に入力されつづける。なおｍ’はあらかじめ演算器４０と演算器４１内部のラッチに保持されているとする。こうして演算器の各ラッチに初期値が設定されると、演算が開始される。セレクタ１０，１１，１２は、各々シフタ３０、演算器４０、演算器４１内部の信号を選択するように切り替えられ、演算器４０，４１が１回のモンゴメリ乗算を行うごとにラッチ２０の内容は右に１ビットシフトした値に設定される。ラッチ２０の最下位ビットは演算器４１のＴＲＧ信号として入力し、１であれば計算結果を演算器内部にあるＹの値を保持しているラッチの値にセットし、次の演算でこの値をＹとして使用するようにする。こうして鍵長分の演算が行われると、最後に演算器４１の出力結果が演算器４２に入力し、値が負ならｍが加算され、そうでないならその演算を行わないで値を出力する。この値がべき乗剰余演算の結果となる。なお演算器４２は、１回しか使用されないから、その計算を汎用演算器で実施してもよい。
【００２９】
次にこれら演算器４０，４１のパイプライン動作の様子を図７に示す。各四角内部の数字は各演算器の実行サイクル番号を示しており、図５と図６の平行四辺形の内部に書いた数字に対応するものである。Ｘ２Ｒ−１ｍｏｄｍもＸＹＲ−１ｍｏｄｍも、実行を開始してから１０サイクル目で結果の最下位桁から出力しはじめ、この結果を使用して次の演算が開始される。この場合は１０サイクルピッチでモンゴメリ乗算が行われていく。比較のために従来技術を使用した場合を図８に示す。従来技術によれば、Ｘ２Ｒ−１ｍｏｄｍもＸＹＲ−１ｍｏｄｍも最後の全加算の結果からさらに剰余演算を行う必要があるが、ここでは全加算と同時に剰余演算を実行している。結果は１３サイクル目で確定するため、１３サイクルピッチでモンゴメリ乗算が行われることになる。このことから、本発明の性能は、従来技術に比べて２３％向上することになる。
【００３０】
言い換えれば、演算器４０，４１への入力データの符号により、計算を確定的に行うことができ、演算結果の下位桁から出力される結果を順次、次の演算に使用することができ、性能向上をはかることができる。
【００３１】
ここでは鍵長の１／４の乗算器と加算器をベースにして説明したが、本発明はこれに限定されないことは明白であろう。本発明の本質はモンゴメリ乗算の最後に行われる加減算の演算とオーバラップして次の演算を開始できることになる。これによって、加減算の演算は次演算で必要とするデータピッチに合わせて結果を出力すればよいので、大きなビット幅としなくても性能を劣化させることはないし、その部分の演算時間を隠すことができるため、ゲート削減効果と性能向上という２通りの効果を発揮させることができる。
【００３２】
【発明の効果】
以上述べたように第１の課題を解決するための本発明によれば、逆元の計算の性能向上を図ることができる。また第２の課題を解決するための本発明によれば、べき乗剰余演算を高速に実行することができる。
【図面の簡単な説明】
【図１】実施形態の逆元をもとめるアルゴリズムを示す図である。
【図２】実施形態の逆元をもとめるアルゴリズムを実行するプログラムの処理手順を示すフローチャートである。
【図３】実施形態のパイプライン実行を可能にするモンゴメリ乗算アルゴリズムを示す図である。
【図４】実施形態のＲＳＡ演算を行う演算器の構成を示す図である。
【図５】実施形態の演算器の内部動作を説明する図である。
【図６】実施形態の演算器の内部動作を説明する図である。
【図７】実施形態のＲＳＡ演算器の並列動作の様子を示す図である。
【図８】従来技術によるＲＳＡ演算器の動作の様子を示す図である。
【図９】従来技術によるモンゴメリ乗算の内部動作を示す図である。
【符号の説明】
１０，１１，１２・・・セレクタ、２０・・・ラッチ、３０・・・シフタ、４０，４１，４２・・・演算器
【図１】
2004226516.tif 000008
【図２】
2004226516.tif 000009
【図３】
2004226516.tif 000010
【図４】
2004226516.tif 000011
【図５】
2004226516.tif 000012
【図６】
2004226516.tif 000013
【図７】
2004226516.tif 000014
【図８】
2004226516.tif 000015
【図９】
2004226516.tif 000016