Support Wikipedia

martedì 31 gennaio 2012

La sicurezza spiegata a un commercialista - 2

2. Crittografia
Da prima del cifrario di Giulio Cesare ad oggi si sono sviluppate tantissime tecniche per offuscare un messaggio per renderlo non comprensibile alle persone non autorizzate. Esempio semplice: scriviamo il messaggio in chiaro, procediamo a sostituire ogni lettera del testo con la lettera precedente nell'alfabeto che stiamo usando ed otteniamo un messaggio cifrato (non si dice "in scuro", anche se sarebbe simpatico). Questa tecnica si può generalizzare definendo una funzione f(m,n) che prende in input il messaggio in chiaro m, un numero intero n e restituisce un messaggio f(m,n), dove ad ogni lettera l di m si è sostituita la lettera l' che dista n posti da l nell'alfabeto di riferimento (nell'esempio di prima n=-1: A->Z, B->A, C->B, ...). n è la chiave (password), perché chiunque conosca n può criptare e decrittare messaggi a piacere: in questo caso criptazione e decrittazione sono equivalenti: m = f(f(m,n),-n) cioè per decrittare si applica l'algoritmo di criptazione con la chiave cambiata di segno. Generalmente l'algoritmo è noto a tutti, tenerlo nascosto (security by obscurity) non aumenta la sicurezza (almeno nell'era dei computer).
Prima di andare avanti: la crittografia non è la panacea per tutti i mali, anzi, in pratica crea un sacco di problemi perché la gente pensa che crittografato = sicuro, quando molti protocolli si possono rompere senza sporcarsi minimamente le mani.
Ci sono due principali schemi di crittografia: simmetrica e asimmetrica (o "a chiave pubblica"). Nel primo caso esiste una sola chiave per criptare e decrittare, o una chiave è ricavabile dall'altra automaticamente, ed è bene tenerla segreta (esempio precedente). Due persone che vogliono comunicare segretamente devono quindi condividere la chiave segreta (e come fanno a condividerla? si trovano al parco?). Nel secondo caso esiste una coppia di chiavi, una pubblica ed una privata, che non possono essere ricavate l'una dall'altra (a meno di secoli di calcoli): in questo caso si usa una chiave per criptare (quella pubblica, nota a tutti), ed una per decrittare (la relativa chiave privata, appunto segreta): per comunicare segretamente con Simone, Fabio gli invia messaggi criptati con la chiave pubblica di Simone, che solo Simone potrà decrittare poiché egli solo (si spera) conosce la sua chiave privata. Anche se Antonio entra in possesso di un messaggio criptato (cosa facile), sarà teoricamente difficile e praticamente impossibile che scopra il contenuto del messaggio originale. Vale quindi la relazione di prima, se ad n e -n sostituiamo rispettivamente chiave privata sk e relativa chiave pubblica pk: m=f(f(m,pk),sk) (non mi dilungo sul fatto che le due f siano proprio la stessa funzione o meno). Una proprietà simpatica di molti algoritmi di crittografia asimmetrica è che spesso vale anche il contrario, cioè m=f(f(m,sk),pk): questo significa che un messaggio crittato con la chiave privata può essere decrittato da chiunque conosca la chiave pubblica (cioè chiunque).  Questa applicazione è nota come "firma", ed è utile qualora Simone voglia mandare un messaggio a Fabio garantendo di essere il mittente: poiché solo Simone conosce sk, solo lui può aver creato f(m,sk), che Fabio può verificare conoscendo pk. Sia chiaro che in questo caso la segretezza del messaggio non è in questione: tutti possono ricavare m da f(m,sk).
Abbiamo tutto quello che ci serve per far comunicare Fabio e Simone, sperando che abbiano capito anche loro...

3. Il protocollo

Insomma Fabio e Simone vogliono spettegolare su Antonio senza che egli se ne renda accorto. Il punto è che la crittografia asimmetrica non basta: se Fabio mandasse a Simone pkS(m) [m crittato con la chiave pubblica pkS di Simone] solo Simone potrebbe leggere m ma non saprebbe se il messaggio viene da Fabio o da qualcun altro (per esempio da Antonio, che certo sospetta qualcosa e vuole confondere le acque).
Fabio, che si crede furbo, dopo aver passato mezz'ora tra Wikipedia e siti discutibili (sfondo nero, caratteri verdi, tante donnine nude), preferendo di certo i secondi, crede di aver trovato la soluzione al suo problema di coppia. Comunica dunque l'idea all'ignavo Simone: "Per quel mestiere che sai basta che facciamo così:

1. io ti mando (F,pkS(nF))  [F è l'identificativo di Fabio, pkS(x) il messagio x crittato con la chiave pubblica di Simone pkS, nF un numero casuale scelto da Fabio]
2. tu mi mandi pkF(nF,nS)   [pkF(x) è il messagio x crittato con la chiave pubblica di Fabio pkF, nS un numero casuale scelto da Simone]
3. io ti mando pkS(nS)

e funziona perché

- solo tu puoi estrarre nF dal primo messaggio
- solo io posso estrarre nF e nS dal secondo, e verificato che mi hai mandato lo stesso nF che ti ho mandato io all'inizio
- ti rispedisco Ns, e tu sei sicuro che il messaggio viene da me perché solo io potevo estrarre Ns da pkF(Nf,Ns).

e siamo a questo punto sicuri di parlare l'uno con l'altro, e tra l'altro possiamo usare g(nF,nS) [una data combinazione dei due numeri causali] come chiave segreta, perché solo noi due conosciamo nS e nF, così finalmente

4. io ti mando m crittato con g(nF,nS)

[assumiamo che Antonio fosse distratto finché Fabio e Simone si mettevano d'accordo su queste cose...o che comunicassero crittando messaggio e firma del messagio tutto con le rispettive chiavi pubbliche/private, ma tralasciamo questo passaggio per semplicità].

ce la faranno i nostri eroi? Stay tuned.

1 commento:

  1. Bah....non so neanche come commentare! Sicurezza!?!? davvero!?

    Stammi bene

    RispondiElimina