Come firmare ECDSA con la chiave privata pem?

0

Ho una chiave privata con il formato pem.

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

Voglio firmare con il codice ruby come segue

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

Voglio sapere come codificare per leggere il file di chiave privata PEM e utilizzare per firmare.

    
posta 09.12.2018 - 16:10
fonte

1 risposta

0

Per analizzare la tua chiave memorizzata in formato PEM, puoi usare il modulo openssl: sudo gem install openssl

Usando questo modulo, estrai la chiave privata in questo modo: OpenSSL::PKey::EC.new(pemcontent).private_key

Tieni presente che la tua chiave privata è basata sulla curva ellittica 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

Pertanto, il primo parametro da dare a EDSA.sign() deve essere ECDSA::Group::Secp256k1 . Questo è un oggetto che contiene i parametri che definiscono questa curva.

Finalmente, ecco il tuo codice, sul quale ho apportato le modifiche necessarie per farlo funzionare:

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: il valore di temp_key dovrebbe essere generato con un metodo più casuale rispetto all'utilizzo della lunghezza del messaggio da firmare, come nel codice di esempio (è molto strong cattiva idea, poiché presto o tardi, firmerai due messaggi con la stessa lunghezza, e questo potrebbe far scoprire la tua chiave privata).

    
risposta data 20.12.2018 - 00:09
fonte

Leggi altre domande sui tag