После долгих размышлений, чтения 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);