(57)【要約】【課題】利用者の利便性を向上することが可能な個別秘匿データ書き込みシステム及び個別秘匿データ書き込み方法を提供する。【解決手段】Ｎ＝ｐ＊ｑ＝（ｓ＋ａ）（ｓ−ｂ）、ｓをＮの平方根に近い整数とし、Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓ、ａｂ＝ｋｓ−（Ｎｍｏｄｓ）、０＜ａｂ＜ｓ、ｋ＝１としてＮの素因数分解を行い、演算結果が適正であるか否かを判定し、否と判定した場合に、肯と判定するまでｋを増加させながら素因数分解を繰り返す素因数分解部と、ｋが上限値（Ｌｉｍｉｔ）を超えても素因数分解部によって適正な演算結果が出ない場合に、Ｎを用いた公開鍵暗号が安全と判定する安全性判定部とを備える安全性評価装置。【選択図】図２
2006072336.tif 000002
【特許請求の範囲】
【請求項１】
整数Ｎに対してＮ＝ｐ＊ｑとなる素因数ｐ，ｑを求める素因数分解方法において、
ｓをＮの平方根に近い整数、ｐをｐ＝ｓ＋ａ、ｑをｑ＝ｓ−ｂとし、
Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓ
に基づいて素因数ｐ，ｑを算出すること、
を特徴とする素因数分解方法。
【請求項２】
請求項１に記載の素因数分解方法において、
ａ＝ｃ＋ｄ、ｂ＝ｄ−ｃとし、
Ｎｍｏｄｓ＝（ｃ2 −ｄ2 ）ｍｏｄｓ
に基づいて素因数ｐ，ｑを算出すること、
を特徴とする素因数分解方法。
【請求項３】
請求項１又は請求項２に記載の素因数分解方法において、
ａｂ＝ｋｓ−（Ｎｍｏｄｓ）、０＜ａｂ＜ｋｓ、ｋ＝１として、素因数ｐ，ｑを算出するための演算を行う第１の演算ステップと、
前記第１の演算ステップにおいて、演算結果が適正であるか否かを判定する適正判定ステップと、
前記適正判定ステップにおいて否と判定された場合に、ｋを逐次変更させながら前記第１の演算ステップ及び適正判定ステップを繰り返すこと、
を特徴とする素因数分解方法。
【請求項４】
Ｎ＝ｐ＊ｑ、
Ｘ＝Ｋ＊Ｎ＝ｒｐ＊ｓｑ＝Ｓ2−ａ2、
Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とした場合に、Ｓ及びＫの値を変化させ、ａが整数となるＳ，Ｘの値を算出する第２の演算ステップと、
前記第２の演算ステップにおいて算出したＳ及びＸの値に基づいて、整数Ｎから素因数ｐ，ｑを求める第３の演算ステップとを備える素因数分解方法であって、
前記第２の演算ステップは、Ｋの値を大きな値から小さな値へ変化させ、ａが整数となるＳ，Ｘの値を算出すること、
を特徴とする素因数分解方法。
【請求項５】
請求項４に記載の素因数分解方法において、
前記第２の演算ステップにおいて、Ｓの値の範囲を、（ 6√Ｎ／（４＊√Ｋ））に比べて狭く設定すること、
を特徴とする素因数分解方法。
【請求項６】
請求項４に記載の素因数分解方法において、
前記第２の演算ステップは、素因数ｐi 及びｑi の積である他の整数Ｎi をＫに代入し、Ｓ，Ｘの値を算出すること、
を特徴とする素因数分解方法。
【請求項７】
素数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手段と、
請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手段によって取得された整数Ｎを、素因数ｐ，ｑに素因数分解する素因数分解手段と、
を備える素因数分解装置。
【請求項８】
素因数分解を行うためにコンピュータに実行させる素因数分解プログラムであって、
素数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手順と、
請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手順において取得した整数Ｎを、素因数ｐ，ｑに素因数分解する素因数分解手順とを備えること、
を特徴とする素因数分解プログラム。
【請求項９】
公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、
整数Ｎに対してＮ＝ｐ＊ｑとなる、ｎビットの公開鍵暗号の素因数ｐ，ｑの差異を取得する素因数差異取得手段と、
前記素因数差異取得手段によって取得された素因数ｐ，ｑの上位ｎ／２ビットにおける差異に基づいて、安全性を評価する安全性評価手段とを備えること、
を特徴とする安全性評価装置。
【請求項１０】
請求項９に記載の安全性評価装置において、
前記安全性評価手段は、素因数ｐ，ｑについて、それぞれの最上位ビットから下位へ向けて情報単位ごとに順に比較し、相違箇所があった場合に、その位置に応じて安全性を評価すること、
を特徴とする安全性評価装置。
【請求項１１】
請求項９又は請求項１０に記載の安全性評価装置において、
前記安全性評価手段は、前記素因数ｐ，ｑについて、上位ｎ／２ビットにおいて差がない場合に、公開鍵暗号の暗号鍵を脆弱と判定すること、
を特徴とする安全性評価装置。
【請求項１２】
請求項９から請求項１１までのいずれか１項に記載の安全性評価装置において、
前記素因数差異取得手段は、
整数Ｎ、秘密鍵ｄ、公開鍵ｅを取得する取得手段と、
ｐ＝ｓ＋ａ、ｑ＝ｓ−ａ、ｆを０＜ｆ＜ｅを満たす整数として、
φ＝（ｅ＊ｄ−１）／ｆ、ｓ＝（ｐ＋ｑ）／２＝（Ｎ−φ＋１）／２、
に基づいて素因数ｐ，ｑの差異を算出する演算手段とを有すること、
を特徴とする安全性評価装置。
【請求項１３】
公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、
整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手段と、
ｓをＮの平方根に近い整数、前記素因数取得手段によって取得された素因数ｐをｐ＝ｓ＋ａ、素因数ｑをｑ＝ｓ−ｂ、ｋをしきい値とした場合に、０＜ａｂ＜ｋｓを満たすか否かに基づいて公開鍵暗号の暗号鍵の安全性を評価する安全性評価手段とを備えること、
を特徴とする安全性評価装置。
【請求項１４】
公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、
整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手段と、
素因数取得手段によって取得された素因数ｐ，ｑに基づいて、
Ｘ＝ｒ＊ｓ＊Ｎ、
ｐ＊ｒn −ｑ＊ｓn ＝ｚn 
（ｒn ，ｓn ，ｚn ）＝（ｒn-2 ，ｓn-2 ，ｚn-2 ）−ｆｌｏｏｒ（ｚn-2 ／ｚn-1 ）＊（ｒn-1 ，ｓn-1 ，ｚn-1 ）
とし、
拡張ユークリッドアルゴリズムの互除法を用いて、ｚn が所定の閾値に達した場合のｒn-1 ，ｓn-1 に基づいて、ｒ，ｓを算出する演算手段と、
前記演算手段の演算結果に基づいて、公開鍵暗号の安全性を評価する安全性評価手段とを備えること、
を特徴とする安全性評価装置。
【請求項１５】
公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、
公開鍵暗号の素因数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手段と、
請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手段によって取得された整数Ｎを素因数分解する素因数分解手段と、
前記素因数分解手段による素因数分解の容易さに応じて、公開鍵暗号の暗号鍵の安全性を評価する安全性評価手段とを備えること、
を特徴とする安全性評価装置。
【請求項１６】
公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、
整数Ｎに対してＮ＝ｐ＊ｑとなる、ｎビットの公開鍵暗号の素因数ｐ，ｑの差異を取得する素因数差異取得手順と、
前記素因数差異取得手順において取得した素因数ｐ，ｑの上位ｎ／２ビットにおける差異に基づいて、安全性を評価する安全性評価手順とを備えること、
を特徴とする安全性評価プログラム。
【請求項１７】
請求項１６に記載の安全性評価プログラムにおいて、
前記安全性評価手段は、素因数ｐ，ｑについて、それぞれの最上位ビットから下位へ向けて情報単位ごとに順に比較し、相違箇所があった場合に、その位置に応じて安全性を評価すること、
を特徴とする安全性評価プログラム。
【請求項１８】
請求項１６又は請求項１７に記載の安全性評価プログラムにおいて、
前記安全性評価手順は、前記素因数ｐ，ｑについて、上位ｎ／２ビットにおいて差がない場合に、公開鍵暗号の暗号鍵を脆弱と判定すること、
を特徴とする安全性評価プログラム。
【請求項１９】
請求項１６から請求項１８までのいずれか１項に記載の安全性評価プログラムにおいて、
前記素因数差異取得ステップは、
整数Ｎ、秘密鍵ｄ、公開鍵ｅを取得する取得ステップと、
ｐ＝ｓ＋ａ、ｑ＝ｓ−ａ、ｆを０＜ｆ＜ｅを満たす整数として、
φ＝（ｅ＊ｄ−１）／ｆ、ｓ＝（ｐ＋ｑ）／２＝（Ｎ−φ＋１）／２、
に基づいて素因数ｐ，ｑの差異を算出する演算ステップとを有すること、
を特徴とする安全性評価プログラム。
【請求項２０】
公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、
整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手順と、
ｓをＮの平方根に近い整数、前記素因数取得手段によって取得された素因数ｐをｐ＝ｓ＋ａ、ｑをｑ＝ｓ−ｂ、ｋをしきい値とした場合に、０＜ａｂ＜ｋｓを満たすか否かに基づいて公開鍵暗号の暗号鍵の安全性を評価する安全性評価手順とを備えること、
を特徴とする安全性評価プログラム。
【請求項２１】
公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、
整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手順と、
素因数取得手順において取得した素因数ｐ，ｑに基づいて、Ｘ＝ｒ＊ｓ＊Ｎ、ｐ＊ｒn −ｑ＊ｓn ＝ｚn とし、拡張ユークリッドアルゴリズムの互除法を用いて、ｚn が所定の閾値に達した場合のｒn-1 ，ｓn-1 に基づいて、ｒ，ｓを算出する演算手順と、
前記演算手順における演算結果に基づいて、公開鍵暗号の安全性を評価する安全性評価手順とを備えること、
を特徴とする安全性評価プログラム。
【請求項２２】
公開鍵暗号の暗号鍵の安全性を評価する安全性評価プログラムであって、
公開鍵暗号の素因数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手順と、
請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手順において取得した整数Ｎを素因数分解する素因数分解手順と、
前記素因数分解手順における素因数分解の容易さに応じて、公開鍵暗号の暗号鍵の安全性を評価する安全性評価手順とを備えること、
を特徴とする安全性評価プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、素因数分解を行う素因数分解装置、素因数分解プログラム及び素因数分解方法、暗号の安全性が素因数分解の困難性に依存する公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置及び安全性評価プログラムに関するものである。
【背景技術】
【０００２】
暗号の安全性が素因数分解の困難性に依存する暗号方式に、ＲＳＡ暗号、Ｒａｂｉｎ暗号などがある。ＲＳＡ暗号においては、ｐ，ｑという二つの素数の積である「Ｎ」を公開し、私有鍵（秘密鍵）は、このｐ，ｑから簡単に計算することが可能である。従って、このＮを素因数分解できる場合には、私有鍵が判明し、暗号が解読されてしまうため、十分に大きな素数ｐ，ｑを選定し、その積Ｎを十分大きな値とすることによって、計算量的に私有鍵を解読することが不可能となり、十分な安全性を確保することができる。つまり、暗号の安全性は、素数ｐ，ｑの性質に依存している。
従来から、素因数分解の方法として、ｒｈｏ（ロー）法、ｐ−１法などが知られている（例えば、非特許文献１参照。）。
ｐ−１、ｐ＋１にそれぞれ大きな素因数をもつように素数を選択するなど、難しい計算をし、素数の値に条件をつけて選択することによって、これらの方法による素因数分解を困難なものとしていた（例えば、特許文献１参照。）。
一方、近年においては、素数ｐ，ｑがランダムに生成された乱数より生成され、Ｎが１０２４ビット程度である場合には、安全性が高いと言われている（例えば、非特許文献２参照。）。また、素数の長さ（ビット長）が大きく異なる場合にも、素因数分解が比較的容易となるため、一般的に同一のビット長の素数が用いられている。
このように、従来から、新たな素因数分解の方法が解明されると、素数ｐ，ｑの値に条件をつけて選択し、この方法における素因数分解を困難なものとし、安全性を保証するための措置を取っていた。
【非特許文献１】Alfred J. Menezes, Paul C. van Oorschot and  Scott A. Vanstone著、「ハンドブック・オブ・アプライド・クリプトグラフィ（Handbook of Applied Cryptography）」、（米国）、シーアールシープレス（CRC Press）、２００１年８月、第３章ｐ．８９−９８
【非特許文献２】ロバート・ディー・シルバーマン（Robert D.Silverman）著、“ファーストジェネレーション・オブ・ランダム、ストロングＲＳＡプライムス，クリプトバイツ−ボリューム３．１（Fast Generation of Random, Strong RSA Primes(Cryptobytes Volume 3,No.1-SPRING 1997)）”、［online］、１９９７年春、ＲＳＡデータラボラトリーズ（RSA Laboratories）、［平成１６年７月１２日検索］、インターネット〈ftp://ftp.rsasecurity.com/pub/cryptobytes/crypto3n1.pdf〉
【特許文献１】特開平１１−５２８５３号
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、これら種々の条件に従って素数ｐ，ｑを選択した場合であっても、新たな素因数分解の方法が解明された場合には、この方法によって容易に私有鍵が判明し、暗号が解読されてしまう可能性があった。
また、公開鍵暗号を利用したデジタル署名の規格であるＡＮＳＩの「ＡＮＳＩＸ９．３１−１９９８」のセクションＣ．８においても、鍵の安全性の検証は今後の研究開発課題である旨が記述されている。
【０００４】
本発明の課題は、新たな素因数分解方法、この方法を用いて素因数分解を行う素因数分解装置及び素因数分解プログラム、この素因数分解方法に対する暗号の安全性を評価し、セキュリティを向上することが可能な安全性評価装置及び安全性評価プログラムを提供することである。
【課題を解決するための手段】
【０００５】
本発明は、以下のような解決手段により、前記課題を解決する。すなわち、請求項１の発明は、整数Ｎに対してＮ＝ｐ＊ｑとなる素因数ｐ，ｑを求める素因数分解方法において、ｓをＮの平方根に近い整数、ｐをｐ＝ｓ＋ａ、ｑをｑ＝ｓ−ｂとし、Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓに基づいて素因数ｐ，ｑを算出すること、を特徴とする素因数分解方法である。
【０００６】
請求項２の発明は、請求項１に記載の素因数分解方法において、ａ＝ｃ＋ｄ、ｂ＝ｄ−ｃとし、Ｎｍｏｄｓ＝（ｃ2 −ｄ2 ）ｍｏｄｓに基づいて素因数ｐ，ｑを算出すること、を特徴とする素因数分解方法である。
【０００７】
請求項３の発明は、請求項１又は請求項２に記載の素因数分解方法において、ａｂ＝ｋｓ−（Ｎｍｏｄｓ）、０＜ａｂ＜ｓ、ｋ＝１として、素因数ｐ，ｑを算出するための演算を行う第１の演算ステップと、前記第１の演算ステップにおいて、演算結果が適正であるか否かを判定する適正判定ステップと、前記適正判定ステップにおいて否と判定された場合に、ｋを逐次変更させながら前記第１の演算ステップ及び適正判定ステップを繰り返すこと、を特徴とする素因数分解方法である。
【０００８】
請求項４の発明は、Ｎ＝ｐ＊ｑ、Ｘ＝Ｋ＊Ｎ＝ｒｐ＊ｓｑ＝Ｓ2−ａ2、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とした場合に、Ｓ及びＫの値を変化させ、ａが整数となるＳ，Ｘの値を算出する第２の演算ステップと、前記第２の演算ステップにおいて算出したＳ及びＸの値に基づいて、整数Ｎから素因数ｐ，ｑを求める第３の演算ステップとを備える素因数分解方法であって、前記第２の演算ステップは、Ｋの値を大きな値から小さな値へ変化させ、ａが整数となるＳ，Ｘの値を算出すること、を特徴とする素因数分解方法である。
【０００９】
請求項５の発明は、請求項４に記載の素因数分解方法において、
前記第２の演算ステップにおいて、Ｓの値の範囲を、（ 6√Ｎ／（４＊√Ｋ））に比べて狭く設定すること、
を特徴とする素因数分解方法である。
【００１０】
請求項６の発明は、請求項４に記載の素因数分解方法において、
前記第２の演算ステップは、素因数ｐi 及びｑi の積である他の整数Ｎi をＫに代入し、Ｓ，Ｘの値を算出すること、
を特徴とする素因数分解方法である。
【００１１】
請求項７の発明は、素数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手段と、請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手段によって取得された整数Ｎを、素因数ｐ，ｑに素因数分解する素因数分解手段と、を備える素因数分解装置である。
【００１２】
請求項８の発明は、素因数分解を行うためにコンピュータに実行させる素因数分解プログラムであって、素数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手順と、請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手順において取得した整数Ｎを、素因数ｐ，ｑに素因数分解する素因数分解手順とを備えること、を特徴とする素因数分解プログラムである。
【００１３】
請求項９の発明は、公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、整数Ｎに対してＮ＝ｐ＊ｑとなる、ｎビットの公開鍵暗号の素因数ｐ，ｑを取得する素因数差異取得手段と、前記素因数差異取得手段によって取得された素因数ｐ，ｑの上位ｎ／２ビットにおける差異に基づいて、安全性を評価する安全性評価手段とを備えること、を特徴とする安全性評価装置である。
【００１４】
請求項１０の発明は、請求項９に記載の安全性評価装置において、前記安全性評価手段は、素因数ｐ，ｑについて、それぞれの最上位ビットから下位へ向けて情報単位ごとに順に比較し、相違箇所があった場合に、その位置に応じて安全性を評価すること、を特徴とする安全性評価装置である。
【００１５】
請求項１１の発明は、請求項９又は請求項１０に記載の安全性評価装置において、前記安全性評価手段は、前記素因数ｐ，ｑについて、上位ｎ／２ビットにおいて差がない場合に、公開鍵暗号の暗号鍵を脆弱と判定すること、を特徴とする安全性評価装置である。
【００１６】
請求項１２の発明は、請求項９から請求項１１までのいずれか１項に記載の安全性評価装置において、前記素因数差異取得手段は、整数Ｎ、秘密鍵ｄ、公開鍵ｅを取得する取得手段と、ｐ＝ｓ＋ａ、ｑ＝ｓ−ａ、ｆを０＜ｆ＜ｅを満たす整数として、φ＝（ｅ＊ｄ−１）／ｆ、ｓ＝（ｐ＋ｑ）／２＝（Ｎ−φ＋１）／２、に基づいて素因数ｐ，ｑの差異を算出する演算手段とを有すること、を特徴とする安全性評価装置である。
【００１７】
請求項１３の発明は、公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手段と、ｓをＮの平方根に近い整数、前記素因数取得手段によって取得された素因数ｐをｐ＝ｓ＋ａ、ｑをｑ＝ｓ−ｂ、ｋをしきい値とした場合に、０＜ａｂ＜ｋｓを満たすか否かに基づいて公開鍵暗号の暗号鍵の安全性を評価する安全性評価手段とを備えること、を特徴とする安全性評価装置である。
【００１８】
請求項１４の発明は、公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手段と、素因数取得手段によって取得された素因数ｐ，ｑに基づいて、Ｘ＝ｒ＊ｓ＊Ｎ、ｐ＊ｒn −ｑ＊ｓn ＝ｚn とし、拡張ユークリッドアルゴリズムの互除法を用いて、ｚn が所定の閾値に達した場合のｒn-1 ，ｓn-1 に基づいて、ｒ，ｓを算出する演算手段と、前記演算手段の演算結果に基づいて、公開鍵暗号の安全性を評価する安全性評価手段とを備えること、を特徴とする安全性評価装置である。
【００１９】
請求項１５の発明は、公開鍵暗号の暗号鍵の安全性を評価する安全性評価装置であって、公開鍵暗号の素因数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手段と、請求項１から請求項６までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手段によって取得された整数Ｎを素因数分解する素因数分解手段と、前記素因数分解手段による素因数分解の容易さに応じて、公開鍵暗号の暗号鍵の安全性を評価する安全性評価手段とを備えること、を特徴とする安全性評価装置である。
【００２０】
請求項１６の発明は、公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、整数Ｎに対してＮ＝ｐ＊ｑとなる、ｎビットの公開鍵暗号の素因数ｐ，ｑの差異を取得する素因数差異取得手順と、前記素因数差異取得手順において取得した素因数ｐ，ｑの上位ｎ／２ビットにおける差異に基づいて、安全性を評価する安全性評価手順とを備えること、を特徴とする安全性評価プログラムである。
【００２１】
請求項１７の発明は、請求項１６に記載の安全性評価プログラムにおいて、前記安全性評価手段は、素因数ｐ，ｑについて、それぞれの最上位ビットから下位へ向けて情報単位ごとに順に比較し、相違箇所があった場合に、その位置に応じて安全性を評価すること、を特徴とする安全性評価プログラムである。
【００２２】
請求項１８の発明は、請求項１６又は請求項１７に記載の安全性評価プログラムにおいて、前記安全性評価手順は、前記素因数ｐ，ｑについて、上位ｎ／２ビットにおいて差がない場合に、公開鍵暗号の暗号鍵を脆弱と判定すること、を特徴とする安全性評価プログラムである。
【００２３】
請求項１９の発明は、請求項１６から請求項８４までのいずれか１項に記載の安全性評価プログラムにおいて、前記素因数差異取得ステップは、整数Ｎ、秘密鍵ｄ、公開鍵ｅを取得する取得ステップと、ｐ＝ｓ＋ａ、ｑ＝ｓ−ａ、ｆを０＜ｆ＜ｅを満たす整数として、φ＝（ｅ＊ｄ−１）／ｆ、ｓ＝（ｐ＋ｑ）／２＝（Ｎ−φ＋１）／２、に基づいて素因数ｐ，ｑの差異を算出する演算ステップとを有すること、を特徴とする安全性評価プログラムである。
【００２４】
請求項２０の発明は、公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手順と、ｓをＮの平方根に近い整数、前記素因数取得手段によって取得された素因数ｐをｐ＝ｓ＋ａ、ｑをｑ＝ｓ−ｂ、ｋをしきい値とした場合に、０＜ａｂ＜ｋｓを満たすか否かに基づいて公開鍵暗号の暗号鍵の安全性を評価する安全性評価手順とを備えること、を特徴とする安全性評価プログラムである。
【００２５】
請求項２１の発明は、公開鍵暗号の暗号鍵の安全性を評価するためにコンピュータに実行させる安全性評価プログラムであって、整数Ｎに対してＮ＝ｐ＊ｑとなる公開鍵暗号の素因数ｐ，ｑを取得する素因数取得手順と、素因数取得手順において取得した素因数ｐ，ｑに基づいて、Ｘ＝ｒ＊ｓ＊Ｎ、ｐ＊ｒn −ｑ＊ｓn ＝ｚn とし、拡張ユークリッドアルゴリズムの互除法を用いて、ｚn が所定の閾値に達した場合のｒn-1 ，ｓn-1 に基づいて、ｒ，ｓを算出する演算手順と、前記演算手順における演算結果に基づいて、公開鍵暗号の安全性を評価する安全性評価手順とを備えること、を特徴とする安全性評価プログラムである。
【００２６】
請求項２２の発明は、公開鍵暗号の暗号鍵の安全性を評価する安全性評価プログラムであって、公開鍵暗号の素因数ｐ，ｑの積である整数Ｎを取得する素因数分解対象取得手順と、請求項１から請求項３までのいずれか１項に記載の素因数分解方法に基づいて、前記素因数分解対象取得手順において取得した整数Ｎを素因数分解する素因数分解手順と、前記素因数分解手順における素因数分解の容易さに応じて、公開鍵暗号の暗号鍵の安全性を評価する安全性評価手順とを備えること、を特徴とする安全性評価プログラムである。
【発明の効果】
【００２７】
本発明による素因数分解装置、素因数分解プログラム、安全性評価装置、安全性評価プログラム及び素因数分解方法によれば、以下の効果を得ることが可能となる。
（１）Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓに基づいて演算を行うことによって、新たな方法によって、素因数ｐ，ｑが大きな値であっても、Ｎを素因数ｐ，ｑへ素因数分解することが可能となる。
（２）Ｎｍｏｄｓ＝（ｃ2 −ｄ2 ）ｍｏｄｓに基づいて素因数分解することによって、演算回数を減少させ、処理の迅速化を図る。
（３）特に、０＜ａｂ＜ｋｓ、ｋが小さな値である場合など、素因数ｐ，ｑが一定の条件を満たす場合には、素因数ｐ，ｑがどんなに大きな数値であっても容易に素因数分解することが可能となる。
（４）Ｎ＝ｐ＊ｑ、Ｘ＝Ｋ＊Ｎ＝ｒｐ＊ｓｑ＝Ｓ2−ａ2、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とした場合に、Ｋの値を大きな値から小さな値へ変化させ、ａが整数となるＳ，Ｘの値を算出することによって、整数Ｎを素因数分解可能なＫの値が大きい場合に、従来の方法と比較して容易にＫを見つけだし、Ｎを素因数分解することが可能となる。
（５）特に、Ｓの値の範囲を、（ 6√Ｎ／（４＊√Ｋ））に比べて狭く設定することによって、試行範囲を拡げずに、つまり、処理時間を長期化せずに、素因数分解可能なＫの値が大きい整数Ｎを、容易に素因数分解することが可能となる。
（６）素因数ｐi 及びｑi の積である他の整数Ｎi をＫに代入し、Ｓ，Ｘの値を算出することによって、Ｎを素因数分解可能なｒ，ｓの値が解らなくても、この他の整数Ｎi を用いて容易にＮを素因数分解することが可能となる。特に、Ｎを素因数分解可能なＫ，ｒ，ｓの値が大きいときに容易にＮを素因数分解することが可能となる。
（７）素因数ｐ，ｑの上位ｎ／２ビットにおける差の大小、０＜ａｂ＜ｋｓなどに基づいて安全性を評価することによって、公開鍵暗号の暗号鍵についての安全性評価を容易にすることができるとともに、セキュリティを向上する。特に、しきい値ｋの値を暗号鍵に対して求める安全性、計算量などに応じて設定し、０＜ａｂ＜ｋｓに基づいて判定を行うことによって、要求する安全性、計算量などに応じた安全性の評価が可能となる。
（８）特に、素因数ｐ，ｑのそれぞれの最上位バイトから下位へ向けて情報単位ごとに順に比較し、相違箇所があった場合に、その位置に応じて安全性を評価することによって、計算リソース上の負担を軽減し、処理の迅速化を図ることが可能となる。
（９）また、簡易な処理で評価を行うことが可能であるため、ＩＣカードなど、処理に制限のかかる情報処理装置においてもこの安全性の評価を実現することができるとともに、実現にかかる負担が少なく、汎用性、実現性が高い。
（１０）拡張ユークリッドアルゴリズムの互除法を用いてｒ，ｓを算出し、その演算結果に基づいて、公開鍵暗号の安全性を評価することによって、不正者が素因数分解可能なｒ，ｓに偏りのある公開鍵Ｎを生成した場合などの不正を容易に発見できるなど、セキュリティを向上することが可能となる。
（１１）Ｎを新たな方法で素因数分解し、その結果に基づいて、公開鍵暗号の暗号鍵の安全性を評価することによって、この方法による公開鍵暗号に対する不正を防止し、セキュリティを向上する。また、公開されているＮに基づいて評価を行うことによって、秘密鍵などの秘匿情報をその保持媒体から取り出すことなく、安全性を評価することができ、セキュリティを向上する。
（１２）特に、公開鍵暗号に、同一のビット長で、素数の差が、一定のしきい値以上に設定される素数を使用するように望まれている環境において、この要請に応じて、２つの素数を同一ビット数、素数の差がしきい値となるように設定した場合であっても、このしきい値が２＾（ｎ／２）以下のときには、容易に素因数分解することができることとなり、この危険性を検出し、暗号鍵を脆弱と評価することによってセキュリティを向上する。
【発明を実施するための最良の形態】
【００２８】
本発明は、新たな素因数分解方法に対する暗号の安全性を評価し、セキュリティを向上するという目的を、Ｎ＝ｐ＊ｑ＝（ｓ＋ａ）（ｓ−ｂ）、ｓをＮの平方根に近い整数とし、Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓ、ａｂ＝ｋｓ−（Ｎｍｏｄｓ）、０＜ａｂ＜ｓ、ｋ＝１としてＮの素因数分解を行う演算手段と、演算結果が適正であるか否かを判定する適正判定手段とを備え、演算手段は、適正判定手段が否と判定した場合に、肯と判定するまでｋを増加させながら素因数分解を繰り返し、ｋがしきい値を超えても適正な演算結果が出ない場合に、Ｎを用いた公開鍵暗号が安全と判定すること、によって実現する。
【実施例１】
【００２９】
以下、図面などを参照して、本発明の実施例をあげて、さらに詳しく説明する。
図１は、本発明による素因数分解装置、安全性評価装置の構成を示すブロック図である。なお、本実施例における素因数分解装置及び安全性評価装置は、素因数分解部１２及び安全性評価装置１０である。
図１に示すように、暗号鍵評価システム１は、安全性評価装置１０と、ＩＣカード２０などを備え、暗号の安全性が素因数分解の困難性に依存する暗号方式（ＲＳＡ暗号など）における暗号鍵の安全性を評価するコンピュータシステムである。
ＲＳＡ暗号の安全性は、公開される整数Ｎ（＝ｐ＊ｑ）の素因数分解の困難性に依存する。つまりＲＳＡ暗号の暗号鍵の安全性は、素数ｐ，ｑの性質に依存し、素数ｐ，ｑの積であって、公開されるＮが素因数分解され易い場合には、安全性が否定される。ＲＳＡ暗号においては、ｐ−１及びｑー１の最小公倍数ＬをＬ＝ＬＣＭ（ｐ−１，ｑ−１）とした場合に、最大公約数ｇｃｄ（ｅ，Ｌ）＝１を満たすｅの値が公開鍵となる。また、ｅｄ＝１（ｍｏｄＬ）を満たすｄの値が私有鍵となる。なお、平文をＭ、暗号文をＣとすると、ＲＳＡ暗号において、暗号化は、Ｃ＝Ｍe （ｍｏｄｎ）、復号は、Ｍ＝Ｃd （ｍｏｄｎ）のアルゴリズムによって行われる。
【００３０】
ＩＣカード２０は、ＣＰＵ、メモリ、外部との通信を行うインターフェイスなどを備え、私有鍵を読み出し不可能なセキュアな状態で記憶し、また、私有鍵ｄ、整数Ｎなどを記憶している。なお、暗号鍵評価システム１による安全性評価の対象となる私有鍵ｄを記憶している媒体は、ＩＣタグ、ＰＣなどであってもよく、ＩＣカード２０に限定されない。
安全性評価装置１０は、ＣＰＵ、メモリ、入出力装置などを備えるコンピュータであって、リーダライタ１１、素因数分解部１２、安全性判定部１３、ディスプレイ１４などを備え、例えば、ＡＴＭなどの情報処理装置に、素因数分解部１２、安全性判定部１３を設けることによって実現することが可能である。安全性評価装置１０は、ＩＣカード２０に格納されている私有鍵の安全性を評価する。
【００３１】
リーダライタ１１は、ＩＣカード２０との通信を実現する通信装置であって、ＩＣカード２０に記憶されている整数Ｎを安全性評価装置１０に入力する。
ディスプレイ１４は、私有鍵ｄが安全か否かの安全性判定部１３による安全性の評価結果を表示し、利用者に通知する。
素因数分解部１２は、リーダライタ１１から入力される整数Ｎを素因数分解して、素因数ｐ，ｑを算出する。ここで、Ｎの素因数分解の方法を説明する。
【００３２】
図２は、本発明による素因数分解プログラム及び素因数分解方法を示すフローチャートである。
ｓを、√Ｎの小数点第一位を四捨五入した整数（ｒｏｕｎｄ（√Ｎ））など、Ｎの平方根に近い整数とし（＃１０）、ｐ＝ｓ＋ａ、ｑ＝ｓ−ｂとすると、
Ｎ＝（ｓ＋ａ）＊（ｓ−ｂ）＝ｓ2 ＋ｓ＊（ａ−ｂ）−ａ＊ｂとなる（＃２０）。
また、Ｎをｓで割ったときの剰余をｒとすると、
ｒ＝Ｎｍｏｄｓ＝（−ａ＊ｂ）ｍｏｄｓ
＝−ａ＊ｂ＋ｋ＊ｓとなる（＃３０）。
また、ｃ＝ａ＊ｂ＝ｋ＊ｓ−ｒ（ｋは、整数。）とすると、
＃２０の式は、Ｎ＝ｓ2 ＋ｓ＊（ａ−ｃ／ａ）−ｃ、
変形して、０＝ｓ＊ａ2 ＋（ｓ2 −Ｎ−ｃ）＊ａ−ｓ＊ｃとなる（＃５０）。
０＜ａｂ＜ｓと仮定した場合には、ｋ＝１、ｃ＝ｓ−ｒとなり（＃４０）、＃５０の式からａを求めることができ、ｂ＝ｃ／ａ、ｐ＝ｓ＋ａ、ｑ＝ｓ−ｂから、ｂ、ｐ，ｑを算出することが可能となる。つまり、０＜ａｂ＜ｓが成り立つ素数ｐ（＝ｓ＋ａ）、ｑ（＝ｓ−ｂ）に基づいて生成された暗号鍵は、極めて脆弱と判定される。
【００３３】
なお、ａｂ≦０、ａｂ≧ｓの場合には、ｋ＝１とした演算の結果、ａ又はｂが整数とならず、このときには、ｋに１を加算し、ａ及びｂの値が整数となるまで（＃６０）、又は、ｋが所定の上限値（Ｌｉｍｉｔ）を超えるまで、同様の処理を繰り返す。整数のａ及びｂを算出できた場合には、ｐ＝ｓ＋ａ、ｑ＝ｓ−ｃ／ａから、素因数ｐ，ｑが算出される（＃７０）。
安全性判定部１３は、素因数分解部１２の演算結果、つまり、ｋの上限値内で整数のａ及びｂが算出できるか否かに基づいて、ＩＣカード２０に格納されている私有鍵が安全であるか否かを判定する（＃７０，＃８０）。
なお、上限値を無限大とした場合には、全ての素因数分解を行うことが可能となる。また、設定した上限値が高いほど、素因数分解の算出に時間がかかり、暗号鍵の安全性の基準が高くなる一方で、安全性の評価に時間がかかる。従って、安全性の評価に許される計算時間の限度で最大の値を上限値とするなど、計算時間に応じて上限値を設定することが望ましい。また、暗号鍵に対して要求する安全性についても同様である。つまり、素数ｐ，ｑのビット数に応じるなど、求める計算量的な安全性に応じて上限値を設定することが望ましい。例えば、Ｌｉｍｉｔ≒２＾５０とした場合には、要求する安全性は高くなるが、計算量が多大となり、現実的ではない。
【００３４】
図３は、図２に示す素因数分解方法による素因数分解の演算結果を示す表である。なお、通常、公開鍵暗号の素数ｐ，ｑのビット数は、５１２から１０２４ビットが望ましいが、説明の便宜上、６ビットから１２ビット程度の素数の積Ｎについて、素因数分解を行った（図９において同じ。）。
図３に示すようにＮ＝１９２７、６７５９１、２８１８６１の場合には、０＜ａｂ＜ｓであって、ｋ＝１で素因数ｐ，ｑが算出される。一方、Ｎ＝２９６４４９、８２６５１３の場合には、ｓ＜ａｂとなり、それぞれｋ＝２、ｋ＝８において素因数ｐ，ｑが算出される。
【００３５】
図４は、本発明による素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。
図４に示すように、ステップ１１０（以下、「ステップ」を「Ｓ」という。）において、安全性評価装置１０は、Ｓ１１０において、ＩＣカード２０へ所定のコマンドを送信し、そのレスポンスとして、整数Ｎを受信する。
素因数分解部１２は、このＮを＃５０の式など（図２参照）に代入し、ｋ＝１として（Ｓ１２０）、ａ、ｂを算出する（Ｓ１３０）。ａ及びｂが整数でない場合には、素因数分解部１２は、ｋに１を加え（Ｓ１４０，Ｓ１６０）、ｋが上限値以下の場合には、同様の処理を繰り返す（Ｓ１７０，Ｓ１３０，Ｓ１４０，Ｓ１６０）。
安全性判定部１３は、整数のａ及びｂの値が算出された場合には、ＩＣカード２０に格納されている私有鍵ｄを脆弱と判定し（Ｓ１４０，Ｓ１５０）、ｋが上限値を超えた場合には、私有鍵ｄを安全と判定する（Ｓ１７０，Ｓ１８０）。安全性評価装置１０は、判定結果をディスプレイ１４に表示し（Ｓ１９０）、処理を終了する（Ｓ２００）。
【００３６】
このように、本実施例によれば、安全性評価システム１は、新たな素因数分解方法によって、整数Ｎを大きな素因数ｐ，ｑに素因数分解することが可能となった。特に、０＜ａｂ＜ｋｓ（ｋ≦Ｌｉｍｉｔ）など、素因数ｐ，ｑが一定の条件を満たす場合には、素因数ｐ，ｑがどんなに大きな値であっても、Ｎを容易に素因数ｐ，ｑへ素因数分解することが可能となった。また、公開されているＮに基づいて評価を行うことによって、秘密鍵ｄなどの秘匿情報をその保持媒体であるＩＣカード２０から取り出すことなく、暗号鍵の安全性を評価することができ、セキュリティを向上することが可能となった。
更に、安全性評価システム１は、任意に設定可能であって、安全性判断のしきい値となる上限値（Ｌｉｍｉｔ）をｋが超えるまでに素因数分解することができるか否かに基づいて、暗号鍵の安全性を評価するため、上限値を低く設定し、簡易に安全性の評価を行うことができる一方、高く設定し、安全性を高めることも可能となった。
【００３７】
更にまた、安全性評価システム１は、整数Ｎを用いた公開鍵暗号について、この方法による素因数分解の容易さ、つまり、安全性を評価することが可能となった。また、安全性評価システム１は、解読されやすい脆弱な私有鍵ｄを検出して通知するため、脆弱な私有鍵ｄを使用しないなど、安全対策を行い、セキュリティを向上することが可能となった。
特に、公開鍵暗号に、同一のビット長で、素数の差が、一定のしきい値Ｔ以上に設定される素数を使用するように望まれている環境において、この要請に応じて、２つの素数を同一ビット数ｎ、素数の差がＴとなるように設定した場合には、前記しきい値ＴがＴ≦２＾（ｎ／２）で、公開鍵の安全性を確保するのに不十分の場合、素因数分解部１２は、容易に素因数分解することができることとなり、安全性評価システム１は、この危険性を検出し、暗号鍵を脆弱と評価して通知し、セキュリティを向上することが可能となった。
【実施例２】
【００３８】
図５は、本発明による安全性評価装置の構成を示すブロック図である。なお、前述した実施例と同様な機能を果たす部分には、同一の符号又は末尾に統一した符号を付して、重複する説明や図面を適宜省略する。また、本実施例における安全性評価装置は、暗号鍵生成装置１０−２である。
図５に示すように、暗号鍵生成装置１０−２は、素数生成部１５、安全性判定部１３−２、暗号鍵生成部１６、出力部１４−２などを備え、ＲＳＡ暗号に用いる私有鍵、公開鍵などの暗号鍵をセキュアに生成するＨＳＭ（Ｈａｒｄｗａｒｅ  Ｓｅｃｕｒｉｔｙ  Ｍｏｄｕｌｅ）などの耐タンパ性の高いコンピュータである。
【００３９】
素数生成部１５は、ビット数ｎ（５１２ビット以上）の大きな素数ｐ，ｑを生成する。素数生成部１５は、乱数を生成、確率的素数判定法、疑似素数判定法などによって素数ｐ，ｑを生成する。なお、素数ｐ，ｑを取得する方法は、限定されず、素数ｐ，ｑを取得できればよい。
暗号鍵生成部１６は、素数生成部１５で生成され、安全性判定部１３−２で安全と判定された素数ｐ，ｑに基づいて、演算を行い、ＲＳＡ暗号の私有鍵ｄ、公開鍵ｅを生成する。
出力部１４−２は、暗号鍵生成部１６によって生成された暗号鍵を外部へ出力する。
【００４０】
安全性判定部１３−２は、素数生成部１５で生成された素数ｐ，ｑを使用した暗号について、実施例１において記載されている素因数分解方法に対して安全か否かを判定し、暗号鍵の安全性を評価する。
具体的には、図６に示すように、安全性判定部１３−２は、ｎビットの各素数ｐ，ｑの上位（ｎ／２−５０）ビット（図６の下線部分）に差異があるか否かを判定し、あった場合には、安全と判定する。例えば、安全性判定部１３−２は、ｐとｑの差（｜ｐ−ｑ｜）を算出し、この値が２＾（ｎ／２＋５０）以上である場合には、安全と判定する。なお、このビット数を示す「５０」の値は任意であって、大きな値とすればするほど、安全性は高くなるが、大きすぎれば、他の素因数分解方法によって容易に素因数分解される可能性もあるため、計算量的に安全と言える最低限の値を設定することが望ましい。本実施例において設定されている値「５０」であれば、実施例１におけるｋの値が２の１００乗程度となり、現在のコンピュータの処理能力では、計算量的に安全と考えられる。
【００４１】
図７は、本発明による安全性評価装置の動作及び安全性評価プログラムを示すフローチャートであって、暗号鍵の生成における安全性評価処理を示している。
Ｓ３１０において、素数生成部１５は、素数ｐ，ｑを生成する。安全性判定部１３−２は、このｐ，ｑの差ｇを算出し（Ｓ３２０）、差ｇが２＾（ｎ／２＋５０）以上であるか否かを判定する（Ｓ３３０）。否と判定した場合には、この素数ｐ，ｑを廃棄し、素数生成部１５は、新たに素数ｐ，ｑを生成し、Ｓ３３０において肯と判定するまで同様の処理を繰り返す（Ｓ３１０，Ｓ３２０，Ｓ３３０）。Ｓ３３０において肯と判定した場合には、暗号鍵生成部１６は、この素数ｐ，ｑを元に私有鍵、公開鍵などの暗号鍵を生成する。暗号鍵生成装置１０−２は、生成した暗号鍵を外部へ出力し（Ｓ３５０）、ＩＣカードなどの暗号鍵保持媒体に格納し、処理を終了する（Ｓ３６０）。
【００４２】
このように、本実施例によれば、実施例１と同様の効果に加え、安全性判定部１３−２は、素数ｐ，ｑの差が２＾（ｎ／２＋５０）以上であるか否かに基づいて安全か否かの判定を行うため、簡易な処理で暗号鍵の安全性の評価を行うことが可能となった。
従って、この安全性判定部１３−２を、ＩＣカードなど、処理に制限のかかる情報処理装置においても設けることができるとともに、実現にかかる負担が少なく、汎用性、実現性の向上を図ることが可能となった。
【実施例３】
【００４３】
図８は、本発明による素因数分解装置、安全性評価装置の構成を示すブロック図である。なお、本実施例における素因数分解装置及び安全性評価装置は、素因数分解部１２−３及び安全性評価装置１０−３である。
図８に示すように、安全性評価装置１０−３は、ＣＰＵ、メモリ、入出力装置などを備えるコンピュータであって、入力部１１−３、素因数分解部１２−３、安全性判定部１３−３、ディスプレイ１４などを備えている。安全性評価装置１０−３は、素因数分解の困難性に暗号の安全性が依存する暗号方式において、入力する公開鍵Ｎに基づいて暗号の安全性を評価する。
入力部１１−３は、整数Ｎ（＝ｐ＊ｑ）を外部から入力する。入力部１１−３は、ＩＣカードから整数Ｎを入力するＲ／Ｗであっても、整数Ｎを手入力するキーボードであってもよく、整数Ｎの値を入力できれば入力方法は限定されない。
【００４４】
素因数分解部１２−３及び安全性判定部１３−３は、ＣＰＵがメモリに記憶されているプログラムを実行することによって実現される。
素因数分解部１２−３は、リーマン法を利用した所定のアルゴリズムに基づいて演算を行い、入力部１１−３から入力された整数Ｎを素因数分解する。
安全性判定部１３−３は、因数分解部１２−３の処理結果に基づいて、公開鍵Ｎを用いた暗号の安全性について判定を行う。
なお、フェルマー法は、合成数（素因数分解の対象となる整数）をＮとした場合に、Ｎ＝ｐ＊ｑ＝（Ｓ＋ａ）＊（Ｓ−ａ）＝Ｓ2−ａ2から、「Ｓ」（初期値は、√Ｎの整数部分に１を加えた数（Ｓ＝ｃｅｉｌｉｎｇ（√Ｎ））の値を漸次増加させて、「ａ」が整数となる値を求め、因数分解する方法である。
【００４５】
リーマン法とは、フェルマー法を利用した素因数分解方法であって、Ｋ＝ｒ＊ｓ、Ｘ＝Ｋ＊Ｎ＝（ｒ＊ｐ）＊（ｓ＊ｑ）＝（Ｓ＋ａ）＊（Ｓ−ａ）＝Ｓ2−ａ2、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とした場合に、「Ｓ」及び「Ｋ」の値を漸次変化させ、「ａ」が整数となる値を求め、
ｐ＝ｇｃｄ（（ｒ＊ｐ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ＋ａ，Ｎ）
ｑ＝ｇｃｄ（（ｓ＊ｑ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ−ａ，Ｎ）
に基づいて、素因数ｐ，ｑを求め、因数分解する方法である。なお、「ｇｃｄ（Ａ，Ｂ）」は、Ａ及びＢの最大公約数を求める関数である。
図９に示すように、リーマン法においては、Ｋの値を最小値（ＭｉｎＬｉｍ）とし、Ｓの値をｃｅｉｌｉｎｇ（√Ｘ）からｃｅｉｌｉｎｇ（√Ｘ）＋（ 6√Ｎ／（４＊√Ｋ））程度まで変化させ（Ａ１０）、「ａ」が整数となる値を検索し、発見できなければ、Ｋの値をＭｉｎＬｉｍから「１」増加させ（Ａ２０）、同様に、Ｓの値を変化させて「ａ」が整数となる値を検索し（Ａ１０）、Ｋの値が設定値ＭａｘＬｉｍとなるまで同様の処理を繰り返す（Ａ２０）。
【００４６】
なお、「ｄｅｐｔｈ」（深度）、ＭｉｎＬｉｍ及びＭａｘＬｉｍは、素因数分解の試行範囲を制限するための閾値である。「ｄｅｐｔｈ」は、変数「Ｓ」の変化する範囲であり、１以上に設定することが可能な設定値であり、ＭｉｎＬｉｍ（最小値）及びＭａｘＬｉｍ（最大値）は、変数「Ｋ（＝ｒ＊ｓ）」の変化する範囲を制限する設定値である。また、図９において、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）を直線で示しているが、これは、便宜上であって、実際には、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）＝ｃｅｉｌｉｎｇ（√（Ｋ＊Ｎ））であり、Ｋの値の変化とともに、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）の値も変化する（図１１において同じ。）。Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）＋（ 6√Ｎ／（４＊√Ｋ））についても同様である（図１１において同じ。）。
素因数分解の試行範囲（図９のＡ３０）が広くなれば、大半の「Ｎ」を素因数分解することが可能となるが、計算量が多くなって処理時間が長くなる。
【００４７】
図１０は、本発明による素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。
図１０に示すように、入力部１１−３は、ｐ，ｑという二つの素数の積である整数Ｎ、設定値ｄｅｐｔｈ、ＭｉｎＬｉｍ及びＭａｘＬｉｍなどを入力し（Ｓ４１０）、素因数分解部１２−３は、入力した整数Ｎについて素因数分解を行う。
Ｋ（＝ｒ＊ｓ）の初期値をＭａｘＬｉｍとし（Ｓ４２０）、Ｘ＝Ｋ＊Ｎ、ｄの初期値を０（ゼロ）とし、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とする（Ｓ４３０）。
素因数分解部１２−３は、ａ＝√（Ｓ＊Ｓ−Ｘ）を演算し（Ｓ４４０）、ａの値が整数であるか否かを判定する（Ｓ４５０）。
整数である場合には、Ｘ＝Ｓ2−ａ2＝（Ｓ＋ａ）＊（Ｓ−ａ）＝Ｋ＊Ｎ＝（ｒ＊ｐ）＊（ｓ＊ｑ）より、素因数分解部１２−３は、
ｐ＝ｇｃｄ（（ｒ＊ｐ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ＋ａ，Ｎ）
ｑ＝ｇｃｄ（（ｓ＊ｑ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ−ａ，Ｎ）
に基づいて、素因数ｐ，ｑを求める（Ｓ５２０）。
【００４８】
一方、Ｓ４４０において算出したａの値が整数でない場合であって、ｄ＜ｄｅｐｔｈのときには、素因数分解部１２−３は、ｄ及びＳにそれぞれ１を加算して（Ｓ４５０，Ｓ４６０，Ｓ４７０）、Ｓ４４０からの処理を繰り返す。また、ｄ≧ｄｅｐｔｈの場合には、Ｋから１を減算する（Ｓ４６０，Ｓ４８０）。減算した結果、Ｋが下限値（ＭｉｎＬｉｍｉｔ）よりも小さい場合には、素因数分解部１２−３は、Ｎの素因数分解の結果が出ないまま処理を中止する（Ｓ４９０，Ｓ５００）。減算した結果、Ｋが下限値以上である場合には、Ｓ４３０からの処理を繰り返す（Ｓ４９０）。
【００４９】
安全性判定部１３−３は、素因数分解部１２−３の処理結果に基づいて暗号鍵の安全性を評価する。つまり、Ｋの上限値内及びＳの設定範囲内で整数のａが算出できた場合（Ｓ５２０）には、入力したＮを公開鍵とする秘密鍵を脆弱と判定し（Ｓ５３０）、算出できない場合（Ｓ５００）には、安全と判定する（Ｓ５１０）。安全性評価装置１０−３は、ディスプレイ１４に安全性の評価結果を表示し（Ｓ５４０）、処理を終了する（Ｓ５５０）。
【００５０】
（具体例）
ここで、図１０に示す処理を具体的に説明する。
入力部１１−３から以下のデータを入力する（Ｓ４１０，Ｓ４２０）。
Ｎ＝２９９５３２７
Ｋ＝ＭａｘＬｉｍ＝３６
ｄｅｐｔｈ＝１
素因数分解部１２−３は、「Ｘ」、「Ｓ」及び「ａ」の値を算出する（Ｓ４３０，Ｓ４４０）。
Ｘ＝ｋ＊Ｎ＝３６＊２９９５３２７＝１０７８３１７７２
ｄ＝０
Ｓ＝ｃｉｅｌｉｎｇ（√１０７８３１７７２）＝１０３８５
ａ＝√（Ｓ＊Ｓ−Ｘ）＝１２８．２６・・・
【００５１】
ａは、整数でなく、ｄ＝０＜ｄｅｐｔｈ＝１であるため、ｄ＝１，Ｓ＝１０３８６としてＳ４４０へ戻る（Ｓ４５０，Ｓ４６０，Ｓ４７０）。
素因数分解部１２−３は、「ａ」の値を算出する（Ｓ４４０）。
ａ＝１９２．９３・・・
ａは、整数でなく、ｄ＝１＝ｄｅｐｔｈ、Ｋ＜ＭｉｎＬｉｍｉｔであるため、Ｋ＝３５としてＳ４３０に戻る（Ｓ４５０，Ｓ４６０，Ｓ４８０，Ｓ４９０）
素因数分解部１２−３は、「Ｘ」、「Ｓ」及び「ａ」の値を算出する（Ｓ４３０，Ｓ４４０）。
Ｘ＝３５＊２９９５３２７＝１０４８３６４４５
なお、Ｋを変数とする代わりに、ループごと（Ｓ４８０，Ｓ４９０，Ｓ４３０）に今までのＸの値からＮを減算し、新たなＸの値としてもよい。
【００５２】
ｄ＝０
Ｓ＝ｃｉｅｌｉｎｇ（√１０４８３６４４５＝１０２３９
ａ＝２６
ａは、整数であり、素因数分解部１２−３は、Ｎ（＝ｐ＊ｑ）を以下の様に素因数分解する。
ｐ＝ｇｃｄ（１０２３９＋２６，２９９５３２７＝２０５３
ｑ＝ｇｃｄ（１０２３９−２６，２９９５３２７）＝１４５９
また、安全性判定部１３−３は、設定値（ＭａｘＬｉｍ，ＭｉｎＬｉｍ，ｄｅｐｔｈ）の範囲内で素因数分解が成功したため、公開鍵がＮ＝２９９５３２７に対応する秘密鍵が脆弱と判定する（Ｓ５３０）。
【００５３】
このように本実施例によれば、素因数分解部１２−３は、図１１に示すように、ＭａｘＬｉｍからＭｉｎＬｉｍの方向へＫの値を変化させて素因数分解するため（Ａ１２０）、整数Ｎを素因数分解可能なＫの値が大きい場合に、リーマン法と比較して容易にＫを見つけだし、Ｎを素因数分解することが可能となった。特に、「ｄｅｐｔｈ」をリーマン法と比較して小さな値（浅い深度）、また、ＭａｘＬｉｍを大きい値に設定することによって、試行範囲を拡げずに、つまり、処理時間を長期化せずに、素因数分解可能なＫの値が大きい整数Ｎを、容易に素因数分解することが可能となった。
従って、不正者が意図的に、素因数分解可能なＫの値が大きい整数Ｎを公開鍵とする暗号鍵を生成し、認証用の暗号鍵として仕込むなどした場合には、従来のリーマン法では、その脆弱性を発見することが困難であったが、本実施例によれば、この脆弱性を発見することが可能となった。
【実施例４】
【００５４】
図１２は、本発明による素因数分解装置、安全性評価装置の構成を示すブロック図である。なお、本実施例における素因数分解装置及び安全性評価装置は、素因数分解部１２−４及び安全性評価装置１０−４である。
図１２に示すように、安全性評価装置１０−４は、入力部１１−３、素因数分解部１２−４、安全性判定部１３−４、ディスプレイ１４など、実施例３における安全性評価装置１０−３と略同様の構成を備え、暗号の安全性が素因数分解の困難性に依存する暗号方式における暗号鍵の安全性を評価するコンピュータシステムである。
素因数分解部１２−４及び安全性判定部１３−４は、ＣＰＵがメモリに記憶されているプログラムを実行することによって実現され、実施例３における素因数分解部１２−３及び安全性判定部１３−３と略同様の機能を備えている。
素因数分解部１２−４は、入力部１１−３から入力される公開鍵Ｎについて、他のｍ個の公開鍵Ｎi （＝ｐi ＊ｑi ：ｉ番目の公開鍵。１≦ｉ≦ｍ）にを利用して素因数分解を行う。
また、安全性判定部１３−４は、因数分解部１２−４の処理結果に基づいて、公開鍵Ｎに対応する秘密鍵の安全性について判定を行う。
【００５５】
図１３は、本発明による素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。なお、「ｄｅｐｔｈ」（深度）は、実施例３と同様、変数「Ｓ」の変化する範囲を制限する変数「ｄ」の上限値である。また、「ｍ」は、公開鍵Ｎを素因数分解するために利用する他の公開鍵Ｎi の数であり、実施例３における「Ｋ」と同様の役割を果たし、ｍの値が大きいほど、処理時間が長くなる。以下、実施例３の図１０における処理と異なる処理について説明する。
図１３に示すように、入力部１１−３は、安全性を判定する対象となる公開鍵Ｎ、以前に生成した他のｍ個の公開鍵Ｎi （１≦ｉ≦ｍ）、設定値などを入力する（Ｓ６１０）。
素因数分解部１２−４は、ｉの初期値を１、Ｘ＝Ｎ＊Ｎi 、ｄの初期値を０（ゼロ）とし、Ｓ＝ｃｅｉｌｉｎｇ（√Ｘ）とする（Ｓ６２０，Ｓ６３０）。
素因数分解部１２−４は、ａ＝√（Ｓ＊Ｓ−Ｘ）を演算し（Ｓ６４０）、ａの値が整数である場合には、Ｘ＝Ｓ2−ａ2＝（Ｓ＋ａ）＊（Ｓ−ａ）＝Ｎi ＊Ｎ＝（ｑi ＊ｐ）＊（ｐi ＊ｑ）より、素因数分解部１２−３は、
ｐ＝ｇｃｄ（（ｑi ＊ｐ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ＋ａ，Ｎ）
ｑ＝ｇｃｄ（（ｐi ＊ｑ），（ｐ＊ｑ））＝ｇｃｄ（Ｓ−ａ，Ｎ）
に基づいて、素因数ｐ，ｑを求める（Ｓ７２０）。
また、素因数分解部１２−３は、
ｐi ＝ｇｃｄ（（ｑ＊ｐi ），（ｐi ＊ｑi ））＝ｇｃｄ（Ｓ−ａ，Ｎi ）
ｑi ＝ｇｃｄ（（ｐ＊ｑi ），（ｐi ＊ｑi ））＝ｇｃｄ（Ｓ＋ａ，Ｎi ）
に基づいて、素因数ｐi ，ｑi を求める（Ｓ７２０）。
【００５６】
Ｓ６４０において算出したａの値が整数でない場合であって、ｄ≧ｄｅｐｔｈのときには、ｉに１を加算し（Ｓ６５０，Ｓ６６０，Ｓ６８０）、加算した結果、ｉがｍよりも大きい場合には、素因数分解部１２−４は、Ｎの素因数分解の結果が出ないまま処理を中止する（Ｓ６９０，Ｓ７００）。加算した結果、Ｋがｍ以下である場合には、Ｓ６３０からの処理を繰り返す（Ｓ６９０）。
【００５７】
安全性判定部１３−４は、実施例３と同様に、Ｓの設定範囲内及びｍの上限値内で整数のａが算出の可否に応じて、暗号を脆弱又は安全と判定する（Ｓ７００〜Ｓ７３０）。何故なら、Ｎにおけるｒ、ｓの値と、Ｎi におけるｒ，ｓの値（以下、それぞれ「ｒi 」，「ｓi 」という。）が同一である場合に、素因数分解が成功するからである。
以下、ｒ＝ｒi 及びｓ＝ｓi の場合に、素因数分解が成功することを証明する。
実施例１における素因数分解の方法を用いて、整数Ｘ（＝Ｋ＊Ｎ）を容易にｒｐ，ｓｑに因数分解するための条件は、ｒｐ及びｓｑの差が２＾（ｎ／２）以下（ｎは、「Ｘ」のビット数）のときとなる。
つまり、ｒｐ−ｓｑ≦２＾（ｎ／２）が成り立つことが、条件となる。
従って、図１３における因数分解が成功するためには、以下の式が成り立つことが条件となる。
【数１】
2006072336.tif 000003
式＃４１０及び式＃４２０の両辺を掛け合わせると、以下の式が導かれる。
【数２】
2006072336.tif 000004
従って、Δ≒Ｓならば、ｐ≒√Ｘより、pqi−qpi≒√Ｘ≒２＾（ｎ／２）であることが証明される。
よって、
【数３】
2006072336.tif 000005
【００５８】
また、ここで、特定のｒ，ｓを与えられた場合に、ｒｐ−ｓｑ＝ΔがＳと同じ規模になるｐ，ｑを生成することが可能であることを説明する。
Ｇ（ｎ）は、ｎより小さい隣り合わせである二つの素数の一番大きい差であり、
Ｇ（ｎ）≒［Ｉｎ（ｎ）］2 
が成り立つ。
最初に、素数ｐを生成します。これは任意に選択可能である。
Δが最小限になる（Ｎ＝ｐ＊ｑの因数分解が簡単になる）ｑを生成するには、ｒｏｕｎｄ（ｒ＊ｐ／ｓ）に最も近い素数ｑを探せばよい。
そこで、ｑをｒｏｕｎｄ（ｒ＊ｐ／ｓ）より小さい最も近い素数と定義した場合に、Δが最も小さくなるのは、ｑ＝ｒｏｕｎｄ（ｒ＊ｐ／ｓ）のときである。一方、Δが最も大きくなる場合は、ｑ≒ｒｏｕｎｄ（ｒ＊ｐ／ｓ）−Ｇ（ｒｏｕｎｄ（ｒ＊ｐ／ｓ）である。
上記事実を検討してΔの最大値を計算すると、
【数４】
2006072336.tif 000006
結論として、下記の式が導かれる。
【数５】
2006072336.tif 000007
１０２４ビットの暗号鍵を扱う場合には、上記Δ/sの値はおよそ３５０2程度であり、因数分解に大きな支障を与えるものではないので、脆弱な鍵が生成されることがこの方法で可能であることが示される。
【００５９】
（具体例）
ここで、図１３に示す処理を具体的に説明する。
入力部１１−３から以下のデータを入力する（Ｓ６１０，Ｓ６２０）。
Ｎ＝５０９３３６９，Ｎ1 ＝２９２８３１３１・・・・，Ｎm 
素因数分解部１２−３は、「Ｘ」、「Ｓ」及び「ａ」の値を算出する（Ｓ６３０，Ｓ６４０）。
Ｘ＝Ｎ＊Ｎ1 ＝５０９３３６９＊２９２８３１３１＝１４９１４９７９１６５８３３９
ｄ＝０
Ｓ＝ｃｉｅｌｉｎｇ（√Ｘ）＝１２２１２６９０
ａ＝√（Ｓ＊Ｓ−Ｘ）＝２３１９
【００６０】
ａは、整数であるため、素因数分解部１２−４は、Ｎ（＝ｐ＊ｑ）、Ｎ1 （＝ｐ1 ＊ｑ1 ）を以下の様に素因数分解する（Ｓ６５０，Ｓ７２０）。
ｐ＝ｇｃｄ（１２２１２６９０＋２３１９，５０９３３６９）＝３４９１
ｑ＝ｇｃｄ（１２２１２６９０−２３１９，５０９３３６９）＝１４５９
ｐ1 ＝ｇｃｄ（１２２１２６９０−２３１９，２９２８３１３１）＝８３６９
ｑ1 ＝ｇｃｄ（１２２１２６９０＋２３１９，２９２８３１３１）＝３４９９
また、安全性判定部１３−４は、設定値の範囲内で素因数分解が成功し、公開鍵Ｎのｒ，ｓが、以前に生成した公開鍵Ｎ1 のものと同一であるため、公開鍵Ｎを用いる暗号が脆弱と判定する（Ｓ７３０）。
【００６１】
このように本実施例によれば、素因数分解部１２−４は、異なる二つの公開鍵Ｎ，Ｎ1 を掛け合わせて、その積を因数分解するため、Ｎを素因数分解可能なｒ，ｓの値が解らなくても、二つの公開鍵Ｎ，Ｎ1 が同一のｒ，ｓで素因数分解可能であるかどうかを検出することが可能となった。従って、Ｎを素因数分解可能なＫ，ｒ，ｓの値が大きいときに容易にＮを素因数分解することが可能となった。
よって、不正者が意図的に、素因数分解可能なｒ，ｓの値が同一の整数Ｎ，Ｎ1 を公開鍵とする暗号鍵を生成し、認証用の暗号鍵として仕込むなどした場合には、従来の方法では、その脆弱性を発見することが困難であったが、本実施例によれば、この脆弱性を容易に発見することが可能となった。
【実施例５】
【００６２】
図１４は、本発明による安全性評価装置の構成を示すブロック図である。なお、本実施例における安全性評価装置は、安全性評価装置１０−５である。
図１４に示すように、安全性評価装置１０−５は、入力部１１−３、安全性判定部１３−４、ディスプレイ１４など、実施例３における安全性評価装置１０−３と略同様の構成を備え、暗号の安全性が素因数分解の困難性に依存する暗号方式における暗号鍵の安全性を、入力する公開鍵Ｎに基づいて暗号の安全性を評価するコンピュータシステムである。
【００６３】
安全性判定部１３−５は、ＣＰＵがメモリに記憶されているプログラムを実行することによって実現される。安全性判定部１３−５は、入力された素数ｐ，ｑについて拡張ユークリッドアルゴリズムを利用した演算を行い、演算結果に基づいて、暗号の安全性を判定する。
【００６４】
ここで拡張ユークリッドアルゴリズムについて説明する。
正数ａ及びｂについてａ＊ｘ＋ｂ＊ｙ＝ｇｃｄ（ａ，ｂ）となる整数ｘ及びｙが存在する。また、ａ及びｂが互いに素である場合には、ｇｃｄ（ａ，ｂ）＝１であり、ａ＊ｘ＋ｂ＊ｙ＝１を満たすｘ及びｙが存在する根拠となる。拡張ユークリッドの互除法は、ｇｃｄ（ａ，ｂ）（ａ及びｂ（ａ＞ｂ）の最大公約数）を求めるとともに、ｘ，ｙを決定する方法であり、以下のような手順で計算が行われる。
ａ＊ｘn-2 ＋ｂ＊ｙn-2 ＝ｚn-2 
ａ＊ｘn-1 ＋ｂ＊ｙn-1 ＝ｚn-1 
初期値を（ｘ1 ，ｙ1 ，ｚ1 ）＝（１，０，ａ）、（ｘ2 ，ｙ2 ，ｚ2 ）＝（０，１，ｂ）とし、以下の式をｚn-1 が０になるまで繰り返す。そのときの（ｘn-2 ，ｙn-2 ，ｚn-2 ）が求めたい（ｘ，ｙ，ｇｃｄ（ａ，ｂ））となる。
（ｘn ，ｙn ，ｚn ）＝（ｘn-2 ，ｙn-2 ，ｚn-2 ）−ｆｌｏｏｒ（ｚn-2 ／ｚn-1 ）＊（ｘn-1 ，ｙn-1 ，ｚn-1 ）
なお、関数ｆｌｏｏｒ（Ａ）は、Ａの小数点以下の数値を切り捨て、Ａを整数の値とする関数である。
【００６５】
安全性判定部１３−５は、ａｘ＋ｂｙ＝ｇｃｄ（ａ，ｂ）を、ｐｒ−ｑｓ＝ｇｃｄ（ｐ，ｑ）とし、（ｒn ，ｓn ，ｚn ）＝（ｒn-2 ，ｓn-2 ，ｚn-2 ）−ｆｌｏｏｒ（ｚn-2 ／ｚn-1 ）＊（ｒn-1 ，ｓn-1 ，ｚn-1 ）などの拡張ユークリッドアルゴリズムの互除法に基づいて、｜ｒ＊ｐ−ｓ＊ｑ｜＜√ｐ，√ｑ≒ 4√Ｎとなるまで、つまり、ｚn-1 が閾値よりも小さくなるまで、繰り返し部分の処理を行い、ｒ，ｓを算出する。ｚn-1 の閾値を、√ｐ，√ｑ≒ 4√Ｎとなるよりも小さくなるまでとしたのは、Ｘの因数ｒ＊ｐ，ｓ＊ｑの差が小さい場合には、実施例１、実施例２のように、容易に因数分解することができることとなるからである。安全性判定部１３−５は、算出したｒ，ｓの値の大小に基づいて安全性を判定する。つまり、ｒ，ｓの値が小さければ、Ｘの因数分解より算出したｒ＊ｐ，ｓ＊ｑの値より、しらみつぶしに当て嵌めていけば、ｐ，ｑの値を算出することが可能となり、公開鍵Ｎから素因数ｐ，ｑへの素因数分解が容易となり、安全性は、否定される。
【００６６】
図１５は、本発明による安全性評価装置の動作及び安全性評価プログラムを示すフローチャートである。なお、「ｔｈｒｅｓｈｏｌｄ（＝ｓａｆｅｔｙＦａｃｔｏｒ＊ 4√Ｎ））」及び「ｓａｆｅｔｙＦａｃｔｏｒ」は、閾値であり、任意に設定することが可能である。「ｓａｆｅｔｙＦａｃｔｏｒ」は、最小値が１であって、上限は、 4√Ｎ、適切な値は、２32〜２64程度である。
図１５に示すように、Ｓ８１０において、入力部１１−３は、暗号鍵の素数ｐ，ｑ、ｓａｆｅｔｙＦａｃｔｏｒの値などを入力し、安全性評価装置１０−５は、処理を開始する。安全性判定部１３−５は、入力した２つの素数のうち、大きい方をｐとする（Ｓ８３０）。
各変数の初期値を、ａ＝１，ｂ＝０、ｕ＝０，ｖ＝１、ｇ＝ｐ，ｗ＝ｑとし（Ｓ８４０）、安全性判定部１３−５は、ｗがｔｈｒｅｓｈｏｌｄよりも大きい値であるかを判定し、大きい場合には、拡張ユークリッドの互除法の繰り返し部分を計算する（Ｓ８５０，Ｓ８６０，Ｓ８７０）。
【００６７】
Ｓ８５０におけるループの条件「ｗ＞ｔｈｒｅｓｈｏｌｄは、｜ｒ＊ｐ−ｓ＊ｑ｜＜√ｐ，√ｑ≒ 4√Ｎとなるようなｓ，ｒが見つかるまで、同様の処理を繰り返させるものである（Ｓ８５０）。安全性判定部１３−５は、ｆｌｏｏｒ（ｇ／ｗ）を算出し、ｑｕｏｔｉｅｎｔの値とする（Ｓ８６０）。関数ｆｌｏｏｒ（Ａ）は、Ａの小数点以下の数値を切り捨て、Ａを整数の値とする関数である。
また、安全性判定部１３−５は、このｑｕｏｔｉｅｎｔの値と、
ｕ＝ａ−ｑｕｏｔｉｅｎｔ＊ｕ、
ｖ＝ｂ−ｑｕｏｔｉｅｎｔ＊ｖ、
ｗ＝ｇ−ｑｕｏｔｉｅｎｔ＊ｗ
とに基づいて、ｕ，ｖ，ｗの値を算出する。更に、安全性判定部１３−５は、ａ＝ｕ、ｂ＝ｖ、ｇ＝ｗとする（Ｓ８７０）。なお、Ｓ８７０において「＝」の右側にある値は、全てＳ８７０の演算前の値を用いる。Ｓ８７０の演算後、安全性判定部１３−５は、Ｓ８５０から同様の処理を繰り返す。
一方、Ｓ８５０において、ｗがｔｈｒｅｓｈｏｌｄ以下の値である場合には、安全性判定部１３−５は、ａ，ｂの値、つまり、ｒ，ｓの値と、閾値とを比較する（Ｓ８８０）。
安全性判定部１３−５は、ａ＊ｂの絶対値、つまり、Ｋの値が閾値（ｋ＊ｔｈｒｅｓｈｏｌｄ）よりも大きい場合には、安全と判定し、閾値よりも小さい場合には、脆弱と判定し（Ｓ８９０，Ｓ９００）、ディスプレイ１４に判定結果を表示し（Ｓ９１０）、処理を終了する（Ｓ９２０）。
【００６８】
（具体例）
ここで、図１５に示す処理を具体的に説明する。
入力部１１−３から以下のデータを入力する（Ｓ８１０）。
ｐ＝２０５３，ｑ＝１４５９、ｓａｆｅｔｙＦａｃｔｏｒ＝２
なお、ｐは、ｑのｎｅｘｔｐｒｉｍｅであって、ｐ≒ｑ＊（７／５）である。
安全性判定部１３−５は、各初期値を、ａ＝１，ｂ＝０，ｇ＝ｐ，ｕ＝０，ｖ＝１，ｗ＝ｑとし（Ｓ８４０）、ｗ≦ｔｈｒｅｓｈｏｌｄとなるまで、拡張ユークリッドの互除法の繰り返し部分を計算する（Ｓ８５０，Ｓ８６０，Ｓ８７０）。計算結果は、以下の表のようになる。
【００６９】
【表１】
2006072336.tif 000008
【００７０】
表に示すように、３回繰り返し部分を計算した場合に、ｗ＝５２＞ｔｈｒｅｓｈｏｌｄ＝ｓａｆｅｔｙＦａｃｔｏｒ＊ 4√Ｎ＝８２となり、ループを脱出する（Ｓ８５０）。
安全性判定部１３−５は、Ｋ＝｜ａ＊ｂ｜＝｜−２＊３｜＝６に基づいて、暗号は脆弱であると判定する（Ｓ８８０，Ｓ９００）。つまり、Ｋの値が小さいため、実施例１、リーマン法などの方法を用いて、Ｎを容易に素因数分解することができると判定する（図９参照。）。
【００７１】
このように本実施例によれば、入力したｐ，ｑに基づいて、容易に素因数分解可能なｒ，ｓの値を算出することが可能となった。従って、不正者が、素因数分解可能なｒ，ｓに偏りのある公開鍵Ｎを生成し、認証用の暗号鍵として仕込むなどした場合には、従来の方法では、その脆弱性を発見することが困難であったが、本実施例によれば、この脆弱性を容易に発見することが可能となった。
【００７２】
（変形例）
以上説明した実施例に限定されることなく、種々の変形や変更が可能であって、それらも本発明の均等の範囲内である。例えば、実施例１において、素因数分解部１２は、図１６に示すような方法で素因数分解を行ってもよい。
図１６に示すように、ｓをＮの平方根に近い整数とし（＃１１０）、ｐ＝ｓ＋ｂ＋ａ、ｑ＝ｓ＋ｂ−ａとすると、
Ｎ＝ｓ2 ＋２＊ｓ＊ｂ＋（ｂ2 −ａ2 ）となる（＃１２０）。
Ｎをｓで割ったときの剰余をｒとすると、
ｒ＝Ｎｍｏｄｓ＝（ｂ2 −ａ2 ）ｍｏｄｓ
＝（ｂ2 −ａ2 ）＋ｋ＊ｓとなる（＃１３０）。
また、ｃ＝ｂ2 −ａ2 ＝ｒ−ｋ＊ｓ（ｋは、整数。）とすると、
＃１２０の式は、ｂ＝（Ｎ−ｓ2 −（ｒ−ｋ＊ｓ））／（２＊ｓ）となる（＃１５０）。
（ｂ2 −ａ2 ）＜０であるため、｜ｂ2 −ａ2 ｜＜ｓと仮定した場合には、ｋ＝１、ｃ＝ｒ−ｓとなり（＃１４０）、＃１５０からｂを求めることができ、ａ＝√（ｂ2 −ｃ）、ｐ＝ｓ＋ｂ＋ａ、ｑ＝ｓ＋ｂ−ａから、ａ、ｐ，ｑを算出することが可能となる（＃１８０，＃２００）。つまり、０＜（ｂ2 −ａ2 ）＜ｓが成り立つ素数ｐ，ｑに基づいて生成された暗号鍵は、極めて脆弱と判定される。
一方、（ｂ2 −ａ2 ）≦０、（ｂ2 −ａ2 ）≧ｓの場合には、ｋ＝１とした演算の結果、ａ又はｂが整数とならず、ｂが整数とならないときには、ｋに１を加算し（＃１６０）、ａが整数とならないときには、ｋに２を加算し（＃１７０）、ａ及びｂの値が整数となるまで（＃２００）、又は、ｋが所定の上限値（Ｌｉｍｉｔ）を超えるまで（＃１９０）、同様の処理を繰り返す。
整数のａ及びｂを算出できた場合には、ｐ＝ｓ＋ｂ＋ａ、ｑ＝ｓ＋ｂ−ａから、素因数ｐ，ｑが算出される（＃２００）。素因数分解の結果は、実施例１における素因数分解（図３参照。）と同様に、図１７のようになる。図１７に示すように、Ｎ＝８２６５１３など、ｋの値が１から離れている場合には、処理回数が実施例１における素因数分解の演算回数よりも少なくなる。
【００７３】
実施例１において、安全性評価装置１０は、ＩＣカード２０から整数Ｎを読み出しているが、整数Ｎの取得方法は限定されない。
【００７４】
実施例１において、ＩＣカード２０から秘密鍵ｄ、公開鍵ｅ、整数Ｎを取得することができる場合に、以下に説明するように、素因数分解部１２は、ｐ，ｑの差の大きさを示すａの値を算出し、安全性判定部１３は、実施例２の安全性判定部１３−２のように、このａの値に基づいて安全性の判定を行ってもよい。
図１８に示すように、Ｘ＝ｅ＊ｄ−１とし（＃３１０）、φ＝Ｘ／ｆとする（＃３２０）。ｆは、１＜ｆ＜ｅの整数であって、本実施例における初期値は、ｆ＝ｅ−１である。
素因数分解部１２は、ｓ＝（ｐ＋ｑ）／２＝（Ｎ−φ＋１）／２からｓを算出し、（＃３３０）、ｐ＝ｓ＋ａ、ｑ＝ｓ−ａ、Ｎ＝ｐ＊ｑ＝（ｓ＋ａ）（ｓ−ａ）に基づいてａを算出する（＃３４０）。
＃３３０において算出したｓがｓ＾２≦Ｎである場合、又は、＃３４０において算出したａが整数でない場合には、ｆをｆ−１とし（＃３５０）、＃３４０において算出したａが整数となるまでｆを順次替えて同様の処理を繰り返す（＃３２０から＃３５０まで）。
安全性判定部１３は、算出したａの値、つまり素因数ｐ，ｑの差の大きさと、しきい値（Ｌｉｍｉｔ）との比較に基づいて安全性を判定する（＃３６０，＃３７０）。
【００７５】
例えば、ｅ＝１１、ｄ＝１２３７１、Ｎ＝２２９８７を取得した場合には、
ｘ＝１１＊１２３７１−１＝１３６０８０
ｋ＝６としたときに、
φ＝１３６０８０／６＝２２６８０
ｓ＝１５４
ａ＝√（１５４＾２−２２９８７）＝２７
ｐ＝１８１、ｑ＝１２７となる。
なお、ｋには、大きい候補値（ｅに近い候補値）から順に当て嵌めて演算を行った方が演算の繰り返しを少なくすることが可能となる。
【００７６】
実施例２において、安全性判定部１３−２は、素数ｐ，ｑの差が２＾（ｎ／２＋５０）以上であるか否かに基づいて安全か否かの判定を行っているが、この「５０」の値は、任意であって、求める安全性に応じて設定することが可能である。また、暗号鍵生成装置１０−２は、要求される安全性の高低の指示を外部から入力する入力部を備え、この指示に応じてしきい値を設定してもよく、素数ｐ，ｑのビット数に応じた値を設定してもよい。
【００７７】
実施例２において、安全性判定部１３−２は、素数ｐ，ｑの差が２＾（ｎ／２＋５０）以上であるか否かに基づいて安全か否かの判定を行っているが、差を求めずに、ｐ，ｑの各々最上位バイトから下位バイトへ向かって順に１バイトずつなど、処理単位となる情報単位ごとの比較を反復して行い、上位（ｎ／２−５０）ビットまでに相違があった場合に安全と判定してもよい。素数ｐ，ｑは大きな整数であるため、ｐ，ｑの差（｜ｐ−ｑ｜）を計算するための計算リソース上の負担を軽減することが可能となる。
ｎビットの素数ｐ，ｑの相違箇所が上位ｎ／２ビットのいずれの位置にあるか、つまり、上位ｎ／２ビットにおける差の大きさに基づいて、安全性を評価することができれば、その方法は限定されない。
【００７８】
実施例２において、安全性判定部１３−２は、実施例１におけるａ，ｂの値を素数ｐ，ｑ（同一のビット数でなくともよい。）から算出し、０＜ａｂ＜ｋｓの場合に、脆弱と判定してもよい。なお、ｋは、暗号鍵に対して求める安全性、安全性判定部１３−２の計算能力、計算に与えられた時間などに応じて任意に設定することが可能なしきい値である。例えば、ｋが小さい値であれば、求める安全性は、低い一方、計算量も減少し、処理の迅速化を図ることができる。しきい値ｋの値を暗号鍵に対して求める安全性、計算量などに応じて設定し、０＜ａｂ＜ｋｓに基づいて判定を行うことによって、要求する安全性、計算量などに応じた安全性の評価が可能となる。
また、実施例２において、安全性判定部１３−２が脆弱と判定した場合に、素数生成部１５は、新たに素数ｐ，ｑを生成するが、脆弱と判定した素数ｐ，ｑを元に新たな素数を生成してもよい。
【００７９】
実施例２において、ＨＳＭなど、暗号鍵を生成し、外部へ出力して他の装置へ提供する暗号鍵生成装置１０−２を安全性評価装置として記載しているが、ＩＣカードなどの暗号鍵を生成し、自身で使用する暗号鍵生成装置であってもよいし、ＨＳＭで生成された暗号鍵をＩＣカードへ書き込むＩＣカード発行機であってもよく、素数ｐ，ｑを取得することが可能な装置であれば、装置の種類は限定されない。従って、秘密鍵を格納しているＩＣカード２０が所定のプログラムをダウンロードすることによって、安全性判定部１３−２を備え、ＩＣカード２０内で安全性の評価を行ってもよい。
【００８０】
各実施例において、ＲＳＡ暗号について記述したが、Ｒａｂｉｎ暗号であってもよく、Ｎ（＝ｐ＊ｑ）又はＸ（＝（ｒ＊ｐ）＊（ｓ＊ｑ））の素因数分解に暗号鍵の安全性が依存する暗号方式であれば、暗号方式は限定されない。
【００８１】
実施例１又は実施例２において、ｓの値は、Ｎの平方根の小数点第一位を四捨五入した整数としたが、ｐ＜ｓ＜ｑの範囲でＮの平方根に近い値であればよい。例えば、Ｎ＝１９２７の場合には（図３参照。）、ｓ＝４６、４７とした場合であっても、ｐ，ｑを算出することが可能である。
【００８２】
実施例４において、入力部１１−３は、ｍ個のＮ1 をまとめて入力するが（図１３のＳ６１０）、Ｓ６９０からＳ６３０へのループがある度に、漸次対応するＮ1 を入力してもよい。
【００８３】
各実施例において、素因数分解装置、安全性評価装置は、それぞれ異なる方法で素因数分解や、安全性評価を行うが、これらの複数の方法をまとめて実行可能な素因数分解装置又は安全性評価装置であってもよい。
【図面の簡単な説明】
【００８４】
【図１】素因数分解装置、安全性評価装置の構成を示すブロック図である。（実施例１）
【図２】素因数分解プログラム及び素因数分解方法を示すフローチャートである。（実施例１）
【図３】素因数分解方法による素因数分解の演算結果を示す表である。（実施例１）
【図４】素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。（実施例１）
【図５】安全性評価装置の構成を示すブロック図である。（実施例２）
【図６】安全性判定部による安全性判定を説明する説明図である。（実施例２）
【図７】安全性評価装置の動作及び安全性評価プログラムを示すフローチャートである。（実施例２）
【図８】素因数分解装置、安全性評価装置の構成を示すブロック図である。（実施例３）
【図９】リーマン法におけるＫ，Ｓの試行範囲を説明するための図である。（実施例３）
【図１０】素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。（実施例３）
【図１１】素因数分解方法におけるＫ，Ｓの試行範囲を説明するための図である。（実施例３）
【図１２】素因数分解装置、安全性評価装置の構成を示すブロック図である。（実施例４）
【図１３】素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。（実施例４）
【図１４】本発明による安全性評価装置の構成を示すブロック図である。（実施例５）
【図１５】安全性評価装置の動作及び安全性評価プログラムを示すフローチャートである。（実施例５）
【図１６】素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。（変形例）
【図１７】素因数分解方法による素因数分解の演算結果を示す表である。（変形例）
【図１８】素因数分解装置、安全性評価装置の動作、素因数分解プログラム、素因数分解方法及び安全性評価プログラムを示すフローチャートである。（変形例）
【符号の説明】
【００８５】
１  安全性評価システム
１０，１０−３，１０−４，１０−５  安全性評価装置
１１  リーダライタ
１１−３  入力部
１２，１２−３，１２−４  素因数分解部
１３，１３−２，１３−３，１３−４，１３−５  安全性判定部
１４  ディスプレイ
１４−２  出力部
１５  素数生成部
１６  暗号鍵生成部
２０  ＩＣカード
【図１】
2006072336.tif 000009
【図２】
2006072336.tif 000010
【図３】
2006072336.tif 000011
【図４】
2006072336.tif 000012
【図５】
2006072336.tif 000013
【図６】
2006072336.tif 000014
【図７】
2006072336.tif 000015
【図８】
2006072336.tif 000016
【図９】
2006072336.tif 000017
【図１０】
2006072336.tif 000018
【図１１】
2006072336.tif 000019
【図１２】
2006072336.tif 000020
【図１３】
2006072336.tif 000021
【図１４】
2006072336.tif 000022
【図１５】
2006072336.tif 000023
【図１６】
2006072336.tif 000024
【図１７】
2006072336.tif 000025
【図１８】
2006072336.tif 000026