Allora, vedo che c'è un po' di confusione. Mi tocca farvi la lezioncina sulla crittografia asimmetrica RSA
Nella crittografia simmetrica moderna (AES, per citare il nome più usato) si prende UNA chiave segreta K, la si condivide segretamente tra Alice e Bob, e quando Alice vuole scrivere a Bob in segreto, Cripta il messaggio m con la chiave K:
e = E(m,K)
Bob, riceve il messaggio criptato e e lo decripta:
m = D(e,K)
Se Eve intercetta il messaggio, senza K non può decifrare "e" ed ottenere m senza provare tutte le combinazioni possibili di K. e K è un numero GRANDE, molto GRANDE. 128bit per esempio, cioè 2^128 è un numero di chiavi pari a 3 seguito da 38 zeri.
Nella crittografia asimmetrica a chiave pubblica, per esempio nel famoso algoritmo RSA (dai nomi degli inventori, Rivest Shamir e Adleman -- ma ne esistono altri), si generano due coppie di chiavi a partire da due numeri primi molto grandi e una coppia di numeri Esponente e Modulo. Queste due coppie le chiamiamo Sa e Pa, utilizzate da Alice, e Sb e Pb utilizzate da Bob.
Alice vuole scrivere a Bob. Pertanto ottiene da Bob la chiave sua pubblica Pb, prende il messaggio m, lo cripta ottenendo "e".
e = E(m, Pb)
a questo punto Bob può decriptare il messaggio utilizzando la propria chiave segreta
m = D(e,Sb).
Eve che intercetta il messaggio non ha la possibilità di decrittarlo, poiché come detto la chiave Sb è segreta.
Viceversa Bob per rispondere utilizzerà la chiave pubblica Pa di Alice con l'algoritmo E e Alice lo decripterà con la propria chiave segreta Sa.
Questo meccanismo fa si che chiunque, anche Charlie, possa scrivere ad Alice o a Bob senza conoscere le chiavi segrete (o private) ma utilizzando le chiavi pubbliche.
Ma se una delle chiavi è segreta, cioè legato all'identità del suo possessore, l'algoritmo si presta anche all'autenticazione dei messaggi.
Infatti se scambiamo i ruoli della chiave pubblica e di quella privata/segreta, possiamo FIRMARE in modo affidabile e non ripudiabile anche qualunque messaggio.
Per fare ciò si fa un passaggio in più, si prende il messaggio e ne si genere una impronta crittografica tramite una funzione di HASH, una funzione che dal contenuto ne estrae una firma univoca di lunghezza nota, per esempio 256bit. Se l'algoritmo di Hash è buono e non è facile creare un contenuto con la stessa firma, ho una buona certezza che all'impronta corrisponda proprio quel contenuto.
Dunque, supponiamo quindi che Alice voglia mandare un messaggio a Bob, ma non solo, vuole essere sicura che Bob sia certo che il mittente è proprio Alice. Allora per prima cosa Alice crea il fingerprint del messaggio tramite una funzione di hash
H = Hash(M)
Poi prende la propria chiave SEGRETA e cripta H ottenendo l'impronta criptata F:
F = E(H,Sa)
Poi manda il messaggio, criptato o in chiaro è irrilevante, a Bob, assieme all'impronta, di solito allegata in coda.
Poiché per criptare H Alice ha usato la propria chiave Segreta anziché quella pubblica, CHIUNQUE può decrittare F e ottenere H utilizzando la chiave PUBBLICA di Alice:
H = D(F,Pa)
E confrontare quest'ultimo con l'impronta del messaggio M:
H' = Hash(M)
Se le due impronte combaciano (H == H'), significa che 1) il messaggio M non è stato alterato e 2) che il mittente del messaggio è proprio Alice!
E si noti una cosa importante: che CHIUNQUE abbia accesso a Pa può verificare l'identità del mittente del messaggio E l'integrità del messaggio stesso.
Con il GP funziona proprio così: Il SSN ha la propria chiave segreta Ss con cui firma l'hash Hg del GP, ottenendo Fg il quale è ALLEGATO al GP stesso. Una cosa del tipo
/ Dati GP / Fg /
A quel punto la app ottiene la chiave PUBBLICA del SSN (Ps), prende la parte dati del GP, calcola l'hash H', prende Fg, lo decripta ottenendo H, confronta H con H'. Combaciano ? Bingo! il GP è valido e integro. Non combaciano? I dati sono stati alterati OPPURE non sono stati firmati con una chiave valida.
Se mi avete seguito fin qui capite dunque che basta UNA chiave Segreta e Una chiave pubblica per poter firmare qualunque GP.
(i dettagli su cosa succede se la chiave privata viene compromessa sono un altro paio di maniche... se non vi annoia ve lo spiego in un altro post)