La crittografia RSA si basa su una funzione trapdoor, vale a dire un paio di funzioni. Li chiamerò D
e E
. Le funzioni sono progettate in modo che D (E (x)) = x
e E (D (x)) = x
(per qualsiasi x
). In altre parole, D
e E
sono inversi. Ciò che la rende una funzione trapdoor è che se hai una chiave pubblica, puoi solo calcolare E
(praticamente parlando). Se hai una chiave privata, puoi calcolare sia D
che E
.
Il modo in cui funziona la crittografia è abbastanza ovvio da questa descrizione. Se Bob vuole inviare ad Alice un messaggio crittografato, calcola ciphertext: = E (plaintext)
. Quindi Bob invia ciphertext
ad Alice. Alice calcola D (ciphertext)
, che è D (E (plaintext))
, che è solo plaintext
.
Ora parliamo di come funziona la firma. Se Alice vuole firmare message
, allora calcola signature: = D (message)
. Quindi invia sia messaggio
e firma
a Bob. Bob quindi calcola validation: = E (signature)
. Poiché signature
è D (message)
, allora validation = E (D (message)) = message
.
In altre parole: per firmare un messaggio, ti comporti come se lo stessi decrittando, e questa è la tua firma. Per verificare la tua firma, le persone possono crittografare la firma e assicurarsi di recuperare il tuo messaggio originale.
Lo ripeto: la firma è la stessa operazione della decrittografia.
Questa è la preoccupazione fondamentale sulla separazione delle chiavi di firma e di crittografia. Se qualcuno può farti firmare qualcosa, ti ha appena fatto decrittografare.
Supponi di gestire una società notaio. Se qualcuno ti dà $ 10 e un messaggio (ad esempio, testi di canzoni), firmerai quel messaggio e te lo rispedirai. Se in seguito qualcuno copia i testi delle tue canzoni, puoi produrre la firma della società notaio di fiducia per dimostrare che hai scritto quei testi delle canzoni.
Ora supponi che Eve abbia intercettato un messaggio crittografato alla tua società notarile. Come può sovvertire la crittografia? Ti manda lo stesso messaggio per l'autenticazione! Ora esegui l'operazione di firma (che, ricorda, è la stessa dell'operazione di decrittazione) e le restituisci il risultato. Ora ha il messaggio decrittografato.
In pratica, i protocolli hanno passaggi che rendono questo attacco più difficile. Ad esempio, PGP (con cui intendo il protocollo; gpg è l'implementazione più comune qui) non firma il messaggio originale; firma un hash del messaggio. Ma le prove di sicurezza sono le migliori in situazioni semplici. Non vuoi che la tua prova sulla sicurezza di RSA dipenda dalla funzione hash. (Ad esempio, molte persone hanno utilizzato MD5 come hash preferito per molto tempo, ma oggi MD5 è considerato piuttosto rotto.) Da solo, la sicurezza di RSA dipende dall'idea che non firmerai messaggi arbitrari con una chiave utilizzata per la crittografia. Mantenere questo requisito in vigore è il modo migliore per garantire la sicurezza di PGP. (Per quanto ricordo, questo è l'ammonimento più frequentemente ripetuto sulla crittografia asimmetrica nel libro di Bruce Scheier Applied Cryptography .)
Ora parliamo di un'altra domanda che hai posto: "Questo non significherebbe anche che devi distribuire due chiavi pubbliche a tutti coloro con cui desideri comunicare?"
Una "chiave" significa una cosa per gli utenti e un'altra per le implementazioni crittografiche. Devi solo comunicare una "chiave" a livello di utente, sebbene possa contenere molte chiavi pubbliche RSA.
PGP ha un concetto di sottochiavi. La mia chiave principale è una chiave di sola firma. Ho una sottochiave di crittografia separata. Quella sottochiave è firmata dalla mia chiave principale. Se importi la mia chiave PGP dai server delle chiavi o la scarichi dal mio sito web, otterrai la mia chiave principale e tutte le mie sottochiavi. Anche se potresti aver firmato solo la mia chiave principale, la mia chiave principale ha firmato la mia sottochiave di crittografia, quindi sai che appartiene anche a me. Ciò significa che scaricando la mia chiave PGP (che comprende molte chiavi pubbliche RSA), ora hai tutto ciò di cui hai bisogno sia per verificare le mie firme che per crittografare i messaggi.
Con le sottochiavi, la gestione delle chiavi è più complessa da un punto di vista crittografico (c'è un passaggio aggiuntivo di verifica della chiave da eseguire), ma non da un punto di vista pratico (la mia chiave PGP include la mia chiave principale, così come tutte le mie sottochiavi). La complessità extra è nascosta nell'implementazione e non è esposta all'utente.