(57)【要約】【課題】  モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上する。【解決手段】  ｎビットで表される除数データを法とするモンゴメリ乗算を実行する演算回路は、第２データをｋビット単位でｇ個のブロックに分割し、ｋビットのブロックを第２データの最下位ビット側から順に選択する選択部と、入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理をブロック毎に実行し、ｇ個目のブロックに対する演算処理の結果が入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目のブロックに対する演算処理では、除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈに基づくビット操作を実行する演算部とを有している。【選択図】  図１
2015068880.tif 000002
【特許請求の範囲】
【請求項１】
ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算回路であって、
前記第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、ｋビットの前記ブロックを前記第２データの最下位ビット側から順に選択する選択部と、
前記入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、ｇ個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する演算部と
を備えていることを特徴とする演算回路。
【請求項２】
請求項１に記載の演算回路において、
前記演算部は、
前記第１データと前記選択部により選択された前記ブロックとの積を第１変数に加算する第１積和演算部と、
モンゴメリ乗算のパラメータ値と前記第１積和演算部により更新された前記第１変数との積に基づいて第２変数を算出する乗算部と、
前記第２変数と前記除数データとの積を前記第１積和演算部により更新された前記第１変数に加算する第２積和演算部と、
前記第２積和演算部により更新された前記第１変数をビットシフトするシフト部と、
前記シフト部により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト部により更新された前記第１変数が前記除数データより小さい場合、前記シフト部により更新された前記第１変数を出力する調整部とを有し、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第１変数との積の下位ｋビットに対応する値を前記第２変数として算出し、前記シフト部は、前記第２積和演算部により更新された前記第１変数を最下位ビット側にｋビットシフトし、
ｇ個目の前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第１変数との積の下位ｈビットに対応する値を前記第２変数として算出し、前記シフト部は、前記第２積和演算部により更新された前記第１変数を最下位ビット側にｈビットシフトする
ことを特徴とする演算回路。
【請求項３】
請求項１に記載の演算回路において、
前記演算部は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択部により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データおよび前記ブロックの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値と前記第１データおよび前記ブロックの他方との積を、（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数を最上位ビット側に（ｋ−ｈ）ビットシフトした値に加算する第１積和演算部と、
モンゴメリ乗算のパラメータ値と前記第１積和演算部により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算部と、
前記第２変数と前記除数データとの積を前記第１積和演算部により更新された前記第１変数に加算する第２積和演算部と、
前記第２積和演算部により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト部と、
前記シフト部により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト部により更新された前記第１変数が前記除数データより小さい場合、前記シフト部により更新された前記第１変数を出力する調整部とを備えている
ことを特徴とする演算回路。
【請求項４】
ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算方法であって、
前記第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、
ｋビットの前記ブロックを前記第２データの最下位ビット側から順に選択する選択処理を実行し、
前記入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、
ｇ個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する
ことを特徴とする演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算回路および演算方法に関する。
【背景技術】
【０００２】
ＲＳＡ（Rivest Shamir Adleman）暗号、楕円曲線暗号、ＤＳＡ（Digital Signature Algorithm）等に使用される暗号技術では、例えば、乗算剰余演算が使用されている。乗算剰余演算を高速化するアルゴリズムとして、モンゴメリ乗算が使用されている。モンゴメリ乗算では、例えば、ｎビットで表される奇数Ｎを法とし、２のｎ乗をＲとした場合、ｎビットの入力値Ａ、Ｂに対し、演算結果“（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ”を出力する。なお、Ｒ−１は、素数Ｎを法とする素体における整数Ｒの逆元を表している。また、ｍｏｄは剰余演算子である。
【０００３】
このように、入力値Ａ、Ｂに対するモンゴメリ乗算の結果は、入力値Ａ、Ｂに対する乗算剰余演算の結果“（Ａ・Ｂ）ｍｏｄＮ”と異なる。このため、モンゴメリ乗算を用いる場合、入力値Ａ、Ｂに対するモンゴメリ乗算の結果“（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ”とモンゴメリ変換パラメータ“Ｒ２ｍｏｄN”とを入力値とするモンゴメリ乗算を実行する。これにより、Ｒ−１が除去された値“（Ａ・Ｂ）ｍｏｄＮ”が得られる。
【０００４】
なお、モンゴメリ変換パラメータ“Ｒ２ｍｏｄN”は、予め算出されている。近年、モンゴメリ変換パラメータを算出する際の計算量を低減する方法が提案されている。例えば、予め算出した値“（２・Ｒ）ｍｏｄＮ”を基にモンゴメリ乗算を繰り返すことにより、モンゴメリ変換パラメータ“Ｒ２ｍｏｄN”を算出する方法が知られている（例えば、特許文献１参照）。
【０００５】
また、モンゴメリ乗算の計算効率を向上する方法が提案されている（例えば、特許文献２参照）。この種の方法では、例えば、入出力データを一定サイズのブロックに分割して処理する。以下、２つの入力データの少なくとも一方を一定サイズ（例えば、ｋビット）のブロックに分割して処理するモンゴメリ乗算を、ブロック型モンゴメリ乗算とも称する。また、ブロックのビット数ｋをブロック長ｋとも称する。例えば、ブロック型モンゴメリ乗算では、モンゴメリ変換パラメータは、ブロックの数をｇとし、２の（ｋ・ｇ）乗をＲｂｌｋとした場合、Ｒｂｌｋ２ｍｏｄNで表される。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】再表２００５／０１３２４３号公報
【特許文献２】特開平１１−２１２４５６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ブロック型モンゴメリ乗算では、例えば、法Ｎのビット数ｎがブロック長ｋの整数倍でない場合（ｎ≠ｋ・ｇ）、（Ａ・Ｂ）ｍｏｄＮを算出する際に用いられるモンゴメリ変換パラメータ“Ｒｂｌｋ２ｍｏｄN”は、Ｒ２ｍｏｄNと異なる値になる。このため、モンゴメリ変換パラメータを算出する際の計算量が、Ｒ２ｍｏｄNを算出する際の計算量に比べて増加する場合がある。
【０００８】
１つの側面では、本件開示の演算回路および演算方法は、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上することを目的とする。
【課題を解決するための手段】
【０００９】
一観点によれば、ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算回路は、第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、ｋビットのブロックを第２データの最下位ビット側から順に選択する選択部と、入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理をブロック毎に実行し、ｇ個目のブロックに対する演算処理の結果が入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目のブロックに対する演算処理では、除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する演算部とを有している
別の観点によれば、ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算方法は、第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、ｋビットのブロックを第２データの最下位ビット側から順に選択する選択処理を実行し、入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理をブロック毎に実行し、ｇ個目のブロックに対する演算処理の結果が入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目のブロックに対する演算処理では、除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する。
【発明の効果】
【００１０】
本件開示の演算回路および演算方法は、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上できる。
【図面の簡単な説明】
【００１１】
【図１】演算回路および演算方法の一実施形態を示す図である。
【図２】図１に示した演算部の一例を示す図である。
【図３】分割単位のビット数とビット操作の基になるビット数との関係の一例を示す図である。
【図４】図１に示した演算回路の動作の一例を示す図である。
【図５】図１に示した演算回路の演算結果が（Ａ・Ｂ・Ｒ−１）ｍｏｄＮであることの証明の一例を示す図である。
【図６】法が２５７でブロック長が８ビットの場合の（２・Ｒ）ｍｏｄＮの計算過程の一例を示す図である。
【図７】図１に示した演算部の別の例を示す図である。
【図８】図１に示した演算部の別の例を示す図である。
【図９】演算回路および演算方法の別の実施形態を示す図である。
【図１０】図９に示した演算部の一例を示す図である。
【図１１】図９に示した演算回路の動作の一例を示す図である。
【図１２】図９に示した演算部の別の例を示す図である。
【図１３】図９に示した演算回路の動作の別の例を示す図である。
【図１４】図９に示した演算部の別の例を示す図である。
【図１５】図９に示した演算部の別の例を示す図である。
【図１６】図１および図９に示した演算回路のハードウエア構成の一例を示す図である。
【発明を実施するための形態】
【００１２】
以下、実施形態を図面を用いて説明する。
【００１３】
図１は、演算回路および演算方法の一実施形態を示している。この実施形態の演算回路ＡＣＩＲは、例えば、公開鍵暗号を利用した暗号装置や認証装置に搭載される。例えば、公開鍵暗号は、ＲＳＡ（Rivest Shamir Adleman）暗号、楕円曲線暗号、ＤＳＡ（Digital Signature Algorithm）等に使用される。
【００１４】
演算回路ＡＣＩＲは、例えば、ｎビット（ｎは正の整数）で表される除数データＮ（以下、データＮあるいは法Ｎとも称する）を法とし、入力データＡ、Ｂ（以下、データＡ、Ｂとも称する）に対するモンゴメリ乗算を実行する。例えば、演算回路ＡＣＩＲは、データＮ、Ａ、Ｂ、ｎｋ０を受け、データＹを外部に出力する。以下、各データの値にも、各データと同じ符号を使用する。例えば、値Ａ、Ｂ、Ｎは、データＡ、Ｂ、Ｎのそれぞれの値である。なお、値Ａは、Ａ＜Ｎを満たす整数であり、値Ｂは、Ｂ＜Ｎを満たす整数である。
【００１５】
また、演算回路ＡＣＩＲの外部に出力されるデータＹは、例えば、データＡ、Ｂに対するモンゴメリ乗算の結果である。データｎｋ０は、例えば、モンゴメリ乗算のパラメータである。例えば、データｎｋ０は、（Ｎ・Ｎ’）ｍｏｄ２ｎ≡−１を満たす数Ｎ’の下位ｋビット（ｋはｎ以下の正の整数）のデータである。ｍｏｄは、剰余演算子である。
【００１６】
演算回路ＡＣＩＲは、選択部ＳＥＬ１、演算部ＣＡＬ、選択部ＳＥＬ２および制御部ＣＴＬを有している。選択部ＳＥＬ１は、データＢを受け、データＢをｋビット単位でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックｂに分割する。なお、データＢのビット数がｋ・ｇ未満である場合、例えば、選択部ＳＥＬ１は、不足する最上位側のビットを０で拡張する。
【００１７】
また、選択部ＳＥＬ１は、制御信号ｊを制御部ＣＴＬから受ける。そして、選択部ＳＥＬ１は、制御信号ｊに基づいて、ｋビットのブロックｂをデータＢの最下位ビット側から順に選択し、選択したブロックｂｊを演算部ＣＡＬに出力する。なお、ブロックｂｊは、例えば、データＢの最下位ビット側から数えてｊ番目のブロックｂを示している。例えば、データＢの最下位ビットを含むブロックｂは、０番目のブロックｂである。
【００１８】
このように、選択部ＳＥＬ１は、ｋビットのブロックｂをデータＢの最下位ビット側から順に選択する選択部の一例である。以下、ブロックｂのビット数ｋをブロック長ｋとも称する。例えば、ブロック長ｋは、ＣＰＵ（Central Processing Unit）等が有する演算器の入出力のビット幅に設定される。また、ブロックｂをデータｂとも称する。
【００１９】
演算部ＣＡＬは、ｇ個目のブロックｂに対する演算処理においてビット操作を実行する演算部の一例である。例えば、演算部ＣＡＬは、データＮ、Ａ、Ｂ、ｎｋ０、Ｙおよび制御信号ｊを受け、更新したデータＹを選択部ＳＥＬ２に出力する。演算部ＣＡＬから選択部ＳＥＬに出力されるデータＹは、各ブロックｂの演算処理の結果であり、次のブロックｂの演算処理に用いられる変数である。以下、データＹを、変数Ｙあるいは結果Ｙとも称する。
【００２０】
例えば、演算部ＣＡＬは、入力データＡ、Ｂの少なくとも１つ（例えば、データＢ）を一定サイズ（例えば、ｋビット）のブロックｂに分割して処理するモンゴメリ乗算の演算処理を、ブロックｂ毎に実行する。例えば、演算部ＣＡＬは、データＡと、選択部ＳＥＬ１により選択されたブロックｂｊと、変数Ｙと、モンゴメリ乗算のパラメータ値ｎｋ０と、除数データＮとを用いた演算により変数Ｙを更新する演算処理を、ｇ回繰り返す。
【００２１】
そして、演算部ＣＡＬは、ｇ個目のブロックｂに対する演算処理の結果がデータＢを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目のブロックｂに対する演算処理では、ビット数ｈに基づくビット操作を実行する。なお、ビット数ｈは、除数データＮを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数である。例えば、ｈは、ｈ＝ｎ−ｋ・（ｇ−１）で表される。
【００２２】
ここで、ｇ個目のブロックｂに対する演算処理は、データＢの最後（０番から数えた場合、（ｇ−１）番目）のブロックｂに対する演算処理である。すなわち、ｇ個目のブロックｂに対する演算処理は、ｇ回目の演算処理である。例えば、制御信号ｊがｇ回目の演算処理を示している場合、演算部ＣＡＬは、ｇ回目の演算処理の終了時点の変数ＹがデータＢを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ回目の演算処理中に、ビット数ｈに基づくビット操作を実行する。
【００２３】
なお、入力データＡ、Ｂのいずれも分割しないときのモンゴメリ乗算ＲＥＤＣ（Ａ，Ｂ，Ｎ）は、２のｎ乗をＲとした場合、式（１）で表される。また、モンゴメリ変換パラメータは、Ｒ２ｍｏｄNで表される。
【００２４】
ＲＥＤＣ（Ａ，Ｂ，Ｎ）＝（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ  ‥（１）
入力データＡ、Ｂの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算（以下、ブロック型モンゴメリ乗算とも称する）では、最後のブロックの演算処理中にビット操作が実行されない場合、式（１）と異なる演算結果になるときがある。例えば、入力データＡ、Ｂに対するブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ（Ａ，Ｂ，Ｎ）は、式（２）で表される。式（２）のＲｂｌｋは、例えば、データＢがｋビット単位でｇ個のブロックｂに分割された場合、２の（ｋ・ｇ）乗を示している。
【００２５】
ＲＥＤＣＢＬＫ（Ａ，Ｂ，Ｎ）＝（Ａ・Ｂ・Ｒｂｌｋ−１）ｍｏｄＮ  ‥（２）
また、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ（Ａ，Ｂ，Ｎ）のモンゴメリ変換パラメータは、Ｒｂｌｋ２ｍｏｄNで表される。法Ｎのビット数ｎがブロック長ｋの整数倍でない場合（ｎ≠ｋ・ｇ）、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ（Ａ，Ｂ，Ｎ）のモンゴメリ変換パラメータは、モンゴメリ乗算ＲＥＤＣ（Ａ，Ｂ，Ｎ）のモンゴメリ変換パラメータと異なる。この場合、モンゴメリ変換パラメータ“Ｒｂｌｋ２ｍｏｄN”を算出する際の計算量が、例えば、図６に示すように、値“Ｒ２ｍｏｄN”を算出する際の計算量に比べて増加する場合がある。
【００２６】
これに対し、演算部ＣＡＬは、ｇ回目の演算処理の結果が式（１）により得られる結果と同じ結果になるように、ｇ回目の演算処理中にビット操作を実行する。例えば、演算回路ＡＣＩＲによるブロック型モンゴメリ乗算をＲＥＤＣＢＬＫ２で表した場合、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）は、式（３）で表される。
【００２７】
ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）＝（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ  ‥（３）
したがって、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）のモンゴメリ変換パラメータは、モンゴメリ乗算ＲＥＤＣ（Ａ，Ｂ，Ｎ）のモンゴメリ変換パラメータと同じであり、Ｒ２ｍｏｄNで表される。このため、演算回路ＡＣＩＲでは、法Ｎのビット数ｎがブロック長ｋの整数倍でない場合（ｎ≠ｋ・ｇ）でも、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制できる。
【００２８】
選択部ＳＥＬ２は、例えば、演算部ＣＡＬから受けるデータＹの出力先を、制御部ＣＴＬから受ける制御信号ｊに基づいて選択する。例えば、選択部ＳＥＬ２は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、演算部ＣＡＬから受けるデータＹを、次のブロックｂに対する演算処理に用いる変数Ｙとして演算部ＣＡＬに転送する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ２は、演算部ＣＡＬから受けるデータＹを、データＡ、Ｂに対するモンゴメリ乗算の結果Ｙとして演算回路ＡＣＩＲの外部に出力する。これにより、ｇ回目の演算処理の終了時点の変数Ｙは、データＡ、Ｂに対するモンゴメリ乗算の結果Ｙとして、演算回路ＡＣＩＲの外部に出力される。
【００２９】
制御部ＣＴＬは、選択部ＳＥＬ１、演算部ＣＡＬおよび選択部ＳＥＬ２によるループ処理を、制御信号ｊを用いて制御する。
【００３０】
このように、演算回路ＡＣＩＲでは、データＡ、Ｂに対するモンゴメリ乗算をブロック型モンゴメリ乗算のアルゴリズム（ｋビットのブロックｂ毎に処理するアルゴリズム）を用いて実行するため、モンゴメリ乗算の計算効率を向上できる。また、演算回路ＡＣＩＲでは、ｋビットのブロックｂ毎に演算処理を実行できるため、ハードウエアリソースの利用効率を向上できる。例えば、３２ビットのＣＰＵがソフトウエアの制御により演算回路ＡＣＩＲの動作を実現する場合、ｋは、３２に設定される。
【００３１】
また、演算回路ＡＣＩＲの演算結果は、ｇ回目の演算処理中のビット操作により、データＢを分割しないときのモンゴメリ乗算の結果と同じ結果になる。すなわち、演算回路ＡＣＩＲでは、モンゴメリ乗算の結果（演算回路ＡＣＩＲの演算結果）から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データＢを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。これにより、演算回路ＡＣＩＲでは、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制できる。
【００３２】
ここで、例えば、演算回路ＡＣＩＲは、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２を２回実行することにより、乗算剰余演算の結果“（Ａ・Ｂ）ｍｏｄＮ”を算出できる。１回目のブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２では、入力データをデータＡ、Ｂとする。これにより、（Ａ・Ｂ・Ｒ−１）ｍｏｄＮが得られる。そして、２回目のブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２では、入力データを（Ａ・Ｂ・Ｒ−１）ｍｏｄＮとＲ２ｍｏｄNとする。
【００３３】
すなわち、上述した式（３）のＡ、Ｂに（Ａ・Ｂ・Ｒ−１）ｍｏｄＮとＲ２ｍｏｄNとをそれぞれ代入する。２回目のブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の計算過程は、例えば、式（４）で表される。
【００３４】
（（Ａ・Ｂ・Ｒ−１）・Ｒ２・Ｒ−１）ｍｏｄＮ＝（Ａ・Ｂ）ｍｏｄＮ  ‥（４）
このように、演算回路ＡＣＩＲでは、モンゴメリ変換パラメータ“Ｒ２ｍｏｄN”を用いて、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２を実行することにより、乗算剰余演算の結果“（Ａ・Ｂ）ｍｏｄＮ”が得られる。
【００３５】
なお、演算回路ＡＣＩＲの構成は、この例に限定されない。例えば、制御部ＣＴＬは、演算部ＣＡＬや選択部ＳＥＬ１、ＳＥＬ２の内部に設けられてもよい。すなわち、演算部ＣＡＬ等は、ｇ回繰り返される演算処理の何回目の演算処理を実行しているかを識別する機能を有してもよい。また、選択部ＳＥＬ２は、省かれてもよい。この場合、演算回路ＡＣＩＲは、例えば、ｇ回目の演算処理の結果であるか否かを示す信号を、モンゴメリ乗算の結果Ｙの出力先に転送してもよい。また、データＡ、Ｂの両方が一定サイズのブロックに分割されてもよい。
【００３６】
図２は、図１に示した演算部ＣＡＬの一例を示している。演算部ＣＡＬは、積和演算回路ＭＡＣ１、ＭＡＣ２、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、ビットマスク部ＭＳＫ１、ＭＳＫ２、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈ、選択部ＳＥＬ３、ＳＥＬ４、ＳＥＬ５、ＳＥＬ６を有している。
【００３７】
積和演算回路ＭＡＣ１は、第１積和演算部の一例である。積和演算回路ＭＡＣ１は、入力データに対して積和演算を実行する。例えば、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値の積を、端子ｉ３で受けた値に加算する。そして、積和演算回路ＭＡＣ１は、積和演算の結果を出力する。例えば、積和演算回路ＭＡＣ１は、データＡ、ｂｊ、Ｙを端子ｉ１、ｉ２、ｉ３でそれぞれ受け、積和演算の結果を乗算回路ＭＵＬＴおよび積和演算回路ＭＡＣ２に出力する。例えば、積和演算回路ＭＡＣ１は、データＡと選択部ＳＥＬ１により選択されたブロックｂｊとの積を変数Ｙに加算する。これにより、更新された変数Ｙが乗算回路ＭＵＬＴおよび積和演算回路ＭＡＣ２に転送される。変数Ｙは、例えば、ｋ・（ｇ＋１）ビットのデータである。
【００３８】
ビットマスク部ＭＳＫ１は、ｋビットのデータｎｋ０を受け、データｎｋ０の下位ｈビットのみを有効にするマスク処理を実行する。そして、ビットマスク部ＭＳＫ１は、下位ｈビットのみを有効にしたデータｎｋ０を選択部ＳＥＬ３に出力する。例えば、ビットマスク部ＭＳＫ１は、上位（ｋ−ｈ）ビットが全て０で下位ｈビットが全て１であるマスクデータとデータｎｋ０との論理積結果を選択部ＳＥＬ３に出力する。すなわち、ビットマスク部ＭＳＫ１は、上位（ｋ−ｈ）ビットを全て０にしたデータｎｋ０を選択部ＳＥＬ３に出力する。
【００３９】
選択部ＳＥＬ３は、ｋビットのデータｎｋ０（マスク処理がされていないデータｎｋ０）と、下位ｈビットのみを有効にしたデータｎｋ０と、制御信号ｊとを受ける。そして、選択部ＳＥＬ３は、ｋビットのデータｎｋ０と、下位ｈビットのみを有効にしたデータｎｋ０とのいずれかを、制御信号ｊに基づいて選択し、選択したデータｎｋ０を乗算回路ＭＵＬＴに出力する。例えば、選択部ＳＥＬ３は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、ｋビットのデータｎｋ０を、乗算回路ＭＵＬＴに出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ３は、下位ｈビットのみを有効にしたデータｎｋ０を、乗算回路ＭＵＬＴに出力する。
【００４０】
乗算回路ＭＵＬＴは、入力データに対して乗算を実行する。そして、乗算回路ＭＵＬＴは、乗算結果の下位ｋビットを出力する。例えば、（ｇ−１）回目までの演算処理では、乗算回路ＭＵＬＴは、ｋビットのデータｎｋ０と積和演算回路ＭＡＣ１により更新された変数Ｙとの積の下位ｋビットを、変数ｍとしてビットマスク部ＭＳＫ２および選択部ＳＥＬ４に出力する。以下、変数ｍをデータｍとも称する。
【００４１】
また、例えば、ｇ回目の演算処理では、乗算回路ＭＵＬＴは、下位ｈビットのみを有効にしたデータｎｋ０と積和演算回路ＭＡＣ１により更新された変数Ｙとの積の下位ｋビットを、変数ｍとしてビットマスク部ＭＳＫ２および選択部ＳＥＬ４に出力する。
【００４２】
すなわち、乗算回路ＭＵＬＴは、モンゴメリ乗算のパラメータ値ｎｋ０と積和演算回路ＭＡＣ１により更新された変数Ｙとの積に基づいて変数ｍを算出する乗算部の一例である。例えば、乗算回路ＭＵＬＴは、（ｇ−１）回目までの演算処理では、パラメータ値ｎｋ０と変数Ｙとの積の下位ｋビットに対応する値を変数ｍとして算出する。そして、ｇ回目の演算処理では、乗算回路ＭＵＬＴは、パラメータ値ｎｋ０と変数Ｙとの積の下位ｈビットに対応する値を変数ｍとして算出する。
【００４３】
ビットマスク部ＭＳＫ２は、ｋビットの変数ｍを受け、変数ｍの下位ｈビットのみを有効にするマスク処理を実行する。そして、ビットマスク部ＭＳＫ２は、下位ｈビットのみを有効にした変数ｍを選択部ＳＥＬ４に出力する。例えば、ビットマスク部ＭＳＫ２は、上位（ｋ−ｈ）ビットを全て０にした変数ｍを選択部ＳＥＬ４に出力する。
【００４４】
選択部ＳＥＬ４は、ｋビットの変数ｍ（マスク処理がされていない変数ｍ）と、下位ｈビットのみを有効にした変数ｍと、制御信号ｊとを受ける。そして、選択部ＳＥＬ４は、ｋビットの変数ｍと、下位ｈビットのみを有効にした変数ｍとのいずれかを、制御信号ｊに基づいて選択し、選択した変数ｍを積和演算回路ＭＡＣ２に出力する。例えば、選択部ＳＥＬ４は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、ｋビットの変数ｍを、積和演算回路ＭＡＣ２に出力する。
【００４５】
また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ４は、下位ｈビットのみを有効にした変数ｍを、積和演算回路ＭＡＣ２に出力する。すなわち、積和演算回路ＭＡＣ２は、（ｇ−１）回目までの演算処理では、ｋビットの変数ｍを受け、ｇ回目の演算処理では、下位ｈビットのみを有効にした変数ｍを受ける。
【００４６】
積和演算回路ＭＡＣ２は、第２積和演算部の一例である。積和演算回路ＭＡＣ２の動作は、積和演算回路ＭＡＣ１と同様である。例えば、積和演算回路ＭＡＣ２は、端子ｉ１、ｉ２で受けた値の積を、端子ｉ３で受けた値に加算する。そして、積和演算回路ＭＡＣ２は、積和演算の結果を出力する。例えば、積和演算回路ＭＡＣ２は、データＮ、ｍと積和演算回路ＭＡＣ１により更新されたデータＹとを端子ｉ１、ｉ２、ｉ３でそれぞれ受け、積和演算の結果を右シフト部ＲＳＨＴｋ、ＲＳＨＴｈに出力する。例えば、積和演算回路ＭＡＣ２は、変数ｍと除数データＮとの積を積和演算回路ＭＡＣ１により更新された変数Ｙに加算する。これにより、更新された変数Ｙが右シフト部ＲＳＨＴｋ、ＲＳＨＴｈに転送される。
【００４７】
右シフト部ＲＳＨＴｋ、ＲＳＨＴｈは、例えば、シフト量がそれぞれｋビット、ｈビットの右シフト演算器である。例えば、右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２から受けたデータＹの下位ｋビットを除去し、データＹの上位ビットを選択部ＳＥＬ５に出力する。すなわち、右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新されたデータＹを最下位ビット側にｋビットシフトし、シフトしたデータＹを選択部ＳＥＬ５に出力する。
【００４８】
また、例えば、右シフト部ＲＳＨＴｈは、積和演算回路ＭＡＣ２から受けたデータＹの下位ｈビットを除去し、データＹの上位ビットを選択部ＳＥＬ５に出力する。すなわち、右シフト部ＲＳＨＴｈは、積和演算回路ＭＡＣ２により更新されたデータＹを最下位ビット側にｈビットシフトし、シフトしたデータＹを選択部ＳＥＬ５に出力する。
【００４９】
選択部ＳＥＬ５は、右シフト部ＲＳＨＴｋにより更新されたデータＹと、右シフト部ＲＳＨＴｈにより更新されたデータＹと、制御信号ｊとを受ける。そして、選択部ＳＥＬ５は、右シフト部ＲＳＨＴｋにより更新されたデータＹと右シフト部ＲＳＨＴｈにより更新されたデータＹとのいずれかを制御信号ｊに基づいて選択し、選択したデータＹを減算回路ＳＵＢおよび選択部ＳＥＬ６に出力する。
【００５０】
例えば、選択部ＳＥＬ５は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、右シフト部ＲＳＨＴｋにより更新されたデータＹを、減算回路ＳＵＢおよび選択部ＳＥＬ６に出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ５は、右シフト部ＲＳＨＴｈにより更新されたデータＹを、減算回路ＳＵＢおよび選択部ＳＥＬ６に出力する。すなわち、減算回路ＳＵＢおよび選択部ＳＥＬ６は、（ｇ−１）回目までの演算処理では、積和演算回路ＭＡＣ２により更新されたデータＹを最下位ビット側にｋビットシフトしたデータＹを受ける。
【００５１】
そして、ｇ回目の演算処理では、減算回路ＳＵＢおよび選択部ＳＥＬ６は、積和演算回路ＭＡＣ２により更新されたデータＹを最下位ビット側にｈビットシフトしたデータＹを受ける。すなわち、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈおよび選択部ＳＥＬ５は、積和演算回路ＭＡＣ２により更新された変数Ｙをビットシフトするシフト部の一例である。例えば、シフト部により更新されたデータＹは、選択部ＳＥＬ５で選択されたデータＹに対応している。
【００５２】
減算回路ＳＵＢおよび選択部ＳＥＬ６は、各演算処理の結果Ｙを法Ｎより小さくするための調整部の一例である。減算回路ＳＵＢは、入力データに対して減算を実行し、減算結果およびボロー発生の有無を出力する。例えば、減算回路ＳＵＢは、データＮと、選択部ＳＥＬ５で選択されたデータＹとを受け、データＹからデータＮを減算した結果を選択部ＳＥＬ６に出力する。また、減算回路ＳＵＢは、データＹからデータＮを減算したときに、ボローが発生したか否かを示す制御信号ｂｏｒを選択部ＳＥＬ６に出力する。
【００５３】
選択部ＳＥＬ６は、減算回路ＳＵＢの減算結果と、選択部ＳＥＬ５で選択されたデータＹと、制御信号ｂｏｒとを受ける。そして、選択部ＳＥＬ６は、減算回路ＳＵＢの減算結果と選択部ＳＥＬ５で選択されたデータＹとのいずれかを制御信号ｂｏｒに基づいて選択し、選択したデータをｊ回目の演算処理の結果Ｙとして図１に示した選択部ＳＥＬ２に出力する。
【００５４】
例えば、選択部ＳＥＬ６は、ボローが発生していないことを示す制御信号ｂｏｒを受けた場合、減算回路ＳＵＢの減算結果を、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。すなわち、選択部ＳＥＬ６は、選択部ＳＥＬ５で選択されたデータＹが除数データＮ以上の場合、選択部ＳＥＬ５で選択されたデータＹから除数データＮを減算した値を、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。
【００５５】
また、例えば、選択部ＳＥＬ６は、ボローが発生したことを示す制御信号ｂｏｒを受けた場合、選択部ＳＥＬ５で選択されたデータＹを、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。すなわち、選択部ＳＥＬ６は、選択部ＳＥＬ５で選択されたデータＹが除数データＮより小さい場合、選択部ＳＥＬ５で選択されたデータＹを、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。
【００５６】
このように、演算部ＣＡＬは、ビットマスク部ＭＳＫ１、ＭＳＫ２および右シフト部ＲＳＨＴｈにより、ビット数ｈに基づくビット操作を実行する。これにより、演算回路ＡＣＩＲの演算結果は、上述した式（３）に示したように、入力データＡ、Ｂを分割しないときのモンゴメリ乗算の結果と同じ値になる。
【００５７】
なお、演算部ＣＡＬの構成は、この例に限定されない。例えば、演算部ＣＡＬは、シフト量をｋビットとｈビットに切り替え可能な右シフト部（シフト量可変右シフト演算器）を、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈの代わりに有してもよい。また、例えば、演算部ＣＡＬは、図７に示すように、（ｋ−ｈ）ビットの左シフトとｋビットの右シフトとを組み合わせて、ｈビットの右シフトを実現してもよい。
【００５８】
図３は、分割単位のビット数ｋとビット操作の基になるビット数ｈとの関係の一例を示している。図３では、右側が最下位ビット側であり、左側が最上位ビット側である。ビット操作の基になるビット数ｈは、ｎビットの法Ｎを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数である。したがって、例えば、ｈは、分割されたグループの数がｇ個の場合、ｈ＝ｎ−ｋ・（ｇ−１）で表される。また、Ｒは、２のｎ乗で表される。したがって、（ｎ＋１）ビットのＲの下位ｎビットは、０である。なお、２のｈ乗をｒｈとした場合、ｒｈは、Ｒの上位（ｈ＋１）ビットに対応する。
【００５９】
モンゴメリ乗算では、最下位ビット側から計算するため、データＢの最上位ビット側のブロックｂは、最後に計算されるブロックｂである。例えば、演算回路ＡＣＩＲによるブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２では、最後のブロックｂに対する演算処理中にビット数ｈに基づくビット操作を実行することにより、最後のブロックｂのみ、ブロック長をｈビットとして計算する。
【００６０】
なお、ビット操作を実行しないブロック型モンゴメリ乗算ＲＥＤＣＢＬＫで用いられるＲｂｌｋは、２の（ｋ・ｇ）乗で表される。したがって、（ｋ・ｇ＋１）ビットのＲｂｌｋの下位（ｋ・ｇ）ビットは、０である。例えば、法Ｎのビット数ｎがブロック長ｋの整数倍である場合（ｎ＝ｋ・ｇ）、ｈ＝ｋであり、Ｒ＝Ｒｂｌｋである。この場合、モンゴメリ乗算ＲＥＤＣ、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫの結果は、互いに同じである。したがって、モンゴメリ変換パラメータは、モンゴメリ乗算ＲＥＤＣ、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫで互いに同じである。
【００６１】
一方、法Ｎのビット数ｎがブロック長ｋの整数倍でない場合（ｎ≠ｋ・ｇ）、Ｒｂｌｋは、Ｒと異なる（Ｒｂｌｋ≠Ｒ）。このため、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫの結果は、モンゴメリ乗算ＲＥＤＣの結果と異なる。この場合、１回目のブロック型モンゴメリ乗算ＲＥＤＣＢＬＫの結果とＲｂｌｋ２ｍｏｄNとを入力値とするブロック型モンゴメリ乗算ＲＥＤＣＢＬＫを実行することにより、乗算剰余演算の結果が得られる。
【００６２】
すなわち、最後のブロックｂに対する演算処理中にビット数ｈに基づくビット操作が実行されないブロック型モンゴメリ乗算ＲＥＤＣＢＬＫでは、モンゴメリ変換パラメータは、入力データを分割しないモンゴメリ乗算のモンゴメリ変換パラメータと異なる。なお、演算回路ＡＣＩＲによるブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２のモンゴメリ変換パラメータは、法Ｎのビット数ｎがブロック長ｋの整数倍でない場合（ｎ≠ｋ・ｇ）でも、入力データを分割しないモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
【００６３】
図４は、図１に示した演算回路ＡＣＩＲの動作の一例を示している。図４の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図４の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図４の動作を実行してもよい。なお、図４の動作では、ステップＳ１００が実行される前に、データＢは、ｋビットのブロックｂに分割されている。ブロックｂの数は、例えば、ｇ個である。
【００６４】
ステップＳ１００では、演算回路ＡＣＩＲは、変数Ｙ、ｊを０に設定する。
【００６５】
ステップＳ１１０では、演算回路ＡＣＩＲは、データＢのｊ番目のブロックｂｊを選択し、Ｙ＝Ａ・ｂｊ＋Ｙの演算を実行する。例えば、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ａ、ｂｊの積を、端子ｉ３で受けた値Ｙに加算する。これにより、変数Ｙが更新される。
【００６６】
ステップＳ１２０では、演算回路ＡＣＩＲは、ステップＳ１１０で更新した変数Ｙ、２のｋ乗で表されるｒｋを用いて、ｋビットの変数ｍを算出する。例えば、演算回路ＡＣＩＲは、ｍ＝（（Ｙｍｏｄ（ｒｋ））・ｎｋ０）ｍｏｄ（ｒｋ）の演算を実行する。ステップＳ１２０の乗算は、例えば、乗算回路ＭＵＬＴにより実行される。なお、ｒｋが２のｋ乗であるため、Ｘｍｏｄ（ｒｋ）の演算は、Ｘの下位ｋビットを取り出す処理に対応している。
【００６７】
ステップＳ１３０では、演算回路ＡＣＩＲは、法Ｎ、ステップＳ１２０で算出した変数ｍ、ステップＳ１１０で更新した変数Ｙを用いて、変数Ｙを更新する。例えば、演算回路ＡＣＩＲは、Ｙ＝Ｙ＋Ｎ・ｍの演算を実行する。例えば、積和演算回路ＭＡＣ２は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算する。これにより、変数Ｙが更新される。
【００６８】
ステップＳ１４０では、演算回路ＡＣＩＲは、ステップＳ１３０で更新した変数Ｙをｒｋで除算する（Ｙ＝Ｙ／ｒｋ）。なお、ｒｋが２のｋ乗であるため、Ｙ＝Ｙ／ｒｋの除算は、例えば、ｋビットの右シフトにより実行される。例えば、演算回路ＡＣＩＲは、ステップＳ１３０で更新した変数Ｙを最下位ビット側にｋビットシフトする。これにより、変数Ｙが更新される。Ｙ＝Ｙ／ｒｋの除算は、例えば、右シフト部ＲＳＨＴｋにより実行される。
【００６９】
ステップＳ１５０では、演算回路ＡＣＩＲは、ステップＳ１４０で更新した変数Ｙが法Ｎ以上か否かを判定する。例えば、演算回路ＡＣＩＲは、変数Ｙから法Ｎを減算した際にボローが発生しない場合、変数Ｙが法Ｎ以上であると判定する。また、演算回路ＡＣＩＲは、変数Ｙから法Ｎを減算した際にボローが発生する場合、変数Ｙが法Ｎより小さいと判定する。変数Ｙが法Ｎ以上であるとき（ステップＳ１５０のＹｅｓ）、演算回路ＡＣＩＲの動作は、ステップＳ１６０に移る。
【００７０】
一方、変数Ｙが法Ｎより小さいとき（ステップＳ１５０のＮｏ）、演算回路ＡＣＩＲの動作は、ステップＳ１７０に移る。すなわち、変数Ｙが法Ｎより小さい場合、ステップＳ１４０で更新した変数Ｙが、ブロックｂｊの演算処理の結果になる。
【００７１】
ステップＳ１６０では、演算回路ＡＣＩＲは、ステップＳ１４０で更新した変数Ｙから法Ｎを減算することにより、変数Ｙを更新する（Ｙ＝Ｙ−Ｎ）。すなわち、ステップＳ１４０で更新した変数Ｙが法Ｎ以上の場合、ステップＳ１６０で更新した変数Ｙ（ステップＳ１４０で更新した変数Ｙから法Ｎを減算した値）が、ブロックｂｊの演算処理の結果になる。ステップＳ１５０、Ｓ１６０の処理は、例えば、減算回路ＳＵＢおよび選択部ＳＥＬ６により実行される。
【００７２】
ステップＳ１７０では、演算回路ＡＣＩＲは、変数ｊをインクリメントする（ｊ=ｊ+1）。
【００７３】
ステップＳ１８０では、演算回路ＡＣＩＲは、変数ｊが（ｇ−１）より小さいか否かを判定する。すなわち、演算回路ＡＣＩＲは、次の処理対象のブロックｂが（ｇ−１）番目のブロックｂｇ−１か否かを判定する。なお、データＢの最下位ビットを含むブロックｂを０番目のブロックｂ０としているため、（ｇ−１）番目のブロックｂｇ−１は、ｇ個目のブロックｂである。すなわち、ブロックｂｇ−１は、データＢの最後のブロックｂである。
【００７４】
変数ｊが（ｇ−１）より小さいとき（ステップＳ１８０のＹｅｓ）、演算回路ＡＣＩＲの動作は、ステップＳ１１０に戻る。すなわち、ステップＳ１１０−Ｓ１７０の処理は、０番目から（ｇ−２）番目までのブロックｂに対して実行される。一方、変数ｊが（ｇ−１）以上のとき（ステップＳ１８０のＮｏ）、演算回路ＡＣＩＲの動作は、ステップＳ１９０に移る。すなわち、変数ｊが（ｇ−１）のとき、演算回路ＡＣＩＲの動作は、ステップＳ１９０に移る。
【００７５】
ステップＳ１９０では、演算回路ＡＣＩＲは、データＢの最後（（ｇ−１）番目）のブロックｂｇ−１を選択し、Ｙ＝Ａ・ｂｇ−１＋Ｙの演算を実行する。例えば、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ａ、ｂｇ−１の積を、端子ｉ３で受けた値Ｙに加算する。これにより、変数Ｙが更新される。なお、値Ａ、ｂｇ−１の積が加算される変数Ｙは、（ｇ−２）番目のブロックｂｇ−２の演算処理（ステップＳ１１０−Ｓ１６０）の結果である。
【００７６】
ステップＳ２００では、演算回路ＡＣＩＲは、ステップＳ１９０で更新した変数Ｙ、２のｈ乗で表されるｒｈを用いて、ｈビットの変数ｍを算出する。例えば、演算回路ＡＣＩＲは、ｍ＝（（Ｙｍｏｄ（ｒｈ））・（ｎｋ０ｍｏｄ（ｒｈ）））ｍｏｄ（ｒｈ）の演算を実行する。なお、ｒｈが２のｈ乗であるため、Ｘｍｏｄ（ｒｈ）の演算は、Ｘの下位ｈビットを取り出す処理に対応している。すなわち、ステップＳ２００では、ビット数ｈに基づくビット操作が実行される。ステップＳ２００の処理は、例えば、ビットマスク部ＭＳＫ１、ＭＳＫ２および乗算回路ＭＵＬＴにより実行される。
【００７７】
ステップＳ２１０では、演算回路ＡＣＩＲは、法Ｎ、ステップＳ２００で算出した変数ｍ、ステップＳ１９０で更新した変数Ｙを用いて、変数Ｙを更新する。例えば、演算回路ＡＣＩＲは、Ｙ＝Ｙ＋Ｎ・ｍの演算を実行する。例えば、積和演算回路ＭＡＣ２は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算する。これにより、変数Ｙが更新される。
【００７８】
ステップＳ２２０では、演算回路ＡＣＩＲは、ステップＳ２１０で更新した変数Ｙをｒｈで除算する（Ｙ＝Ｙ／ｒｈ）。なお、ｒｈが２のｈ乗であるため、Ｙ＝Ｙ／ｒｈの除算は、例えば、ｈビットの右シフトにより実行される。例えば、演算回路ＡＣＩＲは、ステップＳ２１０で更新した変数Ｙを最下位ビット側にｈビットシフトする。これにより、変数Ｙが更新される。Ｙ＝Ｙ／ｒｈの除算は、例えば、右シフト部ＲＳＨＴｈにより実行される。このように、ステップＳ２２０では、ビット数ｈに基づくビット操作が実行される。
【００７９】
ステップＳ２３０では、演算回路ＡＣＩＲは、ステップＳ２２０で更新した変数Ｙが法Ｎ以上か否かを判定する。判定方法は、例えば、ステップＳ１５０と同様である。変数Ｙが法Ｎ以上であるとき（ステップＳ２３０のＹｅｓ）、演算回路ＡＣＩＲの動作は、ステップＳ２４０に移る。
【００８０】
一方、変数Ｙが法Ｎより小さいとき（ステップＳ２３０のＮｏ）、演算回路ＡＣＩＲの動作は、ステップＳ２５０に移る。すなわち、変数Ｙが法Ｎより小さい場合、ステップＳ２２０で更新した変数Ｙが、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果（演算回路ＡＣＩＲの演算結果）になる。
【００８１】
ステップＳ２４０では、演算回路ＡＣＩＲは、ステップＳ２２０で更新した変数Ｙから法Ｎを減算することにより、変数Ｙを更新する（Ｙ＝Ｙ−Ｎ）。すなわち、ステップＳ２２０で更新した変数Ｙが法Ｎ以上の場合、ステップＳ２４０で更新した変数Ｙ（ステップＳ２２０で更新した変数Ｙから法Ｎを減算した値）が、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果（演算回路ＡＣＩＲの演算結果）になる。ステップＳ２３０、Ｓ２４０の処理は、例えば、減算回路ＳＵＢおよび選択部ＳＥＬ６により実行される。
【００８２】
ステップＳ２５０では、例えば、演算回路ＡＣＩＲは、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果Ｙを演算回路ＡＣＩＲの外部に出力する。すなわち、演算回路ＡＣＩＲは、例えば、ステップＳ２２０で更新した変数Ｙが法Ｎより小さい場合、ステップＳ２２０で更新した変数Ｙを演算回路ＡＣＩＲの外部に出力する。また、例えば、演算回路ＡＣＩＲは、ステップＳ２２０で更新した変数Ｙが法Ｎ以上の場合、ステップＳ２４０で更新した変数Ｙを演算回路ＡＣＩＲの外部に出力する。
【００８３】
このように、ステップＳ１９０−Ｓ２４０の処理は、ビット数ｈに基づくビット操作を除いて、ステップＳ１１０−Ｓ１６０の処理にそれぞれ対応している。すなわち、ステップＳ１１０−Ｓ１６０の一連の処理やステップＳ１９０−Ｓ２４０の一連の処理（ビット数ｈに基づくビット操作を除く）は、ブロック型モンゴメリ乗算における各ブロックｂに対する演算処理に対応している。なお、演算回路ＡＣＩＲの動作は、この例に限定されない。
【００８４】
図５は、図１に示した演算回路ＡＣＩＲの演算結果が（Ａ・Ｂ・Ｒ−１）ｍｏｄＮであることの証明の一例を示している。図５では、既知の事実１および既知の事実２を用いて、演算回路ＡＣＩＲの演算結果が入力データＡ、Ｂを分割しないときのモンゴメリ乗算の結果“（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ”と同じになることを証明する。したがって、図５では、“ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）＝（Ａ・Ｂ・Ｒ−１）ｍｏｄＮ”が成立すること（図１で説明した式（３）が成立すること）を命題とする。先ず、既知の事実１および既知の事実２を説明する。
【００８５】
既知の事実１では、以下の適用条件を満たすとき、Ｔ＋Ｎ・ｍは、ｒｓで割り切れる。さらに、０≦（Ｔ＋Ｎ・ｍ）／ｒｓ＜２・Ｎが成立する。既知の事実１の適用条件では、Ｎはｎビットの数である。ｒｓは、ｒｓ＝２ｓを満たす数である。Ｔは、Ｔ＜Ｎ・ｒｓを満たす（ｎ＋ｓ）ビットの数である。ｎｓ０は、Ｎ・Ｎ’≡−１ｍｏｄ２ｎを満たすＮ’の下位ｓビットである。ｍは、ｍ≡（Ｔ・ｎｓ０）ｍｏｄ（ｒｓ）を満たすｓビットの数である。
【００８６】
既知の事実２では、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫのアルゴリズムのｉ回目のループが終了した時点で、式（５）および式（６）が成立する。式中の‖は、連接を示している。
【００８７】
Ｙ≡（Ａ・（ｂｉ−１‖ｂｉ−２‖…‖ｂ１‖ｂ０）・ｒｋ−ｉ）ｍｏｄＮ  ‥（５）
０≦Ｙ＜Ｎ  ‥（６）
次に、命題を証明する。既知の事実２より、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２のアルゴリズムの（ｇ−１）回目のループが終了した時点（例えば、図４のステップＳ１８０のＮｏ）で、式（７）および式（８）が成立する。
【００８８】
Ｙ≡（Ａ・（ｂｇ−２‖ｂｇ−３‖…‖ｂ１‖ｂ０）・ｒｋ−（ｇ−１））ｍｏｄＮ  ‥（７）
０≦Ｙ＜Ｎ  ‥（８）
ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２のｇ回目の処理（例えば、図４のステップＳ１９０−Ｓ２５０）は、既知の事実１のｓ、ｒｓを、ｓ＝ｈ、ｒｓ＝２ｈ＝ｒｈとし、Ｔを式（９）とした場合に該当する。
【００８９】
【数１】
2015068880.tif 000003
【００９０】
Ａ＜Ｎ、ｂｇ−１＜ｒｈおよび式（１０）が成立するため、式（１１）が成立する。
【００９１】
【数２】
2015068880.tif 000004
【００９２】
Ｔ＜Ｎ・ｂｇ−１＋Ｎ＝Ｎ・（ｂｇ−１＋１）≦Ｎ・ｒｈ  ‥（１１）
既知の事実１の適用条件が成立するため、式（１２）および式（１３）が成立する。
【００９３】
（Ｔ＋Ｎ・ｍ）ｍｏｄ（ｒｈ）＝０  ‥（１２）
０≦（Ｔ＋Ｎ・ｍ）／ｒｈ＜２・Ｎ  ‥（１３）
このため、ｇ回目の処理が終了した時点（例えば、図４のＳ２５０の前）で、０≦Ｙ＜Ｎが成立し、式（１４）が成立する。
【００９４】
【数３】
2015068880.tif 000005
【００９５】
すなわち、ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）＝（Ａ・Ｂ・Ｒ−１）ｍｏｄＮが成立する。
【００９６】
図６は、法Ｎが２５７でブロック長ｋが８ビットの場合の（２・Ｒ）ｍｏｄＮの計算過程の一例を示している。図６の“ＴＭＰ＜＜１”は、ＴＭＰを１ビット左にシフトすることを示している。モンゴメリ変換パラメータ“Ｒ２ｍｏｄN”は、例えば、（２・Ｒ）ｍｏｄＮを基にモンゴメリ乗算を繰り返すことにより、算出される。
【００９７】
例えば、（２・Ｒ）ｍｏｄＮからＲ２ｍｏｄNを算出する方法では、図１で説明した式（３）のＡ、Ｂに（２・Ｒ）ｍｏｄＮを代入する。これにより、（２２・Ｒ）ｍｏｄＮが算出される。そして、（２２・Ｒ）ｍｏｄＮを式（３）のＡ、Ｂに代入する。これにより、（２４・Ｒ）ｍｏｄＮが算出される。次に、（２４・Ｒ）ｍｏｄＮを式（３）のＡ、Ｂに代入する。これにより、（２８・Ｒ）ｍｏｄＮが算出される。法Ｎが２５７の場合、ｎは９であり、Ｒは、２９である。したがって、（２８・Ｒ）ｍｏｄＮと（２・Ｒ）ｍｏｄＮとを式（３）のＡ、Ｂに代入する。これにより、（２９・Ｒ）ｍｏｄＮが算出される。すなわち、Ｒ２ｍｏｄNが算出される。
【００９８】
なお、ビット操作を実行しないブロック型モンゴメリ乗算ＲＥＤＣＢＬＫのモンゴメリ変換パラメータ“Ｒｂｌｋ２ｍｏｄN”は、例えば、（２・Ｒｂｌｋ）ｍｏｄＮを基にモンゴメリ乗算を繰り返すことにより、算出される。図６では、（２・Ｒｂｌｋ）ｍｏｄＮの計算過程も比較例として示している。
【００９９】
（２・Ｒ）ｍｏｄＮは、多倍長２倍算と多倍長減算とを用いて算出される。なお、（２・Ｒｂｌｋ）ｍｏｄＮを算出する場合、ブロック長ｋとブロック数ｇとの積と、法Ｎのビット数ｎとの差に応じた回数だけ、多倍長２倍算と多倍長減算を用いた処理が繰り返される。図６の例では、ｋ＝８、ｇ＝２、ｎ＝９であるため、（２・Ｒｂｌｋ）ｍｏｄＮの算出では、多倍長２倍算と多倍長減算を用いた処理が８（＝ｋ・ｇ−ｎ＋１）回繰り返される。
【０１００】
先ず、ループに入る前に、ＴＭＰ＝２ｎ−Ｎの演算によりＴＭＰが算出される。その後、次のループで使用するＴＭＰを更新する処理を繰り返す。各ループでは、先ず、ＴＭＰを１ビット左にシフトする（ＴＭＰ＝（ＴＭＰ＜＜１）。これにより、元の値を２倍したＴＭＰが算出される。そして、ＴＭＰ２＝ＴＭＰ−Ｎの演算により、ＴＭＰ２が算出される。ＴＭＰ２が０以上の場合、ＴＭＰ２が次のループで使用されるＴＭＰとして算出される。ＴＭＰ２が０より小さい場合、１ビット左シフトにより更新したＴＭＰが次のループで使用される。
【０１０１】
なお、（２・Ｒ）ｍｏｄＮの算出では、（２・Ｒ）ｍｏｄＮは、１回目のループで算出される。例えば、ＴＭＰ＝２ｎ−Ｎの演算を実行する（５１２−２６７＝２５５）。これにより、ＴＭＰ（＝２５５）が算出される。そして、１回目のループでは、先ず、１回目のループに入る前に算出されたＴＭＰ（＝２５５）を２倍する（ＴＭＰ＝５１０）。次に、ＴＭＰ２＝ＴＭＰ−Ｎの演算を実行する（５１０−２５７＝２５３）。これにより、ＴＭＰ２（＝２５３）が算出される。ＴＭＰ２が０以上であるため、ＴＭＰ２（＝２５３）が１回目のループの結果として算出される。法Ｎが２５７の場合、（２・Ｒ）ｍｏｄＮは、（２・２９）ｍｏｄ２５７であり、１回目のループの結果（＝２５３）と一致する。
【０１０２】
これに対し、比較例の（２・Ｒｂｌｋ）ｍｏｄＮは、ループ前の多倍長減算と８回のループとにより、算出される。１回目のループまでは、（２・Ｒ）ｍｏｄＮの算出と同様である。例えば、１回目のループにより、ＴＭＰは２５５から２５３に更新される。２回目のループにより、ＴＭＰは２４９に更新され、３回目のループにより、ＴＭＰは２４１に更新される。４回目のループにより、ＴＭＰは２２５に更新され、５回目のループにより、ＴＭＰは１９３に更新される。６回目のループにより、ＴＭＰは１２９に更新され、７回目のループにより、ＴＭＰは１に更新される。８回目のループにより、ＴＭＰは２に更新される。なお、８回目のループでは、ＴＭＰ２（＝−２５５）が０より小さいため、７回目のループにより更新されたＴＭＰ（＝１）を２倍した値が８回目のループの結果となる。
【０１０３】
ここで、Ｒｂｌｋは、２８・２である。したがって、（２・Ｒｂｌｋ）ｍｏｄＮは、（２・２１６）ｍｏｄ２５７であり、８回目のループの結果（＝２）と一致する。このように、（２・Ｒｂｌｋ）ｍｏｄＮの算出では、（２・Ｒ）ｍｏｄＮを算出する際の計算量より、７回のループ分の計算量だけ増加する。すなわち、この実施形態では、例えば、（２・Ｒ）ｍｏｄＮを算出する際の計算量を、（２・Ｒｂｌｋ）ｍｏｄＮを算出する際の計算量に比べて低減できる。
【０１０４】
図７は、図１に示した演算部ＣＡＬの別の例を示している。図７の演算部ＣＡＬでは、図２に示した右シフト部ＲＳＨＴｈおよび選択部ＳＥＬ５が図２の演算部ＣＡＬから省かれ、左シフト部ＬＳＨＴ１および選択部ＳＥＬ５ａが図２の演算部ＣＡＬに追加されている。図７の演算部ＣＡＬのその他の構成は、図２の演算部ＣＡＬと同様である。図２で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１０５】
演算部ＣＡＬは、積和演算回路ＭＡＣ１、ＭＡＣ２、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、ビットマスク部ＭＳＫ１、ＭＳＫ２、右シフト部ＲＳＨＴｋ、左シフト部ＬＳＨＴ１、選択部ＳＥＬ３、ＳＥＬ４、ＳＥＬ５ａ、ＳＥＬ６を有している。左シフト部ＬＳＨＴ１、選択部ＳＥＬ５ａおよび右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新された変数Ｙをビットシフトするシフト部の一例である。
【０１０６】
左シフト部ＬＳＨＴ１は、例えば、シフト量が（ｋ−ｈ）ビットの左シフト演算器である。例えば、左シフト部ＬＳＨＴ１は、積和演算回路ＭＡＣ２により更新されたデータＹを受ける。そして、左シフト部ＬＳＨＴ１は、積和演算回路ＭＡＣ２から受けたデータＹを最上位ビット側に（ｋ−ｈ）ビットシフトし、シフトしたデータＹを選択部ＳＥＬ５ａに出力する。
【０１０７】
選択部ＳＥＬ５ａは、積和演算回路ＭＡＣ２により更新されたデータＹと、左シフト部ＬＳＨＴ１により更新されたデータＹと、制御信号ｊとを受ける。そして、選択部ＳＥＬ５は、積和演算回路ＭＡＣ２により更新されたデータＹと左シフト部ＬＳＨＴ１により更新されたデータＹとのいずれかを制御信号ｊに基づいて選択し、選択したデータＹを右シフト部ＲＳＨＴｋに出力する。
【０１０８】
例えば、選択部ＳＥＬ５ａは、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、積和演算回路ＭＡＣ２により更新されたデータＹを、右シフト部ＲＳＨＴｋに出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ５ａは、左シフト部ＬＳＨＴ１により更新されたデータＹを、右シフト部ＲＳＨＴｋに出力する。すなわち、右シフト部ＲＳＨＴｋは、（ｇ−１）回目までの演算処理では、積和演算回路ＭＡＣ２により更新されたデータＹを受ける。そして、ｇ回目の演算処理では、右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新されたデータＹを最上位ビット側に（ｋ−ｈ）ビットシフトしたデータＹを受ける。
【０１０９】
右シフト部ＲＳＨＴｋは、選択部ＳＥＬ５ａから受けたデータＹを最下位ビット側にｋビットシフトし、シフトしたデータＹを減算回路ＳＵＢおよび選択部ＳＥＬ６に出力する。例えば、ｇ回目の演算処理では、右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新されたデータＹを最上位ビット側に（ｋ−ｈ）ビットシフトしたデータＹを受ける。
【０１１０】
このため、ｇ回目の演算処理では、右シフト部ＲＳＨＴｋにより更新されたデータＹは、積和演算回路ＭＡＣ２により更新されたデータＹを最下位ビット側にｈビットシフトしたデータＹに対応している。例えば、図４のステップＳ２２０の処理（Ｙ＝Ｙ／ｒｈの除算）は、左シフト部ＬＳＨＴ１および右シフト部ＲＳＨＴｋにより実行される。
【０１１１】
図８は、図１に示した演算部ＣＡＬの別の例を示している。図８の演算部ＣＡＬでは、図２に示した積和演算回路ＭＡＣ２が図２の演算部ＣＡＬから省かれ、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃが図２の演算部ＣＡＬに追加されている。図８の演算部ＣＡＬのその他の構成は、図２の演算部ＣＡＬと同様である。図２で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１１２】
演算部ＣＡＬは、積和演算回路ＭＡＣ１、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、ビットマスク部ＭＳＫ１、ＭＳＫ２、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈ、選択部ＳＥＬ３、ＳＥＬ４、ＳＥＬ５、ＳＥＬ６、ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃを有している。
【０１１３】
選択部ＳＥＬａは、データＡ、Ｎを受け、データＡ、Ｎのいずれかを積和演算回路ＭＡＣ１の端子ｉ１に出力する。選択部ＳＥＬｂは、データｂｊ、ｍを受け、データｂｊ、ｍのいずれかを積和演算回路ＭＡＣ１の端子ｉ２に出力する。選択部ＳＥＬｃは、図１に示した選択部ＳＥＬ２から出力されるデータＹと、積和演算回路ＭＡＣ１により更新されたデータＹとを受ける。そして、選択部ＳＥＬｃは、選択部ＳＥＬ２から受けるデータＹと積和演算回路ＭＡＣ１から受けるデータＹとのいずれかを積和演算回路ＭＡＣ１の端子ｉ３に出力する。
【０１１４】
例えば、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における１回目の積和演算（図４のステップＳ１１０、Ｓ１９０）が実行されるとき、データＡとブロックｂｊと選択部ＳＥＬ２から受けたデータＹとを、積和演算回路ＭＡＣ１に出力する。また、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における２回目の積和演算（図４のステップＳ１３０、Ｓ２１０）が実行されるとき、データＮとデータｍと積和演算回路ＭＡＣ１から受けたデータＹとを、積和演算回路ＭＡＣ１に出力する。
【０１１５】
すなわち、図８の演算部ＣＡＬでは、図２に示した積和演算回路ＭＡＣ１、ＭＡＣ２の動作を、１つの積和演算回路ＭＡＣ１で実現している。例えば、各ブロックｂの演算処理における１回目の積和演算（図４のステップＳ１１０、Ｓ１９０）が実行されるときには、積和演算回路ＭＡＣ１の動作は、図２の積和演算回路ＭＡＣ１と同様である。
【０１１６】
例えば、各ブロックｂの演算処理における１回目の積和演算では、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ａ、ｂｊの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を乗算回路ＭＵＬＴおよび選択部ＳＥＬｃに出力する。そして、乗算回路ＭＵＬＴは、例えば、各ブロックｂの演算処理における１回目の積和演算の結果を用いて算出した変数ｍを、ビットマスク部ＭＳＫ２および選択部ＳＥＬ４に出力する。選択部ＳＥＬ４で選択された変数ｍは、選択部ＳＥＬｂに転送される。
【０１１７】
また、例えば、各ブロックｂの演算処理における２回目の積和演算（図４のステップＳ１３０、Ｓ２１０）が実行されるときには、積和演算回路ＭＡＣ１の動作は、図２の積和演算回路ＭＡＣ２と同様である。例えば、各ブロックｂの演算処理における２回目の積和演算では、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を右シフト部ＲＳＨＴｋ、ＲＳＨＴｈに出力する。このように、積和演算回路ＭＡＣ１の演算結果は、例えば、乗算回路ＭＵＬＴ、選択部ＳＥＬｃ、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈに出力される。
【０１１８】
右シフト部ＲＳＨＴｋは、例えば、各ブロックｂの演算処理における２回目の積和演算の結果Ｙを、最下位ビット側にｋビットシフトする。また、右シフト部ＲＳＨＴｈは、各ブロックｂの演算処理における２回目の積和演算の結果Ｙを、最下位ビット側にｈビットシフトする。
【０１１９】
このように、図８の演算部ＣＡＬでは、図１に示した積和演算回路ＭＡＣ１、ＭＡＣ２の動作を１つの積和演算回路ＭＡＣ１で実現しているため、２つの積和演算回路ＭＡＣ（ＭＡＣ１、ＭＡＣ２）を有する演算部ＣＡＬに比べて、回路規模を低減できる。
【０１２０】
なお、演算部ＣＡＬの構成は、この例に限定されない。例えば、演算部ＣＡＬは、シフト量をｋビットとｈビットに切り替え可能な右シフト部（シフト量可変右シフト演算器）を、右シフト部ＲＳＨＴｋ、ＲＳＨＴｈの代わりに有してもよい。また、例えば、演算部ＣＡＬは、図７に示したように、（ｋ−ｈ）ビットの左シフトとｋビットの右シフトとを組み合わせて、ｈビットの右シフトを実現してもよい。
【０１２１】
以上、図１から図８に示した実施形態の演算回路ＡＣＩＲおよび演算方法は、データＡ、Ｂに対するモンゴメリ乗算を、ブロック型モンゴメリ乗算のアルゴリズム（ｋビットのブロックｂ毎に処理するアルゴリズム）を用いて実行する。このように、この実施形態では、ｋビットのブロックｂ毎に演算処理を実行するため、モンゴメリ乗算の計算効率を向上できる。また、この実施形態では、ｋビットのブロックｂ毎に演算処理を実行できるため、ハードウエアリソースの利用効率を向上できる。
【０１２２】
また、この実施形態では、最後（ｇ個目）のブロックｂに対する演算処理中に、ビット数ｈに基づくビット操作を実行する。これにより、最後のブロックｂに対する演算処理の結果は、データＢを分割しないときのモンゴメリ乗算の結果と同じになる。
【０１２３】
例えば、最後のブロックｂに対する演算処理では、ビットマスク部ＭＳＫ１、ＭＳＫ２は、変数ｍの下位ｈビットのみを有効にするマスク処理を実行し、右シフト部ＲＳＨＴｈは、データＹを最下位ビット側にｈビットシフトする。なお、図７に示した演算部ＣＡＬでは、データＹを最下位ビット側にｈビットシフトする処理は、例えば、左シフト部ＬＳＨＴ１および右シフト部ＲＳＨＴｋにより実現される。
【０１２４】
このように、この実施形態のブロック型モンゴメリ乗算の結果は、データＢを分割しないときのモンゴメリ乗算の結果と同じ結果になる。このため、この実施形態では、モンゴメリ乗算の結果（演算回路ＡＣＩＲの演算結果）から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データＢを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
【０１２５】
したがって、この実施形態では、ビット数ｈに基づくビット操作を実行しないブロック型モンゴメリ乗算に比べて、モンゴメリ変換パラメータを算出する際の計算量を低減できる。すなわち、この実施形態では、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上できる。
【０１２６】
図９は、演算回路および演算方法の別の実施形態を示している。この実施形態の演算回路ＡＣＩＲ２は、図１に示した演算部ＣＡＬの代わりに、演算部ＣＡＬ２を有している。図９に示した演算回路ＡＣＩＲ２のその他の構成は、図１に示した演算回路ＡＣＩＲと同様である。図１から図８で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１２７】
演算回路ＡＣＩＲ２は、例えば、図１で説明した式（３）で表されるブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２（Ａ，Ｂ，Ｎ）を実行する。例えば、演算回路ＡＣＩＲ２は、選択部ＳＥＬ１、演算部ＣＡＬ２、選択部ＳＥＬ２および制御部ＣＴＬを有している。選択部ＳＥＬ１、ＳＥＬ２および制御部ＣＴＬは、図１に示した選択部ＳＥＬ１、ＳＥＬ２および制御部ＣＴＬと同様である。演算部ＣＡＬ２は、最後（ｇ個目）のブロックｂに対する演算処理中に実行するビット操作（ビット数ｈに基づくビット操作）の方法を除いて、図１に示した演算部ＣＡＬと同様である。
【０１２８】
なお、演算回路ＡＣＩＲ２の構成は、この例に限定されない。例えば、制御部ＣＴＬは、演算部ＣＡＬ２や選択部ＳＥＬ１、ＳＥＬ２の内部に設けられてもよい。また、選択部ＳＥＬ２は、省かれてもよい。あるいは、データＡ、Ｂの両方が一定サイズのブロックに分割されてもよい。
【０１２９】
図１０は、図９に示した演算部ＣＡＬ２の一例を示している。演算部ＣＡＬ２では、図２に示したビットマスク部ＭＳＫ１、ＭＳＫ２、右シフト部ＲＳＨｈ、選択部ＳＥＬ３、ＳＥＬ４、ＳＥＬ５が演算部ＣＡＬから省かれ、左シフト部ＬＳＨＴ２、ＬＳＨＴ３、選択部ＳＥＬ７、ＳＥＬ８が演算部ＣＡＬに追加されている。演算部ＣＡＬ２のその他の構成は、演算部ＣＡＬと同様である。
【０１３０】
例えば、演算部ＣＡＬ２は、積和演算回路ＭＡＣ１、ＭＡＣ２、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、右シフト部ＲＳＨＴｋ、左シフト部ＬＳＨＴ２、ＬＳＨＴ３、選択部ＳＥＬ６、ＳＥＬ７、ＳＥＬ８を有している。
【０１３１】
左シフト部ＬＳＨＴ２は、例えば、ブロックｂｊを受け、受けたブロックｂｊを最上位ビット側に（ｋ−ｈ）ビットシフトする。そして、左シフト部ＬＳＨＴ２は、最上位ビット側に（ｋ−ｈ）ビットシフトしたブロックｂｊを選択部ＳＥＬ７に出力する。
【０１３２】
選択部ＳＥＬ７は、ビットシフトされていないブロックｂｊ（左シフト部ＬＳＨＴ２によるビットシフトが実行されていないブロックｂｊ）と、最上位ビット側に（ｋ−ｈ）ビットシフトされたブロックｂｊと、制御信号ｊとを受ける。そして、選択部ＳＥＬ７は、ビットシフトされていないブロックｂｊと、最上位ビット側に（ｋ−ｈ）ビットシフトされたブロックｂｊとのいずれかを、制御信号ｊに基づいて選択し、選択したブロックｂｊを積和演算回路ＭＡＣ１の端子ｉ２に出力する。
【０１３３】
例えば、選択部ＳＥＬ７は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、左シフト部ＬＳＨＴ２によるビットシフトが実行されていないブロックｂｊを、積和演算回路ＭＡＣ１の端子ｉ２に出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ７は、最上位ビット側に（ｋ−ｈ）ビットシフトされたブロックｂｊを、積和演算回路ＭＡＣ１の端子ｉ２に出力する。
【０１３４】
左シフト部ＬＳＨＴ３は、例えば、変数Ｙを受け、受けた変数Ｙを最上位ビット側に（ｋ−ｈ）ビットシフトする。そして、左シフト部ＬＳＨＴ３は、最上位ビット側に（ｋ−ｈ）ビットシフトした変数Ｙを選択部ＳＥＬ８に出力する。
【０１３５】
選択部ＳＥＬ８は、ビットシフトされていない変数Ｙ（左シフト部ＬＳＨＴ３によるビットシフトが実行されていない変数Ｙ）と、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙと、制御信号ｊとを受ける。そして、選択部ＳＥＬ８は、ビットシフトされていない変数Ｙと、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙとのいずれかを、制御信号ｊに基づいて選択し、選択した変数Ｙを積和演算回路ＭＡＣ１の端子ｉ３に出力する。
【０１３６】
例えば、選択部ＳＥＬ８は、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、左シフト部ＬＳＨＴ３によるビットシフトが実行されていない変数Ｙを、積和演算回路ＭＡＣ１の端子ｉ３に出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ８は、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙを、積和演算回路ＭＡＣ１の端子ｉ３に出力する。
【０１３７】
すなわち、積和演算回路ＭＡＣ１は、（ｇ−１）回目までの演算処理では、データＡと、左シフト部ＬＳＨＴ２によるビットシフトが実行されていないブロックｂｊと、左シフト部ＬＳＨＴ３によるビットシフトが実行されていない変数Ｙとを受ける。また、積和演算回路ＭＡＣ１は、ｇ回目の演算処理では、データＡと、最上位ビット側に（ｋ−ｈ）ビットシフトされたブロックｂｊと、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙとを受ける。
【０１３８】
積和演算回路ＭＡＣ１は、例えば、端子ｉ１、ｉ２で受けた値の積を、端子ｉ３で受けた値に加算し、積和演算の結果を乗算回路ＭＵＬＴおよび積和演算回路ＭＡＣ２に出力する。例えば、積和演算回路ＭＡＣ１は、（ｇ−１）回目までの演算処理では、データＡと図９に示した選択部ＳＥＬ１により選択されたブロックｂｊとの積を、変数Ｙに加算する。これにより、更新された変数Ｙが乗算回路ＭＵＬＴおよび積和演算回路ＭＡＣ２に転送される。
【０１３９】
また、積和演算回路ＭＡＣ１は、ｇ回目の演算処理では、ブロックｂｊを最上位ビット側に（ｋ−ｈ）ビットシフトした値とデータＡとの積を、（ｇ−１）回目の演算処理の終了時点の変数Ｙを最上位ビット側に（ｋ−ｈ）ビットシフトした値に加算する。これにより、更新された変数Ｙが乗算回路ＭＵＬＴおよび積和演算回路ＭＡＣ２に転送される。
【０１４０】
乗算回路ＭＵＬＴは、例えば、ｋビットのデータｎｋ０と積和演算回路ＭＡＣ１により更新された変数Ｙとの積の下位ｋビットを、変数ｍとして積和演算回路ＭＡＣ２の端子ｉ２に出力する。
【０１４１】
積和演算回路ＭＡＣ２は、例えば、端子ｉ１、ｉ２で受けた値の積を、端子ｉ３で受けた値に加算し、積和演算の結果を右シフト部ＲＳＨＴｋに出力する。例えば、積和演算回路ＭＡＣ２は、変数ｍと除数データＮとの積を積和演算回路ＭＡＣ１により更新された変数Ｙに加算する。これにより、更新された変数Ｙが右シフト部ＲＳＨＴｋに転送される。
【０１４２】
右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新された変数Ｙを最下位ビット側にｋビットシフトするシフト部の一例である。例えば、右シフト部ＲＳＨＴｋは、積和演算回路ＭＡＣ２により更新された変数Ｙを最下位ビット側にｋビットシフトし、シフトした変数Ｙを減算回路ＳＵＢに出力する。
【０１４３】
減算回路ＳＵＢは、例えば、データＮと、右シフト部ＲＳＨＴｋにより最下位ビット側にｋビットシフトされたデータＹとを受け、データＹからデータＮを減算した結果を選択部ＳＥＬ６に出力する。また、減算回路ＳＵＢは、データＹからデータＮを減算したときに、ボローが発生したか否かを示す制御信号ｂｏｒを選択部ＳＥＬ６に出力する。
【０１４４】
選択部ＳＥＬ６は、減算回路ＳＵＢの減算結果と、右シフト部ＲＳＨＴｋにより最下位ビット側にｋビットシフトされたデータＹと、制御信号ｂｏｒとを受ける。そして、選択部ＳＥＬ６は、減算回路ＳＵＢの減算結果と右シフト部ＲＳＨＴｋから受けたデータＹとのいずれかを制御信号ｂｏｒに基づいて選択し、選択したデータをｊ回目の演算処理の結果Ｙとして図９に示した選択部ＳＥＬ２に出力する。
【０１４５】
例えば、選択部ＳＥＬ６は、ボローが発生していないことを示す制御信号ｂｏｒを受けた場合、減算回路ＳＵＢの減算結果を、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。また、例えば、選択部ＳＥＬ６は、ボローが発生したことを示す制御信号ｂｏｒを受けた場合、右シフト部ＲＳＨＴｋから受けたデータＹを、ｊ回目の演算処理の結果Ｙとして選択部ＳＥＬ２に出力する。
【０１４６】
このように、演算部ＣＡＬ２は、左シフト部ＬＳＨＴ２、ＬＳＨＴ３等により、ビット数ｈに基づくビット操作を実行する。これにより、演算回路ＡＣＩＲ２の演算結果は、図１で説明した式（３）に示したように、入力データＡ、Ｂを分割しないときのモンゴメリ乗算の結果と同じ値になる。
【０１４７】
なお、演算部ＣＡＬ２の構成は、この例に限定されない。例えば、演算部ＣＡＬ２は、図１２に示すように、ブロックｂｊの代わりに、データＡを最上位ビット側に（ｋ−ｈ）ビットシフトしてもよい。あるいは、演算部ＣＡＬ２は、ｇ回目の演算処理において、積和演算回路ＭＡＣ１による積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトしてもよい。この場合、積和演算回路ＭＡＣ１は、ｇ回目の演算処理においても、データＡと、選択部ＳＥＬ１で選択されたブロックｂｊと、選択部ＳＥＬ２で選択された変数Ｙとを受ける。すなわち、積和演算回路ＭＡＣ１による積和演算の結果が最上位ビット側に（ｋ−ｈ）ビットシフトされる場合、例えば、左シフト部ＬＳＨＴ２、ＬＳＨＴ３、選択部ＳＥＬ７、ＳＥＬ８が省かれる。
【０１４８】
図１１は、図９に示した演算回路ＡＣＩＲ２の動作の一例を示している。なお、図１１の動作は、図１０に示した演算部ＣＡＬ２を有する演算回路ＡＣＩＲ２の動作に対応している。図１１の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図１１の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図１１の動作を実行してもよい。
【０１４９】
図１１の動作は、図４の動作にステップＳ１８２、Ｓ１８４が追加され、ステップＳ２００、Ｓ２２０の代わりにステップＳ２００ａ、Ｓ２２０ａを実行する。なお、ステップＳ２００ａ、Ｓ２２０ａの処理は、例えば、ステップＳ１２０、Ｓ１４０の処理と同様である。図１１のその他の動作は、図４の動作と同様である。図４で説明したステップと同様のステップについては、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１５０】
なお、図１１の“Ｙ＜＜（ｋ−ｈ）” は、Ｙを（ｋ−ｈ）ビット左にシフトすることを示し、“ｂｇ−１＜＜（ｋ−ｈ）”は、ｂｇ−１を（ｋ−ｈ）ビット左にシフトすることを示している。
【０１５１】
ステップＳ１１０−Ｓ１６０の演算処理は、例えば、０番目から（ｇ−２）番目までのブロックｂに対して実行される。そして、変数ｊが（ｇ−１）以上のとき（ステップＳ１８０のＮｏ）、演算回路ＡＣＩＲ２の動作は、ステップＳ１８２に移る。すなわち、変数ｊが（ｇ−１）のとき、演算回路ＡＣＩＲ２の動作は、ステップＳ１８２に移る。
【０１５２】
ステップＳ１８２では、演算回路ＡＣＩＲ２は、（ｇ−２）番目のブロックｂｇ−２に対する演算処理（ステップＳ１１０−Ｓ１６０）の結果Ｙを、最上位ビット側に（ｋ−ｈ）ビットシフトする。これにより、変数Ｙが更新される。ステップＳ１８２での左ビットシフトは、例えば、左シフト部ＬＳＨＴ３により実行される。
【０１５３】
ステップＳ１８４では、演算回路ＡＣＩＲ２は、データＢの最後（（ｇ−１）番目）のブロックｂｇ−１を選択し、選択したブロックｂｇ−１を、最上位ビット側に（ｋ−ｈ）ビットシフトする。これにより、ブロックｂｇ−１が更新される。ステップＳ１８４での左ビットシフトは、例えば、左シフト部ＬＳＨＴ２により実行される。
【０１５４】
ステップＳ１９０では、演算回路ＡＣＩＲ２は、Ｙ＝Ａ・ｂｇ−１＋Ｙの演算を実行する。例えば、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けたデータＡ、ｂｇ−１の積を、端子ｉ３で受けた変数Ｙに加算する。これにより、変数Ｙが更新される。なお、ステップＳ１９０の演算に用いる変数Ｙおよびブロックｂｇ−１は、ステップＳ１８２、Ｓ１８４で更新されている。
【０１５５】
ステップＳ２００ａでは、演算回路ＡＣＩＲ２は、ステップＳ１９０で更新した変数Ｙ、２のｋ乗で表されるｒｋを用いて、ｋビットの変数ｍを算出する。例えば、演算回路ＡＣＩＲ２は、ｍ＝（（Ｙｍｏｄ（ｒｋ））・ｎｋ０）ｍｏｄ（ｒｋ）の演算を実行する。ステップＳ２００ａの乗算は、例えば、乗算回路ＭＵＬＴにより実行される。
【０１５６】
ステップＳ２１０では、演算回路ＡＣＩＲ２は、法Ｎ、ステップＳ２００ａで算出した変数ｍ、ステップＳ１９０で更新した変数Ｙを用いて、変数Ｙを更新する。例えば、演算回路ＡＣＩＲ２は、Ｙ＝Ｙ＋Ｎ・ｍの演算を実行する。例えば、積和演算回路ＭＡＣ２は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算する。これにより、変数Ｙが更新される。
【０１５７】
ステップＳ２２０ａでは、演算回路ＡＣＩＲ２は、ステップＳ２１０で更新した変数Ｙをｒｋで除算する（Ｙ＝Ｙ／ｒｋ）。例えば、演算回路ＡＣＩＲ２は、ステップＳ２１０で更新した変数Ｙを最下位ビット側にｋビットシフトする。これにより、変数Ｙが更新される。Ｙ＝Ｙ／ｒｋの除算は、例えば、右シフト部ＲＳＨＴｋにより実行される。
【０１５８】
ステップＳ２３０では、演算回路ＡＣＩＲ２は、ステップＳ２２０ａで更新した変数Ｙが法Ｎ以上か否かを判定する。変数Ｙが法Ｎ以上であるとき（ステップＳ２３０のＹｅｓ）、演算回路ＡＣＩＲ２の動作は、ステップＳ２４０に移る。一方、変数Ｙが法Ｎより小さいとき（ステップＳ２３０のＮｏ）、演算回路ＡＣＩＲ２の動作は、ステップＳ２５０に移る。すなわち、変数Ｙが法Ｎより小さい場合、ステップＳ２２０ａで更新した変数Ｙが、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果（演算回路ＡＣＩＲ２の演算結果）になる。
【０１５９】
ステップＳ２４０では、演算回路ＡＣＩＲ２は、ステップＳ２２０ａで更新した変数Ｙから法Ｎを減算することにより、変数Ｙを更新する（Ｙ＝Ｙ−Ｎ）。すなわち、ステップＳ２２０ａで更新した変数Ｙが法Ｎ以上の場合、ステップＳ２４０で更新した変数Ｙ（ステップＳ２２０ａで更新した変数Ｙから法Ｎを減算した値）が、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果（演算回路ＡＣＩＲ２の演算結果）になる。ステップＳ２３０、Ｓ２４０の処理は、例えば、減算回路ＳＵＢおよび選択部ＳＥＬ６により実行される。
【０１６０】
ステップＳ２５０では、例えば、演算回路ＡＣＩＲ２は、ブロック型モンゴメリ乗算ＲＥＤＣＢＬＫ２の結果Ｙを演算回路ＡＣＩＲ２の外部に出力する。すなわち、演算回路ＡＣＩＲ２は、例えば、ステップＳ２２０ａで更新した変数Ｙが法Ｎより小さい場合、ステップＳ２２０ａで更新した変数Ｙを演算回路ＡＣＩＲ２の外部に出力する。また、例えば、演算回路ＡＣＩＲ２は、ステップＳ２２０ａで更新した変数Ｙが法Ｎ以上の場合、ステップＳ２４０で更新した変数Ｙを演算回路ＡＣＩＲ２の外部に出力する。
【０１６１】
このように、ステップＳ１８２−Ｓ２４０の処理は、ステップＳ１８２、Ｓ１８４を除いて、ステップＳ１１０−Ｓ１６０の処理にそれぞれ対応している。なお、ステップＳ１８２、Ｓ１８４の処理は、ビット数ｈに基づくビット操作に対応している。すなわち、ステップＳ１１０−Ｓ１６０の一連の処理やステップＳ１９０−Ｓ２４０の一連の処理は、ブロック型モンゴメリ乗算における各ブロックｂに対する演算処理に対応している。なお、演算回路ＡＣＩＲ２の動作は、この例に限定されない。例えば、ステップＳ１８２は、ステップＳ１８４の後に実行されてもよい。
【０１６２】
図１２は、図９に示した演算部ＣＡＬ２の別の例を示している。図１２の演算部ＣＡＬ２は、ブロックｂｊの代わりにデータＡを最上位ビット側に（ｋ−ｈ）ビットシフトすることを除いて、図１０の演算部ＣＡＬ２と同様である。例えば、図１２の演算部ＣＡＬ２は、ブロックｂｊを最上位ビット側に（ｋ−ｈ）ビットシフトする左シフト部ＬＳＨＴ２と選択部ＳＥＬ７の代わりに、データＡを最上位ビット側に（ｋ−ｈ）ビットシフトする左シフト部ＬＳＨＴ２ａと選択部ＳＥＬ７ａを有している。図１０で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１６３】
例えば、演算部ＣＡＬ２は、積和演算回路ＭＡＣ１、ＭＡＣ２、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、右シフト部ＲＳＨＴｋ、左シフト部ＬＳＨＴ２ａ、ＬＳＨＴ３、選択部ＳＥＬ６、ＳＥＬ７ａ、ＳＥＬ８を有している。
【０１６４】
左シフト部ＬＳＨＴ２ａは、例えば、データＡを受け、受けたデータＡを最上位ビット側に（ｋ−ｈ）ビットシフトする。そして、左シフト部ＬＳＨＴ２ａは、最上位ビット側に（ｋ−ｈ）ビットシフトしたデータＡを選択部ＳＥＬ７ａに出力する。
【０１６５】
選択部ＳＥＬ７ａは、ビットシフトされていないデータＡ（左シフト部ＬＳＨＴ２ａによるビットシフトが実行されていないデータＡ）と、最上位ビット側に（ｋ−ｈ）ビットシフトされたデータＡと、制御信号ｊとを受ける。そして、選択部ＳＥＬ７は、ビットシフトされていないデータＡと、最上位ビット側に（ｋ−ｈ）ビットシフトされたデータＡとのいずれかを、制御信号ｊに基づいて選択し、選択したデータＡを積和演算回路ＭＡＣ１の端子ｉ１に出力する。
【０１６６】
例えば、選択部ＳＥＬ７ａは、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、左シフト部ＬＳＨＴ２ａによるビットシフトが実行されていないデータＡを、積和演算回路ＭＡＣ１の端子ｉ１に出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ７ａは、最上位ビット側に（ｋ−ｈ）ビットシフトされたデータＡを、積和演算回路ＭＡＣ１の端子ｉ１に出力する。
【０１６７】
すなわち、積和演算回路ＭＡＣ１は、（ｇ−１）回目までの演算処理では、左シフト部ＬＳＨＴ２ａによるビットシフトが実行されていないデータＡと、ブロックｂｊと、左シフト部ＬＳＨＴ３によるビットシフトが実行されていない変数Ｙとを受ける。また、積和演算回路ＭＡＣ１は、ｇ回目の演算処理では、最上位ビット側に（ｋ−ｈ）ビットシフトされたデータＡと、ブロックｂｊと、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙとを受ける。
【０１６８】
図１２の積和演算回路ＭＡＣ１の動作は、図１０の積和演算回路ＭＡＣ１と同様である。例えば、図１２の積和演算回路ＭＡＣ１による積和演算の結果は、図１０の積和演算回路ＭＡＣ１による積和演算の結果と同様である。すなわち、積和演算回路ＭＡＣ１は、ｇ回目の演算処理では、データＡ、ｂｊの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値とデータＡ、ｂｊの他方との積を、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙに加算する。
【０１６９】
なお、演算部ＣＡＬ２の構成は、この例に限定されない。例えば、演算部ＣＡＬ２は、図１４に示すように、積和演算回路ＭＡＣ１、ＭＡＣ２の動作を１つの積和演算回路ＭＡＣ１で実現してもよい。あるいは、演算部ＣＡＬ２は、積和演算回路ＭＡＣ１で用いるデータＡ、Ｙを最上位ビット側に（ｋ−ｈ）ビットシフトする代わりに、積和演算回路ＭＡＣ１による積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトしてもよい。
【０１７０】
図１３は、図９に示した演算回路ＡＣＩＲ２の動作の別の例を示している。なお、図１３の動作は、図１２に示した演算部ＣＡＬ２を有する演算回路ＡＣＩＲ２の動作に対応している。図１３の動作は、ハードウエアのみで実現されてもよく、ハードウエアをソフトウエアにより制御することにより実現されてもよい。例えば、演算プログラム等のソフトウエアは、コンピュータに図１３の動作を実行させてもよい。すなわち、コンピュータは、演算プログラムを記録した記憶媒体を読み取り、図１３の動作を実行してもよい。
【０１７１】
図１３の動作は、図１１の動作のステップＳ１８４の代わりに、ステップＳ１８４ａを実行する。図１３のその他の動作は、図１１の動作と同様である。図１１で説明したステップと同様のステップについては、同様の符号を付し、これ等については、詳細な説明を省略する。なお、図１３の“Ａ＜＜（ｋ−ｈ）”は、Ａを（ｋ−ｈ）ビット左にシフトすることを示している。
【０１７２】
ステップＳ１８４ａでは、演算回路ＡＣＩＲ２は、データＡを最上位ビット側に（ｋ−ｈ）ビットシフトする。これにより、データＡが更新される。ステップＳ１８４ａでの左ビットシフトは、例えば、左シフト部ＬＳＨＴ２ａにより実行される。ステップＳ１８４ａ以外の処理は、図１１の動作と同様である。
【０１７３】
例えば、ステップＳ１９０では、演算回路ＡＣＩＲ２は、Ｙ＝Ａ・ｂｇ−１＋Ｙの演算を実行する。なお、ステップＳ１９０の演算に用いる変数ＹおよびデータＡは、ステップＳ１８２、Ｓ１８４ａで更新されている。例えば、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けたデータＡ、ｂｇ−１の積を、端子ｉ３で受けた変数Ｙに加算する。これにより、変数Ｙが更新される。なお、演算回路ＡＣＩＲ２の動作は、この例に限定されない。例えば、ステップＳ１８２は、ステップＳ１８４ａの後に実行されてもよい。
【０１７４】
図１４は、図９に示した演算部ＣＡＬ２の別の例を示している。図１４の演算部ＣＡＬ２では、図１０に示した積和演算回路ＭＡＣ２が図１０の演算部ＣＡＬ２から省かれ、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃが図１０の演算部ＣＡＬ２に追加されている。図１４の演算部ＣＡＬ２のその他の構成は、図１０の演算部ＣＡＬ２と同様である。図１０で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１７５】
演算部ＣＡＬ２は、積和演算回路ＭＡＣ１、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、右シフト部ＲＳＨＴｋ、左シフト部ＬＳＨＴ２、ＬＳＨＴ３、選択部ＳＥＬ６、ＳＥＬ７、ＳＥＬ８、ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃを有している。
【０１７６】
選択部ＳＥＬａは、データＡ、Ｎを受け、データＡ、Ｎのいずれかを積和演算回路ＭＡＣ１の端子ｉ１に出力する。また、選択部ＳＥＬｂは、選択部ＳＥＬ７で選択されたブロックｂｊおよび変数ｍを受け、ブロックｂｊおよび変数ｍのいずれかを積和演算回路ＭＡＣ１の端子ｉ２に出力する。選択部ＳＥＬｃは、選択部ＳＥＬ８で選択された変数Ｙと、積和演算回路ＭＡＣ１により更新された変数Ｙとを受ける。そして、選択部ＳＥＬｃは、選択部ＳＥＬ８から受けるデータＹと積和演算回路ＭＡＣ１から受けるデータＹとのいずれかを積和演算回路ＭＡＣ１の端子ｉ３に出力する。
【０１７７】
例えば、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における１回目の積和演算（図１１等のステップＳ１１０、Ｓ１９０）が実行されるとき、データＡとブロックｂｊと選択部ＳＥＬ８から受けた変数Ｙとを、積和演算回路ＭＡＣ１に出力する。また、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における２回目の積和演算（図１１等のステップＳ１３０、Ｓ２１０）が実行されるとき、データＮと変数ｍと積和演算回路ＭＡＣ１から受けた変数Ｙとを、積和演算回路ＭＡＣ１に出力する。
【０１７８】
すなわち、図１４の演算部ＣＡＬ２では、図１０に示した積和演算回路ＭＡＣ１、ＭＡＣ２の動作を、１つの積和演算回路ＭＡＣ１で実現している。例えば、各ブロックｂの演算処理における１回目の積和演算（図１１等のステップＳ１１０、Ｓ１９０）が実行されるときには、積和演算回路ＭＡＣ１の動作は、図１０の積和演算回路ＭＡＣ１と同様である。例えば、各ブロックｂの演算処理における１回目の積和演算では、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ａ、ｂｊの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を乗算回路ＭＵＬＴおよび選択部ＳＥＬｃに出力する。そして、乗算回路ＭＵＬＴは、例えば、各ブロックｂの演算処理における１回目の積和演算の結果を用いて算出した変数ｍを、選択部ＳＥＬｂに出力する。
【０１７９】
また、例えば、各ブロックｂの演算処理における２回目の積和演算（図１１等のステップＳ１３０、Ｓ２１０）が実行されるときには、積和演算回路ＭＡＣ１の動作は、図１０の積和演算回路ＭＡＣ２と同様である。例えば、各ブロックｂの演算処理における２回目の積和演算では、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を右シフト部ＲＳＨＴｋに出力する。このように、積和演算回路ＭＡＣ１の演算結果は、例えば、乗算回路ＭＵＬＴ、選択部ＳＥＬｃ、右シフト部ＲＳＨＴｋに出力される。
【０１８０】
右シフト部ＲＳＨＴｋは、例えば、各ブロックｂの演算処理における２回目の積和演算の結果Ｙを、最下位ビット側にｋビットシフトする。このように、図１４の演算部ＣＡＬ２では、図１０に示した積和演算回路ＭＡＣ１、ＭＡＣ２の動作を１つの積和演算回路ＭＡＣ１で実現しているため、２つの積和演算回路ＭＡＣ（ＭＡＣ１、ＭＡＣ２）を有する演算部ＣＡＬ２に比べて、回路規模を低減できる。なお、演算部ＣＡＬ２の構成は、この例に限定されない。
【０１８１】
図１５は、図９に示した演算部ＣＡＬ２の別の例を示している。図１５の演算部ＣＡＬ２では、図１４に示した左シフト部ＬＳＨＴ２、ＬＳＨＴ３、選択部ＳＥＬ７、ＳＥＬ８が図１４の演算部ＣＡＬ２から省かれ、左シフト部ＬＳＨＴ３ａ、選択部ＳＥＬ８ａ、ＳＥＬｄが図１４の演算部ＣＡＬ２に追加されている。図１５の演算部ＣＡＬ２のその他の構成は、図１４の演算部ＣＡＬ２と同様である。図１４で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１８２】
演算部ＣＡＬ２は、積和演算回路ＭＡＣ１、乗算回路ＭＵＬＴ、減算回路ＳＵＢ、右シフト部ＲＳＨＴｋ、左シフト部ＬＳＨＴ３ａ、選択部ＳＥＬ６、ＳＥＬ８ａ、ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃ、ＳＥＬｄを有している。
【０１８３】
選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃの動作は、図８に示した選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃと同様である。例えば、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における１回目の積和演算（図１１等のステップＳ１１０、Ｓ１９０）が実行されるとき、データＡとブロックｂｊと図９に示した選択部ＳＥＬ２から受けた変数Ｙとを、積和演算回路ＭＡＣ１に出力する。また、選択部ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃは、各ブロックｂの演算処理における２回目の積和演算（図１１等のステップＳ１３０、Ｓ２１０）が実行されるとき、データＮと変数ｍと積和演算回路ＭＡＣ１から受けた変数Ｙとを、積和演算回路ＭＡＣ１に出力する。
【０１８４】
積和演算回路ＭＡＣ１は、例えば、各ブロックｂの演算処理における１回目の積和演算では、端子ｉ１、ｉ２で受けた値Ａ、ｂｊの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を選択部ＳＥＬ８ａ、ＳＥＬｄおよび左シフト部ＬＳＨＴ３ａに出力する。
【０１８５】
また、例えば、各ブロックｂの演算処理における２回目の積和演算では、積和演算回路ＭＡＣ１は、端子ｉ１、ｉ２で受けた値Ｎ、ｍの積を、端子ｉ３で受けた値Ｙに加算し、積和演算の結果を選択部ＳＥＬ８ａ、ＳＥＬｄおよび左シフト部ＬＳＨＴ３ａに出力する。
【０１８６】
左シフト部ＬＳＨＴ３ａは、例えば、積和演算回路ＭＡＣ１から受けた変数Ｙを、最上位ビット側に（ｋ−ｈ）ビットシフトする。そして、左シフト部ＬＳＨＴ３ａは、最上位ビット側に（ｋ−ｈ）ビットシフトした変数Ｙを、選択部ＳＥＬｄに出力する。
【０１８７】
選択部ＳＥＬｄは、積和演算回路ＭＡＣ１から受けた変数Ｙと左シフト部ＬＳＨＴ３ａから受けた変数Ｙとのいずれかを選択部ＳＥＬ８ａに出力する。例えば、選択部ＳＥＬｄは、各ブロックｂの演算処理における１回目の積和演算では、左シフト部ＬＳＨＴ３ａから受けた変数Ｙを選択部ＳＥＬ８ａに出力する。また、例えば、選択部ＳＥＬｄは、各ブロックｂの演算処理における２回目の積和演算では、積和演算回路ＭＡＣ１から受けた変数Ｙを選択部ＳＥＬ８ａに出力する。
【０１８８】
選択部ＳＥＬ８ａは、積和演算回路ＭＡＣ１による積和演算の結果Ｙと、選択部ＳＥＬｄで選択された変数Ｙと、制御信号ｊとを受ける。そして、選択部ＳＥＬ８ａは、積和演算回路ＭＡＣ１による積和演算の結果Ｙと、選択部ＳＥＬｄで選択された変数Ｙとのいずれかを、制御信号ｊに基づいて選択し、選択した変数Ｙを乗算回路ＭＵＬＴ、選択部ＳＥＬｃおよび右シフト部ＲＳＨＴｋに出力する。
【０１８９】
例えば、選択部ＳＥＬ８ａは、制御信号ｊが（ｇ−１）回目までの演算処理を示している場合、積和演算回路ＭＡＣ１から受けた変数Ｙを、乗算回路ＭＵＬＴ、選択部ＳＥＬｃおよび右シフト部ＲＳＨＴｋに出力する。また、例えば、制御信号ｊがｇ回目の演算処理を示している場合、選択部ＳＥＬ８ａは、選択部ＳＥＬｄから受けた変数Ｙを、乗算回路ＭＵＬＴ、選択部ＳＥＬｃおよび右シフト部ＲＳＨＴｋに出力する。
【０１９０】
すなわち、ｇ回目の演算処理では、積和演算回路ＭＡＣ１による積和演算の結果Ｙと、積和演算回路ＭＡＣ１による積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトした変数Ｙとのいずれかが選択部ＳＥＬ８ａから出力される。例えば、ｇ回目の演算処理における１回目の積和演算では、選択部ＳＥＬ８ａは、積和演算回路ＭＡＣ１による積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトした変数Ｙを、乗算回路ＭＵＬＴおよび選択部ＳＥＬｃに出力する。また、例えば、ｇ回目の演算処理における２回目の積和演算では、選択部ＳＥＬ８ａは、積和演算回路ＭＡＣ１による積和演算の結果Ｙを、右シフト部ＲＳＨＴｋに出力する。
【０１９１】
なお、積和演算回路ＭＡＣ１、左シフト部ＬＳＨＴ３ａ、選択部ＳＥＬｄおよび選択部ＳＥＬ８ａは、ｇ個目のブロックｂに対する演算処理における１回目の積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトする第１積和演算部の一例である。
【０１９２】
図１５の演算部ＣＡＬ２を有する演算回路ＡＣＩＲ２の動作では、例えば、図１１に示したステップＳ１８２、Ｓ１８４が省かれ、ステップＳ１９０で更新した変数Ｙを最上位ビット側に（ｋ−ｈ）ビットシフトする処理がステップＳ２００ａの前に追加される。ステップＳ１９０で更新した変数Ｙを最上位ビット側に（ｋ−ｈ）ビットシフトする処理は、例えば、左シフト部ＬＳＨＴ３ａにより実行される。なお、演算部ＣＡＬ２の構成は、この例に限定されない。
【０１９３】
以上、図９から図１５に示した実施形態においても、図１から図８に示した実施形態と同様の効果を得ることができる。例えば、この実施形態では、データＡ、Ｂに対するモンゴメリ乗算を、ブロック型モンゴメリ乗算のアルゴリズム（ｋビットのブロックｂ毎に処理するアルゴリズム）を用いて実行する。このように、この実施形態では、ｋビットのブロックｂ毎に演算処理するため、モンゴメリ乗算の計算効率を向上できる。
【０１９４】
また、例えば、この実施形態では、ｇ回目の演算処理では、データＡ、ｂｊの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値とデータＡ、ｂｊの他方との積を、最上位ビット側に（ｋ−ｈ）ビットシフトされた変数Ｙに加算する。このように、この実施形態では、ビット数ｈに基づくビット操作として、積和演算回路ＭＡＣ１が受けるデータＡ、ｂｊの一方と積和演算回路ＭＡＣ１が受ける変数Ｙとを最上位ビット側に（ｋ−ｈ）ビットシフトする処理を実行する。あるいは、この実施形態では、ビット数ｈに基づくビット操作として、積和演算回路ＭＡＣ１による積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトする処理を実行する。
【０１９５】
これにより、最後のブロックｂに対する演算処理の結果は、データＢを分割しないときのモンゴメリ乗算の結果と同じになる。このため、この実施形態では、モンゴメリ乗算の結果（演算回路ＡＣＩＲ２の演算結果）から乗算剰余演算の結果を算出する際に用いられるモンゴメリ変換パラメータは、データＢを分割しないときのモンゴメリ乗算のモンゴメリ変換パラメータと同じである。
【０１９６】
したがって、この実施形態では、ビット数ｈに基づくビット操作を実行しないブロック型モンゴメリ乗算に比べて、モンゴメリ変換パラメータを算出する際の計算量を低減できる。すなわち、この実施形態では、モンゴメリ変換パラメータを算出する際の計算量が増加することを抑制しつつ、モンゴメリ乗算の計算効率を向上できる。
【０１９７】
図１６は、図１および図９に示した演算回路ＡＣＩＲ、ＡＣＩＲ２のハードウエア構成の一例を示す図である。なお、図１から図１５で説明した要素と同様の要素については、同様の符号を付し、これ等については、詳細な説明を省略する。
【０１９８】
コンピュータ装置ＣＰは、プロセッサＰＵと、メモリＭＥＭと、ハードディスク装置ＨＤＤと、入出力インタフェースＩＦと、光学ドライブ装置ＯＤＲとを有している。プロセッサＰＵと、メモリＭＥＭと、ハードディスク装置ＨＤＤと、入出力インタフェースＩＦと、光学ドライブ装置ＯＤＲとは、バスＢＵＳを介して互いに接続されている。例えば、演算回路ＡＣＩＲあるいは演算回路ＡＣＩＲ２の機能は、プロセッサＰＵと、メモリＭＥＭと、ハードディスク装置ＨＤＤと、入出力インタフェースＩＦとにより実現される。
【０１９９】
光学ドライブ装置ＯＤＲは、光ディスク等のリムーバブルディスクＤＩＳを装着可能であり、装着したリムーバブルディスクＤＩＳに記録された情報の読み出しおよび記録を行う。また、コンピュータ装置ＣＰは、例えば、コンピュータ装置ＣＰの外部と入出力インタフェースＩＦを介して通信する。
【０２００】
メモリＭＥＭは、例えば、コンピュータ装置ＣＰのオペレーティングシステムを格納している。また、メモリＭＥＭは、例えば、演算回路ＡＣＩＲあるいは演算回路ＡＣＩＲ２の動作をプロセッサＰＵが実行するための演算プログラム等のアプリケーションプログラムを格納している。
【０２０１】
演算プログラム等のアプリケーションプログラムは、例えば、光ディスクなどのリムーバブルディスクＤＩＳに記録して頒布することができる。例えば、コンピュータ装置ＣＰは、演算プログラム等のアプリケーションプログラムを、リムーバブルディスクＤＩＳから光学ドライブ装置ＯＤＲを介して読み出し、メモリＭＥＭやハードディスク装置ＨＤＤに格納してもよい。また、コンピュータ装置ＣＰは、演算プログラム等のアプリケーションプログラムを、インターネット等のネットワークに接続する通信装置を介してダウンロードし、メモリＭＥＭやハードディスク装置ＨＤＤに格納してもよい。
【０２０２】
演算回路ＡＣＩＲ、ＡＣＩＲ２のハードウエア構成は、この例に限定されない。例えば、コンピュータ装置ＣＰは、光学ドライブ装置ＯＤＲが省かれてもよい。
【０２０３】
以上の実施形態において説明した発明を整理して、付記として開示する。
（付記１）
ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算回路であって、
前記第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、ｋビットの前記ブロックを前記第２データの最下位ビット側から順に選択する選択部と、
前記入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、ｇ個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する演算部と
を備えていることを特徴とする演算回路。
（付記２）
付記１に記載の演算回路において、
前記演算部は、
前記第１データと前記選択部により選択された前記ブロックとの積を第１変数に加算する第１積和演算部と、
モンゴメリ乗算のパラメータ値と前記第１積和演算部により更新された前記第１変数との積に基づいて第２変数を算出する乗算部と、
前記第２変数と前記除数データとの積を前記第１積和演算部により更新された前記第１変数に加算する第２積和演算部と、
前記第２積和演算部により更新された前記第１変数をビットシフトするシフト部と、
前記シフト部により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト部により更新された前記第１変数が前記除数データより小さい場合、前記シフト部により更新された前記第１変数を出力する調整部とを有し、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第１変数との積の下位ｋビットに対応する値を前記第２変数として算出し、前記シフト部は、前記第２積和演算部により更新された前記第１変数を最下位ビット側にｋビットシフトし、
ｇ個目の前記ブロックに対する前記演算処理では、前記乗算部は、前記パラメータ値と前記第１変数との積の下位ｈビットに対応する値を前記第２変数として算出し、前記シフト部は、前記第２積和演算部により更新された前記第１変数を最下位ビット側にｈビットシフトする
ことを特徴とする演算回路。
（付記３）
付記１に記載の演算回路において、
前記演算部は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択部により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データおよび前記ブロックの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値と前記第１データおよび前記ブロックの他方との積を、（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数を最上位ビット側に（ｋ−ｈ）ビットシフトした値に加算する第１積和演算部と、
モンゴメリ乗算のパラメータ値と前記第１積和演算部により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算部と、
前記第２変数と前記除数データとの積を前記第１積和演算部により更新された前記第１変数に加算する第２積和演算部と、
前記第２積和演算部により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト部と、
前記シフト部により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト部により更新された前記第１変数が前記除数データより小さい場合、前記シフト部により更新された前記第１変数を出力する調整部とを備えている
ことを特徴とする演算回路。
（付記４）
付記１に記載の演算回路において、
前記演算部は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択部により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データと前記選択部により選択された前記ブロックとの積を（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数に加算し、積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトする第１積和演算部と、
モンゴメリ乗算のパラメータ値と前記第１積和演算部により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算部と、
前記第２変数と前記除数データとの積を前記第１積和演算部により更新された前記第１変数に加算する第２積和演算部と、
前記第２積和演算部により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト部と、
前記シフト部により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト部により更新された前記第１変数が前記除数データより小さい場合、前記シフト部により更新された前記第１変数を出力する調整部とを備えている
ことを特徴とする演算回路。
（付記５）
ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算を実行する演算方法であって、
前記第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、
ｋビットの前記ブロックを前記第２データの最下位ビット側から順に選択する選択処理を実行し、
前記入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、
ｇ個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する
ことを特徴とする演算方法。
（付記６）
付記５に記載の演算方法において、
前記演算処理は、
前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算する第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積に基づいて第２変数を算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数をビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含み、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記パラメータ値と前記第１変数との積の下位ｋビットに対応する値を前記第２変数として算出する前記乗算処理を実行し、前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトする前記シフト処理を実行し、
ｇ個目の前記ブロックに対する前記演算処理では、前記パラメータ値と前記第１変数との積の下位ｈビットに対応する値を前記第２変数として算出する前記乗算処理を実行し、前記第２積和演算により更新された前記第１変数を最下位ビット側にｈビットシフトする前記シフト処理を実行する
ことを特徴とする演算方法。
（付記７）
付記５に記載の演算方法において、
前記演算処理は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データおよび前記ブロックの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値と前記第１データおよび前記ブロックの他方との積を、（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数を最上位ビット側に（ｋ−ｈ）ビットシフトした値に加算する第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含んでいる
ことを特徴とする演算方法。
（付記８）
付記５に記載の演算方法において、
前記演算処理は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数に加算し、積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトする第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含んでいる
ことを特徴とする演算方法。
（付記９）
ｎビット（ｎは正の整数）で表される除数データを法とし、第１データおよび第２データを入力データとするモンゴメリ乗算をコンピュータに実行させる演算プログラムであって、
前記第２データをｋビット単位（ｋはｎ以下の正の整数）でｇ個（ｇはｋ・（ｇ−１）＜ｎ≦ｋ・ｇを満たす整数）のブロックに分割し、
ｋビットの前記ブロックを前記第２データの最下位ビット側から順に選択する選択処理を実行し、
前記入力データの少なくとも１つを一定サイズのブロックに分割して処理するモンゴメリ乗算の演算処理を前記ブロック毎に実行し、
ｇ個目の前記ブロックに対する前記演算処理の結果が前記入力データを分割しないときのモンゴメリ乗算の結果と同じ結果になるように、ｇ個目の前記ブロックに対する前記演算処理では、前記除数データを最下位ビット側からｋビット単位でグループ分けしたときの最上位ビット側の最後のグループのビット数ｈ（ｈはｈ＝ｎ−ｋ・（ｇ−１）で表される整数）に基づくビット操作を実行する
処理をコンピュータに実行させることを特徴とする演算プログラム。
（付記１０）
付記９に記載の演算プログラムにおいて、
前記演算処理は、
前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算する第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積に基づいて第２変数を算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数をビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含み、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記パラメータ値と前記第１変数との積の下位ｋビットに対応する値を前記第２変数として算出する前記乗算処理と、前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトする前記シフト処理とをコンピュータに実行させ、
ｇ個目の前記ブロックに対する前記演算処理では、前記パラメータ値と前記第１変数との積の下位ｈビットに対応する値を前記第２変数として算出する前記乗算処理と、前記第２積和演算により更新された前記第１変数を最下位ビット側にｈビットシフトする前記シフト処理とをコンピュータに実行させる
ことを特徴とする演算プログラム。
（付記１１）
付記９に記載の演算プログラムにおいて、
前記演算処理は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データおよび前記ブロックの一方を最上位ビット側に（ｋ−ｈ）ビットシフトした値と前記第１データおよび前記ブロックの他方との積を、（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数を最上位ビット側に（ｋ−ｈ）ビットシフトした値に加算する第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含んでいる
ことを特徴とする演算プログラム。
（付記１２）
付記９に記載の演算プログラムにおいて、
前記演算処理は、
（ｇ−１）個目までの前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を第１変数に加算し、ｇ個目の前記ブロックに対する前記演算処理では、前記第１データと前記選択処理により選択された前記ブロックとの積を（ｇ−１）個目の前記ブロックに対する前記演算処理の終了時点の前記第１変数に加算し、積和演算の結果を最上位ビット側に（ｋ−ｈ）ビットシフトする第１積和演算と、
モンゴメリ乗算のパラメータ値と前記第１積和演算により更新された前記第１変数との積の下位ｋビットに対応する値を第２変数として算出する乗算処理と、
前記第２変数と前記除数データとの積を前記第１積和演算により更新された前記第１変数に加算する第２積和演算と、
前記第２積和演算により更新された前記第１変数を最下位ビット側にｋビットシフトするシフト処理と、
前記シフト処理により更新された前記第１変数が前記除数データ以上の場合、前記第１変数から前記除数データを減算した値を前記第１変数として出力し、前記シフト処理により更新された前記第１変数が前記除数データより小さい場合、前記シフト処理により更新された前記第１変数を出力する調整処理とを含んでいる
ことを特徴とする演算プログラム。
【０２０４】
以上の詳細な説明により、実施形態の特徴点および利点は明らかになるであろう。これは、特許請求の範囲がその精神および権利範囲を逸脱しない範囲で前述のような実施形態の特徴点および利点にまで及ぶことを意図するものである。また、当該技術分野において通常の知識を有する者であれば、あらゆる改良および変更に容易に想到できるはずである。したがって、発明性を有する実施形態の範囲を前述したものに限定する意図はなく、実施形態に開示された範囲に含まれる適当な改良物および均等物に拠ることも可能である。
【符号の説明】
【０２０５】
ＡＣＩＲ、ＡＣＩＲ２‥演算回路；ＣＡＬ、ＣＡＬ２‥演算部；ＣＴＬ‥制御部；ＭＡＣ１、ＭＡＣ２‥積和演算回路；ＬＳＨＴ１−ＬＳＨＴ３、ＬＳＨＴ２ａ、ＬＳＨＴ３ａ‥左シフト部；ＭＳＫ１、ＭＳＫ２‥ビットマスク部；ＭＵＬＴ‥乗算回路；ＲＳＨＴｋ、ＲＳＨＴｈ‥右シフト部；ＳＥＬ１−ＳＥＬ８、ＳＥＬ５ａ、ＳＥＬ７ａ、ＳＥＬ８ａ、ＳＥＬａ、ＳＥＬｂ、ＳＥＬｃ、ＳＥＬｄ‥選択部；ＳＵＢ‥減算回路
【図１】
2015068880.tif 000006
【図２】
2015068880.tif 000007
【図３】
2015068880.tif 000008
【図４】
2015068880.tif 000009
【図５】
2015068880.tif 000010
【図６】
2015068880.tif 000011
【図７】
2015068880.tif 000012
【図８】
2015068880.tif 000013
【図９】
2015068880.tif 000014
【図１０】
2015068880.tif 000015
【図１１】
2015068880.tif 000016
【図１２】
2015068880.tif 000017
【図１３】
2015068880.tif 000018
【図１４】
2015068880.tif 000019
【図１５】
2015068880.tif 000020
【図１６】
2015068880.tif 000021