Indietro Indice Home PHC Avanti

Indice

Sono disponibili i lucidi in formato Postscript e LaTeX-2e.


Primo lucido [PNG ~13Kb]

Crittografia: a cosa serve

Crittografia classica

Protocolli a due, codici simmetrici.

Crittografia moderna

Protocolli pubblici, codici asimmetrici.

Per crittografia si intende etimologicamente scrittura segreta. Di fatto la crittografia non si è discostata da questo fino al 1976 quando esce un articolo [Whitfield Diffie and Martin E. Hellman, New Directions in Cryptography, IEEE Transactions on Information Theory 22 (1976), no.6, 644-654] che introduce l'idea di crittografia asimmetrica. Quest'ultima permette, oltre alle classiche tecniche di segretezza, anche procedure di autenticazione.


Secondo lucido [PNG ~16Kb]

Crittografia: come funziona

Trasmissione segreta

chiaro  Codifica  cifrato   Decodifica   chiaro
         ,---.                 ,---.
  m   -->| C |-->    x      -->| D |-->    m
         `---'                 `---'

Protocollo simmetrico

         ,----.                ,----.
         |  s |                |  s |
  m   -->| C  |-->   x      -->| D  |-->   m
         |  K |                |  K |
         `----'                `----'

Si usa una sola chiave, nota sia a chi deve cifrare sia a chi deve decifrare

Protocollo asimmetrico

         ,----.                ,----.
         |    |                |    |
  m   -->| C  |-->   x      -->| D  |-->   m
         |  Kc|                |  Kd|
         `----'                `----'

Le due chiavi sono distinte, una può essere resa pubblica mentre la seconda rimane segreta

La cosa veramente innovativa dei protocolli simmetrici è proprio la separazione tra le due chiavi: quella per cifrare e quella per decifrare. Tra i vantaggi abbiamo:

I protocolli asimmetrici vengono spesso detti piú semplicemente protocolli a chiave pubblica.


Terzo lucido [PNG ~15Kb]

Uso misto

I protocolli simmetrici sono piú efficienti; i due sistemi vengono usati in coppia. Il protocollo asimmetrico cifra una chiave effimera.

                  ,----.
                  |    |
           Ks  -->| C  |-->  k
                  |  Kc|
           |      `----'     |
          \|/               \|/
         ,---.               `                 ,---.
         | s |                                 | s |
  m   -->|C  |-->   x   --> (k,x) -->   x   -->|D  |-->   m
         | Ks|                                 | Ks|
         `---'                                 `---'
                             |                  /|\
                            \|/       ,----.     |
                             `        |    |
                             k     -->| D  |-->  Ks
                                      |  Kd|
                                      `----'

Firma digitale

 testo   Firma      firmato   Verifica
         ,----.                ,----.
         |    |                |    |
  m   -->| F  |-->   (m,f)  -->| V  |--> Sí/No
         |  Kf|                |  Kv|
         `----'                `----'

Uno degli svantaggi dei protocolli asimmetrici è invece l'estrema complessità computazionale delle operazioni necessarie, che porterebbe a una lentezza insostenibile per le trasmissioni cifrate. In realtà il protocollo asimmetrico viene usato solo per cifrare un numero casuale, che verrà usato come chiave per un protocollo simmetrico.

In definitiva il messaggio cifrato consiste nella coppia: k che è la chiave di sessione cifrata con la chiave pubblica del destinatario, seguita da x che è il messaggio cifrato con la chiave di sessione

Nei protocolli di firma digitale il messaggio firmato consiste nella coppia messaggio-firma. Il messaggio può benissimo essere in chiaro, la cosa importante è che la firma sia indissolubilmente legata al messaggio: la stessa firma legata a un messaggio diverso non deve passare la verifica.


Quarto lucido [PNG ~18Kb]

Protocolli algebrici: RSA

Due primi p,q; usiamo il prodotto n = pq.
Messaggi in M = Zn. Cifrati in X= Zn.
Due esponenti cd = 1 (mod phi(n) ).

Trasmissione segreta

[PUB]
Kc=(n, c)
[PRI]
Kd=(n, d), fattorizzazione n=pq
[CIF]
CKc(m) -> x = mc (mod n)
[DEC]
DKd(x) -> xd = mcd = m (mod n)

         ,----.                ,----.
         |    |       c        |    |       cd
  m   -->| C  |-->   m      -->| D  |-->   m
         |  Kc|                |  Kd|
         `----'                `----'

Il protocollo RSA è il piú semplice da descrivere e il piú usato dei protocolli asimmetrici, ma non il piú sicuro.

Il piú antico, piú studiato e piú usato dei protocolli asimmetrici è sicuramente l'RSA. Risale al 1978. Nel frattempo sono state trovate molte debolezze nel possibile cattivo uso del protocollo, ma usato bene resta un protocollo affidabile.

Il protocollo è piuttosto semplice, la sicurezza risiede nel fatto che conoscendo solo la chiave pubblica (n,c) non è facile calcolare l'esponente privato d. L'unico modo che si conosce per decifrare i messaggi consiste nel fattorizzare n per poi calcolarne la phi ed invertire l'esponente pubblico. Questo procedimento è considerato troppo difficile e ciò rende sicuro il protocollo se la fattorizzazione di n non viene divulgata.


Quarto lucido bis [PNG ~17Kb]

Due primi p,q; usiamo il prodotto n = pq.
Messaggi in M = Zn. Firme in F=Zn.
Due esponenti cd = 1 (mod phi(n) ).

Firma digitale

[PUB]
Kv=(n, c)=Kc
[PRI]
Kf=(n, d)=Kd
[FIR]
FKf(m) -> f = md (mod n)
[VER]
VKv(m,f) verifica se m = fc (mod n)

In realtà non è necessario che venga trasmesso anche il messaggio, può essere ricavato dalla firma f.

 testo   Firma      firmato   Verifica
         ,----.                ,----.
         |    |        d       |    |     cd
  m   -->| F  |-->    m     -->| V  |--> m  =m
         |  Kf|                |  Kv|
         `----'                `----'

Uno dei vantaggi di RSA è l'avere associato in modo naturale un protocollo di firma digitale. È sufficiente osservare che le operazioni di codifica e decodifica (per RSA) commutano per comprendere come funzioni.


Quinto lucido [PNG ~17Kb]

Dimostrazione funzionamento

Dal protocollo sappiamo che Per la definizione della phi di Eulero Per il piccolo teorema di Fermat: Per il teorema cinese dei resti

In realtà è sufficiente lambda(n)= mcd( phi(p), phi(q))

Il funzionamento di RSA si basa su una estensione del teorema di Fermat. Da quest'ultimo sappiamo che per ogni esponente congruo a 1 modulo la phi di Eulero di un primo p vale la relazione di cui sopra. Grazie al teorema cinese possiamo mettere insieme queste relazioni per diversi primi. Di fatto la relazione:
mphi(n)+1=m (mod n)
vale per ogni n libero da quadrati.

Osservando meglio l'uso del teorema cinese, si può notare che alla phi di Eulero possiamo sostituire la lambda di Carmichael.


Settimo lucido [PNG ~17Kb]

SSH

Obiettivo

rendere sicura la gestione remota di un account.

File

bodrato@socrate 12:07:36 ~>ls .ssh
authorized_keys  identity         known_hosts
config           identity.pub     random_seed

Lo scopo di SSH consiste nel far sí che la password di un utente non cada nelle mani sbagliate e che chi non è autorizzato non possa accedere alle risorse dell'account. In questa ottica SSH è piú che altro un programma che garantisce autenticazione, piú che segretezza.

Che la comunicazione venga cifrata serve principalmente se vogliamo effettuare piú collegamenti in cascata. Se vogliamo una password non possa essere intercettata è necessario che ogni canale attraverso cui questa passa sia cifrato

SSH ha comunque anche un metodo di autenticazione continua della comunicazione che impedisce anche infiltrazioni ad identificazione avvenuta.

I file di configurazione e gestione di ssh si trovano nella directory dell'utente nella sottodir .ssh

authorized_keys
collezione di identità pubbliche cui è consentito l'accesso.
config
varia configurazione: algoritmi da usare, compressione, etc...
identity
parte privata della coppia RSA per l'identificazione
identity.pub
identità "pubblica": chiave "pubblica" RSA
known_hosts
collezione di chiavi pubbliche delle varie macchine, per garantirne l'identificazione
random_seed
"entropia" conservata da una volta all'altra.

Ottavo lucido [PNG ~19Kb]

SSH versus man in the middle

Prima connessione

bodrato@socrate 11:39:58 ~>ssh gauss.dm.unipi.it
Host key not found from the list of known hosts.
Are you sure you want to continue connecting? no

Attacco o amnesia

bodrato@socrate 11:42:04 ~>ssh posso.dm.unipi.it
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@      WARNING: HOST IDENTIFICATION HAS CHANGED!       @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now
(man-in-the-middle attack)! It is also possible
that the host key has just been changed.
Please contact your system administrator.
Add correct host key in /home/bodrato/.ssh/known_hosts to
get rid of this message. Agent forwarding is disabled to
avoid attacks by corrupted servers. X11 forwarding is
disabled to avoid attacks by corrupted servers.
Are you sure you want to continue connecting (yes/no)? no

Il primo di questi messaggi appare la prima volta che ci connettiamo ad una macchina. SSH non può ancora riconoscere l'host e ci chiede se contiuare. Se non siamo i sistemisti della macchina in questione non abbiamo molte altre possibilità che accettare e sperare che l'host non fosse vulnerabile proprio in quel momento.

Il secondo invece rivela che c'è effettivamente qualche cosa che non va. In questo caso la risposta corretta sarebbe no, a meno di non poter contattare direttamente il sistemista della macchina in questione per sapere se effettivamente il messaggio non dipende da un attacco ma da una reinstallazione o altri effetti che hanno fatto dimenticare la propria identità alla macchina.


Nono lucido [PNG ~19Kb]

SSH: autenticazione RSA

@socrate>ssh-keygen
Initializing random number generator...
Generating p:  .........++ (distance 260)
Generating q:  ...++ (distance 64)
Computing the keys...
Testing the keys...
Key generation complete.
Enter file in which to save the key
  (/home/bodrato/.ssh/identity):
Enter passphrase:
Enter the same passphrase again:
Your identification has been saved in
 /home/bodrato/.ssh/identity.
Your public key is:
1024 33 152589...644337 bodrato@socrate
Your public key has been saved in
 /home/bodrato/.ssh/identity.pub
@socrate>scp .ssh/identity.pub posso:
[email protected]'s password:

@posso>cat identity.pub >>.ssh/authorized_keys
@posso>rm identity.pub

@socrate>ssh posso
Last login: Mon Mar 13 11:15:43 2000 from linuz
@posso>

Una delle cose possibili con SSH è il collegamento da una macchina all'altra senza uso di password, tramite autenticazione RSA. Nell'esempio vogliamo poterci collegare da socrate a posso. Il primo passo consiste nel creare la coppia di identità su socrate con ssh-keygen. Quindi l'identità pubblica viene trasferita su posso e aggiunta alla lista delle chiavi autorizzate. A questo punto SSH non chiederà piú la password.


Decimo lucido [PNG ~11Kb]

SSH: Esempio avanzato

Posta remota

sotto KDE

~/.kde/share/applnk/apps/postaremota.kdelnk

SwallowExec=ssh -n cibs xbiff -name cibsbiff
SwallowTitle=cibsbiff
Exec=ssh -C -t -x cibs pine
Terminal=1

senza KDE

ssh -f -n cibs xbiff
xterm -e ssh -C -t -x cibs pine

Una volta abilitata l'autenticazione RSA, si può usare SSH per eseguire programmi su una macchina remota senza problemi di sicurezza. Qui userò come esempi xbiff e pine, usati per gestire la posta su una macchina remota.

Il primo esempio si basa su KDE. l'obiettivo è di incastonare xbiff nel pannello e far sí che premendolo venga lanciato pine. Il tutto si ottiene creando un link per KDE e quindi inserendolo nel pannello.

Il nome della macchina remota in questo caso è cibs per usare unprogramma remoto che gira sotto X si usa il parametro -n per evitare che ssh legga dallo standard input ed eventualmente -f per permettere l'inserimento della password.
Se il programma ha bisogno di un terminale, la maggiore efficienza si ottiene lanciando il terminale in locale, quindi dicendo a ssh di comprimere la connessione (-C) e di far partire il programma in un terminale virtuale con -t.



Ultimo lucido [PNG ~10Kb]

Quanto fidarsi

In primo luogo va detto che per il momento non esistono sistemi la cui sicurezza sia dimostrabile matematicamente, si sa che non sono mai stati pubblicati algoritmi efficienti per rompere alcuni dei sistemi di crittografia piú: in voga, ma questo non significa che tali algoritmi non esistano.

Dalle definizioni formali di sicurezza di un crittosistema si vede che la segretezza dell'algoritmo è del tutto ininfluente rispetto alla sicurezza. Questa considerazione unita alla successiva, ci fanno capire perché il miglior software crittografico in circolazione sia quello di cui ci viene fornito il sorgente. Se vi tengono nascosto il sorgente, sotto può esserci qualunque inghippo (incapacità di programmatori/progettisti o addirittura dolo) e la sicurezza non può essere garantita.

Come ultima considerazione non possiamo non ricordare che un uso non corretto dei programmi di crittografia può renderli del tutto inefficaci, con il fastidioso effetto collaterale del falso senso di sicurezza.