Questo è un cattivo diagramma. L'operazione di base non è intrinsecamente sbagliata, almeno per RSA, ma pensare di firmare come "crittografare" e verificare come "decifrare" porterà esattamente al tipo di confusione che si sta esprimendo qui. È molto meglio pensarlo in questo modo:
- Una chiave pubblica può essere utilizzata per due cose: crittografia e verifica .
- Una chiave privata può essere utilizzata per due cose: decrittografia e firma .
Oppure, in modo equivalente, puoi dire quanto segue:
- Puoi utilizzare la tua chiave privata per decodificare un messaggio crittografato da qualcuno con la tua chiave pubblica.
- Puoi utilizzare la tua chiave privata per firmare un messaggio in modo che chiunque abbia la tua chiave pubblica possa verificare che il messaggio provenga da te.
- Puoi inviare la tua chiave pubblica a tutti, in modo che possano inviarti messaggi crittografati e verificare i tuoi messaggi.
- A meno che tu non stia inviando un messaggio segreto a te stesso, o verificando che in realtà sei tu a scrivere un messaggio, non usi mai la tua chiave pubblica da solo.
Nella domanda che hai posto, il MitM non ha bisogno di decodificare nulla, perché il messaggio non è mai stato criptato affatto! Il messaggio (o meglio, un hash di esso) è stato firmato, quindi il MitM non può modificare il messaggio senza rompere la firma, ma il messaggio stesso è in testo semplice.
Se vuoi crittografare (fornire riservatezza) e firmare (fornire autenticità), hai bisogno della tua chiave privata (per la firma) e del destinatario chiave pubblica (per la crittografia). Cioè, prima che Alice possa inviare un messaggio sicuro a Bob, non solo ha bisogno di generare la sua propria coppia di chiavi (per la firma), ha bisogno che Bob abbia entrambi generato la sua propria coppia di chiavi e (verificabile) abbia inviato la sua chiave pubblica a lei (Alice) . Questo è lo schema utilizzato da numerosi schemi di messaggistica sicura, come OpenPGP (incluso GPG) e S / MIME (entrambi focalizzati principalmente sulla sicurezza dell'email end-to-end).
Un'altra opzione è ovviamente quella di criptare usando una chiave simmetrica che hai precedentemente scambiato con il destinatario (una "chiave pre-condivisa") e poi anche generare un codice di autenticazione dei messaggi (MAC) usando quella chiave o un'altra che hai anche scambiato. Questo MAC potrebbe essere basato su hash (un HMAC, che combina una chiave segreta condivisa con un algoritmo di hash sicuro come un membro delle famiglie SHA2 o SHA3), o potrebbe essere derivato dal codice simmetrico stesso, come un tag di autenticazione di un codice a blocchi in Galois / Counter Mode (GCM). Tuttavia, le chiavi simmetriche non hanno componenti pubbliche - non è mai sicuro fare cose come metterle in un certificato pubblico - quindi lo scambio di chiavi è un po 'più semplice (anche se ancora carico!) Quando si usano invece le chiavi pubbliche / private (asimmetriche).