С этими изменениями подпись:
r = 0x1781ff4997b48d389f518df75001c4b6564082956228d74dd0321656
s = 0x0aadc68cf78dc75d44fb300f200465e72a70826ec2d5577d49b62e59
который, тем не менее, отличается от подписи, показанной в инструкциях.
В C # -коде экземпляр ECDsaSigner
создается с HMacDsaKCalculator
-экземпляр, генерирующий детерминированную подпись на основе RFC6979 . При создании подписи с ECDSA параметр k
выбирается случайным образом для недетерминированного ECDSA, тогда как в детерминированном варианте он создается из сообщения и личного ключа в соответствии с определенным алгоритмом (описано в RFC6979), см. здесь . Таким образом, детерминированный вариант генерирует одну и ту же сигнатуру для одного и того же сообщения и личного ключа, а недетерминированный вариант генерирует разные сигнатуры.
Возможно, разница между сигнатурами вызвана использованием недетерминированного вариантаот CoinFLEX. К сожалению, инструкции не содержат подробных сведений об используемой ECDSA-процедуре.
Обновление:
Оба варианта, детерминистические и недетерминированные, предоставьте действительные ECDSA-подписи! До того, как детерминированный вариант ( RFC6979 относится к августу 2013 года) был только недетерминированным вариантом, см. здесь .
Я установил и протестировал sign_secp224k1
-инструмент на компьютере с Linux (Debian). Как и предполагалось, инструмент генерирует разных подписей для одного и того же закрытого ключа и того же сообщения, очевидно, используя недетерминированный вариант. Это также может быть легко проверено из исходного кода: подпись рассчитывается с использованием ecp_sign
-метода, который случайным образом определяет k
-значение с использованием /dev/urandom
.
Таким образом, ясно, что сигнатура, сгенерированная C # -кодом с использованием детерминированного варианта , обычно не может соответствовать сигнатуре, сгенерированной sign_secp224k1
-инструментом с использованием недетерминированного варианта.