Ich werde alle Schritte erklären, die ich bisher gemacht habe und mit meiner Frage abschließen.Verifizieren Digest mit privatem Schlüssel mit einem C-Programm signiert
mit OpenSSL 1.0.1e-fips 11 Feb 2013
eine Generierung von privaten und öffentlichen Schlüssel
openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
eine Nachricht mit Digest Unterzeichnung und den privaten Schlüssel
openssl dgst -sha256 -sign private.pem -out message.secret message.txt
bei dieser Punkt Ich habe einen öffentlichen Schlüssel, eine signierte Nachricht (mit Digest) und die ursprüngliche Nachricht.
Teil 1 - mit CLI (dieses arbeitet)
mithilfe der CLI ich verwalten den Digest zu überprüfen:
openssl dgst -sha256 -verify public.pem -signature message.secret message.txt
ich "Verifiziert OK" als Rückgabewert.
Teil 2 - Verwendung von C-Programm
Mein Programm sieht wie folgt aus:
Wo:
msg message.txt ist
Unterschrift message.secret ist
pkey ist der öffentliche Schlüssel (erreicht mit PEM_read_PUBKEY)
int verify_it(const byte* msg, size_t msg_len, byte* signature, EVP_PKEY* pkey) {
EVP_MD_CTX *ctx;
size_t sig_len;
int bool_ret;
int ret_val;
ret_val = EXIT_SUCCESS;
ctx = NULL;
do
{
ctx = EVP_MD_CTX_create();
const EVP_MD* md = EVP_get_digestbyname("SHA256");
EVP_DigestInit_ex(ctx, md, NULL);
EVP_DigestVerifyInit(ctx, NULL, md, NULL, pkey);
EVP_DigestVerifyUpdate(ctx, msg, msg_len);
sig_len = 256;
if (!EVP_DigestVerifyFinal(ctx, signature, sig_len)
ERR_print_errors_fp(stdout)
);
} while(0);
return ret_val;
}
Dieser Code gibt einen Verifizierungsfehler (Wert 0) zurück.
auch die Funktion ERR_print_errors_fp (stdout) druckt die folgende Meldung:
140332412258152:error:04091077:lib(4):func(145):reason(119):rsa_sign.c:176
EDIT
Dank schaffte ich @deniss habe dieses ein Problem zu beheben (Signaturlänge schlecht war - wahrscheinlich eine '\ 0' mittlere Signatur - so bearbeite ich nur die Länge, um 256 zu sein)
aber jetzt bekomme ich ein anderes Problem -
140195987986280:error:04091068:lib(4):func(145):reason(104):rsa_sign.c:293
es mit openssl errstr Überprüfung I
error:04091068:rsa routines:INT_RSA_VERIFY:bad signature
die Art, wie ich meine Unterschrift erwerben haben, ist wie folgt:
secret_fp = fopen("message.secret", "rb");
fseek(secret_fp, 0, SEEK_END);
file_len = ftell(secret_fp);
fseek(secret_fp, 0, SEEK_SET);
signature = malloc(file_len);
fread(signature, file_len, 1, secret_fp);
Neugierig: Warum haben Sie 'bool_ret' in' deklariert' t', nicht 'bool'? – Olaf
kein Grund tatsächlich –
Überprüfen Sie, ob Sie 'message.txt' korrekt lesen. Erzeuge Signatur mit 'echo" test "| openssl dgst -sha256 -zeichen private.pem -out message.secret' und hardcode' msg' als '' test'' und 'msg_len' als' 4'. – deniss