如何用Pem私钥签名ECDSA?

时间:2018-12-09 15:10:49

标签: digital-signature ruby ecdsa

我有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私钥文件并用于签名。

1 个答案:

答案 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的值应该比使用消息长度签名更随机地生成,就像您在示例代码中所做的那样(这是非常 非常这是个好主意,因为您很快就会签署两条长度相同的消息,这可能会让您的私钥被发现。)