2015-08-30 5 views
7

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); 
+0

Neugierig: Warum haben Sie 'bool_ret' in' deklariert' t', nicht 'bool'? – Olaf

+0

kein Grund tatsächlich –

+1

Ü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

Antwort

4

Sie können immer OpenSSL Fehlercodes in sinnvolle Nachrichten mit

dekodieren
openssl errstr <error-code> 

Code 04091077 steht für error:04091077:rsa routines:INT_RSA_VERIFY:wrong signature length.

Die wahrscheinlichste Erklärung:

  • message.secret ist Binärdatei

  • es hat null Byte irgendwo in der Mitte

  • strlen trimmt Unterschrift auf diesem Byte

+0

ausgezeichnet ist! Ich werde nach dem Problem suchen –

Verwandte Themen