2016-09-28 10 views
1

Я внедряю ключи и сертификаты ECDSA в .NET, и мне нужно хранить ключи, чтобы я мог повторно использовать их с новой подписью. С RSA я использовал класс RSACryptoServiceProvider, но я не вижу ничего подобного с ECDsa ни классами ECDsaCng.Клавиши ECDSA, хранящиеся

Я только что видел DSACryptoServiceProvider и один старый ECDsaCryptoServiceProvider для Framework 4.3 (немного старый).

Кто-нибудь знает способ хранения ключей ECDSA, как в RSA, пожалуйста?

ответ

1

Предполагая, что вы имеете в виду вы хотели бы упорствовать ключ в хранилище ключей OS (RSACryptoServiceProvider используется именованный ключ), с CNG интерфейс немного отличается:

private static ECDsa CreateOrOpenECDsaKey(string keyName) 
{ 
    CngKey key; 

    if (CngKey.Exists(keyName)) 
    { 
     key = CngKey.Open(keyName); 
    } 
    else 
    { 
     // You can also specify options here, like if it should be exportable, in a 
     // different overload. 
     key = CngKey.Create(CngAlgorithm.ECDsaP521, keyName); 
    } 

    // The ECDsaCng constructor will duplicate the key reference, so we can close this one. 
    using (key) 
    { 
     return new ECDsaCng(key); 
    } 
} 

Если вы имеете в виду вы хотите делать экспорт/импорт, как RSAParameters, эта функция присутствует в .NET Core, но пока не присутствует в .NET Framework.

+0

Спасибо за ответ, это действительно полезно. Я попытался, но в качестве значения ECDsaCng я получаю исключение: «Ключи, используемые с алгоритмом ECDsaCng, должны иметь группу алгоритмов ECDsa. \ R \ nParameter name: key". Мой ключ был сгенерирован с помощью библиотеки BouncyCastle, и, похоже, он создан как ECDH вместо ECDSA. Я должен узнать об этом. – santiPipes

+0

@santiPipes Это исправлено .NET Framework 4.6.2 (http://referencesource.microsoft.com/#System.Core/System/Security/Cryptography/ECDsaCng.cs,bab9826847a21b79) – bartonjs

+0

Я вижу, большое спасибо @bartonjs. Это означает, что я должен установить новую фреймворк на всех компьютерах, которые будут выполняться этим программным обеспечением, не так ли? Я предполагаю, что это не решено только для компиляции с Framework 4.6.2 (я знаю, глупый вопрос) – santiPipes