(57)【特許請求の範囲】
【請求項１】
剰余の法nの有効ワード長をm、１ワード当たりのビット長をk、2m×k＝Rとするモンゴメリ乗算剰余における変換パラメータR2 (mod n)の演算方法のプログラムであって、
A）H0=2v×R (mod n)（ただし、vは整数であり、v≧1かつ(m×k)/vは整数）を計算する工程であって、
A-1）２つのレジスタREG1, REG2を、REG1=n, REG2=2(m-1)×kにより初期化する（ただし、REG1はm個のワードから、REG2はm個のワードと１ビットキャリーレジスタから構成されるレジスタ）工程と、
A-2）REG2に対し、REG1の値を法とした2倍剰余算をk+v回繰り返すことで2v×R (mod n)を得る（ただし、vは整数であり、v≧１かつ（m×k）/vは整数である）工程と、
を含む第１工程と、
B）i=1,2,...,pに関して、Hi=REDC(Hi-1,Hi-1)nを繰り返すことで、H0=2v×R (mod n)からHp=2v×2^p×R(mod n)を計算する（ただし、pは2p≧(m×k)/v >2p-1を満たす整数を、REDCはモンゴメリ乗算剰余REDC(a,b)n=a×b×R-1 (mod n)を、x^iは指数演算xiをそれぞれ表す）第２工程と、
C）2p>(m×k)/vの場合、第２工程で得られたHpに対しHp=REDC(Hp, g)nを計算することでHp=R2 (mod n)を計算し（ただし、g=2k×E(p,m,k)、E(p,m,k)=2×m-(v×2p)/kである）、最後にHpをR2 (mod n)として出力する第３工程と、
を含むモンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】  本発明は、情報セキュリティ分野に属するものであり、暗号処理を目的としたべき乗乗算剰余演算を高速に行うための計算技術に関する。
【背景技術】  今後の情報化社会の発展に伴い、電子マネー、住民基本台帳ネットワークなどの情報ネットワークを利用したサービスが普及すると予想される。これらのサービスを安全に運用するためには、情報セキュリティ技術が必須であり、情報セキュリティの基盤技術として暗号技術が用いられる。暗号技術を用いることで、暗号、デジタル署名、認証などの機能を実現し、個人情報を第三者からの不正なアクセスから防ぐことができる。
暗号技術を実現するための暗号方式は現在まで様々な方式が知られており、これらは共通鍵暗号方式と公開鍵暗号方式の２種類に大別される。共通鍵暗号方式と呼ばれるものは、暗号化と復号化で同一の鍵（秘密鍵）を用いる方式であり、この秘密鍵を送信者と受信者以外の第三者にわからない情報とすることで安全性を保つ方式である。公開鍵暗号方式とは、暗号化と復号化で異なる鍵を用いる方式であり、暗号化を行うための鍵（公開鍵）を一般に公開する代わりに、暗号文を復号するための鍵（個人鍵）を受信者のみの秘密情報とすることで安全性を保つ方式である。
秘密鍵暗号方式を用いる場合、前述の秘密鍵を送受信者以外の第三者にわからない安全な形で共有する必要がある。これに対し公開鍵暗号方式は、送受信者間で秘密情報を共有する必要がないというメリットを有するが、処理を行うための計算量が共通鍵暗号方式と比べて非常に大きいというデメリットを有する。よって、公開鍵暗号方式においては、計算処理の高速化が大きな課題となる。
公開鍵暗号方式は、ＲＳＡ、楕円曲線暗号が代表的な方式として知られている。ＲＳＡにおいてはべき乗剰余演算を用いた処理が、楕円曲線暗号においては点のスカラー倍算と呼ばれる演算を用いた処理がそれぞれ行われる。これら２つの演算のいずれについても、整数ａ，ｂ，ｎからｙ＝ａ×ｂ（ｍｏｄ  ｎ）（０≦ａ，ｂ＜ｎ）を計算する乗算剰余演算が基本演算として用いられる。ただし、乗算剰余演算をそのままハードウェアもしくはソフトウェアにて実装した場合、処理時間が大きく処理効率が悪いため、乗算剰余処理の代わりにモンゴメリ乗算剰余と呼ばれる演算法を用いて計算するのが一般的である。
モンゴメリ乗算剰余とは、整数ａ，ｂ，ｎからｙ＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）の形で示されるｙを計算する演算法である。ただし、Ｒ＝２ｍ×ｋであり、ｋは１ワードあたりのビット長、ｍはｎの有効ワード長を表す。モンゴメリ乗算剰余を用いることで、通常の乗算剰余処理より高速な処理を実現することができる。モンゴメリ乗算剰余のアルゴリズムを図１に示す。ただし、ｘ＝（ｘｍ−１，．．．，ｘ１，ｘ０）は、整数値ｘをｍ個のワード値ｘｉ（ｉ＝ｍ・１，．．．，１，０，０≦ｘｉ＜２ｋを用いて表現する形式を表す。
前述したように、モンゴメリ乗算剰余で行う演算はａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）であり、通常の乗算剰余演算ａ×ｂ（ｍｏｄ  ｎ）とは異なる演算を行う。よって、べき乗剰余演算およびを正しく実行するためには、モンゴメリ乗算剰余に対して与える入力データをモンゴメリ系と呼ばれるデータに変換する必要がある。通常の乗算剰余演算に与える任意の入力データをｘ、ｘをモンゴメリ系に変換したデータをｘ’とし、ｘからｘ’への変換（モンゴメリ変換）をｘ’＝Ｍｏｎｔ（ｘ）、ｘ’からｘへの変換（モンゴメリ逆変換）をｘ＝Ｍｏｎｔ−１（ｘ’）と表した場合、これらは以下の式で与えられる。
モンゴメリ変換：ｘ’＝Ｍｏｎｔ（ｘ）＝ｘ×Ｒ（ｍｏｄ  ｎ）
モンゴメリ逆変換：ｘ＝Ｍｏｎｔ−１（ｘ’）＝ｘ’×Ｒ−１（ｍｏｄ  ｎ）
モンゴメリ乗算剰余をｙ＝ＲＥＤＣ（ａ，ｂ）ｎ＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）と記したとき、前述のモンゴメリ変換およびモンゴメリ逆変換は、ＲＥＤＣを用いて以下のように表すことができる。ただし、ＨはＨ＝Ｒ２（ｍｏｄ  ｎ）で表される値であり、事前計算により求められる値である（以下、Ｈをモンゴメリ変換パラメータと称す）。
モンゴメリ変換：ｘ’＝ＲＥＤＣ（ｘ，Ｈ）ｎ＝ｘ×Ｒ２×Ｒ−１＝ｘ×Ｒ（ｍｏｄ  ｎ）
（ただし、Ｈ＝Ｒ２（ｍｏｄ  ｎ））
モンゴメリ逆変換：ｘ＝ＲＥＤＣ（ｘ’，１）ｎ＝ｘ’×１×Ｒ−１＝ｘ’×Ｒ−１（ｍｏｄ  ｎ）
以上に基づいて、モンゴメリ乗算剰余を用いたべき乗剰余処理のアルゴリズムを図２に示す。
図２では、バイナリ法と呼ばれるべき乗剰余演算法をベースにモンゴメリ乗算剰余を用いたアルゴリズムを示しており、入力値ａ，ｄ，ｎからべき乗剰余演算結果ｙ＝ａｄ（ｍｏｄ  ｎ）を計算する。１行目でｙの初期値として１を与え、２行目でモンゴメリ変換パラメータＨ＝Ｒ２（ｍｏｄ  ｎ）を計算した後、３行目でａとｙに対しモンゴメリ変換を行いａ’とｙ’を得る。４〜７行目のループでは、ｄのビット値に応じてモンゴメリ乗算剰余を１回もしくは２回繰り返す処理を、ｄの最下位ビットから最上位ビットについて繰り返す。このループで計算されたｙ’に対し８行目でモンゴメリ逆変換を行うことで、最終的な演算結果ｙを得る。
Ｈ＝Ｒ２（ｍｏｄ  ｎ）を計算するためのもっとも自明な計算法としては、整数ａ，ｂ，ｎから加算、減算を繰り返す方法である。Ｒ＝２ｘとした場合、図３に示すアルゴリズムでＨを計算することができる。
図３のアルゴリズムについて説明する。
１行目では、Ｒ（ｍｏｄ  ｎ）を計算する。Ｒ（ｍｏｄ  ｎ）の算出法は様々な方法があるが、例えばＲ＝２ｘに対しｎの有効ビット長がｘである場合、Ｒ（ｍｏｄ  ｎ）＝０−ｎにより簡単に計算できる。
３〜５行目では、Ｈ＝Ｒ（ｍｏｄ  ｎ）に対し、Ｈ＋Ｈを計算した後、結果がｎ以上である場合にｎを減算することで、Ｈ＋Ｈ（ｍｏｄ  ｎ）の加算剰余（２倍剰余）を行っている。なお、Ｈ＋Ｈの計算は、左１ビットシフト演算でも実現可能である。この加算剰余演算をｘ回繰り返すことで、Ｒ×２ｘ（ｍｏｄ  ｎ）＝Ｒ２（ｍｏｄ  ｎ）を算出する。
ただし、図３のアルゴリズムでは、３〜５行目で加算剰余をｘ回繰り返すため、処理速度が遅いという欠点を有する。例えばｎが１０２４ｂｉｔの場合のＲＳＡ演算では、Ｒ＝２１０２４であるが、１０２４回の加算剰余が行う必要があり、この計算量は膨大である。
この欠点を解消した計算法が種々提案されており、以下に示す従来法１（たとえば、特許文献１〜特許文献４）あるいは従来法２（たとえば、特許文献５）などがある。
いずれの方法も、シフト算、減算のみを用いて計算を行うのではなく、ＲＥＤＣ演算、シフト算および減算を組み合わせることで全体の計算を高速化していることが特徴である。
以下に、従来法１および従来法２について簡単に説明する。
なお、ｋを１ワードあたりのビット長、ｎをｍワード値で表現された値、ｎの最上位から連続する’０’の個数をｑとする。例えばｋ＝８の場合、ｎのビット列が００１０１０１１  １１００１１１１ならばｍ＝２，ｑ＝２であり、ｎのビット列が１０００１００１  １１１００１１０  １１１００１０１ならばｍ＝３，ｑ＝０である。
〈従来法１〉
従来法１は、主に以下のＳｔｅｐＡ１，ＳｔｅｐＢ１から構成される。
ここで、入力：ｎ（剰余の法）とし、出力：Ｒ２（ｍｏｄ  ｎ）（ただし、Ｒ＝２ｍ×ｋ（ｍｏｄ  ｎ）とする。
0004616169.tif 000002
ＳｔｅｐＢ１：ＲＥＤＣ演算を用いて、Ｈ０からＨ＝Ｒ２（ｍｏｄ  ｎ）を計算する。
従来法１におけるＳｔｅｐＡ１とＳｔｅｐＢ１のフローチャートを図４に示す。
図４において、ステップ１０１では２つのレジスターＲＥＧ１，ＲＥＧ２に初期値として、ＲＥＧ１：＝ｎ，ＲＥＧ２：＝０を与える。ただし、ｎの有効ワード長はｍであり、ｎを右詰でＲＥＧ１に格納した際の最上位ビットから連続する’０’の個数をｑと表す。
ステップ１０２では、ＲＥＧ１に対し１ビット左シフトをｑ回繰り返し、ＲＥＧ１＝ｎ’＝２ｑ×ｎとする。
ステップ１０３では、ＲＥＧ２：＝ＲＥＧ２−ＲＥＧ１を計算し、ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ’）とする。
ステップ１０４では、以下の処理をｖ＋ｑ回繰り返し、ＲＥＧ２＝２ｍ×ｋ＋ｖ＋ｑとする。ただし、ｖはｖ≧１かつｍ，ｋに対し（ｍ×ｋ）／ｖが２のべき乗となるような整数である。
▲１▼ＲＥＧ２を左１ビットシフトする。
▲２▼ＲＥＧ２≧ＲＥＧ１ならば、ＲＥＧ２：＝ＲＥＧ２−ＲＥＧ１を計算する。
ステップ１０５では、ＲＥＧ１およびＲＥＧ２に対して１ビット右シフト処理をｑ回繰り返すことで、ＲＥＧ１＝ｎ，ＲＥＧ２＝Ｈ０＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）とする。
ステップ１０６では、ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ＲＥＧ２）ｎをｐ回繰り返すことで、Ｈ＝ＲＥＧ２＝２２×ｍ×ｋ＝Ｒ２（ｍｏｄ  ｎ）を計算し、この計算結果を出力して終了する。ただし、ｐはｐ＝ｌｏｇ２（（ｍ×ｋ）／ｖ）を満たす整数を表し、ＲＥＤＣ（Ａ，Ｂ）ｎはモンゴメリ乗算剰余ＲＥＤＣ（Ａ，Ｂ）ｎ＝Ａ×Ｂ×２−ｍ×ｋ（ｍｏｄ  ｎ）を表すものとする。
この従来法１に必要な演算回数を以下の表１に示す。ただし、ＳＦＴは１ビットシフトを、ＳＵＢは減算を、ＲＥＤＣはモンゴメリ乗算剰余演算をそれぞれ表す。
0004616169.tif 000003
ステップ１０６におけるｐは、ｐ＝ｌｏｇ２（（ｍ×ｋ）／ｖ）を満たす整数であるが、これを満たすためには（ｍ×ｋ）／ｖが整数ｘを用いて（ｍ×ｋ）／ｖ＝２ｘと表せる、すなわち２のべき乗の値である必要がある。従来法１ではこの条件によりｖの値の選択が制限されるため、ｎの有効ビット長によってはｖの値を大きくする必要がある。表１から、ＳＦＴおよびＳＵＢの計算回数はｖに比例するため、ｖを大きくすることで全体の計算量が大きくなるという欠点がある。
具体的な暗号処理を例にその演算回数を以下を示す。
例１：１０２４−ｂｉｔ  ＲＳＡ暗号
この場合、ｎは１０２４ｂｉｔである。１ワード＝３２ｂｉｔとするとｋ＝３２であり、ｎの有効ワード長ｍ＝３２となる。１ワードあたりのビット長ｋとｎの有効ワード長ｍとを乗算したｋ＊ｍとｎの全ビット数とが一致することから、ｎの最上位ビット＝１となりｑ＝０である。また、ｍ×ｋ＝１０２４なので、ｖ＝１，２，４．．．，１０２４が選択可能である。ｖ＝１の場合、ＳＦＴが１回、ＳＵＢが１．５回、ＲＥＤＣがｐ＝ｌｏｇ２（（３２×３２）／１）＝１０回である。
例２：１６３−ｂｉｔ楕円曲線暗号
この場合、ｎは１６３ｂｉｔである。１ワード＝８ｂｉｔとするとｋ＝８であり、ｎの有効ワード長ｍ＝２１となる。ｎをビット長ｋ＝８、有効ワード長ｍ＝２１で表現すると、最上位に位置するｍ＊ｋ−１６３＝２１×８−１６３＝５ｂｉｔが０となり、ｑ＝５となる。また、ｍ×ｋ＝１６８なので、ｖ＝２１，４２，８４，１６８が選択可能である。ｖ＝２１の場合、ＳＦＴが４×５＋２１＝４１回、ＳＵＢが０．５×（５＋２１）＋１＝１４回、ＲＥＤＣがｐ＝ｌｏｇ２（（２１×８）／２１）＝３回である。
〈従来法２〉
従来法２は以下のＳｔｅｐＡ２，ＳｔｅｐＢ２から構成される。
ここで、入力：ｎ（剰余の法）とし、出力：Ｒ２（ｍｏｄ  ｎ）（ただし、Ｒ＝２ｍ×ｋ（ｍｏｄ  ｎ））とする。
ＳｔｅｐＡ２：Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する。特許文献５では２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する方法を特定していないが、例として従来法１における２ｖ×Ｒ（ｍｏｄ  ｎ）の計算法を挙げている。
ＳｔｅｐＢ２：Ｈ０から、ＲＥＤＣ演算を用いてＨ＝Ｒ２（ｍｏｄ  ｎ）を計算する。これは、ｍ×ｋの各ビット値を最上位ビットから最下位ビットの順番に検出し、’０’’１’に応じてＲＥＤＣ演算を１回もしくは２回行うことを繰り返すことで行う。
ＳｔｅｐＡ２，ＳｔｅｐＢ２のフローチャートを図５に示す。なお、ＳｔｅｐＡ２における２ｖ×Ｒ（ｍｏｄ  ｎ）の計算法は、従来法１のＳｔｅｐＡ１と同じ方法を用いた場合について示す。
図５において、ステップ２０１では、２つのレジスターＲＥＧ１，ＲＥＧ２に対して初期値としてＲＥＧ１：＝ｎ，ＲＥＧ２：＝０を与える。ただし、ｎの有効ワード長はｍであり、ｎを右詰でＲＥＧ１に格納した際の最上位ビットから連続する’０’の個数をｑと表す。
ステップ２０１では、ＲＥＧ１に対し１ビット左シフトをｑ回繰り返し、ＲＥＧ１＝ｎ’＝２ｑ×ｎとする。
ステップ２０２では、ＲＥＧ２：＝ＲＥＧ１−ＲＥＧ２を計算し、ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ’）とする。
ステップ２０３では、以下の処理をｑ＋ｖ回繰り返し、ＲＥＧ２＝２ｍ×ｋ＋ｖ＋ｑ（ｍｏｄ  ｎ’）とする。
▲１▼ＲＥＧ２を左１ビットシフトする。
▲２▼ＲＥＧ２≧ＲＥＧ１ならば、ＲＥＧ２：＝ＲＥＧ２−ＲＥＧ１を計算する。
ステップ２０４では、ＲＥＧ１およびＲＥＧ２をｑ回右シフトし、ＲＥＧ０にＲＥＧ２をコピーし、ＲＥＧ１＝ｎ，ＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）とする。ただし、ｖは整数でありｖ≧１かつ（ｍ×ｋ）／ｖが整数である。
ステップ２０１では、以下の処理をｉ＝ｐ’−２，．．．，１，０についてｐ’−１回繰り返すことで、ＲＥＧ２＝２２×ｍ×ｋ＝Ｒ２（ｍｏｄ  ｎ）を計算し、計算結果を出力して終了する。ただし、ｐ’は（ｍ×ｋ）／ｖのビット長を表し、ＲＥＤＣ（Ａ，Ｂ）ｎはモンゴメリ乗算剰余ＲＥＤＣ（Ａ，Ｂ）ｎ＝Ａ×Ｂ×２−ｍ×ｋ（ｍｏｄ  ｎ）を表す。
▲３▼ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ＲＥＧ２）ｎを計算する
▲４▼（ｍ×ｋ）／ｖのｉ番目のビット値＝１ならば、ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ＲＥＧ０）ｎを計算する。
前述した従来法１の処理を行うためには、ｐ＝ｌｏｇ２（（ｍ×ｋ）／ｖ）が整数である必要があり、すなわち（ｍ×ｋ）／ｖが２のべき乗であるという制限がある。この制限を満たすためには、以下の（ｉ）（ｉｉ）の２段階によりｍ，ｋ，ｖを設定する必要がある。
（ｉ）ｎのビット長および１ワードあたりのビット長からｍ，ｋを決定する。
（ｉｉ）（ｉ）で決定したｍ，ｋに対し（ｍ×ｋ）／ｖが２のべき乗となるようにｖの値を設定する。
すなわち、（ｉ）により、ｎのビット長およびプロセッサにおける１ワードあたりのビット長から一意に決定するｍ，ｋの値に対し（ｉｉ）でｖの値を調整することで（ｍ×ｋ）／ｖが２のべき乗の値となるように設定する。問題となるのは、（ｉｉ）においてｖの値を調整する際に、（ｍ×ｋ）／ｖが２のべき乗の値でなければならないという制限により、ｖの値が大きくなると、パラメータＨの計算処理全体の計算量が大きくなる場合があることである。この問題の具体例は、前述の例１、例２におけるシフトおよび減算の回数を比較することでわかる。例１では、ｖの値はｖ＝１，２，４，．．．と非常に小さな値を設定できたが、例２ではｖ＝２１，４２，．．．と大きな値を設定する必要がある。表１の通り、全体の計算処理におけるシフトおよび減算回数の合計はｖの１．５倍に比例する。つまりｖ＝１の場合と比較して、ｖ＝２１の場合シフトおよび減算回数の合計が３０回増加することになる。
これに対し、従来法２では（ｍ×ｋ）／ｖが整数であれば処理を行うことができるので、ｖの値を従来法１より広い条件で設定でき、最適なｖの値を設定することで従来法１より少ない計算量でパラメータＨを計算することができる。
従来法２に必要な演算回数を表２に示す。ただし、ＳＦＴは１ビットシフトを、ＳＵＢは減算を、ＲＥＤＣはモンゴメリ乗算剰余演算をそれぞれ表す。なおＷ（ｘ）は、ｘの最上位ビットを除く’１’の個数を表し、ステップ２０６において（ｍ×ｋ）／ｖのビット値が１である場合のＲＥＤＣ演算の回数である。例えば、Ｗ（（１００００）２）＝０，Ｗ（（１０００１０１）２）＝２である。ただし（．．．）２は２進表現を表す記号であり、例えば（１１０１）２＝１３、（１１１００）２＝２８である。
0004616169.tif 000004
具体的な暗号処理を例にその演算回数を以下を示す。
例３：１０２４−ｂｉｔ  ＲＳＡ
この場合、ｎは１０２４ｂｉｔである。１ワード＝３２ｂｉｔとするとｋ＝３２であり、ｎの有効ワード長ｍ＝３２となる。前述と同様に、ｋ＊ｍビットとｎの全ビット数が一致していることか、ｎの最上位ビット＝１となりｑ＝０である。また、ｍ×ｋ＝１０２４なので、ｖは１０２４の任意の因数（ｆａｃｔｏｒ）から選択可能である。ｖ＝１の場合、ＳＦＴが１回、ＳＵＢが１．５回、ＲＥＤＣがｐ＝ｌｏｇ２（（３２×３２）／１）＝１０回である。
例４：１６３−ｂｉｔ楕円曲線暗号
この場合、ｎは１６３ｂｉｔである。１ワード＝８ｂｉｔとするとｋ＝８であり、ｎの有効ワード長ｍ＝２１となる。この場合も前述と同様に、ｋ＊ｍビットにｎを右詰にした場合、最上位２１×８・１６３＝５ｂｉｔが０となりｑ＝５である。また、ｍ×ｋ＝１６８なので、ｖは１６８の任意の因数（ｆａｃｔｏｒ）から選択可能である。ｖ＝２１の場合、ＳＦＴが４×５＋２１＝４１回、ＳＵＢが０．５×（５＋２１）＋１＝１４回であり、ＲＥＤＣについては（ｍ×ｋ）／ｖ＝（１０００）２からｐ’−１＋Ｗ（（ｍ×ｋ）／ｖ）＝４−１＋０＝３回である。またｖ＝１の場合、ＳＦＴが４×５＋１＝２１回、ＳＵＢが０．５×（５＋１）＋１＝４回であり、ＲＥＤＣについては（ｍ×ｋ）／ｖ＝（１０１０１０００）２からｐ’−１＋Ｗ（（ｍ×ｋ）／ｖ）＝８−１＋２＝９回である。ｖ＝２１の場合、従来法１の例２と同一の計算量であるが、ｖ＝１の場合ＳＦＴを４１−２１＝２０回、ＳＵＢを１４−４＝１０回、合計３０回削減可能である。ＲＥＤＣが９−３＝６回増加しているが、ＲＥＤＣ演算をコプロ等の専用ハードウェアで高速に処理する場合、ＳＵＢもしくはＳＦＴと同程度の時間で計算可能であるため、ｖ＝１の方が高速な処理を実現できる。
【特許文献１】  特開平０８−２６３３１６号公報
（パテントファミリー：ＵＳＰ５７４５３９８，ＥＰ７１２０７１）
【特許文献２】  特開平０８−３３９３１０号公報
（パテントファミリー：ＵＳＰ５７５１６２０，ＥＰ７１２０７０）
【特許文献３】  特開平１１−３０５９９５号公報
（パテントファミリー：ＵＳＰ６２４０４３６）
【特許文献４】  米国特許第５９１２９０４号公報
（パテントファミリー：ＥＰ０６０１９０７Ａ２）
【特許文献５】  米国特許題５７７７９１６号公報
（パテントファミリー：ＥＰ７８５５０３）
【発明が解決しようとする課題】
前述した従来法１および従来法２では、それぞれ以下の課題１〜課題５に示すように、パラメータｖに関する制限、データ値の最上位有効ビット（Ｍｏｓｔ  Ｓｉｇｎｉｆｉｃａｎｔ  Ｂｉｔ，以下ＭＳＢ）の算出、およびデータのビット値の検出、という問題を有する。ＭＳＢの算出およびビット値の検出にはビット単位の演算処理が必要となるが、これらはソフトウェア実装における処理効率が悪い。
▲１▼従来法１における課題
（課題１）ｑを算出するために、ｎのＭＳＢを算出する必要がある。
（課題２）（ｍ×ｋ）／ｖが２のべき乗という制限がある。
▲２▼従来法２における課題
（課題３）２ｖ×Ｒ（ｍｏｄ  ｎ）の計算に従来法１の方法を用いる場合、ｎのＭＳＢを算出する必要がある。
（課題４）ｐ’を算出するために、（ｍ×ｋ）／ｖのＭＳＢを算出する必要がある。
（課題５）ＲＥＤＣ演算を繰り返すために、（ｍ×ｋ）／ｖの各ビット値を検出する必要がある。
課題１および課題３については、それぞれＳｔｅｐＡ１，ＳｔｅｐＡ２が原因である。つまり、これらの処理ではＲＥＧ１，ＲＥＧ２に対してシフト演算を繰り返しているが、シフト演算を繰り返す回数がｑの値に依存していることにより問題を生じている。
この問題発生のメカニズムについて、従来法のＳｔｅｐＡ１の処理を示す図６に基づいて説明する。なお、ＳｔｅｐＡ１とＳｔｅｐＡ２は同じ処理を行っているので、図６はＳｔｅｐＡ２の処理も表している。
図６の処理では２ｖ×Ｒ（ｍｏｄ  ｎ）の計算を行うために、以下のＳｔｅｐＡ１，１，ＳｔｅｐＡ１，２，ＳｔｅｐＡ１，３，ＳｔｅｐＡ１，４から構成される処理を行う。
ＳｔｅｐＡ１，１：ｎ’＝２ｑ×ｎを計算する（ただし、ｎ’をｍワードで表現したとき最上位ビット＝１）。
ＳｔｅｐＡ１，２：Ｒ（ｍｏｄ  ｎ’）＝０−ｎ’を計算する。
ＳｔｅｐＡ１，３：Ｒ（ｍｏｄ  ｎ’）から２ｑ＋ｖ×Ｒ（ｍｏｄ  ｎ’）を計算する。
ＳｔｅｐＡ１，４：２ｑ＋ｖ×Ｒ（ｍｏｄ  ｎ’）から２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する。
上記のＳｔｅｐＡ１，２において、Ｒ（ｍｏｄ  ｎ’）の計算を０−ｎ’により行うためには、ｍワード値ｎ’の最上位ビットが１であることが条件であり、これによりＳｔｅｐＡ全体でｑに応じた回数のシフト処理を必要とする。シフト回数がｑに依存する理由を示すために、ＳｔｅｐＡ１，１〜ＳｔｅｐＡ１，４の処理内容の詳細について説明する。
ＳｔｅｐＡ１，１では、ＲＥＧ１＝ｎに対し左ｑビットシフトを行うことでＲＥＧ１＝ｎ’＝ｎ×２ｑを計算している。これにより、ｍワードで表現されるＲＥＧ１の最上位ビットが１でない場合、左シフト演算を用いて最上位ビットを１とする。最上位ビットを１とすることで、ＳｔｅｐＡ１，２においてＲ（ｍｏｄ  ｎ’）で示される剰余算を、Ｒ（ｍｏｄ  ｎ’）＝０−ｎ’に示される簡単な計算で行うことができる。
ＳｔｅｐＡ１，２では、ＲＥＧ２＝Ｒ（ｍｏｄ  ｎ’）の演算を目的にＲＥＧ２：＝０−ｎ’の計算を行う。
図７に示すように、ｎ’の最上位ビット＝１であり最上位ビットを除いた値が１以上である場合には、０−ｎ’の演算結果における最上位ビットが必ず０となることから、明らかに０≦０−ｎ’＜ｎ’となり（ｍｏｄ  ｎ’）による剰余値の範囲に収まることとなる。しかしながら、ｎ’の最上位ビット＝０の場合は、０−ｎ’の最上位ビットが必ず１となることから、明らかに０−ｎ’≧ｎ’となり剰余値の範囲を超えることになる。したがって、ｍワードによる演算では、０−ｎ’の演算結果は０−ｎ’＝２ｍ×ｋ−ｎ’＝Ｒ−ｎ’であるが、Ｒ−ｎ’の値が目的であるＲ（ｍｏｄ  ｎ’）となるためには、ｍワードで表現されるｎ’の最上位ビットが１であることが条件である。
ＳｔｅｐＡ１，３では、ＳｔｅｐＡ１，２で得られたＲＥＧ２＝Ｒ（ｍｏｄ  ｎ’）に対して２倍剰余算をｑ＋ｖ回繰り返すことでＲＥＧ２＝２ｑ＋ｖ×Ｒ（ｍｏｄ  ｎ’）を計算している。このＲＥＧ２の値から、ＳｔｅｐＡ１，４において２ｖ×Ｒ（ｍｏｄ  ｎ）を得るために、２倍剰余算はｑ＋ｖ回必要となる。
ＳｔｅｐＡ１，４では、ＲＥＧ２＝２ｑ＋ｖ×Ｒ（ｍｏｄ  ｎ’）およびＲＥＧ１＝ｎ’＝ｎ×２ｑそれぞれに対し、右１ビットシフトをｑ回繰り返すことで、ＲＥＧ２，ＲＥＧ１の値を補正し目的の値であるＲＥＧ２＝２ｖ×Ｒ（ｍｏｄ  ｎ）を得ている。ＲＥＧ２の値の補正は、ｘ＝ａ×ｚ（ｍｏｄ  ｎ×ｚ）を満たすｘから、ｙ＝ａ（ｍｏｄ  ｎ）を満たすｙはｙ＝ｘ／ｚにより求められることを利用している。
以上から、ＳｔｅｐＡ１，２においてＲ（ｍｏｄ  ｎ’）＝０−ｎ’による剰余演算を行うために、最上位ビット＝１であるｍワード値ｎ’を作成することが原因となり、ＳｔｅｐＡ全体の処理がｑに依存した回数分のシフト処理を行う必要があることがわかる。
課題２は、ＳｔｅｐＢ１の処理が原因である。この処理においては、Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算した後、Ｈ１＝ＲＥＤＣ（Ｈ０，Ｈ０）＝（２ｖ×Ｒ）×（２ｖ×Ｒ）×Ｒ−１＝２２ｖＲ（ｍｏｄ  ｎ），Ｈ２＝ＲＥＤＣ（Ｈ１，Ｈ１）ｎ＝（２２ｖ×Ｒ）×（２２ｖ×Ｒ）×Ｒ−１＝２４ｖＲ（ｍｏｄ  ｎ），．．．，Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎ＝（２２＾ｉ×ｖ）×Ｒ（ｍｏｄ  ｎ），．．．のように、ＲＥＤＣ演算をｐ回繰り返すことでＨｐ＝Ｒ２（ｍｏｄ  ｎ）を得る。ただし、２＾ｘとは２のｘ乗を表す。この結果計算されるＨｐがＨｐ＝（２２＾ｐ×ｖ）×Ｒ（ｍｏｄ  ｎ）＝Ｒ２（ｍｏｄ  ｎ）となるためには、２２＾ｐ×ｖ＝Ｒ＝２ｍ×ｋである必要があるので、２ｐ＝（ｍ×ｋ）／ｖが条件となる。すなわち（ｍ×ｋ）／ｖが２のべき乗であるという制限が生じる。
課題４、課題５は、従来法２のＳｔｅｐＢ２で用いている計算手順が原因である。ＳｔｅｐＢ２が行う処理の概要を図８に示す。
ＳｔｅｐＢ２では、図８に示すように、Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を用いてｉ＝ｐ’−２，．．．，１，０の順番で（ｍ×ｋ）／ｖのｉ番目のビット値を検出し、ビット値＝０ならばＨｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを、ビット値＝１ならばＨｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎ，Ｈｉ＝ＲＥＤＣ（Ｈｉ，Ｈ０）ｎを繰り返すことで、Ｈｐ’−１＝Ｒ２（ｍｏｄ  ｎ）を計算する。ただし、ｐ’は（ｍ×ｋ）／ｖの有効ビット長である。
したがって、ＳｔｅｐＢ２において正しい結果を得るためには、ｐ’を求めるための（ｍ×ｋ）／ｖのＭＳＢの算出と、（ｍ×ｋ）／ｖの各ビット値の検出の２つの処理が必要であり、この結果、課題４と課題５がそれぞれ発生する。
【発明の開示】
〈解決法１〉
本発明は、上述したような課題を解決するものであって、以下の解決法１を用いることで課題１および課題３を回避する。この解決法１では、従来法とは異なる手法を用いてＲに関する剰余算を行うことで、ｑに依存せずに２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する処理を実現する。
解決法１の処理を図９に示し、これについて説明する。解決法１では、Ｒ（ｍｏｄ  ｎ）を計算するためにＲＥＧ２に初期値２（ｍ−１）×ｋを与え、これに対し２倍剰余算をｋ回繰り返すことで２ｍ×ｋ（ｍｏｄ  ｎ）を得る。ＲＥＧ２の初期値２（ｍ−１）×ｋは、（ｍ−１）番目のワード値に１を与え、それ以外のワード値に０を与えることで容易に生成できる。得られたＲ（ｍｏｄ  ｎ）に対し、さらにｖ回の２倍剰余を行うことで、２ｖ×Ｒ（ｍｏｄ  ｎ）を得ることができる。これらの２倍剰余算は、まとめてｋ＋ｖ回の２倍剰余算により行うことができる。この方法を用いることで、ｑの値に依存しない処理を実現できるので、ｎのＭＳＢを算出することが不要となる。
〈解決法２〉
また、本発明では、前述した課題２を解決するための方策として解決法２を提案する。
ここでは、ＲＥＤＣを用いた補正演算を用いることで、ｐに関する条件を２ｐ＝（ｍ×ｋ）／ｖから２ｐ≧（ｍ×ｋ）／ｖ＞２ｐ−１というより広い条件に変更する。シフト算、減算を用いてＨ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算し、従来法１と同様にＲＥＤＣを用いた２乗算Ｈ１＝ＲＥＤＣ（Ｈ０，Ｈ０）ｎ，Ｈ２＝ＲＥＤＣ（Ｈ１，Ｈ１）ｎ，．．．．，Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎ，．．．をｐ回繰り返すことで、その結果、Ｈｐ＝（２２＾ｐ×ｖ）×Ｒ（ｍｏｄ  ｎ）を演算する。従来法と同様２ｐ≠（ｍ×ｋ）／ｖの場合、すなわち  ２ｐ＞（ｍ×ｋ）／ｖ＞２ｐ−１においては、Ｈｐ＝（２２＾ｐ×ｖ）×Ｒ（ｍｏｄ  ｎ）＝Ｒ２（ｍｏｄ  ｎ）とはならないが、この解決法２では、このＨｐに対しＨｐ＝ＲＥＤＣ（Ｈｐ，ｇ）ｎで示される補正演算を行うことでＨｐ＝Ｒ２（ｍｏｄ  ｎ）を得る。この条件を満たすｇはｇ＝２ｋ×Ｇ（ｐ，ｍ，ｋ）と表され、Ｇ（ｐ，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ）／ｋにより与えられる。２ｐ＞（ｍ×ｋ）／ｖ＞２ｐ−１の場合、Ｇ（ｐ，ｍ，ｋ）は１≦Ｇ（ｐ，ｍ，ｋ）≦ｍ−１を満たす整数値となる性質を備えているので、ｇの値はＧ（ｐ，ｍ，ｋ）−１番目のワード値＝１、そのほかのワード値＝０とすることで容易に生成できる。前述の補正演算を用いてＲ２（ｍｏｄ  ｎ）が計算できることは、Ｈｐ＝ＲＥＤＣ（Ｈｐ，ｇ）＝（２２＾ｐ×ｖ×Ｒ）×（２ｋ×Ｇ（ｐ，ｍ，ｋ））×Ｒ−１（ｍｏｄ  ｎ）＝（２２＾ｐ×ｖ）×（２２×ｍ×ｋ−ｖ×２＾ｐ）（ｍｏｄ  ｎ）＝２２×ｍ×ｋ（ｍｏｄ  ｎ）＝Ｒ２（ｍｏｄ  ｎ）により確認できる。また、この解決法２を用いた場合、ＲＥＤＣ演算の繰り返しにおいて（ｍ×ｋ）／ｖのビット値検出を必要としないので、課題５も解決することができる。
〈解決法３〉
前述した課題４については、本発明の解決法３を用いて解決することができる。この解決法３の処理を図１０に示す。
ここでは、ｉ＝０，１，．．．，ｂ−１の順番で（ｍ×ｋ）／ｖのｉ番目のビット値を検出することを繰り返し、ビット値＝０ならばＨｉ＝ＲＥＤＣ（Ｈｉ，Ｈｉ）ｎを、ビット値＝１ならばＨ’＝ＲＥＤＣ（Ｈ’，Ｈ０），Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）とすることでＨ’＝Ｒ２（ｍｏｄ  ｎ）を計算する。
従来法のＳｔｅｐＢ２ではビット値の検出を上位ビット→下位ビットの順に行っていたのに対し、この解決法３では、下位ビット→上位ビットの順に行っている。ただし、Ｈ’＝Ｒ（ｍｏｄ  ｎ）およびＨ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）であり、ｂは（ｍ×ｋ）／ｖの最大ビット長を表す定数である。
このように、解決法３の手順に従うことで、（ｍ×ｋ）／ｖの各ビット値の’０’’１’のみに応じて計算を行えばよく、（ｍ×ｋ）／ｖの有効ビット長に依存しない処理を行うので課題４が解決される。また、（ｍ×ｋ）／ｖが２のべき乗であるという制限がないため、課題２も同時に解決することができる。
本発明では、前述したような解決法１〜解決法３を適宜組み合わせることで課題１〜５を解決することが可能なモンゴメリ乗算剰余における変換パラメータの演算方法、モンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させるためのプログラムおよびモンゴメリ乗算剰余における変換パラメータ演算装置を提案するものである。
本発明の請求項１に係るモンゴメリ乗算剰余における変換パラメータの演算方法は、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算方法であって、Ａ）Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）（ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖは整数）を計算する第１工程と、Ｂ）ｉ＝１，２，．．．，ｐに関して、Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを繰り返すことで、Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）からＨｐ＝２ｖ×２＾ｐ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｐは２ｐ≧（ｍ×ｋ）／ｖ＞２ｐ−１を満たす整数を、ＲＥＤＣはモンゴメリ乗算剰余ＲＥＤＣ（ａ，ｂ）ｎ＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）を、ｘ＾ｉは指数演算ｘｉをそれぞれ表す）第２工程と、Ｃ）２ｐ＞（ｍ×ｋ）／ｖの場合、第２工程で得られたＨｐに対しＨｐ＝ＲＥＤＣ（Ｈｐ，ｇ）ｎを計算することでＨｐ＝Ｒ２（ｍｏｄ  ｎ）を計算し（ただし、ｇ＝２ｋ×Ｅ（ｐ，ｍ，ｋ）、Ｅ（ｐ，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ）／ｋである）、最後にＨｐをＲ２（ｍｏｄ  ｎ）として出力する第３工程とを含む。ここで、第１工程は、Ａ−１）２つのレジスタＲＥＧ１，ＲＥＧ２を、ＲＥＧ１＝ｎ，ＲＥＧ２＝２（ｍ−１）×ｋにより初期化する（ただし、ＲＥＧ１はｍ個のワードから、ＲＥＧ２はｍ個以上のワードから構成されるレジスタ）工程と、Ａ−２）ＲＥＧ２に対し、ＲＥＧ１の値を法とした２倍剰余算をｋ＋ｖ回繰り返すことで２ｖ×Ｒ（ｍｏｄ  ｎ）を得る工程とを含む。
この場合、第１工程および第３工程により前述した解決法１および解決法２を実行して、課題１，２，３，５を解決することができる。
本発明の請求項２に係るモンゴメリ乗算剰余における変換パラメータの演算方法は、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算方法であって、Ａ）Ｈ’＝Ｒ（ｍｏｄ  ｎ），Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖは整数）第１工程と、Ｂ）Ｈ’＝Ｒ２（ｍｏｄ  ｎ）を計算し出力する第２工程とを含んでいる。ここで、第２工程は、ｉ＝０，１，．．，ｂ−１に関して、Ｂ−１）（ｍ×ｋ）／ｖのｉ番目のビット値＝１ならば、Ｈ’＝ＲＥＤＣ（Ｈ’，Ｈｉ）ｎを計算する工程と、Ｂ−２）Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを計算する工程とを繰り返すことで（ただしｂは（ｍ×ｋ）／ｖの最大ビット長を表す定数、ＲＥＤＣはモンゴメリ乗算剰余演算ＲＥＤＣ（ａ，ｂ）＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）をそれぞれ表す）、Ｈ’＝Ｒ２（ｍｏｄ  ｎ）を計算するものである。
この場合、第２工程により前述した解決法３を実行して、課題２および課題４を解決することができる。
本発明の請求項３に係るモンゴメリ乗算剰余における変換パラメータの演算方法は請求項２に記載のモンゴメリ乗算剰余における変換パラメータの演算方法であって、第１工程は、Ａ−１）２つのレジスタＲＥＧ１，ＲＥＧ２に対し、ＲＥＧ１：＝ｎ，ＲＥＧ２：＝０により初期化する（ただし、ＲＥＧ１はｍ個のワードから、ＲＥＧ２はｍ個のワードから構成されるレジスタであり、ｋは１ワードあたりのビット長である）工程と、Ａ−２）ＲＥＧ１に対し左１ビットシフトをｑ回繰り返すことで、ＲＥＧ１＝ｎ’＝２ｑ×ｎとする（ただし、ｑはｍワードで表現されるｎの最上位ビットから連続する’０’の個数を表す）工程と、Ａ−３）ＲＥＧ２：＝ＲＥＧ２−ＲＥＧ１を計算することで、ＲＥＧ２＝Ｒ（ｍｏｄ  ｎ’）を計算する工程と、Ａ−４）ＲＥＧ２に対し、２倍剰余演算をｑ回繰り返すことで、ＲＥＧ２＝２ｑ×Ｒ（ｍｏｄ  ｎ’）を計算する工程と、Ａ−５）ＲＥＧ１，ＲＥＧ２に対し、右１ビットシフトをｑ回繰り返すことで、ＲＥＧ１＝ｎ，ＲＥＧ２＝Ｒ（ｍｏｄ  ｎ）を計算した後、ＲＥＧ２の値をＨ’にコピーする工程と、Ａ−６）ＲＥＧ２に対し、さらにＲＥＧ１の値を法とした２倍剰余演算をｖ回繰り返すことで、ＲＥＧ２＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算した後、Ｈ０にコピーする工程とを含む。
この場合、第１工程において従来法１を実行することにより、ｑが小さい場合に全体の計算速度を高速化することが可能となる。
本発明の請求項４に係るモンゴメリ乗算剰余における変換パラメータの演算方法は請求項２に記載のモンゴメリ乗算剰余における変換パラメータの演算方法であって、第１工程は、Ａ−１）２つのレジスタＲＥＧ１，ＲＥＧ２に対し、ＲＥＧ１：＝ｎ，ＲＥＧ２：＝２（ｍ−１）×ｋにより初期化する（ただし、ＲＥＧ１はｍ個のワードから、ＲＥＧ２はｍ個以上のワードから構成されるレジスタであり、ｋは１ワードあたりのビット長である）工程と、Ａ−２）ＲＥＧ２に対しＲＥＧ１の値を法とした２倍剰余演算をｋ回繰り返すことで、ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）＝Ｒ（ｍｏｄ  ｎ）を計算し、Ｈ’にコピーする工程と、Ａ−３）ＲＥＧ２に対し２倍剰余演算をさらにｖ回繰り返すことで、ＲＥＧ２＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算し、Ｈ０にコピーする工程とを含む。
この場合、第１工程において前述した解決法１を適用することにより、課題１および課題３を解決することができる。
本発明の請求項５に係るモンゴメリ乗算剰余における変換パラメータの演算方法のプログラムは、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算方法のプログラムであって、Ａ）Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）（ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖは整数）を計算する第１工程と、Ｂ）ｉ＝１，２，．．．，ｐに関して、Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを繰り返すことで、Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）からＨｐ＝２ｖ×２＾ｐ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｐは２ｐ≧（ｍ×ｋ）／ｖ＞２ｐ−１を満たす整数を、ＲＥＤＣはモンゴメリ乗算剰余ＲＥＤＣ（ａ，ｂ）ｎ＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）を、ｘ＾１は指数演算ｘｉをそれぞれ表す）第２工程と、Ｃ）２ｐ＞（ｍ×ｋ）／ｖの場合、第２工程で得られたＨｐに対しＨｐ＝ＲＥＤＣ（Ｈｐ，ｇ）ｎを計算することでＨｐ＝Ｒ２（ｍｏｄ  ｎ）を計算し（ただし、ｇ＝２ｋ×Ｅ（ｐ，ｍ，ｋ）、Ｅ（ｐ，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ）／ｋである）、最後にＨｐをＲ２（ｍｏｄ  ｎ）として出力する第３工程とを含み、前記第１工程は、Ａ−１）２つのレジスタＲＥＧ１，ＲＥＧ２を、ＲＥＧ１＝ｎ，ＲＥＧ２＝２（ｍ−１）×ｋにより初期化する（ただし、ＲＥＧ１はｍ個のワードから、ＲＥＧ２はｍ個以上のワードから構成されるレジスタ）工程と、Ａ−２）ＲＥＧ２に対し、ＲＥＧ１の値を法とした２倍剰余算をｋ＋ｖ回繰り返すことで２ｖ×Ｒ（ｍｏｄ  ｎ）を得る（ただし、）工程とを含む、モンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させるためのプログラムである。
この場合、請求項１に記載したようなモンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させる場合に、従来法の問題である課題１，２，３，５を解決して高速演算を可能とする。
本発明の請求項６に係るプログラムは、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算方法のプログラムであって、Ａ）Ｈ’＝Ｒ（ｍｏｄ  ｎ），Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖは整数）第１工程と、Ｂ）Ｈ’＝Ｒ２（ｍｏｄ  ｎ）を計算し出力する第２工程とを含み、第２工程は、ｉ＝０，１，．．，ｂ−１に関して、Ｂ−１）（ｍ×ｋ）／ｖのｉ番目のビット値＝１ならば、Ｈ’＝ＲＥＤＣ（Ｈ’，Ｈｉ）ｎを計算する工程と、Ｂ−２）Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを計算する工程とを繰り返すことで（ただしｂは（ｍ×ｋ）／ｖの最大ビット長を表す定数、ＲＥＤＣはモンゴメリ乗算剰余演算ＲＥＤＣ（ａ，ｂ）＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）をそれぞれ表す）Ｈ’＝Ｒ２（ｍｏｄ  ｎ）を計算する、モンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させるためのプログラムである。
この場合、請求項２に記載したようなモンゴメリ乗算剰余における変換パラメータの演算方法をコンピュータに実行させる場合に、従来法の問題である課題２，４を解決して高速演算を可能とする。
本発明の請求項７に係るモンゴメリ乗算剰余における変換パラメータの演算装置は、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算装置であって、ｍ個のワードから構成される第１レジスタＲＥＧ１と、ｍ個以上のワードから構成される第２レジスタＲＥＧ２と、２つのレジスタＲＥＧ１，ＲＥＧ２を、ＲＥＧ１＝ｎ，ＲＥＧ２＝２（ｍ−１）×ｋにより初期化する初期化処理部と、第２レジスタＲＥＧ２に対し、第１レジスタＲＥＧ１の値を法とした２倍剰余算をｋ＋ｖ回繰り返すことでＨ０＝２ｖ×Ｒ（ｍｏｄ
0004616169.tif 000005
ｉ＝１，２，．．．，ｐに関して、Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを繰り返すことで、Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）からＨｐ＝２ｖ×２＾ｐ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｐは２ｐ≧（ｍ×ｋ）／ｖ＞２ｐ−１を満たす整数を、ＲＥＤＣはモンゴメリ乗算剰余ＲＥＤＣ（ａ，ｂ）ｎ＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）を、ｘ＾ｉは指数演算ｘｉをそれぞれ表す）Ｈｐ演算部と、２ｐ＞（ｍ×ｋ）／ｖの場合、前記Ｈｐ演算部により得られたＨｐに対しＨｐ＝ＲＥＤＣ（Ｈｐ，ｇ）ｎを計算することでＨｐ＝Ｒ２（ｍｏｄ  ｎ）を計算し（ただし、ｇ＝２ｋ×Ｅ（ｐ，ｍ，ｋ）、Ｅ（ｐ，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ）／ｋである）、最終的に得られたＨｐをＲ２（ｍｏｄ  ｎ）として出力するパラメータ出力部とを備える。
この場合、初期化処理部およびＨ０演算部により解決法１を実現し、課題１，３を解決することが可能となる。また、パラメータ出力部により解決法２を実現し、課題２，５を解決することが可能となる。
本発明の請求項８に係るモンゴメリ乗算剰余における変換パラメータの演算装置は、剰余の法ｎの有効ワード長をｍ、１ワード当たりのビット長をｋ、２ｍ×ｋ＝Ｒとするモンゴメリ乗算剰余における変換パラメータＲ２（ｍｏｄ  ｎ）の演算装置であって、Ｈ’＝Ｒ（ｍｏｄ  ｎ），Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する（ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖは整数）Ｈ０演算部と、ｉ＝０，１，．．，ｂ−１に関して、（ｍ×ｋ）／ｖのｉ番目のビット値＝１ならば、Ｈ’＝ＲＥＤＣ（Ｈ’，Ｈｉ）ｎを計算する工程と、Ｈｉ＝ＲＥＤＣ（Ｈｉ−１，Ｈｉ−１）ｎを計算する工程とを繰り返すことでＨ’＝Ｒ２（ｍｏｄ  ｎ）を計算し出力する（ただしｂは（ｍ×ｋ）／ｖの最大ビット長を表す定数、ＲＥＤＣはモンゴメリ乗算剰余演算ＲＥＤＣ（ａ，ｂ）＝ａ×ｂ×Ｒ−１（ｍｏｄ  ｎ）をそれぞれ表す）Ｈ’演算部とを含む。
この場合、Ｈ’演算部により解決法３を実現することができ、これにより、課題２，４を解決することが可能となる。
【図面の簡単な説明】  図１は、モンゴメリ乗算剰余のアルゴリズムを示す説明図である。
図２は、モンゴメリ乗算剰余を用いたべき乗剰余演算の例を示す説明図である。
図３は、加算、減算を用いた変換パラメータＨの計算アルゴリズムを示す説明図である。
図４は、従来法１のフローチャートである。
図５は、従来法２のフローチャートである。
図６は、課題１および課題３の原因となる従来法における２ｖＲ（ｍｏｄ  ｎ）計算処理のフローチャートである。
図７は、従来法におけるＲ（ｍｏｄ  ｎ’）＝０−ｎ’の計算が成立するためのｎ’の条件を示す説明図である。
図８は、従来法２におけるＳｔｅｐＢ２の処理の概要およびそれに伴う課題を示す説明図である。
図９は、本発明の解決法１で用いる２ｖ×Ｒ（ｍｏｄ  ｎ）の計算法を示す説明図である。
図１０は、本発明の解決法３で用いるＲ２（ｍｏｄ  ｎ）の計算法を示す説明図である。
図１１は、本発明の第１実施形態のフローチャートである。
図１２は、本発明の第２実施形態のフローチャートである。
図１３は、実施例１のフローチャートである。
図１４は、実施例２のフローチャートである。
図１５は、実施例３のフローチャートである。
図１６は、本発明のプログラムを格納する記録媒体の説明図である。
【発明を実施するための最良の形態】    〈第１実施形態〉
本発明の第１実施形態について、図１１に示すフローチャートに基づいて説明する。
図１１に示すように、この第１実施形態では主にＳｔｅｐＡ３，ＳｔｅｐＢ３，ＳｔｅｐＣ３から構成される。
ここで、入力：ｎ（剰余の法）、出力：Ｒ２（ｍｏｄ  ｎ）（ただし、Ｒ＝２ｍ×ｋ（ｍｏｄ  ｎ））とする。
ＳｔｅｐＡ３では、シフト算および減算を用いて、Ｈ０＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）を満たすＨ０を計算する。ここで、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖが整数であることを満たすものとする。
ＳｔｅｐＢ３では、ＲＥＤＣ演算を用いて、Ｈ０からＨ＝２Ｅ（ｐ″，ｍ，ｋ）（ｍｏｄ  ｎ）を計算する。ただし、Ｅ（ｐ″，ｍ，ｋ）＝ｍ×ｋ＋ｖ×２ｐ″、ｐ″は２ｐ″＞（ｍ×ｋ）／ｖ＞２（ｐ″−１）を満たす整数である。
ＳｔｅｐＣ３では、２ｐ″＞（ｍ×ｋ）／ｖならば、ｇ＝２ｋ×Ｇ（ｐ″，ｍ，ｋ）についてＨ＝ＲＥＤＣ（Ｈ，Ｇ）による補正演算を行う。ただし、ＧはＧ（ｐ″，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ″）／ｋであり、１≦Ｇ（ｐ″，ｍ，ｋ）≦ｍ−１の範囲を満たす整数である。演算後にＨ＝Ｒ２（ｍｏｄ  ｎ）を出力し終了する。
この第１実施形態のアルゴリズムについて以下に詳細を示す。
ステップ３０１では、２つのレジスタに対して初期値として、ＲＥＧ１：＝ｎ，ＲＥＧ２：＝２（ｍ−１）×ｋを与える。ただし、ｎの有効ワード長はｍである。
ステップ３０２では、ＲＥＧ２に対して、２倍剰余算をｋ＋ｖ回繰り返しＲＥＧ２＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）とする。ただし、ｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖが整数である。
ステップ３０３では、ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ＲＥＧ２）ｎをｐ″回繰り返すことで、ＲＥＧ２＝２Ｅ（ｐ″，ｍ，ｋ）（ｍｏｄ  ｎ）を計算する。ただし、ｐ″は２ｐ″≧（ｍ×ｋ）／ｖ＞２ｐ″−１を満たす整数、Ｅ（ｐ″，ｍ，ｋ）＝ｍ×ｋ＋ｖ×２ｐ″であり、ＲＥＤＣ（Ａ，Ｂ）ｎはモンゴメリ乗算剰余ＲＥＤＣ（Ａ，Ｂ）ｎ＝Ａ×Ｂ×２−ｍ×ｋ（ｍｏｄ  ｎ）を表す。
ステップ３０４では、２ｐ″＞（ｍ×ｋ）／ｖならば、ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ｇ）ｎによる補正演算を行う。ただし、ｇ＝２ｋ×Ｇ（ｐ″，ｍ，ｋ）およびＧ（ｐ″，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ″）／ｋである。ＲＥＧ２＝Ｒ２（ｍｏｄ  ｎ）を出力し終了する。
このようにした第１実施形態では、ステップ３０１，３０２において、前述した解決法１を用いてＲＥＧ２＝２ｖ×Ｒ（ｍｏｄ  ｎ）の計算を行っており、ｎのＭＳＢを算出することが不要となる。
また、ステップ３０３，３０４では、解決法２を用いることで、２ｖ×Ｒ（ｍｏｄ  ｎ）からＲ２（ｍｏｄ  ｎ）の計算を行っており、（ｍ×ｋ）／ｖが２のべき乗であるという制限を不要としている。ステップ３０３では、ＲＥＧ２＝２ｖ×Ｒにモンゴメリ乗算剰余演算を用いた２乗算をｐ″回繰り返すことで、ＲＥＧ２＝２Ｅ（ｐ″，ｍ，ｋ）（ｍｏｄ  ｎ）を得ることができる。ただし、ｐ″は２ｐ″≧（ｍ×ｋ）／ｖ＞２ｐ″−１を満たす整数であり、Ｅ（ｐ″，ｍ，ｋ）＝ｍ×ｋ＋ｖ×２ｐ″である。ステップ３０４では、２ｐ″＞（ｍ×ｋ）／ｖの場合にＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ｇ）ｎによる補正演算を行うことで、ＲＥＧ２＝Ｒ２（ｍｏｄ  ｎ）を算出することができる。ただし、ｇ＝２ｋ×Ｇ（ｐ″，ｍ，ｋ）およびＧ（ｐ″，ｍ，ｋ）＝２×ｍ−（ｖ×２ｐ″）／ｋである。
このようにして、第１実施形態では、解決法１を用いることで、ｎのＭＳＢの算出が不要となり、課題１および課題３が解決される。また、解決法２を用いることで、（ｍ×ｋ）／ｖが２のべき乗であるという制限が不要となり、課題２が解決され、さらに（ｍ×ｋ）／ｖのビット値検出が不要となり、課題５が解決される。
〈第２実施形態〉
本発明の第２実施形態について、図１２に示すフローチャートに基づいて説明する。
この第２実施形態では、図１２に示すように、主にＳｔｅｐＡ４，ＳｔｅｐＢ４から構成される。ここで、入力をｎ（剰余の法）、出力をＲ２（ｍｏｄ  ｎ）（ただし、Ｒ＝２ｍ×ｋ（ｍｏｄ  ｎ））とする。
ＳｔｅｐＡ４では、Ｈ’＝Ｒ（ｍｏｄ  ｎ），Ｈ０＝２ｖ×Ｒ（ｍｏｄ  ｎ）を計算する。
ＳｔｅｐＢ４では、Ｈ’，Ｈ０から、ＲＥＤＣ演算を用いてＨ＝Ｒ２（ｍｏｄ  ｎ）を計算する。この演算では、ｍ×ｋの各ビット値を最下位ビットから最上位ビットの順に検出し、各ビット値の’０’’１’に応じてＲＥＤＣ演算を１回もしくは２回行うことを繰り返す。
この第２実施形態の場合、従来法２と異なり、（ｍ×ｋ）／ｖのＭＳＢを算出する必要がないというメリットを有する。ただし、（ｍ×ｋ）／ｖの最大ビット長を表す定数ｂが必要となる。
また、ＳｔｅｐＡ４におけるＨ０の算出法については、本発明の第１実施形態におけるＳｔｅｐＡ３に示す方法を用いることで、ｎの有効ビットを算出が不要となる。
ＳｔｅｐＡ４，ＳｔｅｐＢ４の詳細を以下に説明する。
ステップ４０１では、ＲＥＧ１：＝ｎを初期値として与える（ただし、ｎの有効ワード長はｍである）。
ステップ４０２では、２ｍ×ｋ（ｍｏｄ  ｎ）を演算し、その結果をＲＥＧ０とＲＥＧ２に対して与えることで、ＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）とする。
ステップ４０３では、ＲＥＧ０に対し２倍剰余演算をｖ回繰り返し、ＲＥＧ０＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）を計算する。ただしｖは整数であり、ｖ≧１かつ（ｍ×ｋ）／ｖが整数であることを満たす。
ステップ４０４では、以下の▲１▼および▲２▼の処理をｉ＝０，１，．．．，ｂ−１についてｂ回繰り返すことで、ＲＥＧ２＝２２×ｍ×ｋ＝Ｒ２（ｍｏｄ  ｎ）を計算して出力し終了する。ただし、ｂは（ｍ×ｋ）／ｖの最大ビット長を表す定数、ＲＥＤＣ（Ａ，Ｂ）ｎはモンゴメリ乗算剰余ＲＥＤＣ（Ａ，Ｂ）ｎ＝Ａ×Ｂ×２−ｍ×ｋ（ｍｏｄ  ｎ）をそれぞれ表す。
▲１▼ＲＥＧ０：＝ＲＥＤＣ（ＲＥＧ０，ＲＥＧ０）ｎを計算する。
▲２▼ｍ×ｋのｉ番目のビット値＝１ならば、ＲＥＧ２：＝ＲＥＤＣ（ＲＥＧ２，ＲＥＧ０）ｎを計算する。
この第２実施形態では、ステップ４０１においてＲＥＧ１に初期値ｎを与えており、第１実施形態と異なりＲＥＧ２に対する初期値を与えていない。これはステップ４０２の実現方法によって初期値が異なることによる。
ステップ４０２では、２ｍ×ｋ（ｍｏｄ  ｎ）を演算した上で、この演算結果をＲＥＧ０とＲＥＧ２に与え、ＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）としている。２ｍ×ｋ（ｍｏｄ  ｎ）を計算するための実現方法は複数存在するが、たとえば第１実施形態と同様の構成にすることで解決法１を実現することができ、ｎに関するＭＳＢの算出を不要とすることができる。
ステップ４０３では、ＲＥＧ０に対し２倍剰余算をｖ回行うことでＲＥＧ０＝２ｍ×ｋ（ｍｏｄ  ｎ）を計算している。
また、ステップ４０４では、解決法３を実現しており、ｖに関する制限、および（ｍ×ｋ）／ｖの有効ビット長カウントを不要としている。ここでは、（ｍ×ｋ）／ｖの各ビット値を検出し、ビット値に応じてＲＥＤＣ演算を１回もしくは２回行うことで、Ｈ＝Ｒ２（ｍｏｄ  ｎ）を計算している。このことにより、従来法２ではｉ番目のビット値を検出する際、（ｍ×ｋ）／ｖの有効ビット長ｐ’に対しｉ＝ｐ’−２，．．．，１，０の順に検出していたのに対し、この第２実施形態では（ｍ×ｋ）／ｖの最大ビット長ｂに対しｉ＝０，１，．．．，ｂ−１の順に検出している。つまり、本発明は（ｍ×ｋ）／ｖの最大ビット長である定数ｂのみを与えればよく、入力値によって変化する（ｍ×ｋ）／ｖの有効ビット長を計算する必要がないというメリットを有する。従来法２に対して、ｉ＝ｂ−１，．．．，１，０の順に検出するように変更した場合、ｂ＝ｐ’が満たされない限り計算結果がＲ２（ｍｏｄ  ｎ）と一致せず、目的であるパラメータＨを計算することができなくなる。
このように第２実施形態では、ステップ４０４において解決法３を実現しており、（ｍ×ｋ）／ｖが２のべき乗であるという制限がなくなり、また（ｍ×ｋ）／ｖのＭＳＢの算出が不要となるので課題２および課題４が解決される。
図１２では、ステップ４０２における２ｍ×ｋ（ｍｏｄ  ｎ）の計算法を特定していないが、第１実施形態と同様の解決法１を適用することで、ｎに関するＭＳＢを算出することが不要となり、さらに課題１および課題３を解決することができる。
【実施例１】  本発明の第１実施形態を実施した実施例１を図１３のフローチャートに基づいて説明する。
図１３におけるステップ５０１〜５０４は、それぞれ図１１のステップ３０１〜３０４に対応しており、ステップ３０２における２倍剰余演算については、ステップ５０２においてＲＥＧ２を左１ビットシフトした後、ＲＥＧ２≧ＲＥＧ１ならばＲＥＧ１からＲＥＧ１を減算することで行っている。この代わりにＲＥＧ２：＝ＲＥＧ２＋ＲＥＧ２の加算処理を行い、ＲＥＧ２≧ＲＥＧ１ならばＲＥＧ２からＲＥＧ１を減算する構成とすることも可能である。
この実施例１に必要な計算量を表３に示す。
0004616169.tif 000006
【実施例２】  本発明の第２実施形態を実施した実施例２を図１４のフローチャートに基づいて説明する。
図１４では、図１２のステップ４０２における２ｍ×ｋ（ｍｏｄ  ｎ）の算出方法、およびステップ４０３における２倍剰余演算の計算方法について特定した実施例である。
ステップ６０１〜６０６により図１２のステップ４０１，４０２の処理を、ステップ６０６により図１２のステップ４０３の処理を、ステップ６０７により図１２のステップ４０４の処理をそれぞれ行っている。
ステップ６０１〜６０６の処理により、ＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）演算している。これは、図６に示した方法においてｖ＝０とすることで演算することができる。
ステップ６０７では、ＲＥＧ０に対し２倍剰余算をｖ回繰り返すことでＲＥＧ０＝２ｍ×ｋ＋ｖ（ｍｏｄ  ｎ）とする。
ステップ６０８では、解決法３を用いて（ｍ×ｋ）／ｖの各ビット値に応じてＲＥＤＣ演算を１回もしくは２回繰り返すことで、ＲＥＧ２＝２２×ｍ×ｋ（ｍｏｄ  ｎ）＝Ｒ２（ｍｏｄ  ｎ）を計算する。
この実施例２に必要な計算量を表４に示す。
0004616169.tif 000007
【実施例３】  本発明の第２実施形態を実施した実施例３を図１５のフローチャートに基づいて説明する。
図１５では、実施例２と同様に、図１２のステップ４０２における２ｍ×ｋ（ｍｏｄ  ｎ）算出法およびステップ４０３における２倍剰余演算の計算方法について特定した実施例である。ステップ４０２の計算方法に解決法１の手法を用いることで、実施例２と同様の課題２および課題４を解決する効果に加え、課題１および課題３を解決することができる。
図１５について説明する。ステップ７０１〜７０３により、図１２のステップ４０１，４０２の処理を、ステップ７０４により図１２のステップ４０３の処理を、ステップ７０５により図１２のステップ４０４の処理をそれぞれ行っている。以下ではこれらの処理について説明する。
ステップ７０１〜７０３の処理により、ＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）を計算している。これは、解決法１でｖ＝０をした場合の処理を行っており、ｎのＭＳＢの算出を不要とし、課題１および課題３を解決できる。これらの処理によりＲＥＧ０＝ＲＥＧ２＝２ｍ×ｋ（ｍｏｄ  ｎ）を計算した後、ステップ７０４，７０５において解決法３を用いた処理を行い、ＲＥＧ２＝Ｒ２（ｍｏｄ  ｎ）を算出する。（ｍ×ｋ）／ｖが２のべき乗であるという制限がなく、（ｍ×ｋ）／ｖのＭＳＢの算出が不要であるので、課題４を解決することができる。最後に、ＲＥＧ２の値をパラメータＨとして出力し終了する。
この実施例３の計算量を表５に示す。
0004616169.tif 000008
【発明の効果】
上述した実施例１〜３では、表６に示すように、各課題１〜５を解決することが可能となる。
0004616169.tif 000009
さらに、ｎの条件によって、本発明は従来法より小さな計算量で処理を実現することが可能である。計算量に関する比較を以下の表７に示す。表７では、加算、減算、シフト算の計算量は全て同一と仮定しており、これらの演算をまとめてＡＤＤと表記している。また、ＲＥＤＣはモンゴメリ乗算剰余を表す。
0004616169.tif 000010
表７におけるＡＤＤの計算量を比較すると、４．５ｑ＋１．５ｖ＋１＞１．５ｋ＋１．５ｖである場合には、実施例１，３の方が従来法１，２より小さな計算量による処理を実現することができる。このときの条件はｋ≦３ｑであり、つまりｎの最上位ビットから連続する’０’の個数がｋ／３以上である場合に、実施例１，３は従来方式よりＡＤＤの回数を少なくすることができる。
また、ＲＥＤＣを含めた計算量比較の例を、以下の比較例１，２に示す。
比較例１：１０２４−ｂｉｔ  ＲＳＡ，１ワード＝３２ｂｉｔ、ｖ＝１の場合。
この場合、ｎは１０２４ｂｉｔである。また、１ワード＝３２ｂｉｔなのでｋ＝３２であり、１０２４ビットを表現するためのワード長ｍ＝３２となる。このとき、ｎの最上位ビット＝１となるので、ｑ＝０である。したがって、（ｍ×ｋ）／ｖ＝１０２４＝（１００００００００００）２であり、Ｗ（（ｍ×ｋ）／ｖ）＝０である。また、ＲＳＡ暗号の最大ビット長を１０２４−ｂｉｔと仮定し、ｂ＝１１とする。この条件下で、従来法と本発明に必要な計算量は以下のとおりである。
従来法１
ＡＤＤは２．５回、またｐ＝１０であるのでＲＥＤＣは１０回。
従来法２
ＡＤＤは２．５回、またｐ’＝１１，Ｗ（（ｍ×ｋ）／ｖ）＝０であるのでＲＥＤＣは１０回。
【実施例１】  ＡＤＤは１．５×３２＋１．５×１＝４９．５回、またｐ″＝１０かつ２ｐ″＝（ｍ×ｋ）／ｖであるのでＲＥＤＣは１０回。
【実施例２】  ＡＤＤは２．５回、またｂ＝１１，Ｗ（（ｍ×ｋ）／ｖ）＝０であるのでＲＥＤＣは１２回。
【実施例３】  ＡＤＤは１．５×３２＋１．５×１＝４９．５回、またｂ＝１１，Ｗ（（ｍ×ｋ）／ｖ）＝０であるのでＲＥＤＣは１２回。
これらを表８にまとめる。実施例２を用いることで、従来法の課題を解消しながら、ＡＤＤに関する計算量を従来法と同じとすることができる。
0004616169.tif 000011
比較例２：１６３−ｂｉｔ楕円曲線暗号、１ワード＝８ｂｉｔ、従来法１でｖ＝２１、他はｖ＝３の場合。
この場合、ｎは１６３ｂｉｔである。また、１ワードが８ビットなのでｋ＝８であり、１６３ビットを表現するためのワード長ｍ＝２１となる。このとき、ｎの上位８×２１−１６３＝５ビットが０となるのでｑ＝５である。ｖについては、パラメータ選択の制限から従来法１のみｖ＝２１とし、従来法２および実施例１，２，３はｖ＝３とする。ｖ＝２１の場合、（ｍ×ｋ）／ｖ＝８＝（１０００）２であり、Ｗ（（ｍ×ｋ）／ｖ）＝０である。またｖ＝３の場合、（ｍ×ｋ）／ｖ＝５６＝（１１１０００）２であり、Ｗ（（ｍ×ｋ）／ｖ）＝２である。また、楕円曲線暗号の最大ビット長を２５５−ｂｉｔと仮定し、ｂ＝８とする。この条件下で、従来法と本発明に必要な計算量は以下のとおりである。
従来法１
ＡＤＤは４．５×５＋１．５×２１＝５４回、またｐ＝３であるのでＲＥＤＣは３回。
従来法２
ＡＤＤは４．５×５＋１．５×３＝２７回、またｐ’＝６，Ｗ（（ｍ×ｋ）／ｖ）＝２であるのでＲＥＤＣは７回。
【実施例１】  ＡＤＤは１．５×８＋１．５×３＝１６．５回、またｐ″＝６かつ２ｐ″＞（ｍ×ｋ）／ｖであるのでＲＥＤＣは７回。
【実施例２】  ＡＤＤは４．５×５＋１．５×３＝２７回、またｂ＝８，Ｗ（（ｍ×ｋ）／ｖ）＝２であるのでＲＥＤＣは１０回。
【実施例３】  ＡＤＤは１．５×８＋１．５×３＝１６．５回、またｂ＝８，Ｗ（（ｍ×ｋ）／ｖ）＝２であるのでＲＥＤＣは１０回。
これらを表９にまとめる。実施例１，３を用いることで、従来法の課題を解消しながら、ＡＤＤの回数を従来法より削減することができる。さらに、ＲＥＤＣ演算をコプロセッサ等の専用ハードウェアを用いて高速に計算する場合を仮定しＡＤＤ＝ＲＥＤＣとした場合、実施例１の計算量は１６．５＋７＝２３．５，実施例３の計算量は１６．５＋１０＝２６．５となり、従来法１の（５４＋３＝５７）、および従来法２の（２７＋７＝３４）よりも全体の計算量を小さく抑えることができる。
0004616169.tif 000012
〈他の実施形態〉
前述した各実施形態は、ハードディスク、ＣＤ−ＲＯＭ、その他の記録媒体に格納されたプログラムをメインメモリ上で展開して、コンピュータを各機能部として機能させるように構成できる。この場合、本発明のモンゴメリ乗算剰余における変換パラメータの演算方法を実現するプログラムは、図１６に示すように、ＣＤ−ＲＯＭ３１１やフレキシブルディスク３１２などの可搬型記録媒体３１０、通信回線の先に備えられる他の記録装置３３０、コンピュータ３００のハードディスクやＲＡＭなどの記録媒体３２０のいずれに記録されるものであってもよく、プログラム実行時にはコンピュータ３００の主メモリ上にロードされて実行される。
【産業上の利用可能性】  本発明によれば、パラメータｖに関する制限、データ値の最上位有効ビット（Ｍｏｓｔ  Ｓｉｇｎｉｆｉｃａｎｔ  Ｂｉｔ，以下ＭＳＢ）の算出、およびデータのビット値の検出という問題を解決し、ソフトウェア実装における処理効率が向上させることができる。このことにより、ＲＳＡ、楕円曲線暗号などの公開鍵暗号を処理する際の処理速度を向上させることができる。
【図１】
0004616169.tif 000013
【図２】
0004616169.tif 000014
【図３】
0004616169.tif 000015
【図４】
0004616169.tif 000016
【図５】
0004616169.tif 000017
【図６】
0004616169.tif 000018
【図７】
0004616169.tif 000019
【図８】
0004616169.tif 000020
【図９】
0004616169.tif 000021
【図１０】
0004616169.tif 000022
【図１１】
0004616169.tif 000023
【図１２】
0004616169.tif 000024
【図１３】
0004616169.tif 000025
【図１４】
0004616169.tif 000026
【図１５】
0004616169.tif 000027
【図１６】
0004616169.tif 000028