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
|
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)):
- Spostamento rotatorio verso sinistra dei bit delle due sotto chiavi
- unione delle due sotto chiavi in una sola da 56 bit
- 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