verifica digerito firmato con chiave privata utilizzando un programma C.

2

Spiegherò tutti i passaggi che ho fatto finora e concludo con la mia domanda.

utilizzando OpenSSL 1.0.1e-fips 11 febbraio 2013

Generazione di una chiave privata e pubblica

openssl genrsa -des3 -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem

firma di un messaggio con digest e chiave privata

openssl dgst -sha256 -sign private.pem -out message.secret message.txt

a questo punto ho una chiave pubblica, un messaggio firmato (con digest) e il messaggio originale.

Parte 1: utilizzo della CLI (questa funziona)

Usando la CLI, riesco a verificare il digest:

openssl dgst -sha256 -verify public.pem -signature message.secret message.txt

Ottengo "Verificato OK" come valore di ritorno.

Parte 2 - Utilizzo del programma C

Il mio programma ha questo aspetto:

dove:

msg è message.txt

signature is message.secret

pkey è la chiave pubblica (ottenuta usando 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;

}

questo codice restituisce un errore di verifica (valore di 0).

anche la funzione ERR_print_errors_fp (stdout) stampa il seguente messaggio:

140332412258152:error:04091077:lib(4):func(145):reason(119):rsa_sign.c:176

Modifica

grazie a @deniss sono riuscito a risolvere questo problema (la lunghezza della firma era sbagliata - probabilmente una firma "\ 0" a metà - quindi ho appena modificato la lunghezza per essere 256)

ma ora sto riscontrando un altro problema -

140195987986280:error:04091068:lib(4):func(145):reason(104):rsa_sign.c:293

controllandolo con openssl errstr che ho

error:04091068:rsa routines:INT_RSA_VERIFY:bad signature

il modo in cui acquisisco la mia firma è simile a questo:

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

qualche suggerimento?

    
posta Itay Sela 01.09.2015 - 10:12
fonte

0 risposte

Leggi altre domande sui tag