C # ECDsaCng.SignData использовать подпись в OpenSSL?

Мне нужно знать какая кодировка

https://msdn.microsoft.com/en-us/library/bb347054(v=vs.110).aspx

Метод ECDsaCng.SignData (Byte [])

по умолчанию использует для его байтового массива и как преобразовать его в формат DER, принятый

https://www.openssl.org/docs/manmaster/crypto/i2d_ECDSA_SIG.html

так что я могу проверить сгенерированную C # подпись ECSDA в OpenSSL, используя метод ECDSA_do_verify.

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

0

Решение

Подпись ECDSA — это пара значений (r, s),

Windows CNG испускает это как объединение двух значений, и, поскольку .NET не интерпретирует данные, это формат де-факто .NET. (r первая половина массива, s это вторая половина)

OpenSSL ожидает DER-кодированную структуру SEQUENCE (INTEGER (r), INTEGER (s)). Это слабо значит { 0x30, payload_length, 0x02, r_length, r_bytes[0]...r_bytes[r_length-1], 0x02, s_length, s_bytes[0]...s_bytes[s_length-1] }; хотя это немного сложнее, чем это, потому что байты заполнения требуются, когда r_bytes [0] или s_bytes [0]> = 0x80 (так как это заставляет его появляться как отрицательное число).

К сожалению, по умолчанию не существует кодировщика DER общего назначения.

Если вы пытаетесь работать в Linux, вам лучше использовать .NET Core, поскольку реализация ECDSA для Linux уже делает это перевод данных.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]