Для анализа вашего ключа, хранящегося в формате 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 должно генерироваться более случайным образом, чем использование длины сообщения для подписи, как вы делали в своем примере кода (это очень очень плохая идеярано или поздно вы подпишете два сообщения одинаковой длины, что может позволить обнаружить ваш закрытый ключ).