2016-08-04 78 views
1

Ich versuche, mich mit der Unterzeichnung und der Verwendung verschiedener Optionen zu befassen.Mehrere OpenSSL-RSA-Signiermethoden führen zu unterschiedlichen Ergebnissen

ich unterschreiben kann diesen Befehl:

openssl dgst -sha256 -sign private_key.pem -binary -out sig_file data_file 

Aber die Dokumentation scheint zu sagen, dass ich auch andere

openssl dgst -sha256 -binary data_file > hash_file 
openssl rsautl -sign -inkey private_key.pem -keyform PEM -in hash_file > sig_file2 

Aber die Unterschriften sind diese Methode verwenden kann, wenn ich sie erwarten würde zu identisch sein. Entweder habe ich etwas in den Optionen verpasst oder irgendetwas anderes ist falsch in meinen Annahmen.

Die eigentliche Frage von diesem Problem: Gibt es eine Möglichkeit zu signieren mit Befehlszeilenoptionen, da ich bereits den Hash-Wert und eine Signatur, die identisch mit dem ersten Befehl oben ist.

Um mehr hinzuzufügen, kann ich den ersten Befehl einfach im Code reproduzieren und es entspricht dem ersten obigen Befehl, was bedeutet, dass ich mit dem zuerst berechneten Hashwert signieren kann.

mdctx = EVP_MD_CTX_create(); 
EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL); 
EVP_DigestUpdate(mdctx, data, len); 
EVP_DigestFinal_ex(mdctx, hash, &s); 
EVP_MD_CTX_destroy(mdctx); 

kfile = fopen64(key_file, "r"); 
key = PEM_read_RSAPrivateKey(kfile, NULL, NULL, NULL); 
fclose(kfile); 

*sig = malloc(RSA_size(key)); 
RSA_sign(NID_sha256, hash, hlen, *sig, siglen, key); 

Antwort

1

Dupe: Difference between openSSL rsautl and dgst
Eng verwandt:
Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?
Different signatures when using C routines and openssl dgst, rsautl commands
Crossdupe: https://superuser.com/questions/943972/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign

TLDR: dgst -sign für RSA hat die volle RSASSA-PKCS1-v1_5: Hash-Daten, kodiere den Hash in ASN.1, pad das Ergebnis und modexp d. rsautl -sign tut nur die letzten beiden und dgst von sich aus nur die erste, also überspringen die Codierung eine andere und nicht standardmäßige Signatur zu produzieren. dgst (oder Ihren eigenen Hash) dann mit einem RSA-Schlüssel und -pkeyopt digest:name_of_digest (wichtig!) funktioniert auch und beantwortet Ihre eigentliche Frage.