2012-02-23 47 views
2

我已經使用BouncyCastle爲橢圓曲線DSA簽名創建了密鑰對,並使用XMLString根據RFC4050設法將公鑰導入ECDsaCng。現在我想要移動私鑰並且沒有設法找到解決方案。我得到的最接近的是使用CngKey.Import。從BouncyCastle導出EC私鑰並導入到CngKey或ECDsaCng中?

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,據我所知。

如何使用在ECDsaCng對象中使用BouncyCastle創建的私鑰?

回答

11

經過多次拉動,閱讀RFC和研究由BouncyCastle和CngKey.Export生成的字節數組,我找到了答案。

問題在於BouncyCastle如何將EC密鑰編碼爲DER/Pkcs8格式。與這個特定問題相關的兩個RFC是RFC5915(這不是一個標準,而是一個共識文檔)和RFC5480。他們聲明曲線參數必須使用RFC5480中引用的命名曲線來指定。在使用錯誤的生成器參數創建AsymmetricCipherKeyPair時,PKCS8/DER導出的BouncyCastle實現會導出不符合這兩個規範的整個曲線規範(隱式曲線)。您必須使用指定命名曲線的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); 
相關問題