¿Cómo firmar ECDSA con una clave privada pem?

0

Tengo clave privada con formato pem.

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

Quiero firmar con código ruby como el siguiente.

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

Quiero saber cómo codificar para leer el archivo de clave privada PEM y usar para firmar.

    
pregunta 09.12.2018 - 16:10
fuente

1 respuesta

0

Para analizar su clave almacenada en formato PEM, puede usar el módulo openssl: sudo gem install openssl

Usando este módulo, extraerás la clave privada de esta manera: OpenSSL::PKey::EC.new(pemcontent).private_key

Tenga en cuenta que su clave privada se basa en la curva elíptica 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

Por lo tanto, el primer parámetro para dar a EDSA.sign() debe ser ECDSA::Group::Secp256k1 . Este es un objeto que contiene los parámetros que definen esta curva.

Finalmente, aquí está su código, en el que he realizado los cambios necesarios para que funcione:

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

Nota: el valor de temp_key debe generarse de forma más aleatoria que utilizando la longitud del mensaje para firmar, como lo hizo en el código de ejemplo (es una muy muy mala idea, ya que tarde o temprano, firmarás dos mensajes con la misma longitud, y esto podría permitir que tu clave privada haya sido descubierta).

    
respondido por el Alexandre Fenyo 20.12.2018 - 00:09
fuente

Lea otras preguntas en las etiquetas