245
modifications
Ligne 477 : | Ligne 477 : | ||
=== Advanced Encryption Standard === | === Advanced Encryption Standard === | ||
*A | |||
L'algorithme symétrique utilisé par Tor pour protéger les données est l'Advanced Encryption Standard, plus communément appellé AES. C'est l'un des algorithmes les plus robustes qui existe à ce jour. Accessoirement, c'est aussi l'algorithme qui sécurise vos échanges de données quand vous allez sur Psychoactif. AES fonctionne de la façon suivante. Supposons que je veuille chiffrer le mot suivant : "Acide Lysergique". Les caractères en informatique sont codés via la table ASCII qui permet d'associer des nombres (de 0 à 255) à 256 symboles, ces nombres étant codés sur 8 bits (1 octet). Par exemple le L majuscule correspond à 76 (01001100 en binaire) dans la table ASCII. Donc : | |||
A c i d e L y s e r g i q u e | |||
65 99 105 100 101 32 76 121 115 101 114 103 105 113 117 101 | |||
L'algorithme AES travaille sur des blocs de 4*4 éléments qui font 128 bits (126/16 = 8 bits, on retrouve bien nos 8 bits qui codent les lettres). Là, j'ai bien choisi mon mot pour qu'il y aie pile poil 16 caractères. Mais si il faut chiffrer plus de données, AES crée d'autre blocs à la suite et remplit les blocs incomplets avec des données bidon. | |||
Du coup, voici mon bloc : | |||
65 99 105 100 | |||
101 32 76 121 | |||
115 101 114 103 | |||
105 113 117 101 | |||
La clé de AES est une clé maîtresse de 128, 192 ou 256 bits en fonction de la force de l'algorithme, et à partir de laquelle seront déduites des sous-clés de 128 bits. Ces sous-clés auront le même format qu'un bloc. Qu'elles se présenteront sous la forme d'une matrice aléatoire de 4*4. | |||
Et du coup, voici une sous-clé créée pour l'occasion qui est constituée de nombres aléatoires compris entre 0 et 255 : | |||
177 75 103 21 | |||
136 203 117 146 | |||
43 199 147 187 | |||
250 194 10 172 | |||
Ensuite, AES se déroule "tours" comportant 4 étapes plus un tour préliminaire. | |||
Tour préliminaire (AddRoundKey) : | |||
Il s'agit ici d'appliquer la fonction XOR (OU exclusif) entre chaque nombres du bloc à coder et chaque nombres de la clé. Pour bien comprendre, il faut passer en binaire. La fonction XOR renvoie 1 si les 2 bits en entrée sont différents et 0 s'ils sont identiques. Par exemple prenons notre première lettre (65) et le premier nombre de notre clé (177) : | |||
65 01000001 | |||
XOR 177 = XOR 10110001 = 11110000 = 240 | |||
A ce stade, notre matrice devient donc : | |||
240 40 14 113 | |||
237 235 57 235 | |||
88 162 225 220 | |||
147 179 255 201 | |||
Tours : | |||
1ère étape (Générique) : SubBytes | |||
On applique à chaque élément du bloc à chiffrer une fonction non-linéaire prédéfinie. L'idée de cette étape, c'est de changer drastiquement tous les éléments du bloc. En cryptographie, on appelle cette propriété la confusion, et les transformations non-linéaires sont parfaites pour ça (si vous voulez les détails technique, ça consiste à prendre l'inverse de ces éléments dans un corps de Galois GF(256) et d'y appliquer une relation affine). Concrètement, étant donné que cette étape est générique, on peut établir une table de conversion qu'on appelle une S-box (Substitution box) et qui est disponible ici en hexadécimal (https://en.wikipedia.org/wiki/Rijndael_S-box). Du coup, mon bloc devient : | |||
240 40 14 113 140 52 171 163 | |||
237 235 57 235 85 233 18 233 | |||
88 162 225 220 106 58 248 134 | |||
147 179 255 201 220 109 22 221 | |||
Deuxième étape (Générique) : ShiftRows : | |||
C'est très simple, on décale les lignes de la matrice suivant l'exemple donné ci dessous. L'idée, cette fois ci, est d'assurer ce qu'on appelle en cryptographie la diffusion. C'est à dire que le moindre changement dans le message de départ se répercutera de façon considérable dans l'algorithme et aboutira à un chiffré radicalement différent. | |||
140 52 171 163 140 52 171 163 | |||
85 233 18 233 233 18 233 85 | |||
106 58 248 134 248 134 106 58 | |||
220 109 22 221 221 220 109 22 | |||
3ème étape (Générique) : MixColumns | |||
Il s'agit cette fois ci de multiplier chaque colonne de la matrice par une matrice spéciale appellée MDS (Maximum Distance Separable). Cette matrice a été calculée pour optimiser la propriété de diffusion citée ci dessus. Concrètement, tous les éléments de la colonne vont s'influencer les uns les autres. Cette matrice est la suivante : | |||
2 3 1 1 | |||
1 2 3 1 | |||
1 1 2 3 | |||
3 1 1 2 | |||
Exemple avec la première colonne. La multiplication s'effectue dans un corps de Galois GF(2⁸) | |||
140 | |||
233 | |||
248 | |||
221 | |||
2 3 1 1 (2x140 XOR 3x233 XOR 1x248 XOR 1x221) = 50 | |||
1 2 3 1 (1x140 XOR 2x233 XOR 3x248 XOR 1x221) = 139 | |||
1 1 2 3 (1x140 XOR 1x233 XOR 2x248 XOR 3x221) = 242 | |||
3 1 1 2 (3x140 XOR 1x233 XOR 1x248 XOR 2x221) = 63 | |||
Donc la matrice devient : | |||
140 52 171 163 50 4 106 142 | |||
233 18 233 85 139 93 177 81 | |||
248 134 106 58 242 78 21 184 | |||
221 220 109 22 63 107 191 135 | |||
4ème étape (Dépendante de la clé) : AddRoundKey | |||
Il s'agit de la même chose que le tour préliminaire avec la fonction XOR, mais à partir d'une nouvelle sous-clé aléatoire déduite de la clé maîtresse (Une sous-clé aléatoire différente par tour), mettons : | |||
184 116 102 114 50 4 106 142 138 112 12 252 | |||
222 163 60 91 139 93 177 81 85 254 113 10 | |||
145 53 23 15 XOR 242 78 21 184 = 99 123 2 183 | |||
181 222 21 75 63 107 191 135 138 181 170 204 | |||
Ensuite, on recommence toutes ces étapes 10, 12 ou 14 fois en fonction de la taille de la clé maîtresse (AES 128/192/256 bits). A cette étape, si on reprend notre table ASCII, notre message initial (Acide Lysergique) ressemblerait à : | |||
138 112 12 252 85 254 113 10 99 123 2 183 138 181 170 204 | |||
Š p *FF* ü U þ q *LF* c { *STX* · Š µ ª Ì | |||
Šp*FF*üUþq*LF*c{*STX*·ŠµªÌ | |||
== Références == | == Références == | ||
<references/> | <references/> |
modifications