domenica 22 gennaio 2017

Dentro l'algoritmo DES

Premetto che non sarà semplice seguire il funzionamento di questo algoritmo, ma tenterò di rendere la spiegazione più semplice possibile.
I principi su cui si basa l'algoritmo sono sostituzione, permutazione  e combinazione tra  i blocchi di testo e la chiave.
La chiave è composta da 64 bit, ma soltanto 56 di questi sono utilizzati per criptare il messaggio.

Il messaggio viene criptato in blocchi da 64 bit.
Il primo passaggio è una permutazione (indicata con IP ossia initial permutation) dei bit del blocco di testo da 64 bit secondo la seguente matrice:

                         IP 
58, 50, 42, 34, 26, 18, 10,  2,
 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14,  6,
 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17,  9,  1, 
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13,  5, 
63, 55, 47, 39, 31, 23, 15, 7

Nella matrice viene indicata la precedente posizione del bit e l'attuale posizione dopo la permutazione (il 58° bit del messaggio originale si trova in 1° posizione, il 50° in 2°, ecc..).

Il passaggio successivo divide il blocco ottenuto dalla permutazione in due blocchi da 32 bit, uno destro che chiameremo R0 (dall'inglese Right) e uno sinistro che chiameremo L0(dall'inglese Left).
I passaggi successivi verranno ripetuti in sequenza per 16 volte.
By Francisco Menendez (Own work)
[CC BY-SA 3.0], via Wikimedia Commons
Prendiamo il blocco Rn (con 0≤n≤16) e lo diamo in pasto a una funzione E che lo espande da 32 a 48 bit secondo la seguente matrice:

                    E
32,   1,    2,   3,     4,   5,
  4,   5,     6,   7,    8,   9,
  8,   9,  10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32,  1 

Otteniamo quindi E(Rn) composto da 48 bit. E(Rn) viene quindi combinato attraverso un'operazione di XOR (per chi non sappia cos'è lo rimando a Wikipedia) con una sotto-chiave Kn.

Otteniamo K, composta da 56 bit, dalla chiave iniziale  facendo una permutazione PC-1 .
La sotto-chiave (Kn) è ottenuta da K applicando tre passaggi alle due metà di K (C(n) e D(n)):

  1. Spostamento rotatorio verso sinistra dei bit delle due sotto chiavi
  2. unione delle due sotto chiavi in una sola da 56 bit 
  3. permutazione PC-2 dalla quale si ottiene Kn
Dopo l'XOR tra Kn e E(Rn) otteniamo una stringa di bit che viene divisa in 8 blocchi da 6 bit ciascuno(B1, B2,...,B8). Ognuno di questi blocchi viene ridotto da 6 a 4 bit attraverso l'utilizzo di 8 diverse Substitution-Box (link a Wikipedia per la spiegazione su come funzionano).
I blocchi da 4 bit vengono concatenati per ottenere di nuovo un blocco da 32 bit.

Il blocco di 32 bit così ottenuto viene a sua volta permutato secondo una matrice P ottenendo Q:
             P
16,   7, 20,   21,
29, 12, 28,  17, 
  1, 15,  23, 26, 
  5, 18,  31, 10, 
  2,   8,  24,  14, 
32, 27,   3,     9, 
19, 13, 30,    6, 
22, 11,   4,   25

A questo punto viene fatto l'XOR tra Ln e Q, ottenendo così Rn+1. Ln+1 sarà invece uguale a Rn.
Applichiamo i passaggi fino ad ottenere R16 e L16.
Concateniamo L16 e R16 e la stringa di bit così ottenuta la permutiamo secondo una matrice inversa a IP in cui quindi il 40° bit torna a essere il 1°, il 1° torna a essere il 58° ecc.
Così il nostro blocco iniziale è stato criptato in un blocco di 64 bit.

Spero di essere stato abbastanza chiaro sul funzionamento di questo algoritmo, e vi rimando alla lettura del documento fips46-3 (PDF in inglese) per le matrici PC-1 (pag.19) PC-2 (pag.21) e le S-Box (pag.17). 
Se siete interessati ad un'implementazione in c vi rimando alla lettura dei sorgenti della glibc(in particolare dei files crypt* presenti nella cartella crypt dei sorgenti).

Nessun commento:

Posta un commento