Как вычислить подпись ECDSA с использованием ключа P-256 в файле PEM с использованием C # .NET?

Я новичок в криптографии и над головой пытаюсь разобраться в Windows, используя C # .NET.

Я создал ключ эллиптической кривой P-256 (он же secp256r1 и prime256v1), используя следующую команду:

openssl ecparam –name prime256v1 -genkey –noout –out private.key

Я сгенерировал запрос на подпись сертификата, используя следующую команду:

openssl req –new –key private.key –out certreq.csr –sha256

Другая команда прислала мне в ответ сертификат в кодировке base-64. Все идет нормально.

Теперь я получил некоторые «тестовые» данные, которые мне нужны для вычисления подписи ECDSA, используя закрытый ключ. Закрытый ключ выглядит примерно так:

-----BEGIN EC PRIVATE KEY-----
FunnyHow?LIKEACLOWN?DOIAMUSEYOU?DOIMAKEYOULAUGH?==
-----END EC PRIVATE KEY-----

До сих пор я боролся с кодом, подобным следующему:

byte[] cngBlob; // This was calculated based on another StackOverFlow post
byte[] testData       = "JoePesciWasGreatInGoodfellas";
CngKey cngKey         = CngKey.Import(cngBlob, CngKeyBlobFormat.EccPrivateBlob);
ECDsaCng eCDsaCng     = new ECDsaCng(cngKey);
byte[] signatureECDSA = eCDsaCng.SignData(testData);

Я попытался вычислить byte[] cngBlob с использованием файла закрытого ключа на основе Microsoft CNG | Как импортировать закрытый ключ ECDSA, закодированный в формате PEM, в поставщик хранилища ключей MS, но я не получаю правильный ответ в byte[] signatureECDSA.

Как мне прочитать закрытый ключ из файла, а затем использовать его для вычисления подписи ECDSA тестовых данных?

Я начал погружаться в увлекательный мир криптографии, но мне потребуется время, чтобы познакомиться с ним. Я здесь на правильном пути? Буду очень признателен за любые советы, которые помогут мне с этой проблемой.


person BhanuKer    schedule 24.06.2019    source источник
comment
Ссылка в вашем вопросе показывает, как это сделать. Если он не работает, вы обязаны предоставить код, который не работает, и подробную информацию о проблеме.   -  person President James K. Polk    schedule 25.06.2019
comment
Оказывается, приведенный выше код был правильным. На самом деле я вычислил хэш тестовых данных, используя byte [] HashAlgorithm.ComputeHash (byte [] buffer), и именно этот хеш я пытался подписать. Я не понимал, что вычисление хэша будет иметь значение. Правильный вызов, который мне пришлось использовать, оказался byte [] signatureECDSA = eCDsaCng.SignData (testData);   -  person BhanuKer    schedule 25.06.2019


Ответы (1)


Оказалось, что приведенный выше код был правильным подходом, но я допустил ошибку. Я фактически рассчитал хэш тестовых данных с помощью метода

byte[] HashAlgorithm.ComputeHash(byte[] buffer)

и именно это хешированное значение тестовых данных я пытался подписать. Мои тестовые данные, приведенные выше, вероятно, должны были выглядеть так:

     byte[] testData = null;
     using (SHA256 sha256 = SHA256.Create())
     {
        testData = sha256.ComputeHash("JoePesciWasGreatInGoodfellas");
     }

Я не понимал, что вычисление хэша будет иметь значение.

Правильный вызов, который мне пришлось использовать для подписи хешированных тестовых данных, оказался

byte[] signatureECDSA = eCDsaCng.SignHash(testData);

Вот как будет выглядеть окончательный исправленный код:

byte[] cngBlob; // This was calculated based on another StackOverFlow post
byte[] testData = null;
using (SHA256 sha256 = SHA256.Create())
{
    testData = sha256.ComputeHash("JoePesciWasGreatInGoodfellas");
}
CngKey cngKey         = CngKey.Import(cngBlob, CngKeyBlobFormat.EccPrivateBlob);
ECDsaCng eCDsaCng     = new ECDsaCng(cngKey);
byte[] signatureECDSA = eCDsaCng.SignHash(testData);

Примечание. Как упоминалось в предыдущем сообщении, обратитесь к отличной информации по адресу Microsoft CNG | Как импортировать закрытый ключ ECDSA, закодированный в формате PEM, в поставщик хранилища ключей MS, чтобы создать cngBlob из закрытого ключа в файле PEM.

person BhanuKer    schedule 25.06.2019