説明

素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法

【課題】2のべき乗長以外の素数を確定的な素数判定(生成)手法を用いて効率的に生成すること。
【解決手段】所望の素数Pnのビット長の指定を受け付け、指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を事前に算出する。そして、算出された素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用して、素数Piのビット長より長いビット長でかつ素数Piより大きな値の素数Pi+1を順次生成することにより、最終的に所望の素数Pnを生成することができる。

【発明の詳細な説明】
【技術分野】
【0001】
この発明は、公開鍵暗号方式におけるデータの暗号化/復号化に使用される公開鍵または暗号鍵を生成する素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法に関する。
【背景技術】
【0002】
公開鍵暗号(たとえば、RSA暗号、ElGamal暗号など)では、データの暗号化/復号化に使用する鍵(公開鍵、秘密鍵)を生成するために、素数が用いられることが多い。素数を生成する手法として、「確率的な手法による素数生成」および「確定的な手法による素数生成」が存在している。
【0003】
これら手法のうち、前者は、生成された値が極めて高い確率で素数となるが、素数であることは保証されない手法である。また、後者は、生成された値が確実に素数であることが保証される手法である。このため、高度な安全性が要求されるシステムでは、後者の手法が採用されている。
【0004】
これまでは、RSA暗号などでは、公開鍵の鍵長(ビット長)として、512[bit],1024[bit]など「2のべき乗長の鍵長」が使用されることが多かったが、近年、セキュリティシステムの多様化などにより、「2のべき乗長以外の鍵長」が使用される機会が増えてきている。
【0005】
一般に、「2のべき乗長の鍵長」の公開鍵を生成するためには「2のべき乗長の素数」が必要となる。一方で、「2のべき乗長以外の鍵長」の公開鍵を生成するためには「2のべき乗長以外の素数」が必要となる。
【0006】
「2のべき乗長の素数」を生成する確定的な手法としては、たとえば、Pocklingtonの素数判定法を利用して、小さい値の素数から大きい値の素数を順次生成する素数生成手法が知られている。
【0007】
ここで、Pocklingtonの素数判定法(たとえば、下記非特許文献1参照。)を利用した素数生成手法(以下、「第1の手法」という)により、「2のべき乗長の素数」を生成する処理手順について説明する。
【0008】
(1)r<pとなる乱数rを生成する。(p:2のべき乗長の素数)
(2)p2=2×r×p+1を導出する。
(3)p2が所定の条件を満たしている場合(Pocklington法による素数判定 法)、p2は素数となる。p2が所定の条件を満たしていない場合、(1)に戻り、 一連の処理をやり直す。なお、所定の条件には、たとえば、非特許文献1のp144 .4.40に記載された条件を用いることができる。
(4)p2が最終的に求めたいビット長の素数となっていない場合、p=p2として(1 )に戻り、一連の処理を繰り返す。
【0009】
この第1の手法によれば、(2)の処理により、pのビット長よりも長いビット長かつpより大きな値のp2を生成することができる。このため、(4)において、p2を新たにpと置き換えて、(1)からの処理を繰り返し実行することにより、長いビット長の素数を順次生成することができる。
【0010】
ただし、(1)において、rが小さいとp2のビット長がpのビット長に比べてあまり大きくならない。このため、効率よく長いビット長の素数を生成するために、たとえば、p2のビット長がpのビット長の約2倍となるように生成する(たとえば、32[bit]→64[bit]→128[bit]→・・・)。
【0011】
このように、第1の手法によれば、(1)〜(4)の処理を繰り返しおこなうことにより、「2のべき乗長の素数」を効率的に生成することができる。
【0012】
つぎに、30数ビット程度の短いビット長の素数を生成する第2の手法について説明する。以下、Q[bit]の短いビット長の素数を生成する第2の手法の処理手順を示す。
【0013】
(1)2[bit]〜Q/2[bit]によって表現可能な素数を事前に計算し、その計 算結果をテーブルに保持しておく。
(2)Q[bit]の乱数Rを生成する。
(3)(2)で生成された乱数Rを(1)のテーブルに保持されている各要素で除算し、 割り切れなければ乱数Rが求める素数となる。また、割り切れたら(2)に戻り、新 たな乱数Rを生成して、処理を繰り返す。なお、本出願においては、短い素数を生成 する手法は上記第2の手法に限らず、いかなる手法を用いてもよい。
【0014】
つぎに、第1の手法を拡張することにより、「2のべき乗長以外の素数」を生成する第3の手法について説明する。以下、「2のべき乗長以外の素数」として、768[bit]のビット長の素数を例に挙げて説明する。
【0015】
まず、第1の手法により、2のべき乗長、かつ、生成したい素数のビット長を超えない素数を生成する。具体的には、まず、32[bit]→64[bit]→128[bit]→256[bit]→512[bit]までは第1の手法により、p2のビット長がpのビット長の約2倍となるように素数を順次生成する。そして、512[bit]→768[bit]の素数を生成するために、第1の手法の(2)の式にビット長の短い乱数rを代入して、p2=768[bit]を生成する。
【0016】
このように、第3の手法によれば、「2のべき乗長の素数」を生成する処理を繰り返しおこない、最後に、乱数rのビット長を調整してp2を生成することにより、所望のビット長(2のべき乗長以外)の素数を生成することができる。
【0017】
【非特許文献1】HANDBOOK of APPLIED CRYPTOGRAPHY(Alfred J.Menezes, Paul C.van Oorschot, Scott A.Vanstone. 1997 CRC Press)
【発明の開示】
【発明が解決しようとする課題】
【0018】
しかしながら、上述した非特許文献1による従来技術によれば、「2のべき乗長以外の素数」を確定的な素数判定手法を用いて効率的に生成することができないため、たとえば、高度な安全性が要求されるシステムに使用するための「2のべき乗長以外の鍵長」の公開鍵、暗号鍵を生成することができないという問題があった。
【0019】
また、上述した第3の手法によれば、「2のべき乗長の素数」よりもある程度長いビット長(たとえば、768[bit])の「2のべき乗長以外の素数」を確定的に生成することができる。しかしながら、「2のべき乗長+数ビット」のビット長の素数を生成することは非常に困難であるという問題があった。
【0020】
ここで、従来技術の第3の手法の問題点を具体的に説明する。以下、「2のべき乗長以外の素数」として、「2のべき乗長+数ビット」=512+2=514[bit]のビット長の素数を生成する場合を例に挙げて説明する。
【0021】
まず、上述した第2の手法により、32[bit]の素数を生成する。このあと、第1の手法により、2のべき乗長、かつビット長が514[bit]を超えない素数を生成する。この結果、ビット長が512[bit]の素数が生成される(32[bit]→64[bit]→128[bit]→256[bit]→512[bit])。
【0022】
つぎに、残りのビット長分(2[bit])について、乱数rのビット長を調整して生成する。ここでは、第1の手法の手順(2)において、pのビット長が512[bit]となり、p2のビット長が514[bit]となるためには、手順(1)で生成する乱数rのビット長を2[bit]以内とする必要がある。すなわち、乱数rの取り得る値は『0,1,2,3』のいずれかとなる。
【0023】
これにより、第1の手法によって生成されるp2の値は4種類となる。ここで、ビット長が514[bit]の値をランダムに選択したときに、その値が素数である確率は約1/29となる。このため、第3の手法によって514[bit]のビット長の素数を生成することができる確率は約4/29となり、一回の処理で所望の素数を生成することが非常に難しい。
【0024】
このため、前段の処理に戻り、512[bit]のビット長の素数を生成し、514[bit]のビット長の値が素数となるまでこの処理を繰り返しおこなう必要がある。このように、第3の手法によれば、所望のビット長の素数を生成するためのやり直し回数(上記例では約29回)が非常に多くなってしまい、素数生成処理にかかる作業時間および作業負荷が著しく増大してしまうという問題があった。
【0025】
この発明は、上述した従来技術による問題点を解消するため、任意のビット長の素数を確定的に、かつ、効率的に生成することができる素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法を提供することを目的とする。
【課題を解決するための手段】
【0026】
上述した課題を解決し、目的を達成するため、この発明にかかる素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法は、素数Pnのビット長の指定を受け付け、指定された素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出し、前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成することを特徴とする。
【0027】
また、上記発明において、算出された素数{P1,…,Pn-1}の各ビット長に従って、当該各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}を生成し、前記素数P1のビット長によって特定される素数を生成し、乱数{r1,…,rn-1}を用いて、前記素数Piと前記乱数riとを乗算することにより、素数Pnを生成することとしてもよい。
【0028】
これらの発明によれば、素数Pnを生成する前に途中で生成されることとなる素数{P1,…,Pn-1}の各ビット長を予め算出しておくことにより、素数Pn-1から素数Pnを生成する際のやり直し回数を低減させることができる。
【0029】
また、上記発明において、2ビット以上のビット長によって表現可能な素数を記憶する素数テーブルを参照することにより、前記素数P1のビット長によって特定される素数を生成することとしてもよい。
【0030】
この発明によれば、30数ビット程度以内の短いビット長の素数を確定的に生成することができる。
【0031】
また、上記発明において、前記乱数riのビット長より前記素数Piのビット長が長くなる前記素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。
【0032】
また、上記発明において、前記Pi+1のビット長が前記素数Piのビット長の2倍程度の長さとなる前記素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。
【0033】
また、上記発明において、Length(Pi)=[Length(Pi+1)+1]/2+1により、前記素数Pnのビット長に従って、前記素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。ただし、Length(Pi)は素数Piのビット長とする。
【0034】
また、上記発明において、Length(Pi)=Length(Pi+1)/2+1により、前記素数Pnのビット長に従って、前記素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。ただし、Length(Pi)は素数Piのビット長とする。
【0035】
これらの発明によれば、短いビット長の素数から、より長いビット長の素数を効率的に生成することができる。
【0036】
また、上記発明において、前記素数P1のビット長が30数ビット程度の長さとなる前記素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。
【0037】
この発明によれば、簡単な手法によって確定的に素数P1を生成することができる程度の短いビット長となるまで素数{P1,…,Pn-1}の各ビット長の算出処理を繰り返し実行させることができる。
【発明の効果】
【0038】
本発明にかかる素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法によれば、任意のビット長の素数を確定的に、かつ、効率的に生成することができるという効果を奏する。
【発明を実施するための最良の形態】
【0039】
以下に添付図面を参照して、この発明にかかる素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法の好適な実施の形態を詳細に説明する。
【0040】
(素数生成装置のハードウェア構成)
まず、この発明の実施の形態にかかる素数生成装置のハードウェア構成について説明する。図1は、この発明の実施の形態にかかる素数生成装置のハードウェア構成を示すブロック図である。
【0041】
図1において、素数生成装置100は、コンピュータ本体110と、入力装置120と、出力装置130と、から構成されており、不図示のルータやモデムを介してLAN,WANやインターネットなどのネットワーク140に接続可能である。
【0042】
コンピュータ本体110は、CPU,メモリ,インターフェースを有する。CPUは、素数生成装置100の全体の制御を司る。メモリは、ROM,RAM,HD,光ディスク111,フラッシュメモリから構成される。メモリはCPUのワークエリアとして使用される。
【0043】
また、メモリには各種プログラムが格納されており、CPUからの命令に応じてロードされる。HDおよび光ディスク111はディスクドライブによりデータのリード/ライトが制御される。また、光ディスク111およびフラッシュメモリはコンピュータ本体110に対し着脱自在である。インターフェースは、入力装置120からの入力、出力装置130への出力、ネットワーク140に対する送受信の制御をおこなう。
【0044】
また、入力装置120としては、キーボード121、マウス122、スキャナ123などがある。キーボード121は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式であってもよい。マウス122は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。スキャナ123は、画像を光学的に読み取る。読み取られた画像は画像データとして取り込まれ、コンピュータ本体110内のメモリに格納される。なお、スキャナ123にOCR機能を持たせてもよい。
【0045】
また、出力装置130としては、ディスプレイ131、スピーカ132、プリンタ133などがある。ディスプレイ131は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。また、スピーカ132は、効果音や読み上げ音などの音声を出力する。また、プリンタ133は、画像データや文書データを印刷する。
【0046】
(素数テーブル200のデータ構造)
つぎに、素数テーブル200のデータ構造について説明する。図2は、素数テーブル200のデータ構造を示す説明図である。図2において、素数テーブル200は、2[bit]〜17[bit]までの各ビット数によって表現可能な素数を保持している。
【0047】
たとえば、2[bit]の素数である2,3を保持しており、3[bit]の素数である2,3,5,7を保持している。すなわち、素数テーブル200は、17[bit]のビット数によって表現可能なすべての素数を保持していることとなる。なお、17[bit]のビット数によって表現可能な最大の素数をNと表記する。
【0048】
この素数テーブル200は、たとえば、後述する素数生成装置100の素数生成部303によって素数P1を生成する場合に用いられる。具体的には、[背景技術]で示した第2の手法により、30数ビット程度以内の短いビット長の素数P1を生成する場合に用いる。一般的に、テーブルに17[bit]までの素数を準備する場合、34[bit]までの素数を生成することができる。
【0049】
(素数生成装置100の機能的構成)
つぎに、この発明の実施の形態にかかる素数生成装置100の機能的構成について説明する。図3は、この発明の実施の形態にかかる素数生成装置100の機能的構成を示すブロック図である。図3において、素数生成装置100は、素数テーブル200と、受付部301と、算出部302と、素数生成部303と、乱数生成部304と、出力部305と、を備えている。
【0050】
これら各機能301〜305は、メモリに格納された当該機能に関するプログラムをCPUに実行させることにより、当該機能を実現することができる。また、各機能301〜305からの出力データはメモリに保持される。また、図3中矢印で示した接続先の機能的構成は、接続元の機能からの出力データをメモリから読み込んで、当該機能に関するプログラムをCPUに実行させる。
【0051】
図3において、まず、受付部301は、素数Pnのビット長の指定を受け付ける機能を有する。具体的には、図1に示したキーボード121やマウス122などの入力装置120をユーザが操作することで、素数Pnのビット長の指定を受け付けて、メモリに保持する。たとえば、素数Pnのビット長をあらわす任意の数字(たとえば、514,1028など)をユーザが入力することにより、素数Pnのビット長を指定する。
【0052】
この素数Pnは、たとえば、RSA暗号などの公開鍵暗号に使用する鍵(公開鍵、秘密鍵)を生成する場合に必要となる素数である。一般に、鍵長が長いほど暗号強度が高くなるため、高度な安全性が要求されるシステムでは鍵長の長い鍵が使用される。ここでは、鍵長の長い鍵を生成する場合などに必要となる素数Pnのビット長を指定する。
【0053】
算出部302は、受付部301によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する機能を有する。具体的には、算出部302は、メモリから素数Pnのビット長を読み出し、素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出し、メモリに保持する。
【0054】
素数{P1,…,Pn-1}は、後述する素数生成部303により、最終的に素数Pnを生成する前に生成されることとなる素数である。算出部302は、所望の素数Pnを生成するために、途中で生成される素数{P1,…,Pn-1}の各ビット長を事前に算出してメモリに保持する。
【0055】
また、算出部302は、乱数ri(後述する乱数生成部304によって生成される乱数{r1,…,rn-1})のビット長より素数Piのビット長が長くなる素数{P1,…,Pn-1}の各ビット長を算出する機能を有する。たとえば、素数P3のビット長が50[bit]であった場合、素数P3に乗算する乱数r3のビット長は、少なくとも50[bit]よりも短いビット長(たとえば、49[bit])となる。
【0056】
また、算出部302は、Pi+1のビット長が素数Piのビット長の2倍程度の長さとなる素数{P1,…,Pn-1}の各ビット長を算出する機能を有する。たとえば、P4のビット長が100[bit]の場合、素数P3のビット長は50[bit]程度となる。
【0057】
また、算出部302は、下記式(1)または(2)により、素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出することとしてもよい。ただし、Length(Pi)は素数Piのビット長とする。
【0058】
Length(Pi)=[Length(Pi+1)+1]/2+1 …(1)
【0059】
Length(Pi)=Length(Pi+1)/2+1 …(2)
【0060】
また、算出部302は、素数P1のビット長が30数ビット程度以内の長さとなる素数{P1,…,Pn-1}の各ビット長を算出する。たとえば、上記式(1)または(2)により、素数{P1,…,Pn-1}の各ビット長を算出する場合、Length(P1)≦34となるまで、Length(Pi)を順次算出することとなる。
【0061】
なお、素数{P1,…,Pn-1}の各ビット長の算出処理を終了する素数のビット長を任意に設定することとしてもよい。具体的には、図1に示したキーボード121やマウス122などの入力装置120をユーザが操作してビット長を設定する。たとえば、35[bit]を設定した場合、素数P1のビット長が35[bit]以下となった時点で算出処理を終了することとなる。
【0062】
なお、上記式(1)を用いて素数{P1,…,Pn-1}の各ビット長を算出する算出部302による算出処理の詳細な説明は後述する。
【0063】
素数生成部303は、算出部302によって算出された素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを乗算することにより、素数Piのビット長より長いビット長でかつ素数Piより大きな値の素数Pi+1を順次生成して、素数Pnを生成する機能を有する。
【0064】
すなわち、素数生成部303は、小さい値の素数から、その素数のビット長より長いビット長でかつ大きい値の素数を順次生成していくことにより、長いビット長の素数Pnを確定的に生成する。素数生成部303による素数生成処理は、たとえば、[背景技術]で示した第1の手法により、実行することができる。
【0065】
具体的には、素数生成部303は、メモリから素数{P1,…,Pn-1}の各ビット長を読み出し、素数P1のビット長によって特定される素数を生成し、後述する乱数生成部304によって生成された乱数{r1,…,rn-1}を用いて、素数{P2,…,Pn}を順次生成する。素数生成部303によって生成された素数{P1,…,Pn}はメモリに保持される。
【0066】
より具体的には、たとえば、第1の手法の(2)に表記した数式を用いて、素数Piと乱数riとを乗算することにより、素数Piのビット長より長いビット長でかつ素数Piより大きな値の素数候補を生成し、その素数候補が素数であるか否かの判定をおこなう。ここで、素数と判定された場合、その素数候補を素数Pi+1とする。
【0067】
一方、素数と判定されなかった場合、新たな乱数riを生成し、素数候補が素数と判定されるまで処理を繰り返す。素数候補が素数であるか否かの判定には、たとえば、Pocklingtonの素数判定法を利用することができる。なお、Pocklington法については公知技術のため説明を省略する。
【0068】
また、素数P1のビット長によって特定される素数は、たとえば、[背景技術]で示した第2の手法により生成することができる。具体的には、乱数生成器(乱数生成法)により、算出部302によって算出された素数P1のビット長の乱数Rを生成し、その乱数Rを素数テーブル200に保持されている各要素で除算する。
【0069】
このとき、乱数Rが各要素で割り切れなければ、乱数Rが求める素数P1となる。一方、乱数Rがいずれかの要素で割り切れたら、割り切れない乱数Rが生成されるまで、新たな乱数Rを生成し、素数テーブル200に保持されている各要素で除算する処理を繰り返しおこなう。なお、本出願において使用する乱数は、一般的に計算機で使用するための擬似乱数を含むものとし、たとえば、乱数生成器または擬似乱数生成器によって生成される。
【0070】
ここでは、素数生成部303により素数P1を生成することとしたが、算出部302によって算出された素数P1のビット長に応じて素数生成装置100に直接入力することとしてもよく、また、ネットワーク140を介して外部のコンピュータ装置から素数P1を取得することとしてもよい。
【0071】
乱数生成部304は、算出部302によって算出された素数{P1,…,Pn-1}の各ビット長に従って、各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}を生成する機能を有する。具体的には、乱数生成部304は、メモリから素数{P1,…,Pn-1}の各ビット長を読み出し、各ビット長に従って、乱数{r1,…,rn-1}を生成する。
【0072】
より具体的には、たとえば、乱数生成器(乱数生成法)により、素数{P1,…,Pn-1}の各ビット長に従って、乱数{r1,…,rn-1}を生成することとしてもよい。ここで、乱数riのビット長について説明する。上述したように、乱数riのビット長は素数Piのビット長よりも短くなる。
【0073】
乱数{r1,…,rn-1}のビット長は、受付部301によって指定を受け付けた素数Pnのビット長、および算出部302によって算出された各素数{P1,…,Pn-1}のビット長を用いて算出する。具体的には、たとえば、乱数riのビット長は下記式(3)によりあらわすことができる。ただし、Length(ri)は乱数riのビット長、m=1,2,3とする。
【0074】
Length(ri)=Length(Pi+1)−Length(Pi)−m…(3)
また、以下に示す式を用いることとしてもよい。
Length(ri)={Length(Pi)−m}/2…(3’)
また、M=1,2とし、以下に示す式を用いることとしてもよい。
Length(ri)={Length(Pi)+M}/2…(3”)
【0075】
乱数生成部304は、上記式(3)により、素数{P1,…,Pn-1}の各ビット長に従って、乱数{r1,…,rn-1}を生成し、メモリに保持する。たとえば、素数Pnのビット長が514[bit]、素数Pn-1のビット長が258[bit]、m=1とすると、乱数riのビット長はLength(ri)=514−258−1=255となる。
【0076】
なお、乱数生成部304は、素数生成部303による素数生成処理時に、各素数{P1,…,Pn-1}に対応する乱数{r1,…,rn-1}を個々に生成することとしてもよく、また、乱数{r1,…,rn-1}を一括して生成することとしてもよい。
【0077】
出力部305は、素数生成部303によって生成された素数Pnを出力する機能を有する。具体的には、出力部305は、素数生成部303によって生成された素数Pnをメモリから読み出して、図1に示すディスプレイ131やスピーカ132などの出力装置130により、素数Pnを出力する。なお、出力部305は、素数Pnを生成する前に途中で生成された素数{P1,…,Pn-1}をあわせて出力することとしてもよい。
【0078】
(素数生成装置100の素数生成処理手順)
つぎに、この発明の実施の形態にかかる素数生成装置100の素数生成処理手順について説明する。図4は、この発明の実施の形態にかかる素数生成装置100の素数生成処理手順を示すフローチャートである。
【0079】
図4のフローチャートにおいて、まず、受付部301により、素数Pnのビット長の指定を受け付けたか否かを判断する(ステップS401)。ここで、素数Pnのビット長の指定を受け付けるのを待って(ステップS401:No)、受け付けた場合(ステップS401:Yes)、算出部302により、指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する算出処理を実行する(ステップS402)。
【0080】
このあと、素数生成部303により、算出部302によって算出された素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用して、素数Piのビット長より長いビット長でかつ素数Piより大きな値の素数Pi+1を順次生成して、素数Pnを生成する素数生成処理を実行する(ステップS403)。
【0081】
最後に、出力部305により、ステップS403において生成された素数Pnを出力して(ステップS404)、本フローチャートによる一連の処理を終了する。
【0082】
<算出処理手順>
つぎに、算出部302による上述したステップS402における素数{P1,…,Pn-1}の各ビット長の算出処理手順について説明する。図5は、ステップS402における算出処理手順を示すフローチャートである。ここでは、上記式(1)を用いて素数{P1,…,Pn-1}の各ビット長を算出する場合を例に挙げて説明する。なお、Pnとして514[bit]の素数を生成するものとし、P1として生成可能な短い素数の最大長が34[bit]であった場合の例である。
【0083】
また、図4に示すステップS401において、素数Pnのビット長として514[bit]の指定を受け付け、素数P1のビット長が30数ビット程度以内(〜34[bit])となった時点で算出処理を終了することとする。
【0084】
図5のフローチャートにおいて、上記式(1)により、図4に示すステップS401において指定を受け付けた素数Pnのビット長に従って、素数Piのビット長であるLength(Pi)を算出する(ステップS501)。具体的には、i=n−1として、Length(Pn-1)を算出する。
【0085】
すなわち、上記式(1)において、Length(Pi+1)=Length(Pn)=514として、Length(Pi)=Length(Pn-1)を算出する。ここでは、Length(Pi)=Length(Pn-1)=[514+1]/2+1=258.5≒258となる。ただし、小数点以下は切り捨てとする。
【0086】
つぎに、ステップS501において算出されたLength(Pi)が30数ビット程度以内の長さであるか否かを判断する(ステップS502)。ここで、Length(Pi)≦34でない場合(ステップS502:No)、iを1つデクリメントして(ステップS503)、ステップS501に戻る。
【0087】
一方、Length(Pi)≦34である場合(ステップS502:Yes)、図4に示すステップS403に移行する。ここでは、ステップS501において算出されたビット長がLength(Pi)=258>34となるため、iを1つデクリメントして、ステップS501に戻る。
【0088】
そして、上記式(1)において、Length(Pi+1)=Length(Pn-1)=258として、Length(Pi)=Length(Pn-2)を算出する。ここでは、Length(Pi)=Length(Pn-2)=[258+1]/2+1≒130となる。このように、素数Pnのビット長に従って、Length(Pi)≦34となるまで、素数{P1,…,Pn-1}の各ビット長の長いものから順次算出する。
【0089】
ここでは、Length(P4)=258[bit]→Length(P3)=130[bit]→Length(P2)=66[bit]→Length(P1)=34[bit]≒30[bit]と順次算出されることとなる。
【0090】
これにより、素数生成処理を実行する前に、所望の素数Pnを効率的に生成することができる素数{P1,…,Pn-1}の各ビット長を算出することができる。具体的には、素数Pn-1と乱数rn-1とを乗算したときに、高い確率で素数Pnを生成することができる素数{P1,…,Pn-1}の各ビット長を算出することができる。
【0091】
<素数生成処理手順>
【0092】
つぎに、素数生成部303による上述したステップS403における素数生成処理手順について説明する。図6は、ステップS403における素数生成処理手順を示すフローチャート(その1)である。ここでは、各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}の各ビット長を一括して算出する場合について説明する。
【0093】
図6のフローチャートにおいて、まず、素数生成部303により、図4に示すステップS402において算出された素数P1のビット長に基づいて素数P1を生成する(ステップS601)。具体的には、たとえば、[背景技術]で示した第2の手法により、素数P1のビット長によって特定される素数を生成する。
【0094】
つぎに、各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}の各ビット長を算出する(ステップS602)。具体的には、上記式(3)により、素数{P1,…,Pn-1}の各ビット長に基づいて、乱数{r1,…,rn-1}の各ビット長を算出する。具体的には、iをi=1〜n−1まで順にインクリメントして乱数{r1,…,rn-1}の各ビット長をすべて算出する。
【0095】
すなわち、上記式(3)において、iをi=1〜n−1まで順にインクリメントして、Length(Pi)およびLength(Pi+1)を順に与え、乱数{r1,…,rn-1}の各ビット長を算出する。ここでは、乱数{r1,…,r4}のビット長は、Length(r1)=31,Length(r2)=63,Length(r3)=127,Length(r4)=257となる。
【0096】
つぎに、iをi=1から順にインクリメントして乱数riとPi+1を生成する。具体的には、乱数生成部304により、ステップS602において算出された乱数{r1,…,rn-1}の各ビット長に従って乱数riを生成する(ステップS603)。
【0097】
このあと、素数生成部303により、ステップS603において生成された乱数riを用いて素数Pi+1を生成する(ステップS604)。このとき、Pocklingtonの素数判定法を利用して素数Pi+1を生成し、生成された素数候補が素数とならなかった場合、ステップS603に戻り、素数となるまで処理を繰り返しおこなう。
【0098】
つぎに、i=n−1であるか否かを判断し(ステップS605)、i=n−1でない場合(ステップS605:No)、iを1つインクリメントして(ステップS606)、ステップS603に戻る。
【0099】
一方、i=n−1である場合(ステップS605:Yes)、図4に示すステップS404に移行する。すなわち、iをi=1から順にインクリメントして素数{P1,…,Pn-1}を順次生成し、最終的に素数Pnを生成すると図4に示すステップS404に移行することとなる。
【0100】
このように、算出部302により予め算出された素数{P1,…,Pn-1}の各ビット長に基づいて、当該素数{P1,…,Pn}を順次生成することにより、素数Pn-1から素数Pnを生成する際のやり直し回数を低減させ、所望の素数Pnを効率的に生成することができる。
【0101】
つぎに、各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}の各ビット長を生成される素数Pi+1に応じて算出する場合について説明する。図7は、ステップS403における素数生成処理手順を示すフローチャート(その1)である。ここでは、素数Pnのビット長として514[bit]の指定を受け付け、乱数riのビット長は上記式(3)であらわされることとする。なお、上記式(3)においてm=1とする。
【0102】
図7のフローチャートにおいて、まず、素数生成部303により、図4に示すステップS402において算出された素数P1のビット長に基づいて素数P1を生成する(ステップS701)。つぎに、素数Piに乗算する乱数riのビット長を算出する(ステップS702)。
【0103】
具体的には、上記式(3)により、素数{P1,…,Pn-1}の各ビット長に基づいて、乱数riのビット長を算出する。具体的には、iをi=1から順にインクリメントして乱数riのビット長を算出することとなる。
【0104】
すなわち、上記式(3)において、Length(Pi)=Length(P1)=34、Length(Pi+1)=Length(P2)=66として、Length(r1)を算出する。ここでは、Length(ri)=Length(r1)=66−34−1=31となる。
【0105】
つぎに、乱数生成部304により、ステップS702において算出された乱数riのビット長に従って乱数riを生成する(ステップS703)。このあと、素数生成部303により、ステップS703において生成された乱数riを用いて素数Pi+1を生成する(ステップS704)。
【0106】
このあと、i=n−1であるか否かを判断し(ステップS705)、i=n−1でない場合(ステップS705:No)、iを1つインクリメントして(ステップS706)、ステップS702に戻る。一方、i=n−1である場合(ステップS705:Yes)、図4に示すステップS404に移行する。
【0107】
すなわち、iをi=1から順にインクリメントして乱数riのビット長を順次算出し、乱数rn-1のビット長を算出し、素数Pnを生成すると図4に示すステップS404に移行することとなる。
【0108】
このように、算出部302により予め算出された素数{P1,…,Pn-1}の各ビット長に基づいて、当該素数{P1,…,Pn}を順次生成することにより、素数Pn-1から素数Pnを生成する際のやり直し回数を低減させ、所望の素数Pnを効率的に生成することができる。
【0109】
また、各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}の各ビット長を、生成する素数Piに応じて、その都度算出するため、乱数{r1,…,rn-1}の各ビット長を一括して算出した場合に比べて、乱数{r1,…,rn-1}を記憶するために使用するメモリ量を低減させることができる。
【0110】
以上説明したように、素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法によれば、任意のビット長の素数を確定的に、かつ、効率的に生成することができるという効果を奏する。
【0111】
なお、本実施の形態で説明した素数生成方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーションなどのコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVDなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネットなどのネットワークを介して配布することが可能な伝送媒体であってもよい。
【0112】
また、本実施の形態で説明した素数生成装置100は、スタンダードセルやストラクチャードASIC(Application Specific Integrated Circuit)などの特定用途向けIC(以下、単に「ASIC」と称す。)やFPGAなどのPLD(Programmable Logic Device)によっても実現することができる。具体的には、たとえば、上述した素数生成装置100の機能的構成301〜305をHDL記述によって機能定義し、そのHDL記述を論理合成してASICやPLDに与えることにより、素数生成装置100を製造することができる。また、301〜305の各処理の一部分のみをこれらの手法で製造、実現し、残りの処理をプログラムなどで実現してもよい。
【0113】
(付記1)素数Pnのビット長の指定を受け付けさせる受付工程と、
前記受付工程によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出させる算出工程と、
前記算出工程によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成させる素数生成工程と、
をコンピュータに実行させることを特徴とする素数生成プログラム。
【0114】
(付記2)前記算出工程によって算出された素数{P1,…,Pn-1}の各ビット長に従って、当該各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}を生成させる乱数生成工程を前記コンピュータに実行させ、
前記素数生成工程は、
前記素数P1のビット長によって特定される素数を生成し、前記乱数生成工程によって生成された乱数{r1,…,rn-1}を用いて、前記素数Piと前記乱数riとを乗算することにより、前記素数Pnを生成させることを特徴とする付記1に記載の素数生成プログラム。
【0115】
(付記3)前記素数生成工程は、
2ビット以上のビット長によって表現可能な素数を記憶する素数テーブルを参照することにより、前記素数P1のビット長によって特定される素数を生成させることを特徴とする付記2に記載の素数生成プログラム。
【0116】
(付記4)前記算出工程は、
前記乱数riのビット長より前記素数Piのビット長が長くなる前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする付記1〜3のいずれか一つに記載の素数生成プログラム。
【0117】
(付記5)前記算出工程は、
前記Pi+1のビット長が前記素数Piのビット長の2倍程度の長さとなる前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする付記4に記載の素数生成プログラム。
【0118】
(付記6)前記算出工程は、
下記式(1)により、前記素数Pnのビット長に従って、前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする付記1〜3のいずれか一つに記載の素数生成プログラム。
Length(Pi)=[Length(Pi+1)+1]/2+1・・・(1)
ただし、Length(Pi)は素数Piのビット長とする。
【0119】
(付記7)前記算出工程は、
下記式(2)により、前記素数Pnのビット長に従って、前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする付記1〜3のいずれか一つに記載の素数生成プログラム。
Length(Pi)=Length(Pi+1)/2+1・・・(2)
ただし、Length(Pi)は素数Piのビット長とする。
【0120】
(付記8)前記算出工程は、
前記素数P1のビット長が30数ビット程度の長さとなる前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする付記1〜7のいずれか一つに記載の素数生成プログラム。
【0121】
(付記9)前記素数生成プログラムは、
Pocklington法を利用した素数判定手法により、前記素数Pnを確定的に生成させることを特徴とする付記1〜8のいずれか一つに記載の素数生成プログラム。
【0122】
(付記10)付記1〜9のいずれか一つに記載の素数生成プログラムを記録した前記コンピュータに読み取り可能な記録媒体。
【0123】
(付記11)素数Pnのビット長の指定を受け付ける受付手段と、
前記受付手段によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する算出手段と、
前記算出手段によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成する素数生成手段と、
を備えることを特徴とする素数生成装置。
【0124】
(付記12)素数Pnのビット長の指定を受け付ける受付工程と、
前記受付工程によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する算出工程と、
前記算出工程によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成する素数生成工程と、
を含んだことを特徴とする素数生成方法。
【産業上の利用可能性】
【0125】
以上のように、本発明にかかる素数生成プログラム、該プログラムを記録した記録媒体、素数生成装置および素数生成方法は、確定的な素数生成手法を用いて所定長の素数を生成する場合に有用であり、特に、2のべき乗長以外のビット長の素数を生成する場合に適している。
【図面の簡単な説明】
【0126】
【図1】この発明の実施の形態にかかる素数生成装置のハードウェア構成を示すブロック図である。
【図2】素数テーブルのデータ構造を示す説明図である。
【図3】この発明の実施の形態にかかる素数生成装置の機能的構成を示すブロック図である。
【図4】この発明の実施の形態にかかる素数生成装置の素数生成処理手順を示すフローチャートである
【図5】ステップS402における算出処理手順を示すフローチャートである。
【図6】ステップS403における素数生成処理手順を示すフローチャート(その1)である。
【図7】ステップS403における素数生成処理手順を示すフローチャート(その2)である。
【符号の説明】
【0127】
100 素数生成装置
200 素数テーブル
301 受付部
302 算出部
303 素数生成部
304 乱数生成部
305 出力部

【特許請求の範囲】
【請求項1】
素数Pnのビット長の指定を受け付けさせる受付工程と、
前記受付工程によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出させる算出工程と、
前記算出工程によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成させる素数生成工程と、
をコンピュータに実行させることを特徴とする素数生成プログラム。
【請求項2】
前記算出工程によって算出された素数{P1,…,Pn-1}の各ビット長に従って、当該各素数{P1,…,Pn-1}に乗算する乱数{r1,…,rn-1}を生成させる乱数生成工程を前記コンピュータに実行させ、
前記素数生成工程は、
前記素数P1のビット長によって特定される素数を生成し、前記乱数生成工程によって生成された乱数{r1,…,rn-1}を用いて、前記素数Piと前記乱数riとを乗算することにより、前記素数Pnを生成させることを特徴とする請求項1に記載の素数生成プログラム。
【請求項3】
前記算出工程は、
前記乱数riのビット長より前記素数Piのビット長が長くなる前記素数{P1,…,Pn-1}の各ビット長を算出させることを特徴とする請求項1または2に記載の素数生成プログラム。
【請求項4】
請求項1〜3のいずれか一つに記載の素数生成プログラムを記録した前記コンピュータに読み取り可能な記録媒体。
【請求項5】
素数Pnのビット長の指定を受け付ける受付手段と、
前記受付手段によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する算出手段と、
前記算出手段によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成する素数生成手段と、
を備えることを特徴とする素数生成装置。
【請求項6】
素数Pnのビット長の指定を受け付ける受付工程と、
前記受付工程によって指定を受け付けた素数Pnのビット長に従って、素数{P1,…,Pn-1}の各ビット長を算出する算出工程と、
前記算出工程によって算出された前記素数{P1,…,Pn-1}の各ビット長に基づいて、素数Pi(1≦i≦n−1)と乱数riとを利用することにより、前記素数Piのビット長より長いビット長でかつ前記素数Piより大きな値の素数Pi+1を順次生成して、前記素数Pnを生成する素数生成工程と、
を含んだことを特徴とする素数生成方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate


【公開番号】特開2008−216411(P2008−216411A)
【公開日】平成20年9月18日(2008.9.18)
【国際特許分類】
【出願番号】特願2007−51062(P2007−51062)
【出願日】平成19年3月1日(2007.3.1)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】