(57)【要約】必要な反復回数が奇数モジュロ値Ｎのビット数ｎよりも多い、第１の整数値Ａと第２の整数値Ｂとの非縮減および拡張モンゴメリ乗算を使用して乗算演算を含むモジュラ算術計算を行う方法。この方法は、ｎ＋２ビット値（Ｘ）をその内容に加えることができ、その内容２を２で割ることができる累算装置に、ｎ＋２ビットの値（Ｓ）を格納するステップを含む。所望の場合は、累算装置の内容をゼロ値に設定する。各反復において前記第１の整数値Ａの値からその最下位ビットより開始して順次に１ビットを選択しながら、累算装置の内容Ｓに、選択されたビットと第２の整数値Ｂとの積を加算するステップと、その結果の内容に、その時点での最下位ビットとＮとの積を加算するステップと、その結果を２で割るステップと、毎回直前の結果（Ｓ）を使用してこれらのステップをさらにｓ−１回反復することによって非縮減および拡張モンゴメリ乗算結果を得るステップとを、少なくともｓ（＞ｎ＋１）回行う。
2004534266.tif 000002
【特許請求の範囲】
【請求項１】
必要な反復回数が奇数モジュロ値Ｎのビット数ｎよりも多い、第１の整数値Ａと第２の整数値Ｂとの非縮減および拡張モンゴメリ乗算を使用して乗算演算を含むモジュラ算術計算を行う方法であって、
ａ）ｎ＋２ビット値を格納し、その内容（Ｓ＋Ｘ→Ｓ）にｎ＋２ビット値（Ｘ）を加算し、その内容を２（Ｓ／２→Ｓ）で割ることができる累算装置（Ｓ）を設けるステップと、
ｂ）所望の場合には、装置の内容をゼロ値（「０」→Ｓ）に設定し、前記装置において少なくともｓ（＞ｎ＋１）回の反復を行い、各反復において前記第１の整数値Ａの値（ＡI；０≦Ｉ≦ｓ−１）から、その最下位ビット（Ａ0）から開始して１ビットを順次選択するステップとを含み、
ステップｂ）が
ｂ．１）前記装置Ｓの内容に選択された前記ビットＡIと前記第２の整数値Ｂとの積を加算する（Ｓ＋ＡI＊Ｂ→Ｓ）ステップと、
ｂ．２）前記装置の前記結果の内容に、その時点での最下位ビットＳ0とＮとの積を加算する（Ｓ＋Ｓ0＊Ｎ→Ｓ）ステップと、
ｂ．３）前記装置の前記結果の内容を２で割る（Ｓ／２→Ｓ）ステップと、
ｂ．４）反復のたびにその前の結果（Ｓ）を使用してステップｂ．１）ないしステップｂ．３）をさらにｓ−１回反復することによって非縮減および拡張モンゴメリ乗算結果を得るステップとを含む方法。
【請求項２】
ａ）前記モジュロ値Ｎを格納する第１の記憶装置（Ｒ２）を設け、
ｂ）前記第２の整数Ｂの値を格納する第２の記憶装置（Ｒ０）を設け、
ｃ）前記モジュロＮと前記第２の整数値Ｂとの和を格納する第３の記憶装置（Ｒ１）を設け、
ｄ）前記第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置からのそれぞれ第１（Ｉｎ１）、第２（Ｉｎ２）、および第３（Ｉｎ３）の入力を有し、追加のゼロ入力（Ｉｎ０）を有し、第１（Ｃ１）および第２（Ｃ０）の制御入力を受け取るアービトレーション装置であって、
ｄ．１）その第１（Ｃ１）および第２（Ｃ０）の制御入力がゼロの場合に、前記追加のゼロ入力（Ｉｎ０）を選択するステップと、
ｄ．２）その第１の制御入力（Ｃ１）が１で、その第２の制御入力（Ｃ０）がゼロの場合に、その第２の入力（Ｉｎ２）を選択するステップと、
ｄ．３）その第１の制御入力（Ｃ１）がゼロで、その第２の制御入力（Ｃ０）が１の場合に、その第１の入力（Ｉｎ１）を選択するステップと、
ｄ．４）その第１の制御入力（Ｃ１）と第２の制御入力（Ｃ０）とが１の場合に、前記第３の入力（Ｉｎ３）を選択するステップとに従って、他の入力の１つをその出力として選択することができ、
選択された前記入力が、前記累算装置の入力に接続されたアービトレーション回路の出力として供給されるアービトレーション回路を設け、
ｅ）前記第１の整数値Ａのビット（Ａ1；０≦Ｉ≦ｓ）を、その最下位ビット（Ａ0）から開始して順次に１ビットずつ、前記第１の制御入力（Ｃ１）に適用し、
ｆ）前記第１の整数値の選択されたビット（ＡI）の状態と、前記第２の整数値の最下位ビット（Ｂ0）の状態と、前記累算装置の最下位ビット（Ｓ0）の状態とに応じて前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路を設けることによって、ステップｂ．１）ないしステップｂ．３）を単一のステップに統合することにより前記モンゴメリ乗算結果が得られる、請求項１に記載の方法。
【請求項３】
前記第２の制御入力（Ｃ０）の状態（ＫI）が、
ａ）
ａ．１）前記第１の制御入力（Ｃ１）の状態と前記第２の整数値の最下位ビット（Ｂ0）の状態が１であって前記累算装置の最下位ビット（Ｓ0）の状態がゼロである場合か、
ａ．２）前記第１の制御入力（Ｃ１）の状態と前記第２の整数値Ｂの最下位ビット（Ｂ0）の状態とが異なる状態であり、前記累算装置の最下位ビット（Ｓ0）の状態が１である場合に、値１（ＫI＝「１」）を生成するステップと、
ｂ）それ以外の場合にゼロ値（ＫI＝「０」）を生成するステップとを行うことによって、前記第２の制御入力（Ｃ０）の状態（ＫI）が生成される、請求項２に記載の方法。
【請求項４】
前記第２の制御入力（Ｃ０）の状態を生成するための使用される前記回路が、論理ＡＮＤゲートと論理ＸＯＲゲートとを含み、前記論理ＡＮＤゲートの入力が前記第１の制御入力（Ｃ１）の状態と前記第２の整数値Ｂの最下位ビット（Ｂ0）の状態とを受け取り、前記論理ＸＯＲゲートの入力が前記論理ＡＮＤゲートからの出力と前記累算装置の最下位ビット（Ｓ0）の状態とを受け取り、前記論理ＸＯＲゲートの出力が前記第２の制御入力（Ｃ０）の状態として使用される、請求項３に記載の方法。
【請求項５】
前記モンゴメリ乗算を行うために使用される反復回数ｓがｎ＋２であり、それによってｎ＋２回の反復が行われる拡張モンゴメリ乗算結果が得られる、請求項１または２に記載の方法。
【請求項６】
ａ）最上位ビット位置への直列入力を有するとともに、内容の並列出力も可能なｎ＋２ビットのシフト・レジスタを、前記第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置として使用するステップと、
ｂ）前記第１の記憶装置（Ｒ２）にその最下位ビット位置（Ｒ２0）からの直列出力を設け、周期的ビット・ローテーションを行うことができるようにするステップと、
ｃ）前記第２の記憶装置（Ｒ０）がその直列入力で前記累算装置の最下位ビット（Ｓ0）を受け取ることができるようにするステップと、
ｄ）その内容をその最下位ビット（Ｒ３0）から開始して順次に１ビットずつ（Ｒ３I；  Ｉ＝０，１，２，．．．，ｎ＋１）並列出力することができ、ｎ＋２ビットを格納することができ、その内容に対して周期的ビット・ローテーションを行うことができる第４の記憶装置（Ｒ３）を設けるステップと、
ｅ）直列入力と直列出力とを有し、ｎ＋２ビットの値を格納することができる第５の記憶装置（Ｒ４）を設けるステップと、
ｆ）その内容をその最下位ビットから開始して順次に１ビットずつ（Ｒ５I  Ｉ＝０，１，２，．．．，ｎ＋１）並列出力することができ、ｎ＋２ビットを格納することができる第６の記憶装置（Ｒ５）を設けるステップと、
ｇ）前記第５の記憶装置からの第１の入力（Ｒ４I）と、前記第２の制御入力の状態（ＫI）を生成する前記回路からの第２の入力とを有し、出力が前記第２の制御入力（Ｃ０）に接続された第１のアービトレーション装置（ＭＸ１）を設けるステップと、
ｈ）前記累算装置の最下位ビット（Ｓ0）と等しい第１の入力と、前記回路の出力から受け取る第２の入力（ＫI）と、前記第５の記憶装置（Ｒ４）の前記直列出力に接続された第３の入力（Ｒ４I）とを有し、出力が前記第５の記憶装置（Ｒ４）の前記直列入力に接続された第２のアービトレーション装置（ＭＸ２）を設けるステップと、
ｉ）常にゼロ値（「０」）が供給される第１の入力と、前記第５の記憶装置の直列出力から受け取る第２の入力（Ｒ４I）とを有し、出力が前記累算装置の直列入力に接続された第３のアービトレーション装置（ＭＸ３）を設けるステップと、
ｊ）前記第６の記憶装置の直列出力に接続された第１の入力（Ｒ５I）と前記第４の記憶装置の直列出力に接続された第２の入力（Ｒ３I）とを有し、出力が前記第１の制御入力（Ｃ１）に接続された第４のアービトレーション装置（ＭＸ４）を設けるステップと、
ｋ）ｎ＋２ビット値の直列加算を行うことができ、前記累算装置の最下位ビット位置からの第１の入力（Ｓ0）と、前記第１の記憶装置（Ｒ２）の直列出力からの第２の入力とを受け取り、出力が前記第３の記憶装置（Ｒ１）の直列入力に接続された、加算器を設けるステップとを実行することによって、モジュラ算術演算を行うことができるようにするステップをさらに含む、請求項２に記載の方法。
【請求項７】
前記累算装置が、各段が第１および第２のフリップフロップ装置と、３個の入力を有する全加算器装置とから成るｎ＋２段の加算およびラッチ段から成り、第１段目の段からは前記第２のフリップフロップが省かれている方法であって、
ａ）前記全加算器の第１の入力を第１のフリップフロップ装置の出力に接続するステップと、
ｂ）前記全加算器の第２の入力を後続の加算およびラッチ段の第２のフリップフロップ装置の出力に接続するステップと、
ｃ）前記全加算器の第３の入力を前記アービトレーション装置のそれぞれのビット出力（ＭＵＸi  ０≦ｉ≦ｎ＋１）に接続するステップとを含む、請求項６に記載の方法。
【請求項８】
ａ）（ｎ＋１）段目の加算およびラッチ段に第１および第２の半加算器装置と第３のフリップフロップ装置とを設けるステップと、
ｂ）前記第１のフリップフロップ装置の入力を前記第２の半加算器の和出力に接続するステップと、
ｃ）前記第２のフリップフロップ装置の入力を前記第２の半加算器の桁上げ出力に接続し、前記フリップフロップ装置の出力を、（ｎ＋２）段目の加算およびラッチ段の前記全加算器の第２の入力に接続するステップと、
ｄ）前記第２の半加算器の第１の入力を（ｎ＋１）段目の加算およびラッチ段の前記全加算器の桁上げ出力に接続し、その第２の入力を前記第１の半加算器の桁上げ出力に接続するステップと、
ｅ）前記第１の半加算器の第１の入力を前記全加算器の和出力に接続し、前記第２の半加算器の第２の入力を前記第３のアービトレーション装置（ＭＸ３）の出力に接続するステップと、
ｆ）前記第３のフリップフロップ装置の入力を前記第１の半加算器の和出力に接続し、その出力を（ｎ−１）段目の加算およびラッチ段の前記全加算器の第２の入力に接続するステップとを行うことによって、前記累算装置の直列入力を介して前記第３のアービトレーション装置（ＭＸ３）から出力を（ｎ＋１）段目の加算およびラッチ段の加算結果に加算するステップをさらに含む、請求項７に記載の方法。
【請求項９】
前記第２の制御入力（Ｃ０）の状態が、前記第２の記憶装置（Ｒ０）の最下位ビットと、前記第４のアービトレーション装置（ＭＸ４）の出力と、前記第１段目の加算およびラッチ段の前記全加算器の桁上げ出力と、第２段目の加算およびラッチ段の全加算器の和出力とを使用して判断され、前記方法が、
ａ）前記第２の記憶装置（Ｒ０）の最下位ビットと前記第４のアービトレーション装置（ＭＸ４）の出力とをＡＮＤ論理ゲートの入力に接続するステップと、
ｂ）追加の半加算器と追加のフリップフロップ装置とを設けるステップと、
ｃ）前記半加算器の第１の入力を、前記第２段目の加算およびラッチ段の前記全加算器の和出力に接続し、その第２の入力を前記第１段目の加算およびラッチ段の前記全加算器の桁上げ出力に接続するステップと、
ｄ）前記半加算器の和出力を前記追加のフリップフロップ装置の入力に接続するステップと、
ｅ）前記ＡＮＤ論理ゲートの出力と前記フリップフロップ装置の出力とをＸＯＲゲートの入力に接続し、前記ＸＯＲゲートの出力を使用して前記第２の制御入力（Ｃ０）の状態を判断するステップとを含む、請求項３および８に記載の方法。
【請求項１０】
ａ）前記第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置に、それぞれ、前記モジュラスＮの値と、前記整数Ｂの値と、前記モジュラスと前記整数との和（Ｎ＋Ｂ）の値とをロードするステップと、
ｂ）前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、前記ゼロ値（「０」）の入力、および前記第６の記憶装置（Ｒ５）の出力の入力をそれぞれ選択するように、前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を設定するステップと、
ｃ）前記第６の記憶装置（Ｒ５）の内容に前記第２の記憶装置（Ｒ０）の内容をロードし、前記累算装置の内容にゼロ値をロードするステップと、
ｄ）各サイクルで前記第６の記憶装置（Ｒ５）の内容が１ビットずつ右にシフトされる非縮減および拡張モンゴメリ乗算を行うステップと、
ｅ）前記累算装置において非縮減モンゴメリ自乗の結果を得るステップとを行うことによって、整数値Ｂの非縮減モンゴメリ自乗を行うステップをさらに含む、請求項９に記載の方法。
【請求項１１】
ａ）前記第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、前記モジュラスＮの値と、前記第２の整数（Ｂ）の値と、前記モジュラスと前記第２の整数との和（Ｎ＋Ｂ）の値と、前記第１の整数（Ａ）の値とをロードするステップと、
ｂ）前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する前記回路の入力、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する前記回路の入力、前記ゼロ値（「０」）の入力、および前記第４の記憶装置（Ｒ３）の出力の入力をそれぞれ選択するように、前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を設定するステップと、
ｃ）前記累算装置の内容にゼロ値をロードするステップと、
ｄ）各サイクルで前記第４の記憶装置（Ｒ３）の内容が右に１ビットずつシフトされる非縮減および拡張モンゴメリ乗算を行うステップと、
ｅ）前記累算装置において前記非縮減モンゴメリ乗算の結果を得るステップとを行うことによって、第１（Ａ）と第２（Ｂ）の整数値のモンゴメリ乗算を行うステップをさらに含む、請求項９に記載の方法。
【請求項１２】
モジュラべき乗計算ＡE  ｍｏｄＮを行うステップをさらに含み、モジュラべき乗計算は、
ａ）調整されたオペランド値Ａ’＝Ａ＊２s  ｍｏｄＮを事前計算するステップと、
ｂ）ビット順序を逆転させ、最上位ビットｅm-1を削除して調整された値Ｅ’（ｅ0，ｅ1，．．．，ｅm-2）2を得ることによって、指数Ｅ＝（ｅm-1，ｅm-2，．．．，ｅ1，ｅ0）2の調整された値を構成するステップと、
ｃ）前記第１、第２、第３、および第５の記憶装置の内容に、それぞれ、前記モジュラスＮの値、調整された前記オペランド（Ａ’）の値、前記モジュラスと前記調整されたオペランドとの和（Ｎ＋Ａ’）の値、および調整された前記指数値Ｅ’をロードし、前記指数値Ｅのビット長ｍを求め、
ｃ．１）前記第５の記憶装置（Ｒ４）の内容を右シフトするステップと、
ｃ．２）非縮減モンゴメリ自乗を行って前記累算装置において前記第３の記憶装置（Ｒ３）の内容の非縮減モンゴメリ自乗を得るステップと、
ｃ．３）前記第３の記憶装置（Ｒ３）の内容に前記累算装置の内容をロードするステップと、
ｃ．４）前記第３の記憶装置（Ｒ１）の内容に前記第１の記憶装置（Ｒ２）の内容と前記累算装置の内容の和をロードするステップと、
ｃ．５）前記第５の記憶装置の最下位ビット（Ｒ４0）が「１」の場合、非縮減および拡張モンゴメリ乗算を行って前記第２の記憶装置（Ｒ０）の内容と前記第４の記憶装置（Ｒ３）の内容との非縮減モンゴメリ乗算結果を前記累算装置で得て、前記第２の記憶装置（Ｒ０）の内容に前記累算装置の内容をロードし、前記第３の記憶装置（Ｒ１）の内容に前記第１の記憶装置（Ｒ２）の内容と前記累算装置の内容との和をロードするステップと、
ｃ．６）ステップｃ．１）ないしステップｃ．５）をさらにｍ−２回反復するステップとを行うステップと、
ｄ）前記第２の記憶装置（Ｒ０）の内容に１を乗じる縮減および拡張モンゴメリ乗算を行って前記累算装置で最終縮減結果を得るステップとを含む、請求項９に記載の方法。
【請求項１３】
ａ）調整されたオペランド値Ａ’＝Ａ＊２s  ｍｏｄＮを事前計算するステップと、
ｂ）第１（Ｒ２）、第２（Ｒ０），第３（Ｒ１）、および第５（Ｒ４）の記憶装置に、前記モジュラスＮの値、調整された前記オペランド（Ａ’）の値、前記モジュラスと調整された前記オペランドとの和（Ｎ＋Ａ’）、および前記指数値Ｅの内容をロードし、前記指数値値Ｅのビット長ｍを求め、フラグを「１」に設定して、
ｂ．１）前記第５の記憶装置（Ｒ４）の内容を右シフトするステップと、
ｂ．２）前記第５の記憶装置の最下位ビット（Ｒ４0）が「１」の場合、前記フラグの状態を調べ、前記フラグが「１」でない場合は、非縮減および拡張モンゴメリ乗算を行って前記第２の記憶装置（Ｒ０）と前記第４の記憶装置（Ｒ３）の内容の非縮約および拡張モンゴメリ乗算結果を前記累算装置で得て、前記第４に記憶装置（Ｒ３）の内容に前記累算装置の内容をロードし、それ以外の場合は、前記第４の記憶装置（Ｒ３）の内容に前記第２の記憶装置（Ｒ０）の内容をロードし、前記フラグの状態を「０」にリセットするステップと、
ｂ．３）拡張および非縮減モンゴメリ自乗を行って前記累算装置で前記第２の記憶装置（Ｒ０）の内容の拡張および非縮減モンゴメリ自乗を求めるステップと、
ｂ．４）前記第２の記憶装置（Ｒ０）の内容に前記累算装置の内容をロードするステップと、
ｂ．５）前記第３の記憶装置（Ｒ１）の内容に前記第１の記憶装置の内容と前記累算装置の内容との和をロードするステップと、
ｂ．６）ステップｂ．１）ないしステップｂ．５）をｍ−１回反復するステップとを行うステップと、
ｃ）拡張および非縮減モンゴメリ乗算を行って、前記累算装置で前記第２の記憶装置（Ｒ０）の内容と前記第４の記憶装置（Ｒ３）の内容との拡張および非縮減モンゴメリ乗算結果を求め、前記第２の記憶装置（Ｒ０）の内容に前記累算装置の内容をロードし、前記第３の記憶装置（Ｒ１）の内容に前記第１の記憶装置（Ｒ２）の内容と前記累算装置の内容との和をロードし、前記第２の記憶装置（Ｒ０）の内容に１を乗じる拡張および非縮減モンゴメリ乗算を行って前記累算装置で最終縮減結果を得るステップとを行うことによって、モジュラべき乗ＡE  ｍｏｄＮを行うステップをさらに含む、請求項９に記載の方法。
【請求項１４】
ａ）
ａ．１）前記第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、前記モジュラス値（Ｎ）のｎ個の最下位ビット（Ｎ0）、前記第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）、前記モジュラス値（Ｎ）のｎ個の最下位ビットと前記第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）の和（Ｂ0＋Ｎ0）、および前記第１の整数値（Ａ）のｎ個の最下位ビット（Ａ0）をロードするステップと、
ａ．２）前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する前記回路の入力、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、ゼロ値（「０」）、および前記第４の記憶装置（Ｒ３）の入力を選択するように設定し、必要であれば前記累算装置の内容をゼロにリセットするステップと、
ａ．３）モンゴメリ乗算を行い、その結果を（Ｓ(I)）を前記累算装置で得て、前記第２の制御入力のビット状態（ＫI  ０≦１≦ｎ−１）（Ｋ0）を第５のレジスタ（Ｒ４）で得るステップとを行うことによって、前記第１の整数値のｎ個の最下位ビット（Ａ0）と前記第２の整数値のｎ個の最下位ビット（Ｂ0）のモンゴメリ乗算（ＭＭＵＬ（Ａ0，Ｂ0）を計算するステップと、
ｂ）
ｂ．１）前記第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、前記モジュラス値（Ｎ）のｎ個の最上位ビット（Ｎ1）、前記第２の整数値（Ｂ）のｎ個の最上位ビット（Ｂ1）、前記モジュラス値（Ｎ）のｎ個の最上位ビットと前記第２の整数値（Ｂ）のｎ個の最上位ビットとの和（Ｂ1＋Ｎ1）、前記第１の整数値（Ａ）のｎ個の最下位ビット（Ａ0）をロードするステップと、
ｂ．２）前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、前記第５のレジスタ（Ｒ４）の入力、前記累算装置の最下位ビット（Ｓ0）、ゼロ値（「０」）、および前記第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
ｂ．３）前記計算を行い、その結果（Ｓ(II)）の最上位ビットを前記累算装置で、前記結果（Ｒ(4)）の最下位ビットを前記第５の記憶装置で得るステップとを行うことによって、
前記第１の整数値のｎ個の最下位ビット（Ａ0）と、前記第２の整数値のｎ個の最上位ビット（Ｂ1）と、前記モジュラス値のｎ個の最上位ビット（Ｎ1）と、前記第５のレジスタ（Ｒ４）で得たｎビット値（Ｋ0）と、ステップａ）で得た前記結果（Ｓ(I)）とのＡ0＊Ｂ1＋Ｎ1＊Ｋ0＋Ｓ(I)の値を計算するステップと、
ｃ）
ｃ．１）前記第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ前記モジュラス値（Ｎ）のｎ個の最下位ビット（Ｎ0）、前記第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）、前記モジュラス値（Ｎ）のｎ個の最下位ビットと前記第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）との和（Ｂ0＋Ｎ0）、および前記第１の整数値（Ａ）のｎ個の最上位ビット（Ａ1）をロードするステップと、
ｃ．２）前記累算装置（Ｓ）の内容にステップｂ）で得た前記結果（Ｒ４(II)）のｎ個の最下位ビットをロードし、前記第５の記憶装置（Ｒ４）の内容にステップｂ）で得た結果（Ｓ(II)）のｎ個の最上位ビットをロードするステップと、
ｃ．３）前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する前記回路の入力、前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する前記回路の入力、前記第５の記憶装置（Ｒ４）からの入力、および前記第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
ｃ．４）モンゴメリ乗算を行い、その結果（Ｓ(III)）を前記累算装置で得て、前記第２の制御入力ビットの状態（ＫI  ０≦Ｉ≦ｎ−１）（Ｋ1）を前記第５のレジスタ（Ｒ４）で得るステップとを行うことによって、前記第１の整数値のｎ個の最上位ビット（Ａ1）と、前記第２の整数値のｎ個の最下位ビット（Ｂ0）と、ステップｂ）で得た結果（Ｒ４(II)，Ｓ(II)）とのモンゴメリ乗算の加算の結果を計算するステップと、
ｄ）
ｄ．１）第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、前記モジュラス値（Ｎ）のｎ個の最上位ビット（Ｎ1）、前記第２の整数値（Ｂ）のｎ個の最上位ビット（Ｂ1）、前記モジュラス値（Ｎ）のｎ個の最上位ビットと前記第２の整数値（Ｂ）のｎ個の最上位置ビットとの和（Ｂ1＋Ｎ1）、および前記第１の整数値（Ａ）ｎ個の最上位ビット（Ａ1）をロードするステップと、
ｄ．２）前記第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、前記第５のレジスタ（Ｒ４）の入力、前記累算装置の最下位ビット（Ｓ0）、前記ゼロ値（「０」）、および前記第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
ｄ．３）前記計算を行い、結果（Ｓ(IV)）の最上位ビットを前記累算装置で得、前記結果（Ｒ(IV)）の最下位ビットを前記第５の記憶装置で得るステップとを行うことによって前記第１の整数値のｎ個の最上位ビット（Ａ1）と、前記第２の整数値のｎ個の最上位ビット（Ｂ1）と、前記モジュラス値のｎ個の最上位ビット（Ｎ1）と、前記第５のレジスタ（Ｒ４）で得たｎビット値（Ｋ1）と、ステップｃ）で得た結果（Ｓ(III)）とのＡ1＊Ｂ1＋Ｎ1＊Ｋ1＋Ｓ(III)を計算するステップとを行うことによって、第１の整数と第２の整数とモジュラス（Ｎ）とが２×ｎビットである、第１（Ａ＝Ａ1＊２n＋Ａ0）および第２（Ｂ＝Ｂ1＊２n＋Ｂ0）の整数値のモジュラ乗算を行うステップをさらに含む、請求項９に記載の方法。
【請求項１５】
第１
【数１】
2004534266.tif 000030
と第２
【数２】
2004534266.tif 000031
の整数値のモジュラ乗算を行うステップであって、前記第１の整数、第２の整数、およびモジュラス
【数３】
2004534266.tif 000032
が２×ｎビットを超えてもよく、前記計算を前記第１および第２の整数の２×ｎビットの後続部分の乗算の中間結果を計算することによって行うステップをさらに含む、請求項１４に記載の方法。
【請求項１６】
必要な反復回数（ｓ）がモジュロ値（Ｎ）内のビット数（ｎ）よりも多く、モンゴメリ乗算結果が前記モジュロ値の２倍（２×Ｎ）よりも小さい、第１（Ａ）と第２（Ｂ）の整数値の拡張および非縮減モンゴメリ乗算を行う装置であって、
ａ）前記モジュロ値（Ｎ）を格納する第１の記憶装置（Ｒ２）と、
ｂ）前記第１の整数値（Ａ）を格納する第２の記憶装置（Ｒ０）と、
ｃ）前記第１の整数値と前記モジュロとの和（Ａ＋Ｎ）を格納する第３の記憶装置（Ｒ１）と、
ｄ）前記第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置からの第１（Ｉｎ１）、第２（Ｉｎ２）、および第３（Ｉｎ３）の入力を有し、ゼロ（「０」）である第４の入力を有し、第１（Ｃ１）および第２（Ｃ０）の制御入力を受け取り、それによって他の入力の１つをその出力として選択することができ、累算装置の入力に接続された、アービトレーション回路と、
ｅ）前記第１の整数値の選択されたビット（ＡI）の状態と、前記第２の整数値の最下位ビット（Ｂ0）の状態と、前記累算装置の最下位ビット（Ｓ0）の状態とに応じて前記第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路と、
ｆ）ｎ＋２ビットの値を格納し、その内容にｎ＋２ビットの値（Ｘ）を加算し（Ｓ＋Ｘ→Ｓ）、その内容を２で割る（Ｓ／２→２）ことができる、累算装置（Ｓ）とを含む装置。
【請求項１７】
前記第２の制御入力の状態（ＫI）を生成するために使用される前記回路が、
選択された前記ビット（ＡI）の状態と前記第２の整数の最下位ビット（Ｂ0）の状態とが１で、前記累算装置の最下位ビット（Ｓ0）の状態がゼロの場合、または
選択された前記ビット（ＡI）の状態と前記第２の整数値の最下位ビット（Ｂ0）の状態とが異なる状態であり、前記累算装置の最下位ビット（Ｓ0）の状態が１である場合に、値１を生成し、
それ以外のすべての場合に前記回路がゼロ値を生成する、請求項１６に記載の装置。
【請求項１８】
前記第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置が、それぞれの最上位ビット位置への直列入力を有するとともに、内容の並列出力も可能なｎ＋２ビットのシフト・レジスタである、請求項１７に記載の装置。
【請求項１９】
前記第１の記憶装置（Ｒ２）が、最下位ビット位置（Ｒ２0）からの直列出力を有し、周期的ビット・ローテーションを行うことができる、請求項１７に記載の装置。
【請求項２０】
モジュラ算術演算を行うことができるようにする手段をさらに含み、前記手段は、
ａ）前記第２の記憶装置（Ｒ０）の前記直列入力を前記累算装置（Ｓ）の最下位ビット（Ｓ0）に接続する手段と、
ｂ）その内容をその最下位ビット（Ｒ３0）から開始して順次に１ビットずつ（Ｒ３I  Ｉ＝０，１，２，．．．，ｎ＋１）直列出力することができ、ｎ＋２ビットを格納することができ、その内容に対して周期的ビット・ローテーションを行うことができる第４の記憶装置（Ｒ３）と、
ｃ）直列入力と直列出力とを有し、ｎ＋２ビットの値を格納することができる第５の記憶装置（Ｒ４）と、
ｄ）その内容をその最下位ビットから開始して順次に１ビットずつ（Ｒ５I  Ｉ＝０，１，２，．．．，ｎ＋１）直列出力することができ、ｎ＋２ビットを格納することができる第６の記憶装置（Ｒ５）と、
ｅ）前記第５の記憶装置からの第１の入力（Ｒ４I）と、前記第２の制御入力の状態を生成する前記回路からの第２の入力（ＫI）とを有し、出力が前記第２の制御入力（Ｃ０）に接続された、第１のアービトレーション装置（ＭＸ１）と、
ｆ）前記累算装置の最下位ビット（Ｓ0）と等しい第１の入力と、前記回路の出力（ＫI）から受け取る第２の入力と、前記第５の記憶装置（Ｒ４）の直列出力（Ｒ４I）に接続された第３の入力とを有し、出力が前記第５の記憶装置（Ｒ４）の直列入力に接続された、第２のアービトレーション装置（ＭＸ２）と、
ｇ）常にゼロ値（「０」）が供給される第１の入力と、前記第５の記憶装置の直列出力（Ｒ４I）から受け取る第２の入力とを有し、出力が前記累算装置の直列入力に接続された、第３のアービトレーション装置（ＭＸ３）と、
ｈ）前記第６の記憶装置の直列出力（Ｒ５I）に接続された第１の入力と、前記第４の記憶装置の直列出力（Ｒ３I）に接続された第２の入力とを有し、出力が前記第１の制御入力（Ｃ１）に接続された、第４のアービトレーション装置（ＭＸ４）と、
ｉ）ｎ＋２ビット値の直列加算を行うことができ、前記累算装置の最下位ビット位置（Ｓ0）からの第１の入力と、前記第１の記憶装置（Ｒ２）の直列出力からの第２の入力とを受け取り、出力が前記第３の記憶装置（Ｒ１）の直列入力に接続された加算器とを含む、請求項１７、１８、および１９に記載の装置。
【請求項２１】
前記累算装置がｎ＋２段の加算およびラッチ段から成り、前記累算装置が、各段が第１および第２のフリップフロップ装置と、３個の入力を有する全加算器装置とから成り、第１段目の段からは前記第２のフリップフロップ装置が省かれている装置であって、
ａ）前記全加算器の第１の入力を第１のフリップフロップ装置の出力に接続する手段と、
ｂ）前記全加算器の第２の入力を後続の加算およびラッチ段の第２のフリップフロップ装置の出力に接続する手段と、
ｃ）前記全加算器の第３の入力を前記アービトレーション装置のそれぞれのビット出力（ＭＵＸi  ０≦ｉ≦ｎ＋１）に接続する手段とを含む、請求項２０に記載の装置。
【請求項２２】
前記累算装置の直列入力を介して前記第３のアービトレーション装置（ＭＸ３）から出力を（ｎ＋１）段目の加算およびラッチ段の加算結果に加算する手段をさらに含み、前記手段は、
ａ）第１および第２の半加算器装置と第３のフリップフロップ装置と、
ｂ）前記第１のフリップフロップ装置の入力を前記第２の半加算器の和出力に接続する手段と、
ｃ）前記第２のフリップフロップ装置の入力を前記第２の半加算器の桁上げ出力に接続し、前記フリップフロップ装置の出力を、（ｎ＋２）段目の加算およびラッチ段の前記全加算器の第２の入力に接続する手段と、
ｄ）前記第２の半加算器の第１の入力を（ｎ＋１）段目の加算およびラッチ段の前記全加算器の桁上げ出力に接続し、その第２の入力を前記第１の半加算器の桁上げ出力に接続する手段と、
ｅ）前記第１の半加算器の第１の入力を前記全加算器の和出力に接続し、前記第２の半加算器の第２の入力を前記第３のアービトレーション装置（ＭＸ３）の出力に接続する手段と、
ｆ）前記第３のフリップフロップ装置の入力を前記第１の半加算器の和出力に接続し、その出力を（ｎ−１）段目の加算およびラッチ段の前記全加算器の第２の入力に接続する手段と含む、請求項２１に記載の装置。
【請求項２３】
ａ）前記第２の記憶装置（Ｒ０）の最下位ビットと前記第４のアービトレーション装置（ＭＸ４）の出力とをＡＮＤ論理ゲートの入力に接続する手段と、
ｂ）追加の半加算器と追加のフリップフロップ装置と、
ｃ）前記半加算器の第１の入力を、前記第２段目の加算およびラッチ段の前記全加算器の和出力に接続し、その第２の入力を前記第１段目の加算およびラッチ段の前記全加算器の桁上げ出力に接続する手段と、
ｄ）前記半加算器の和出力を前記追加のフリップフロップ装置の入力に接続する手段と、
ｅ）前記ＡＮＤ論理ゲートの出力と前記フリップフロップ装置の出力とをＸＯＲゲートの入力に接続し、前記ＸＯＲゲートの出力を使用して前記第２の制御入力（Ｃ０）の状態を判断する手段とを含み、
前記第２の記憶装置（Ｒ０）の最下位ビットと、前記第４のアービトレーション装置（ＭＸ４）の出力と、前記第１段目の加算およびラッチ段の前記全加算器の桁上げ出力と、第２段目の加算およびラッチ段の全加算器の和出力とを使用して前記第２の制御入力（Ｃ０）の状態を判断する、請求項１７および２２に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェアにおけるモジュラ演算の高速かつ効率的実施の分野に関する。より詳細には、本発明は、モンゴメリ法および簡単な方法を使用してモジュラ乗算やべき乗計算などのモジュラ算術演算を行う方法および装置に関する。
【背景技術】
【０００２】
最近の公開鍵暗号方式（ＰＫＣ）の中核となる演算は、一般に、モジュラ算術関数、具体的にはモジュラべき乗計算の実行に基づいており、ここでモジュラべき乗計算は、基本的に、モジュラ乗算とモジュラ自乗計算のシーケンスに基づく。したがって、モジュラ算術関数を特にハードウェアで高速実行する方法がＰＫＣの実際の実施にとってきわめて重要である。モンゴメリ法は、ある種のモジュラ演算を実行する効率的な方法を提供するが、中でも最も重要なのはモジュラべき乗計算である。この方法の利点は、主としてモジュラべき乗計算のハードウェアによる実施において発揮される。したがって、モンゴメリ法は、たとえばＲＳＡ、デジタル署名規格（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｔｕｒｅ  Ｓｔａｎｄａｒｄ（ＤＳＳ））、ディフィー＝ヘルマン（Ｄｉｆｆｉｅ−Ｈｅｌｌｍａｎ（ＤＦ））鍵交換、楕円曲線暗号システム（Ｅｌｌｉｐｔｉｃ  Ｃｕｒｖｅ  Ｃｒｙｐｔｏｇｒａｐｈｙ（ＥＣＣ））アルゴリズムなどを実施するＰＫＣの実施において広く採用されている（「Ｈａｎｄｂｏｏｋ  ｏｆ  Ａｐｐｌｉｅｄ  Ｃｒｙｐｔｏｇｒａｐｈｙ」Ａｌｆｒｅｄ  Ｊ．  Ｍｅｎｅｚｅｓ、Ｐａｕｌ  Ｃ．  ｖａｎ  Ｏｏｒｓｃｈｏｔ、およびＳｃｏｔｔ  Ａ．  Ｖａｎｓｔｏｎｅ著、ＣＲＣ  Ｐｒｅｓｓ、１９９６年１０月）。
【０００３】
モンゴメリ乗算の定義：ｎビットの整数Ａ、Ｂ、およびＮ（Ｎ＞Ａ、Ｂであり、Ｎは奇数）を想定すると、モンゴメリ乗算ＭＭＵＬ（Ａ，Ｂ，Ｎ，ｎ）、（略してＭＭＵＬ（Ａ，Ｂ）とも記す）は、以下の式で定義される。
【０００４】
【数１】
2004534266.tif 000003
【０００５】
上式により、縮減結果、すなわち０≦ＭＭＵＬ（Ａ，Ｂ）＜Ｎが得られる。
表記法：以下の説明では、ｎビット整数Ａ＝（Ａn-1，．．．，Ａ1，Ａ0）２などの整数値のビットは、Ａi（０≦ｉ≦ｎ−１）という表記を使用して表す。ここで、最上位ビット（ＭＳＢ）Ａn-1は、整数値Ａの左端のビットであり、最下位ビット（ＬＳＢ）Ａ0は右端のビットである。さらに、ｊ番目の反復における所与の変数Ｓの値は、Ｓ(j)で示す。Ａ＊Ｂ  ｍｏｄＮなどのモジュラ結果の表記は、範囲［０，Ｎ）における換算値を示す。
【０００６】
（基数２における）モンゴメリ乗算を計算するアルゴリズムは、以下のステップで行うことができる。
アルゴリズム１
入力：Ａ、Ｂ、Ｎ、ｎ（前提条件：Ａ、Ｂ、ＮはＮ＞Ａを満足するｎビットの整数であり、ＢとＮは奇数である）
出力：ＭＭＵＬ（Ａ，Ｂ）＝Ａ＊Ｂ＊２-n  ｍｏｄＮ
【０００７】
【数２】
2004534266.tif 000004
【０００８】
このアルゴリズムのメイン・ループは、一連の加算（ステップ１．１および１．２）と、２で割る除算（ステップ１．３）のみしか必要としない。ステップ１．４は、本明細書では縮減ステップと呼び、このステップがないとアルゴリズムの出力Ｓが必ずしも縮減されない不可欠のステップである。
【実施例１】
【０００９】
表１に、Ａ＝１８＝（１００１０）2、Ｂ＝１２＝（０１１００）2で、Ｎ＝１９（１００１１）2の場合のＭＭＵＬ（Ａ，Ｂ）を計算するこのプロセスを示す。この例では、ｎ＝５であり、モンゴメリ乗算は、１８＊１２＊２-5  ｍｏｄ１９＝２である。
【００１０】
表１：（前提条件：Ｓ＝０、Ａ＝１８、Ｂ＝１２、およびＮ＝１９）
【００１１】
【表１】
2004534266.tif 000005
【００１２】
ステップ１．４がない場合、このアルゴリズムの出力Ｓは必ずしも［０，Ｎ］の範囲には含まれない。具体的には、Ｓはｎビットより大きくなる可能性がある。したがって、アルゴリズムの出力を［０，Ｎ］の範囲にシフトさせるために、追加的な縮減（Ｓ＝Ｓ−Ｎ）（ステップ１．４）が必要な場合がある。上記の実施例１では、計算結果はＳ＝２１＞Ｎとなり、したがってこの場合、追加の縮減Ｓ＝Ｓ−Ｎ＝２１−１９＝２が必要である。仮定したようにＡ，Ｂ＜Ｎの場合、縮減ステップ（１．４）の前に結果ＳがＮ＋Ｂによって制限されることを（帰納により）示すことができる。したがって、Ｓ＞Ｎの場合、反復ステップ１．１、１．２、および１．３の後に、多くとも１回のみ行われる追加の縮減ステップ１．４（Ｓ＝Ｓ−Ｎ）があれば、最終結果を範囲［０，Ｎ）に縮減するのに十分であり、したがって所望の結果Ｓ＝Ａ＊Ｂ＋２-n  ｍｏｄＮが、実際にこのアルゴリズムの出力となる。
【００１３】
ＭＭＵＬ（Ａ，Ｂ）を求めるこのモンゴメリ乗算アルゴリズムは、正規のモジュラ乗算Ａ＊Ｂ  ｍｏｄＮの計算に使用することができる。これは、以下のステップに示すように、複数の方法で行うことができる。
【００１４】
方法１：
入力：Ａ、Ｂ、Ｎ、Ａ’（Ａ、Ｂ、およびＮはｎビットの整数であり、事前計算値Ａ’＝Ａ＊２n  ｍｏｄＮである。）
出力：Ａ＊Ｂ  ｍｏｄＮ
【００１５】
【数３】
2004534266.tif 000006
【００１６】
たとえば、Ａ＝１８、Ｂ＝１２、Ｎ＝１９で、ｎ＝５の場合、
補助値Ａ’＝１８＊２5  ｍｏｄ１９＝６を事前計算し、次にこれを使用して
Ｔ＝ＭＭＵＬ（Ａ’，Ｂ）＝６＊１２＊２-5  ｍｏｄ１９＝７
を計算する。
【００１７】
方法２：
入力：Ａ、Ｂ、Ｎ、Ａ’、Ｂ’（Ａ、Ｂ、およびＮはｎビットの整数であり、事前計算値Ａ’＝Ａ＊２n  ｍｏｄＮおよびＢ’＝Ｂ＊２n  ｍｏｄＮである。）
出力：Ａ＊Ｂ  ｍｏｄＮ
【００１８】
【数４】
2004534266.tif 000007
【００１９】
たとえば、Ａ＝１８、Ｂ＝１２、Ｎ＝１９でｎ＝５の場合、２つの補助値Ａ’＝１８＊２5  ｍｏｄ１９＝６とＢ’１２＊２5  ｍｏｄ１９＝４を事前計算し、次に、この２つの値を使用して、Ｔ＝ＭＭＵＬ（Ａ’，Ｂ’）＝６＊４＊２-5  ｍｏｄ１９＝１５を求め、最後に以下の式によって結果を求める。
【００２０】
【数５】
2004534266.tif 000008
【００２１】
方法２では、補助値Ａ’およびＢ’を計算する。これにより、整数ＡおよびＢが「モンゴメリ基底」と呼ばれるものに変換される。最初のモンゴメリ乗算を変換された数値に適用すると、以下のようになる。
【００２２】
【数６】
2004534266.tif 000009
【００２３】
これは、ＡおよびＢの正規表現における正規モジュラ乗算に対応する。
２番目の（１を乗ずる）モンゴメリ乗算によって、この結果を元の正規基底表現に変換し戻す。言い換えると、上記の結果であるＴ＝ＭＭＵＬ（Ａ’，Ｂ’）から冗長な２n因子を除去し、それによって以下のような所望の結果が得られる。
【００２４】
【数７】
2004534266.tif 000010
【００２５】
方法１に要する（補助値を計算する）オーバーヘッドは、直接的な手法と較べた場合に、モンゴメリ・アルゴリズムが単一のモジュラ乗算を計算するのに必ずしも有用と見なされない主な理由である。しかし、方法２は、いくつかのモジュラ乗算が必要な場合には効率的に使用することができる。入力をモンゴメリ基底に変換した後、モンゴメリ乗算アルゴリズムを使用してすべての乗算を行い、その結果を、乗算シーケンスの最後に正規基底に変換する。その場合、方法２の演算オーバーヘッドは無視し得るほどであり、モンゴメリ・アルゴリズムによって全体的な演算の効率が相当向上する。最も典型的な例は、方法２とモンゴメリ乗算を使用するモジュラ指数ＡE  ｍｏｄＮ（ｍビットの整数値指数Ｅの場合。ただし、一般性を失わずに、ここではＡ＜Ｎであるものとする）の計算である。べき乗計算の結果は、たとえば以下に述べるようにして求めることができる（左から右に実行される二進べき乗計算）。
【００２６】
アルゴリズム２
入力：Ａ、Ｅ、Ｎ
出力：ＡE  ｍｏｄＮ
【００２７】
【数８】
2004534266.tif 000011
【００２８】
事前計算値Ａ’＝Ａ＊２n  ｍｏｄＮ（０≦Ａ’＜Ｎ）の計算により、入力がモンゴメリ基底に変換され、モンゴメリ乗算と自乗計算（ステップ２．１およびステップ２．２）は、正規基底における左から右に実行される二進べき乗計算を実施する乗算と自乗計算のシーケンスに対応し、その結果は、１を乗じるモンゴメリ乗算（ステップ２．３）によって正規基底に変換し戻される。結果がＮによって確実に制限されるようにするため、アルゴリズム１によって実施される各モンゴメリ乗算の中間ステップにおいて縮減（ステップ１．４）が必要である。この縮減は、後続のモンゴメリ乗算への入力が適切に制限されるように保証するため、このような連鎖アルゴリズムの実施ではきわめて重要である。縮減を行わず、１つの（縮減ステップのない）モンゴメリ乗算の結果がＮを超える場合、それ移行のステップでオーバーフローまたは誤った結果が生じる可能性がある。
【００２９】
モンゴメリ乗算を使用する主な利点は、この乗算演算のハードウェア実施にある。ＭＭＵＬアルゴリズムは、各ステップで、累算結果（上記ステップ１．２のＳ＝Ｓ＋Ｓ0＊Ｎ）のＬＳＢのみしか必要としない。
【００３０】
以下の例で、上述のアルゴリズムを使用して行うべき乗計算を示す。この例では、２１２240  ｍｏｄ２４９＝２４１を求める。
【実施例２】
【００３１】
表２に、ｎビットの値ＡおよびＮとｍビットの値Ｅの場合について、上述のアルゴリズムを使用したＡE  ｍｏｄＮの計算を示す。表２では、前のステップＴ(I+1)で求めた値の後に、ステップ２．１のＴ(I+1)2で得られた結果と、ステップ２．２のＴ(I)で得られた結果が示されている。この例では、Ａ＝２１２、Ｅ＝２４０＝（１１１１００００）2、Ｎ＝２４９である。したがって、Ａはｎ＝８ビット、Ｅはｍ＝８ビットの値であり、必要な事前計算値はＡ’＝２１２＊２8  ｍｏｄ２４９＝２３９である。
【００３２】
表２：（前提条件：Ａ＝２１２、Ｅ＝２４０（１１１１００００）2、Ｎ＝２４９、Ｔ(1)＝Ａ’＝２３９）
【００３３】
【表２】
2004534266.tif 000012
【００３４】
さらに、Ｔ(0)＝ＭＭＵＬ（Ｔ(0)，１）＝１９３＊１＊２-8  ｍｏｄ２４９＝２４１を計算して最終結果を求める。
この例では、モンゴメリ乗算ＭＭＵＬ（Ａ，Ｂ）をモンゴメリ乗算、モンゴメリ自乗、および１を乗じるモンゴメリ乗算の計算に使用する。前述のように、縮減ステップ（１．４）の前では、累算結果はＮより大きくなる可能性があり、モンゴメリ乗算の（適切に縮減された）結果を求めるためには、縮減を行う必要がある。
【００３５】
実施例２では、Ｉ＝６、５、および４の場合について、ＭＭＵＬ（Ｔ(I)，Ａ’）を実行する際と、Ｉ＝１および６の場合についてＭＭＵＬ（Ｔ(I+1)，Ｔ(I+1)）を実行する際に、縮減が必要であった。
【００３６】
縮減を行う必要があるために、特にビット数ｎがきわめて大きい場合（たとえばｎ＝５１２の場合）、このような装置のハードウェア実現はかなり複雑になることに留意されたい。結果がＮを超える場合を検出する専用回路と、適切な減算（すなわち必要な縮減）を行うための専用回路が必要である。
【００３７】
実際の乗算を回避する間接的方法によって実現される整数乗算の効率的な実施が、文献で知られている（たとえばＫ．  Ｈｗａｎｇ，Ｃｏｍｐｕｔｅｒ  Ａｒｉｔｈｍｅｔｉｃ；  Ｐｒｉｎｃｉｐｌｅｓ，Ａｒｃｈｉｔｅｃｔｕｒｅ，ａｎｄ  Ｄｅｓｉｇｎ，Ｗｉｌｌｅｙ，Ｎｅｗ  Ｙｏｒｋ，１９７９年、第５章）。このような方法は、適切に事前選択された数量を連続的に加算して乗算結果を求める。たとえば、値Ｓ＝Ｓ＋Ｍ＊Ａは（ただしＭはｍ＝２ビット長）、積Ｍ＊Ａを直接計算せずに、以下のように、事前記憶された３個の数量を加算するだけで求めることができる。累積器に加算する数量は、Ｍ＝（０，０）、Ｍ＝（０，１）、Ｍ＝（１，０）、Ｍ＝（１，１）という考えられる４通りの場合のうちの１つによって次のように決まる。
【００３８】
Ｍ＝（０，０）の場合、累積器Ｓには何も加算されない。
Ｍ＝（０，１）の場合、累積器Ｓに値Ａを加算する。
Ｍ＝（１，０）の場合、累積器Ｓに値２＊Ａを加算する。
【００３９】
Ｍ＝（１，１）の場合、累積器Ｓに値３＊Ａ＝Ａ＋２＊Ａを加算する。
したがって、適切な場合を特定し（ハードウェアの１：４マルチプレクサ）、それに応じて０、Ａ、２＊Ａ、または３＊Ａのいずれかを累積器に加算することによって、１つの演算で和Ｓ＝Ｓ＋Ｍ＊Ａが得られる。Ａ、２＊Ａ、および３＊Ａの追加の記憶は、それぞれに応じてハードウェア制御を設定する（これには手間がかかる）ことによって省くことができる。すなわち、２＊Ａの加算は、Ａの記憶値をシフトさせてから累積器に供給することによって実現し、３＊Ａの加算は、値Ａを加算し、シフトされたＡの値を累積器に供給することによって実現することができる。
【００４０】
したがって、この演算の最適化には、記憶と速度／ハードウェア要件との兼ね合いを図る必要がある。値Ａ、２＊Ａ、３＊Ａの余分な記憶は、同じ演算を何度も繰り返す場合には有利である。たとえば、Ｓ＝Ｓ＋Ｋ＊Ａ（ただしＫはｋビット長）の計算は反復して行うことができる。（１＋［ｋ／ｍ］）＝（１＋［ｋ／２］）回の反復の各回で、Ｋの次のｍ＝２ビットを走査し、Ｍの暫定値（Ｍのｍビット部分）を定義し、その値を用いて前述の方法を使用する。ビット数ｍは、このような暫定値（Ｍの一部）のビット長を示し、したがって加算結果Ｓ＝Ｓ＋Ｋ＊Ａに対して行う必要がある右シフト数も定義する。類似の方法では、より大きなｍ値、より多くの記憶量またはハードウェア／制御を使用するが、反復回数は少ない（１＋［ｋ／ｍ］）。Ｓ＝Ｓ＋Ｍ＊Ａ＋Ｌ＊Ｂを計算するために累積器に値Ｍ＊Ａ＋Ｌ＊Ｂを加算する場合にも同じ方法を使用することができる。その場合、各反復回におけるｍビットのＭおよびＬの走査で、加算する数量について２2m通りの組合せが生じる。
【００４１】
たとえば、ｍ＝２の場合、加算される数量の２2*2＝１６通りの組合せは、０、Ａ、２＊Ａ、３＊Ａ、Ｂ、２＊Ｂ、３＊Ｂ、Ａ＋Ｂ、Ａ＋２＊Ｂ、Ａ＋３＊Ｂ、２＊Ａ＋Ｂ、２＊（Ａ＋Ｂ）、２＊Ａ＋３＊Ｂ、３＊Ａ＋Ｂ、３＊Ａ＋２＊Ｂ、３＊（Ａ＋Ｂ）となる。記憶値（Ａ＋Ｂ）を使用して２（Ａ＋Ｂ）の加算および／または３（Ａ＋Ｂ）の加算を行うために余分のハードウェア／制御を使用しない限り、１５個の数量の記憶が必要である。ｍ＝１の場合、２2*1＝４通りの組合せ、すなわち、０、Ａ、Ｂ、Ａ＋Ｂがある。ｍ＝１で、４個の整数Ａ、Ｂ、Ｃ、およびＤの乗算および合計演算を行う場合を図１に示す。図１に示す装置は、３個のレジスタＲ０、Ｒ１、およびＲ２と、１：４マルチプレクサ（ＭＵＸ）と、桁上げ保存加算器（ＣＳＡ）とを使用して、Ａ＊Ｂ＋Ｃ＊Ｄ＋Ｇの計算を行う。レジスタＲ０およびＲ２はそれぞれｎビットで、レジスタＲ１はｎ＋１ビットである。各レジスタＲ０、Ｒ１、およびＲ２は、ＭＵＸの入力Ｉｎ２、Ｉｎ３、およびＩｎ１のうちの１つにそれぞれ接続され、ＭＵＸの入力Ｉｎ０には常に「０」値（ｎビット値）が供給される。
【００４２】
マルチプレクサＭＵＸは２つの制御入力Ｃ０およびＣ１を有し、制御入力の各状態について、対応する入力が選択され、ＭＵＸの出力（ｏｕｔ）で出力される。Ａ＊Ｂ＋Ｃ＊Ｄ＋Ｇの計算は、レジスタＲ０、Ｒ１、Ｒ２およびＣＳＡに値Ｄ、Ｂ＋Ｄ、Ｂ、およびＧをそれぞれロードし、ＭＵＸの制御入力Ｃ０およびＣ１を介してそれぞれＡおよびＣのデータ・ビット（ＡIおよびＣI（Ｉ＝０，１，２，．．．，ｎ−１））を順次供給することによって行われる。
【００４３】
ＣＳＡは、ｎ＋２ビットであり、２ビットのオーバーフローが可能であり、それを使用して、ＭＵＸの出力ｏｕｔを介して取り出された、選択された入力（Ｉｎ０、Ｉｎ１、Ｉｎ２、またはＩｎ３）の値が、ＣＳＡのその時点での内容に加算される。この加算の結果はＣＳＡに格納された後、ＣＳＡの内容に対して行われる右シフトが適用される。偶数の２進値のビットを右にシフトすることは、その値を２で割る除算（前述のステップ１．３）に相当する。したがって、このシステムの演算の各サイクルで、以下の演算が行われる。
【００４４】
１）Ｉｎ０、Ｉｎ１、Ｉｎ２、およびｉｎ３のそれぞれの値を選択
２）選択された値をＣＳＡレジスタのその時点での内容に加算
３）ＣＳＡビットの右シフト。これによってＣＳＡのＬＳＢ（すなわちＣＳＡ0）がＣＳＡ0出力に出力される。
【００４５】
ステップ１およびステップ２を実施するために、ＡおよびＣのビットＡIおよびＣI（Ｉ＝０，１，２，．．．，ｎ−１）が、ＬＳＢから先に順次、ＭＵＸの制御入力Ｃ０およびＣ１に供給される。したがって、ＭＵＸの出力ｏｕｔ(I)は、反復Ｉのたびに以下の値のいずれかをとることができる。
【００４６】
【数９】
2004534266.tif 000013
【００４７】
Ａ＊Ｂ＋Ｃ＊Ｄ＋Ｇを計算するプロセスについて、以下の疑似コードを用いて詳述する。
【００４８】
【数１０】
2004534266.tif 000014
【００４９】
ｎ回の反復後、ＣＳＡの内容（ＣＳＡ(n-1)）には計算結果のｎ＋１個の最上位ビット（ＭＳＢ）が格納され、反復中にさらに計算結果のｎ個のＬＳＢがＣＳＡ0出力で得られる。ＣＳＡの内容は、並列出力バス（図示せず）を使用して出力するか、あるいは、ＭＵＸの制御入力をリセット（すなわちＣ０＝Ｃ１＝０に設定する）し、さらにｎ＋１回の追加の反復を行ってＣＳＡ0出力に結果のｎ＋１個のＭＳＢを出力すること（直列手法）によって、出力することができる。直列手法の主な欠点は、時間がかかることである（ＣＳＡの内容を入手するのにｎ＋１サイクルの追加を要する）。一方、並列手法を使用するとパフォーマンスは大幅に向上するが、ハードウェア手段の点でコストが高くつくと考えられる。
【００５０】
特許出願ＷＯ９８／５０８５１号および米国特許出願第６１８５５９６号に記載されているように、モンゴメリ法を適用することによってこの装置を効率的に使用してモンゴメリ乗算が行われる。これらの特許出願では、事前計算済みの定数（Ｊ＝Ｎ-1  ｍｏｄ２n）を使用して、各反復において、Ａ＊Ｂの乗算にモジュラスＮを加える回数Ｙ＝（Ａ＊Ｂ＊Ｊ）ｍｏｄ２nを計算する。この方法は、モンゴメリ・プロセスの各反復回後に、加算結果がモジュラス値Ｎを超えるか否かを検査する必要がある。その場合、結果は２＊Ｎを超えない。したがって、そのような実施方法では、反復回ごとに結果を検査し、モジュラス値を超えた場合には結果からモジュラス値Ｎを減算するための専用ハードウェアを使用する。
【００５１】
当技術分野で周知のようにモンゴメリ法を使用してモジュラ乗算を実施する方法は、主として、出力結果値をＮ未満の値に縮減する必要があるため、時間とハードウェアの両方の点で影響を受ける。さらに、縮減ステップは、（「ｉｆ」文を介した）特定の入力に依存し、この実施方法をサイド・チャネル攻撃にさらされやすくする。したがって、モンゴメリ乗算法は、モジュラべき乗計算などのモジュラ算術演算の効率的なハードウェア実施を可能にはするが、そのような演算のハードウェア実施を改善する必要がある。これは、各モンゴメリ乗算後に繰り返される縮減を必要としない方法および装置を使用して達成することができる。
【発明の開示】
【発明が解決しようとする課題】
【００５２】
本発明の目的は、中間計算結果および最終計算結果が既知の境界を超えず、べき乗計算プロセスに必要なシーケンスなど、修正版モンゴメリ乗算の連鎖シーケンス中に縮減を必要とせず、べき乗計算プロセスの最終結果が自動的に（０とＮの間に）縮減される、モンゴメリ乗算の修正版を実行する方法および装置を提供することである。
【００５３】
本発明の他の目的は、モンゴメリ乗算に基づくか否かを問わず、公開鍵暗号方式のハードウェア実施のために必要な基本演算を含めて、モジュラべき乗計算およびその他のモジュラ算術演算の効率的なハードウェア実施を可能にする方法および装置（本明細書ではＰＫＩ装置とも呼ぶ）を提供することである。
【００５４】
本発明の他の目的は、右から左の実行、左から右の実行、ｍ配列、スライディング・ウィンドウべき乗アルゴリズムなど、様々なモジュラべき乗アルゴリズムの効率的なハードウェア実施を可能にする方法および装置を提供することである。
【００５５】
本発明のさらに他の目的は、非縮減および修正モンゴメリ乗算に基づく、タイミング攻撃に耐えられる安全なＰＫＩのための方法および装置を提供することである。
【課題を解決するための手段】
【００５６】
一態様では、本発明は、必要な反復回数が奇数モジュロ値Ｎのビット数ｎよりも多い、第１の整数値Ａと第２の整数値Ｂとの非縮減および拡張モンゴメリ乗算を使用して乗算演算を含むモジュラ算術計算を行う方法であって、
ａ）ｎ＋２ビット値を格納し、その内容（Ｓ＋Ｘ→Ｓ）にｎ＋２ビット値（Ｘ）を加算し、その内容を２（Ｓ／２→Ｓ）で割ることができる累算装置（Ｓ）を設けるステップと、
ｂ）所望の場合には、該装置の内容をゼロ値（「０」→Ｓ）に設定し、該装置において少なくともｓ（＞ｎ＋１）回の反復を行い、各反復において第１の整数値Ａの値（ＡI；０≦Ｉ≦ｓ−１）から、その最下位ビット（Ａ0）から開始して１ビットを順次選択するステップとを含み、
ステップｂ）が
ｂ．１）該装置Ｓの内容に選択されたビットＡIと第２の整数値Ｂとの積を加算する（Ｓ＋ＡI＊Ｂ→Ｓ）ステップと、
ｂ．２）該装置の結果の内容に、その時点での最下位ビットＳ0とＮとの積を加算する（Ｓ＋Ｓ0＊Ｎ→Ｓ）ステップと、
ｂ．３）該装置の結果の内容を２で割る（Ｓ／２→Ｓ）ステップと、
ｂ．４）反復のたびにその前の結果（Ｓ）を使用してステップｂ．１）ないしステップｂ．３）をさらにｓ−１回反復することによって非縮減および拡張モンゴメリ乗算結果を得るステップとを含む方法を対象とする。
【００５７】
モジュロ値Ｎを格納する第１の記憶装置（Ｒ２）を設け、第２の整数Ｂの値を格納する第２の記憶装置（Ｒ０）を設け、モジュロＮと第２の整数値Ｂとの和を格納する第３の記憶装置（Ｒ１）を設け、第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置からのそれぞれ第１（Ｉｎ１）、第２（Ｉｎ２）、および第３（Ｉｎ３）の入力を有し、追加のゼロ入力（Ｉｎ０）を有し、第１（Ｃ１）および第２（Ｃ０）の制御入力を受け取るアービトレーション回路であって、
その第１（Ｃ１）および第２（Ｃ０）の制御入力がゼロの場合は、追加のゼロ入力（Ｉｎ０）を選択し、
その第１の制御入力（Ｃ１）が１で、その第２の制御入力（Ｃ０）がゼロの場合は、その第２の入力（Ｉｎ２）を選択し、
その第１の制御入力（Ｃ１）がゼロで、その第２の制御入力（Ｃ０）が１の場合は、その第１の入力（Ｉｎ１）を選択し、
その第１の制御入力（Ｃ１）と第２の制御入力（Ｃ０）とが１の場合は、第３の入力（Ｉｎ３）を選択するように、
他の入力の１つをその出力として選択することができ、選択された入力が、累算装置の入力に接続されたアービトレーション回路の出力として供給されるアービトレーション回路とを設けることによって、ステップｂ．１）ないしステップｂ．３）を単一のステップに統合してモンゴメリ乗算結果を得ることができる。この計算は、第１の整数値Ａのビット（Ａ1；０≦Ｉ≦ｓ）を、その最下位ビット（Ａ0）から開始して順次に１ビットずつ、第１の制御入力（Ｃ１）に適用し、第１の整数値の選択されたビット（ＡI）の状態と、第２の整数値の最下位ビット（Ｂ0）の状態と、累算装置の最下位ビット（Ｓ0）の状態とに応じて第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路を設けることによって行われる。
【００５８】
第２の制御入力（Ｃ０）の状態（ＫI）は、第１の制御入力（Ｃ１）の状態と前記第２の整数値の最下位ビット（Ｂ0）の状態が１であって前記累算装置の最下位ビット（Ｓ0）の状態がゼロである場合か、前記第１の制御入力（Ｃ１）の状態と前記第２の整数値Ｂの最下位ビット（Ｂ0）の状態とが異なる状態であり、前記累算装置の最下位ビット（Ｓ0）の状態が１である場合に値１（ＫI＝「１」）を生成し、それ以外の場合には、第２の制御入力（Ｃ０）の状態（ＫI）としてゼロ値（ＫI＝「０」）を生成することによって生成することができる。
【００５９】
第２の制御入力（Ｃ０）の状態は、論理ＡＮＤゲートと論理ＸＯＲゲートとを含み、論理ＡＮＤゲートの入力が第１の制御入力（Ｃ１）の状態と第２の整数値Ｂの最下位ビット（Ｂ0）の状態とを受け取り、論理ＸＯＲゲートの入力が論理ＡＮＤゲートからの出力と累算装置の最下位ビット（Ｓ0）の状態とを受け取り、前記論理ＸＯＲゲートの出力が第２の制御入力（Ｃ０）の状態として使用される回路によって生成することができる。
【００６０】
好ましくは、モンゴメリ乗算を行うために使用される反復回数ｓがｎ＋２であり、それによってｎ＋２回の反復が行われる拡張モンゴメリ乗算の結果を得る。
この方法は、最上位ビット位置への直列入力を有するとともに、内容の並列出力も可能なｎ＋２ビットのシフト・レジスタを、第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置として使用し、第１の記憶装置（Ｒ２）にその最下位ビット位置（Ｒ２0）からの直列出力を設けて、周期的ビット・ローテーションを行うことができるようにし、第２の記憶装置（Ｒ０）がその直列入力で累算装置の最下位ビット（Ｓ0）を受け取ることができるようにし、その内容をその最下位ビット（Ｒ３0）から開始して順次に１ビットずつ（Ｒ３I；  Ｉ＝０，１，２，．．．，ｎ＋１）並列出力することができ、ｎ＋２ビットを格納することができ、その内容に対して周期的ビット・ローテーションを行うことができる第４の記憶装置（Ｒ３）を設け、直列入力と直列出力とを有し、ｎ＋２ビットの値を格納することができる第５の記憶装置（Ｒ４）を設け、その内容をその最下位ビットから開始して順次に１ビットずつ（Ｒ５I  Ｉ＝０，１，２，．．．，ｎ＋１）並列出力することができ、ｎ＋２ビットを格納することができる第６の記憶装置（Ｒ５）を設け、第５の記憶装置からの第１の入力（Ｒ４I）と、第２の制御入力の状態（ＫI）を生成する回路からの第２の入力とを有し、出力が第２の制御入力（Ｃ０）に接続された第１のアービトレーション装置（ＭＸ１）を設け、累算装置の最下位ビット（Ｓ0、および本明細書ではＣＳＡ0も指す）と等しい第１の入力と、回路の出力から受け取る第２の入力（ＫI）と、第５の記憶装置（Ｒ４）の直列出力に接続された第３の入力（Ｒ４I）とを有し、出力が第５の記憶装置（Ｒ４）の直列入力に接続された第２のアービトレーション装置（ＭＸ２）を設け、常にゼロ値（「０」）が供給される第１の入力と、第５の記憶装置の直列出力から受け取る第２の入力（Ｒ４I）とを有し、出力が累算装置の直列入力に接続された第３のアービトレーション装置（ＭＸ３）を設け、第６の記憶装置に接続された第１の入力（Ｒ５I）と第４の記憶装置の直列出力に接続された第２の入力（Ｒ３I）とを有し、出力が第１の制御入力（Ｃ１）に接続された第４のアービトレーション装置（ＭＸ４）を設け、ｎ＋２ビット値の直列加算を行うことができ、累算装置の最下位ビット位置からの第１の入力（Ｓ0）と、第１の記憶装置（Ｒ２）の直列出力からの第２の入力とを受け取り、出力が第３の記憶装置（Ｒ１）の直列入力に接続された、加算器を設けることによって、モジュラ算術演算を行うことができるようにすることをさらに含むことができる。
【００６１】
好ましくは、累算装置は、各段が第１および第２のフリップフロップ装置と、３個の入力を有する全加算器装置とから成るｎ＋２段の加算およびラッチ段から成り、第１段目の段からは第２のフリップフロップ装置が省かれている。各加算およびラッチ段では、全加算器の第１の入力が第１のフリップフロップ装置の出力に接続され、全加算器の第２の入力が後続の加算およびラッチ段の第２のフリップフロップ装置の出力に接続され、全加算器の第３の入力がアービトレーション装置のそれぞれのビット出力（ＭＵＸi  ０≦ｉ≦ｎ＋１）に接続されている。
【００６２】
この方法は、さらに、（ｎ＋１）段目の加算およびラッチ段に第１および第２の半加算器装置と第３のフリップフロップ装置とを設け、第１のフリップフロップ装置の入力を第２の半加算器の和出力に接続し、第２のフリップフロップ装置の入力を第２の半加算器の桁上げ出力に接続し、フリップフロップ装置の出力を、（ｎ＋２）段目の加算およびラッチ段の全加算器の第２の入力に接続し、第２の半加算器の第１の入力を（ｎ＋１）段目の加算およびラッチ段の全加算器の桁上げ出力に接続し、その第２の入力を第１の半加算器の桁上げ出力に接続し、第１の半加算器の第１の入力を全加算器の和出力に接続し、第２の半加算器の第２の入力を第３のアービトレーション装置（ＭＸ３）の出力に接続し、第３のフリップフロップ装置の入力を第１の半加算器の和出力に接続し、その出力を（ｎ−１）段目の加算およびラッチ段の全加算器の第２の入力に接続することによって、累算装置の直列入力を介して第３のアービトレーション装置（ＭＸ３）から出力を（ｎ＋１）段目の加算およびラッチ段の加算結果に加算することもできる。
【００６３】
第２の制御入力（Ｃ０）の状態は、第２の記憶装置（Ｒ０）の最下位ビットと、第４のアービトレーション装置（ＭＸ４）の出力と、第１段目の加算およびラッチ段の全加算器の桁上げ出力と、第２段目の加算およびラッチ段の全加算器の和出力とを使用して判断することができる。これは好ましくは、第２の記憶装置（Ｒ０）の最下位ビットと第４のアービトレーション装置（ＭＸ４）の出力とをＡＮＤ論理ゲートの入力に接続し、追加の半加算器と追加のフリップフロップ装置とを設け、半加算器の第１の入力を、第２段目の加算およびラッチ段の全加算器の和出力に接続し、その第２の入力を第１段目の加算およびラッチ段の全加算器の桁上げ出力に接続し、半加算器の和出力を追加のフリップフロップ装置の入力に接続し、ＡＮＤ論理ゲートの出力とフリップフロップ装置の出力とをＸＯＲゲートの入力に接続し、ＸＯＲゲートの出力を使用して第２の制御入力（Ｃ０）の状態を判断することによって行われる。
【００６４】
この方法は、第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置に、それぞれ、モジュラスＮの値と、整数Ｂの値と、モジュラスと整数との和（Ｎ＋Ｂ）の値とをロードし、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、ゼロ値（「０」）の入力、および第６の記憶装置（Ｒ５）の出力の入力をそれぞれ選択するように、第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を設定し、第６の記憶装置（Ｒ５）の内容に第２の記憶装置（Ｒ０）の内容をロードし、累算装置の内容にゼロ値をロードし、各サイクルで第６の記憶装置（Ｒ５）の内容が１ビットずつ右にシフトされる非縮減および拡張モンゴメリ乗算を行い、累算装置において非縮減モンゴメリ自乗の結果を得ることによって、整数値Ｂの非縮減モンゴメリ自乗を行うことをさらに含むこともできる。
【００６５】
また、この方法は、第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、モジュラスＮの値と、第２の整数（Ｂ）の値と、モジュラスと第２の整数との和（Ｎ＋Ｂ）の値と、第１の整数（Ａ）の値とをロードし、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、ゼロ値（「０」）の入力、および第４の記憶装置（Ｒ３）の出力の入力をそれぞれ選択するように第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を設定し、累算装置の内容にゼロ値をロードし、各サイクルで第４の記憶装置（Ｒ３）の内容が右に１ビットずつシフトされる非縮減および拡張モンゴメリ乗算を行い、累算装置において非縮減モンゴメリ乗算の結果を得るステップとを行うことによって、第１（Ａ）と第２（Ｂ）の整数値のモンゴメリ乗算を行うことも含むことができる。
【００６６】
調整されたオペランド値Ａ’＝Ａ＊２s  ｍｏｄＮを事前計算し、ビット順序を逆転させ、最上位ビットｅm-1を削除して調整された値Ｅ’（ｅ0，ｅ1，．．．，ｅm-2）2を得ることによって、指数Ｅ＝（ｅm-1，ｅm-2，．．．，ｅ1，ｅ0）2の調整された値を構成し、第１、第２、第３、および第５の記憶装置の内容に、それぞれ、モジュラスＮの値、調整されたオペランド（Ａ’）の値、モジュラスと調整されたオペランドとの和（Ｎ＋Ａ’）の値、および調整された指数値Ｅ’をロードし、指数値Ｅのビット長ｍを求めて、
−  第５の記憶装置（Ｒ４）の内容を右シフトするステップと、
−  非縮減モンゴメリ自乗を行って累算装置において第３の記憶装置（Ｒ３）の内容の非縮減モンゴメリ自乗を得るステップと、
−  第３の記憶装置（Ｒ３）の内容に累算装置の内容をロードするステップと、
−  第３の記憶装置（Ｒ１）の内容に第１の記憶装置（Ｒ２）の内容と累算装置の内容との和をロードするステップとをｍ−１回行い、
第５の記憶装置の最下位ビット（Ｒ４0）が「１」の場合、非縮減および拡張モンゴメリ乗算を行って第２の記憶装置（Ｒ０）の内容と第４の記憶装置（Ｒ３）の内容との非縮減モンゴメリ乗算結果を累算装置で得て、第２の記憶装置（Ｒ０）の内容に累算装置の内容をロードし、第３の記憶装置（Ｒ１）の内容に第１の記憶装置（Ｒ２）の内容と累算装置の内容との和をロードすることによって、モジュラべき乗ＡE  ｍｏｄＮの計算を行うことができる。
【００６７】
上記のステップをｍ−１回反復した後、第２の記憶装置（Ｒ０）の内容に１を乗じる非縮減および拡張モンゴメリ乗算を行って累算装置で最終縮減結果を得ることにより、モジュラべき乗計算結果を得る。
【００６８】
あるいは、調整されたオペランド値Ａ’＝Ａ＊２s  ｍｏｄＮを事前計算し、第１（Ｒ２）、第２（Ｒ０），第３（Ｒ１）、および第５（Ｒ４）の記憶装置に、モジュラスＮの値、調整されたオペランド（Ａ’）の値、モジュラスと調整されたオペランドとの和（Ｎ＋Ａ’）、および指数値Ｅをロードし、指数値値Ｅのビット長ｍを求め、フラグを「１」に設定して、
第５の記憶装置（Ｒ４）の内容を右シフトするステップと、
第５の記憶装置の最下位ビット（Ｒ４0）が「１」の場合、フラグの状態を調べ、フラグが「１」でない場合は、非縮減および拡張モンゴメリ乗算を行って第２の記憶装置（Ｒ０）と第４の記憶装置（Ｒ３）の内容の非縮約および拡張モンゴメリ乗算結果を累算装置で得て、第４に記憶装置（Ｒ３）の内容に累算装置の内容をロードし、それ以外の場合は、第４の記憶装置（Ｒ３）の内容に第２の記憶装置（Ｒ０）の内容をロードし、フラグを「０」の状態にリセットするステップと、
拡張および非縮減モンゴメリ自乗を行って累算装置で第２の記憶装置（Ｒ０）の内容の拡張および非縮減モンゴメリ自乗を求めるステップと、
第２の記憶装置（Ｒ０）の内容に累算装置の内容をロードするステップと、
第３の記憶装置（Ｒ１）の内容に第１の記憶装置の内容と累算装置の内容との和をロードするステップとをｍ−２回行うことによって、モジュラべき乗ＡE  ｍｏｄＮを計算することもできる。
【００６９】
上記のステップをｍ−２回行った後、拡張および非縮減モンゴメリ乗算を行って、累算装置で第２の記憶装置（Ｒ０）の内容と第４の記憶装置（Ｒ３）の内容との拡張および非縮減モンゴメリ乗算結果を求め、第２の記憶装置（Ｒ０）の内容に累算装置の内容をロードし、第３の記憶装置（Ｒ１）の内容に第１の記憶装置（Ｒ２）の内容と累算装置の内容との和をロードし、第２の記憶装置（Ｒ０）の内容に１を乗じる拡張および非縮減モンゴメリ乗算を行って累算装置で最終縮減結果を得るステップとを行う。
【００７０】
第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、モジュラス値（Ｎ）のｎ個の最下位ビット（Ｎ0）、第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）、モジュラス値（Ｎ）のｎ個の最下位ビットと第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）の和（Ｂ0＋Ｎ0）、および第１の整数値（Ａ）のｎ個の最下位ビット（Ａ0）をロードするステップと、
第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、ゼロ値（「０」）、および第４の記憶装置（Ｒ３）の入力を選択するように設定し、必要であれば累算装置の内容をゼロにリセットするステップと、
モンゴメリ乗算を行い、その結果（Ｓ(I)）を累算装置で得て、第２の制御入力のビット状態（ＫI  ０≦１≦ｎ−１）（Ｋ0）を第５のレジスタ（Ｒ４）で得るステップとを行うことによって、第１の整数値のｎ個の最下位ビット（Ａ0）と第２の整数値のｎ個の最下位ビット（Ｂ0）のモンゴメリ乗算（ＭＭＵＬ（Ａ0，Ｂ0）を計算し、
第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、モジュラス値（Ｎ）のｎ個の最上位ビット（Ｎ1）、第２の整数値（Ｂ）のｎ個の最上位ビット（Ｂ1）、モジュラス値（Ｎ）のｎ個の最上位ビットと第２の整数値（Ｂ）のｎ個の最上位ビットとの和（Ｂ1＋Ｎ1）および第１の整数値（Ａ）のｎ個の最下位ビット（Ａ0）をロードするステップと、
第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、第５のレジスタ（Ｒ４）の入力、累算装置の最下位ビット（Ｓ0）、ゼロ値（「０」）、および第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
通常の乗算を行い、その結果（Ｓ(II)）の最上位ビットを累算装置で、結果（Ｒ(4)）の最下位ビットを第５の記憶装置で得るステップとを行うことによって行うステップとを行うことによって、第１の整数値のｎ個の最下位ビット（Ａ0）と、第２の整数値のｎ個の最上位ビット（Ｂ1）と、モジュラス値のｎ個の最上位ビット（Ｎ1）と、第５のレジスタ（Ｒ４）で得たｎビット値（Ｋ0）と、ステップａ）で得た結果（Ｓ(I)）とのＡ0＊Ｂ1＋Ｎ1＊Ｋ0＋Ｓ(I)の値を計算し、
第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれモジュラス値（Ｎ）のｎ個の最下位ビット（Ｎ0）、第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）、モジュラス値（Ｎ）のｎ個の最下位ビットと第２の整数値（Ｂ）のｎ個の最下位ビット（Ｂ0）との和（Ｂ0＋Ｎ0）、および第１の整数値（Ａ）のｎ個の最上位ビット（Ａ1）をロードするステップと、
累算装置（Ｓまた、本発明ではＣＳＡも指す）の内容にステップｂ）で得た結果（Ｒ４(II)）のｎ個の最下位ビットをロードし、第５の記憶装置（Ｒ４）の内容にステップｂ）で得た結果（Ｓ(II)）のｎ個の最上位ビットをロードするステップと、
第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路の入力、第５の記憶装置（Ｒ４）からの入力、および第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
モンゴメリ乗算を行い、その結果（Ｓ(III)）を累算装置で得て、第２の制御入力の状態（ＫI  ０≦Ｉ≦ｎ−１）（Ｋ1）を第５のレジスタ（Ｒ４）で得るステップとを行うことによって、第１の整数値のｎ個の最上位ビット（Ａ1）と、第２の整数値のｎ個の最下位ビット（Ｂ0）と、ステップｂ）で得た結果（Ｒ４(II)，Ｓ(II)）とのモンゴメリ乗算の加算の結果を計算し、
第１（Ｒ２）、第２（Ｒ０）、第３（Ｒ１）、および第４（Ｒ３）の記憶装置に、それぞれ、モジュラス値（Ｎ）のｎ個の最上位ビット（Ｎ1）、第２の整数値（Ｂ）のｎ個の最上位ビット（Ｂ1）、モジュラス値（Ｎ）のｎ個の最上位ビットと第２の整数値（Ｂ）のｎ個の最上ビットとの和（Ｂ1＋Ｎ1）、および第１の整数値（Ａ）ｎ個の最上位ビット（Ａ1）をロードするステップと、
第１（ＭＸ１）、第２（ＭＸ２）、第３（ＭＸ３）、および第４（ＭＸ４）のアービトレーション装置を、第５のレジスタ（Ｒ４）の入力、累算装置の最下位ビット（Ｓ0）、ゼロ値（「０」）、および第４の記憶装置（Ｒ３）の入力を選択するように設定するステップと、
モンゴメリ乗算を行い、結果（Ｓ(IV)）の最上位ビットを累算装置で得、結果（Ｒ(IV)）の最下位ビットを第５の記憶装置で得るステップとを行うことによって、第１の整数値のｎ個の最上位ビット（Ａ1）と、第２の整数値のｎ個の最上位ビット（Ｂ1）と、モジュラス値のｎ個の最上位ビット（Ｎ1）と、第５のレジスタ（Ｒ４）で得たｎビット値（Ｋ1）と、ステップｃ）で得た結果（Ｓ(III)）とのＡ1＊Ｂ1＋Ｎ1＊Ｋ1＋Ｓ(III)を計算することによって、第１の整数と第２の整数とモジュラス（Ｎ）とが２×ｎビットである、第１（Ａ＝Ａ1＊２n＋Ａ0）および第２（Ｂ＝Ｂ1＊２n＋Ｂ0）の整数値のモジュラ乗算を行うことができる。
【００７１】
また、この方法は、第１
【００７２】
【数１１】
2004534266.tif 000015
【００７３】
と第２
【００７４】
【数１２】
2004534266.tif 000016
【００７５】
の整数値のモジュラ乗算を行うステップであって、第１の整数、第２の整数、およびモジュラス
【００７６】
【数１３】
2004534266.tif 000017
【００７７】
が２×ｎビットを超えてもよく、計算を第１および第２の整数の２×ｎビットの後続部分の乗算の中間結果を計算することによって行うことをさらに含むことができる。
他の態様では、本発明は、必要な反復回数（ｓ）がモジュロ値（Ｎ）内のビット数（ｎ）よりも多く、モンゴメリ乗算結果がモジュロ値の２倍（２×Ｎ）よりも小さい、第１（Ａ）と第２（Ｂ）の整数値の拡張および非縮減モンゴメリ乗算を行う装置であって、
モジュロ値（Ｎ）を格納する第１の記憶装置（Ｒ２）と、
第１の整数値（Ａ）を格納する第２の記憶装置（Ｒ０）と、
第１の整数値とモジュロとの和（Ａ＋Ｎ）を格納する第３の記憶装置（Ｒ１）と、
第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置からの第１（Ｉｎ１）、第２（Ｉｎ２）、および第３（Ｉｎ３）の入力を有し、ゼロ（「０」）である第４の入力を有し、第１（Ｃ１）および第２（Ｃ０）の制御入力を受け取り、それによって他の入力の１つをその出力として選択することができ、累算装置の入力に接続された、アービトレーション装置と、
第１の整数値の選択されたビット（ＡI）の状態と、第２の整数値の最下位ビット（Ｂ0）の状態と、累算装置の最下位ビット（Ｓ0）の状態とに応じて第２の制御入力（Ｃ０）の状態（ＫI）を生成する回路と、
ｎ＋２ビットの値を格納し、その内容にｎ＋２ビットの値（Ｘ）を加算し（Ｓ＋Ｘ→Ｓ）、その内容を２で割る（Ｓ／２→２）ことができる、累算装置（Ｓ）とを含む装置を対象とする。
【００７８】
好ましくは、第２の制御入力の状態（ＫI）を生成するために使用される回路は、選択されたビット（ＡI）の状態と第２の整数値の最下位ビット（Ｂ0）の状態とが１で、累算装置の最下位ビット（Ｓ0）の状態がゼロの場合、または選択されたビット（ＡI）の状態と第２の整数値の最下位ビット（Ｂ0）の状態とが異なる状態であり、累算装置の最下位ビット（Ｓ0）の状態が１である場合に、値１を生成し、それ以外のすべての場合に回路がゼロ値を生成する。
【００７９】
第１（Ｒ２）、第２（Ｒ０）、および第３（Ｒ１）の記憶装置は、それぞれの最上位ビット位置への直列入力を有するとともに、内容の並列出力も可能なｎ＋２ビットのシフト・レジスタとすることができる。第１の記憶装置（Ｒ２）は、最下位ビット位置（Ｒ２0）からの直列出力を有することができ、それによって周期的ビット・ローテーションを行うことができる。
【００８０】
また、この装置は、モジュラ算術演算を行うことができるようにする手段をさらに含むことができ、この手段は、
第２の記憶装置（Ｒ０）の直列入力を累算装置（Ｓ）の最下位ビット（Ｓ0）に接続する手段と、
その内容をその最下位ビット（Ｒ３0）から開始して順次に１ビットずつ（Ｒ３I  Ｉ＝０，１，２，．．．，ｎ＋１）直列出力することができ、ｎ＋２ビットを格納することができ、その内容に対して周期的ビット・ローテーションを行うことができる第４の記憶装置（Ｒ３）と、
直列入力と直列出力とを有し、ｎ＋２ビットの値を格納することができる第５の記憶装置（Ｒ４）と、
その内容をその最下位ビットから開始して順次に１ビットずつ（Ｒ５I  Ｉ＝０，１，２，．．．，ｎ＋１）直列出力することができ、ｎ＋２ビットを格納することができる第６の記憶装置（Ｒ５）と、
第５の記憶装置からの第１の入力（Ｒ４I）と、第２の制御入力の状態を生成する回路からの第２の入力（ＫI）とを有し、出力が第２の制御入力（Ｃ０）に接続された、第１のアービトレーション装置（ＭＸ１）と、
累算装置の最下位ビット（Ｓ0）と等しい第１の入力と、回路の出力（ＫI）から受け取る第２の入力と、第５の記憶装置（Ｒ４）の直列出力（Ｒ４I）に接続された第３の入力とを有し、出力が第５の記憶装置（Ｒ４）の直列入力に接続された、第２のアービトレーション装置（ＭＸ２）と、
常にゼロ値（「０」）が供給される第１の入力と、第５の記憶装置の直列出力（Ｒ４I）から受け取る第２の入力とを有し、出力が累算装置の直列入力に接続された、第３のアービトレーション装置（ＭＸ３）と、
第６の記憶装置の直列出力（Ｒ５I）に接続された第１の入力と、第４の記憶装置の直列出力（Ｒ３I）に接続された第２の入力とを有し、出力が第１の制御入力（Ｃ１）に接続された、第４のアービトレーション装置（ＭＸ４）と、
ｎ＋２ビット値の直列加算を行うことができ、累算装置の最下位ビット位置（Ｓ0）からの第１の入力と、第１の記憶装置（Ｒ２）の直接出力からの第２の入力とを受け取り、出力が第３の記憶装置（Ｒ１）の直列入力に接続された加算器とを含む。
【００８１】
累算装置は、ｎ＋２段の加算およびラッチ段から成ることができ、各段が第１および第２のフリップフロップ装置と、３個の入力を有する全加算器装置とから成るｎ＋２段の加算およびラッチ段から成り、第１段目の段からは第２のフリップフロップ装置が省かれており、累算装置は、
ａ）全加算器の第１の入力を第１のフリップフロップ装置の出力に接続する手段と、
ｂ）全加算器の第２の入力を後続の加算およびラッチ段の第２のフリップフロップ装置の出力に接続する手段と、
ｃ）全加算器の第３の入力をアービトレーション装置のそれぞれのビット出力（ＭＵＸi  ０≦ｉ≦ｎ＋１）に接続する手段とを含む。
【００８２】
累算装置は、累算装置の直列入力を介して第３のアービトレーション装置（ＭＸ３）から出力を（ｎ＋１）段目の加算およびラッチ段の加算結果に加算する手段をさらに含むことができ、この手段は、
ａ）第１および第２の半加算器装置と第３のフリップフロップ装置と、
ｂ）第１のフリップフロップ装置の入力を第２の半加算器の和出力に接続する手段と、
ｃ）第２のフリップフロップ装置の入力を第２の半加算器の桁上げ出力に接続し、フリップフロップ装置の出力を、（ｎ＋２）段目の加算およびラッチ段の全加算器の第２の入力に接続する手段と、
ｄ）第２の半加算器の第１の入力を（ｎ＋１）段目の加算およびラッチ段の全加算器の桁上げ出力に接続し、その第２の入力を第１の半加算器の桁上げ出力に接続する手段と、
ｅ）第１の半加算器の第１の入力を全加算器の和出力に接続し、第２の半加算器の第２の入力を第３のアービトレーション装置（ＭＸ３）の出力に接続する手段と、
ｆ）第３のフリップフロップ装置の入力を第１の半加算器の和出力に接続し、その出力を（ｎ−１）段目の加算およびラッチ段の全加算器の第２の入力に接続する手段と含む。
【００８３】
また、第２の記憶装置（Ｒ０）の最下位ビットと、第４のアービトレーション装置（ＭＸ４）の出力と、第１段目の加算およびラッチ段の全加算器の桁上げ出力と、第２段目の加算およびラッチ段の全加算器の和出力とを使用して第２の制御入力（Ｃ０）の状態を判断することができ、
ａ）第２の記憶装置（Ｒ０）の最下位ビットと第４のアービトレーション装置（ＭＸ４）の出力とをＡＮＤ論理ゲートの入力に接続する手段と、
ｂ）追加の半加算器と追加のフリップフロップ装置と、
ｃ）半加算器の第１の入力を、第２段目の加算およびラッチ段の全加算器の和出力に接続し、その第２の入力を第１段目の加算およびラッチ段の全加算器の桁上げ出力に接続する手段と、
ｄ）半加算器の和出力を追加のフリップフロップ装置の入力に接続する手段と、
ｅ）ＡＮＤ論理ゲートの出力とフリップフロップ装置の出力とをＸＯＲゲートの入力に接続し、ＸＯＲゲートの出力を使用して第２の制御入力（Ｃ０）の状態を判断する手段とを含む。
【発明を実施するための最良の形態】
【００８４】
本発明は、ハードウェア手段の点で高速かつ効率的なモジュラ算術演算を行う方法および装置に関する。本発明の好ましい実施形態の中核にあるのは、修正（拡張）モンゴメリ法に基づく、２つの整数ＡおよびＢモジュロＮ（以下Ａ・Ｂ  ｍｏｄＮ）のモジュラ乗算の計算である。
【００８５】
修正（拡張）モンゴメリ乗算の定義：Ａ、Ｂ≦２＊Ｎであり、整数ｓ≧ｎであるような、ｎビット長の奇数のモジュラスＮ、整数Ａ、Ｂについて、ＮＲＭＭ(s)（Ａ，Ｂ，Ｎ）＝Ａ＊Ｂ＊２-s  ｍｏｄ（Ｎ＋ε＊Ｎ）によって非縮減および拡張モンゴメリ乗算（ＮＲＭＭ）を定義する。ただし、縮減された結果の場合はε＝０であり、縮減されていない結果の場合はε＝１である。以下、文脈（すなわちＮおよびｓ）が分かっている場合、ＮＲＭＭ(s)（Ａ，Ｂ，Ｎ）を示すのに略してＮＲＭＭ(s)（Ａ，Ｂ）を使用する。ＮＲＭＭ(s)（Ａ，Ｂ）の計算は、縮減ステップ１．４を行わずに、ステップ１．１、１．２、および１．３をｓ（≧ｎ）回反復することによって行う。以下、このような計算の結果を非縮減および拡張モンゴメリ乗算とも呼ぶ。非縮減および拡張モンゴメリ乗算によって得られた結果は必ずしも縮減されているわけではない（すなわちＮＲＭＭ(s)（Ａ，Ｂ，Ｎ）がモジュラスＮよりも大きい場合がある）ことに留意することが重要である。
【００８６】
ＮＲＭＭ(s)（Ａ，Ｂ）を計算するプロセスを以下のステップで示す。
プロセス１：
入力：Ａ、Ｂ、Ｎ、ｓ、ｎ（前提条件：Ｎはｎビットの整数であり、Ａ，Ｂ＜２＊Ｎで、Ｎは奇数であり、ｓ≧ｎである）
出力：ＮＲＭＭ(s)（Ａ，Ｂ）
【００８７】
【数１４】
2004534266.tif 000018
【００８８】
Ａ、Ｂ＜Ｎかつｓ＝ｎである特別な場合は、最終縮減ステップが無視されるほとんどの用途で使用される、従来のモンゴメリ乗算である。本発明の方法によると、このプロセスは、縮減（ステップ１．４）を行わずに行い、本発明の好ましい実施形態では、ｓ＝ｎ＋２を使用し、入力は２＊Ｎによって制限され、得られる結果も２＊Ｎによって制限されるが、Ｂ＜２＊Ｎかつ、Ａがｎ＋１ビットを超えないことを条件とすれば十分である。
【００８９】
本発明の方法は、以下の事実に基づく。すなわち、ｓ＝ｎ＋２回の反復を行う場合、ｎビット長のモジュラスＮと（ｎ＋１）ビット長の入力値ＡおよびＢ（ただしＡ，Ｂ＜２＊Ｎ）で、ＮＲＭＭ(s)（Ａ，Ｂ）の最終結果は２＊Ｎを超えず、暫定累算結果（ステップ３．２）は６＊Ｎを超えない。このことは、入力値と出力値が同じ上限（２＊Ｎ）によって制限され、したがってオーバーフローの可能性がないこの拡張及び非縮減モンゴメリ乗算の連続的適用が可能になるため、極めて重要である。前述のように、べき乗計算プロセスＡE  ｍｏｄＮは、モンゴメリ乗算とモンゴメリ自乗のシーケンスによって実施することができる。ｎビット長のオペランドＡ（Ａ＜Ｎ）を使用したＭＭＵＬ（Ａ，Ａ）演算によって、Ｎより大きく２＊Ｎより小さい非縮減結果が得られる。したがって、ｓ＝ｎ＋２回の非縮減モンゴメリ乗算によって、中間ステップにおける縮減の必要なしに、（ｎ＋２）ビット長の記憶レジスタと最大（ｎ＋３）ビットの結果を計算することができる累算器とを使用して、ＮＲＭＭ(s)の連続べき乗シーケンスを行うことができる。後述するように、本発明の方法によると、（ｎ＋２）ビットの累積器（ＣＳＡ）の実施態様を使用することができる。さらに、ｓ＝ｎ＋２は、縮減なしのこのようなべき乗計算を保証する最低回数である。
【００９０】
非縮減拡張モンゴメリ乗算の計算は、積Ａ＊ＢにＫ・Ｎの値（任意のＫ≧０）を加えることに暗黙的に基づいている。Ｋの値は、事前にはわからず、反復により構築される。本発明の好ましい実施形態では、後述するように、このプロセスの各反復において、整数Ｋのさらに他のビットＫIを計算する。Ａ＊Ｂの積にモジュラス値Ｎを任意の回数加えることができ、同じ結果のモジュラスＮとみなすことができる。すなわち、範囲［０，Ｎ）に縮減した場合、Ｋ＊Ｎを加えた後の結果によって同じ剰余モジュロＮが与えられる。Ｋの値は、Ａ＊Ｂ＋Ｋ＊Ｎが２sによって割り切れるように選定する。結果のＬＳＢからｓ個のゼロを廃棄するために、（ｓ回右にシフトして）結果のＡ＊Ｂ＋Ｋ＊Ｎを２sで除算する。したがって、結果は実際にはｓ回の連続右シフト（ＲＳＨs）演算、ＲＳＨs（Ａ＊Ｂ＋Ｋ＊Ｎ）＝（Ａ＊Ｂ＋Ｋ＊Ｎ）／２sの結果であり、ＲＳＨs（Ｘ）＝Ｘ＊２-sはＸを右にｓ回シフトすることを示す。これらのシフトは各反復（ステップ３．３）ごとに行われる。
【００９１】
本発明の方法により行われるＮＲＭＭ(s)は、累積結果に値が加算されるｓ＝ｎ＋２回の反復から成る。各反復で累積結果に加算される値は、ステップ３．２の暫定累積加算結果が偶数になるように選定する。したがって、累積結果の暫定値のＬＳＢビットは常にゼロであり、１回の右シフトによって２で割り切ることができる（ステップ３．３）。
【００９２】
具体的には、Ｓ＝Ｓ＋ＡI＊Ｂの計算結果が奇数値の場合は常に、（奇数の）モジュラスＮをＳに加える。したがって、各反復において、以下の計算を行う。
【００９３】
【数１５】
2004534266.tif 000019
【００９４】
したがって、結果は常に２で割り切れ（すなわち右シフトによって）、剰余は出ない。
本発明の好ましい実施形態によると、従来のモンゴメリ乗算法の修正を使用して、完全にハードウェアによって実現可能なモジュラ算術演算の実施を容易にする。従来のモンゴメリ乗算を計算する従来技術の方法では、ＭＭＵＬ（Ａ，Ｂ）＝Ａ＊Ｂ＊２-n  ｍｏｄＮの計算は、ｎ回の反復プロセスで得られ、ｎはモジュラスＮのビット数である。前述のように、この計算でｎ回を超える反復を行うことには大きな利点がある。本発明の好ましい実施形態では、ｓ＝ｎ＋２を用い、このタイプのモンゴメリ乗算には以下の論法が成り立つ。
【００９５】
ｎビット長の入力値ＡおよびＢ（Ａ，Ｂ＜Ｎ）とｎビット長のモジュラスＮを使用し、ｓ＝ｎ＋２回の反復を行ってＮＲＭＭ(s)（Ａ，Ｂ）を計算した場合、Ａのすべてのビットが走査され、最終結果はＮ＋Ｂ＜２＊Ｎを超えず、暫定累積結果は２＊（Ｎ＋Ｂ）＜４＊Ｎを超えない。
【００９６】
さらに、（ｎ＋１）ビット長の入力値ＡおよびＢ（ただしＡ、Ｂ＜２＊Ｎ）とｎビット長のモジュラスＮを使用し、ｓ＝ｎ＋２回の反復を行って非縮減および拡張ＮＲＭＭ(s)（Ａ，Ｂ）を行った場合、Ａのすべてのビットが走査され、最終結果は（Ｎ＋Ｂ＋Ｎ）／２＊Ｎを超えず、暫定累積結果は２＊（Ｎ＋Ｂ）＜６＊Ｎを超えない。
【００９７】
（ｎ＋１）ビット長の入力値Ａ（Ａ＜２＊Ｎ）とｎビット長のモジュラスＮを使用し、ｓ＝ｎ＋２回の反復を行ってＮＲＭＭ(s)（Ａ，１）を計算する場合、Ａのすべてのビットが走査され、得られた最終結果が縮減、すなわちＮより小さくなることに留意することが重要である。
【００９８】
その結果、ｎビット長のモジュラスＮと、２＊Ｎによって制限された入力とを使用して非縮減モンゴメリ乗算の連鎖シーケンスを行った場合、出力は２＊Ｎによって制限されたままであり、１を乗じる１回の（最終）拡張モンゴメリ乗算によって（ステップ１．４の縮減を実際に行わずに）、結果が［０，Ｎ）の範囲に縮減される。
【００９９】
後者の結果は、実際の適用においてきわめて重要である。前述のように、モンゴメリ乗算とモンゴメリ自乗（ＭＭＵＬ（Ｘ，Ａ）、ＭＭＵＬ（Ｘ，Ｘ））演算のシーケンスを使用してべき乗計算プロセスＡE  ｍｏｄＮ（Ａ＜Ｎ）を実施することができる。ｎビット長のオペランドＸ（Ｘ＜Ｎ）を使用し、実際にｎ＋１ビットのオペランドＸ＜２＊Ｎを使用しても、Ｎよりは大きく２＊Ｎよりは小さい非縮減結果になる。ｓ＝ｎ＋２回のこの修正モンゴメリ乗算（非縮減）により、中間ステップにおける縮減の必要なしに、（ｎ＋２）ビット長の記憶レジスタと（ｎ＋３）ビット長の累算器（すなわち桁上げのための追加の１ビットを含む（ｎ＋２）ビット長の累算器）を使用して、ＮＲＭＭ(s)の連続べき乗計算シーケンスを行うことができる。さらに、ｓ＝ｎ＋２は、縮減なしのこのようなべき乗計算を保証する最小回数である。
【実施例３】
【０１００】
以下の例では、修正モンゴメリ乗算を、指数ＡE  ｍｏｄＮの計算に使用する。ただし、Ａ＝２１２、Ｅ＝２４０＝（１１１１００００）2（ｍ＝８）、およびＮ＝２４９（実施例２と同様ｎ＝８）である。この修正モンゴメリ乗算は、ｓ＝ｎ＋２＝１０回の反復によって行われ、したがってＡ’＝２１２＊２10  ｍｏｄ２４９＝２０９の事前計算が必要である。
【０１０１】
表３（前提条件：Ａ＝２１２、Ｅ＝２４０（１１１１００００）2、Ｎ＝２４９、およびＴ(I)＝Ａ’＝２０９）
【０１０２】
【表３】
2004534266.tif 000020
【０１０３】
表２では、前のステップＴ(I+1)で求めた値の後に、ステップ２．１のＴ(I+1)2で得られた結果と、ステップ２．２のＴ(I)で得られた結果が示されている。最終結果は、Ｔ(0)＝ＮＲＭＭ(s)（Ｔ(0)，１）＝２４１を計算することによって得られる。表に示すように、行った中間モンゴメリ乗算の結果は縮減されていない。反復Ｉ＝６、５、４、および３で行ったステップ２．２の演算において、結果はＮＲＭＭ(s)（Ｔ(I)、Ａ’）＞Ｎであり、反復回Ｉ＝３におけるステップ２．１の演算では結果はＮＲＭＭ(s)（Ｔ(I+1)，Ｔ(I+1)）＞Ｎであった。前述のように、非縮減モンゴメリ乗算には制限が設けてあり、２＊Ｎを超えない。表４に、上記の表４のステップＩ＝３で行ったＮＲＭＭ(s)（３１９，３１９）の計算の場合の修正モンゴメリ乗算の利点を例示する。
【０１０４】
表４：（前提条件：Ｓ＝０、Ａ＝３１９＝（１００１１１１１１）2、Ｂ＝３１９、およびＮ＝２４９）
【０１０５】
【表４】
2004534266.tif 000021
【０１０６】
得られた結果は、３１９＊３１９＊２-10  ｍｏｄ２４９＝１７５であり、明らかにすべての暫定累積結果が６＊Ｎによって制限されている。Ｉ＝５の場合、Ｓ＝Ｓ＋Ｓ0＊Ｎ＝１０５６＝（１００００１０００００）2の暫定結果が得られ、これは１１ビットの（ｎ＋３）であることに留意されたい。実際には、これは、非縮減モンゴメリ乗算を使用したこのような計算に必要な最大ビット長であり、したがって、ＣＳＡは最大ｎ＋３ビットの結果を計算することができなければならない。しかし、各演算においてＣＳＡで行われる連続右シフトのため、ＣＳＡはｎ＋２ビットＣＳＡとして実施される。
【０１０７】
ＫIビットは、各反復で得られる部分結果Ｓ＝Ｓ＋ＡI＊ＢのＬＳＢである値Ｓ0をとる。この値（ＫI）は、直前の反復回の結果の最下位ビットと、他の既知の値によって完全に決まり、
【０１０８】
【数１６】
2004534266.tif 000022
【０１０９】
によって得られ、ＣＳＡ’1（６０３）は、ＣＳＡから得られる出力である。図６を参照しながら詳述するように、ある種のハードウェアを追加することにより、ＣＳＡはＣＳＡ’1（６０３）出力を提供することができ、この出力を使用してＫIビットの生成プロセスが高速化される。この実現は、ハードウェアで容易に実施可能である。本発明の好ましい実施形態によるＫIの決定に基づく装置を、図２に示す。この装置では、ＡのＡIビットを供給するために追加のシフト・レジスタＲ３を使用する。Ｒ３レジスタは、直列出力を有し、そのＬＳＢにＡの値を保持するｓビットと、その左端の２つのＭＳＢ位置に、追加の２回の反復（ｓ＝ｎ＋２）を行うために使用する追加の２つの（ゼロ）ビットを有する。ＣＳＡは、ｓ＋２ビットであり、追加の記憶装置として機能し、したがって、中間ステップで得られる部分結果のために追加の記憶装置を設ける必要がない。
【０１１０】
本発明の好ましい実施形態では、ＫIの値は、ＡI、Ｒ０0、およびＣＳＡ’1（６０３）の値から実現される。図２を参照すると、ＫIの値は、Ａ1、Ｒ０0、およびＣＳＡ’1を入力として受け取る適切な回路６０２（その可能な実施態様を図３に示す）を使用して実現される。ビットＢ0が、レジスタＲ０（Ｒ０0）のＬＳＢを受け取るラッチ装置２００に入れられる。ＮＲＭＭ(s)（Ａ，Ｂ）の計算を行うために、値Ｂ、Ｂ＋Ｎ、Ｎ、およびＡをそれぞれのレジスタＲ０、Ｒ１、Ｒ２、およびＲ３にロードし、ＣＳＡの内容をゼロ化することによってシステムを初期設定する。したがって、Ｋ0は、Ａ0＝Ｂ0＝１の場合にのみ「１」となる。
【０１１１】
モンゴメリ乗算を行うときにＮが奇数の場合、ＣＳＡの内容は常に偶数であり、それによって１回の右シフトによって２で割る除算が可能になり、剰余が出ないことに留意されたい。さらに、ＣＳＡのＬＳＢは、ＣＳＡ0出力で得られ、したがって、剰余がある場合（正規乗算）、その剰余はＣＳＡ0出力で得られる。
【０１１２】
図３に、ＫIビットを供給する回路６０２の可能な一実施態様を示す。図３の実施態様は、ＡＮＤゲート３００と排他的ＯＲ（ＸＯＲ）ゲート３０１を使用して実現され、ＡＮＤゲートの入力はビットＡIおよびＢ0であり、ＸＯＲゲートの入力はＡＮＤゲート３００の出力とＣＳＡ’1６０３である。ＣＳＡからのＣＳＡ’1６０３出力によって、ＣＳＡ  ＬＳＢの期待値が得られ、したがってＫIビットの実現が高速化されると共に簡略化される。
【０１１３】
以上で説明し例示したように、本発明の方法は、拡張および非縮減モンゴメリ乗算ＮＲＭＭ(s)（Ａ，Ｂ）の高速で効率的な計算のために使用される。この場合、ＡおよびＢは２＊Ｎより小さく、Ｎは最大ｎビット（ｓ≧ｎ＋２）である。後述するように、この装置に変更を加えて、モンゴメリ・インタリーブド・モジュラ乗算とも呼ばれるｎビットを超える整数のモジュラ積計算を行えるようにすることができる。
【０１１４】
図４に、拡張非縮減モンゴメリ・モジュラ乗算に基づく算術演算を行う本発明の好ましい実施形態による装置を示す。この装置は、本明細書では公開鍵インターフェース（ＰＫＩ）とも呼び、（それぞれがｎ＋２ビットの）６個のレジスタＲ０、Ｒ１、Ｒ２、Ｒ３、Ｒ４、Ｒ５と、（ｎ＋２ビットの）桁上げ保存加算器ＣＳＡとに基づき、何らかの制御（図示せず）を備える。このＰＫＩ装置は、以下での述べるように、様々な算術演算とモジュラ算術演算を行うことができる。
【０１１５】
図４の装置には、追加のマルチプレクサＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４と、シフト・レジスタＲ４およびＲ５が組み込まれている。ＭＵＸの制御入力Ｃ１はＭＸ４の出力に接続されている。ＭＸ４はレジスタＲ３の直列出力とＲ５の直列出力とのうちから選択するアービトレータとして機能する。レジスタＲ２、Ｒ３、およびＲ４は、直列入力と直列出力を有し、周期的ビット・ローテーションを行うことができる。他方のＭＵＸ制御入力Ｃ０は、ＭＸ１の出力に接続されている。ＭＸ１は、レジスタＲ４からの入力値と値ＫIを生成する回路からの入力値のいずれかを選択するアービトレータとして機能する。レジスタＲ４は、ＭＸ２の出力に接続された直列入力を有する。ＭＸ２はＣＳＡ0値の入力、Ｒ４の出力（Ｒ４の周期的ビット・ローテーションを行う際に有用）、またはＫI６０２の値のいずれかを選択するアービトレータとして機能する。
【０１１６】
第３のマルチプレクサＭＸ３は、ＣＳＡ直列入力への入力を選択するとともに、「０値」とＭＸ４の出力のいずれかを選択することもできる。ＭＸ３の出力は、ＣＳＡのｎ番目のビットに加えられ、それによって、後述するように各ステップでＣＳＡ(I+1)＝（ＣＳＡ(I)＋ｏｕｔ(I)＋ＭＸ３(I)＊２n）／２（ただし、ｏｕｔ(I)およびＭＸ３(I)はそれぞれＭＵＸおよびＭＸ３からの出力）の計算を行うことによってＣＳＡの内容が設定される。レジスタＲ５は、より複雑な算術演算（すなわちべき乗計算）に関係する自乗演算を行うためにのみ使用されることに留意されたい。以下で示すように、自乗演算を行うためにレジスタＲ５にはレジスタＲ０の内容がロードされる。したがって、同じ装置をレジスタＲ５なしで実現し、多重化技法を使用してレジスタＲ０の後続ビットを読み取ることもできる。ＣＳＡの可能な実施形態を図６Ａおよび図６Ｂに示す。
【０１１７】
図６Ａおよび図６Ｂに示すＣＳＡは、ｎ個の全加算器（ＦＡ）のセットが直列接続された直列手法に基づく。図６Ａに示すＣＳＡ６００は、ｎビットＣＳＡであり、各ＦＡは３つの入力と、桁上げ（Ｃ）と和（Ｓ）の２つの出力を有し、各出力はフリップフロップ（ＦＦ）装置の入力である。各ＦＡは、以下の入力を受け取る。すなわち、後続のＦＡのＳ出力を受け取るＦＦの出力と、それ自体のＣ出力を受け取るＦＦの出力と、ＭＵＸ（ＭＵＸn-1，ＭＵＸn-2，．．．，ＭＵＸ0）からの対応する入力である。このようにして、ＣＳＡの内容の右シフトと、ＭＵＸ出力ｏｕｔの加算とが行われる。左端のＦＡ装置６１０は、図６Ｂに示す他の２段６１１および６１２からの入力を受け取る。
【０１１８】
図６Ｂに示す追加の段６１１および６１２は、図６ＡのｎビットＣＳＡ６００を（ｎ＋２）ビットＣＳＡに拡張するために使用される。図６Ｂの第ｎ段６１１は、ＣＳＡの内容にＭＸ３(I)＊２nを加算するために使用される。第ｎ段６１１によって４ビットの加算が行われるように図示されているが、実際にはこの段によって３ビットのみが合計されることを理解されたい。具体的には、モンゴメリ方式の計算を行うときは、ＭＸ３から受け取る入力は常にゼロ状態であり、インタリーブド乗算の一部である正規乗算を行うときは、第（ｎ＋１）段６１２から受け取る入力がゼロ状態である。
【０１１９】
システムのパフォーマンスを高速化するために、第１段のＦＡのＣ出力６０４と第２段のＦＡのＳ出力６０８が、半加算器（ＨＡ）６０７に接続され、ＨＡ６０７のＳ出力がＦＦに接続され、このＦＦから出力ＣＳＡ’1６０３が、ＫIを決定するために使用される回路に供給される。ＨＡ６０７は、論理ＸＯＲゲートまたは
【０１２０】
【数１７】
2004534266.tif 000023
【０１２１】
の演算（すなわち基底２モジュラ加算）を行うことが可能な任意の装置に置き換えることもできる。また、ＣＳＡの直列出力ＣＳＡ0はＦＦ装置を介して供給されるのではなく、第１段のＦＡのＳ出力から直接得られることにも留意されたい。
【０１２２】
以下に、本発明の好ましい実施形態による様々な算術演算の適用について述べる。これは限られた演算セットであるが、本発明の方法を使用する他の可能な演算を含むより広いセットの適用を限定するものではなく、例示のために示すに過ぎない。
【０１２３】
モンゴメリ自乗（ＮＲＳＱＲ(s)）
以下のプロセスは、ＣＳＡ＝（Ｂ＊Ｂ＋Ｋ＊Ｎ＋ＣＳＡ）・２sの計算のために使用され、したがって、整数値Ｂの非縮減および拡張モンゴメリ自乗ＮＲＭＭ(s)（Ｂ，Ｂ）を実現する。回数はｓ≧ｎであるが、最適な選定回数としてｓ＝ｎ＋２を示す。
【０１２４】
入力：Ｂ、Ｎ、ｓ（Ｂ→Ｒ０、Ｂ＋Ｎ→Ｒ１、Ｎ→Ｒ２）
出力：ＮＲＳＱＲ(s)＝ＮＲＭＭ(s)（Ｂ，Ｂ）
【０１２５】
【数１８】
2004534266.tif 000024
【０１２６】
この計算のために、ＫI、ＫI，「０」、およびＲ５の入力をそれぞれ選択するようにＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力を設定する。この計算の場合、ＭＸ２のための入力の選択は結果に影響を与えないことに留意されたい。この演算をインタリーブド乗算の一部として行う場合、ＭＸ３の制御入力は、Ｒ４入力を選択するように設定する。ｓ回の反復を行った後、Ｒ４レジスタからＫの値を得る。従来の並列／直列技法（図示せず）またはソフトウェアを使用して、Ｒ５の内容にレジスタＲ０の内容をロードすることができる（図５）。このＮＲＳＱＲプロセスは、初期設定ステップでＣＳＡの内容をゼロ化することによって、（Ｂ＊Ｂ＋Ｋ＊Ｎ＋ＣＳＡ）／２sまたは（Ｂ＊Ｂ＋Ｋ＊Ｎ）／２sを計算するためにも使用することができることを理解されたい。
【０１２７】
非縮減および拡張モンゴメリ乗算（ＮＲＭＭ(s)）
本発明の方法により、ＰＫＩ装置によって実施される非縮減モンゴメリ乗算について説明する。以下のプロセスでは、縮減されていない結果ＣＳＡ＝（Ａ＊Ｂ＋Ｋ＊Ｎ＋ＣＳＡ）／２sを計算する。
【０１２８】
入力：Ａ、Ｂ、Ｎ、ｓ（Ａ→Ｒ３、Ｂ→Ｒ０、Ｂ＋Ｎ→Ｒ１、Ｎ→Ｒ２）
出力：ＮＲＭＭ(s)（Ａ，Ｂ）
【０１２９】
【数１９】
2004534266.tif 000025
【０１３０】
ＭＸ１およびＭＸ４の制御入力を、ＫIおよびＲ３の入力がそれぞれ選択されるように設定する。ＭＸ２およびＭＸ３の制御入力を、単純ＮＲＭＭ(s)を行うときにＫIおよび「０」の入力をそれぞれ選択するように、あるいは（図５に示す）インタリーブド乗算の一部としてＫIおよびＲ４の入力をそれぞれ選択するように設定する。前述のように、ｓサイクルの計算が完了するとＫの値がＲ４レジスタで得られる。当然ながら、このＮＲＭＭ(s)プロセスは、初期設定ステップでＣＳＡの内容をゼロ化することによって、（Ａ＊Ｂ＋Ｋ＊Ｎ）／２sを計算するために使用することもできる。
【０１３１】
１を乗じるモンゴメリ乗算（ＭＭＵＬＢＹ１(s)）
以下のプロセスは、本発明の方法により、ＰＫＩ装置を使用し、任意の値ＢについてＣＳＡ＝（Ｂ＋Ｋ＊Ｎ＋ＣＳＡ）／２sを計算するために使用される。前述のように、Ｂ＜２＊Ｎおよびｓ＝ｎ＋２の場合、ＭＭＵＬＢＹ１(s)（Ｂ）演算によって得られる結果は縮減される（Ｂ＜２＊Ｎおよびｓ＝ｎ＋２の場合  ＭＭＵＬＢＹ１(s)（Ｂ）＜Ｎ）。
【０１３２】
入力：Ｂ、Ｎ、ｓ（Ｂ→Ｒ０、Ｂ＋Ｎ→Ｒ１、Ｎ→Ｒ２、１→Ｒ３）
出力：ＭＭＵＬＢＹ１(s)（Ｂ）＝ＮＲＭＭ(s)（Ｂ，１）
【０１３３】
【数２０】
2004534266.tif 000026
【０１３４】
ＭＸ１、ＭＸ３、およびＭＸ４の制御入力を、ＫI、「０」、およびＲ３の入力をそれぞれ選択するように設定する（ＭＸ２の選択はこの演算には影響を与えない）。Ｋの値はＲ４レジスタで得られ、ｓサイクルの計算が終了すると最終結果がＣＳＡで得られる。Ｒ３に値１（ｎ＋２ビット）をロードする代わりに、（図４に破線で示すように）ＭＸ４出力に最初のサイクルで「１」が出力され、残りのサイクルで「０」が出力されるように強制する外部制御を使用することもできることに留意されたい。前述のように、初期設定ステップでＣＳＡの内容をゼロ化することによって（Ｂ＋Ｋ＊Ｎ）／２sの計算を行うことができる。
【０１３５】
正規乗算（ＲＭＵＬ）
本発明の方法により、ＰＫＩ装置を使用して正規乗算を行う方法は様々ある。以下のプロセスは、ＣＳＡ：Ｒ４＝Ａ＊Ｂ＋Ｃ＊Ｄ＋ＣＳＡ（ＣＳＡの内容には前回行った演算の結果が保持されるか、またはＣＳＡの内容を所望の値に設定することもできる）を計算する可能な１つの方法である。ＲＭＵＬ演算のＭＳＢは、ＣＳＡで得られ、ＬＳＢはＲ４で得られる。
【０１３６】
入力：Ａ、Ｂ、Ｃ、Ｄ、ｎ（Ｂ→Ｒ０、Ｂ＋Ｄ→Ｒ１、Ｄ→Ｒ２、Ａ→Ｒ３、Ｃ→Ａ４）
出力：ＲＭＵＬ（Ａ，Ｂ，Ｃ，Ｄ）＝Ａ＊Ｂ＋Ｃ＊Ｄ＋ＣＳＡ
【０１３７】
【数２１】
2004534266.tif 000027
【０１３８】
ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力を、Ｒ４、ＣＳＡ0、「０」、およびＲ３の入力をそれぞれ選択するように設定する。ｎ回の反復を行った後、レジスタＲ４で結果のｎ個のＬＳＢが得られ、ＣＳＡで結果のｎ個のＭＳＢが得られる。
【０１３９】
モンゴメリ指数
ＰＫＩの指数計算への適用は、ＡE  ｍｏｄＮ（一般性を失わずにＡ＜Ｎ）を計算する前述の指数プロセスに基づく。ＰＫＩ装置を使用してこの計算を行うには、事前計算値Ａ’＝Ａ＊２s  ｍｏｄＮが必要である。この特定のプロセスでは、指数Ｅ＝（ｅm-1，ｅm-2，．．．，ｅ0）の調整（打切り）値Ｅ’が必要であり、ＭＳＢｅm-1が削除され、ビット順序が逆転され、したがってＥ’＝（ｅ0，ｅ1，．．．，ｅm-2）2（ｍはＥ内のビット数）となる。
【０１４０】
プロセス２
入力：ｍ、Ａ’、Ｎ、Ｅ’（Ａ’→Ｒ０、Ａ’＋Ｎ→Ｒ１、Ｎ→Ｒ２、Ａ’→Ｒ３、Ｅ’→Ｒ４）
出力：ＣＳＡ＝ＡE  ｍｏｄＮ（左から右の手法）
【０１４１】
【数２２】
2004534266.tif 000028
【０１４２】
上記のプロセスではループでモンゴメリ自乗と乗算のシーケンスを行う。プロセス２を使用したＰＫＩ装置の動作の詳細をフローチャートの形で図７Ａに示す。この動作はステップ７３０および７３１で開始され、Ａ’、Ｅ’、Ｎ、およびｍ−１の値がＰＫＩ装置に入力される。一連の動作（上記のステップ４．１ないしステップ４．３）を、ステップ７３２ａおよび７３２ｂから始まるループで行い、レジスタＲ４の内容に対して右シフトを行い、ＣＳＡの内容をゼロ化し、Ｒ０の内容のＮＲＭＳＱＲ(s)を行う。ステップ７３２Ｃで、ＣＳＡで得られたＮＲＭＳＱＲ(s)の結果がレジスタＲ０にロードされ、ＣＳＡとレジスタＲ２の内容の加算結果がレジスタＲ１にロードされる。
【０１４３】
ステップ７３２ｄで、上記の指数プロセスのステップ４．３の処理が行われ、Ｒ４のＬＳＢを検査し、それが「１」の場合、ＣＳＡの内容がゼロ化され、レジスタＲ０およびＲ３の内容のＮＲＭＭ(s)が行われ、その結果がＲ０に格納されると共にＲ２の内容にも加算され、レジスタＲ１に格納される。処理はステップ７３２ｅに進み、ループ・インデックスｉの値を１だけ減少させ、ステップ７３２ｆで、そのループ・インデックスｉがゼロか否かを調べる。ｉがゼロ化されていない場合、ステップ７３２ａに移行してこのプロセスをもう一度反復する。ｉがゼロの場合は、ＣＳＡの内容がゼロ化され、Ｒ０の内容に対してＭＭＵＬＢＹ１(s)演算を行う。ＭＭＵＬＢＹ１(s)演算を行って２s因子を削除した後、ＣＳＡでべき乗計算（縮減）結果が得られる。
【０１４４】
図７Ａに示すプロセスは、外部制御（図示せず）を使用して行われることを理解されたい。この制御は、プロセッサ／コントローラを使用してソフトウェアによって、または専用ハードウェアを付加することによって行うことができる。
【０１４５】
右から左に実行される２進べき乗計算、ｍ配列べき乗計算、スライディング・ウィンドウべき乗計算など、その他のべき乗計算プロセスも同様にして実施することができる（「Ｈａｎｄｂｏｏｋ  ｏｆ  Ａｐｐｌｉｅｄ  Ｃｒｙｐｔｏｇｒａｐｈｙ」、Ａｌｆｒｅｄ  Ｊ．  Ｍｅｎｅｚｅｓ，Ｐａｕｌ  Ｃ．  ｖａｎ  Ｏｏｒｓｃｈｏｔ、およびＳｃｏｔｔ  Ａ．  Ｖａｎｓｔｏｎｅ、ＣＲＣ  Ｐｒｅｓｓ、１９９６年１０月）。
【０１４６】
ＰＫＩ装置を使用した他のべき乗計算の例を、以下のプロセスで説明する。このプロセス（右から左の２進べき乗計算）では、直接、指数値を使用し、そのビットの調整は不要である。
【０１４７】
プロセス３
入力：ｍ（＞１）、Ａ’、Ｎ、Ｅ（Ａ’→Ｒ０、Ａ’＋Ｎ→Ｒ１、Ｎ→Ｒ２、Ａ’→Ｒ３、Ｅ→Ｒ４）
出力：ＣＳＡ＝ＡE  ｍｏｄＮ
【０１４８】
【数２１】
2004534266.tif 000029
【０１４９】
このプロセスのＰＫＩ動作を図７Ｂに示す。このプロセスは、ステップ７５０および７５１で開始され、値Ａ’、Ｅ’、Ｎ、およびｍ−１がＰＫＩ装置に入力され、フラグが「１」に設定される。上記の指数プロセスのステップ５．１ないし５．４で行われる演算が、ステップ７５２ａから開始され、レジスタＲ４の内容に対して右シフトが行われる。ステップ７５２ｂで、Ｒ４のＬＳＢを調べ、「１」の場合はステップ７５２ｃでさらにフラグが「１」の状態か否かを判断する検査を行う。フラグの状態が「１」の場合、レジスタＲ３にレジスタＲ０の内容がロードされ、フラグの状態が「０」にリセットされる。ステップ７５２ｃでフラグの状態が「０」の場合、ＣＳＡの内容がゼロ化され、レジスタＲ０およびＲ３の内容に対してＮＲＭＭ(s)演算を行い、その結果がＣＳＡで得られ、Ｒ３レジスタにロードされる。動作は、ステップ７５２ｄに制御を渡して継続される。
【０１５０】
ステップ７５２ｂでＲ４レジスタのＬＳＢの状態が「１」でない場合、処理はステップ７５２ｄに進み、ＣＳＡの内容がゼロ化され、Ｒ０の内容のＮＲＳＱＲ(s)演算が行われ、その結果がＣＳＡで得られる。次に、ＮＲＳＱＲ(s)の結果はレジスタＲ０にロードされ、レジスタＲ２の内容にも加算される。ＣＳＡとレジスタＲ２の内容の加算結果がレジスタＲ１に格納される。このプロセスはステップ７５２ｆに進み、ループ・インデックスｉを１だけ減少させる。ステップ７５２ｅで、ｉがゼロか否かを調べる。ｉがゼロでない場合、制御はステップ７５２ａに渡されてもう一度反復が行われる。ｉがゼロの場合は、ＣＳＡの内容がゼロ化され、Ｒ０およびＲ３の内容のＮＲＭＭ(s)演算を行い、その結果がＣＳＡで得られ、レジスタＲ０にロードされる。レジスタＲ２とＣＳＡの内容の加算がレジスタＲ１に格納され、ＣＳＡの内容がゼロ化され、ＭＭＵＬＢＹ１(s)が行われる。次に、最終（縮減）結果がＣＳＡで得られる。
【０１５１】
前述のように、この動作の各ステップは外部制御を使用して行われる。
べき乗計算プロセスの様々な実施態様の選択に柔軟性をもたせることは、実際の適用において重要である。たとえば、右から左に実行されるべき乗計算プロセスによって、２つのＰＫＩ装置の並列使用が可能になる。
【０１５２】
また、本発明の方法は、特に従来のモンゴメリ乗算方法で行われる減算の検出に基づく攻撃に対して、ＰＫＩ装置のセキュリティを大幅に向上させることを理解されたい。そのような攻撃方法では、行われた縮減演算を暴露することによってユーザの秘密（プライベート）鍵を計算する（Ｗ．  Ｓｃｈｉｎｄｌｅｒ「Ａ  Ｔｉｍｉｎｇ  Ａｔｔａｃｋ  ａｇａｉｎｓｔ  ＲＳＡ  ｗｉｔｈ  ｔｈｅ  Ｃｈｉｎｅｓｅ  Ｒｅｍｉｎｄｅｒ  Ｔｈｅｏｒｅｍ」、第２回国際ワークショップ、米国マサチューセッツ州ウースター、２０００年８月）。このような攻撃に対して現在使用されている一般的な方法は、追加の（ダミー）減算を行うことであり、これは当然ながらより多くの時間と電力を消費する。本発明の方法では減算は行わないため、そのような方法を使用して秘密鍵を暴くことは不可能である。
【０１５３】
前述のように、本発明の方法を使用して、並列稼働する２つのＰＫＩ装置を使用して右から左に実行されるべき乗プロセスを実施することができる。当業者ならわかるように、このような並列実施態様は、システムのセキュリティをさらに向上させる。そのような並列システムでいつどのような演算が行われるかを追跡し、特定するのは困難なため、敵対的作業はさらに難しくなる。
【０１５４】
モンゴメリ・インタリーブド乗算
図５で、モンゴメリ・インタリーブド乗算の異なるステップ（Ｉ、ＩＩ、ＩＩＩおよびＩＶ）のために各レジスタ（Ｒ０、Ｒ１、Ｒ２、Ｒ３、およびＲ４）にロードされる値と、各マルチプレクサ（ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４）の入力の選択について説明されている。各ステップで、レジスタにそれぞれの値がロードされ、それに対応する入力を供給するようにＭＵＸの制御入力が設定され、それぞれの積を計算するｓ回の反復のプロセスが行われる。
【０１５５】
以下の説明では、Ａ・Ｂ  ｍｏｄＮのモンゴメリ・インタリーブド・モジュラ乗算について説明する。ここで、Ａ、Ｂ、およびＮは２ｎビットの値である。各整数値Ａ、Ｂ、およびＮはｎビットの部分値の対として扱われる。たとえば、Ａ＝Ａ1＊２n＋Ａ0の部分値は、Ａ＝（Ａ1，Ａ0）と表す。ただし、Ａ1はＡのｎ個のＭＳＢを示し、Ａ0はＡのｎ個のＬＳＢを示す。同様に、Ｂ＝Ｂ1＊２n＋Ｂ0およびＮ＝Ｎ1＊２n＋Ｎ0の部分値は、Ｂ＝（Ｂ1，Ｂ0）およびＮ＝（Ｎ1，Ｎ0）で示す。この実施形態に（ソフトウェアによって）変更を加え、任意の長さのＡ、Ｂ、およびＮについてＡ・Ｂ  ｍｏｄＮの計算を可能にすることもできる。他の態様では、各整数は、各部分値がｎビットのｌ個の部分値から成る。
【０１５６】
ステップＩで、レジスタＲ０、Ｒ１、Ｒ２、およびＲ３にそれぞれＢ0、Ｂ0＋Ｎ0、Ｎ0、およびＡ0をロードして（Ａ0＊Ｂ0＋Ｎ0＊Ｋ0）／２-nの計算を行う。さらに、ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力を、それぞれＫI、ＫI、「０」、Ｒ３の入力を選択するように設定する。結果（Ａ0＊Ｂ0＋Ｎ0＊Ｋ0）／２-n  Ａ0＊Ｂ0２-s  ｍｏｄＮ0はＣＳＡに格納されたままである。このステップではＭＸ２はＫI出力を選択するため、レジスタＲ４には次のステップの計算に必要なＫ0値のビットがロードされる。
【０１５７】
ステップＩＩで、正規乗算を行ってＡ0・Ｂ1＋Ｎ1・Ｋ0＋ＣＳＡ(I)を計算する。ここでＣＳＡ(I)は前のステップであるステップＩで得られた結果である。Ｒ０、Ｒ１、Ｒ２、およびＲ３レジスタにそれぞれ値Ｂ1、Ｂ1＋Ｎ1、Ｎ1、およびＡ0がロードされ、ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力が、それぞれＲ4、ＣＳＡ0、「０」、Ｒ３の入力を選択するように設定される。Ｒ３ビットの右シフトは周期ビット・ローテーションであり、そのため実際にはＲ３にＡ0の値を再ロードする必要がないことに留意されたい。このステップでは、この装置を正規乗算の計算に使用するため、結果のｎ個のＬＳＢがＲ４レジスタの直列入力に供給され、結果のｎ個のＭＳＢはＣＳＡに残る。
【０１５８】
次のステップであるステップＩＩＩで、（Ａ1＊Ｂ0＋Ｎ0＊Ｋ1＋Ｒ４＊２n＋ＣＳＡ）／２-n  ｍｏｄＮ0の計算を行う。このために、このステップの演算の前に、Ｒ４レジスタに格納されている値をＣＳＡに格納し、ＣＳＡの内容をＲ４レジスタに格納する。さらに、レジスタＲ０、Ｒ１、Ｒ２、およびＲ３に、それぞれ値Ｂ0、Ｎ0＋Ｂ0、Ｎ0、およびＡ1をロードし、ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力を、それぞれＫI、ＫI、Ｒ４、Ｒ３の入力を選択するように設定する。このステップの処理中、Ｒ４レジスタの内容にＫ1のビットＫI1がロードされる。このステップの結果は、最終ステップの計算のためにＣＳＡに残される。
【０１５９】
最後のステップＩＶで、Ａ1＊Ｂ1＋Ｎ1＊Ｋ1＋ＣＳＡ(III)の正規乗算を行う。ここでＣＳＡ(III)は、ステップＩＩＩで得られた結果である。レジスタＲ０、Ｒ１、Ｒ２、およびＲ３に、それぞれ値Ｂ1、Ｂ1＋Ｎ1、Ｎ1、およびＡ1をロードし、ＭＸ１、ＭＸ２、ＭＸ３、およびＭＸ４の制御入力が、それぞれＲ４、ＣＳＡ0、「０」、Ｒ３の入力を選択するように設定される。このステップでは、結果のｎ個のＬＳＢがＲ４レジスタにロードされ、結果のｎ個のＭＳＢ（ｎ＋１ビットの場合もある）がＣＳＡで得られる。
【０１６０】
このプロセスの各ステップ（ステップＩないしステップＶＩ）の最終結果は、Ｎより大きい。したがって、縮減が必要な場合がある。必要な場合は、各ステップの後にソフトウェアによって縮減を行う。あるいは、拡張非縮減手法を使用してインタリーブド乗算の同じ方法を実施することができ、その場合、各ステップ後に得られた結果の縮減を行わなくても済む。
【０１６１】
さらに、インタリーブド乗算の暫定結果を記憶するソフトウェアを使用して、より大きな値の計算を行うこともできる。
以上の各例および説明は、例示のためのものであって、決して本発明を限定するものではないことは言うまでもない。当業者ならわかるように、本発明は、本発明の範囲から逸脱することなく、上述の技法とは異なる方法を使用して多様な方法で実施することができる。
【図面の簡単な説明】
【０１６２】
【図１】乗算および加算演算を行う従来技術の装置の概略を示すブロック図である。
【図２】非縮減および拡張モンゴメリ乗算を計算する本発明の好ましい実施形態の概略を示すブロック図である。
【図３】ＫIビットを生成する本発明の好ましい一実施形態を示す概略図である。
【図４】モンゴメリ乗算を使用してモジュラ算術演算を行う本発明の好ましい実施形態の概略を示すブロック図である。
【図５】本発明の好ましい実施形態による、インターリーブド・モンゴメリ乗算を計算するプロセスを示す概略図である。
【図６】図６Ａは、本発明の方法によるＣＳＡ装置の可能な実施形態を示す略図である。  図６Ｂは、本発明の方法によるＣＳＡ装置の可能な実施形態を示す略図である。
【図７−Ａ】ＰＫＩ装置を使用してべき乗計算を行う方法を示すフローチャートである。
【図７−Ｂ】ＰＫＩ装置を使用してべき乗計算を行う方法を示すフローチャートである。
【図１】
2004534266.tif 000033
【図５】
2004534266.tif 000034
【図７−Ａ】
2004534266.tif 000035
【図７−Ｂ】
2004534266.tif 000036
【国際公開パンフレット】
2004534266.tif 000037
2004534266.tif 000038
2004534266.tif 000039
2004534266.tif 000040
2004534266.tif 000041
2004534266.tif 000042
2004534266.tif 000043
2004534266.tif 000044
2004534266.tif 000045
2004534266.tif 000046
2004534266.tif 000047
2004534266.tif 000048
2004534266.tif 000049
2004534266.tif 000050
2004534266.tif 000051
2004534266.tif 000052
2004534266.tif 000053
2004534266.tif 000054
2004534266.tif 000055
2004534266.tif 000056
2004534266.tif 000057
2004534266.tif 000058
2004534266.tif 000059
2004534266.tif 000060
2004534266.tif 000061
2004534266.tif 000062
2004534266.tif 000063
2004534266.tif 000064
2004534266.tif 000065
2004534266.tif 000066
2004534266.tif 000067
2004534266.tif 000068
2004534266.tif 000069
2004534266.tif 000070
2004534266.tif 000071
2004534266.tif 000072
2004534266.tif 000073
2004534266.tif 000074
2004534266.tif 000075
2004534266.tif 000076
2004534266.tif 000077
2004534266.tif 000078
2004534266.tif 000079
2004534266.tif 000080
2004534266.tif 000081
2004534266.tif 000082
2004534266.tif 000083
2004534266.tif 000084
2004534266.tif 000085
2004534266.tif 000086
2004534266.tif 000087
2004534266.tif 000088
2004534266.tif 000089
2004534266.tif 000090
2004534266.tif 000091
2004534266.tif 000092
2004534266.tif 000093
2004534266.tif 000094
2004534266.tif 000095
2004534266.tif 000096
2004534266.tif 000097
2004534266.tif 000098
2004534266.tif 000099
2004534266.tif 000100
2004534266.tif 000101
2004534266.tif 000102
2004534266.tif 000103
2004534266.tif 000104
2004534266.tif 000105
2004534266.tif 000106
2004534266.tif 000107
2004534266.tif 000108
2004534266.tif 000109
2004534266.tif 000110
2004534266.tif 000111
2004534266.tif 000112
【国際公開パンフレット（コレクトバージョン）】
2004534266.tif 000113
【国際調査報告】
2004534266.tif 000114
2004534266.tif 000115