Экспортировать закрытый ключ EC из BouncyCastle и импортировать в CngKey или ECDsaCng? - PullRequest
2 голосов
/ 23 февраля 2012

Я создал пары ключей для подписей 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 должен возвращать действительный BLK-объект Pkcs8.

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

1 Ответ

12 голосов
/ 24 февраля 2012

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

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