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

Теоретически должно быть возможно проверить подпись части данных, если у вас есть открытый ключ, подпись и данные, которые были подписаны, и известен алгоритм хеширования.

У меня все эти компоненты в бинарном формате. Кто-нибудь знает, как проще всего проверить эту подпись? OpenSSL? Питон? Пример был бы отличным. Можно ли это сделать без написания кода?


person Drew Lex    schedule 06.06.2013    source источник


Ответы (2)


Вот как вы можете сделать это в Ruby.

require 'openssl'

signature = File.read('/path/to/sig.der')
data = File.read('/path/to/data')
pub_key = File.read('/path/to/ecdsa_pub_key')
key = OpenSSL::PKey::EC.new(pub_key)
if key.dsa_verify_asn1(data, signature) == true
  puts 'verified'
end

Этот код требует, чтобы OpenSSL, связанный с Ruby, был скомпилирован с поддержкой эллиптических кривых. (дистрибутивы Linux в стиле Red Hat не удовлетворяют этому требованию)

Если вам интересно: dsa_verify_asn1 использует функцию ECSDA_verify в OpenSSL API.

person Paul Kehrer    schedule 07.06.2013
comment
Я получаю «инициализировать»: неизвестное имя кривой с использованием OpenSSL 1.0.1c в Ubuntu 12.10. Очевидно, это можно сделать из командной строки, используя файл openssl dgst -hashfunction -verify public.key -signature file.sig. Я просто не понимаю, как преобразовать открытый ключ EC из шестнадцатеричного в формат PEM. - person Drew Lex; 07.06.2013
comment
@DrewLex Попробуйте преобразовать двоичный ключ в pem следующим образом: openssl ec -in key.der -inform DER -pubin -out keyout.pem -outform PEM - person gtrig; 08.06.2013

Вы можете использовать openssl для подписи сообщения подписью ECDSA, а затем вы можете использовать openssl для проверки подписи:

Чтобы подписать сообщение (используя хеширование SHA256, учитывая сообщение и закрытый ключ EC подписавшего):

openssl dgst -sha256 -sign ec-privatekey.pem message.txt > signature.der

Затем, чтобы проверить подпись (снова используя хеширование SHA256, учитывая сообщение, открытый ключ EC подписавшего и подпись, созданную выше):

openssl dgst -sha256 -verify ec-publickey.pem -signature signature.der message.txt
person mti2935    schedule 17.12.2015