Introduction à la Cryptographie
TP2/TP3 : AES sur une plateforme 32 bits


But du TP :  Compléter le programme aeslib.c qui permettra de chiffrer avec l'AES sur une plateforme 32 bits pour une clé de 128 bits par blocs de 128 bits.

On note F le corps fini à 256 éléments engendré par une racine primitive de x^8+x^4+x^3+x+1

Génération de la clé
  1. En utilisant la commande Unix $dd if=/dev/random of=key  bs=1 count=16 vous pouvez générer aléatoirement une clé 128 bits.
Structure de données

Etudier les structures de données du programme
aeslib.c et aeslib.h, comment sont stockés la clé, le clair, les éléments de F? Etudier les opérations de décalage sur les octets, sur les mots de 32 bits.

Chiffrement
  • La fonction ByteSub
  1. Ecrire la fonction BYTE xtime(BYTE x) qui multiplie par x un polynôme de degré au plus 7 (multiplication par la racine primitive d'un élément a du corps F).
  2. Ecrire la foncyion BYTE bmul(BYTE x, BYTE y) qui retourne le produit de deux éléments du corps F.
  3. Ecrire la fonction BYTE ByteSub(BYTE x) qui retourne le transformé de x dans F par ByteSub.

  4. ByteSub( x)
    y <- inversede(x) dans F (attention par convention inversede (0)=0)
    soit (y_7, y_6,...,y_0) la notation binaire de y
    c <- (01100011)
    les indices sont calculés modulo 8
    pour i allant de 0 à 7
        b_i <- y_i+y_(i+4)+y_(i+5)+y_(i+6)+y_(i+7)+ c_i mod 2
    retourner (b_7,b_6, ....,b_0)
  • Génération des tables
La fonction int gentables(int size, int sizekey, BYTE *key) permet de génerer les tables nécessaires au chiffrement et déchiffrement de l'AES pour des blocs de size octets, une clé de sizekey octets.
  1. En utilisant ByteSub(x) générer le tableau de 256 octets fbsub  qui contient les images de tous les éléments de F par ByteSub (fbsub[i] <- ByteSub(i))
  2. Construire le tableau ftable de 256 mots (32 bits) tel que ftable[i]<- T_0[i].
  • fonction de chiffrement
  1. Compléter la fonction void encrypt (BYTE *buff)
  2. Tester votre le chiffrement de blocs de 128 bits avec une clé de 128 bits avec par exemple
                clair :  32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34 
                clé :    2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c       

Déchiffrement
  • Génération des tables

Vous disposez du tableau de 256 octets rbsub qui contient les images par l'application inverse de ByteSub(x) et du tableau rtable de 256 mots (32 bits) tel que rtable est l'inverse de ftabledans le fichier aeslib.c
  • fonction de déchiffrement
La fonction void decrypt (BYTE *buff) est disponible dans aeslib.c
  1. Tester votre le déchiffrement de blocs de 128 bits avec une clé de 128 bits.
Protocole d'échanges de clés
  • Le protocole de Diffie-Hellman
On dispose d'un entier premier p et g un générateur de Zp*, les données p et g sont publiques
Si Alice et Bob désire partager une clé secrète K.
Alice choisit un entier a (1<= a <= p-2) et transmet (g^a modulo p) à Bob
Bob choisit un entier b
(1<= b <= p-2) et transmet (g^b modulo p) à Alice
La clé partagée K est g^{ab} modulo p

Pour établir une clé secrète vous disposez d'un entier p de 1023 bits
p=DCFAC4EFE89F5B082962AB9A67E8D63E84FA491E5D3874978815868595469163DA0661E6208A8C2CD4F83893B53864ADFD2154E8D8EFA146BAD808562E4BF6C90348FD79EEB3387D93FC7943BC450BA55399BA3CF3DFBD0D4E71800007B0E9D5F12E7A2CB7EA4E49812E715F8DC570C478DC2DEB1C49B0AE87A5DF5449C221CB
g=2

  • Choix de la clé secrète
  1. En utilisant la librairie GMP pour faire les calculs sur les grands entiers, établir une clé secrète avec un interlocuteur.
Echange de données chiffrées
  1. Echanger des messages chiffrés avec l'AES 128 bits avec l'interlocuteur avec qui vous avez convenu d'une clé secrète