以下、実施形態を図面を用いて説明する。
図1は、演算回路および演算方法の一実施形態を示している。この実施形態の演算回路ACIRは、例えば、公開鍵暗号を利用した暗号装置や認証装置に搭載される。例えば、公開鍵暗号は、RSA(Rivest Shamir Adleman)暗号、楕円曲線暗号、DSA(Digital Signature Algorithm)等に使用される。
演算回路ACIRは、例えば、nビット(nは正の整数)で表される除数データN(以下、データNあるいは法Nとも称する)を法とし、入力データA、B(以下、データA、Bとも称する)に対するモンゴメリ乗算を実行する。例えば、演算回路ACIRは、データN、A、B、nk0を受け、データYを外部に出力する。以下、各データの値にも、各データと同じ符号を使用する。例えば、値A、B、Nは、データA、B、Nのそれぞれの値である。なお、値Aは、A<Nを満たす整数であり、値Bは、B<Nを満たす整数である。
また、演算回路ACIRの外部に出力されるデータYは、例えば、データA、Bに対するモンゴメリ乗算の結果である。データnk0は、例えば、モンゴメリ乗算のパラメータである。例えば、データnk0は、(N・N’)mod2n≡−1を満たす数N’の下位kビット(kはn以下の正の整数)のデータである。modは、剰余演算子である。
演算回路ACIRは、選択部SEL1、演算部CAL、選択部SEL2および制御部CTLを有している。選択部SEL1は、データBを受け、データBをkビット単位でg個(gはk・(g−1)<n≦k・gを満たす整数)のブロックbに分割する。なお、データBのビット数がk・g未満である場合、例えば、選択部SEL1は、不足する最上位側のビットを0で拡張する。
また、選択部SEL1は、制御信号jを制御部CTLから受ける。そして、選択部SEL1は、制御信号jに基づいて、kビットのブロックbをデータBの最下位ビット側から順に選択し、選択したブロックbjを演算部CALに出力する。なお、ブロックbjは、例えば、データBの最下位ビット側から数えてj番目のブロックbを示している。例えば、データBの最下位ビットを含むブロックbは、0番目のブロックbである。
このように、選択部SEL1は、kビットのブロックbをデータBの最下位ビット側から順に選択する選択部の一例である。以下、ブロックbのビット数kをブロック長kとも称する。例えば、ブロック長kは、CPU(Central Processing Unit)等が有する演算器の入出力のビット幅に設定される。また、ブロックbをデータbとも称する。
演算部CALは、g個目のブロックbに対する演算処理においてビット操作を実行する演算部の一例である。例えば、演算部CALは、データN、A、B、nk0、Yおよび制御信号jを受け、更新したデータYを選択部SEL2に出力する。演算部CALから選択部SELに出力されるデータYは、各ブロックbの演算処理の結果であり、次のブロックbの演算処理に用いられる変数である。以下、データYを、変数Yあるいは結果Yとも称する。
例えば、演算部CALは、入力データA、Bの少なくとも1つ(例えば、データB)を一定サイズ(例えば、kビット)のブロックbに分割して処理するモンゴメリ乗算の演算処理を、ブロックb毎に実行する。例えば、演算部CALは、データAと、選択部SEL1により選択されたブロックbjと、変数Yと、モンゴメリ乗算のパラメータ値nk0と、除数データNとを用いた演算により変数Yを更新する演算処理を、g回繰り返す。
そして、演算部CALは、g個目のブロックbに対する演算処理の結果がデータBを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、g個目のブロックbに対する演算処理では、ビット数hに基づくビット操作を実行する。なお、ビット数hは、除数データNを最下位ビット側からkビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数である。例えば、hは、h=n−k・(g−1)で表される。
ここで、g個目のブロックbに対する演算処理は、データBの最後(0番から数えた場合、(g−1)番目)のブロックbに対する演算処理である。すなわち、g個目のブロックbに対する演算処理は、g回目の演算処理である。例えば、制御信号jがg回目の演算処理を示している場合、演算部CALは、g回目の演算処理の終了時点の変数YがデータBを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、g回目の演算処理中に、ビット数hに基づくビット操作を実行する。
なお、入力データA、Bのいずれも分割しないときのモンゴメリ乗算REDC(A,B,N)は、2のn乗をRとした場合、式(1)で表される。また、モンゴメリ変換パラメータは、R2modNで表される。
REDC(A,B,N)=(A・B・R−1)modN ‥(1)
入力データA、Bの少なくとも1つを一定サイズのブロックに分割して処理するモンゴメリ乗算(以下、ブロック型モンゴメリ乗算とも称する)では、最後のブロックの演算処理中にビット操作が実行されない場合、式(1)と異なる演算結果になるときがある。例えば、入力データA、Bに対するブロック型モンゴメリ乗算REDCBLK(A,B,N)は、式(2)で表される。式(2)のRblkは、例えば、データBがkビット単位でg個のブロックbに分割された場合、2の(k・g)乗を示している。
REDCBLK(A,B,N)=(A・B・Rblk−1)modN ‥(2)
また、ブロック型モンゴメリ乗算REDCBLK(A,B,N)のモンゴメリ変換パラメータは、Rblk2modNで表される。法Nのビット数nがブロック長kの整数倍でない場合(n≠k・g)、ブロック型モンゴメリ乗算REDCBLK(A,B,N)のモンゴメリ変換パラメータは、モンゴメリ乗算REDC(A,B,N)のモンゴメリ変換パラメータと異なる。この場合、モンゴメリ変換パラメータ“Rblk2modN”を算出する際の計算量が、例えば、図6に示すように、値“R2modN”を算出する際の計算量に比べて増加する場合がある。
これに対し、演算部CALは、g回目の演算処理の結果が式(1)により得られる結果と同じ結果になるように、g回目の演算処理中にビット操作を実行する。例えば、演算回路ACIRによるブロック型モンゴメリ乗算をREDCBLK2で表した場合、ブロック型モンゴメリ乗算REDCBLK2(A,B,N)は、式(3)で表される。
REDCBLK2(A,B,N)=(A・B・R−1)modN ‥(3)
したがって、ブロック型モンゴメリ乗算REDCBLK2(A,B,N)のモンゴメリ変換パラメータは、モンゴメリ乗算REDC(A,B,N)のモンゴメリ変換パラメータと同じであり、R2modNで表される。このため、演算回路ACIRでは、法Nのビット数nがブロック長kの整数倍でない場合(n≠k・g)でも、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制できる。
選択部SEL2は、例えば、演算部CALから受けるデータYの出力先を、制御部CTLから受ける制御信号jに基づいて選択する。例えば、選択部SEL2は、制御信号jが(g−1)回目までの演算処理を示している場合、演算部CALから受けるデータYを、次のブロックbに対する演算処理に用いる変数Yとして演算部CALに転送する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL2は、演算部CALから受けるデータYを、データA、Bに対するモンゴメリ乗算の結果Yとして演算回路ACIRの外部に出力する。これにより、g回目の演算処理の終了時点の変数Yは、データA、Bに対するモンゴメリ乗算の結果Yとして、演算回路ACIRの外部に出力される。
制御部CTLは、選択部SEL1、演算部CALおよび選択部SEL2によるループ処理を、制御信号jを用いて制御する。
このように、演算回路ACIRでは、データA、Bに対するモンゴメリ乗算をブロック型モンゴメリ乗算のアルゴリズム(kビットのブロックb毎に処理するアルゴリズム)を用いて実行するため、モンゴメリ乗算の計算効率を向上できる。また、演算回路ACIRでは、kビットのブロックb毎に演算処理を実行できるため、ハードウエアリソースの利用効率を向上できる。例えば、32ビットのCPUがソフトウエアの制御により演算回路ACIRの動作を実現する場合、kは、32に設定される。
また、演算回路ACIRの演算結果は、g回目の演算処理中のビット操作により、データBを分割しないときのモンゴメリ乗算の結果と同じ結果になる。すなわち、演算回路ACIRでは、モンゴメリ乗算の結果(演算回路ACIRの演算結果)から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データBを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。これにより、演算回路ACIRでは、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制できる。
ここで、例えば、演算回路ACIRは、ブロック型モンゴメリ乗算REDCBLK2を2回実行することにより、乗算剰余演算の結果“(A・B)modN”を算出できる。1回目のブロック型モンゴメリ乗算REDCBLK2では、入力データをデータA、Bとする。これにより、(A・B・R−1)modNが得られる。そして、2回目のブロック型モンゴメリ乗算REDCBLK2では、入力データを(A・B・R−1)modNとR2modNとする。
すなわち、上述した式(3)のA、Bに(A・B・R−1)modNとR2modNとをそれぞれ代入する。2回目のブロック型モンゴメリ乗算REDCBLK2の計算過程は、例えば、式(4)で表される。
((A・B・R−1)・R2・R−1)modN=(A・B)modN ‥(4)
このように、演算回路ACIRでは、モンゴメリ変換パラメータ“R2modN”を用いて、ブロック型モンゴメリ乗算REDCBLK2を実行することにより、乗算剰余演算の結果“(A・B)modN”が得られる。
なお、演算回路ACIRの構成は、この例に限定されない。例えば、制御部CTLは、演算部CALや選択部SEL1、SEL2の内部に設けられてもよい。すなわち、演算部CAL等は、g回繰り返される演算処理の何回目の演算処理を実行しているかを識別する機能を有してもよい。また、選択部SEL2は、省かれてもよい。この場合、演算回路ACIRは、例えば、g回目の演算処理の結果であるか否かを示す信号を、モンゴメリ乗算の結果Yの出力先に転送してもよい。また、データA、Bの両方が一定サイズのブロックに分割されてもよい。
図2は、図1に示した演算部CALの一例を示している。演算部CALは、積和演算回路MAC1、MAC2、乗算回路MULT、減算回路SUB、ビットマスク部MSK1、MSK2、右シフト部RSHTk、RSHTh、選択部SEL3、SEL4、SEL5、SEL6を有している。
積和演算回路MAC1は、第1積和演算部の一例である。積和演算回路MAC1は、入力データに対して積和演算を実行する。例えば、積和演算回路MAC1は、端子i1、i2で受けた値の積を、端子i3で受けた値に加算する。そして、積和演算回路MAC1は、積和演算の結果を出力する。例えば、積和演算回路MAC1は、データA、bj、Yを端子i1、i2、i3でそれぞれ受け、積和演算の結果を乗算回路MULTおよび積和演算回路MAC2に出力する。例えば、積和演算回路MAC1は、データAと選択部SEL1により選択されたブロックbjとの積を変数Yに加算する。これにより、更新された変数Yが乗算回路MULTおよび積和演算回路MAC2に転送される。変数Yは、例えば、k・(g+1)ビットのデータである。
ビットマスク部MSK1は、kビットのデータnk0を受け、データnk0の下位hビットのみを有効にするマスク処理を実行する。そして、ビットマスク部MSK1は、下位hビットのみを有効にしたデータnk0を選択部SEL3に出力する。例えば、ビットマスク部MSK1は、上位(k−h)ビットが全て0で下位hビットが全て1であるマスクデータとデータnk0との論理積結果を選択部SEL3に出力する。すなわち、ビットマスク部MSK1は、上位(k−h)ビットを全て0にしたデータnk0を選択部SEL3に出力する。
選択部SEL3は、kビットのデータnk0(マスク処理がされていないデータnk0)と、下位hビットのみを有効にしたデータnk0と、制御信号jとを受ける。そして、選択部SEL3は、kビットのデータnk0と、下位hビットのみを有効にしたデータnk0とのいずれかを、制御信号jに基づいて選択し、選択したデータnk0を乗算回路MULTに出力する。例えば、選択部SEL3は、制御信号jが(g−1)回目までの演算処理を示している場合、kビットのデータnk0を、乗算回路MULTに出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL3は、下位hビットのみを有効にしたデータnk0を、乗算回路MULTに出力する。
乗算回路MULTは、入力データに対して乗算を実行する。そして、乗算回路MULTは、乗算結果の下位kビットを出力する。例えば、(g−1)回目までの演算処理では、乗算回路MULTは、kビットのデータnk0と積和演算回路MAC1により更新された変数Yとの積の下位kビットを、変数mとしてビットマスク部MSK2および選択部SEL4に出力する。以下、変数mをデータmとも称する。
また、例えば、g回目の演算処理では、乗算回路MULTは、下位hビットのみを有効にしたデータnk0と積和演算回路MAC1により更新された変数Yとの積の下位kビットを、変数mとしてビットマスク部MSK2および選択部SEL4に出力する。
すなわち、乗算回路MULTは、モンゴメリ乗算のパラメータ値nk0と積和演算回路MAC1により更新された変数Yとの積に基づいて変数mを算出する乗算部の一例である。例えば、乗算回路MULTは、(g−1)回目までの演算処理では、パラメータ値nk0と変数Yとの積の下位kビットに対応する値を変数mとして算出する。そして、g回目の演算処理では、乗算回路MULTは、パラメータ値nk0と変数Yとの積の下位hビットに対応する値を変数mとして算出する。
ビットマスク部MSK2は、kビットの変数mを受け、変数mの下位hビットのみを有効にするマスク処理を実行する。そして、ビットマスク部MSK2は、下位hビットのみを有効にした変数mを選択部SEL4に出力する。例えば、ビットマスク部MSK2は、上位(k−h)ビットを全て0にした変数mを選択部SEL4に出力する。
選択部SEL4は、kビットの変数m(マスク処理がされていない変数m)と、下位hビットのみを有効にした変数mと、制御信号jとを受ける。そして、選択部SEL4は、kビットの変数mと、下位hビットのみを有効にした変数mとのいずれかを、制御信号jに基づいて選択し、選択した変数mを積和演算回路MAC2に出力する。例えば、選択部SEL4は、制御信号jが(g−1)回目までの演算処理を示している場合、kビットの変数mを、積和演算回路MAC2に出力する。
また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL4は、下位hビットのみを有効にした変数mを、積和演算回路MAC2に出力する。すなわち、積和演算回路MAC2は、(g−1)回目までの演算処理では、kビットの変数mを受け、g回目の演算処理では、下位hビットのみを有効にした変数mを受ける。
積和演算回路MAC2は、第2積和演算部の一例である。積和演算回路MAC2の動作は、積和演算回路MAC1と同様である。例えば、積和演算回路MAC2は、端子i1、i2で受けた値の積を、端子i3で受けた値に加算する。そして、積和演算回路MAC2は、積和演算の結果を出力する。例えば、積和演算回路MAC2は、データN、mと積和演算回路MAC1により更新されたデータYとを端子i1、i2、i3でそれぞれ受け、積和演算の結果を右シフト部RSHTk、RSHThに出力する。例えば、積和演算回路MAC2は、変数mと除数データNとの積を積和演算回路MAC1により更新された変数Yに加算する。これにより、更新された変数Yが右シフト部RSHTk、RSHThに転送される。
右シフト部RSHTk、RSHThは、例えば、シフト量がそれぞれkビット、hビットの右シフト演算器である。例えば、右シフト部RSHTkは、積和演算回路MAC2から受けたデータYの下位kビットを除去し、データYの上位ビットを選択部SEL5に出力する。すなわち、右シフト部RSHTkは、積和演算回路MAC2により更新されたデータYを最下位ビット側にkビットシフトし、シフトしたデータYを選択部SEL5に出力する。
また、例えば、右シフト部RSHThは、積和演算回路MAC2から受けたデータYの下位hビットを除去し、データYの上位ビットを選択部SEL5に出力する。すなわち、右シフト部RSHThは、積和演算回路MAC2により更新されたデータYを最下位ビット側にhビットシフトし、シフトしたデータYを選択部SEL5に出力する。
選択部SEL5は、右シフト部RSHTkにより更新されたデータYと、右シフト部RSHThにより更新されたデータYと、制御信号jとを受ける。そして、選択部SEL5は、右シフト部RSHTkにより更新されたデータYと右シフト部RSHThにより更新されたデータYとのいずれかを制御信号jに基づいて選択し、選択したデータYを減算回路SUBおよび選択部SEL6に出力する。
例えば、選択部SEL5は、制御信号jが(g−1)回目までの演算処理を示している場合、右シフト部RSHTkにより更新されたデータYを、減算回路SUBおよび選択部SEL6に出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL5は、右シフト部RSHThにより更新されたデータYを、減算回路SUBおよび選択部SEL6に出力する。すなわち、減算回路SUBおよび選択部SEL6は、(g−1)回目までの演算処理では、積和演算回路MAC2により更新されたデータYを最下位ビット側にkビットシフトしたデータYを受ける。
そして、g回目の演算処理では、減算回路SUBおよび選択部SEL6は、積和演算回路MAC2により更新されたデータYを最下位ビット側にhビットシフトしたデータYを受ける。すなわち、右シフト部RSHTk、RSHThおよび選択部SEL5は、積和演算回路MAC2により更新された変数Yをビットシフトするシフト部の一例である。例えば、シフト部により更新されたデータYは、選択部SEL5で選択されたデータYに対応している。
減算回路SUBおよび選択部SEL6は、各演算処理の結果Yを法Nより小さくするための調整部の一例である。減算回路SUBは、入力データに対して減算を実行し、減算結果およびボロー発生の有無を出力する。例えば、減算回路SUBは、データNと、選択部SEL5で選択されたデータYとを受け、データYからデータNを減算した結果を選択部SEL6に出力する。また、減算回路SUBは、データYからデータNを減算したときに、ボローが発生したか否かを示す制御信号borを選択部SEL6に出力する。
選択部SEL6は、減算回路SUBの減算結果と、選択部SEL5で選択されたデータYと、制御信号borとを受ける。そして、選択部SEL6は、減算回路SUBの減算結果と選択部SEL5で選択されたデータYとのいずれかを制御信号borに基づいて選択し、選択したデータをj回目の演算処理の結果Yとして図1に示した選択部SEL2に出力する。
例えば、選択部SEL6は、ボローが発生していないことを示す制御信号borを受けた場合、減算回路SUBの減算結果を、j回目の演算処理の結果Yとして選択部SEL2に出力する。すなわち、選択部SEL6は、選択部SEL5で選択されたデータYが除数データN以上の場合、選択部SEL5で選択されたデータYから除数データNを減算した値を、j回目の演算処理の結果Yとして選択部SEL2に出力する。
また、例えば、選択部SEL6は、ボローが発生したことを示す制御信号borを受けた場合、選択部SEL5で選択されたデータYを、j回目の演算処理の結果Yとして選択部SEL2に出力する。すなわち、選択部SEL6は、選択部SEL5で選択されたデータYが除数データNより小さい場合、選択部SEL5で選択されたデータYを、j回目の演算処理の結果Yとして選択部SEL2に出力する。
このように、演算部CALは、ビットマスク部MSK1、MSK2および右シフト部RSHThにより、ビット数hに基づくビット操作を実行する。これにより、演算回路ACIRの演算結果は、上述した式(3)に示したように、入力データA、Bを分割しないときのモンゴメリ乗算の結果と同じ値になる。
なお、演算部CALの構成は、この例に限定されない。例えば、演算部CALは、シフト量をkビットとhビットに切り替え可能な右シフト部(シフト量可変右シフト演算器)を、右シフト部RSHTk、RSHThの代わりに有してもよい。また、例えば、演算部CALは、図7に示すように、(k−h)ビットの左シフトとkビットの右シフトとを組み合わせて、hビットの右シフトを実現してもよい。
図3は、分割単位のビット数kとビット操作の基になるビット数hとの関係の一例を示している。図3では、右側が最下位ビット側であり、左側が最上位ビット側である。ビット操作の基になるビット数hは、nビットの法Nを最下位ビット側からkビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数である。したがって、例えば、hは、分割されたグループの数がg個の場合、h=n−k・(g−1)で表される。また、Rは、2のn乗で表される。したがって、(n+1)ビットのRの下位nビットは、0である。なお、2のh乗をrhとした場合、rhは、Rの上位(h+1)ビットに対応する。
モンゴメリ乗算では、最下位ビット側から計算するため、データBの最上位ビット側のブロックbは、最後に計算されるブロックbである。例えば、演算回路ACIRによるブロック型モンゴメリ乗算REDCBLK2では、最後のブロックbに対する演算処理中にビット数hに基づくビット操作を実行することにより、最後のブロックbのみ、ブロック長をhビットとして計算する。
なお、ビット操作を実行しないブロック型モンゴメリ乗算REDCBLKで用いられるRblkは、2の(k・g)乗で表される。したがって、(k・g+1)ビットのRblkの下位(k・g)ビットは、0である。例えば、法Nのビット数nがブロック長kの整数倍である場合(n=k・g)、h=kであり、R=Rblkである。この場合、モンゴメリ乗算REDC、ブロック型モンゴメリ乗算REDCBLK2、ブロック型モンゴメリ乗算REDCBLKの結果は、互いに同じである。したがって、モンゴメリ変換パラメータは、モンゴメリ乗算REDC、ブロック型モンゴメリ乗算REDCBLK2、ブロック型モンゴメリ乗算REDCBLKで互いに同じである。
一方、法Nのビット数nがブロック長kの整数倍でない場合(n≠k・g)、Rblkは、Rと異なる(Rblk≠R)。このため、ブロック型モンゴメリ乗算REDCBLKの結果は、モンゴメリ乗算REDCの結果と異なる。この場合、1回目のブロック型モンゴメリ乗算REDCBLKの結果とRblk2modNとを入力値とするブロック型モンゴメリ乗算REDCBLKを実行することにより、乗算剰余演算の結果が得られる。
すなわち、最後のブロックbに対する演算処理中にビット数hに基づくビット操作が実行されないブロック型モンゴメリ乗算REDCBLKでは、モンゴメリ変換パラメータは、入力データを分割しないモンゴメリ乗算のモンゴメリ変換パラメータと異なる。なお、演算回路ACIRによるブロック型モンゴメリ乗算REDCBLK2のモンゴメリ変換パラメータは、法Nのビット数nがブロック長kの整数倍でない場合(n≠k・g)でも、入力データを分割しないモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
図4は、図1に示した演算回路ACIRの動作の一例を示している。図4の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図4の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図4の動作を実行してもよい。なお、図4の動作では、ステップS100が実行される前に、データBは、kビットのブロックbに分割されている。ブロックbの数は、例えば、g個である。
ステップS100では、演算回路ACIRは、変数Y、jを0に設定する。
ステップS110では、演算回路ACIRは、データBのj番目のブロックbjを選択し、Y=A・bj+Yの演算を実行する。例えば、積和演算回路MAC1は、端子i1、i2で受けた値A、bjの積を、端子i3で受けた値Yに加算する。これにより、変数Yが更新される。
ステップS120では、演算回路ACIRは、ステップS110で更新した変数Y、2のk乗で表されるrkを用いて、kビットの変数mを算出する。例えば、演算回路ACIRは、m=((Ymod(rk))・nk0)mod(rk)の演算を実行する。ステップS120の乗算は、例えば、乗算回路MULTにより実行される。なお、rkが2のk乗であるため、Xmod(rk)の演算は、Xの下位kビットを取り出す処理に対応している。
ステップS130では、演算回路ACIRは、法N、ステップS120で算出した変数m、ステップS110で更新した変数Yを用いて、変数Yを更新する。例えば、演算回路ACIRは、Y=Y+N・mの演算を実行する。例えば、積和演算回路MAC2は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算する。これにより、変数Yが更新される。
ステップS140では、演算回路ACIRは、ステップS130で更新した変数Yをrkで除算する(Y=Y/rk)。なお、rkが2のk乗であるため、Y=Y/rkの除算は、例えば、kビットの右シフトにより実行される。例えば、演算回路ACIRは、ステップS130で更新した変数Yを最下位ビット側にkビットシフトする。これにより、変数Yが更新される。Y=Y/rkの除算は、例えば、右シフト部RSHTkにより実行される。
ステップS150では、演算回路ACIRは、ステップS140で更新した変数Yが法N以上か否かを判定する。例えば、演算回路ACIRは、変数Yから法Nを減算した際にボローが発生しない場合、変数Yが法N以上であると判定する。また、演算回路ACIRは、変数Yから法Nを減算した際にボローが発生する場合、変数Yが法Nより小さいと判定する。変数Yが法N以上であるとき(ステップS150のYes)、演算回路ACIRの動作は、ステップS160に移る。
一方、変数Yが法Nより小さいとき(ステップS150のNo)、演算回路ACIRの動作は、ステップS170に移る。すなわち、変数Yが法Nより小さい場合、ステップS140で更新した変数Yが、ブロックbjの演算処理の結果になる。
ステップS160では、演算回路ACIRは、ステップS140で更新した変数Yから法Nを減算することにより、変数Yを更新する(Y=Y−N)。すなわち、ステップS140で更新した変数Yが法N以上の場合、ステップS160で更新した変数Y(ステップS140で更新した変数Yから法Nを減算した値)が、ブロックbjの演算処理の結果になる。ステップS150、S160の処理は、例えば、減算回路SUBおよび選択部SEL6により実行される。
ステップS170では、演算回路ACIRは、変数jをインクリメントする(j=j+1)。
ステップS180では、演算回路ACIRは、変数jが(g−1)より小さいか否かを判定する。すなわち、演算回路ACIRは、次の処理対象のブロックbが(g−1)番目のブロックbg−1か否かを判定する。なお、データBの最下位ビットを含むブロックbを0番目のブロックb0としているため、(g−1)番目のブロックbg−1は、g個目のブロックbである。すなわち、ブロックbg−1は、データBの最後のブロックbである。
変数jが(g−1)より小さいとき(ステップS180のYes)、演算回路ACIRの動作は、ステップS110に戻る。すなわち、ステップS110−S170の処理は、0番目から(g−2)番目までのブロックbに対して実行される。一方、変数jが(g−1)以上のとき(ステップS180のNo)、演算回路ACIRの動作は、ステップS190に移る。すなわち、変数jが(g−1)のとき、演算回路ACIRの動作は、ステップS190に移る。
ステップS190では、演算回路ACIRは、データBの最後((g−1)番目)のブロックbg−1を選択し、Y=A・bg−1+Yの演算を実行する。例えば、積和演算回路MAC1は、端子i1、i2で受けた値A、bg−1の積を、端子i3で受けた値Yに加算する。これにより、変数Yが更新される。なお、値A、bg−1の積が加算される変数Yは、(g−2)番目のブロックbg−2の演算処理(ステップS110−S160)の結果である。
ステップS200では、演算回路ACIRは、ステップS190で更新した変数Y、2のh乗で表されるrhを用いて、hビットの変数mを算出する。例えば、演算回路ACIRは、m=((Ymod(rh))・(nk0mod(rh)))mod(rh)の演算を実行する。なお、rhが2のh乗であるため、Xmod(rh)の演算は、Xの下位hビットを取り出す処理に対応している。すなわち、ステップS200では、ビット数hに基づくビット操作が実行される。ステップS200の処理は、例えば、ビットマスク部MSK1、MSK2および乗算回路MULTにより実行される。
ステップS210では、演算回路ACIRは、法N、ステップS200で算出した変数m、ステップS190で更新した変数Yを用いて、変数Yを更新する。例えば、演算回路ACIRは、Y=Y+N・mの演算を実行する。例えば、積和演算回路MAC2は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算する。これにより、変数Yが更新される。
ステップS220では、演算回路ACIRは、ステップS210で更新した変数Yをrhで除算する(Y=Y/rh)。なお、rhが2のh乗であるため、Y=Y/rhの除算は、例えば、hビットの右シフトにより実行される。例えば、演算回路ACIRは、ステップS210で更新した変数Yを最下位ビット側にhビットシフトする。これにより、変数Yが更新される。Y=Y/rhの除算は、例えば、右シフト部RSHThにより実行される。このように、ステップS220では、ビット数hに基づくビット操作が実行される。
ステップS230では、演算回路ACIRは、ステップS220で更新した変数Yが法N以上か否かを判定する。判定方法は、例えば、ステップS150と同様である。変数Yが法N以上であるとき(ステップS230のYes)、演算回路ACIRの動作は、ステップS240に移る。
一方、変数Yが法Nより小さいとき(ステップS230のNo)、演算回路ACIRの動作は、ステップS250に移る。すなわち、変数Yが法Nより小さい場合、ステップS220で更新した変数Yが、ブロック型モンゴメリ乗算REDCBLK2の結果(演算回路ACIRの演算結果)になる。
ステップS240では、演算回路ACIRは、ステップS220で更新した変数Yから法Nを減算することにより、変数Yを更新する(Y=Y−N)。すなわち、ステップS220で更新した変数Yが法N以上の場合、ステップS240で更新した変数Y(ステップS220で更新した変数Yから法Nを減算した値)が、ブロック型モンゴメリ乗算REDCBLK2の結果(演算回路ACIRの演算結果)になる。ステップS230、S240の処理は、例えば、減算回路SUBおよび選択部SEL6により実行される。
ステップS250では、例えば、演算回路ACIRは、ブロック型モンゴメリ乗算REDCBLK2の結果Yを演算回路ACIRの外部に出力する。すなわち、演算回路ACIRは、例えば、ステップS220で更新した変数Yが法Nより小さい場合、ステップS220で更新した変数Yを演算回路ACIRの外部に出力する。また、例えば、演算回路ACIRは、ステップS220で更新した変数Yが法N以上の場合、ステップS240で更新した変数Yを演算回路ACIRの外部に出力する。
このように、ステップS190−S240の処理は、ビット数hに基づくビット操作を除いて、ステップS110−S160の処理にそれぞれ対応している。すなわち、ステップS110−S160の一連の処理やステップS190−S240の一連の処理(ビット数hに基づくビット操作を除く)は、ブロック型モンゴメリ乗算における各ブロックbに対する演算処理に対応している。なお、演算回路ACIRの動作は、この例に限定されない。
図5は、図1に示した演算回路ACIRの演算結果が(A・B・R−1)modNであることの証明の一例を示している。図5では、既知の事実1および既知の事実2を用いて、演算回路ACIRの演算結果が入力データA、Bを分割しないときのモンゴメリ乗算の結果“(A・B・R−1)modN”と同じになることを証明する。したがって、図5では、“REDCBLK2(A,B,N)=(A・B・R−1)modN”が成立すること(図1で説明した式(3)が成立すること)を命題とする。先ず、既知の事実1および既知の事実2を説明する。
既知の事実1では、以下の適用条件を満たすとき、T+N・mは、rsで割り切れる。さらに、0≦(T+N・m)/rs<2・Nが成立する。既知の事実1の適用条件では、Nはnビットの数である。rsは、rs=2sを満たす数である。Tは、T<N・rsを満たす(n+s)ビットの数である。ns0は、N・N’≡−1mod2nを満たすN’の下位sビットである。mは、m≡(T・ns0)mod(rs)を満たすsビットの数である。
既知の事実2では、ブロック型モンゴメリ乗算REDCBLKのアルゴリズムのi回目のループが終了した時点で、式(5)および式(6)が成立する。式中の‖は、連接を示している。
Y≡(A・(bi−1‖bi−2‖…‖b1‖b0)・rk−i)modN ‥(5)
0≦Y<N ‥(6)
次に、命題を証明する。既知の事実2より、ブロック型モンゴメリ乗算REDCBLK2のアルゴリズムの(g−1)回目のループが終了した時点(例えば、図4のステップS180のNo)で、式(7)および式(8)が成立する。
Y≡(A・(bg−2‖bg−3‖…‖b1‖b0)・rk−(g−1))modN ‥(7)
0≦Y<N ‥(8)
ブロック型モンゴメリ乗算REDCBLK2のg回目の処理(例えば、図4のステップS190−S250)は、既知の事実1のs、rsを、s=h、rs=2h=rhとし、Tを式(9)とした場合に該当する。
A<N、bg−1<rhおよび式(10)が成立するため、式(11)が成立する。
T<N・bg−1+N=N・(bg−1+1)≦N・rh ‥(11)
既知の事実1の適用条件が成立するため、式(12)および式(13)が成立する。
(T+N・m)mod(rh)=0 ‥(12)
0≦(T+N・m)/rh<2・N ‥(13)
このため、g回目の処理が終了した時点(例えば、図4のS250の前)で、0≦Y<Nが成立し、式(14)が成立する。
すなわち、REDCBLK2(A,B,N)=(A・B・R−1)modNが成立する。
図6は、法Nが257でブロック長kが8ビットの場合の(2・R)modNの計算過程の一例を示している。図6の“TMP<<1”は、TMPを1ビット左にシフトすることを示している。モンゴメリ変換パラメータ“R2modN”は、例えば、(2・R)modNを基にモンゴメリ乗算を繰り返すことにより、算出される。
例えば、(2・R)modNからR2modNを算出する方法では、図1で説明した式(3)のA、Bに(2・R)modNを代入する。これにより、(22・R)modNが算出される。そして、(22・R)modNを式(3)のA、Bに代入する。これにより、(24・R)modNが算出される。次に、(24・R)modNを式(3)のA、Bに代入する。これにより、(28・R)modNが算出される。法Nが257の場合、nは9であり、Rは、29である。したがって、(28・R)modNと(2・R)modNとを式(3)のA、Bに代入する。これにより、(29・R)modNが算出される。すなわち、R2modNが算出される。
なお、ビット操作を実行しないブロック型モンゴメリ乗算REDCBLKのモンゴメリ変換パラメータ“Rblk2modN”は、例えば、(2・Rblk)modNを基にモンゴメリ乗算を繰り返すことにより、算出される。図6では、(2・Rblk)modNの計算過程も比較例として示している。
(2・R)modNは、多倍長2倍算と多倍長減算とを用いて算出される。なお、(2・Rblk)modNを算出する場合、ブロック長kとブロック数gとの積と、法Nのビット数nとの差に応じた回数だけ、多倍長2倍算と多倍長減算を用いた処理が繰り返される。図6の例では、k=8、g=2、n=9であるため、(2・Rblk)modNの算出では、多倍長2倍算と多倍長減算を用いた処理が8(=k・g−n+1)回繰り返される。
先ず、ループに入る前に、TMP=2n−Nの演算によりTMPが算出される。その後、次のループで使用するTMPを更新する処理を繰り返す。各ループでは、先ず、TMPを1ビット左にシフトする(TMP=(TMP<<1)。これにより、元の値を2倍したTMPが算出される。そして、TMP2=TMP−Nの演算により、TMP2が算出される。TMP2が0以上の場合、TMP2が次のループで使用されるTMPとして算出される。TMP2が0より小さい場合、1ビット左シフトにより更新したTMPが次のループで使用される。
なお、(2・R)modNの算出では、(2・R)modNは、1回目のループで算出される。例えば、TMP=2n−Nの演算を実行する(512−267=255)。これにより、TMP(=255)が算出される。そして、1回目のループでは、先ず、1回目のループに入る前に算出されたTMP(=255)を2倍する(TMP=510)。次に、TMP2=TMP−Nの演算を実行する(510−257=253)。これにより、TMP2(=253)が算出される。TMP2が0以上であるため、TMP2(=253)が1回目のループの結果として算出される。法Nが257の場合、(2・R)modNは、(2・29)mod257であり、1回目のループの結果(=253)と一致する。
これに対し、比較例の(2・Rblk)modNは、ループ前の多倍長減算と8回のループとにより、算出される。1回目のループまでは、(2・R)modNの算出と同様である。例えば、1回目のループにより、TMPは255から253に更新される。2回目のループにより、TMPは249に更新され、3回目のループにより、TMPは241に更新される。4回目のループにより、TMPは225に更新され、5回目のループにより、TMPは193に更新される。6回目のループにより、TMPは129に更新され、7回目のループにより、TMPは1に更新される。8回目のループにより、TMPは2に更新される。なお、8回目のループでは、TMP2(=−255)が0より小さいため、7回目のループにより更新されたTMP(=1)を2倍した値が8回目のループの結果となる。
ここで、Rblkは、28・2である。したがって、(2・Rblk)modNは、(2・216)mod257であり、8回目のループの結果(=2)と一致する。このように、(2・Rblk)modNの算出では、(2・R)modNを算出する際の計算量より、7回のループ分の計算量だけ増加する。すなわち、この実施形態では、例えば、(2・R)modNを算出する際の計算量を、(2・Rblk)modNを算出する際の計算量に比べて低減できる。
図7は、図1に示した演算部CALの別の例を示している。図7の演算部CALでは、図2に示した右シフト部RSHThおよび選択部SEL5が図2の演算部CALから省かれ、左シフト部LSHT1および選択部SEL5aが図2の演算部CALに追加されている。図7の演算部CALのその他の構成は、図2の演算部CALと同様である。図2で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
演算部CALは、積和演算回路MAC1、MAC2、乗算回路MULT、減算回路SUB、ビットマスク部MSK1、MSK2、右シフト部RSHTk、左シフト部LSHT1、選択部SEL3、SEL4、SEL5a、SEL6を有している。左シフト部LSHT1、選択部SEL5aおよび右シフト部RSHTkは、積和演算回路MAC2により更新された変数Yをビットシフトするシフト部の一例である。
左シフト部LSHT1は、例えば、シフト量が(k−h)ビットの左シフト演算器である。例えば、左シフト部LSHT1は、積和演算回路MAC2により更新されたデータYを受ける。そして、左シフト部LSHT1は、積和演算回路MAC2から受けたデータYを最上位ビット側に(k−h)ビットシフトし、シフトしたデータYを選択部SEL5aに出力する。
選択部SEL5aは、積和演算回路MAC2により更新されたデータYと、左シフト部LSHT1により更新されたデータYと、制御信号jとを受ける。そして、選択部SEL5は、積和演算回路MAC2により更新されたデータYと左シフト部LSHT1により更新されたデータYとのいずれかを制御信号jに基づいて選択し、選択したデータYを右シフト部RSHTkに出力する。
例えば、選択部SEL5aは、制御信号jが(g−1)回目までの演算処理を示している場合、積和演算回路MAC2により更新されたデータYを、右シフト部RSHTkに出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL5aは、左シフト部LSHT1により更新されたデータYを、右シフト部RSHTkに出力する。すなわち、右シフト部RSHTkは、(g−1)回目までの演算処理では、積和演算回路MAC2により更新されたデータYを受ける。そして、g回目の演算処理では、右シフト部RSHTkは、積和演算回路MAC2により更新されたデータYを最上位ビット側に(k−h)ビットシフトしたデータYを受ける。
右シフト部RSHTkは、選択部SEL5aから受けたデータYを最下位ビット側にkビットシフトし、シフトしたデータYを減算回路SUBおよび選択部SEL6に出力する。例えば、g回目の演算処理では、右シフト部RSHTkは、積和演算回路MAC2により更新されたデータYを最上位ビット側に(k−h)ビットシフトしたデータYを受ける。
このため、g回目の演算処理では、右シフト部RSHTkにより更新されたデータYは、積和演算回路MAC2により更新されたデータYを最下位ビット側にhビットシフトしたデータYに対応している。例えば、図4のステップS220の処理(Y=Y/rhの除算)は、左シフト部LSHT1および右シフト部RSHTkにより実行される。
図8は、図1に示した演算部CALの別の例を示している。図8の演算部CALでは、図2に示した積和演算回路MAC2が図2の演算部CALから省かれ、選択部SELa、SELb、SELcが図2の演算部CALに追加されている。図8の演算部CALのその他の構成は、図2の演算部CALと同様である。図2で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
演算部CALは、積和演算回路MAC1、乗算回路MULT、減算回路SUB、ビットマスク部MSK1、MSK2、右シフト部RSHTk、RSHTh、選択部SEL3、SEL4、SEL5、SEL6、SELa、SELb、SELcを有している。
選択部SELaは、データA、Nを受け、データA、Nのいずれかを積和演算回路MAC1の端子i1に出力する。選択部SELbは、データbj、mを受け、データbj、mのいずれかを積和演算回路MAC1の端子i2に出力する。選択部SELcは、図1に示した選択部SEL2から出力されるデータYと、積和演算回路MAC1により更新されたデータYとを受ける。そして、選択部SELcは、選択部SEL2から受けるデータYと積和演算回路MAC1から受けるデータYとのいずれかを積和演算回路MAC1の端子i3に出力する。
例えば、選択部SELa、SELb、SELcは、各ブロックbの演算処理における1回目の積和演算(図4のステップS110、S190)が実行されるとき、データAとブロックbjと選択部SEL2から受けたデータYとを、積和演算回路MAC1に出力する。また、選択部SELa、SELb、SELcは、各ブロックbの演算処理における2回目の積和演算(図4のステップS130、S210)が実行されるとき、データNとデータmと積和演算回路MAC1から受けたデータYとを、積和演算回路MAC1に出力する。
すなわち、図8の演算部CALでは、図2に示した積和演算回路MAC1、MAC2の動作を、1つの積和演算回路MAC1で実現している。例えば、各ブロックbの演算処理における1回目の積和演算(図4のステップS110、S190)が実行されるときには、積和演算回路MAC1の動作は、図2の積和演算回路MAC1と同様である。
例えば、各ブロックbの演算処理における1回目の積和演算では、積和演算回路MAC1は、端子i1、i2で受けた値A、bjの積を、端子i3で受けた値Yに加算し、積和演算の結果を乗算回路MULTおよび選択部SELcに出力する。そして、乗算回路MULTは、例えば、各ブロックbの演算処理における1回目の積和演算の結果を用いて算出した変数mを、ビットマスク部MSK2および選択部SEL4に出力する。選択部SEL4で選択された変数mは、選択部SELbに転送される。
また、例えば、各ブロックbの演算処理における2回目の積和演算(図4のステップS130、S210)が実行されるときには、積和演算回路MAC1の動作は、図2の積和演算回路MAC2と同様である。例えば、各ブロックbの演算処理における2回目の積和演算では、積和演算回路MAC1は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算し、積和演算の結果を右シフト部RSHTk、RSHThに出力する。このように、積和演算回路MAC1の演算結果は、例えば、乗算回路MULT、選択部SELc、右シフト部RSHTk、RSHThに出力される。
右シフト部RSHTkは、例えば、各ブロックbの演算処理における2回目の積和演算の結果Yを、最下位ビット側にkビットシフトする。また、右シフト部RSHThは、各ブロックbの演算処理における2回目の積和演算の結果Yを、最下位ビット側にhビットシフトする。
このように、図8の演算部CALでは、図1に示した積和演算回路MAC1、MAC2の動作を1つの積和演算回路MAC1で実現しているため、2つの積和演算回路MAC(MAC1、MAC2)を有する演算部CALに比べて、回路規模を低減できる。
なお、演算部CALの構成は、この例に限定されない。例えば、演算部CALは、シフト量をkビットとhビットに切り替え可能な右シフト部(シフト量可変右シフト演算器)を、右シフト部RSHTk、RSHThの代わりに有してもよい。また、例えば、演算部CALは、図7に示したように、(k−h)ビットの左シフトとkビットの右シフトとを組み合わせて、hビットの右シフトを実現してもよい。
以上、図1から図8に示した実施形態の演算回路ACIRおよび演算方法は、データA、Bに対するモンゴメリ乗算を、ブロック型モンゴメリ乗算のアルゴリズム(kビットのブロックb毎に処理するアルゴリズム)を用いて実行する。このように、この実施形態では、kビットのブロックb毎に演算処理を実行するため、モンゴメリ乗算の計算効率を向上できる。また、この実施形態では、kビットのブロックb毎に演算処理を実行できるため、ハードウエアリソースの利用効率を向上できる。
また、この実施形態では、最後(g個目)のブロックbに対する演算処理中に、ビット数hに基づくビット操作を実行する。これにより、最後のブロックbに対する演算処理の結果は、データBを分割しないときのモンゴメリ乗算の結果と同じになる。
例えば、最後のブロックbに対する演算処理では、ビットマスク部MSK1、MSK2は、変数mの下位hビットのみを有効にするマスク処理を実行し、右シフト部RSHThは、データYを最下位ビット側にhビットシフトする。なお、図7に示した演算部CALでは、データYを最下位ビット側にhビットシフトする処理は、例えば、左シフト部LSHT1および右シフト部RSHTkにより実現される。
このように、この実施形態のブロック型モンゴメリ乗算の結果は、データBを分割しないときのモンゴメリ乗算の結果と同じ結果になる。このため、この実施形態では、モンゴメリ乗算の結果(演算回路ACIRの演算結果)から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データBを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
したがって、この実施形態では、ビット数hに基づくビット操作を実行しないブロック型モンゴメリ乗算に比べて、モンゴメリ変換パラメータを算出する際の計算量を低減できる。すなわち、この実施形態では、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上できる。
図9は、演算回路および演算方法の別の実施形態を示している。この実施形態の演算回路ACIR2は、図1に示した演算部CALの代わりに、演算部CAL2を有している。図9に示した演算回路ACIR2のその他の構成は、図1に示した演算回路ACIRと同様である。図1から図8で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
演算回路ACIR2は、例えば、図1で説明した式(3)で表されるブロック型モンゴメリ乗算REDCBLK2(A,B,N)を実行する。例えば、演算回路ACIR2は、選択部SEL1、演算部CAL2、選択部SEL2および制御部CTLを有している。選択部SEL1、SEL2および制御部CTLは、図1に示した選択部SEL1、SEL2および制御部CTLと同様である。演算部CAL2は、最後(g個目)のブロックbに対する演算処理中に実行するビット操作(ビット数hに基づくビット操作)の方法を除いて、図1に示した演算部CALと同様である。
なお、演算回路ACIR2の構成は、この例に限定されない。例えば、制御部CTLは、演算部CAL2や選択部SEL1、SEL2の内部に設けられてもよい。また、選択部SEL2は、省かれてもよい。あるいは、データA、Bの両方が一定サイズのブロックに分割されてもよい。
図10は、図9に示した演算部CAL2の一例を示している。演算部CAL2では、図2に示したビットマスク部MSK1、MSK2、右シフト部RSHh、選択部SEL3、SEL4、SEL5が演算部CALから省かれ、左シフト部LSHT2、LSHT3、選択部SEL7、SEL8が演算部CALに追加されている。演算部CAL2のその他の構成は、演算部CALと同様である。
例えば、演算部CAL2は、積和演算回路MAC1、MAC2、乗算回路MULT、減算回路SUB、右シフト部RSHTk、左シフト部LSHT2、LSHT3、選択部SEL6、SEL7、SEL8を有している。
左シフト部LSHT2は、例えば、ブロックbjを受け、受けたブロックbjを最上位ビット側に(k−h)ビットシフトする。そして、左シフト部LSHT2は、最上位ビット側に(k−h)ビットシフトしたブロックbjを選択部SEL7に出力する。
選択部SEL7は、ビットシフトされていないブロックbj(左シフト部LSHT2によるビットシフトが実行されていないブロックbj)と、最上位ビット側に(k−h)ビットシフトされたブロックbjと、制御信号jとを受ける。そして、選択部SEL7は、ビットシフトされていないブロックbjと、最上位ビット側に(k−h)ビットシフトされたブロックbjとのいずれかを、制御信号jに基づいて選択し、選択したブロックbjを積和演算回路MAC1の端子i2に出力する。
例えば、選択部SEL7は、制御信号jが(g−1)回目までの演算処理を示している場合、左シフト部LSHT2によるビットシフトが実行されていないブロックbjを、積和演算回路MAC1の端子i2に出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL7は、最上位ビット側に(k−h)ビットシフトされたブロックbjを、積和演算回路MAC1の端子i2に出力する。
左シフト部LSHT3は、例えば、変数Yを受け、受けた変数Yを最上位ビット側に(k−h)ビットシフトする。そして、左シフト部LSHT3は、最上位ビット側に(k−h)ビットシフトした変数Yを選択部SEL8に出力する。
選択部SEL8は、ビットシフトされていない変数Y(左シフト部LSHT3によるビットシフトが実行されていない変数Y)と、最上位ビット側に(k−h)ビットシフトされた変数Yと、制御信号jとを受ける。そして、選択部SEL8は、ビットシフトされていない変数Yと、最上位ビット側に(k−h)ビットシフトされた変数Yとのいずれかを、制御信号jに基づいて選択し、選択した変数Yを積和演算回路MAC1の端子i3に出力する。
例えば、選択部SEL8は、制御信号jが(g−1)回目までの演算処理を示している場合、左シフト部LSHT3によるビットシフトが実行されていない変数Yを、積和演算回路MAC1の端子i3に出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL8は、最上位ビット側に(k−h)ビットシフトされた変数Yを、積和演算回路MAC1の端子i3に出力する。
すなわち、積和演算回路MAC1は、(g−1)回目までの演算処理では、データAと、左シフト部LSHT2によるビットシフトが実行されていないブロックbjと、左シフト部LSHT3によるビットシフトが実行されていない変数Yとを受ける。また、積和演算回路MAC1は、g回目の演算処理では、データAと、最上位ビット側に(k−h)ビットシフトされたブロックbjと、最上位ビット側に(k−h)ビットシフトされた変数Yとを受ける。
積和演算回路MAC1は、例えば、端子i1、i2で受けた値の積を、端子i3で受けた値に加算し、積和演算の結果を乗算回路MULTおよび積和演算回路MAC2に出力する。例えば、積和演算回路MAC1は、(g−1)回目までの演算処理では、データAと図9に示した選択部SEL1により選択されたブロックbjとの積を、変数Yに加算する。これにより、更新された変数Yが乗算回路MULTおよび積和演算回路MAC2に転送される。
また、積和演算回路MAC1は、g回目の演算処理では、ブロックbjを最上位ビット側に(k−h)ビットシフトした値とデータAとの積を、(g−1)回目の演算処理の終了時点の変数Yを最上位ビット側に(k−h)ビットシフトした値に加算する。これにより、更新された変数Yが乗算回路MULTおよび積和演算回路MAC2に転送される。
乗算回路MULTは、例えば、kビットのデータnk0と積和演算回路MAC1により更新された変数Yとの積の下位kビットを、変数mとして積和演算回路MAC2の端子i2に出力する。
積和演算回路MAC2は、例えば、端子i1、i2で受けた値の積を、端子i3で受けた値に加算し、積和演算の結果を右シフト部RSHTkに出力する。例えば、積和演算回路MAC2は、変数mと除数データNとの積を積和演算回路MAC1により更新された変数Yに加算する。これにより、更新された変数Yが右シフト部RSHTkに転送される。
右シフト部RSHTkは、積和演算回路MAC2により更新された変数Yを最下位ビット側にkビットシフトするシフト部の一例である。例えば、右シフト部RSHTkは、積和演算回路MAC2により更新された変数Yを最下位ビット側にkビットシフトし、シフトした変数Yを減算回路SUBに出力する。
減算回路SUBは、例えば、データNと、右シフト部RSHTkにより最下位ビット側にkビットシフトされたデータYとを受け、データYからデータNを減算した結果を選択部SEL6に出力する。また、減算回路SUBは、データYからデータNを減算したときに、ボローが発生したか否かを示す制御信号borを選択部SEL6に出力する。
選択部SEL6は、減算回路SUBの減算結果と、右シフト部RSHTkにより最下位ビット側にkビットシフトされたデータYと、制御信号borとを受ける。そして、選択部SEL6は、減算回路SUBの減算結果と右シフト部RSHTkから受けたデータYとのいずれかを制御信号borに基づいて選択し、選択したデータをj回目の演算処理の結果Yとして図9に示した選択部SEL2に出力する。
例えば、選択部SEL6は、ボローが発生していないことを示す制御信号borを受けた場合、減算回路SUBの減算結果を、j回目の演算処理の結果Yとして選択部SEL2に出力する。また、例えば、選択部SEL6は、ボローが発生したことを示す制御信号borを受けた場合、右シフト部RSHTkから受けたデータYを、j回目の演算処理の結果Yとして選択部SEL2に出力する。
このように、演算部CAL2は、左シフト部LSHT2、LSHT3等により、ビット数hに基づくビット操作を実行する。これにより、演算回路ACIR2の演算結果は、図1で説明した式(3)に示したように、入力データA、Bを分割しないときのモンゴメリ乗算の結果と同じ値になる。
なお、演算部CAL2の構成は、この例に限定されない。例えば、演算部CAL2は、図12に示すように、ブロックbjの代わりに、データAを最上位ビット側に(k−h)ビットシフトしてもよい。あるいは、演算部CAL2は、g回目の演算処理において、積和演算回路MAC1による積和演算の結果を最上位ビット側に(k−h)ビットシフトしてもよい。この場合、積和演算回路MAC1は、g回目の演算処理においても、データAと、選択部SEL1で選択されたブロックbjと、選択部SEL2で選択された変数Yとを受ける。すなわち、積和演算回路MAC1による積和演算の結果が最上位ビット側に(k−h)ビットシフトされる場合、例えば、左シフト部LSHT2、LSHT3、選択部SEL7、SEL8が省かれる。
図11は、図9に示した演算回路ACIR2の動作の一例を示している。なお、図11の動作は、図10に示した演算部CAL2を有する演算回路ACIR2の動作に対応している。図11の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図11の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図11の動作を実行してもよい。
図11の動作は、図4の動作にステップS182、S184が追加され、ステップS200、S220の代わりにステップS200a、S220aを実行する。なお、ステップS200a、S220aの処理は、例えば、ステップS120、S140の処理と同様である。図11のその他の動作は、図4の動作と同様である。図4で説明したステップと同様のステップについては、同様の符号を付し、これ等については、詳細な説明を省略する。
なお、図11の“Y<<(k−h)” は、Yを(k−h)ビット左にシフトすることを示し、“bg−1<<(k−h)”は、bg−1を(k−h)ビット左にシフトすることを示している。
ステップS110−S160の演算処理は、例えば、0番目から(g−2)番目までのブロックbに対して実行される。そして、変数jが(g−1)以上のとき(ステップS180のNo)、演算回路ACIR2の動作は、ステップS182に移る。すなわち、変数jが(g−1)のとき、演算回路ACIR2の動作は、ステップS182に移る。
ステップS182では、演算回路ACIR2は、(g−2)番目のブロックbg−2に対する演算処理(ステップS110−S160)の結果Yを、最上位ビット側に(k−h)ビットシフトする。これにより、変数Yが更新される。ステップS182での左ビットシフトは、例えば、左シフト部LSHT3により実行される。
ステップS184では、演算回路ACIR2は、データBの最後((g−1)番目)のブロックbg−1を選択し、選択したブロックbg−1を、最上位ビット側に(k−h)ビットシフトする。これにより、ブロックbg−1が更新される。ステップS184での左ビットシフトは、例えば、左シフト部LSHT2により実行される。
ステップS190では、演算回路ACIR2は、Y=A・bg−1+Yの演算を実行する。例えば、積和演算回路MAC1は、端子i1、i2で受けたデータA、bg−1の積を、端子i3で受けた変数Yに加算する。これにより、変数Yが更新される。なお、ステップS190の演算に用いる変数Yおよびブロックbg−1は、ステップS182、S184で更新されている。
ステップS200aでは、演算回路ACIR2は、ステップS190で更新した変数Y、2のk乗で表されるrkを用いて、kビットの変数mを算出する。例えば、演算回路ACIR2は、m=((Ymod(rk))・nk0)mod(rk)の演算を実行する。ステップS200aの乗算は、例えば、乗算回路MULTにより実行される。
ステップS210では、演算回路ACIR2は、法N、ステップS200aで算出した変数m、ステップS190で更新した変数Yを用いて、変数Yを更新する。例えば、演算回路ACIR2は、Y=Y+N・mの演算を実行する。例えば、積和演算回路MAC2は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算する。これにより、変数Yが更新される。
ステップS220aでは、演算回路ACIR2は、ステップS210で更新した変数Yをrkで除算する(Y=Y/rk)。例えば、演算回路ACIR2は、ステップS210で更新した変数Yを最下位ビット側にkビットシフトする。これにより、変数Yが更新される。Y=Y/rkの除算は、例えば、右シフト部RSHTkにより実行される。
ステップS230では、演算回路ACIR2は、ステップS220aで更新した変数Yが法N以上か否かを判定する。変数Yが法N以上であるとき(ステップS230のYes)、演算回路ACIR2の動作は、ステップS240に移る。一方、変数Yが法Nより小さいとき(ステップS230のNo)、演算回路ACIR2の動作は、ステップS250に移る。すなわち、変数Yが法Nより小さい場合、ステップS220aで更新した変数Yが、ブロック型モンゴメリ乗算REDCBLK2の結果(演算回路ACIR2の演算結果)になる。
ステップS240では、演算回路ACIR2は、ステップS220aで更新した変数Yから法Nを減算することにより、変数Yを更新する(Y=Y−N)。すなわち、ステップS220aで更新した変数Yが法N以上の場合、ステップS240で更新した変数Y(ステップS220aで更新した変数Yから法Nを減算した値)が、ブロック型モンゴメリ乗算REDCBLK2の結果(演算回路ACIR2の演算結果)になる。ステップS230、S240の処理は、例えば、減算回路SUBおよび選択部SEL6により実行される。
ステップS250では、例えば、演算回路ACIR2は、ブロック型モンゴメリ乗算REDCBLK2の結果Yを演算回路ACIR2の外部に出力する。すなわち、演算回路ACIR2は、例えば、ステップS220aで更新した変数Yが法Nより小さい場合、ステップS220aで更新した変数Yを演算回路ACIR2の外部に出力する。また、例えば、演算回路ACIR2は、ステップS220aで更新した変数Yが法N以上の場合、ステップS240で更新した変数Yを演算回路ACIR2の外部に出力する。
このように、ステップS182−S240の処理は、ステップS182、S184を除いて、ステップS110−S160の処理にそれぞれ対応している。なお、ステップS182、S184の処理は、ビット数hに基づくビット操作に対応している。すなわち、ステップS110−S160の一連の処理やステップS190−S240の一連の処理は、ブロック型モンゴメリ乗算における各ブロックbに対する演算処理に対応している。なお、演算回路ACIR2の動作は、この例に限定されない。例えば、ステップS182は、ステップS184の後に実行されてもよい。
図12は、図9に示した演算部CAL2の別の例を示している。図12の演算部CAL2は、ブロックbjの代わりにデータAを最上位ビット側に(k−h)ビットシフトすることを除いて、図10の演算部CAL2と同様である。例えば、図12の演算部CAL2は、ブロックbjを最上位ビット側に(k−h)ビットシフトする左シフト部LSHT2と選択部SEL7の代わりに、データAを最上位ビット側に(k−h)ビットシフトする左シフト部LSHT2aと選択部SEL7aを有している。図10で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
例えば、演算部CAL2は、積和演算回路MAC1、MAC2、乗算回路MULT、減算回路SUB、右シフト部RSHTk、左シフト部LSHT2a、LSHT3、選択部SEL6、SEL7a、SEL8を有している。
左シフト部LSHT2aは、例えば、データAを受け、受けたデータAを最上位ビット側に(k−h)ビットシフトする。そして、左シフト部LSHT2aは、最上位ビット側に(k−h)ビットシフトしたデータAを選択部SEL7aに出力する。
選択部SEL7aは、ビットシフトされていないデータA(左シフト部LSHT2aによるビットシフトが実行されていないデータA)と、最上位ビット側に(k−h)ビットシフトされたデータAと、制御信号jとを受ける。そして、選択部SEL7は、ビットシフトされていないデータAと、最上位ビット側に(k−h)ビットシフトされたデータAとのいずれかを、制御信号jに基づいて選択し、選択したデータAを積和演算回路MAC1の端子i1に出力する。
例えば、選択部SEL7aは、制御信号jが(g−1)回目までの演算処理を示している場合、左シフト部LSHT2aによるビットシフトが実行されていないデータAを、積和演算回路MAC1の端子i1に出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL7aは、最上位ビット側に(k−h)ビットシフトされたデータAを、積和演算回路MAC1の端子i1に出力する。
すなわち、積和演算回路MAC1は、(g−1)回目までの演算処理では、左シフト部LSHT2aによるビットシフトが実行されていないデータAと、ブロックbjと、左シフト部LSHT3によるビットシフトが実行されていない変数Yとを受ける。また、積和演算回路MAC1は、g回目の演算処理では、最上位ビット側に(k−h)ビットシフトされたデータAと、ブロックbjと、最上位ビット側に(k−h)ビットシフトされた変数Yとを受ける。
図12の積和演算回路MAC1の動作は、図10の積和演算回路MAC1と同様である。例えば、図12の積和演算回路MAC1による積和演算の結果は、図10の積和演算回路MAC1による積和演算の結果と同様である。すなわち、積和演算回路MAC1は、g回目の演算処理では、データA、bjの一方を最上位ビット側に(k−h)ビットシフトした値とデータA、bjの他方との積を、最上位ビット側に(k−h)ビットシフトされた変数Yに加算する。
なお、演算部CAL2の構成は、この例に限定されない。例えば、演算部CAL2は、図14に示すように、積和演算回路MAC1、MAC2の動作を1つの積和演算回路MAC1で実現してもよい。あるいは、演算部CAL2は、積和演算回路MAC1で用いるデータA、Yを最上位ビット側に(k−h)ビットシフトする代わりに、積和演算回路MAC1による積和演算の結果を最上位ビット側に(k−h)ビットシフトしてもよい。
図13は、図9に示した演算回路ACIR2の動作の別の例を示している。なお、図13の動作は、図12に示した演算部CAL2を有する演算回路ACIR2の動作に対応している。図13の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図13の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図13の動作を実行してもよい。
図13の動作は、図11の動作のステップS184の代わりに、ステップS184aを実行する。図13のその他の動作は、図11の動作と同様である。図11で説明したステップと同様のステップについては、同様の符号を付し、これ等については、詳細な説明を省略する。なお、図13の“A<<(k−h)”は、Aを(k−h)ビット左にシフトすることを示している。
ステップS184aでは、演算回路ACIR2は、データAを最上位ビット側に(k−h)ビットシフトする。これにより、データAが更新される。ステップS184aでの左ビットシフトは、例えば、左シフト部LSHT2aにより実行される。ステップS184a以外の処理は、図11の動作と同様である。
例えば、ステップS190では、演算回路ACIR2は、Y=A・bg−1+Yの演算を実行する。なお、ステップS190の演算に用いる変数YおよびデータAは、ステップS182、S184aで更新されている。例えば、積和演算回路MAC1は、端子i1、i2で受けたデータA、bg−1の積を、端子i3で受けた変数Yに加算する。これにより、変数Yが更新される。なお、演算回路ACIR2の動作は、この例に限定されない。例えば、ステップS182は、ステップS184aの後に実行されてもよい。
図14は、図9に示した演算部CAL2の別の例を示している。図14の演算部CAL2では、図10に示した積和演算回路MAC2が図10の演算部CAL2から省かれ、選択部SELa、SELb、SELcが図10の演算部CAL2に追加されている。図14の演算部CAL2のその他の構成は、図10の演算部CAL2と同様である。図10で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
演算部CAL2は、積和演算回路MAC1、乗算回路MULT、減算回路SUB、右シフト部RSHTk、左シフト部LSHT2、LSHT3、選択部SEL6、SEL7、SEL8、SELa、SELb、SELcを有している。
選択部SELaは、データA、Nを受け、データA、Nのいずれかを積和演算回路MAC1の端子i1に出力する。また、選択部SELbは、選択部SEL7で選択されたブロックbjおよび変数mを受け、ブロックbjおよび変数mのいずれかを積和演算回路MAC1の端子i2に出力する。選択部SELcは、選択部SEL8で選択された変数Yと、積和演算回路MAC1により更新された変数Yとを受ける。そして、選択部SELcは、選択部SEL8から受けるデータYと積和演算回路MAC1から受けるデータYとのいずれかを積和演算回路MAC1の端子i3に出力する。
例えば、選択部SELa、SELb、SELcは、各ブロックbの演算処理における1回目の積和演算(図11等のステップS110、S190)が実行されるとき、データAとブロックbjと選択部SEL8から受けた変数Yとを、積和演算回路MAC1に出力する。また、選択部SELa、SELb、SELcは、各ブロックbの演算処理における2回目の積和演算(図11等のステップS130、S210)が実行されるとき、データNと変数mと積和演算回路MAC1から受けた変数Yとを、積和演算回路MAC1に出力する。
すなわち、図14の演算部CAL2では、図10に示した積和演算回路MAC1、MAC2の動作を、1つの積和演算回路MAC1で実現している。例えば、各ブロックbの演算処理における1回目の積和演算(図11等のステップS110、S190)が実行されるときには、積和演算回路MAC1の動作は、図10の積和演算回路MAC1と同様である。例えば、各ブロックbの演算処理における1回目の積和演算では、積和演算回路MAC1は、端子i1、i2で受けた値A、bjの積を、端子i3で受けた値Yに加算し、積和演算の結果を乗算回路MULTおよび選択部SELcに出力する。そして、乗算回路MULTは、例えば、各ブロックbの演算処理における1回目の積和演算の結果を用いて算出した変数mを、選択部SELbに出力する。
また、例えば、各ブロックbの演算処理における2回目の積和演算(図11等のステップS130、S210)が実行されるときには、積和演算回路MAC1の動作は、図10の積和演算回路MAC2と同様である。例えば、各ブロックbの演算処理における2回目の積和演算では、積和演算回路MAC1は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算し、積和演算の結果を右シフト部RSHTkに出力する。このように、積和演算回路MAC1の演算結果は、例えば、乗算回路MULT、選択部SELc、右シフト部RSHTkに出力される。
右シフト部RSHTkは、例えば、各ブロックbの演算処理における2回目の積和演算の結果Yを、最下位ビット側にkビットシフトする。このように、図14の演算部CAL2では、図10に示した積和演算回路MAC1、MAC2の動作を1つの積和演算回路MAC1で実現しているため、2つの積和演算回路MAC(MAC1、MAC2)を有する演算部CAL2に比べて、回路規模を低減できる。なお、演算部CAL2の構成は、この例に限定されない。
図15は、図9に示した演算部CAL2の別の例を示している。図15の演算部CAL2では、図14に示した左シフト部LSHT2、LSHT3、選択部SEL7、SEL8が図14の演算部CAL2から省かれ、左シフト部LSHT3a、選択部SEL8a、SELdが図14の演算部CAL2に追加されている。図15の演算部CAL2のその他の構成は、図14の演算部CAL2と同様である。図14で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
演算部CAL2は、積和演算回路MAC1、乗算回路MULT、減算回路SUB、右シフト部RSHTk、左シフト部LSHT3a、選択部SEL6、SEL8a、SELa、SELb、SELc、SELdを有している。
選択部SELa、SELb、SELcの動作は、図8に示した選択部SELa、SELb、SELcと同様である。例えば、選択部SELa、SELb、SELcは、各ブロックbの演算処理における1回目の積和演算(図11等のステップS110、S190)が実行されるとき、データAとブロックbjと図9に示した選択部SEL2から受けた変数Yとを、積和演算回路MAC1に出力する。また、選択部SELa、SELb、SELcは、各ブロックbの演算処理における2回目の積和演算(図11等のステップS130、S210)が実行されるとき、データNと変数mと積和演算回路MAC1から受けた変数Yとを、積和演算回路MAC1に出力する。
積和演算回路MAC1は、例えば、各ブロックbの演算処理における1回目の積和演算では、端子i1、i2で受けた値A、bjの積を、端子i3で受けた値Yに加算し、積和演算の結果を選択部SEL8a、SELdおよび左シフト部LSHT3aに出力する。
また、例えば、各ブロックbの演算処理における2回目の積和演算では、積和演算回路MAC1は、端子i1、i2で受けた値N、mの積を、端子i3で受けた値Yに加算し、積和演算の結果を選択部SEL8a、SELdおよび左シフト部LSHT3aに出力する。
左シフト部LSHT3aは、例えば、積和演算回路MAC1から受けた変数Yを、最上位ビット側に(k−h)ビットシフトする。そして、左シフト部LSHT3aは、最上位ビット側に(k−h)ビットシフトした変数Yを、選択部SELdに出力する。
選択部SELdは、積和演算回路MAC1から受けた変数Yと左シフト部LSHT3aから受けた変数Yとのいずれかを選択部SEL8aに出力する。例えば、選択部SELdは、各ブロックbの演算処理における1回目の積和演算では、左シフト部LSHT3aから受けた変数Yを選択部SEL8aに出力する。また、例えば、選択部SELdは、各ブロックbの演算処理における2回目の積和演算では、積和演算回路MAC1から受けた変数Yを選択部SEL8aに出力する。
選択部SEL8aは、積和演算回路MAC1による積和演算の結果Yと、選択部SELdで選択された変数Yと、制御信号jとを受ける。そして、選択部SEL8aは、積和演算回路MAC1による積和演算の結果Yと、選択部SELdで選択された変数Yとのいずれかを、制御信号jに基づいて選択し、選択した変数Yを乗算回路MULT、選択部SELcおよび右シフト部RSHTkに出力する。
例えば、選択部SEL8aは、制御信号jが(g−1)回目までの演算処理を示している場合、積和演算回路MAC1から受けた変数Yを、乗算回路MULT、選択部SELcおよび右シフト部RSHTkに出力する。また、例えば、制御信号jがg回目の演算処理を示している場合、選択部SEL8aは、選択部SELdから受けた変数Yを、乗算回路MULT、選択部SELcおよび右シフト部RSHTkに出力する。
すなわち、g回目の演算処理では、積和演算回路MAC1による積和演算の結果Yと、積和演算回路MAC1による積和演算の結果を最上位ビット側に(k−h)ビットシフトした変数Yとのいずれかが選択部SEL8aから出力される。例えば、g回目の演算処理における1回目の積和演算では、選択部SEL8aは、積和演算回路MAC1による積和演算の結果を最上位ビット側に(k−h)ビットシフトした変数Yを、乗算回路MULTおよび選択部SELcに出力する。また、例えば、g回目の演算処理における2回目の積和演算では、選択部SEL8aは、積和演算回路MAC1による積和演算の結果Yを、右シフト部RSHTkに出力する。
なお、積和演算回路MAC1、左シフト部LSHT3a、選択部SELdおよび選択部SEL8aは、g個目のブロックbに対する演算処理における1回目の積和演算の結果を最上位ビット側に(k−h)ビットシフトする第1積和演算部の一例である。
図15の演算部CAL2を有する演算回路ACIR2の動作では、例えば、図11に示したステップS182、S184が省かれ、ステップS190で更新した変数Yを最上位ビット側に(k−h)ビットシフトする処理がステップS200aの前に追加される。ステップS190で更新した変数Yを最上位ビット側に(k−h)ビットシフトする処理は、例えば、左シフト部LSHT3aにより実行される。なお、演算部CAL2の構成は、この例に限定されない。
以上、図9から図15に示した実施形態においても、図1から図8に示した実施形態と同様の効果を得ることができる。例えば、この実施形態では、データA、Bに対するモンゴメリ乗算を、ブロック型モンゴメリ乗算のアルゴリズム(kビットのブロックb毎に処理するアルゴリズム)を用いて実行する。このように、この実施形態では、kビットのブロックb毎に演算処理するため、モンゴメリ乗算の計算効率を向上できる。
また、例えば、この実施形態では、g回目の演算処理では、データA、bjの一方を最上位ビット側に(k−h)ビットシフトした値とデータA、bjの他方との積を、最上位ビット側に(k−h)ビットシフトされた変数Yに加算する。このように、この実施形態では、ビット数hに基づくビット操作として、積和演算回路MAC1が受けるデータA、bjの一方と積和演算回路MAC1が受ける変数Yとを最上位ビット側に(k−h)ビットシフトする処理を実行する。あるいは、この実施形態では、ビット数hに基づくビット操作として、積和演算回路MAC1による積和演算の結果を最上位ビット側に(k−h)ビットシフトする処理を実行する。
これにより、最後のブロックbに対する演算処理の結果は、データBを分割しないときのモンゴメリ乗算の結果と同じになる。このため、この実施形態では、モンゴメリ乗算の結果(演算回路ACIR2の演算結果)から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データBを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
したがって、この実施形態では、ビット数hに基づくビット操作を実行しないブロック型モンゴメリ乗算に比べて、モンゴメリ変換パラメータを算出する際の計算量を低減できる。すなわち、この実施形態では、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上できる。
図16は、図1および図9に示した演算回路ACIR、ACIR2のハードウエア構成の一例を示す図である。なお、図1から図15で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
コンピュータ装置CPは、プロセッサPUと、メモリMEMと、ハードディスク装置HDDと、入出力インタフェースIFと、光学ドライブ装置ODRとを有している。プロセッサPUと、メモリMEMと、ハードディスク装置HDDと、入出力インタフェースIFと、光学ドライブ装置ODRとは、バスBUSを介して互いに接続されている。例えば、演算回路ACIRあるいは演算回路ACIR2の機能は、プロセッサPUと、メモリMEMと、ハードディスク装置HDDと、入出力インタフェースIFとにより実現される。
光学ドライブ装置ODRは、光ディスク等のリムーバブルディスクDISを装着可能であり、装着したリムーバブルディスクDISに記録された情報の読み出しおよび記録を行う。また、コンピュータ装置CPは、例えば、コンピュータ装置CPの外部と入出力インタフェースIFを介して通信する。
メモリMEMは、例えば、コンピュータ装置CPのオペレーティングシステムを格納している。また、メモリMEMは、例えば、演算回路ACIRあるいは演算回路ACIR2の動作をプロセッサPUが実行するための演算プログラム等のアプリケーションプログラムを格納している。
演算プログラム等のアプリケーションプログラムは、例えば、光ディスクなどのリムーバブルディスクDISに記録して頒布することができる。例えば、コンピュータ装置CPは、演算プログラム等のアプリケーションプログラムを、リムーバブルディスクDISから光学ドライブ装置ODRを介して読み出し、メモリMEMやハードディスク装置HDDに格納してもよい。また、コンピュータ装置CPは、演算プログラム等のアプリケーションプログラムを、インターネット等のネットワークに接続する通信装置を介してダウンロードし、メモリMEMやハードディスク装置HDDに格納してもよい。
演算回路ACIR、ACIR2のハードウエア構成は、この例に限定されない。例えば、コンピュータ装置CPは、光学ドライブ装置ODRが省かれてもよい。
以上の実施形態において説明した発明を整理して、付記として開示する。
(付記1)
nビット(nは正の整数)で表される除数データを法とし、第1データおよび第2データを入力データとするモンゴメリ乗算を実行する演算回路であって、
前記第2データをkビット単位(kはn以下の正の整数)でg個(gはk・(g−1)<n≦k・gを満たす整数)のブロックに分割し、kビットの前記ブロックを前記第2データの最下位ビット側から順に選択する選択部と、
前記入力データの少なくとも1つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、g個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、g個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からkビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数h(hはh=n−k・(g−1)で表される整数)に基づくビット操作を実行する演算部と
を備えていることを特徴とする演算回路。
(付記2)
付記1に記載の演算回路において、
前記演算部は、
前記第1データと前記選択部により選択された前記ブロックとの積を第1変数に加算する第1積和演算部と、
モンゴメリ乗算のパラメータ値と前記第1積和演算部により更新された前記第1変数との積に基づいて第2変数を算出する乗算部と、
前記第2変数と前記除数データとの積を前記第1積和演算部により更新された前記第1変数に加算する第2積和演算部と、
前記第2積和演算部により更新された前記第1変数をビットシフトするシフト部と、
前記シフト部により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト部により更新された前記第1変数が前記除数データより小さい場合、前記シフト部により更新された前記第1変数を出力する調整部とを有し、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第1変数との積の下位kビットに対応する値を前記第2変数として算出し、前記シフト部は、前記第2積和演算部により更新された前記第1変数を最下位ビット側にkビットシフトし、
g個目の前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第1変数との積の下位hビットに対応する値を前記第2変数として算出し、前記シフト部は、前記第2積和演算部により更新された前記第1変数を最下位ビット側にhビットシフトする
ことを特徴とする演算回路。
(付記3)
付記1に記載の演算回路において、
前記演算部は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択部により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データおよび前記ブロックの一方を最上位ビット側に(k−h)ビットシフトした値と前記第1データおよび前記ブロックの他方との積を、(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数を最上位ビット側に(k−h)ビットシフトした値に加算する第1積和演算部と、
モンゴメリ乗算のパラメータ値と前記第1積和演算部により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算部と、
前記第2変数と前記除数データとの積を前記第1積和演算部により更新された前記第1変数に加算する第2積和演算部と、
前記第2積和演算部により更新された前記第1変数を最下位ビット側にkビットシフトするシフト部と、
前記シフト部により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト部により更新された前記第1変数が前記除数データより小さい場合、前記シフト部により更新された前記第1変数を出力する調整部とを備えている
ことを特徴とする演算回路。
(付記4)
付記1に記載の演算回路において、
前記演算部は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択部により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データと前記選択部により選択された前記ブロックとの積を(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数に加算し、積和演算の結果を最上位ビット側に(k−h)ビットシフトする第1積和演算部と、
モンゴメリ乗算のパラメータ値と前記第1積和演算部により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算部と、
前記第2変数と前記除数データとの積を前記第1積和演算部により更新された前記第1変数に加算する第2積和演算部と、
前記第2積和演算部により更新された前記第1変数を最下位ビット側にkビットシフトするシフト部と、
前記シフト部により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト部により更新された前記第1変数が前記除数データより小さい場合、前記シフト部により更新された前記第1変数を出力する調整部とを備えている
ことを特徴とする演算回路。
(付記5)
nビット(nは正の整数)で表される除数データを法とし、第1データおよび第2データを入力データとするモンゴメリ乗算を実行する演算方法であって、
前記第2データをkビット単位(kはn以下の正の整数)でg個(gはk・(g−1)<n≦k・gを満たす整数)のブロックに分割し、
kビットの前記ブロックを前記第2データの最下位ビット側から順に選択する選択処理を実行し、
前記入力データの少なくとも1つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、
g個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、g個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からkビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数h(hはh=n−k・(g−1)で表される整数)に基づくビット操作を実行する
ことを特徴とする演算方法。
(付記6)
付記5に記載の演算方法において、
前記演算処理は、
前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算する第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積に基づいて第2変数を算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数をビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含み、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記パラメータ値と前記第1変数との積の下位kビットに対応する値を前記第2変数として算出する前記乗算処理を実行し、前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトする前記シフト処理を実行し、
g個目の前記ブロックに対する前記演算処理では、前記パラメータ値と前記第1変数との積の下位hビットに対応する値を前記第2変数として算出する前記乗算処理を実行し、前記第2積和演算により更新された前記第1変数を最下位ビット側にhビットシフトする前記シフト処理を実行する
ことを特徴とする演算方法。
(付記7)
付記5に記載の演算方法において、
前記演算処理は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データおよび前記ブロックの一方を最上位ビット側に(k−h)ビットシフトした値と前記第1データおよび前記ブロックの他方との積を、(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数を最上位ビット側に(k−h)ビットシフトした値に加算する第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含んでいる
ことを特徴とする演算方法。
(付記8)
付記5に記載の演算方法において、
前記演算処理は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数に加算し、積和演算の結果を最上位ビット側に(k−h)ビットシフトする第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含んでいる
ことを特徴とする演算方法。
(付記9)
nビット(nは正の整数)で表される除数データを法とし、第1データおよび第2データを入力データとするモンゴメリ乗算をコンピュータに実行させる演算プログラムであって、
前記第2データをkビット単位(kはn以下の正の整数)でg個(gはk・(g−1)<n≦k・gを満たす整数)のブロックに分割し、
kビットの前記ブロックを前記第2データの最下位ビット側から順に選択する選択処理を実行し、
前記入力データの少なくとも1つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、
g個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、g個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からkビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数h(hはh=n−k・(g−1)で表される整数)に基づくビット操作を実行する
処理をコンピュータに実行させることを特徴とする演算プログラム。
(付記10)
付記9に記載の演算プログラムにおいて、
前記演算処理は、
前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算する第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積に基づいて第2変数を算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数をビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含み、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記パラメータ値と前記第1変数との積の下位kビットに対応する値を前記第2変数として算出する前記乗算処理と、前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトする前記シフト処理とをコンピュータに実行させ、
g個目の前記ブロックに対する前記演算処理では、前記パラメータ値と前記第1変数との積の下位hビットに対応する値を前記第2変数として算出する前記乗算処理と、前記第2積和演算により更新された前記第1変数を最下位ビット側にhビットシフトする前記シフト処理とをコンピュータに実行させる
ことを特徴とする演算プログラム。
(付記11)
付記9に記載の演算プログラムにおいて、
前記演算処理は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データおよび前記ブロックの一方を最上位ビット側に(k−h)ビットシフトした値と前記第1データおよび前記ブロックの他方との積を、(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数を最上位ビット側に(k−h)ビットシフトした値に加算する第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含んでいる
ことを特徴とする演算プログラム。
(付記12)
付記9に記載の演算プログラムにおいて、
前記演算処理は、
(g−1)個目までの前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を第1変数に加算し、g個目の前記ブロックに対する前記演算処理では、前記第1データと前記選択処理により選択された前記ブロックとの積を(g−1)個目の前記ブロックに対する前記演算処理の終了時点の前記第1変数に加算し、積和演算の結果を最上位ビット側に(k−h)ビットシフトする第1積和演算と、
モンゴメリ乗算のパラメータ値と前記第1積和演算により更新された前記第1変数との積の下位kビットに対応する値を第2変数として算出する乗算処理と、
前記第2変数と前記除数データとの積を前記第1積和演算により更新された前記第1変数に加算する第2積和演算と、
前記第2積和演算により更新された前記第1変数を最下位ビット側にkビットシフトするシフト処理と、
前記シフト処理により更新された前記第1変数が前記除数データ以上の場合、前記第1変数から前記除数データを減算した値を前記第1変数として出力し、前記シフト処理により更新された前記第1変数が前記除数データより小さい場合、前記シフト処理により更新された前記第1変数を出力する調整処理とを含んでいる
ことを特徴とする演算プログラム。
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。