Как вычислить подпись ECDSA, используя ключ P-256 в файле PEM, используя C # .NET? - PullRequest
0 голосов
/ 24 июня 2019

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

Я сгенерировал ключ P-256 (a.k.a. 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 тестовых данных?

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

1 Ответ

0 голосов
/ 25 июня 2019

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

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.

...