2012-02-23 5 views
2

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

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

ответ

11

После много вытягивания волос, чтения 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^