秘密鍵の一部(〜半分)が指定したとおりのOpenPGP RSA鍵ペア、つまり特定の文字列を生成するつもりです。このような制限のあるキーペアを生成するためのツールはありますか、それともプロトコルを調査する必要がありますか?
いくつかの暗号化の制限にもかかわらず、そのような戦略は、キーを一目で隠すために使用できます。
「RSA秘密鍵」の意味をある程度正確に定義する必要があります。
RSAには、modulus、つまり大きな整数nがあります。これは、pと呼ばれる2つの等しいサイズの素整数の積に等しくなります。 q。また、パブリック指数e(通常は小さく、PGPのコンテキストでは伝統的に65537に等しい)と対応するプライベート指数dがあります。 dのサイズはnのサイズとほぼ同じです。 dは、p-1またはq-1のいずれかを法としてとった場合にe * d = 1のようになります。
公開鍵はnとeで構成されます。公開鍵操作では、整数をeモジュロnで累乗します。秘密鍵は、逆演算の計算を可能にするものです(e-番目のルートモジュロnを見つける)。次の情報セットはすべて、e-番目のルートを抽出できるため、すべて「秘密鍵」と見なすことができます。
したがって、「RSA秘密鍵」として定義するものと、話している「半分」を決定する必要があります。
OpenPGP が何を定義するか見てみましょう。セクション5.5.3では、OpenPGPのコンテキスト内に、RSA秘密鍵の標準ストレージ形式があることがわかります。この形式では、公開鍵(nおよびe)と、d、p、が格納されます。 qおよびという値。これはpモジュロqの逆です(この値はRSAを効率的に実装するのに役立ちます。その場で再計算されますが、それを保存すると操作が速くなります)。実際には、p、q、eのすべてが設定可能です。これは、他の値がこれら3つから決定論的に計算できるためです。そしてeは伝統的に設定されており、とにかく小さいままである必要があります(効率と相互運用性のため)。したがって、プリセット値を「非表示」にするpおよびqがあります。
RSAキーの生成は、おおまかに次のように機能します。
したがって、理論的には次のようにプロセスを変更できます。
このプロセスは、少なくとも12ビットのサイズのr値を持つことができる限り機能します。そうしないと、目的の形式のプライムがまったく存在しない可能性があります。 「* 2」と「+1」は、強制的にpを奇数にするためにあります。大きな素数を偶数にすることはできません。
それを実装しているソフトウェアは知りませんが、大きな整数のライブラリと一緒に叩くのは難しいことではありません。適切なJava.math.BigInteger
を持つJavaを使用し、次に Bouncy Castle をOpenPGP形式へのエンコード部分に使用することをお勧めします。
あなたがそのようなトリックをしていることを知っている攻撃者は、あなたの隠された価値が持つどんな構造をも悪用してあなたの鍵を攻撃しようとするかもしれないことに注意してください。また、独自の暗号を実装することはめったに良い考えではありません。そして、「鍵を一目で隠す」というあなたの考えが理にかなっているかどうかについては何も言いませんでした。私はそれがどのように行われるかを示すだけです。
確かに、それは可能です。簡単だと言ってもいいでしょう。 RSAを使用している場合、pとqを選択すると、dをほぼ自由に選択できます(gcd(d、(p-1)(q-1))= 1という制限のみが適用されますが、それほど多くはありません。特に(p-1)/ 2と(q-1)/ 2が素数になるようにp、qを選択した場合は、制限があります。したがって、dを選択して、選択した特定の文字列を含めることができます。
ただし、これを行うための既存のツールはないと思います。あなたが求めているのは非常に珍しい独特の機能なので、他の誰かがあなたのためにそれをすでにコーディングしていると期待しないでください。おそらく、RSA鍵生成アルゴリズムについて少し学び、それを自分で実装する必要があります。
「CommonModulus」攻撃を思い出させます。多分あなたが考えていることではないかもしれませんが、それは考えです: http://members.tripod.com/irish_ronan/rsa/attacks.html
また、 http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing を思い出させます。
だから、いくつかの考えがあります。シャミアの秘密の共有を実装する何かを本当に探しているようです。ランダムでないデータの選択に関する警告にも注意してください。