In primo luogo, la firma e la verifica sono NON "crittografano" e "decodificano" l'hash. Quel tropo dannoso è quasi in parte vero per RSA ma non proprio, ed è totalmente sbagliato al 100% per DSA ed ECDSA. Vedi
Cercando di capire RSA e la sua terminologia?
Autenticazione della chiave pubblica: cosa viene firmato?
La crittografia dei dati con una chiave privata è pericolosa? < br> Se la chiave pubblica non può essere usato per decodificare qualcosa criptato dalla chiave privata, quindi come funzionano le firme digitali?
Comprensione delle certificazioni digitali
Firma digitale e V erezione?
Con GPG, puoi" decifrare "un file che non è stato crittografato?
link
Inoltre, il campo dell'algoritmo della firma nel certificato è irrilevante; questo è l'algoritmo per la firma di del certificato da parte della CA, e non la firma sui dati da parte dell'EE (qui il server) utilizzando la chiave certificata.
Detto ciò, ciò che è firmato sono i due valori casuali, più la forma codificata dei parametri del server.
Ecco un esempio. Ho catturato un handshake (test) in Wireshark e qui esporto il messaggio ServerKeyExchange in temp3.raw
:
Ho anche esportato il client e il server ciao nonces su temp1.raw
e temp2.raw
rispettivamente, e subjectPublicKeyInfo
dal cert a tempk.raw
e convertito in modulo PEM (che OpenSSL preferisce) con openssl pkey -pubin -inform der <tempk.raw >tempk.pem
. Ora:
$ xxd temp1.raw
0000000: ead0 1445 aec2 291d e316 8f77 b75c e0ec ...E..)....w.\..
0000010: 696c ced0 9d45 65b3 78bd d6f8 5e11 287e il...Ee.x...^.(~
$ xxd temp2.raw
0000000: 5834 4f06 be02 498d cba5 16b0 80bd d5f3 X4O...I.........
0000010: 4a0c 1476 d085 8c57 6fbf 5485 47cd 3937 J..v...Wo.T.G.97
$ xxd temp3.raw
0000000: 0c00 0091 0300 1741 04da 0889 2ed6 bdd0 .......A........
0000010: d140 30e8 417a 7d15 9d46 55b5 6eed 4fde [email protected]}..FU.n.O.
0000020: 814c a7aa fd1d 6617 2835 75c4 12d4 a2a4 .L....f.(5u.....
0000030: 213e 6141 112c fb8d 620b 21f9 e27f ea54 !>aA.,..b.!....T
0000040: 53ec 9ec1 bbbc b3df 2f06 0300 4830 4602 S......./...H0F.
0000050: 2100 fd47 429f 478b 3bd4 c8d4 ce4a 9e4c !..GB.G.;....J.L
0000060: f6e0 c957 bf83 017d 0812 bb4a 8fda de06 ...W...}...J....
0000070: ddc0 0221 00e3 05b1 3046 3c32 a387 012f ...!....0F<2.../
0000080: d149 e810 b423 b45c cce1 e4e9 62ce bd6a .I...#.\....b..j
0000090: a4a0 b6d2 a3 .....
Questo ServerKeyExchange
è costituito dall'intestazione del messaggio di handshake (4 byte), il valore di curva_name e il valore pubkey qui totalizzano 3 + 1 + 65 = 69 byte, 2 byte di firma e identificatori di hash (solo TLSv1.2, per prima vedere RFC) qui 06 03
significa SHA512 ECDSA, lunghezza 2 byte e firma effettiva 72 byte. Costruisco l'input e separo la firma, e uso la linea di comando OpenSSL per verificare (hash e amp;):
$ (cat temp[12].raw;dd if=temp3.raw bs=1 skip=4 count=69 status=none) >temp.dat
$ dd if=temp3.raw bs=1 skip=77 count=72 status=none >temp.sig
$ openssl sha512 <temp.dat -verify tempk.pem -signature temp.sig
Verified OK