2

私が見る限り、Microsoft の RSA CSP は常に同じビット長の疑似素数を生成します。鍵のサイズが 1024 の場合、P と Q の値は (?) それぞれ 512 ビットであることが保証されているようです。これが実際に当てはまるかどうか、誰かが確実に知っていますか?

私自身の RSA 実装と Microsoft の RSA 実装との間の相互運用性モジュールを構築しています。私の場合、P 値と Q 値の間に小さなランダムな分散を組み込んでいるので、1024 ビットのキーの場合、1 つの値が 506 ビットで、もう 1 つの値が 518 ビットになる可能性があります。純粋に実験的に、分散を 0 にロックすると (つまりP と Q の値はサイズが同じです) -- 正常に機能します。サイズ変数を作成するとすぐに、インポート プロセス中に Microsoft RSA オブジェクトが「Bad Data」で応答します。

Microsoft が等しいキー サイズを強制しているという確認を探しているので、誰か情報を持っている場合は投稿してください。

なぜ私が独自の RSA プロバイダーを実装しなければならなかったのかを誰かが尋ねる前に、CryptoAPI はマルチスレッド環境では適切に動作しません。CryptoServiceProvider 呼び出しでマシン キーストアをロックします。これは、複数のスレッドからアクセスした場合の「ファイルが見つかりません」(やや不可解な) エラーを意味します

気になる方はこちらをご覧ください: http://blogs.msdn.com/b/alejacma/archive/2007/12/03/rsacryptoserviceprovider-fails-when-used-with-asp-net.aspx

4

2 に答える 2

1

MicrosoftのRSACSPは、このページで説明されている形式でエクスポートおよびインポートできる秘密鍵を生成して使用し、次のようになります。

BLOBHEADER blobheader;
RSAPUBKEY rsapubkey;
BYTE modulus[rsapubkey.bitlen/8];
BYTE prime1[rsapubkey.bitlen/16];
BYTE prime2[rsapubkey.bitlen/16];
BYTE exponent1[rsapubkey.bitlen/16];
BYTE exponent2[rsapubkey.bitlen/16];
BYTE coefficient[rsapubkey.bitlen/16];
BYTE privateExponent[rsapubkey.bitlen/8];

したがって、CSPが処理できる(特に生成できる)秘密鍵には、次のプロパティが必要です。

  • ビット単位のモジュラス長は、16の倍数でなければなりません。
  • 各素因数の長さは、モジュラスの長さの半分以下でなければなりません。
  • プライベート指数は、モジュラスより長くてはなりません。
  • プライベート指数、縮小されたモジュロp-1(またはq-1)は、モジュラスの半分を超えてはなりません。

技術的には、プライベート指数dには無限に多くの可能な値がありexponent1exponent2数学的に重要なのはp-1q- 1を法とするdの値だけであるためです。ハミング重みが低くなる場合は、わずかに長いプライベート指数パーツを受け入れることが提案されています。これは、パフォーマンス上の利点につながるためです。結論:上記の形式では、それはできません。

キーがMicrosoftのコードに受け入れられる必要があるその他の特性(ただし、上記の説明で直接報告されていない):

  • 最初の素数(p、aka )の数値は、2番目の素数( q、aka )prime1の数値よりも大きくなければなりません。prime2
  • パブリック指数(ここではrsapubkeyフィールド内にエンコードされています)は、32ビット整数(符号なし)に収まる必要があります。

したがって、 RSA標準に従って名目上有効であるが、MicrosoftRSACSPコードでは処理できないRSAキーペアが多数あります。注目に値するのは、パブリック指数サイズに関する最後の制約です。これは、制約がCSPだけよりも一般的であることを意味します。サーバーの公開鍵(証明書内)に32ビットに収まらない公開指数があるSSLサーバーをセットアップすると、InternetExplorerはそれに接続できなくなります。

したがって、実際には、RSAキーペアを生成する場合は、それらが上記のルールに準拠していることを確認する必要があります。心配しないでください。私たちの知る限り、これらのルールはセキュリティを低下させません。

于 2011-10-20T11:48:01.427 に答える
0

私自身の作業/実験では、Monoの(管理された)RSA実装と単体テストを行っていますが、Microsoftの実装ではRSAパラメーター値をインポートするときに特定のサイズが必要であることが示されています。 byte[]

また、BigIntegerを使用してパラメーターを変換する場合、MSが期待するものよりも少し小さく(たとえば1バイト少ない)、0を埋める必要があるため、相互運用性の一般的な問題です(これについてはいくつかの質問があります)。

したがって、小さい値を埋めてMSに受け入れさせることはできると確信していますが、大きい値を受け入れることはできないでしょう。

于 2011-10-19T15:14:26.540 に答える