(57)【特許請求の範囲】
【請求項１】
整数を基底Ａおよび基底Ｂの剰余演算系で表現し、該基底Ａに基づいて求められた値を該基底Ｂに基づいて表される値へ基底変換を行う第１基底変換処理と、該基底Ｂに基づいて求められた値を該基底Ａに基づいて表される値へ基底変換を行う第２基底変換処理と、を含む１回の剰余付き乗算を繰り返すことにより、演算結果を得るべき乗剰余演算方法であって、
ｋ回目の第１基底変換処理と（ｋ＋１）回目の第１基底変換処理とを並列実行するよう制御する第１ステップと、
（ｋ＋１）回目の第２基底変換処理と（ｋ＋２）回目の第２基底変換処理とを並列実行するよう制御する第２ステップと、を繰り返し実行してべき乗剰余演算を行うことを特徴とするべき乗剰余演算方法。
【請求項２】
べき乗剰余演算をモンゴメリ乗算の繰り返し処理で実装する場合のループ処理内の、最初のモンゴメリ乗算に入力される第３の中間変数の係数が各ループ処理で等しくなるように、該ループ処理内の最後のモンゴメリ乗算において中間変数と掛け合わせる定数の係数を設定することを特徴とする請求項１記載のべき乗剰余演算方法。
【請求項３】
第１の基底で表現された剰余演算系の第１中間変数を基底変換し、第１の基底と異なる第２の基底に基づく剰余演算系の中間変数を得る第１基底変換処理と、
該第１の基底で表現された剰余演算系の、第1中間変数とは異なる第２中間変数を基底変換し、該第２の基底に基づく剰余演算系の中間変数を得る第２基底変換処理とを備えたモンゴメリ乗算を、基底変換を処理可能な第１の積和演算手段と第２の積和演算手段とを備えた剰余演算装置を利用して、演算処理させる剰余演算方法であって、
第１の基底または第２の基底のうちの何れか一方の基底によって表現される値を入力する
ステップと、
ｋ回目の第１基底変換処理と（ｋ―１）回目の第２基底変換処理とを並列実行するよう制御するステップと、
前記第１の基底または前記第２の基底のうちの他方の基底によって表現される値を出力するステップとを備えたことを特徴とする剰余演算方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、剰余演算系に基づき大きな整数の演算を並列処理により高速に計算する剰余演算処理装置及び方法に関する。
【０００２】
【従来の技術】
大きな整数を効率良く演算するための手法として剰余演算系(Modular ArithmeticまたはResidue Number Systems)が知られている。剰余演算系（以下RNSと書く）は、互いに素な比較的小さな整数の組[a1, a2, , an]を用意し、これらの整数で割った余りの組として大きな整数を表現する方法である。以降、この整数の組をRNSの基底、要素数nを基底サイズと称する。例えば、整数xを基底[a1, a2, , an]で表現すると[x1, x2, , xn]となる。ここでxi = x mod ai (i = 1, , n)としている。この時、基底要素の積をA (= a1a2…an)として、xがx<Aを満たす正整数であれば、xと[x1, x2, , xn]は一対一対応となり、xは基底[a1, a2, , an]で一意に表現される。なおRNSは、加算・減算・乗算が基底ごとに独立に実行可能であるという特徴を持っている。
【０００３】
一方、RSA暗号で用いるべき乗剰余算の実装法として、Montgomeryによって提案された剰余付き乗算（P. L. Montgomery, Mathematics of Computation, Vol.44, No. 170, pp. 519521, April, 1985）を繰返し実行する方法がある。このモンゴメリ乗算は剰余付き乗算を加算と乗算で代替えして実行する手法であるため、加減乗算の並列処理を可能にするRNSと組み合わせることで、べき乗剰余算の高速並列処理の実現が期待できる。
【０００４】
そのような試みとして、Poschらの方式(K. C. Posch and R. Posch, IEEE Transaction on Parallel and Distributed Systems, Vol. 6, No. 5, May 1995, pp.449454)や、先発明の特願2000-334978による方法が提案されている。
【０００５】
このRNSモンゴメリ乗算（以下、モンゴメリ乗算と略称する）では、基底変換と呼ぶ処理が２回実行される。ここで基底変換とは、RNSのある基底で表された数をその基底と互いに素な別の基底で表現し直すことをいう。モンゴメリ乗算では基底変換以外の処理も行なうが、基底変換以外の処理は演算量が少ないため、基底変換の処理時間によってモンゴメリ乗算の処理性能が決まる。さらに、モンゴメリ乗算の繰返し処理によってべき乗剰余算が実現されるため、基底変換の処理時間がべき乗剰余算の処理性能も決めることになる。このため、基底変換の処理の効率化はべき乗剰余算の処理性能向上に直結するものである。
【０００６】
【発明が解決しようとする課題】
基底変換の処理自体の効率化については、既に様々な取り組みがなされている。しかし、モンゴメリ乗算で実行する２回の基底変換同士を並列処理するという試みは行なわれていない。これは、従来法のモンゴメリ乗算のアルゴリズムでは、１回目の基底変換で得られる結果を用いて２回目の基底変換を開始する必要があるために、２つの基底変換は逐次処理されねばならず、並列処理が不可能になっていることによる。
【０００７】
また従来法は、並列演算ユニットを増設することで処理性能の向上を図るものであるが、最も高い処理性能が得られる並列ユニット数uは、RNSの基底サイズをnとしてu=nであり、nが並列度に関する上限値となる。すなわち従来法は、ユニット数が1≦u≦nの範囲内で処理性能の向上が得られるものであり、nを超えるユニット数を用意してもu=nでの処理性能を上回ることはできない。
【０００８】
上述した点に鑑み、本発明は、２回の基底変換の並列処理（二重処理）を可能とするであることを特徴とするRNSモンゴメリ乗算の処理方式を提供することを目的とする。
【０００９】
【課題を解決するための手段】
本発明は、整数を剰余演算系で表現し、これを演算処理する剰余演算装置であって、剰余演算機能を有する第1の積和回路と第2の積和回路とを具備する積和演算ユニットと、前記第1の積和回路の剰余演算に用いられる補正項を求め、これを前記第１の積和回路へ供給する第１の補正項計算ユニットと、前記第２の積和回路の剰余演算に用いられる補正項を求め、これを前記第２の積和回路へ供給する第２の補正項計算ユニットとを備えた。
【００１０】
好ましくは、上記積和演算ユニットは、複数個備えているようにしてもよい。
【００１１】
好ましくは、前記第１の積和回路と第２の積和回路とに接続される記憶手段を更に備えているようにしてもよい。
【００１２】
また、本発明は、第１の基底で表現された剰余演算系の第１中間変数を基底変換し、第１の基底と異なる第２の基底に基づく剰余演算系の中間変数を得る第１基底変換処理と、該第１の基底で表現された剰余演算系の、第1中間変数とは異なる第２中間変数を基底変換し、該第２の基底に基づく剰余演算系の中間変数を得る第２基底変換処理とを備えたモンゴメリ乗算を、基底変換を処理可能な第１の積和演算手段と第２の積和演算手段とを備えた剰余演算装置を利用して、演算処理させる剰余演算方法であって、前記第１基底変換処理を前記第１の積和演算手段にて、前記第２基底変換処理を前記第２の積和演算手段にて並列実行させるよう制御するようにした。
【００１３】
また、本発明は、第１の基底で表現された剰余演算系の第１中間変数を基底変換し、第１の基底と異なる第２の基底に基づく剰余演算系の中間変数を得る第１基底変換処理と、該第１の基底で表現された剰余演算系の、第1中間変数とは異なる第２中間変数を基底変換し、該第２の基底に基づく剰余演算系の中間変数を得る第２基底変換処理とを備えたモンゴメリ乗算を、基底変換を処理可能な第１の積和演算手段と第２の積和演算手段とを備えた剰余演算装置を利用して、演算処理させる剰余演算方法であって、第１の基底または第２の基底のうちの何れか一方の基底によって表現される値を入力するステップと、ｋ回目の第１基底変換処理と（ｋ―１）回目の第２基底変換処理とを並列実行するよう制御するステップと、前記第１の基底または前記第２の基底のうちの他方の基底によって表現される値を出力するステップとを備えた。
【００１４】
また、本発明は、整数を基底Ａおよび基底Ｂの剰余演算系で表現し、該基底Ａに基づいて求められた値を該基底Ｂに基づいて表される値へ基底変換を行う第１基底変換処理と、該基底Ｂに基づいて求められた値を該基底Ａに基づいて表される値へ基底変換を行う第２基底変換処理と、を含む１回の剰余付き乗算を繰り返すことにより、演算結果を得るべき乗剰余演算方法であって、ｋ回目の第１基底変換処理と（ｋ＋１）回目の第１基底変換処理とを並列実行するよう制御する第１ステップと、（ｋ＋１）回目の第２基底変換処理と（ｋ＋２）回目の第２基底変換処理とを並列実行するよう制御する第２ステップと、を繰り返し実行してべき乗剰余演算を行うようにした。
【００１５】
好ましくは、べき乗剰余演算をモンゴメリ乗算の繰り返し処理で実装する場合のループ処理内の、最初のモンゴメリ乗算に入力される第３の中間変数の係数が各ループ処理で等しくなるように、該ループ処理内の最後のモンゴメリ乗算において中間変数と掛け合わせる定数の係数を設定するようにした。
【００１６】
上記のようにした本発明により、RNSモンゴメリ乗算１回当たりの処理時間を約1/2に短縮できるようになった。
【００１７】
また、並列ユニット数がn＜u≦2nに相当する範囲内に対しても処理性能の向上を実現する。そして、RNSモンゴメリ乗算を適用することで、RSA暗号の処理等に用いられる高速な剰余演算装置、剰余演算方法および、べき剰余演算方法を実現することができるようになった。
【００１８】
【発明の実施の形態】
以下、本発明の実施形態について、図面を参照しつつ詳細に説明する。
（第１実施形態）
RSA暗号で用いるべき乗剰余算 C = Me mod N を、モンゴメリ乗算を繰返し実行して実現する方法が知られている。このモンゴメリ乗算(MM)は、整数 x, y, Nの入力に対し、w = xyB1 mod N ないし xyB1 mod N + N を出力するアルゴリズムであり、次の５つのステップで与えられる。ここでBはNより大きく、Nと互いに素な任意の整数である。
MM
（１）s ← x・y
（２）t ← [s・(N)1] mod B
（３）u ← t・N
（４）v ← s + u
（５）w ← v/B
このモンゴメリ乗算を剰余演算系(RNS)表現を用いて実行する方法として、Poschらによる次の処理が提案されている。
MM[A,B→A,B]
（１）sB ← xB・yB
（１'）sA ← xA・yA
（２）tB ← [sB・(NB)1] mod B
（３）基底変換BT1: tB ⇒ tA
（４）uA ← tA・NA
（５）vA ← sA + uA
（６）wA ← vA・BA1
（７）基底変換BT2: wA ⇒ wB
添え字AないしBをつけた記号は、それぞれ剰余演算系の基底A=[a1, a2, , an]ないし基底B=[b1, b2, , bm]によって表現された数を表す。例えばxAは、基底Aの各要素でxを割った余りの組[x1, x2, , xn]、ここでxi = x mod ai (i = 1, ,n)、を表す。基底Aのサイズnと基底Bのサイズmは一般には異なるが、基底Aを処理する演算ユニットと基底Bを処理する演算ユニットとの共有が可能なn=mの場合について本実施例では説明を行なう。次に、基底変換とはある基底で表された数をその基底と互いに素な別の基底で表現しなおすことをいい、例えばwA ⇒ wBは、基底Aで表されたwAを用いて基底Bで表されるwBを求めることを意味する。なお、RNSモンゴメリ乗算の必要条件はN<A, N<Bであり、この条件からxとyは基底Aのみ、あるいは、基底Bのみで一意に表現できる数になっている。しかし、例えば処理の過程で扱うsはxとyとの積であり、値の範囲が0≦s＜N2であるため、sを一意に表現するには基底としてA・Bを用いる必要がある。以下、本実施例ではRNSモンゴメリ乗算を簡略してモンゴメリ乗算と呼ぶ。
【００１９】
上記７ステップで実現されるモンゴメリ乗算において、(3)と(7)の基底変換がその処理時間の大半を占めるため、ステップ(3)と(7)の効率的処理を行なうことで、モンゴメリ乗算の高速化、ひいては、べき乗剰余算の高速化が期待できる。以下、その方法について考察する。
【００２０】
モンゴメリ乗算ではxA, yA, xB, yB, Nの入力に対してwA, wBが出力される。繰返し処理を行なう場合は、得られたwAおよびwBをそれぞれ入力データのxA, yAおよびxB, yBとして次のモンゴメリ乗算を実行する（正確には、二乗を行なう場合はxA, xB ← wA, wBおよびyA, yB ← wA, wBとし、定数fとの積を求める場合は、例えばxA, xB ← wA, wBおよびyA, yB ← fA, fBとする）。すなわち従来法でのモンゴメリ乗算では、２種類の基底A, Bに関する入力データを用意した後に処理を開始し、処理の終了時には２種類の基底A, Bに関する出力データが得られていることになる。
【００２１】
この繰り返し処理を図３に示した。この図は特に基底変換について処理の流れを図示したものである。今、モンゴメリ乗算をK回繰り返し実行するとして、k回目(k=1, ..., K)の処理に着目する。モンゴメリ乗算１回あたり基底変換を２回行うため、もしも基底変換BT1(k)とBT2(k)とを並列処理できるならば、モンゴメリ乗算の処理時間の短縮が可能になる。しかし、基底変換BT2(k)の実行には基底変換BT1(k)の結果であるtAが必要になるため、BT1(k)とBT2(k)は逐次的に実行されねばならず、並列処理は不可能であることが分かる。すなわち、従来法によるモンゴメリ乗算は基底変換の並列処理（二重処理）ができないアルゴリズムになっている。
【００２２】
そこで本発明では、基底変換BT2(k)とBT1(k+1)という組み合わせで二重処理を実現することを考える。まず説明を分かり易くするため、図３の従来法による繰り返し手順を変形した仮想的な手順を想定する。図４に示したこの仮想的な手順では、モンゴメリ乗算MM[A,B→A,B]とA, Bを入れ替えた関係にあるMM[B,A→B,A]を導入し、MM[A,B→A,B]とMM[B,A→B,A]とを交互に実行することを想定する。
【００２３】
具体的には、k+2p回目でMM[A,B→A,B]を、k+2p+1回目でMM[B,A→B,A]を実行する（pは任意の整数である）。ここで、MM[A,B→A,B]とMM[B,A→B,A]はA, Bを入れ替えただけであるため、図３と図４は処理の手順やステップ数は全く同じものであることに留意されたい。図４において基底変換BT2(k)とBT1(k+1)とを比較した場合、どちらの基底変換も実行に必要な変数はxA, yA（すなわちwA）であることが分かる。これはBT2(k)とBT1(k+1)との並列処理が可能であることを意味するものである。そのため本発明では、BT2(k)をk回目のモンゴメリ乗算ではなくk+1回目のモンゴメリ乗算において実行することで、基底変換BT2(k)とBT1(k+1)との二重処理を実現するアルゴリズムを以下のように提案する。
【００２４】
まず、本発明では次の２種類のモンゴメリ乗算を考慮する。
MM[B→A]
（１）sB ← xB・yB
（２）tB ← [sB・(NB)1] mod B
（３）基底変換BT1: tB ⇒ tA ,   基底変換BT2: xB , yB ⇒ xA , yA
（４）uA ← tA・NA
（４'）sA ← xA・yA
（５）vA ← sA + uA
（６）wA ← vA・BA1
MM[A→B]
（１）sA ← xA・yA
（２）tA ← [sA・(NA)1] mod A
（３）基底変換BT1: tA ⇒ tB ,   基底変換BT2: xA , yA ⇒ xB , yB
（４）uB ← tB・NB
（４'）sB ← xB・yB
（５）vB ← sB + uB
（６）wB ← vB・AB1
上記において、MM[B→A]とMM[A→B]はA, Bを入れ替えた関係にあり、本発明はこのMM[B→A]とMM[A→B]を交互に実行することで繰返し処理を実現することを特徴とする。
【００２５】
本発明によるモンゴメリ乗算の繰り返し処理を、基底変換の取扱いが分かるように図３および図４に対比させて示したものが図５である。本図では、繰り返し処理のk+2p回目でMM[B→A]を、k+2p+1回目でMM[A→B]を実行するとしている。図５を図４と比較した場合、基底変換BT2(k)がk回目の処理からk+1回目の処理に移動し、BT1(k+1)と並列に処理される。そのため、モンゴメリ乗算１回当たりの基底変換に要する処理時間が２回分から１回分に減り、またモンゴメリ乗算の処理時間の大半が基底変換で費やされることから、約1/2の処理時間の短縮を見込むことができる。
【００２６】
ここで、図３および図４でのBT2(k): wA ⇒ wBと、図５でのBT2(k): xA, yA ⇒ xB, yBとは全く同じ処理であることを補足説明しておく。図５では処理の流れを分かり易くするためにx, yという表記を用いたが、k+1回目の処理でのx, yとはk回目の処理でのwのことであり、すなわち図５のBT2(k)はwA ⇒ wBを行うものである。同様に、上記したMM[B→A]とMM[A→B]のステップ(3)での基底変換BT2に関しても、BT2: xξ, yξ ⇒ xζ, yζ という表記は、従来法でのステップ(7)のBT2: wξ ⇒ wζと全く同じ処理を意味している。ここでξ, ζはAまたはBを表す。
【００２７】
なお図５では、従来法で逐次的に処理していた基底変換BT1とBT2を並列処理していることを明示するために、BT1とBT2を横に書き並べて表した。図３〜図５のモンゴメリ乗算処理を表すボックスは、縦方向が処理時間に、横方向がハードウェアの規模に対応すると考えられたい。本発明は、基底変換の二重処理を実現するために、回路規模を２倍にして約1/2の処理時間短縮を図るものであるが、これは通常の並列演算ユニットの増設による高速化のように自明な技術ではなく、これまで説明してきたように、モンゴメリ乗算の手順を変更することで初めて可能になったものである。
【００２８】
次にMM[B→A]とMM[A→B]の入出力データについて説明する。図５から、BT1(k+1)とBT2(k)との並列処理が実現されたことにともない、MM[A→B]では入力データとして基底A, B両方に関するRNS表現は必要なく、xA, yAのみを入力すればよいことが分かる。これは、xB, yBがMM[A→B]の処理中に基底変換BT2によってxA, yAから求められることによっている。一方、出力データとしては、入力データと逆の表現であるwBが得られる。すなわちMM[A→B]およびMM[B→A]は、入力データと出力データの表現がAとBに関して逆になるという性質を持つ。この性質のため、MM[A→B]のみ、あるいはMM[B→A]のみで繰返し処理を行なおうとした場合、出力データを次の入力データとして用いる単純な繰返し処理ができないことになる。この不都合を回避する方法が、本発明によるアルゴリズムの特徴であるMM[B→A]とMM[A→B]とを交互に実行する繰返し処理である。
【００２９】
それでは、上記したMM[B→A]とMM[A→B]の処理ステップを具体的な処理手順とともに説明する。図５に示したようにk回目の処理でMM[B→A]を実行する場合、k1回目のMM[A→B]が終了した時点でwBが得られており、これがk回目のMM[B→A]の入力データxB, yBとなる。
【００３０】
以下、MM[B→A]での処理を説明する。まず入力データxB, yBを用いて、ステップ(1)と(2)からtBを得る。ステップ(3)で基底変換BT1によってtBからtAを求める際、同時にxB, yBから同じく基底変換BT2にてxA, yAを求める。このステップ(3)で得られたtAおよびxA, yAを用いて、続くステップ(4)でuAを、ステップ(4')でsAを求める。そしてステップ(5)と(6)によってuA, sAからwAを得る。従来法のMM[A,B→A,B]との違いは、ステップ(7)の基底変換BT2（正確には、1つ前のモンゴメリ乗算での基底変換BT2）を、ステップ(3)において基底変換BT1と並列に処理する点である。また従来法ではステップ(1')で計算していたsAをステップ(4')にて求めている。
【００３１】
同様に、続くk+1回目でのMM[A→B]では、上述したMM[B→A]においてAとBを完全に入れ替えた処理を行なう。得られた出力データwBを入力データxB, yBとして、k+2回目のMM[B→A]に接続することができる。
【００３２】
ここでMM[B→A], MM[A→B]についての補足説明を行なう。上述した処理手順では、説明を分かり易くするために基底変換BT2をステップ(3)において基底変換BT1と並列に処理するとしているが、BT2の処理は必ずしもBT1と同時に行なう必要はない。BT2は、BT2の結果を用いて計算されるsAないしsB（MM[B→A]の場合はsA、MM[A→B]の場合はsB）を使用するステップ(5)までに処理が完了されればよい。すなわち、基底変換BT2は、ステップ(1)から(4)を実行中にそれらと並列に処理すればよい。同様の理由で、ステップ(4')のsAないしsBの計算も、BT2の後、ステップ(5)の前までに実行すればよい。ただし基底変換BT2に関しては、基底変換BT1と同時に実行する場合に、基底変換を二重処理するための制御部での処理の増加分を最小限に抑えられるという利点がある。
【００３３】
以上説明してきたように、本発明ではMM[B→A]とMM[A→B]を交互に実行することで、
繰返し          処理            入力データ    出力データ
：
k回目          MM[B→A]      xB, yB          wA
k+1回目        MM[A→B]      xA, yA          wB
k+2回目        MM[B→A]      xB, yB          wA
：
という繰返し処理が実現される。比較のために従来法について同様な表を書くと次のようになる。
繰返し          処理            入力データ    出力データ
：
k回目          MM[A,B→A,B]      xA, yA, xB, yB      wA, wB
k+1回目        MM[A,B→A,B]      xA, yA, xB, yB      wA, wB
k+2回目        MM[A,B→A,B]      xA, yA, xB, yB      wA, wB
：
両者を比較すると、本発明による方法では入出力において１種類の基底に関するデータしか扱わないため、計算上（特にRNS表現として）問題があるように一見されるかもしれない。しかし、前述したようにRNSモンゴメリ乗算での必要条件N<A, N<Bがあるために、xやy（すなわちw）は基底Aのみあるいは基底Bのみで一意に表現される数となっており、どちらか１種類の基底に関するデータが得られていれば問題ないことが保証されている。また本発明は従来法の処理の順番を入れ替えているだけであり、処理の途中においては従来法と同様にA, B両方の基底に関する計算を行なっているため、その他の中間変数に関しても計算上の問題は生じない。
【００３４】
以下、本発明によるモンゴメリ乗算の繰返し処理を実現するためのハードウェア構成について説明する。まず図２に従来法での剰余演算装置のハードウェア構成を示す。RNS表現の基底要素ごとの演算を並列処理するための同一構成のユニットu個と、基底変換での補正項の計算を行なう補正項計算ユニット210から構成される。
【００３５】
並列ユニットは、剰余演算機能付き積和回路201、RAM221、ROM231で構成される。補正項計算ユニット210に関しては、ビット選択部やROM等を要する場合、それらも含めて補正項計算ユニットとしている。ここで、並列ユニット数uは基底サイズnと1≦u≦nという関係にあり、ユニット数uがnの約数である場合に、効率的な並列処理が可能である。uがnより小さい場合は１つのユニットが２個以上の基底要素に関する演算を担うことになるため、処理時間はuに反比例して増減する。しかし、並列度を最も高くした場合がu=nであり、従来法ではユニット数をnより増やしても処理速度の向上は得られない。
【００３６】
図１に本発明による剰余演算装置のハードウェア構成を示す。剰余演算機能付き積和回路[1]1011、積和回路[2]1012、RAM1210、ROM1310で構成されるu個のユニットと、補正項計算ユニット[1]1101と補正項計算ユニット[2]1102から構成される。剰余演算装置の全体構成、および、積和回路[1]1011、RAM1210、ROM1310、補正項計算ユニット[1]1101の構成としては、先発明の特願2000-334978での構成、および先発明での変形例、あるいは、先発明での従来法の構成を適用することができる。さらに、本発明に基づいてべき乗剰余演算装置を構成する場合も、先発明での構成を適用することができる。
【００３７】
本発明の特徴は、従来技術による剰余演算装置に積和回路[2]1012および補正項計算ユニット[2]1102が追加された点であり、二重処理を行なう基底変換の一方の処理をこれらによって実行する。すなわち、例えば基底変換BT1を積和回路[1]と補正項計算ユニット[1]で、基底変換BT2を積和回路[2]と補正項計算ユニット[2]で行なうことで、基底変換BT1とBT2の並列処理を実現する。そのために、積和回路[2]1012および補正項計算ユニット[2]1102は、それぞれ積和回路[1]1011および補正項計算ユニット[1]1101と同じ構成を有する。そして、補正項計算ユニット[1]1101は積和回路[1]と接続され、補正項計算ユニット[2]1102は積和回路[2]と接続される。
【００３８】
積和回路[1]1011と積和回路[2]1012はRAM1210とROM1310を共有する。 本発明では、積和回路[2]を増設して基底変換の二重処理を行なうために、RAMないしROMのサイズを従来法の２倍にする必要はない。積和回路[1]1011と積和回路[2]1012間でのデータ転送に関しては、バスで相互接続してもよいし、RAM1210を介して行なったのでもよい。積和回路[1]1011と積和回路[2]1012による構成ユニットを便宜的に積和ユニット1010と称する。
【００３９】
ここで基底変換BT1、BT2以外の処理を積和回路[1]と積和回路[2]にどう分担させるかに応じて、積和回路[2]の構成を変えることができるためそれについて補足しておく。例えば、積和回路[1]で基底変換BT1と基底変換以外の全処理を行なうとし、積和回路[2]では基底変換BT2のみを行うとした場合は、積和回路[2]1012については、剰余演算機能付き積和回路として基本的な構成要素である乗算器、加算器、剰余演算部、レジスタ、および、スイッチを有していれば、積和回路[1]1011と全く同じ構成にする必要はなく、よりシンプルな構成にすることも可能である。
【００４０】
本発明による剰余演算装置を従来技術による剰余演算装置と比較した場合、両者で並列ユニット数が同じであれば、基底変換の二重処理を行なう本発明は約２倍の処理性能を有することになる。図１の並列度をuではなく2uであると見なすならば、本発明による剰余演算装置はユニット数が2nに相当する処理性能まで高速化が可能であるといえる。これは、従来法においてnであった並列度の上限を2nまで引き上げたことに相当する。
【００４１】
次に、本発明による２種類のモンゴメリ乗算を交互に実行してべき乗剰余算を行なう手順について、図７のフローチャートに従って説明する。本フローチャートは、入力されたRNS表現の値xをe乗し、Nで割った余りを求める処理を表す。その際、Nは既知と仮定し、Nおよび後述する定数f, g, hのRNS表現を求めるなどの処理については事前に計算してあるものとして図７には示していない。なお、Nや定数を外部入力とし、それらのRNS表現を求めるなどの処理をその都度行なうように構成しても良い。
【００４２】
xの基底Bに関するRNS表現（以下、B表現と略記する）とべき指数eが入力されると、まずxと定数fとをモンゴメリ乗算MM[B→A]によって掛け合わすことでx'を得る。ここでf = (AB) mod Nとしている。MM[B→A]への入出力データは、入力データがxのB表現、出力データがx'の基底Aに関するRNS表現（以下、A表現と略記）である。その際、定数fについてはA, B両方の基底に関する値(fA, fB)が入力データとして必要になる。これは、MM[B→A]の処理中に基底変換BT2によってA表現からB表現に変換されるのは変数xのみであるため、xと定数とを掛け合わせる場合、定数についてはA, B両方の基底に関する値を事前に計算しておく必要があるためである。
【００４３】
次に、x'のA表現と定数gとをモンゴメリ乗算MM[A→B]に入力し、中間変数cのＢ表現を得る。ここでg = B mod Nとしている。またMM[A→B]の処理の過程において、基底変換BT2によってx'Aからx'Bが得られていることを明記するため、図７では(, x'B)という表記を付加している。x'Aとx'Bは続く処理にて使用する。
【００４４】
次のステップではループ処理に入る。ここで、ループ変数iはλ1から1まで変化する。さらに、外部入力されたべき指数eは2進数表現されており、そのビット数をλ、各ビットをeiとしている。eλは最上位ビットであり、ここでは1とする。また、λは2以上の値とする。
【００４５】
ループ内では、まず、中間変数cの２乗に相当する値を計算するために、モンゴメリ乗算MM[B→A]にcBを入力し、出力結果（例えばc'A）を改めてcAとする。
【００４６】
続いて、ループ変数iに対応するeのビットeiが0か1かを判定し、1の場合はcとx'とを、0の場合はcと定数hとをモンゴメリ乗算MM[A→B]によって掛け合わせる処理を行なう。ここでh = A mod Nとしている。
【００４７】
次に、ループ変数iが1か否かを判定し、1でなければループの開始点に戻り、1であればループ処理を抜ける。
【００４８】
最終ステップでは、得られたcと1とをモンゴメリ乗算MM[B→A]によって掛け合わせ、演算結果yのA表現を得る。
【００４９】
以上の手順によって、y = xe mod Nを計算することができる。既に述べたように、RNSモンゴメリ乗算の入出力データは、基底Aのみ、あるいは、基底Bのみで一意に表現される数であるため、yAからyを求めることに問題は生じない。
【００５０】
図７を従来法でのフローチャートを示した図６と比較した場合、ei=0の時もモンゴメリ乗算を実行する点が異なっており、その分の処理時間が増加するように思われる。しかし実際の実装においては、暗号解析に対する耐性を向上させるために、従来法においてもei=0の場合にモンゴメリ乗算を実行することで、ei=0とei=1での処理時間を同じにするという処置が行なわれるため、必ずしも図７が図６と比較して処理時間に関してデメリットを持つわけではない。なお、図６で定数dはB2 mod Nを表す。
【００５１】
また上述した図７による繰返し処理の手順は、べき乗指数eを１ビットずつサーチしながら乗算を繰り返すことでべき乗剰余算を実現する方法（バイナリ法）であるが、例えばeをqビットずつサーチする方法（qビットウィンドウ法）に対して本発明によるモンゴメリ乗算を適用してもよい。
【００５２】
ここで、図７のべき乗剰余算のループ内での処理に関して、さらに詳しく説明する。まず、ループ内の処理を次のようステップ(a)とステップ(b)に分けて考える。
ステップ(a)  c'A ←MM[B→A](cB, cB)
ステップ(b)  c'B ←MM[A→B](cA, (jA, jB))
説明を分かり易くするために、上記では演算結果をc'で表している。また、jはeiに応じて定まる定数であり、ei=1の場合はj=x'、ei=0の場合はj=hである。ここで、x'とhはループ処理の前に事前計算される値であるため、x'およびh（すなわちj）を定数と称している。ステップ(a)は入力変数の二乗を計算し、ステップ(b)は入力変数に定数を掛ける処理である。
【００５３】
上記においてc'A, c'Bの計算式は、具体的には
ステップ(a)  c'A = [c・c・B1 mod N]A  or  [c・c・B1 mod N + N]A
ステップ(b)  c'B = [c・j・A1 mod N]B  or  [c・j・A1 mod N + N]B
となっている。ここで、c'AにはB1 が、c'BにはA1 が、それぞれ係数として掛かることに注目されたい。これは本実施例の冒頭で述べたモンゴメリ乗算の性質によるものである。
【００５４】
このように、MM[B→A]においてはB1が、MM[A→B]においてはA1 が、それぞれ係数として演算結果に掛かるという性質があることから、MM[B→A]、MM[A→B]を交互に繰返し実行するために、中間変数の係数を制御する必要が生じ、以下、その方法について説明する。その際、ループ処理に入る直前の中間変数cの係数を仮定して説明を行なう必要がある（これは係数の初期値を定めることを意味する）。図７に示した例ではループに入る直前のcはB・x mod Nであり、すなわち係数の初期値はBである。本実施例では初期値としてこの係数Bを例にとって説明を行なう。なお、ここでいう係数とは、φとψを任意の整数として、Aφ・Bψで表される数である。また係数の初期値のとり方は任意であり、B以外でもよい。
【００５５】
以下、係数に着目して、べき乗剰余算のループ内の処理を考察する。まず、ループi=λ1のステップ(a)では、係数がBである中間変数の二乗にB1を掛ける処理が行なわれる。そのため、演算結果の係数は同じくBとなる。続くステップ(b)は、中間変数に定数を掛ける処理であり、それにA1が掛かるため、演算結果の係数は B・J・A1となる。ここで定数の係数をJとしている。この演算結果を入力データとして、続くループi=λ2のステップ(a)に戻ってループ処理を続行するには、係数B・J・A1が初期値と同じBである必要がある。この条件は、各ループで同じ処理を行ないながらステップ(a)とステップ(b)を繰返し実行するために必要なもので、この条件B・J・A1 = BからJ = Aが得られる。実際、図７に示した例では、x'とhは共に係数はAになっている。
【００５６】
以上は、MM[B→A]とMM[A→B]を交互に実行してべき乗剰余算のループ処理を実行する際、ステップ(a)のモンゴメリ乗算に入力される中間変数cの係数が、各ループで同じである必要があることを示している。本発明は、この係数の制御を実現するため、ステップ(b)のモンゴメリ乗算で中間変数と掛け合わされる定数の係数を、上記に示した方法で選ぶものである。
【００５７】
ここで、qビットウィンドウ法についても係数の制御法を説明する。qビットウィンドウ法では、ステップ(a)において中間変数cの二乗計算をq回行なう必要があり、そのためモンゴメリ乗算をq回実行した後に、ステップ(b)へと処理が移る。ステップ(b)での処理は基本的に図７のバイナリ法と同じであるが、qビットウィンドウ法ではべき指数eをqビットずつサーチするため、eiに関する分岐が２通りではなく、qビットで表される数の個数分に分岐して処理されることになる（例えば、4ビットの場合は0〜15の16通りである）。ただし、ステップ(b)でのモンゴメリ乗算の回数は各分岐とも図７と同じ１回であり、かつ、バイナリ法と同様に中間変数cに定数を掛け合わせる処理が行なわれる。そのためqビットウィンドウ法においても、ステップ(b)のモンゴメリ乗算（すなわち、ループ処理内の最後のモンゴメリ乗算）において中間変数と掛け合わせる定数の係数を、上述したバイナリ法での説明と同様な方法で選ぶことで、ステップ(a)の１番目のモンゴメリ乗算（すなわち、ループ処理内の最初のモンゴメリ乗算）に入力する中間変数の係数が各ループで等しくなるように制御することが可能である。
【００５８】
具体的には、ステップ(b)の演算結果の係数が、係数の初期値と一致するように定数の係数を定める。これによって、MM[B→A], MM[A→B]を交互に実行して、べき乗剰余算のループ処理をqビットウィンドウ法に対しても実現することができる。
【００５９】
上記処理において、qの値によって注意が必要な場合があり、それについて補足する。qが奇数の場合（例えばバイナリ法）は、上述した方法をそのまま適用することができるが、qが偶数である場合、次のような処置を行なう必要がある。ここでは4ビットウィンドウ法を例に挙げて説明する。
【００６０】
4ビットウィンドウ法では、ステップ(a)でモンゴメリ乗算を４回、ステップ(b)でモンゴメリ乗算を１回行うため、ループ１回あたりのモンゴメリ乗算の回数は計５回の奇数となる。このために、例えばi番目のループでの最初のモンゴメリ乗算がMM[B→A]であった場合、次のi1番目のループでの最初のモンゴメリ乗算はMM[A→B]となり、周期性がループ１回ではなくループ２回になることが分かる。これを受けて、qが偶数の場合は、ループ２回で１周期と見なした次のような係数の制御を行なう。
：
ループi
ステップ(a)    c'A = [c・c・B1 mod N]A  or  [c・c・B1 mod N + N]A
c'B = [c・c・A1 mod N]B  or  [c・c・A1 mod N + N]B
c'A = [c・c・B1 mod N]A  or  [c・c・B1 mod N + N]A
c'B = [c・c・A1 mod N]B  or  [c・c・A1 mod N + N]B
ステップ(b)    c'A = [c・j1・B1 mod N]A  or  [c・j1・B1 mod N + N]A
ループi1
ステップ(a)    c'B = [c・c・A1 mod N]B  or  [c・c・A1 mod N + N]B
c'A = [c・c・B1 mod N]A  or  [c・c・B1 mod N + N]A
c'B = [c・c・A1 mod N]B  or  [c・c・A1 mod N + N]B
c'A = [c・c・B1 mod N]A  or  [c・c・B1 mod N + N]A
ステップ(b)    c'B = [c・j1・A1 mod N]B  or  [c・j2・A1 mod N + N]B
：
上記したようにqが偶数の場合、２種類の定数j1とj2を導入する。そして、j1の係数J1とj2の係数J2が基底A, Bを入れ換えた関係にあり、かつ、ステップ(a)の最初のモンゴメリ乗算に入力される中間変数の係数が各周期で等しくなるようにJ1とJ2を定める。すなわち、ループiの最初のモンゴメリ乗算に入力される中間変数cの係数をBと仮定した場合、j2と掛け合わせた演算結果の係数がBになるようにJ2を定める。同様にJ1については、j1と掛け合わせた演算結果の係数がAになるようにJ1を定める。このような方法によって、qが偶数の場合も、ループ２回を１周期とみなして係数を制御することで、MM[B→A], MM[A→B]を交互に実行して、べき乗剰余算のループ処理を実現することができる。
【００６１】
最後に、本発明によるモンゴメリ乗算による高速化率について考察する。まず、基底AおよびBの基底サイズをnとして、基底変換に要するステップ数はn2である。これをu個の並列演算ユニットで並列処理するため、１ユニットあたりのステップ数はn2/uとなる。効率的な並列処理が可能なユニット数uはnの約数であることから、ここでp=n/uを仮定すると、１ユニットあたりの基底変換のステップ数はn2/u = npと書き換えられる。以下では、ユニット数が同じu個である場合に、１ユニットあたりのステップ数について、従来法と本発明による方法との比較を行なう。
【００６２】
まず説明を簡単にするため、u=n、すなわち、p=1の場合から説明する。基底変換のステップ数がnであるため、モンゴメリ乗算で基底変換を２回行なう従来法では、１ユニットあたりのモンゴメリ乗算のステップ数は2n+αで表される。ここで基底変換以外に要するステップ数をαとしている。そして、べき乗剰余算のほとんどの処理時間がモンゴメリ乗算で費やされる（99％前後）ため、Kをモンゴメリ乗算の繰返し回数として、(2n+α)Kをべき乗剰余算に要する従来法での１ユニットあたりのステップ数と見積ることができる。一方、本発明によるモンゴメリ乗算を適用する場合、モンゴメリ乗算の繰返し回数Kは変わらないが、基底変換に要する処理時間が２回分から１回分に減るため、べき乗剰余算に要する１ユニットあたりのステップ数は(n+α)Kとなる。ここで通常αは従来法での値から若干異なるが、変化分は無視できる範囲内である。以上より、本発明による高速化率は(2n+α)/(n+α)となる。具体的な数値として、例えば鍵長1024ビットに対してn=33、α=14を想定することができ、この場合、本発明によって1.7倍の処理性能の向上が得られる。また鍵長を長くする場合、通常、それに比例して基底サイズnを増加する必要があるが、その際αの値は不変となる。そのため、長い鍵長でのRSA暗号処理ほど本発明によるモンゴメリ乗算の適用が効果的であり、高速化率が2倍に近づくことが分かる。
【００６３】
次にp=n/u≧2の場合は、pに関する繰り返し処理が入るため、べき乗剰余算に要する１ユニットあたりのステップ数は、従来法が(2np+α)pK、本発明による方法が(np+α)pKとなる。そのため、本発明による高速化率として(2np+α)/(np+α)という見積りが得られる。
（第２実施形態）
第２の実施形態では、図５に示した本発明によるモンゴメリ乗算の繰返し処理の変形例を示す。
【００６４】
従来法でのモンゴメリ乗算MM[A,B→A,B]は、基底変換の逐次処理を行なうものであり、基底A, Ｂに関して表現した２種類のデータが入力され、基底A, Bに関して表現された２種類のデータが出力される。ここでMM[A,B→A,B]の手順を改めて見直すと、
ａ）xB, yBはステップ(1)の前に入力される必要があるが、xA, yAはステップ(5)までに入力されればよい、
ｂ）出力データのwA, wBは、ステップ(6)が終了した時点で片方のwAの計算が終了している、
という特徴があることが分かる。この２つの特徴のために、次のような手順によって基底変換の二重処理を行なうことが可能である。
【００６５】
まず、モンゴメリ乗算[1]でステップ(7)の基底変換BT2を開始すると同時に、ステップ(6)で既に計算されているwAを入力データとしてモンゴメリ乗算[2]を開始する。これによって、モンゴメリ乗算[1]の基底変換BT2とモンゴメリ乗算[2]の基底変換BT1を同時実行することができる。次に、モンゴメリ乗算[1]のステップ(7)が終了した時点で、基底変換BT2の結果wBをモンゴメリ乗算[2]に入力する。そして、モンゴメリ乗算[2]では、入力されたwB（すなわちxB, yB）を用いて基底変換BT2を開始する。それと同時に、モンゴメリ乗算[1]では繰返し処理の次の処理に移り、モンゴメリ乗算[2]のステップ(6)で得られているwBを入力データとして基底変換BT1を実行する。これによって、モンゴメリ乗算[2]の基底変換BT2とモンゴメリ乗算[1]の基底変換BT1とが同時に処理されることになる。
【００６６】
以上の手順を図８に示した。本図では、図４で説明したMM[B,A→B,A]を導入し、上述のモンゴメリ乗算[1]がMM[A,B→A,B]に、モンゴメリ乗算[2]がMM[B,A→B,A]に対応している。MM[B,A→B,A]は、MM[A,B→A,B]の手順で基底A, Bを入れ換えた従来法によるモンゴメリ乗算である。図８に示した手順は、基底変換の逐次処理を行なう2種類のモンゴメリ乗算を２分の１ずつずらしながら並列処理を行なうことを特徴としている。
【００６７】
これによって、k回目のMM[A,B→A,B]のBT2(k)とｋ回目のMM[B,A→B,A]のBT1(k)が並列処理され、k+1回目のMM[A,B→A,B]のBT1(k+1)とｋ回目のMM[B,A→B,A]のBT2(k)が並列処理されることになる。その際、MM[A,B→A,B]の処理を図１の積和回路[1]で、MM[B,A→B,A]の処理を図１の積和回路[2]で行なう（または、この逆でもよい）。以上説明したように、図８に示した手順によれば、基底変換の逐次処理を行なうモンゴメリ乗算を用いても基底変換の二重処理が可能であり、約1/2の時間短縮を図ることができる。
【００６８】
【発明の効果】
以上説明したように本発明によれば、基底変換の二重処理を実現することでモンゴメリ乗算の約２倍の高速処理が可能となり、RSA暗号処理の高速化を実現できる。その際、通常の並列演算ユニットの単純な増設による高速化とは異なり、次のような特徴を持つ。従来法では並列ユニット数uの増加に伴う処理性能の向上が1≦u≦nの範囲に限られるのに対し、本発明はn＜u≦2nに相当する範囲に対しても並列ユニットの増設を有効にし、処理性能の向上を図ることができる。すなわち、並列化による処理性能向上の上限を従来法の約２倍に引き上げることが可能である。
【図面の簡単な説明】
【図１】本発明の実施形態に係る剰余演算装置の構成を示す図。
【図２】従来技術に係る剰余演算装置の構成を示す図。
【図３】従来技術に係るモンゴメリ乗算の繰返し処理を示す図。
【図４】従来技術に係るモンゴメリ乗算の繰返し処理を変形した仮想的な処理を示す図。
【図５】本発明の実施形態に係るモンゴメリ乗算の繰返し処理を示す図。
【図６】従来技術に係るべき乗剰余演算の処理フローチャート。
【図７】本発明の実施形態に係るべき乗剰余演算の処理フローチャート。
【図８】本発明の実施形態に係るモンゴメリ乗算の繰返し処理の変形例を示す図。
【符号の説明】
1010, 1020, , 10u0 … 積和ユニット
1011, 1021, , 10u1 … 積和回路[1]
1012, 1022, , 10u2 … 積和回路[2]
1101 … 補正項計算ユニット[1]
1102 … 補正項計算ユニット[2]
1210, 1220, , 12u0 … RAM（ランダムアクセスメモリ）
1310, 1320, , 13u0 … ROM（リードオンリーメモリ）
201〜20u … 積和回路
210 … 補正項計算ユニット
221〜22u … RAM（ランダムアクセスメモリ）
231〜23u … ROM（リードオンリーメモリ）
【図１】
0003540280.tif 000002
【図２】
0003540280.tif 000003
【図３】
0003540280.tif 000004
【図４】
0003540280.tif 000005
【図５】
0003540280.tif 000006
【図６】
0003540280.tif 000007
【図７】
0003540280.tif 000008
【図８】
0003540280.tif 000009