3

WebService で受信した Base64 の文字列から RSA 秘密鍵をインポートする C#/.Net 4.0 アプリケーションがあります。

このアプリケーションは、1024 ビットの RSA キーに対しては完全に機能しますが、特別な種類の RSA 秘密キー (キーの約 1%) では機能しません。

バイト長は次のとおりです。

ワーキングキー:

  • 係数 => 128 バイト
  • 指数 => 3 バイト
  • D => 128 バイト
  • P => 64 バイト
  • Q => 64 バイト
  • DP => 64 バイト
  • DQ => 64 バイト
  • IQ => 64 バイト

機能していないキー:

  • 係数 => 128 バイト
  • 指数 => 3 バイト
  • D => 127 バイト
  • P => 64 バイト
  • Q => 64 バイト
  • DP => 64 バイト
  • DQ => 64 バイト
  • IQ => 64 バイト

違いは D の長さにあります (128 は動作、127 は動作していません)。非稼働鍵は、稼働鍵より 1 バイト短くなっています。

パラメータは設定されていますが、RSA.ImportParameters(rsaParams) を実行すると、「Bad Data」メッセージとともに CryptographicException がスローされます。

この問題を解決するには、何を含める必要がありますか?

4

1 に答える 1

9

RSACryptoServiceProviderには、次のようなデータ長に関するいくつかの仮定があります。

  • モジュラス: 任意の偶数サイズ、長さを呼びましょうn
  • 指数: (<= 4バイト; RSACng では「任意のサイズ」が許可されますが)、長さを呼びましょうe
  • D:n
  • パ:n/2
  • Q:n/2
  • 差出人:n/2
  • DQ:n/2
  • 逆Q:n/2

したがって、2 番目のキーが実際には Modulus: 128 バイトであると仮定すると (64 バイトの P に 64 バイトの Q を掛けたものは 256 バイトの数値ではないため)、D 配列の左側にゼロを埋め込む必要があります。適切な長さにします。

byte[] newD = new byte[modulus.Length];
Buffer.BlockCopy(d, 0, newD, newD.Length - d.Length, d.Length);

.NET Core には、その関係を示す利用可能なソース コードがあります。.NET Framework では、CLR 内に埋め込まれているため、参照ソースでは利用できません。

于 2016-08-25T02:55:11.620 に答える