web-dev-qa-db-ja.com

制限付きのOpenPGP鍵ペアの生成

秘密鍵の一部(〜半分)が指定したとおりのOpenPGP RSA鍵ペア、つまり特定の文字列を生成するつもりです。このような制限のあるキーペアを生成するためのツールはありますか、それともプロトコルを調査する必要がありますか?

いくつかの暗号化の制限にもかかわらず、そのような戦略は、キーを一目で隠すために使用できます。

3
user1633

「RSA秘密鍵」の意味をある程度正確に定義する必要があります。

RSAには、modulus、つまり大きな整数nがあります。これは、pと呼ばれる2つの等しいサイズの素整数の積に等しくなります。 q。また、パブリック指数e(通常は小さく、PGPのコンテキストでは伝統的に65537に等しい)と対応するプライベート指数dがあります。 dのサイズはnのサイズとほぼ同じです。 dは、p-1またはq-1のいずれかを法としてとった場合にe * d = 1のようになります。

公開鍵neで構成されます。公開鍵操作では、整数をeモジュロnで累乗します。秘密鍵は、逆演算の計算を可能にするものです(e-番目のルートモジュロnを見つける)。次の情報セットはすべて、e-番目のルートを抽出できるため、すべて「秘密鍵」と見なすことができます。

  • nおよびd
  • pqおよびd
  • pqd mod p-1d mod q-1
  • pqおよびe

したがって、「RSA秘密鍵」として定義するものと、話している「半分」を決定する必要があります。

OpenPGP が何を定義するか見てみましょう。セクション5.5.3では、OpenPGPのコンテキスト内に、RSA秘密鍵の標準ストレージ形式があることがわかります。この形式では、公開鍵(nおよびe)と、dpが格納されます。 qおよびという値。これはpモジュロqの逆です(この値はRSAを効率的に実装するのに役立ちます。その場で再計算されますが、それを保存すると操作が速くなります)。実際には、pqeのすべてが設定可能です。これは、他の値がこれら3つから決定論的に計算できるためです。そしてeは伝統的に設定されており、とにかく小さいままである必要があります(効率と相互運用性のため)。したがって、プリセット値を「非表示」にするpおよびqがあります。

RSAキーの生成は、おおまかに次のように機能します。

  • 適切なサイズ(ターゲットモジュラスサイズの半分)のランダムな整数pを生成します。
  • pが素数であるかどうかをテストします。そうでない場合は、プライムが得られるまで再試行してください。
  • q同じ方法で生成します。 qが正しい範囲内にあることを確認して、n = pqが目的のターゲットサイズになるようにします。また、OpenPGPは、qpよりも大きいことを義務付けています(qが小さい場合は、いつでも交換できます)。

したがって、理論的には次のようにプロセスを変更できます。

  • 非表示にする値[〜#〜] v [〜#〜]を2つに分割しますV1およびV2V1およびV2長さk(ビット単位)。
  • 潜在的なランダムを生成するp「含む」値V1、つまりp = 1 + 2 * V1 + r * 2k + 1ランダムな整数値の場合r「適切なサイズ」であるため、p長さはたとえば512ビットです(1024ビットのモジュラスをターゲットにする場合)。素数に達するまで再試行してくださいp
  • q、埋め込みVについても同じようにします2

このプロセスは、少なくとも12ビットのサイズのr値を持つことができる限り機能します。そうしないと、目的の形式のプライムがまったく存在しない可能性があります。 「* 2」と「+1」は、強制的にpを奇数にするためにあります。大きな素数を偶数にすることはできません。

それを実装しているソフトウェアは知りませんが、大きな整数のライブラリと一緒に叩くのは難しいことではありません。適切なJava.math.BigIntegerを持つJavaを使用し、次に Bouncy Castle をOpenPGP形式へのエンコード部分に使用することをお勧めします。

あなたがそのようなトリックをしていることを知っている攻撃者は、あなたの隠された価値が持つどんな構造をも悪用してあなたの鍵を攻撃しようとするかもしれないことに注意してください。また、独自の暗号を実装することはめったに良い考えではありません。そして、「鍵を一目で隠す」というあなたの考えが理にかなっているかどうかについては何も言いませんでした。私はそれがどのように行われるかを示すだけです。

4
Thomas Pornin

確かに、それは可能です。簡単だと言ってもいいでしょう。 RSAを使用している場合、pとqを選択すると、dをほぼ自由に選択できます(gcd(d、(p-1)(q-1))= 1という制限のみが適用されますが、それほど多くはありません。特に(p-1)/ 2と(q-1)/ 2が素数になるようにp、qを選択した場合は、制限があります。したがって、dを選択して、選択した特定の文字列を含めることができます。

ただし、これを行うための既存のツールはないと思います。あなたが求めているのは非常に珍しい独特の機能なので、他の誰かがあなたのためにそれをすでにコーディングしていると期待しないでください。おそらく、RSA鍵生成アルゴリズムについて少し学び、それを自分で実装する必要があります。

3
D.W.

「CommonModulus」攻撃を思い出させます。多分あなたが考えていることではないかもしれませんが、それは考えです: http://members.tripod.com/irish_ronan/rsa/attacks.html

また、 http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing を思い出させます。

だから、いくつかの考えがあります。シャミアの秘密の共有を実装する何かを本当に探しているようです。ランダムでないデータの選択に関する警告にも注意してください。

0
Jeff Ferland