Как подписать ECDSA закрытым ключом pem? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть закрытый ключ в формате pem.

-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----

Я хочу подписать с помощью кода ruby, как показано ниже.

require 'ecdsa'
def sign(str)
    digest = Digest::SHA256.digest(str) 
    temp_key = str.size 
    signature = ECDSA.sign($group, $private_key, digest, temp_key)
end

Я хочу знать, как кодировать для чтения приватной PEMфайл ключа и использование для подписи.

1 Ответ

0 голосов
/ 20 декабря 2018

Для анализа вашего ключа, хранящегося в формате PEM, вы можете использовать модуль openssl: sudo gem install openssl

Используя этот модуль, вы извлечете закрытый ключ следующим образом: OpenSSL::PKey::EC.new(pemcontent).private_key

Обратите внимание, что ваш закрытый ключ основан на эллиптической кривой secp256k1 :

% openssl ec -text 2>&1 << EOF | grep OID
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----
EOF
ASN1 OID: secp256k1

Следовательно, первый параметр, который должен быть передан EDSA.sign(), должен быть ECDSA::Group::Secp256k1.Это объект, который содержит параметры, которые определяют эту кривую.

Наконец, вот ваш код, в котором я внес изменения, необходимые для его работы:

require 'ecdsa'
require 'openssl'

def sign(str)
  pemcontent = "-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----"
  digest = Digest::SHA256.digest(str)
  temp_key = str.size
  signature = ECDSA.sign(ECDSA::Group::Secp256k1, OpenSSL::PKey::EC.new(pemcontent).private_key, digest, temp_key)
  return signature
end

Примечание: значение temp_key должно генерироваться более случайным образом, чем использование длины сообщения для подписи, как вы делали в своем примере кода (это очень очень плохая идеярано или поздно вы подпишете два сообщения одинаковой длины, что может позволить обнаружить ваш закрытый ключ).

...