2012-02-23 6 views
2

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

CngKey.ImportはPKCS#8形式をサポートしているため、有効なpkcs8にキーを取得できる場合は有効です。残念ながら、次のコードはうまくいきません。

System.Security.Cryptography.CryptographicException:満たさASN1悪いタグ値

var privatekey = (ECPrivateKeyParameters) keyPair.Private; 

var pkinfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privatekey); 

byte[] pkcs8Blob = pkinfo.GetDerEncoded(); 

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

は、これは例外をスローします。

GetDerEncodedは、私が知る限り、有効なPkcs8ブロブを返す必要があります。

ECDsaCngオブジェクトでBouncyCastleで作成した秘密鍵はどのように使用できますか?

答えて

11

多くの髪を引っ張って、RFCを読んで、BouncyCastleとCngKey.Exportで生成されたバイト配列を調べたところ、答えが見つかりました。

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

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); 

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

関連する問題