Экспортировать закрытый ключ EC из BouncyCastle и импортировать в CngKey или ECDsaCng?

Я создал пары ключей для подписей DSA с эллиптической кривой, используя BouncyCastle, и мне удалось импортировать открытый ключ в ECDsaCng, используя XMLString в соответствии с RFC4050. Теперь я хочу также переместить закрытый ключ и не нашел решения. Самое близкое, что у меня есть, - это 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 должен вернуть действительный BLOB-объект Pkcs8, насколько я могу судить.

Как я могу использовать закрытый ключ, созданный с помощью BouncyCastle, в объекте ECDsaCng?


person agilejoshua    schedule 23.02.2012    source источник


Ответы (1)


После долгих поисков, чтения RFC и изучения массивов байтов, сгенерированных BouncyCastle и CngKey.Export, я нашел ответ.

Проблема заключается в том, как BouncyCastle кодирует ключ EC в формат DER / Pkcs8. Два RFC, которые имеют отношение к этой конкретной проблеме, - это RFC5915 (который не является стандартом, а скорее согласованный документ) и RFC5480. Они заявляют, что параметры кривой должны быть указаны с использованием именованных кривых, указанных в RFC5480. Реализация экспорта PKCS8 / DER BouncyCastle будет экспортировать всю спецификацию кривой (неявную кривую), которая не соответствует этим двум спецификациям, когда вы создаете AsymmetricCipherKeyPair с использованием неправильных параметров генератора. Вы должны использовать параметры 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);
person agilejoshua    schedule 24.02.2012