Le fonctionnement du DES

Histoire

Jusqu'à la moitié du XXe siècle, une multitude de chiffres, plus ou moins efficaces, se font concurrence pour assurer la confidentialité des messages transitant, de plus l'avènement de l'informatique et la démultiplication des communications à travers le monde ont accéléré un processus de détermination d'un standard de chiffrement sécurisé. C'est dans ce contexte, que le 15 mai 1973 le NBS (National Bureau of Standards, aujourd'hui appelé NIST - National Institute of Standards and Technology) a lancé un appel dans le Federal Register (l'équivalent aux États-Unis du Journal Officiel en France) pour la création d'un algorithme de chiffrement répondant aux critères suivants :

  • Le seul secret doit être la clef, et non l'algorithme.
  • La clef doit à la fois servir au chiffrement et au déchiffrement.
  • Il doit être compréhensible.
  • Il doit être économique et adaptable.
  • Il doit être efficace, rapide et exportable.

Plusieurs algorithmes ont alors été présentés, mais aucun d'entre eux n'a satisfait la NSA et le NBS. C'est alors, après la nouvelle publication de l'appel le 27 août 1974, que l'entreprise IBM présenta un algorithme considéré comme acceptable auprès des agences américaines. Il s'agit de l'algorithme nommé Lucifer. 

Dans le but de valider sa solidité face aux attaques, la NSA s'empara de l'algorithme et le modifia. Elle diminua la longueur de la clef, la ramenant de 112 bits a 56 bits et modifia les S-box qui le constituent. De nombreuses et diverses critiques ont été reçues, notamment sur la taille de la clef, qui a été raccourcie, et les mystérieuses S-box. On soupçonnait que l'agence d'espionnage avait secrètement affaibli l'algorithme afin qu'ils (mais personne d'autre) puissent facilement lire les messages chiffrés. Malgré ces suppositions, l'algorithme a su se montrer efficace et sécurisé, jusqu'à ce que la taille de clef soit un problème du fait de la puissance de calcul des ordinateurs modernes.
Quoi qu'il en soit, le DES a finalement été approuvé en novembre 1976 et défini en tant que norme FIPS (Federal Information Processing Standard - En gros, une norme de chiffrement).

 

Fonctionnement

Le DES est un algorithme de chiffrement symétrique par bloc de 64 bits, basé sur un schéma de Feistel et prenant en paramètre une clef de 64 bits (Oui j'ai dit plus haut 56 bits, car dans la réalité on lui associe une clef de 64 bits dont seulement 56 sont utiles au chiffrement, les 8 bits restants servent à des calculs de parité, non évoqués dans cet article).

Pour résumé voici les grandes étapes :

  • Fractionner le texte en blocs de 64 bits (8 octets) ;
  • Permutation initiale des blocs ;
  • Découpage des blocs en deux parties : gauche et droite, nommées G et D ;
  • Étapes de permutation et de substitution répétées 16 fois (appelées rondes) ;
  • Concaténation des parties gauche et droite
  • Permutation initiale inverse.

Voici, pour les impatients, un schéma rapide qui résume grossièrement le fonctionnement du DES :

 

Permutation initiale des blocs

La première étape est de prendre les 64 bits du bloc à chiffrer et effectuer les permutations définies dans le tableau suivant : 

  PI  
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


Ce tableau peut être vu comme une matrice de permutation qui va effectuer des permutations sur chaque bit du bloc. Dans notre cas, on peut comprendre que le 58ème bit du bloc à chiffrer arrive en première position, que le 50ème arrive en seconde position, et que le dernier bit du bloc une fois permuté était le 7ème bit du bloc d'origine.

 

Découpage des blocs en deux parties

Maintenant que la permutation est réalisée nous allons commencer le schéma de Feistel, en divisant le bloc de 64 bits en deux blocs de 32 bits, notés respectivement G et D (pour gauche et droite, la notation anglo-saxonne étant L et R pour Left and Right). On note G0 et D0 l'état initial de ces deux blocs. Cette division se fait à travers les matrices suivantes :

  G0  
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

 

     D0     
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

 

Fait intéressant : on peut remarquer que la séparation des deux blocs a été faite en fonction de la parité de la position. En effet, tous les bits ayant une position paire se retrouvent dans la branche de gauche, alors que les positions impaires se retrouvent sur celle de droite.

Les rondes

Les rondes ou rounds en anglais, au nombre de 16, vont permettre de brouiller la donnée, par le biais de 4 étapes :

  • Une fonction d'expansion : Noté E
  • Un OU exclusif ( XOR ) : Noté +
  • Une fonction de compression (ou substitution) : Noté S
  • Un second OU exclusif ( XOR ) : Noté +

En voici une représentation.
 

 

 

 

La donnée arrive par la droite (32 bits) qui entre ensuite dans la fonction d'extension, qui fait passer la donnée de 32 a 48 bits, elle est ensuite Xoré avec la clef temporaire (nous verrons cela plus tard). Elle poursuit son chemin dans la fonction de compression qui va à nouveau faire passer la donnée de 48 à 32 bits, avant d'être Xoré avec la donnée de gauche pour finir la ronde.

Fonction d'expansion

Première action de la ronde, cette fonction prend en entrée un bloc de 32 bits et ressort un bloc de 48 bits. Pour arriver à ce résultat, la fonction va suivre une matrice d'expansion (appelée table d'expansion E), qui va intervertir des bits et en dupliquer certains :

  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

 

Ainsi en suivant la même logique que précédemment, le 32ème bit du bloc entrant devient le premier, le premier devient second, etc ... . Nous remarquons que les bits 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29 et 32 sont dubliqués en gras sur cette matrice.

 

Fonction OU exclusif ( XOR )

Il résulte donc de la fonction d'expansion une chaîne de 48 bits qui va être Xoré avec la clef temporaire. Nous verrons plus tard pourquoi, temporaire, et comment elle est générée, tout ce qu'il faut retenir, c'est que cette clef fera toujours 48 bits.
Petit rappel de la table de vérité d'un XOR

A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0

 

Fonction de compression

La fonction de compression ou S-box (oui, ce sont les fameux objets vus dans la partie Histoire que la NSA a modifié, sans trop d'explications), est une fonction qui va transformer les 48 bits d'entrée en 32 bits à la sortie. Pour ce faire elle ne va pas utiliser une, ni deux, ni trois, mais ... huit matrices de substitution ! Le bloc d'entrée (48 bits) va être divisé en 8 blocs de 6 bits, et à chaque bloc sera associé une S-box, respectivement le premier bloc aura la première S-box (S1), le second la seconde (S2), etc jusqu'au 8ème bloc qui aura S8.

Voici la première fonction de substitution, représentée par une matrice de 4 par 16 :

 

  S1  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
2 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
3 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13


Puis pour trouver les bits associés à travers cette matrice nous utilisons nos 6 bits (trouvés précédemment), le premier et le dernier définirons la ligne a utiliser sur la matrice et les quatre bits restants (2, 3, 4, 5) identifierons la colonne à utiliser. Le résultat sera l'intersection en binaire de la ligne et de la colonne précédemment trouvées.

Un exemple est le bienvenu :

Après avoir divisé mon bloc d'entrée de 48 bits en 8 blocs de 6 bits, je récupère le premier bloc : 101000.

  • Je récupère le premier et le dernier bit : 1,0
    • Je regarde l'équivalent de 10 en base 10, c'est 2.
    • Donc ma ligne sera la 3ème (numérotée 2)
  • Je récupère les 4 bits non utilisés : 0100
    • Je regarde l'équivalent de 0100 en base 10, c'est 4.
    • Donc ma colonne sera la 5ème colonne (numérotée 4)
  • Je cherche l'intersection entre la 3ème ligne et la 5ème colonne :  13
    • Je retourne l'équivalent de 13 en binaire : 1101

Et pour le plaisir de vos yeux voici les 7 autres S-box:

 

 
  S2  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
1 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
2 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
3 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
 
  S3  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
1 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
2 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
3 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
 
  S4  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
1 13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
2 10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
 
  S5  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
1 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
2 4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
3 11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
 
  S6  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
1 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
2 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
3 4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
 
  S7  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
1 13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
2 1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
3 6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
 
  S8  
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
1 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
1 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11

 


De chaque bloc, il ressort un ensemble de 4 bits, ce qui formera donc bien un nouveau bloc de 32 bits.

Seconde fonction OU exclusif ( XOR )

Une nouvelle fois, un Xor va être effectué. Mais cette fois entre les 32 bits de la branche de droite (voir le schéma ci-dessus) et le résultat de la fonction précédente (S-box). Une fois ce Xor effectué le tour de ronde est fini. Pour rappel, cette ronde est effectuée 16 fois.

 

Permutation final des blocs

Une fois les 16 rondes effectuées, les blocs de gauche (G16) et droite (D14) sont recollés par la matrice suivante :

 

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

 

Et si tout va bien nous voici à nouveau avec un bloc de 64 bits, mais chiffré via DES !

Génération des clef DES

Et oui comme tu as pu le voir dans le titre, ou le comprendre plus haut, il n'y a pas qu'une seule clef, mais plutôt 16. Mais ces 16 clefs sont dérivées d'une seule et même clef, et devines quoi ? C'est encore et toujours grâce à des matrices de permutations ! Voici comment ça se passe !

Comme on l'a vu au début, dans les 64 bits de clef de chiffrement seulement 56 sont utilisés :

 

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

 

Et comme le montre cette matrice de permutation les bits multiples de 8 ne sont pas utilisés (8, 16, 24, 32, 40, 48, 56, 64), et pour les yeux les plus experts, vous remarquerez qu'il n'y a pas un tableau, mais deux. En effet, la prochaine étape est de séparer le bloc de 56 bits (ci-dessus) en deux blocs composés de 28 bits :

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

Chaque moitié de clef subit une rotation à gauche d'un bit aux étapes 1, 2, 9, 16 et deux bits aux autres étapes.

Puis on en ressort une clef de 48 bits en concaténant les deux blocs et en leur appliquant cette dernière permutation :

 

  CP-2  
14 17 11 24 1 5 3 28 15 6 21 10
23 19 12 4 26 8 16 7 27 20 13 2
41 52 31 37 47 55 30 40 51 45 33 48
44 49 39 56 34 53 46 42 50 36 29 32

 

Si tout va bien nous aurons pour chacune des 16 étapes une clef de chiffrement pour la ronde associée.

 

Conclusion

Et voici donc le fonctionnement de cet algorithme emblématique de la fin du XXème siècle. Déprécié à ce jour, du fait de sa clef de trop petite taille, il ne doit plus être utilisé tel quel pour assurer la confidentialité des messages. Mais son fonctionnement n'en reste pas moins intéressant. En effet, le schéma de Feistel qui le compose, a été moulte fois cryptanalysés, mais jamais vraiment "cassé" proprement parlant, des attaques de type cryptanalyse linéaire/différentielle, ont réussi à éprouver quelques faiblesses, mais sur des versions affaiblies du schéma (avec moins de tours).
Si l'on parle des attaques sur le DES, d'un point de vue général, c'est la même chose que pour son schéma de Feistel, les meilleures cryptanalyses sont basées sur des attaques de type cryptanalyse linéaire/différentielle, mais toujours sur des versions affaiblies du DES, sa vraie faiblesse réside donc bien et uniquement en la taille de sa clef.
Aujourd'hui, avec la puissance des ordinateurs modernes, du cloud et de la parallélisation, une clef DES peut être cassée en moins d'une journée. Augmenter la taille de clef semble donc être la solution, mais en vain. Des propositions d'amélioration du DES avec des clefs plus grandes ont été faites, mais à chaque fois il en découlait un affaiblissement de l'algorithme. Seule solution, enchaîner deux, voir trois, chiffrements DES à la suite ?

le 26 nov. 2024 07:37

Ajouter un commentaire

Vous devez avoir un compte actif pour laisser des commentaires. Veuillez vous connecter, ou vous creer un compte.

0 Commentaire

Il n'y a pas encore de commentaire. Sois le premier à en déposer un !