(57)【要約】【課題】ＲＳＡ暗号の高速演算手法として、中国人剰余定理を用いた計算手法が広く用いられているが、最初の演算で、秘密素数ｐによる剰余計算が必要となる。この計算は、秘密素数ｐを陽に用いた計算であるので、古くからアタックの対象となっている。【解決手段】ｘ  ｍｏｄ  ｐ  を直接計算せずに、「図５」に示すように２＾（ｍ＋ｎ）  ｍｏｄ  ｐ  もしくは、２＾（２ｎ）  ｍｏｄ  ｐをあらかじめｘに乗じておき、その後、２＾（−ｎ）もしくは、２＾（−ｍ）を乗じて、２＾ｎ  ｘ  ｍｏｄ  ｐ  を計算する。モンゴメリ剰余乗算を用いる場合は、その後の処理は通例通りとなる。通常の剰余乗算を用いる場合は、べき乗剰余演算の最後に、（２＾（−ｎ））＾（２＾ｎ−１）  ｍｏｄ  ｐ  を乗じ補正する。【選択図】  図５
2004226674.tif 000002
【特許請求の範囲】
【請求項１】
＾をベキ乗演算と定義し、Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理方法に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（２ｍ＋ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算によりｘ１＝ｘ＊２＾（２ｍ＋ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（ｍ＋ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄＰを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理方法。
【請求項２】
＾をベキ乗演算と定義し、Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理方法に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（ｍ＋２ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算方式によりｘ１＝ｘ＊２＾（ｍ＋２ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（２ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｎ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄ  Ｐを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理方法。
【請求項３】
法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍ、指数をｄとし、ベキ乗の指数をｓビットづつとりだしてｓビット毎のベキ乗演算の結果を合成して、ｘ＾ｄ  ｍｏｄ  Ｐのベキ乗剰余演算を行う情報処理方法において、ｓビットづつ取り出した指数のｉ番目の指数をｄ［ｉ］としたとき、ｘ＾ｄ［ｉ］ｍｏｄＰを演算する代わりに（２＾ｎ）＾（２＾ｓ−１）＊ｘ＾ｄ［ｉ］ｍｏｄ  Ｐを用いて演算を行い、（２＾ｎ）＾（２＾ｎ−１）＊ｘ＾ｄ  ｍｏｄ  Ｐを計算した後、２＾（−ｎ）＾（２＾ｎ−１）ｍｏｄ  Ｐを乗じて、ｘ＾ｄ  ｍｏｄ  Ｐを計算することを特徴とする情報処理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は情報処理方法に関し、特に例えば、機密性の高いＩＣカードなどの耐タンパ装置に関するものである。
【０００２】
【従来の技術】
ＲＳＡの高速演算手法のＣＲＴ（Ｃｈｉｎｅｓｅ  Ｒｅｍａｉｎｄｅｒ  Ｔｈｅｏｒｙ）演算方式では、  計算の一番最初のステップでｘ  ｍｏｄ  ｐを計算する。ＣＲＴ演算方式の処理手順を図１に示す。まず、ｐで還元した値に対して剰余べき乗演算を行い（１０１０）、ｑで還元した値に対するべき乗剰余演算を行う（１０２０）。最後に２つのべき乗剰余演算結果を合成し（１０３０）最終的な結果を得る。最初のｐで還元した値の剰余べき乗演算（１０１０）およびｑで還元した値のべき乗剰余演算（１０２０）の最初のステップで、それぞれ秘密指数ｐに対する剰余、秘密指数ｑに対する剰余を計算する必要がある。べき乗剰余を計算するには、剰余乗算を繰り返し行うことで実現する。
【０００３】
１０１０、１０２０のべき乗計算には通常、アディションチェイン手法を用いる。アディションチェインとは、たとえば、Ｚ＝Ａ＾Ｌ  を計算する場合、指数Ｌを二進数展開し、
Ｌ＝Ｌ［ｎ−１］＊２＾（ｎ−１）＋Ｌ［ｎ−２］＊２＾（ｎ−２）＋  …  ＋Ｌ［１］＊２＾１＋Ｌ［０］＊２＾０          （式１）
と置き、指数の加算は掛算になり、指数の乗算がベキ計算になるという指数法則を用いて、Ｚ  ＝  Ａ  ＾  Ｌ  の計算を
Ｚ  ：＝    （…（  （  （Ａ＾Ｌ［ｎ−１］）＾２    ＊  （Ａ＾Ｌ［ｎ−２］）  ）＾２  ＊  …    ＊  （Ａ＾Ｌ［０］）    （式２）
とおく。Ａ＾Ｌ［ｉ］は、Ｌ［ｉ］＝１であれば、Ａとなり、Ｌ［ｉ］＝０  であれば、Ａ＾０＝１  となり、Ｌ［ｉ］＝０の場合に１の掛算を省略すると、Ｌを２進表記した際の１となるビット数回の掛算と、ｍ−１回の自乗計算により、Ａ＾Ｌが計算できる。
プログラムにより表現すると、
2004226674.tif 000003
となる。
【０００４】
剰余乗算の方式には大きくモンゴメリ剰余乗算を用いたものと、そうでないものの２つに分けることができる。
【０００５】
図２はモンゴメリ剰余乗算を用いた場合のアディションチェインによるべき乗剰余計算の処理フローである。ｎは、Ｐを格納するのに十分なビット長を示す。まず、Ｐに対するｘの剰余を２０２０で求める。モンゴメリ剰余乗算では、乗算の度に２＾（−ｎ）  ｍｏｄ  Ｐ  が乗ぜられるため、予め２＾ｎを被演算数に乗じておく。以下、Ｒ＝２＾ｎとおく。被演算数にＲを乗ずるのにも、モンゴメリ剰余乗算を用いる。あらかじめＲ＾２を計算しておき、モンゴメリ剰余乗算を用いてｘ  ｍｏｄ  Ｐに乗じ、ｘＲ  ｍｏｄ  Ｐ  を得る（２０４０）。モンゴメリ剰余乗算を用いるので、演算の初期値は１の代わりに１にＲを乗じたＲとする。乗算の処理は、指数の最上位のビットから１ビットづつ取り出すので、カウンタｉに最上位ビットの位置を示すｎ−１を設定する（２０５０）。指数上位ビットから順に１が立っているかどうかを調べ（２０６０）、０であれば、１を意味するＲを乗じ（２０７０）、１が立っていれば、ｘＲ  ｍｏｄ  Ｐ（＝ＡＲ）をＷに乗じる（２０８０）。１を意味するＲを乗じる処理２０７０は、計算結果に影響を与えないので、処理速度を重視する場合は省略可能である。ビットの位置カウンタを１ビット分移動し（２０９０）、最下位ビットまでたどり着いているかチェックを行い（２１００）、最下位ビットまで達していない場合は結果を二乗し（２１１０）、指数の次のビットに対して３０６０からの処理から処理を繰り返す。２１００で最下位ビットまで処理が終了した場合は、２＾ｎが掛かっている影響を取り除くため、２＾（−ｎ）を乗じる。モンゴメリ剰余乗算で、１との積を計算することは、２＾（−ｎ）を乗じることと等しい（３１２０）。最後に、結果がＰ以上の場合は（２１３０）、Ｐを減ずる（２１４０）。一連の処理の中で、２０２０の剰余演算の結果は、図３に示すように、Ｐの倍数（３０１０）を境にＰより大であるか小であるかによって、大きく値が変動するため、アタックポイントとなる可能性がある。
【０００６】
「図４」はモンゴメリではない剰余乗算を用いてアディションチェインによるべき乗剰余演算を行った場合の処理フローである。Ｐのビット長をｎとおく。つぎに、まずｘのＰに対する剰余を４０２０で求める。モンゴメリ剰余乗算を用いた場合の処理と同様、このＰに対する剰余を求める演算がアタックポイントとなる可能性がある。通常の剰余乗算を用いるので、演算の初期値は１とし、最上位のビットから１ビットづつ取り出すので、カウンタｉに最上位ビットの位置を示すｎ−１を設定する（４０４０）。指数上位ビットから順に１が立っているかどうかを調べ（４０５０）、１が立っていれば、ｘ  ｍｏｄ  Ｐ（＝Ａ）をＷに乗じ（４０７０）、ビットの値が０であれば、１を意味を乗じる（４０６０）。また、１を乗じる処理４０６０は、計算結果に影響を与えないので、処理速度を重視する場合は省略可能である。４０７０の処理でｘ  ｍｏｄ  Ｐ  の値が被演算数に使用されるので、ここもアタック対象になる可能性がある。ビットの位置を１ビット下に移動し（３０８０）、最下位ビットまでたどり着いていない場合は、結果を二乗し（３０９０）、指数の次のビットの処理を行う。最下位ビットまで処理が終了した場合は、その時点でのＷが計算結果となる。
【０００７】
以上のように、モンゴメリ剰余乗算を用いている場合も、通常の剰余乗算を行った場合も、Ｐによる剰余算結果が処理の最初に必要となりアタックポイントとなる可能性がある。
【０００８】
【発明が解決しようとしている課題】
ＲＳＡ暗号は認証や、秘密鍵の配送などに標準的に用いられている暗号で、金融用途等ではその演算の安全性が非常に重要視されている。ＲＳＡ暗号の高速演算手法として、中国人剰余定理を用いた計算手法が広く用いられているが、その一番最初の演算で、秘密素数ｐによる剰余計算が必要となる。この計算は、秘密素数ｐを陽に用いた計算であるので、古くからアタックの対象となっている。ｐによる剰余計算で問題となるのは、図２に示すようにｘ  がｐの倍数近傍（２０１０）の値の場合  ｘ＜ｋｐ  では、ｘ  ｍｏｄ  ｐ≒ｐ  となり大きな値となる一方、ｘ＞ｋｐの場合は、ｘｍｏｄ  ｐ≒０となり、小さな値となることである。ｘ  ｍｏｄ  ｐ  の値がｐを境界として大きく変動するため、入力ｘが秘密指数ｐよりも大なのか小であるのかが、電流値等のサイドチャネル情報として識別できる危険性がある。ＲＳＡ暗号では、大きな素数（現在は、５１２ｂｉｔ程度の素数が用いられている）ｐ、  ｑの積Ｎが容易に因数分解できないことを安全性の根拠としており、Ｎは公開鍵の一部としてユーザに公開されている。秘密素数ｐもしくはｑがリークすると、Ｎ／ｐは容易に計算可能であるので、秘密鍵ｄは公開鍵ｅの（ｐ−１）（ｑ−１）を法とする逆元を計算することにより、求めることが出来る。逆元計算は、拡張ユークリッド互除法により、容易に計算可能である。本発明は、ＣＲＴ向けの剰余計算を高速かつ安全に行うための計算方法および装置に関するものである。
【０００９】
【課題を解決するための手段】
ｘ  ｍｏｄ  ｐ  を直接計算せずに、２＾（ｍ＋ｎ）  ｍｏｄ  ｐ  もしくは、２＾（２ｎ）  ｍｏｄ  ｐをあらかじめｘに乗じておき、その後、２＾（−ｎ）もしくは、２＾（−ｍ）を乗じて、２＾ｎ  ｘ  ｍｏｄ  ｐ  を計算する。ｐは大きな素数であるので常に奇数となり、２のべき乗とは常に互いに素になるので、２＾（−ｍ）ｍｏｄ  ｐ  もしくは  ２＾（−ｎ）  ｍｏｄ  ｐ  は必ず存在する。また、２＾ｎ  ｘ  ｍｏｄ  ｐ  の値は、入力ｘがｐの近傍にある場合でもｘとｐの大小関係に依存した値の大きな変化は発生せず、２＾ｍ  ｘ  ｍｏｄ  ｐのビット長はｐのビット長に近い値となる。したがって、リーク情報からｘとｐの大小関係を推定することが不可能となり、秘密鍵の漏洩を防止することを可能とする。モンゴメリ剰余乗算を用いる場合には、２＾ｎ  を乗じた形式は、そのままモンゴメリフォーマットになっているので、以降の処理は、従来の処理フローを使用できる。
【００１０】
モンゴメリ剰余乗算を用いない場合には、指数演算計算の最後に、（２＾（−ｎ））＾（２＾ｎ−１）  ｍｏｄ  ｐ  を乗じ、２＾ｎ  ｍｏｄ  ｐ  を乗じた影響を補正することで、正しい結果を得る。
【００１１】
モンゴメリ乗算以外の剰余乗算を用いる場合は、乗算と自乗を行った後、Ｒ＾（−２）  ｍｏｄ  ｐを乗じる。あらかじめ  Ｒ＾（−２ｍ）  ｍｏｄ  ｐ  を計算しておき、最後にＲ＾（−（２＾ｍ）＋１）  ｍｏｄ  ｐ  を乗じて補正してもよい。
【００１２】
【発明の実施の形態】
図５はモンゴメリ剰余乗算を用いた場合の本発明の一実施例を示す。ｍを入力ｘの格納に必要なビット長、ｎをＰの格納に必要なビット長とする。０≦ｘ≦Ｐ＊Ｑであるので、必ずｍ≧ｎとなる。まず、Ｕ＝２＾Ｕ＿ＳＱＲ＝２＾（２ｎ）Ｕ  ｍｏｄ  Ｐを計算する（５０３０）。Ｕ＿ＳＱＲ＝２＾（２ｎ）Ｕ  ｍｏｄ  Ｐを計算する部分の詳細な処理フローを図７に示す。図７では、２＾Ｌ＊Ｕ  ｍｏｄ  Ｐ  の計算手順が示されているが、Ｌ＝２ｎとして、図７の処理を用いることができる。Ｕ＿ＳＱＲのビット長は、ｍ−２ｎもしくはｎのうちの長い方のビット長になる。５０４０の計算は、
Ａ＿Ｒ  ＝  （ｘ  ＊  Ｕ＿ＳＱＲ  ＋  Ｍ＊ｐ  ）  ／  ２＾ｍ                                （式３）
となり、ｘ＜２＾ｍ、Ｍ＜２＾ｍであるので、
Ａ＿Ｒ  ＜  Ｕ＿ＳＱＲ  ＋  ｐ                                              （式４）
となる。ｐのビット長はｎ以下であるので、Ａ＿Ｒのビット長は、ＭＡＸ（ｍ−２ｎ、  ｎ）となる。このビット長がｎ以下となるには、
ｍ−２ｎ  ＜  ｎ                                                      （式５）
ｍ  ＜  ３ｎ                                                    （式６）
である必要がある。通常の場合、ｍ≒２ｎ＜３ｎ  であるので、Ａ＿Ｒのビット長はｎとなる。５０５０の処理を行うには、５０４０の処理結果がｎ以下となる必要がある。ｍ  ＜  ３ｎ  の条件を満たさない場合には、図６に示す別の実施例による方法を行う。５０５０の処理を別の式で書くと、
（  Ａ＿Ｒ  ＋  （−Ａ＿Ｒ＊ｐ＾（−１）  ｍｏｄ  ２＾ｎ）  ＊  ｐ  ）  ／  ２＾ｎ                    （式７）
であるが、Ａ＿Ｒ  ＜  ２＾ｎ  かつ  （−Ａ＿Ｒ  ＊  ｐ＾（−１）  ｍｏｄ  ２＾ｎ）  ＜  ２＾ｎ  であるので、
（  Ａ＿Ｒ  ＋  （−Ａ＿Ｒ＊ｐ＾（−１）  ｍｏｄ  ２＾ｎ）  ＊  ｐ  ）  ／  ２＾ｎ  ＜  １＋ｐ              （式８）
となり、必ず５０５０の処理の後の  Ａ＿Ｒ  は  ｐ以下となり、ｎビット長で表現できる。また、５０５０でＡ＿Ｒの値がｐと等しくなるのは、ｘの値がｐの倍数となる場合のみである。
５０３０から５０５０までの処理を数式で表現すると、
2004226674.tif 000004
となる。
５０５０以降の処理は、図３の３０５０以降の処理と同一である。ｘの値がｐの倍数となっている場合、図２中の２１３０、２１４０の処理にて最終的に補正される。
【００１３】
図６はモンゴメリ剰余乗算を用いた場合の本発明の別の一実施例を示す。ｍを入力ｘの格納に必要なビット長、ｎをＰの格納に必要なビット長とする。０≦ｘ≦Ｐ＊Ｑであるので、必ずｍ≧ｎとなる。まず、Ｌ＝ｎ＋ｍとして、図７に示されるフローに従って、Ｕ’＿ＳＱＲ＝２＾（ｎ＋ｍ）Ｕ  ｍｏｄ  Ｐを計算する（６０３０）。６０４０以降の処理を行うためにはＵ’＿ＳＱＲのビット数はｍ以下である必要があるが、Ｕ’＿ＳＱＲは必ずｍビット以下になる。６０５０の処理では、
（  Ａ＿Ｒ  ＋  （−Ａ＿Ｒ＊ｐ＾（−１）  ｍｏｄ  ２＾ｍ）  ＊  ｐ  ）  ／  ２＾ｍ                      （式１２）
であるが、Ａ＿Ｒ  ＜  ２＾ｎ  かつ  （−Ａ＿Ｒ  ＊  ｐ＾（−１）  ｍｏｄ  ２＾ｍ）  ＜  ２＾ｍ  であるので、
（  Ａ＿Ｒ  ＋  （−Ａ＿Ｒ＊ｐ＾（−１）  ｍｏｄ  ２＾ｍ）  ＊  ｐ  ）  ／  ２＾ｍ  ＜  １＋ｐ              （式１３）
となり、必ず６０５０の処理の後の  Ａ＿Ｒ  は  ｐ以下となり、ｎビット長で表現できる。また、６０５０でＡ＿Ｒの値がｐと等しくなるのは、ｘの値がｐの倍数となる場合のみである。
６０３０から６０５０までの処理を１つの式で表現すると、
2004226674.tif 000005
となる。
６０５０以降の処理は、図３の３０５０以降の処理と同一である。ｘの値がｐの倍数となっている場合、図２中の２１３０、２１４０の処理にて最終的に補正される。また、図５の実施例と異なり、ｍ  ＜  ３ｎ  という条件は必要ない。
【００１４】
図５、図６に示される実施例に必要な、２＾Ｌ＊Ｕ  ｍｏｄ  Ｐを計算する実施例を図７に示す。図７の手順は下位ビットからのアディションチェインにより、Ｗ：＝２＾Ｌ＊Ｒｍｏｄ  Ｐを計算している。Ｗの初期値は、ｍビットに収まる形で、ｗ≡２＊（２＾ｍ）  ｍｏｄ  Ｐとなる値にする。Ｌを２進数表現したときに、最上位以外のビットに１がない場合は、Ｌ回の剰余自乗計算のみで計算できるが、Ｌ最上位ビット以外に１となるビットが有る場合には、途中で乗算を行う必要がある。従って、Ｌ最上位以外のビット位置に１が見つかったか否かを示す変数ｍｕｌを用意しておく（７００５）。７０１０の処理は、Ｐの最上位ビットがｍの最上位ビットの位置と等しくなるようにシフトをした値を減じて、ｍビットの値に収まるようにするための処理である。７０２０、７０３０、７０４０、７０５０の処理は、Ｗの最上位２ビットを０とするための処理である。この処理は、最終的な演算結果がｎビットに収まるようにするために行っている。処理が最上位ビットに達した際かのチェックを行い（７０６０）達している場合は、変数ｍｕｌの値をチェックし（７０８０）、１であれば、ＹにＬの途中のビットに相当する結果が格納されているので、ＷにＹを乗じ（７０９０）結果とする。処理が最上位ビットにまで達していない場合は、Ｌの最下位ビット位置に１があるかチェックを行い（７０７０）見つかった場合は変数ＹにＷの値を保存する。ｍｕｌの値をチェックし（７１００）、最上位以外のビットで１がはじめて見つかった場合は、ＹにＷの値を代入し（７１２０）、ｍｕｌに１を設定する（７１３０）。７１２０の処理は、本来Ｙに１を代入しておきＹ：＝Ｙ＊Ｗと計算することと等しい。また、７１００のチェックで、すでに最上位以外のビットで１が見つかっている場合は、Ｙの値に現在のＷの値を乗じる（７１１０）。Ｒの剰余自乗計算をモンゴメリ剰余乗算で行い（７１４０）、Ｌを１ビット右にシフトし（７１５０）、７０６０からの処理を繰り返す。
７１４０の  Ｙ＊Ｙ＊２＾（−ｍ）  ｍｏｄ  ｐ  の計算は、
（Ａ＊Ａ＋Ｍ＊ｐ）／（２＾ｍ）                                              （式１７）
と等しい。ここで、
Ｍ＝−Ｙ＊Ｙ＊（ｐ＾（−１））ｍｏｄ  ２＾ｍ  ＜  ２＾ｍ                                （式１８）
である。
したがって、
（Ｙ＊Ｙ＋Ｍ＊ｐ）／（２＾ｍ）  ＜  （Ｙ＊Ｙ＋２＾ｍ＊ｐ）／（２＾ｍ）                      （式１９）
また、Ｙをｍビット長のメモリに格納したときの、最上位の０となるビットの数をｓとすると、
2004226674.tif 000006
であるので、７１４０の（Ｙ＊Ｙ＋Ｍ＊ｐ）／２＾ｍの演算結果は、１回演算するごとに最上位の０であるビットの数が、ｓ［ｔ＋１］：＝２ｓ［ｔ］−１となる。従って、２＾（ｍ−２ｓ）がｐよりも大の場合は、ｔ回計算したあと最上位から連続する０のビット数は、ｓ［０］＊２＾（ｔ−１）個となり、２＾（ｍ−２ｓ）がｐよりも小さくなれば、ビット長はｐによって決定される。８０２０、８０３０、８０４０、８０５０の処理で最上位の２ビットは０に設定されるので、ｓ［０］＝２となり、ｔ回８１４０を実行した後のビット数は、ｍ−２＾ｔもしくはｎとなる。また、ｔの回数は、ｔ＝ｌｏｇ２（Ｌ）であるので、ビット数は、ｍａｘ（ｍ−Ｌ、  ｎ）となる。
【００１５】
図８は通常の剰余乗算を用いた場合の本発明の一実施例を示す。ｍを入力ｘの格納に必要なビット長、ｎをＰの格納に必要なビット長とする。まず、図９のフローに従って、２＾ｎ  ｍｏｄ  Ｐを計算し、Ｒとする（８０２０）。次に、入力ｘにＲを乗じる（８０３０）。最後に補正を行うためのＲ＿ＩＴＯＴＡＬを計算する（８０４０）が、この処理はＰが確定していれば、入力値ｘと独立して計算することが可能であるので、予め計算して保存して置いても良い。実際の計算では、まず２＾（−ｎ）ｍｏｄ  ｐを「図１０」の手順に従って計算し、Ｒ＿ＩＮＶとし、ＲおよびＲ＿ＩＮＶを元に図１１の手順に従って、（Ｒ＿ＩＮＶ）＾（２＾ｎ−１）  ｍｏｄ  Ｐ  を計算し、Ｒ＿ＩＴＯＴＡＬとする。通常の剰余乗算を用いるので、演算の初期値Ｗは１とし、カウンタｉに最上位ビットの位置を示すｎ−１を設定する（８０５０）。指数上位ビットから順に１が立っているかどうかを調べ（８０６０）、１が立っていれば、ｘＲ  ｍｏｄ  Ｐ（＝Ａ＿Ｒ）をＷに乗じ（４０８０）、ビットの値が０であれば、１を意味するＲを乗じる（８０７０）。ビットの位置を１ビット下に移動し（８０９０）、最下位ビットまで処理が終了したかをチェックし（８１００）、最下位ビットまで処理がたどり着いていない場合は、結果を二乗し（８１１０）、指数の次のビットの処理を行う。８０７０、８０８０の処理では通常の処理と比べると必ずＲが毎回余計に乗じられるため、最下位ビットまで処理が終了した場合は、Ｒ＾（２＾ｎ−１）が余分に乗じられることになる。余分に乗じられたＲ＾（２＾ｎ−１）の影響を取り除くために、最後にＲ＿ＩＴＯＴＡＬ（８２１０）を乗じる。
【００１６】
図９は、図８の実施例中の８０２０で２＾Ｌ  ｍｏｄ  Ｐを計算する処理の一実施例である。図９の手順は下位ビットからのアディションチェインにより、Ｒ：＝２＾Ｌ  ｍｏｄＰを計算している。Ｌを２進数表現したときに、最上位以外のビットに１がない場合は、Ｌ回の剰余自乗計算のみで計算できるが、Ｌ最上位ビット以外に１となるビットが有る場合には、途中で乗算を行う必要がある。Ｌの最上位以外のビット位置に１が見つかったか否かを示す変数ｍｕｌを用意し、０に初期化しておく（９００５）。次にＲを２で初期化する（９０１０）。処理が最上位ビットに達した際かのチェックを行い（９０６０）達している場合は、変数ｍｕｌの値をチェックし（９０８０）、１であれば、ＹにＬの途中のビットに相当する結果が格納されているので、ＲにＹを乗じ（９０９０）結果とする。最上位ビットにまで処理が達していない場合は、Ｌの最下位ビット位置に１があるかチェックを行い（９０７０）見つかった場合は変数Ｙに保存する。ｍｕｌの値をチェックし（９１００）、最上位以外のビットで１がはじめて見つかった場合は、ＹにＲの値を代入し（９１２０）、ｍｕｌに１を設定する（９１３０）。９１２０の処理は、本来Ｙに１を代入しておきＹ：＝Ｙ＊Ｒと計算することと等しい。また、９１００のチェックで、すでに過去に最上位以外のビットで１が見つかっている場合は、Ｙの値に現在のＲの値を乗じる（９１１０）。Ｒの剰余自乗を計算し（９１４０）、Ｌを１ビット分右シフトしたのち（９１５０）、再び９０６０からの処理に戻る。
【００１７】
図１０は、図８の実施例中の８０４０でＲ＿ＩＮＶ：＝２＾（−ｎ）  ｍｏｄ  Ｐを計算する処理の一実施例である。図１０の手順は下位ビットからのアディションチェインにより、Ｒ＿ＩＮＶ：＝２＾（−Ｌ）  ｍｏｄ  Ｐを計算している。Ｌを２進数表現したときに、最上位以外のビットに１がない場合は、Ｌ回の剰余自乗計算のみで計算できるが、Ｌ最上位ビット以外に１となるビットが有る場合には、途中で乗算を行う必要がある。Ｌの最上位以外のビット位置に１が見つかったか否かを示す変数ｍｕｌを用意し、０に初期化しておく（１０００５）。次にＲを１／２で初期化する（１００１０）。１／２に初期化するには、１を１回右シフトすればよいが、１を右シフトすると０になるため、まずＰを加えてから右シフトを行う。Ｐの値は大きな素数であるので、必ず奇数となる。したがって、１＋Ｐは必ず偶数になるため、右シフトが可能である。つぎに処理が最上位ビットに達した際かのチェックを行い（１００６０）達している場合は、変数ｍｕｌの値をチェックし（１００８０）、１であれば、ＹにＬの途中のビットに相当する結果が格納されているので、Ｒ＿ＩＮＶにＹを乗じ（１００９０）結果とする。最上位ビットにまで処理が達していない場合は、最上位以外のビット位置に１があるかチェックを行い（１００７０）見つかった場合は変数Ｙに保存する。ｍｕｌの値をチェックし（９１００）、最上位以外のビットで１がはじめて見つかった場合は、ＹにＲの値を代入し（９１２０）、ｍｕｌに１を設定する（９１３０）。９１２０の処理は、本来Ｙに１を代入しておきＹ：＝Ｙ＊Ｒと計算することと等しい。また、９１００のチェックで、すでに過去に最上位以外のビットで１が見つかっている場合は、Ｙの値に現在のＲの値を乗じる（９１１０）。Ｒの剰余自乗を計算し（９１４０）、Ｌを１ビット分右シフトしたのち（９１５０）、再び９０６０からの処理に戻る。
【００１８】
図１１は、図８の実施例中の８０４０でＲ＿ＩＴＯＴＡＬ：＝（Ｒ＿ＩＮＶ）＾（２＾ｎ−１）  ｍｏｄ  Ｐを計算する処理の一実施例である。演算方法は、式２６に示すように、Ｒ＿ＩＮＶ＾（２＾ｎ）にＲを乗ずることにより行う。Ｒ＿ＩＮＶ＾（２＾ｎ）は、剰余自乗演算をｎ回繰り返すことにより計算する。
2004226674.tif 000007
まず、Ｒ＿ＩＴＯＴＡＬをＲ＿ＩＮＶで初期化し（１１０１０）、つぎに剰余自乗算を行う回数ｎを変数ｉに代入（１１０２０）、Ｒ＿ＩＴＯＴＡＬの剰余自乗した値をＲ＿ＩＴＯＴＡＬに代入し（１１０３０）、カウンタ用変数ｉから１を減じ（１１０４０）、カウンタ変数ｉの値が０よりも大きければ（１１０５０）、１１０３０からの処理を繰り返す。最後にＲをＲ＿ＩＴＯＴＡＬに剰余乗算した値をＲ＿ＩＴＯＴＡＬに代入し（１１０６０）、結果として返す。
付記：
１．法Ｎ上での計算において、非演算数にあらかじめＮと互いに素な値をべき乗した値を乗じ、計算後に前記Ｎと互いに素な値のべき乗した値の法Ｎに対する逆元を乗ずることで計算することを特徴とした処理方法。
２．法Ｎ上での剰余計算において、非演算数にあらかじめＮと互いに素な値をべき乗した値を乗じ、計算後に前記Ｎと互いに素な値のべき乗した値の法Ｎに対する逆元を乗ずることを特徴とした処理方法において、法Ｎが２よりも大きな素数の積であり、前記Ｎと互いに素である値として２を用いることを特徴とした処理方法。
３．モンゴメリ剰余乗算装置を有し、Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理装置に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（２ｍ＋ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算装置によりｘ１＝ｘ＊２＾（２ｍ＋ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（ｍ＋ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄ  Ｐを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理装置。
４．Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理方法に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（２ｍ＋ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算によりｘ１＝ｘ＊２＾（２ｍ＋ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（ｍ＋ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄ  Ｐを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理方法。
５．モンゴメリ剰余乗算装置を有し、Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理装置に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（ｍ＋２ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算装置によりｘ１＝ｘ＊２＾（ｍ＋２ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（２ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｎ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄ  Ｐを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理装置。
６．Ｐを素数とし、ｘ＞Ｐであるｘに対して、ｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算する情報処理方法に於いて、法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍとし、入力値をｘ＊（２＾ｎ）  ｍｏｄ  Ｐに変換する際に、２＾（ｍ＋２ｎ）  ｍｏｄ  Ｐを計算するか、あるいは予め用意しておき、モンゴメリ剰余乗算方式によりｘ１＝ｘ＊２＾（ｍ＋２ｎ）＊（２＾（−ｍ））ｍｏｄ  Ｐ＝ｘ＊２＾（２ｎ）  ｍｏｄ  Ｐを計算し、さらにｘ２：＝ｘ１＊（２＾（−ｎ））ｍｏｄ  Ｐ＝ｘ＊（２＾ｎ）  ｍｏｄ  Ｐを計算することにより、ｘ  ｍｏｄ  Ｐを陽に求めること無しにｘ＊（２＾ｎ）  ｍｏｄ  Ｐ  を計算することを特徴とする情報処理方法。
７．法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍ、指数をｄとし、べき乗の指数をｓビットづつとりだしてｓビット毎のべき乗演算の結果を合成して、ｘ＾ｄ  ｍｏｄＰのべき乗剰余演算を行う情報処理装置において、ｓビットづつ取り出した指数のｉ番目の指数をｄ［ｉ］としたとき、ｘ＾ｄ［ｉ］ｍｏｄＰを演算する代わりに（２＾ｎ）＾（２＾ｓ−１）＊ｘ＾ｄ［ｉ］ｍｏｄ  Ｐを用いて演算を行い、（２＾ｎ）＾（２＾ｎ−１）＊ｘ＾ｄ  ｍｏｄ  Ｐを計算した後、２＾（−ｎ）＾（２＾ｎ−１）ｍｏｄ  Ｐを乗じて、ｘ＾ｄ  ｍｏｄ  Ｐを計算することを特徴とする情報処理装置。
８．法をＰ、入力値をｘ、法Ｐを格納するために必要充分なビット数をｎ、入力値ｘを格納するために必要なビット長をｍ、指数をｄとし、べき乗の指数をｓビットづつとりだしてｓビット毎のべき乗演算の結果を合成して、ｘ＾ｄ  ｍｏｄＰのべき乗剰余演算を行う情報処理方法において、ｓビットづつ取り出した指数のｉ番目の指数をｄ［ｉ］としたとき、ｘ＾ｄ［ｉ］ｍｏｄＰを演算する代わりに（２＾ｎ）＾（２＾ｓ−１）＊ｘ＾ｄ［ｉ］ｍｏｄ  Ｐを用いて演算を行い、（２＾ｎ）＾（２＾ｎ−１）＊ｘ＾ｄ  ｍｏｄ  Ｐを計算した後、２＾（−ｎ）＾（２＾ｎ−１）ｍｏｄ  Ｐを乗じて、ｘ＾ｄ  ｍｏｄ  Ｐを計算することを特徴とする情報処理方法。
【００１９】
【発明の効果】
本発明によれば、べき乗剰余演算のＣＲＴ計算において、秘密素数による入力値の剰余計算を直接行わずに計算できるため、入力を変えながら、消費電流などを観測することで秘密素数を推定することが困難となる。「図１２」は通例の方法による計算時のｘ  ｍｏｄ  Ｐのビット長およびハミングウエイト（値を２進数表現した場合に１になっているビットの数）を示す。「図１３」は本発明における、ｘ  ｍｏｄ  Ｐに相当するｘ・２＾ｎ  ｍｏｄ  Ｐのビット長及びハミングウエイトを示す。図１２では入力データの値とｘ  ｍｏｄ  Ｐの間に明らかな依存性が現れているが、図１３では入力データに依存せず、ビット長およびハミングウエイトが一定値となり、依存性が現れないことが確認できる。
【図面の簡単な説明】
【図１】通例のＲＳＡ用ＣＲＴ演算方式の処理フロー。
【図２】モンゴメリ剰余乗算を用いた場合の、通例のＣＲＴ方式向けべき乗剰余演算の処理のフロー。
【図３】ｘとｘを秘密素数ｐで剰余計算した結果のグラフ。
【図４】通常の剰余乗算を用いた場合の、通例のＣＲＴ方式向けべき乗剰余演算の処理のフロー。
【図５】本発明による、モンゴメリ剰余乗算を用いたセキュアな剰余演算処理の一実施例。
【図６】本発明による、モンゴメリ剰余乗算を用いたセキュアな剰余演算処理の別の一実施例。
【図７】本発明による、モンゴメリ剰余乗算を用いたセキュアな剰余演算処理の部分処理一実施例。
【図８】本発明による、セキュアなべき乗剰余演算処理の一実施例。
【図９】本発明による、セキュアなべき乗剰余演算処理の部分処理の一実施例。
【図１０】本発明による、セキュアなべき乗剰余演算処理の部分処理の一実施例。
【図１１】本発明による、セキュアなべき乗剰余演算処理の部分処理の一実施例。
【図１２】通例のｘとｘを秘密素数ｐで剰余計算した結果のグラフ。
【図１３】本発明によるｘとｘを秘密素数ｐで剰余計算した結果のグラフ。
【図１】
2004226674.tif 000008
【図２】
2004226674.tif 000009
【図３】
2004226674.tif 000010
【図４】
2004226674.tif 000011
【図５】
2004226674.tif 000012
【図６】
2004226674.tif 000013
【図７】
2004226674.tif 000014
【図８】
2004226674.tif 000015
【図９】
2004226674.tif 000016
【図１０】
2004226674.tif 000017
【図１１】
2004226674.tif 000018
【図１２】
2004226674.tif 000019
【図１３】
2004226674.tif 000020