Мне нужно знать какая кодировка
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, если мне даже нужно это сделать.
Подпись 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 уже делает это перевод данных.
Других решений пока нет …