Nous allons commencer cette longue série sur la cryptographie appliquée avec python.
Nous allons commencer par AES.
Qu'est-ce que le chiffrement AES ?
L'Advanced
Encryption Standard (AES) est le chiffrement symétrique le plus
largement utilisé. Aujourd'hui, bien que le terme "Standard" dans son
nom se réfère uniquement au gouvernement américain, le chiffrement en
masse AES est également obligatoire dans plusieurs normes de l'industrie
et est utilisé dans de nombreux systèmes commerciaux. Les normes
commerciales des systèmes AES incluent la norme de sécurité Internet
IPsec, TLS, le chiffrement Wi-Fi, la norme IEEE 802.11i, le protocole
réseau SSH (Secure Shell), le téléphone Internet Skype et de nombreux
produits de sécurité dans le monde. À ce jour, il n'y a pas de
meilleure attaque que la force brute connue contre AES.
Avec AES, nous avons des blocs de 16 octets (128 bits) et des tailles de clé de 16, 24, 32 octets
Paramètres d'entrée/sortie AES
Pour en savoir plus sur le cryptosystème AES, vous pouvez regarder la vidéo de Christof Paar.
Nous
passons par un certain nombre de processus et où nous opérons sur 16
octets en entrée et en sortie. Chaque bloc, appelé état, est exploité
comme une matrice 4x4, telle que :
01 02 03 04 05 06 06 07 08 09 0A 0B 0C 0D 0E 0F
Pour différentes tailles de clés, on passe par un certain nombre de tours (N) :
La
figure 1 ci-dessous décrit le processus de chiffrement 128 bits, et où
nous avons 10 tours. Pour une clé de 128 bits, elle est étendue à 44
mots de 33 bits chacun, et où chaque tour utilise quatre mots (128 bits)
en entrée pour chaque tour. Au tour 0, la transformation initiale
consiste à ajouter un clé en main. Les tours suivants (hormis le tour
final) consistent en :
1. Octets de substitution. 2. Décalez la ligne. 3. Colonne de mélange. 4.Ajoutez une clé d'arrondi.
Et le tour final consiste en :
1. Remplacez les octets. 2. Décaler la ligne. 3.Ajoutez une clé d'arrondi.
Figure 1
S-box et S-box inversée
Dans
le cadre du processus, transforme les entrées en une nouvelle valeur en
tant que sortie de chaque état en une nouvelle valeur à l'aide d'un
tableau S-box (comme le tableau 1). Dans ce cas, la table S-Box est une
matrice 16x16 qui prend chaque valeur d'entrée, où les quatre premiers
bits sont utilisés pour définir la ligne de la table, et les quatre bits
suivants définissent la colonne (Figure 2.a). Par exemple, si l'octet
d'entrée est CF, la sortie sera 8A. La S-box inverse le processus de la
S-box, de sorte que le DF se réfère au CF (Figure 2.b).
Figure 2
Voici quelques exemples de code Python3 qui implémente la S-box et la S-box inversée :
def subBytes(state): for i in range(len(state)): state[i] = sbox[state[i]]
def subBytesInv(state): for i in range(len(state)): state[i] = sboxInv[state[i]]
state=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
subBytes(state) print("s-box: ", state)
subBytesInv(state) print("inverse of s-box: ", state)
Si nous exécutons quelques
exemples de données, nous pouvons voir que nous récupérons les données
d'origine lorsque nous implémentons la S-box inverse :
Transformation de ligne de décalage (Shift Row Transformation)
Avec ce processus, la transformation suivante est appliquée : 1. La première ligne reste inchangée. 2. La deuxième ligne a un décalage circulaire d'un octet vers la gauche. 3. La troisième ligne est décalée de deux octets vers la gauche. 4. La quatrième ligne est décalée de trois octets vers la gauche.
Par exemple:
54 33 AB C1 -> 54 33 AB C1
32 15 8D BB -> 15 8D BB 32
5A 73 D5 52 -> D5 52 5A 73
31 91 CC 98 -> 98 31 91 CC
Pour le processus inverse, un décalage vers la droite sera utilisé. Voici un exemple de code de décalage :
def rotate(word, n): return word[n:]+word[0:n] def shiftRows(state): for i in range(4): state[i*4:i*4+4] = rotate(state[i*4:i*4+4],i)
def shiftRowsInv(state): for i in range(4): state[i*4:i*4+4] = rotate(state[i*4:i*4+4],-i)
Dans
cette transformation, chaque colonne est prise une par une et chaque
octet de la colonne est transformé en une nouvelle valeur basée sur les
quatre octets de la colonne. Pour chaque colonne (a0, a1, a2 et a3)
nous avons (où nous utilisons la multiplication de Galois)
Le code Python pour la transformation de colonne (MIX Column) pour une seule colonne est :
from copy import copy
def galoisMult(a, b): p = 0 hiBitSet = 0 for i in range(8): if b & 1 == 1: p ^= a hiBitSet = a & 0x80 a <<= 1 if hiBitSet == 0x80: a ^= 0x1b b >>= 1 return p % 256
Aucun commentaire:
Enregistrer un commentaire