我有pem格式的私钥。
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIBAFWFAlCWPb8IvM4yHLLKBIN/mEJU9cZnM5JD2U2EmAoAcGBSuBBAAK
oUQDQgAErMGUjbHcEf7Gk9gVOOlWdqSaGc0YhE5HBPqhoniBUG8MTx5AT7mxtuyn
QkydMeOciHyvvyU0gf81UW9udef2nA==
-----END EC PRIVATE KEY-----
我想用如下的红宝石代码签名。
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私钥文件并用于签名。
答案 0 :(得分:0)
要解析以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的值应该比使用消息长度签名更随机地生成,就像您在示例代码中所做的那样(这是非常 非常这是个好主意,因为您很快就会签署两条长度相同的消息,这可能会让您的私钥被发现。)