2

BouncyCastle を使用して楕円曲線 DSA 署名のキー ペアを作成し、RFC4050 に準拠した XMLString を使用して公開キーを ECDsaCng にインポートすることができまし。今、秘密鍵も移動したいのですが、解決策を見つけることができませんでした。私が得た最も近いものは、CngKey.Import を使用することです。

CngKey.Import は PKCS#8 形式をサポートしているため、キーを有効な pkcs8 に入れることができれば機能します。残念ながら、次のコードはまったく機能しません。

var privatekey = (ECPrivateKeyParameters) keyPair.Private;

var pkinfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privatekey);

byte[] pkcs8Blob = pkinfo.GetDerEncoded(); 

var importedKey = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.Pkcs8PrivateBlob);

これにより例外がスローされます。

System.Security.Cryptography.CryptographicException: ASN1 の不適切なタグ値が見つかりました。

私が知る限り、GetDerEncoded は有効な Pkcs8 blob を返すはずです。

BouncyCastle で作成された秘密鍵を ECDsaCng オブジェクトで使用するにはどうすればよいですか?

4

1 に答える 1

12

RFC を読んで、BouncyCastle と CngKey.Export によって生成されたバイト配列を調べた結果、答えが見つかりました。

問題は、BouncyCastle が EC キーを DER/Pkcs8 形式にエンコードする方法にあります。この特定の問題に関連する 2 つの RFC は、RFC5915 (標準ではなくコンセンサス ドキュメント) と RFC5480 です。彼らは、RFC5480 で参照されている名前付き曲線を使用して曲線パラメーターを指定する必要があると述べています。PKCS8/DER エクスポートの BouncyCastle 実装は、間違ったジェネレーター パラメーターを使用して AsymmetricCipherKeyPair を作成すると、これら 2 つの仕様に準拠していない曲線仕様全体 (暗黙の曲線) をエクスポートします。名前付き曲線を指定する ECKeyGenerationParameters を使用する必要があります。

BouncyCastle で相互運用可能なキーを作成するときは、(私が知る限り) 以下を使用する必要があります。

string namedCurve = "prime256v1";
ECKeyPairGenerator pGen = new ECKeyPairGenerator();
ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(
  X962NamedCurves.GetOid(namedCurve)   
  new SecureRandom());
pGen.Init(genParam);

AsymmetricCipherKeyPair keyPair = pGen.GenerateKeyPair();

CngKey は、Der でエンコードされたバイトを使用してキーをインポートすることで作成できます。

var bcKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keyPair.Private);
var pkcs8Blob = bcKeyInfo.GetDerEncoded();
var importedKey = CngKey.Import(pkcs8Blob, CngKeyBlobFormat.Pkcs8PrivateBlob);
于 2012-02-24T14:08:15.140 に答える