Sicuramente . Ci sono due principali vantaggi di avere una coppia di chiavi per la crittografia e un'altra coppia di chiavi per la firma.
La prima ragione è che si desidera conservare i backup delle chiavi scadute che sono state utilizzate per la crittografia, il che non è il caso delle chiavi di firma. Normalmente si memorizzano i dati crittografati crittografati e decodificati per visualizzarli. Se perdi una chiave privata di crittografia, perdi i dati. Se perdi una chiave privata di firma non perdi nulla (dato che la chiave pubblica sarà pubblica, giusto?). Il nostro orso preferito ha fatto un'enorme discussione su questo punto in un precedente risposta .
Una seconda ragione è che un protocollo di crittografia potrebbe essere rotto. È plausibile che solo la parte di cifratura o solo la parte di firma del protocollo sia spezzata (ad esempio mediante watermarking di dati all'interno di un testo cifrato). Se la crittografia RSA è interrotta e si dispone di 2 chiavi, è necessario revocare tutte le chiavi di crittografia (e sostituirla con un altro protocollo), ma non è necessario eseguire alcuna operazione sulle chiavi di firma. L'opposto (la firma è rotta) vale anche.
A causa della grande richiesta (nei commenti), difenderò il secondo punto di cui sopra presentando due scenari: uno in cui una firma asimmetrica può essere interrotta senza rompere la crittografia e uno in cui la crittografia può essere interrotta senza rompere l'algoritmo di firma. Facciamo rock:
(Non sono un teorico, quindi potrebbe esserci qualcosa di sbagliato se lo guardi con abbastanza pedanteria, non aver paura di indicarlo.)
Rompere la firma senza rompere la crittografia
Supponendo che la firma venga eseguita nel modo seguente (è una moda comune per la crittografia asimmetrica):
encrypt(privkey, hash(plaintext))
Lo scopo di un utente malintenzionato è di essere in grado di firmare un messaggio della sua creazione con la mia chiave. Può rubare la chiave o attaccare l'algoritmo. Se l'aggressore trova un modo per trovare collisioni in modo efficiente nella funzione hash()
, può prendere un messaggio precedentemente firmato da me recuperare l'hash (decrittografando la firma) e creare un suo messaggio che collide con lo stesso valore di hash.
In altre parole, rompendo hash()
e avendo accesso ad almeno uno dei messaggi da me firmati, l'attaccante sconfigge l'algoritmo di firma senza toccare encrypt()
.
Rompere la crittografia senza interrompere la firma
Un modo comune per rompere la crittografia è riuscire a indovinare la chiave in base alle informazioni nel testo cifrato e nel testo in chiaro. Questo è spesso chiamato watermarking (anche se è più spesso usato contro la crittografia simmetrica). La crittografia verrà eseguita da:
encrypt(pubkey, plaintext)
Ora, supponiamo che l'autore dell'attacco mi invierà diversi cyphertexts crittografati con la mia chiave pubblica. E che mi convincerà a rivelargli il contenuto del testo in chiaro che ho decodificato usando la mia chiave privata. Questo non è affatto azzardato: immagina mail cifrate con reimpostazioni di password, decrittò la posta e invierò il testo in chiaro all'autore dell'attacco.
Ora, se è possibile indovinare (con alta probabilità), sulla base di alcuni bit nel testo cifrato, che un certo bit nel testo in chiaro sarà 1 o 0 se un altro bit nella chiave privata è 1 o 0, quindi abbiamo un'alta probabilità che abbiamo scoperto un singolo bit della chiave privata. Si tratta di un attacco contro il modello S-BOX dell'algoritmo se avessimo parlato di crittografia simmetrica.
(Il paragrafo precedente è decisamente esagerato Pensare a RSA come usare i bit non è molto realistico. Sto usando bit perché è come il watermarking funziona contro i cifrari a blocchi, ma si può pensare a qualsiasi attacco statistico su RSA)
Ripetendo la procedura sopra più volte l'utente malintenzionato può recuperare la mia chiave privata e la crittografia è interrotta poiché ora è in grado di decodificare tutti i messaggi inviati a me.
Perché non funziona per le firme? A causa della stessa funzione hash()
come sopra. Se l'hash è crittografico, dovrebbe essere impossibile determinare la posizione dei bit nel testo in chiaro in base all'output dell'hash. Pertanto, se hash()
è valido ma l'algoritmo di crittografia può essere attaccato con watermarking, possiamo interrompere la crittografia senza interrompere l'algoritmo di firma.
Ma aspetta, gli hash crittografici non sono usati (nel testo in chiaro) durante la crittografia? Ekhm ... no, la crittografia deve preservare tutti i dati in modo che sia possibile decrittografarli. Un hash perderà alcuni dati, quindi non può essere utilizzato nella stessa forma dell'algoritmo di firma nella crittografia.
Naturalmente, questi due scenari sono non i soli scenari possibili. Ma sono plausibili scenari, con sufficiente attenzione da garantire l'utilizzo di 2 coppie di chiavi (una per la firma e una per la crittografia)