(57)【特許請求の範囲】
【請求項１】
モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行するデータ処理装置であって、前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）を生成する２のベキ乗生成処理と、
前記指数部切り出し処理で切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を第１記憶領域に格納する第１処理と、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記２のベキ乗生成手段により計算した２＾（ｅ［Ｊ−１］＋１）と、前記Ｒ２ｍｏｄＮ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１の記憶領域に格納する第２処理と、
前記第１処理又は前記第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に書き戻す動作をｍ回繰り返す第４処理と、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は、前記２のベキ乗生成処理により生成された２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）と前記第１の記憶領域に格納された値との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第５処理と、
前記第５処理の後に、前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し、前記ｉの値が２以上の場合は前記第４処理に戻り、前記ｉの値が１以下になるまでそれを繰り返す第６処理と、
前記第６処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に書き込む動作をｍ回繰り返す第７処理と、
前記第７処理の後、前記２のベキ乗生成処理により計算された２＾（ｅ［１］＋ｎ−２ｍ）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第８処理と、
前記第８処理の後、前記モンゴメリ剰余乗算装置により、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第９処理と、
前記第９処理の後、前記２のベキ乗生成処理により計算された２＾（ｅ［０］）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って、その演算結果をフェルマーテスト結果として出力する第１０処理とを含む、データ処理装置。
【請求項２】
前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成された、請求項１記載のデータ処理装置。
【請求項３】
モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行するデータ処理装置であって、前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）
を生成する２のベキ乗生成処理と、
前記指数部切り出し処理により切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って、その演算結果を第１記憶領域に格納する第１処理と、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記２のベキ乗生成手段により計算した２＾（ｅ［Ｊ−１］＋１）と前記素数候補Ｎとの排他的論理和を取った値と、前記Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第２処理と、
前記第１処理又は第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその４演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第４処理と、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は、前記２のベキ乗生成処理により生成された２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）と前記素数候補Ｎとの排他的論理和が採られた値と、前記第１記憶領域に格納されている値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第５処理と、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１と等しい場合は、前記Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎと、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第６処理と、
前記第５処理又は第６処理のいずれか一方の処理の後に前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し、前記ｉの値が２以上の場合は、前記第３処理に戻り、前記ｉの値が１以下になるまでそれを繰り返す第７処理と、
前記第７処理の後に前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第８処理と、
前記第８処理の後、前記２のベキ乗生成処理で生成された２＾（ｅ［１］＋ｎ−２ｍ）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第９処理と、
前記第９処理の後、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第１０処理と、
前記第１０処理の後、前記２のベキ乗生成処理により生成された２＾（ｅ［０］）と前記第１記憶領域に格納された値との前記Ｎを法とするモンゴメリ剰余乗算を行って、その演算結果をフェルマーテスト結果として出力する第１１処理とを含む、データ処理装置。
【請求項４】
前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成された、請求項２記載のデータ処理装置。
【請求項５】
モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行するデータ処理装置であって、前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）を生成する２のベキ乗生成処理と、
前記指数部切り出し処理により切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を第１記憶領域に格納する第１処理と、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記Ｎのｅ［Ｊ−１］＋１ビット目の値を指定ビット反転器により反転した値と前記Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第２処理と、
前記第１処理又は第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第４処理と、
前記第４処理の後に、前記指数部切り出し処理によって切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は、前記Ｎのｅ［ｉ］＋１＋ｎ−２ｍビット目の値を前記指定ビット反転器により反転した値と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に記憶する第５処理と、
前記第４処理の後に、前記指数部切り出し処理によって切り出された部分指数ｅ［ｉ］が２ｍ−１と等しい場合は、前記Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第６処理と、
前記第５処理又は第６処理のいずれか一方の処理の後に、前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し、前記ｉの値が２以上の場合は、前記第３処理に戻り、前記ｉの値が１以下になるまでそれを繰り返す第７処理と、
前記第７処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第８処理と、
前記第８処理の後、前記２のベキ乗生成手段により計算した２＾（ｅ［１］＋ｎ−２ｍ）と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算をおこなってその演算結果を前記第１記憶領域に格納する第９処理と、
前記第９処理の後、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第１０処理と、
前記第１０処理の後、前記２のベキ乗生成処理により生成された２＾（ｅ［０］）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果をフェルマーテスト結果として出力する第１１処理とを含む、データ処理装置。
【請求項６】
前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成された、請求項５記載のデータ処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フェルマーテストを実行するデータ処理装置に関し、例えば機密性の高いＩＣカードなどの耐タンパ装置向けの素数生成に関するものである。
【背景技術】
【０００２】
ＩＣカードは、主に、勝手に書き換えられない情報の保持や秘密情報である暗号鍵を使ったデータの暗号化や暗号文の復号化を行うために使われる装置である。
【０００３】
ＩＣカードは、電源を持っていないため、リーダライタに差し込まれると、電源の供給を受け、動作可能となる。動作可能になると、リーダライタからコマンドを受けて、コマンドに従い、データの転送を行う。
【０００４】
ＩＣカードチップは、プログラムや重要な情報がＩＣカード用チップの中に密閉されており、外部からそれらの情報に直接アクセスすることはできない。外部との通信は、Ｉ／Ｏピンのみを介して、完全にＩＣカードチップの制御下で行われ、通常情報は暗号化した状態で送受信され、情報の秘匿性を実現している。暗号通信を行うためには、通信する相手と暗号鍵の共有を行う必要がある。事前に鍵を通信相手と共有しておく方法もあるが、一度鍵が判明してしまうと、暗号化した通信内容が復号化されてしまう。そこで、通信に用いる暗号鍵をランダムに生成し、相手に鍵を送信し、その鍵を用いて通信するという方法がある。
【０００５】
相手に鍵を送る際に、鍵を平文のまま送ってしまうと、次にその鍵を用いた暗号通信は簡単に解読されてしまう。そこで、公開鍵暗号技術を用いる。公開鍵暗号とは、暗号化に用いる鍵と、復号化に用いる鍵が異なり、暗号化に用いる鍵から複号に用いる鍵を求めることが、計算量的に困難な暗号方式である。
【０００６】
公開鍵暗号方式を用いた鍵交換では、相手に自分の公開鍵を送り、相手側は通信の暗号化に用いる鍵を乱数などから生成し、送られてきた公開鍵で暗号化した後、暗号化された鍵を返信する。返信されてきた暗号化鍵を、さきほど相手に送った公開鍵に対応する秘密鍵で復号化し、次の通信に用いる。
【０００７】
公開鍵暗号方式として最も広く用いられている暗号として、ＲＳＡ暗号方式がある。この暗号方式は、２つの大きな素数の積からなる合成数が、容易に因数分解できないことを利用した暗号である。因数分解自体は、試行割り算法や数体篩などによって、アルゴリズム的には求めることは可能であるが、数が大きくなると、因数を求めることが時間的に困難となる。現在、１０２４ビットから２０４８ビット長の鍵が用いられている。鍵の生成はＩＣカードの外部の計算機で行い、生成された鍵をＩＣカードに書き込むという方法で公開鍵暗号方式の鍵をＩＣカードに格納してきた。
【０００８】
この方法では、原理的にＩＣカードの外側に公開鍵暗号の秘密鍵が存在してしまうため、その秘密鍵が適切に管理できないと、セキュリティを確保できないという問題があった。そこで、ＩＣカード内部で公開鍵暗号方式の秘密鍵と公開鍵のペアを生成することが行われるようになった。これにより、セキュリティは向上するが、ＲＳＡ暗号の鍵生成はＩＣカードで行うには時間の掛かる処理であり、高速化が必要となった。ＲＳＡ暗号鍵の生成でもっとも時間の掛かる処理は、２つの大きな素数を生成する処理である。素数生成は、奇数乱数を生成し、次に生成された乱数が素数であるかを判定し、素数で無かった場合にはまた新たに素数を生成して素数判定を行う処理を繰り返すことで実現されている。
【０００９】
素数判定には、いろいろな手法が用いられているが、２を元としたフェルマーテストにより、最初の素数判定を行い、それにパスした乱数をさらに厳密な素数判定処理に掛ける方式が高速化に向いている。これは、２倍算がシフトで行えるためである。
【００１０】
しかし、指数部が１が０かにより、剰余乗算の有無などの処理の違いを消費電力の違いなどから推定し、秘密情報である素数が推定される可能性があり、セキュリティ面で不安があった。
【００１１】
高速、かつセキュアにフェルマーテストを行う方法としては、一時に指数をｍビットまとめて処理する、非特許文献１に記されているｍ−ａｒｙ法（もしくはＷｉｎｄｏｗ法とも呼ばれる）がある。ｍ−ａｒｙ法では、指数部をｍ［ｂｉｔ］ごとに区切って，区間ごとにｍ回の剰余二乗算と１回の剰余乗算を行う。指数のビット数がｎ［ｂｉｔ］の場合，ｎ回の剰余二乗算とｎ／ｍ回の剰余乗算を行う必要がある。ｘｙ  ｍｏｄ  Ｎを計算する場合のｍ−ａｒｙ法の手順を示す。ここで、ｅ［ｉ］はｙをｍビット毎に区切った値で、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに、下記（式１）
ｙ＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］    （式１）
を満たす。ｍ−ａｒｙ法の手順は例えば、
ｒｅｓｕｌｔ：＝  １；
ｆｏｒ  ｉ：＝Ｊ−１  ｄｏｗｎＴｏ  ０  ｄｏ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ  ＊  ｘ＾（ｅ［ｉ］）  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｔｕｒｎ  ｒｅｓｕｌｔ
とされる。
【００１２】
この方式は、ビットパタンによる処理内容に違いが発生せず、ｍの値を増やすことで、処理に必要な剰余乗算の回数がｍに反比例して減少する。しかし、ｘ＾１〜ｘ＾（２ｍ−１）までの値を事前に計算しておく必要があるため、ｍを増加させるとワークエリアが２ｍに比例して増加するという問題があった。これは、特にＲＡＭのサイズに制約のあるＩＣカードでは大きなネックとなる。
【００１３】
ｘ＾（ｅ［ｉ］）の値を必要になった際に動的に計算することも考えられるが、特にＩＣカードでよく用いられるモンゴメリ剰余乗算アルゴリズム（非特許文献２）を用いたコプロセッサにおいては、通常の数値表現から２＾ｎ  ｍｏｄ  Ｎを乗じたモンゴメリ表現に変換する必要があるため、動的に剰余乗算の演算数を計算することは、速度低下をもたらすという問題があった。
【００１４】
【非特許文献１】Ａｌｆｒｅｄ  Ｊ．  Ｍｅｎｅｚｅｓ，Ｐａｕｌ  Ｃ．  ｖａｎ  Ｏｏｒｓｃｈｏｔ  ａｎｄ  Ｓｃｏｔｔ  Ａ．  Ｖａｎｓｔｏｎｅ，“ＨＡＮＤＢＯＯＫ  ｏｆ  ＡＰＰＬＩＥＤ  ＣＲＹＰＴＯＧＲＡＰＨＹ”，ＣＲＣ  Ｐｒｅｓｓ，ｐｐ．６１５−６１６、ＩＳＢＮ  ０−８４９３−８５２３−７，（１９９７）
【非特許文献２】Ｄａｒｒｅｌ  Ｈａｎｋｅｒｓｏｎ，Ａｌｆｒｅｄ  Ｍｅｎｅｚｅｓ  ａｎｄ  Ｓｃｏｔｔ  Ｖａｎｓｔｏｎｅ，“Ｇｕｉｄｅ  ｔｏ  Ｅｌｌｉｐｔｉｃ  Ｃｕｒｖｅ  Ｃｒｙｐｔｏｇｒａｐｈｙ”，Ｓｐｒｉｎｇｅｒ，ｐｐ．３８，ＩＳＢＮ  ０−３８７−９５２７３−Ｘ，（２００４）
【発明の開示】
【発明が解決しようとする課題】
【００１５】
ＲＳＡ暗号の鍵を高速に生成するには、素数を高速に生成することが必要であるが、従来手法で素数判定を高速に行う必要場合、速度と記憶容量はトレードオフの関係にあり、特にメモリ容量がＩＣカードでは高速化が困難であった。
【００１６】
本発明の目的は、メモリ容量を消費せずに高速にフェルマーテストによって素数判定を行うことができるデータ処理装置を提供することにある。
【００１７】
本発明の前記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１８】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１９】
すなわち、本発明は、コプロセッサのビット長をｎとしたときに、ｍをｍ≦ｌｏｇ２（ｎ）を満たす最大の整数とし、ｍビットごとに指数を処理することで、ｍ−ａｒｙ法での剰余乗算の回数を減らし、高速化を図る。また、ｍ−ａｒｙ法では、事前にｘ１からｘ２＾ｍ−１までの２ｍ−１種類の値を事前計算し、メモリに格納する必要があるが、本発明ではｘ＝２であることを利用し、処理中に剰余乗算に用いる演算数を動的に生成し、事前計算や事前計算した値を保存する記憶容量を用意しなくともよくすることで、必要な記憶容量を増やすことなく高速化を実現しようとするものである。尚、本明細書において記号＾はべき乗演算を意味し、記号・は乗算演算を意味する。
【００２０】
剰余乗算をモンゴメリコプロセッサで行う場合、２のベキ数にＲ（＝２ｎ  ｍｏｄ  Ｎ）を剰余乗算した値を用いる必要がある。Ｒも２のベキ数であるが、法Ｎよりも大きな値であるので、複雑なビットパタンとなり、事前計算を行うか、剰余乗算の都度、Ｒ２  ｍｏｄ  Ｎをさらに乗じる必要がある。ここで、ｅ［ｉ］は（Ｎ−１）をｍビット毎に区切った値で、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに式（式２）
Ｎ−１＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋…＋２ｍ・ｅ［１］＋ｅ［０］        （式２）
を満たすものとする。
【００２１】
モンゴメリ剰余乗算コプロセッサを用いて、剰余乗算ごとにＲ２  ｍｏｄ  Ｎを乗じる方法により２Ｎ−１  ｍｏｄ  Ｎを計算する処理アルゴリズムは、
ｒｅｓｕｌｔ：＝Ｒ  ｍｏｄ  Ｎ
ｆｏｒ  ｉ：＝Ｊ−１  ｄｏｗｎＴｏ  ０  ｄｏ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２ｅ［ｉ］・Ｒ−１  ｍｏｄ  Ｎ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・Ｒ２・Ｒ−１  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・１・Ｒ−１  ｍｏｄ  Ｎ
ｒｅｔｕｒｎ  ｒｅｓｕｌｔ
である。
【００２２】
Ｒ２  ｍｏｄ  Ｎを乗じる方式でも、必要なメモリ容量を増やすことなく、乗算回数は２・ｎ／ｍ回に削減することができるが、ｍ−ａｒｙ法でｍビットごとに指数を扱った場合のｎ／ｍ回と比べると、剰余乗算の回数が倍となる。
【００２３】
この問題を解決するために、剰余乗算の演算数と被演算数それぞれにＲが乗じられているのを、片方の被演算数のみにＲ２を乗じる方式を考える。こうすることで、乗じる値がハミングウエイト１となり、事前計算が不要となる。ただし、そのままの値を乗じると、剰余乗算後の結果にはＲが乗じられているのみの形式になる。ベキ乗剰余の剰余演算の前には、剰余二乗算がｍ回行われることを利用し、剰余二乗算の結果、Ｒ２が乗じられる形式になるように、剰余乗算の際に補正値を乗じる。
【００２４】
剰余乗算する際に、被演算数にＲ２＝２２ｎが乗じられるようにするには、剰余乗算後の被演算数には２ｎが乗じられているので、ｍ回の剰余自乗算後に２ｎとなるような値を乗じればよい。すでに乗じられている２ｎと、追加で乗じられる２ｎとをあわせて、２２ｎが常時乗じられる。したがって、演算数に次の式（３）
ａ＾（２ｍ）＝２ｎ            （式３）
を満たす補正値ａを乗ずればよい。
【００２５】
これは、簡単に解くことができて、
ａ＝２＾（ｎ／（２ｍ））          （式４）
でａは与えられる。ｎが２のベキ数の場合は、ｍの定義より２ｍ＝ｎであるので、直ちに
ａ＝２            （式５）
が求まる。
【００２６】
一方、ｎが２のベキ数ではない場合、
ａ＝２・２＾（ｎ・（２ｍ）−１）          （式６）
となり、２（ｎ／（２＾ｍ）−１）は整数ではないため、そのまま補正値に用いることはできない。そこで、補正をｍ回の剰余自乗算の前に行う部分ａ’と、ｍ回の剰余自乗算の後に行う部分ｂの２つに分ける。ここでは、ａ’＝２とする。すなわち、剰余自乗算前に２で補正を行い、剰余自乗算後の補正値として（式７）
ｂ＝（２＾（ｎ／（２ｍ）−１））＾（２ｍ）            （式７）
を満たすｂを考える。
【００２７】
指数法則により、ｂは、
ｂ＝２＾（ｎ−２ｍ）          （式８）
となる。したがって、ｎが２のベキ数でない場合の補正値  ａ’・ｂ  は、
ａ’・ｂ＝２・２＾（ｎ−２ｍ）＝２＾（１＋ｎ−２ｍ）        （式９）
となる。ｎが２のベキ数の場合は、ｎ−２ｍ＝０であるので、（式９）は（式５）と等しくなる。また、（式７）はｂ＝１となる。
【００２８】
Ｎ−１をｍビット毎に区切った剰余乗算では、（式９）の補正値と指数をｍビット毎に区切った値を指数とした２のべき数である２＾（ｅ［ｉ］）の積である
２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）              （式１０）
を乗じることになる。ｅ［ｉ］はｍビットの値なので、最大値は２ｍ−１となる。この値を（式１０）に代入すると、２ｎとなる。これは、ｎ＋１ビット長の値であり、コプロのビット長ｎを超えてしまう。こうしたビット溢れが生ずるのは、ｅ［ｉ］が最大値である２ｍ−１となる場合のみで、それ以外の場合は、（式１０）の値は２ｎ未満となり、ｎビット以下の値であるので、ｎビット長のコプロセッサで計算ができる。
【００２９】
したがって、ｅ［ｉ］の値が２ｍ−１の場合は、演算数としてＲ  ｍｏｄ  Ｎを用い、ｅ［ｉ］の値が２ｍ−１未満の場合は、演算数として（式１０）の２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）を用いる。
【００３０】
また、演算の最初のステップでは、あらかじめ被演算数にはＲ２  ｍｏｄ  Ｎで初期化しておくので、補正値のｂの値は不要である。したがって、指数の最上位を処理する最初のステップでは、ｅ［ｉ］＋１の値が２ｎと等しいか否かを判定し、等しい場合は、演算数としてＲ  ｍｏｄ  Ｎを用い、２ｎ未満の場合は、２＾（ｅ［ｉ］＋１）を用いる。ｎが２のベキ数でない場合は、ｅ［ｉ］＋１は常に２ｎ未満となるので、ｎが２のベキ数でないことが予めわかっている場合において、最初のｅ［ｉ］＋１が２ｎと等しいか否かを検査はしなくてもよい。
【００３１】
モンゴメリ剰余乗算で計算を行う場合には、最終結果からＲを取り除く必要があり、通常、１とのモンゴメリ剰余乗算を行うことで、Ｒ−１を乗じ、通常の表現に戻す。
【００３２】
本発明では、結果にＲ２が乗じられているので、最後の２回の剰余乗算で補正を行う。まず、最後から２番目のｅ［１］を処理する際には、次の剰余乗算の際にＲ２が乗じられるようにするための補正は不要で、Ｒのみが残るように、ａ’・ｂのうちのｂのみの補正値を乗ずればよい。したがって、演算数として、
２＾（ｅ［１］＋ｎ−２ｍ）                  （式１１）
を乗じる。ｅ［１］＋ｎ−２＾ｍの値は、必ず２ｎ未満となるため、２ｎとの比較は必要ない。この値を乗じた後、ｍ回の自乗演算を行うと、被演算数にはＲが乗じられている状態になるので、最後の最下位の指数ｅ［０］を処理する際に、
２＾（ｅ［０］）                （式１２）
を乗じることで、最終結果はモンゴメリ形式ではなく、通常の数値表現になる。以上の手順をアルゴリズム表現すると、以下の如く、
ｒｅｓｕｌｔ：＝Ｒ２  ｍｏｄ  Ｎ
ｉｆ  ｅ［Ｊ−１］＋１＜２ｎ  ｔｈｅｎ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［ｉ］＋１）・Ｒ−１ｍｏｄ  Ｎ
ｅｌｓｅ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｒ  ｍｏｄ  Ｎ）・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｉｆ
ｆｏｒ  ｉ：＝Ｊ−２  ｄｏｗｎＴｏ  ２  ｄｏ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｉｆ  ｅ［ｉ］＋１＋ｎ−２ｍ＜２ｎ  ｔｈｅｎ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）・Ｒ−１ｍｏｄ  Ｎ
ｅｌｓｅ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｒ  ｍｏｄ  Ｎ）・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｉｆ
ｅｎｄ  ｆｏｒ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［１］＋ｎ−２ｍ）・Ｒ−１  ｍｏｄ  Ｎ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［０］）・Ｒ−１  ｍｏｄ  Ｎ
ｒｅｔｕｒｎ  ｒｅｓｕｌｔ
と、表すことができる。
【００３３】
また、（式１１）で示される演算数はハミングウエイトが１であり、モンゴメリ剰余乗算コプロでは通常下位側から演算が進められるため、演算数のビットが０となっている部分を処理している間は電流地が小さく、ビットが１となっている部分で大きく消費電流が増加する可能性がある。その場合、消費電流を測定して指数の値をある程度推定することが可能となる。そうした問題を解決するために、演算がＮを法とする剰余乗算であることと、剰余乗算の後に剰余二乗算が行われることを利用し、演算数には（式１１）の値の代わりに、
Ｎ  ±  ２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）        （式１３）
を使用することができる。しかし、（式１３）では加減算によるキャリーが発生し、キャリーの伝版によるディレイや、最上位ビットからのキャリーの発生による桁あふれが発生する可能性がある。そこで、
Ｎ  ｘｏｒ  ２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）      （式１４）
の形式にすることで、キャリーは発生しなくなる。（式１４）はＮの（ｅ［ｉ］＋１＋ｎ−２ｍ）ビット目のビットが１であるか０であるかにより、加減算のいずれかが行われることと等価で、Ｎの該当ビットが１であった場合は減算、Ｎの該当ビットが０であった場合は加算が行われる。排他的論理和（ｘｏｒ）演算ではキャリーの伝播が発生せず、キャリーの伝播に伴うディレイもない上、回路も小さくて済む。
【００３４】
（式１４）による変形を行うと、演算数のハミングウエイトはほぼビット長の半分となり、消費電流を用いたアタック手法に対して、耐タンパ性が強化される。（式１４）の変形を導入した手順をアルゴリズム表現すると、
ｒｅｓｕｌｔ：＝Ｒ２  ｍｏｄ  Ｎ
ｉｆ  ｅ［Ｊ−１］＋１＜２ｎ  ｔｈｅｎ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｎ  ｘｏｒ  ２＾（ｅ［Ｊ−１］＋１））・Ｒ−１ｍｏｄ  Ｎ
ｅｌｓｅ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｒ  ｍｏｄ  Ｎ）・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｉｆ
ｆｏｒ  ｉ：＝Ｊ−２  ｄｏｗｎＴｏ  ２  ｄｏ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｉｆ  ｅ［ｉ］＋１＋ｎ−２ｍ＜２ｎ  ｔｈｅｎ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｎ  ｘｏｒ  ２＾（ｅ［ｉ］＋１＋ｎ−２ｍ））・Ｒ−１  ｍｏｄ  Ｎ
ｅｌｓｅ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｒ  ｍｏｄ  Ｎ）・Ｒ−１  ｍｏｄ  Ｎ
ｅｎｄ  ｉｆ
ｅｎｄ  ｆｏｒ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［１］＋ｎ−２ｍ）・Ｒ−１  ｍｏｄ  Ｎ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ・Ｒ−１ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［０］）・Ｒ−１  ｍｏｄ  Ｎ
ｒｅｔｕｒｎ  ｒｅｓｕｌｔ
と、表すことができる。
【００３５】
この手順に従い、モンゴメリ剰余乗算コプロを用いて２を元とするフェルマーテストを高速に実装することができる。
【００３６】
同様の手法は、モンゴメリ剰余乗算方式ではない通常表現を用いる剰余乗算コプロセッサを用いる場合でも用いることができる。通常の表現を用いる剰余乗算コプロセッサでは、演算数には補正値がいらないので、次の（式１５）
Ｎ  ｘｏｒ  ２＾（ｅ［ｉ］）          （式１５）
の値を演算数に用いる。
【００３７】
（式１４）であらわされる剰余乗算の演算数の変形は、剰余乗算後に剰余二乗算により負の値の符号が正となることを前提としているので、最下位のｍビット分、すなわちｅ［０］に対しては用いることができない。したがって、ｅ［０］の場合は（式１４）の変形は行わない。以上の手順をアルゴリズム表現すると、
ｒｅｓｕｌｔ：＝Ｎ  ｘｏｒ  ２＾（ｅ［Ｊ−１］）
ｆｏｒ  ｉ：＝Ｊ−２  ｄｏｗｎＴｏ  １  ｄｏ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・（Ｎ  ｘｏｒ  ２＾（ｅ［ｉ］））  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｆｏｒ  ｊ：＝１  ｔｏ  ｍ  ｄｏ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ２  ｍｏｄ  Ｎ
ｅｎｄ  ｆｏｒ
ｒｅｓｕｌｔ：＝ｒｅｓｕｌｔ・２＾（ｅ［０］）  ｍｏｄ  Ｎ
ｒｅｔｕｒｎ  ｒｅｓｕｌｔ
と、表すことができる。
【００３８】
以上の手順を用いれば、モンゴメリ型剰余乗算器あるいは剰余乗算器のいずれを用いた場合でも、メモリ容量を消費せずに高速にフェルマーテストを行って素数判定が可能になる。
【発明の効果】
【００３９】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記のとおりである。
【００４０】
すなわち、メモリ容量を消費せずに高速にフェルマーテストによって素数判定を行うことができるデータ処理装置を提供することができる。
【発明を実施するための最良の形態】
【００４１】
１．実施の形態の概要
先ず、本願において開示される発明の代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００４２】
〔１〕本発明に係るデータ処理装置（図１、図７、図９、図１０、図１１）は、モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行する。前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して（図９のステップ7010）記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに(図９のステップ7020)、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と (図９のステップ7030)、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）を生成する２のベキ乗生成処理と(図９のステップ7060の一部分)、
前記指数部切り出し処理で切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は(図９のステップ7050)、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を第１記憶領域に格納する第１処理と (図９のステップ7070)、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記２のベキ乗生成手段により計算した２＾（ｅ［Ｊ−１］＋１）と、前記Ｒ２ｍｏｄＮ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１の記憶領域に格納する第２処理と (図９のステップ7060)、
前記第１処理又は前記第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と(図９のステップ7080)、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に書き戻す動作をｍ回繰り返す第４処理と(図１０のステップ7090)、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は(図１０のステップ7100)、前記２のベキ乗生成処理により生成された２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）と前記第１の記憶領域に格納された値との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第５処理と(図１０のステップ7110)、
前記第５処理の後に、前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し(図１０のステップ7130)、前記ｉの値が２以上の場合は前記第４処理に戻り、前記ｉの値が１以下になるまでそれを繰り返す第６処理と、
前記第６処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に書き込む動作をｍ回繰り返す第７処理と(図１１のステップ7150)、
前記第７処理の後、前記２のベキ乗生成処理により計算された２＾（ｅ［１］＋ｎ−２ｍ）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第８処理と(図１１のステップ7160)、
前記第８処理の後、前記モンゴメリ剰余乗算装置により、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第９処理と(図１１のステップ7170)、
前記第９処理の後、前記２のベキ乗生成処理により計算された２＾（ｅ［０］）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って(図１１のステップ7180)、その演算結果をフェルマーテスト結果として出力する第１０処理とを含む。
【００４３】
〔２〕項1のデータ処理装置において、前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成される。
【００４４】
〔３〕別の観点によるデータ処理装置（図４、図７、図１２、図１３、図１４）は、モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行する。前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して(図１２のステップ7010)記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに(図１２のステップ7020)、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と(図１２のステップ7030)、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）
を生成する２のベキ乗生成処理と、
前記指数部切り出し処理により切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は(図１２のステップ7050)、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って(図１２のステップ7070)、その演算結果を第１記憶領域に格納する第１処理と、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記２のベキ乗生成手段により計算した２＾（ｅ［Ｊ−１］＋１）と前記素数候補Ｎとの排他的論理和（図４の3032）を取った値と、前記Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第２処理と(図１２のステップ8060)、
前記第１処理又は第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と (図１２のステップ7080)、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその４演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第４処理と(図１２のステップ7090)、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は(図１３のステップ7100)、前記２のベキ乗生成処理により生成された２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）と前記素数候補Ｎとの排他的論理和（図４の3032）が採られた値と、前記第１記憶領域に格納されている値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って(図１３のステップ8110)その演算結果を前記第１記憶領域に格納する第５処理と、
前記第４処理の後に、前記指数部切り出し処理で切り出された部分指数ｅ［ｉ］が２ｍ−１と等しい場合は、前記Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎと、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って（図１３のステップ7120）その演算結果を前記第１記憶領域に格納する第６処理と、
前記第５処理又は第６処理のいずれか一方の処理の後に前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し(図１３のステップ7130)、前記ｉの値が２以上の場合は、前記第３処理に戻り(図１３のステップ7140)、前記ｉの値が１以下になるまでそれを繰り返す第７処理と、
前記第７処理の後に前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第８処理と(図１４のステップ7150)、
前記第８処理の後、前記２のベキ乗生成処理で生成された２＾（ｅ［１］＋ｎ−２ｍ）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第９処理と(図１４のステップ7160)、
前記第９処理の後、前記素数候補Ｎを法とし、前記第１記憶領域に格納された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第１０処理と(図１４のステップ7170)、
前記第１０処理の後、前記２のベキ乗生成処理により生成された２＾（ｅ［０］）と前記第１記憶領域に格納された値との前記Ｎを法とするモンゴメリ剰余乗算を行って(図１４のステップ7180)、その演算結果をフェルマーテスト結果として出力する第１１処理とを含む。
【００４５】
〔４〕項３のデータ処理装置は、前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成される。
【００４６】
〔６〕別の観点によるデータ処理装置（図３、図７、図１２、図１３、図１４）は、モンゴメリ剰余乗算を行うモンゴメリ剰余乗算器を備えたコプロセッサと、プログラムを実行し前記コプロセッサを制御する中央処理装置とを有し、前記中央処理装置の制御によってデータ処理を行なうことにより、外部より与えられた素数候補Ｎに対して、２（Ｎ−１）ｍｏｄ  Ｎを計算してフェルマーテストを実行する。前記データ処理は、
前記素数候補Ｎを記憶する処理と、
Ｎのビット長ｎを記憶する処理と、
ｌｏｇ２（ｎ）を超えない最大の整数ｍを計算して(図１２のステップ7010)記憶する処理と、
前記素数候補Ｎから、Ｎ−１を計算し、ＪをＪ≧ｎ／ｍとなる最小の整数としたときに(図１２のステップ7020)、（Ｎ−１）を最下位からｍビットごとにＪ個の区間に区切り、（Ｎ−１）＝２（Ｊ−１）ｍ・ｅ［Ｊ−１］＋２（Ｊ−２）ｍ・ｅ［Ｊ−２］＋…＋２ｍ・ｅ［１］＋ｅ［０］なる式を満たすように（Ｎ−１）を部分指数ｅ［０］，ｅ［１］，…，ｅ［Ｊ−１］に分割する指数部切り出し処理と(図１２のステップ7030)、
前記指数部切り出し処理により切り出されたｍビットの値ｅ［ｉ］から２＾（ｅ［ｉ］＋１＋ｎ−２ｍ）を生成する２のベキ乗生成処理と、
前記指数部切り出し処理により切り出された部分指数の最上位の値に１を加えたｅ［Ｊ−１］＋１が２ｎと等しい場合は(図１２のステップ7050)、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って(図１２のステップ7070)その演算結果を第１記憶領域に格納する第１処理と、
前記ｅ［Ｊ−１］＋１が２ｎ未満の場合は、前記Ｎのｅ［Ｊ−１］＋１ビット目の値を指定ビット反転器（3020）により反転した値と前記Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎの演算結果との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第２処理と(図１２のステップ8086)、
前記第１処理又は第２処理のいずれか一方の処理の後に内部の状態変数ｉをＪ−２とする第３処理と(図１２のステップ7080)、
前記第３処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第４処理と (図１３のステップ7090)、
前記第４処理の後に、前記指数部切り出し処理によって切り出された部分指数ｅ［ｉ］が２ｍ−１未満の場合は(図１３のステップ7100)、前記Ｎのｅ［ｉ］＋１＋ｎ−２ｍビット目の値を前記指定ビット反転器（3020）により反転した値と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に記憶する第５処理と (図１３のステップ8110)、
前記第４処理の後に、前記指数部切り出し処理によって切り出された部分指数ｅ［ｉ］が２ｍ−１と等しい場合は、前記Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎの演算結果と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する第６処理と(図１３のステップ7120)、
前記第５処理又は第６処理のいずれか一方の処理の後に、前記内部状態変数ｉから１を引いた値を前記内部状態変数ｉに格納し(図１３のステップ7130)、前記ｉの値が２以上の場合は、前記第３処理に戻り(図１３のステップ7140)、前記ｉの値が１以下になるまでそれを繰り返す第７処理と、
前記第７処理の後に、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第８処理と(図１４のステップ7150)、
前記第８処理の後、前記２のベキ乗生成手段により計算した２＾（ｅ［１］＋ｎ−２ｍ）と前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算をおこなってその演算結果を前記第１記憶領域に格納する第９処理と(図１４のステップ7160)、
前記第９処理の後、前記素数候補Ｎを法とし、前記第１記憶領域に記憶された値同士のモンゴメリ剰余乗算を行ってその演算結果を前記第１記憶領域に格納する動作をｍ回繰り返す第１０処理と(図１４のステップ7170)、
前記第１０処理の後、前記２のベキ乗生成処理により生成された２＾（ｅ［０］）と、前記第１記憶領域に格納された値との前記素数候補Ｎを法とするモンゴメリ剰余乗算を行って(図１４のステップ7180)その演算結果をフェルマーテスト結果として出力する第１１処理とを含む、データ処理装置。
【００４７】
〔６〕項５のデータ処理装置は、前記プログラムを格納したメモリを更に有し、１個の半導体基板に形成される。
【００４８】
２．実施の形態の詳細
実施の形態について更に詳述する。以下、本発明を実施するための形態を図面に基づいて詳細に説明する。なお、発明を実施するための形態を説明するための全図において、同一の機能を有する要素には同一の符号を付して、その繰り返しの説明を省略する。
【００４９】
＜＜第１の実施形態＞＞
図１はフェルマーテストを実行する本発明に係るデータ処理装置１を機能ブロックダイヤグラムで示すものであり、図９、図１０及び図１１に示される本発明によるフェルマーテスト高速演算手順を実現する。データ処理装置１は、図７に例示されるモンゴメリ剰余乗算器（６０５０）及び演算レジスタ（６０６０，６０７０，６０８０）等を備えたモンゴメリ乗算コプロセッサ（６０４０）と共に、プログラムを実行してモンゴメリ乗算コプロセッサ６０４０等を制御する中央処理装置（６０１０）とメモリ（６０２０）等を有し、相互にバス６０３０で接続される。メモリ（６０２０）はプログラム（ＰＧＭ）を格納する電気的に書換え可能な不揮発性メモリと、変数やデータ（ＤＡＴ）等の格納に利用されるＳＲＡＭ等のランダムアクセスメモリから成る。このデータ処理装置１は例えば、図１７に示されるような１個の半導体基板に形成されたＩＣカード用マイクロコンピュータ１０７として実現される。図１７ではＩＣカード用マイクロコンピュータ１０７はＩＣカード基板１０８に搭載されている。ＩＣカード用マイクロコンピュータ１０７は、プログラムや重要な情報がオンチップのメモリに格納されており、外部からそれらの情報に直接アクセスすることができない。ようになっている。外部との通信は、Ｉ／Ｏピン（１０６）のみを介して、完全にＩＣカードチップの制御下で行われ、通常情報は暗号化した状態で送受信され、情報の秘匿性が実現されている。暗号通信を行うためには、通信する相手と暗号鍵の共有を行う必要がある。事前に鍵を通信相手と共有しておく方法もあるが、一度鍵が判明してしまうと、暗号化した通信内容が復号化されてしまう。そこで、通信に用いる暗号鍵をランダムに生成し、相手に鍵を送信し、その鍵を用いて通信するという方法が一般的に用いられている。外部インタフェース端子として、Ｖｃｃピン１０１、リセットピン１０２、クロック入力ピン１０３、グランドピン１０４、不揮発メモリプログラム用電源ピン１０５、及びＩ／Ｏピン１０６を有する。
【００５０】
ＩＣカード用マイクロコンピュータ１０７はオンチップのメモリ等の限られた演算リソースを用いて暗号通信に使用する暗号鍵を生成する機能を備える。暗号鍵にはビット数の多い素数を用いることになり、その素数性を判定する演算処理の第１の例について説明する。
【００５１】
図１において法レジスタＮ（１０００）は外部より素数候補Ｎを入力して格納し、ビットｎレジスタ（１０１０）は、外部より素数候補Ｎのビット数ｎを入力して格納する。ｌｏｇ２（ｎ）を超えない最大の整数を与えるｌｏｇ２計算装置（１０３０）により、ｌｏｇ２（ｎ）を超えない最大の整数ｍが得られる。１０３０の出力する値の種類は、ｌｏｇ２（ｎの最大値）であるので、実際には計算を行わずにテーブル引きや、ｎの非零のビットのうちの最上位のビットの位置から求めることができる。たとえば、
ｎ０：＝ｎ
ｍ：＝０
ｗｈｉｌｅ  ｎ０＞１
ｍ：＝ｍ＋１
ｎ０：＝ｎ０＞＞１
ｅｎｄ  ｗｈｉｌｅ
としてもよい。この処理は、図９の７０１０のステップに相当する。１０３０で求められたｍはｍを格納するレジスタ（１０２０）に格納される。整数除算器（１０４０）により、ｎ／ｍの小数点以下を切り上げた値が求められ、セレクタ（１０５０）により１０４０の出力が選択され、カウンタｉ（１０６０）にセットされる。この処理は、図９のステップ７０２０に相当する。カウンタｉは、ｍビットごとに分割された（Ｎ−１）の何番目の部分ビットを取り出すのかを指定するために用いられる。一方、演算器（１１００）により、Ｒ２  ｍｏｄ  Ｎ＝２２ｎ  ｍｏｄ  Ｎが計算され、結果レジスタ（１１６０）に格納される。図１においてその格納パスは図示が省略されている。この処理は図９のステップ７０４０に相当する。図９の“result”は前記結果レジスタ’１１６０）を意味する。つぎに、Ｒ  ｍｏｄ  Ｎ＝２ｎ  ｍｏｄ  Ｎが計算され、レジスタ（１１１０）に格納される。この処理は、図９のステップ７０７０で用いるＲｍｏｄＮの準備に相当する。ｉの値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最上位が切り出され、演算数生成装置（１０９０）により、２＾（ｅ［ｉ］＋１）が生成される。つぎに、ｍビット長の値すべてのビットが１である値を生成する２ｍ−１生成器（１１２０）の値と１０９０により切り出された指数との比較が比較器（１１３０）により行われ、等しい場合はセレクタ（１１４０）はレジスタ（１１１０）を選択し、そうでない場合は演算数生成装置（１０９０）の出力が選択される。モンゴメリ剰余乗算器（１１５０）により、結果レジスタ（１１６０）の値とセレクタ（１１４０）に選択された値とのモンゴメリ剰余乗算が行われ、結果レジスタ（１１６０）に格納される。この処理は、図９のステップ７０５０、７０６０，７０７０に相当する。減算器（１０７０）により、カウンタｉ（１０６０）の値はデクリメントされ、デクリメントされた結果がセレクタ（１０５０）に選択され、カウンタｉ（１０７０）が更新される。この処理は図９のステップ７０８０に相当する。
【００５２】
モンゴメリ剰余乗算演算モード制御部（１２００）は次にモンゴメリ剰余乗算器（１１５０）の演算モードを二乗算に変更し、セレクタ（１１７０）を介してカウンタｊ（１１８０）を初期化する。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算し結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１０のステップ７０９０に相当する。つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の部分ビットが切り出され、比較器（１１３０）により２ｍ−１と比較される。比較結果により、セレクタ（１１４０）により、演算数生成装置（１０９０）の出力かＲ  ｍｏｄ  Ｎを格納したレジスタ（１１１０）が選択され、結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１０のステップ７１００，７１１０，７１２０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値を演算器（１０７０）によりデクリメントし、カウンタｉ（１０６０）の値が１以上の場合は、図９のステップ７０９０に相当する処理から繰り返す。
【００５３】
カウンタｉ（１０６０）の値が１の場合は、モンゴメリ剰余乗算器（１１５０）の演算モードを二乗算に変更し、セレクタ（１１７０）を介してカウンタｊ（１１８０）を初期化する。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算し結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１１のステップ７１５０に相当する。
【００５４】
つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最下位から２番目のｍビットが取り出される。カウンタｉ（１０６０）が１の場合は、演算数生成装置（１０９０）を常に選択し、結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１１のステップ７１６０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値が演算器（１０７０）によりデクリメントされ、カウンタｉ（１０６０）に設定される。
【００５５】
モンゴメリ剰余乗算器（１１５０）の演算モードが二乗算に変更され、セレクタ（１１７０）を介してカウンタｊ（１１８０）が初期化される。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算し結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１１のステップ７１７０に相当する。
【００５６】
最後に、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最下位のｍビットを取り出す。カウンタｉ（１０６０）が０の場合は、演算数生成装置（１０９０）を常に選択し、結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１１のステップ７１８０の処理に相当する。剰余乗算が終了したら、結果レジスタ（１１６０）に２＾（Ｎ−１）ｍｏｄ  Ｎの値が格納され、処理が終了する。
【００５７】
図２はＲ２ｍｏｄ  Ｎを計算する演算器（１１００）の詳細を示す。演算器（１１００）は、法Ｎ（１０００）およびビット長ｎ（１０１０）が入力されると、演算器（２０１０）により、２ＲｍｏｄＮが計算される。ここで、２Ｒ＝２ｎ＋１である。ｎビット目が１になるまでＮが左ビットシフトされ、２ｎ＋１から左シフトしされたＮの値が減算されて２ＲｍｏｄＮレジスタ（２０２０）に格納すされる。Ｎは素数候補であるから奇数であるので、必ずｎ−１ビット目以下にゼロでないビットを含む。したがって、Ｎを左シフトした値は２ｎよりも大きな値となるので、２ｎ＋１から左シフトしたＮの値を減算した結果は、２nよりも小さな値となる。２RｍｏｄＮ（２０２０）に格納される値は、２ｎ未満であれば、正確にｍｏｄＮを求めなくとも良い。
【００５８】
２ＳｍｏｄＮレジスタ（２０６０）には、２ｎ−Ｎ＝Ｒを代入しておく。Ｒはモンゴメリ剰余乗算では１と等価である。２ＲｍｏｄＮレジスタ（２０２０）に格納されている値は、２ｔＲｍｏｄＮと表記するとｔ＝１に相当する。モンゴメリ剰余乗算器を用いて、モンゴメリ剰余二乗算を１回行うと、ｔが倍となる。モンゴメリ剰余二乗算を行った後は、結果は演算数レジスタ（２０３０）に格納される。Ｒ２ｍｏｄＮは、２ｎＲｍｏｄＮと等しいので、Ｒ２ｍｏｄＮを計算するには、モンゴメリ剰余二乗算を行い、ｔの値が変わるたびに、ｔとｎの値の論理積（ＡＮＤ）を採り、ゼロでない場合は、演算数（２０３０）と２ＳｍｏｄＮレジスタ（２０６０）を入力とし、モンゴメリ剰余乗算器（２０５０）で剰余乗算を行い、結果を２ＳｍｏｄＮレジスタ（２０６０）に格納するという処理を行う。次に、ふたたび演算数レジスタ（２０３０）の値をモンゴメリ剰余二乗算する処理を行い、ｔとｎの値のＡＮＤをとり、ゼロでない場合は、演算数（２０３０）と２ＳｍｏｄＮレジスタ（２０６０）を入力とし、モンゴメリ剰余乗算器（２０５０）剰余乗算を行い、結果を２ＳｍｏｄＮレジスタ（２０６０）に格納するという処理を、２ｔ＞ｎとなるまで繰り返す。この処理が終了すると、２ＳｍｏｄＮレジスタ（２０６０）にはＲ２ｍｏｄＮが格納される。
【００５９】
＜＜第２の実施形態＞＞
図３はフェルマーテストを実行する本発明に係るデータ処理装置２を機能ブロックダイヤグラムで示すものであり、図１２、図１３及び図１４に示される本発明によるフェルマーテスト高速演算手順を実現する。データ処理装置１は図７で説明したのと同様にモンゴメリ剰余乗算器（６０５０）及び演算レジスタ（６０６０，６０７０，６０８０）等を備えたモンゴメリ乗算コプロセッサ（６０４０）と共に、プログラムを実行してモンゴメリ乗算コプロセッサ６０４０等を制御する中央処理装置（６０１０）とメモリ（６０２０）等を有し、例えば図１７に例示されるようなＩＣカード用マイクロコンピュータ１０７として実現される。データ処理装置２で構成されたＩＣカード用マイクロコンピュータ１０７はオンチップのメモリ等の限られた演算リソースを用いて暗号通信に使用する暗号鍵を生成する機能を備え、暗号鍵と種いて用いる乱数の素数性を判定する演算処理の第２の例について説明する。
【００６０】
図３において、法レジスタＮ（１０００）は外部より素数候補Ｎを入力し、格納し、法ビットｎレジスタ（１０１０）は、外部より素数候補のビット数ｎを入力し、格納する。ｌｏｇ２（ｎ）を超えない最大の整数を与えるｌｏｇ２計算装置（１０３０）により、ｌｏｇ２（ｎ）を超えない最大の整数ｍが得られる。この処理は、図１２の７０１０のステップに相当する。１０３０で求められたｍはｍを格納するレジスタ（１０２０）に格納される。整数除算器（１０４０）により、ｎ／ｍの少数点以下を切り上げた値が求められ、セレクタ（１０５０）により１０４０の出力が選択され、カウンタｉ（１０６０）にセットされる。この処理は、図１２のステップ７０２０に相当する。カウンタｉは、ｍビットごとに分割された（Ｎ−１）の何番目の部分ビットを取り出すのかを指定するために用いられる。一方、演算器（１１００）により、Ｒ２ｍｏｄＮ＝２２ｎｍｏｄＮが計算され、結果レジスタ（１１６０）に格納される。図３においてその格納パスは図示が省略されている。この処理は図１２のステップ７０４０に相当する。つぎに、ＲｍｏｄＮ＝２ｎｍｏｄＮが計算され、レジスタ（１１１０）に格納される。この処理は、図１２のステップ７０７０で用いるＲｍｏｄＮの準備を行うことに相当する。ｉの値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最上位ｅ［Ｊ−１］が切り出され、セレクタ（３０１０）によりＮが選択され、指定ビット反転器（３０２０）により、ｅ［Ｊ−１］＋１ビット目が反転され、演算数発生装置（１０９０）に格納される。指定ビット反転器（３０２０）ではｅ［Ｊ−１］＋１がｎ以上の場合は、どのビットも反転されない。つぎに、ｍビット長の値すべてのビットが１である値を生成する２ｍ−１生成器（１１２０）の値と１０９０により切り出された指数との比較が比較器（１１３０）により比較され、等しい場合はセレクタ（１１４０）がレジスタ（１１１０）を選択し、そうでない場合は演算数生成装置（１０９０）の出力が選択される。モンゴメリ剰余乗算器（１１５０）により、結果レジスタ（１１６０）の値とセレクタ（１１４０）に選択された値とのモンゴメリ剰余乗算が行われ、その演算結果が結果レジスタ（１１６０）に格納される。この処理は、図１２のステップ７０５０、８０６０，７０７０に相当する。減算器（１０７０）により、カウンタｉ（１０６０）の値はデクリメントされ、デクリメントされた結果がセレクタ（１０５０）に選択され、カウンタｉ（１０７０）が更新される。この処理は図１２のステップ７０８０に相当する。
【００６１】
モンゴメリ剰余乗算演算モード制御部（１２００）は次にモンゴメリ剰余乗算器（１１５０）の演算モードを二乗算に変更し、セレクタ（１１７０）を介してカウンタｊ（１１８０）を初期化する。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算し結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１３のステップ７０９０に相当する。つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の部分ビットｅ［ｉ］が切り出される。セレクタ（３０１０）によりＮが選択され、指定ビット反転器（３０２０）により、ｅ［ｉ］＋１＋ｎ−２ｍビット目が反転され、演算数発生装置（１０９０）に格納される。指定ビット反転器（３０２０）ではｅ［ｉ］＋１＋ｎ−２ｍがｎ以上の場合は、どのビットも反転されない。指数切り出し部（１０８０）により切り出された値は比較器（１１３０）により２ｍ−１と比較される。比較結果に基づいて、セレクタ（１１４０）により、演算数生成装置（１０９０）の出力又はＲ  ｍｏｄ  Ｎを格納したレジスタ（１１１０）が選択され、選択された値が結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１３のステップ７１００，８１１０，７１２０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値が演算器（１０７０）によりデクリメントされ、カウンタｉ（１０６０）の値が１以上の場合は、図１３のステップ７０９０に相当する処理から繰り返される。
【００６２】
カウンタｉ（１０６０）の値が１の場合は、モンゴメリ剰余乗算器（１１５０）の演算モードが二乗算に変更され、セレクタ（１１７０）を介してカウンタｊ（１１８０）が初期化される。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算してその演算結果を結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１４のステップ７１５０に相当する。
【００６３】
つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最下位から２番目のｍビットが取り出される。カウンタｉ（１０６０）が１の場合は、セレクタ（３０１０）により０が選択され、指定ビット反転器（３０２０）により、ｅ［１］＋ｎ−２ｍビット目が反転した値、すなわちｅ［１］＋ｎ−２ｍビット目がセットされた値が演算数生成装置（１０９０）に格納され、結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１４のステップ７１６０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値を演算器（１０７０）によりデクリメントし、カウンタｉ（１０６０）に設定する。
【００６４】
続いてモンゴメリ剰余乗算器（１１５０）の演算モードが二乗算に変更され、セレクタ（１１７０）を介してカウンタｊ（１１８０）が初期化される。モンゴメリ剰余乗算演算モード制御部は（１２００）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、モンゴメリ剰余乗算器（１１５０）を用いて、結果レジスタ（１１６０）の値をモンゴメリ剰余二乗算し結果レジスタ（１１６０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１４のステップ７１７０に相当する。
【００６５】
最後に、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最下位のｍビットを取り出す。カウンタｉ（１０６０）が０の場合は、セレクタ（３０１０）により０が選択され、指定ビット反転器（３０２０）により、ｅ［０］ビット目が反転した値、すなわちｅ［０］ビット目がセットされた値が演算数生成装置（１０９０）に格納され、その演算数生成装置（１０９０）が常に選択されて、結果レジスタ（１１６０）の値と剰余乗算が行われる。これは、図１４のステップ７１８０の処理に相当する。剰余乗算が終了したら、結果レジスタ（１１６０）に２＾（Ｎ−１）ｍｏｄ  Ｎの値が格納され、処理が終了する。
【００６６】
＜＜第３の実施形態＞＞
図４はフェルマーテストを実行する本発明に係るデータ処理装置３を機能ブロックダイヤグラムで示すものであり、図１２、図１３及び図１４に示される本発明によるフェルマーテスト高速演算手順を実現する。図３のデータ処理装置２では指定ビット反転器（３０２０）を用いたが、図４ではそれに代えて２のベキ数演算器（３０３１）と排他的論理和回路（３０３２）を用いた点が相違され、その他の構成については同じ参照符号を付してその詳細な説明を省略する。２のベキ数演算器（３０３１）は指数切り出し部（１０８０）で切り出された指数を２のベキ乗に形態にする。排他的論理和回路（３０３２）は２のべき乗演算器（３０３１）の出力とセレクタ（３０１０）の出力に対して排他的論理和を採る。その演算結果は図３の指定ビット反転器（３０２０）の出力と同じである。
【００６７】
＜＜第４の実施形態＞＞
図５はフェルマーテストを実行する本発明に係るデータ処理装置４を機能ブロックダイヤグラムで示すものであり、図１５に示されるフェルマーテスト高速演算手順を実現する。この例ではモンゴメリ剰余乗算装置を用いない。データ処理装置４は、図８に例示される剰余乗算器（６１５０）及び演算レジスタ（６１６０，６１７０，６１８０）等を備えた剰余乗算コプロセッサ（６１４０）と共に、プログラムを実行して剰余乗算コプロセッサ６１４０等を制御する中央処理装置（６０１０）とメモリ（６０２０）等を有し、相互にバス６０３０で接続される。メモリ（６０２０）はプログラム（ＰＧＭ）を格納する電気的に書換え可能な不揮発性メモリと、変数やデータ（ＤＡＴ）等の格納に利用されるＳＲＡＭ等のランダムアクセスメモリから成る。このデータ処理装置４は例えば、前記図１７に示されるような１個の半導体基板に形成されたＩＣカード用マイクロコンピュータ１０７として実現される。
【００６８】
図５において、法レジスタＮ（１０００）には外部より素数候補Ｎが入力されて格納され、法ビットｎレジスタ（１０１０）には外部より素数候補Ｎのビット数ｎが入力されて格納される。ｌｏｇ２（ｎ）を超えない最大の整数を与えるｌｏｇ２計算装置（１０３０）により、ｌｏｇ２（ｎ）を超えない最大の整数ｍが得られる。１０３０の出力する値の種類は、ｌｏｇ２（ｎの最大値）であるので、実際には計算を行わずにテーブル引きや、ｎの非零のビットのうちの最上位のビットの位置から求めることができる。この処理は、図１５の９０１０のステップに相当する。ｌｏｇ２計算装置（１０３０）で求められた値ｍはレジスタ（１０２０）に格納される。整数除算器（１０４０）により、ｎ／ｍの少数点以下を切り上げた値が求められ、セレクタ（１０５０）により１０４０の出力が選択され、カウンタｉ（１０６０）にセットされる。この処理は、図１５のステップ９０２０に相当する。カウンタｉは、ｍビットごとに分割された（Ｎ−１）の何番目の部分ビットを取り出すのかを指定するために用いられる。ｉの値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最上位が切り出され、演算数生成装置（１０９０）により、２＾（ｅ［Ｊ−１］）が生成される。最初は剰余乗算器（４０１０）で乗算を行わずに、演算数生成装置（１０９０）の値をそのまま結果レジスタ（４０２０）に格納する。この処理は、図１５のステップ９０４０に相当する。減算器（１０７０）により、カウンタｉ（１０６０）の値はデクリメントされ、デクリメントされた結果がセレクタ（１０５０）に選択され、これによってカウンタｉ（１０７０）が更新される。この処理は図１５のステップ９０５０に相当する。
【００６９】
剰余乗算演算モード制御部（４０３０）は次に剰余乗算器（４０１０）の演算モードを二乗算に変更し、セレクタ（１１７０）を介してカウンタｊ（１１８０）を初期化する。剰余乗算演算モード制御部（４０３０）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、剰余乗算器（４０１０）を用いて、結果レジスタ（４０２０）の値を剰余二乗算して結果レジスタ（４０２０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１５のステップ９０６０に相当する。つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の部分ビットが切り出され、演算数生成装置（１０９０）の出力と、結果レジスタ（４０２０）の値との剰余乗算が行われる。これは、図１５のステップ９０７０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値が演算器（１０７０）によりデクリメントされ、カウンタｉ（１０６０）の値が０以上の場合は、図１５のステップ９０６０に相当する処理から繰り返される。
【００７０】
カウンタｉ（１０６０）の値が０の場合は、結果レジスタ（４０２０）に２＾（Ｎ−１）ｍｏｄ  Ｎの値が格納され、処理が終了する。
【００７１】
＜＜第５の実施形態＞＞
図６はフェルマーテストを実行する本発明に係るデータ処理装置５を機能ブロックダイヤグラムで示すものであり、図１６に示されるフェルマーテスト高速演算手順を実現する。この例ではモンゴメリ剰余乗算装置を用いない。データ処理装置４は、前記図８に例示される剰余乗算器（６１５０）及び演算レジスタ（６１６０，６１７０，６１８０）等を備えた剰余乗算コプロセッサ（６１４０）と共に、プログラムを実行して剰余乗算コプロセッサ６１４０等を制御する中央処理装置（６０１０）とメモリ（６０２０）等を有し、相互にバス６０３０で接続される。このデータ処理装置５は例えば、前記図１７に示されるような１個の半導体基板に形成されたＩＣカード用マイクロコンピュータ１０７として実現される。
【００７２】
図６において、法レジスタＮ（１０００）は外部より素数候補Ｎを入力して格納し、法ビットｎレジスタ（１０１０）は、外部より素数候補のビット数ｎを入力して格納する。ｌｏｇ２（ｎ）を超えない最大の整数を与えるｌｏｇ２計算装置（１０３０）により、ｌｏｇ２（ｎ）を超えない最大の整数ｍが得られる。１０３０の出力する値の種類は、ｌｏｇ２（ｎの最大値）であるので、実際には計算を行わずにテーブル引きや、ｎの非零のビットのうちの最上位のビットの位置から求めることができる。この処理は、図１６の９０１０のステップに相当する。１０３０で求められた値ｍはレジスタ（１０２０）に格納される。整数除算器（１０４０）により、ｎ／ｍの少数点以下を切り上げた値が求められ、セレクタ（１０５０）により１０４０の出力が選択され、カウンタｉ（１０６０）にセットされる。この処理は、図１６のステップ９０２０に相当する。カウンタｉは、ｍビットごとに分割された（Ｎ−１）の何番目の部分ビットを取り出すのかを指定するために用いられる。ｉの値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の最上位（ｅ［Ｊ−１］）が切り出され、セレクタ（３０１０）が０を選択し、指定ビット反転器（３０２０）が（ｅ［Ｊ−１］）ビット目を反転することにより、２＾（ｅ［Ｊ−１］）が演算数生成装置（１０９０）にセットされる。一番最初は剰余乗算器（４０１０）で乗算を行わずに、演算数生成装置（１０９０）の値をそのまま結果レジスタ（４０２０）に格納する。この処理は、図１６のステップ９０４０に相当する。減算器（１０７０）により、カウンタｉ（１０６０）の値はデクリメントされ、デクリメントされた結果がセレクタ（１０５０）に選択され、カウンタｉ（１０７０）が更新される。この処理は図１６のステップ９０５０に相当する。
【００７３】
剰余乗算演算モード制御部（４０３０）は次に剰余乗算器（４０１０）の演算モードを二乗算に変更し、セレクタ（１１７０）を介してカウンタｊ（１１８０）を初期化する。剰余乗算演算モード制御部（４０３０）は、カウンタｊ（１１８０）を減算器（１１９０）で１回デクリメントする毎に、剰余乗算器（４０１０）を用いて、結果レジスタ（４０２０）の値を剰余二乗算し結果レジスタ（４０２０）に格納する処理を、カウンタｊ（１１８０）がゼロになるまで行う。これは、図１５のステップ９０６０に相当する。つぎに、カウンタｉ（１０６０）の値にしたがって、指数切り出し部（１０８０）により、（Ｎ−１）の部分ビット（ｅ［ｉ］）が切り出され、セレクタ（３０１０）がＮを選択し、指定ビット反転器（３０２０）が（ｅ［ｉ］）ビット目を反転することにより、Ｎ  ｘｏｒ  ２＾（ｅ［ｉ］）が演算数生成装置（１０９０）にセットされる。演算数生成装置（１０９０）の出力と結果レジスタ（４０２０）の値との剰余乗算が行われ、演算結果が結果レジスタ（４０２０）に格納される。これは、図１６のステップ１００７０の処理に相当する。剰余乗算が終了したら、カウンタｉ（１０６０）の値が演算器（１０７０）によりデクリメントされ、カウンタｉ（１０６０）の値が１以上の場合は、図１６のステップ９０６０に相当する処理から繰り返される。
【００７４】
カウンタｉ（１０６０）の値が０の場合は、指数切り出し部（１０８０）により、（Ｎ−１）の最下位の部分ビット（ｅ［０］）が切り出され、セレクタ（３０１０）が０を選択し、指定ビット反転器（３０２０）が（ｅ［ｉ］）ビット目を反転することにより、２＾（ｅ［０］）が演算数生成装置（１０９０）にセットされる。演算数生成装置（１０９０）の出力と結果レジスタ（４０２０）の値との剰余乗算が行われ、演算結果が結果レジスタ（４０２０）に格納される。結果レジスタ（４０２０）には２＾（Ｎ−１）ｍｏｄ  Ｎの値が格納されるので、処理が終了する。
【００７５】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。本発明の好適な例はＩＣカード用マイクロコンピュータであるが、オンチップされる回路モジュールは上記説明に限定されず、その他の回路モジュールが追加されてもよい。また、ＩＣカード用マイクロコンピュータはセキュリティ評価基準のＩＳＯ／ＩＥＣ１５４０８の評価・認証機関によって認証済みであることに限定されない。
【図面の簡単な説明】
【００７６】
【図１】図１は第1の実施形態に係るデータ処理装置を例示する機能ブロックダイヤグラムである。
【図２】図２は第1の実施形態で用いられるＲ２ｍｏｄＮを演算する演算器の一例を示すブロックダイヤグラムである。
【図３】図３は第２の実施形態に係るデータ処理装置を例示する機能ブロックダイヤグラムである。
【図４】図４は第３の実施形態に係るデータ処理装置を例示する機能ブロックダイヤグラムである。
【図５】図５は第４の実施形態に係るデータ処理装置を例示する機能ブロックダイヤグラムである。
【図６】図６は第５の実施形態に係るデータ処理装置を例示する機能ブロックダイヤグラムである。
【図７】図７は第１又は第２の実施形態に係るデータ処理装置のハードウェア構成を例示するブロックダイヤグラムである。
【図８】図８は第３又は第４の実施形態に係るデータ処理装置のハードウェア構成を例示するブロックダイヤグラムである。
【図９】図９は第1および第２の実施形態に係るデータ処理装置による処理手順を例示するフローチャートである。
【図１０】図１０は図9の続きを示すフローチャートである。
【図１１】図１１は図１０の続きを示すフローチャートである。
【図１２】図１２は第３の実施形態に係るデータ処理装置による処理手順を例示するフローチャートである。
【図１３】図１３は図１２の続きを示すフローチャートである。
【図１４】図１４は図１３の続きを示すフローチャートである。
【図１５】図１５は第４の実施形態に係るデータ処理装置による処理手順を例示するフローチャートである。
【図１６】図１６は第５の実施形態に係るデータ処理装置による処理手順を例示するフローチャートである。
【図１７】図１７はＩＣカードの構成を例示する外観図である。
【符号の説明】
【００７７】
１０７：ＩＣカード用チップ
１０００：法Nを格納するレジスタ
１０１０：法Ｎのビット長を格納するレジスタ
１０２０：指数を切り出すビット長ｍを格納するレジスタ
１０３０：入力された値のｌｏｇ２を超えない最大の整数を与えるｌｏｇ２計算装置
１０４０：整数除算器
１０５０：整数除算器と減算器の出力を選択するセレクタ
１０６０：カウンタｉを格納するレジスタ
１０７０：減算器
１０８０：Ｎ−１をｍビット毎に区切り、下位側からｉ番目の値を出力する指数切り出し部
１０９０：入力値のビット位置のみを１としその他のビットを０とする演算数を生成する演算数生成装置
１１００：Ｒ  ｍｏｄ  ＮもしくはＲ２ｍｏｄＮを計算する演算器
１１１０：演算器が計算したＲもしくはＲ２を格納するレジスタ
１１２０：ｍビット長の値すべてのビットが１である値を生成する２ｍ−１生成器
１１３０：比較器
１１５０：モンゴメリ剰余乗算器
１１６０：剰余乗算の結果を格納する結果レジスタ
１１８０：カウンタ値ｊを格納するレジスタ
１１９０：減算器
１２００：モンゴメリ剰余乗算モード制御装置
２０１０：法Ｎと法Ｎのビット長Ｎから、２ｎ＋１ｍｏｄＮを計算する演算器
２０２０：２ｎ＋１ｍｏｄＮをか苦悩するレジスタ
２０３０：演算途中の値を格納する演算数レジスタ
２０６０：モンゴメリ剰余乗算器
３０２０：指定されたビットのみを反転して出力する指定ビット反転器
３０３２：排他的論理和回路
４０１０：剰余乗算器
４０２０：結果を格納するレジスタ
４０３０：剰余乗算器の演算モードを制御する制御装置
６０１０：ＣＰＵ
６０２０：メモリ
６０３０：バス
６０４０：剰余乗算コプロセッサ
６０５０：モンゴメリ剰余乗算器
６０６０：演算数を格納するレジスタ
６０７０：演算数を格納するレジスタ
６０８０：法Ｎを格納するレジスタ
６１４０：剰余乗算コプロセッサ
６１５０：剰余乗算器
６１６０：演算数を格納するレジスタ
６１７０：演算数を格納するレジスタ
６１８０：法Ｎを格納するレジスタ
７０１０：ｌｏｇ２（ｎ）を超えない最大の整数をｍに代入するステップ
７０２０：ｎ／ｍの少数点以下を切り上げた値をＪに代入するステップ
７０３０：Ｎ−１をｍビットごとに区切りｅ［０］…ｅ［Ｊ−１］に代入するステップ
７０４０：Ｒ２ｍｏｄＮをｒｅｓｕｌｔに代入するステップ
７０５０：ｅ［Ｊ−１］＋１がｎと等しいか条件判定するステップ
７０６０：最上位の指数が２ｍ−１未満の場合に最上位の指数に相当する演算数を剰余乗算するステップ
７０７０：最上位の指数が２ｍ−１と等しい場合に最上位の指数に相当する演算数を剰余乗算するステップ
７０８０：カウンタｉにＪ−２を代入するステップ
７０９０：ｒｅｓｕｌｔをｍ回剰余二乗算してｒｅｓｕｌｔに代入するステップ
７１００：ｅ［ｉ］＋ｎ−２ｍがｎと等しいか条件判断するステップ
７１１０：ｅ［ｉ］＋ｎ−２ｍがｎ未満のときｉ番目のｍビットの指数に相当する演算数を剰余乗算するステップ
７１２０：ｅ［ｉ］＋ｎ−２ｍがｎと等しいときｉ番目のｍビットの指数に相当する演算数を剰余乗算するステップ
７１３０：カウンタｉの値を１だけ減算するステップ
７１４０：ｉが１より大きいか条件判断し条件分岐するステップ
７１５０：ｒｅｓｕｌｔをｍ回剰余二乗算してｒｅｓｕｌｔに代入するステップ
７１６０：最下位の１つ前のｍビットの指数に相当する演算数を剰余乗算するステップ
７１７０：ｒｅｓｕｌｔをｍ回剰余二乗算してｒｅｓｕｌｔに代入するステップ
７１８０：最下位の１つ前のｍビットの指数に相当する演算数を剰余乗算するステップ
７１９０：結果を出力するステップ
８０６０：最上位の指数が２ｍ−１未満の場合に最上位の指数に相当する演算数を法Ｎでマスクしながら剰余乗算するステップ
８１１０：ｅ［ｉ］＋ｎ−２ｍがｎ未満の場合にｉ番目のｍビットの指数に相当する演算数を法Ｎでマスクしながら剰余乗算するステップ
９０１０：ｌｏｇ２（ｎ）を超えない最大の整数をｍに代入するステップ
９０２０：ｎ／ｍの少数点以下を切り上げた値をＪに代入するステップ
９０３０：Ｎ−１をｍビットごとに区切りｅ［０］…ｅ［Ｊ−１］に代入するステップ
９０４０：最上位の指数に相当する演算数をｒｅｓｕｌｔに代入するステップ
９０５０はカウンタｉにＪ−２を代入するステップ
９０６０：ｒｅｓｕｌｔをｍ回剰余二乗算してｒｅｓｕｌｔに代入するステップ
９０７０：ｉ番目のｍビットの指数に相当する演算数を剰余乗算するステップ
９０８０：カウンタｉの値を１だけ減算するステップ
９０９０：カウンタｉが０以上かを判定し条件分岐するステップ
９１００：結果を出力するステップ
１００７０：ｉ番目のｍビットの指数に相当する演算数を法Ｎでマスクしながら剰余乗算するステップ
１００９０：カウンタｉが１以上かを判定し条件分岐するステップ
１０１００：最下位のｍビットの指数に相当する演算数を剰余乗算するステップ
【図１】
0005179933.tif 000002
【図２】
0005179933.tif 000003
【図３】
0005179933.tif 000004
【図４】
0005179933.tif 000005
【図５】
0005179933.tif 000006
【図６】
0005179933.tif 000007
【図７】
0005179933.tif 000008
【図８】
0005179933.tif 000009
【図９】
0005179933.tif 000010
【図１０】
0005179933.tif 000011
【図１１】
0005179933.tif 000012
【図１２】
0005179933.tif 000013
【図１３】
0005179933.tif 000014
【図１４】
0005179933.tif 000015
【図１５】
0005179933.tif 000016
【図１６】
0005179933.tif 000017
【図１７】
0005179933.tif 000018