Chapitre 4

Les principales fonctions de l'AES.

On rappelle que le tableau State[4][4] contient , pour chacun des 15 rounds ,
l'état de la progression de l'encryptage .
Les fonctions qui suivent s'appliquent toutes à State[][] lors des différents rounds .
Leurs identificateurs sont ceux définis par FIPS.

La fonction MixColumns().

Cette fonction effectue le produit matriciel de mixc[4][4] par State[4][4] .
Le produit de 2 éléments de matrice est au sens du produit de 2 éléments de GF(2^8).
Le résultat du produit devient la nouvelle valeur de State[][].


byte mixc[4][4] = {
    2, 3, 1, 1,
    1, 2, 3, 1,
    1, 1, 2, 3,
    3, 1, 1, 2
};

void MixColumns(){	// MLT() effectue le produit dans GF(2^8)
		byte aux[4][4]     ;
    	unsigned i, j, k   ;
    
    for(i=0;i<4; i++){
        for(j=0; j<4; j++){
            aux[i][j] = 0 ;
            for(k=0;k<4;k++)aux[i][j]= aux[i][j] ^ MLT(mixc[i][k],State[k][j]);
        }
    }
    for(i=0; i<4; i++){
        for(j=0; j<4; j++)State[i][j] = aux[i][j] ; 
    }
}

La fonction SubByte().

Cette fonction applique à chaque élément du tableau Stat[][] la fonction sbx()
(voir le chapitre consacré à la S-Box) qui utilise la S-Box pour modifier la valeur de cet élément .


void SubByte(){
    unsigned i,j    ;
    
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)State[i][j]= sbx(State[i][j]) ;
}

La fonction ShiftRows().

Cette fonction décale chaque ligne de State[][] à gauche suivant son rang.
La ligne 0 n'est pas décalée.
La ligne 1 est décalée de 1 à gauche etc ...


void ShiftRows(){
    //  chaque ligne de State[][] est décalée à gauche de son rang
    unsigned i,j,k  ;
    byte    aux     ;
    
    for(i=0; i<4; i++){
        for(k=0; k< i; k++){
            //  tourner de k
            aux = State[i][0]  ;
            for(j=0; j< 3 ; j++){
                State[i][j] = State[i][j+1]  ;
            }
            State[i][3] = aux   ;
        }
    }
}

La fonction AddRoundKey().

Cette fonction effectue un ou exclusif entre tous les éléments de State[i][j]
et de l'élément [i][j] de la clef correspondant à ce round.
La clef est vue comme un tableau 4x4 .

AddRoundKey(unsigned round){
    unsigned c, i , index   ;
    
    for(c=0;c<4; c++){
        for(i=0; i<4; i++){
            index = 16*round + 4*c + i              ;
            State[i][c]= State[i][c]^ KEY[index]    ;
        }
    }
}