ShiftRow
ShiftRow aplica corrimientos circulares a la izquierda, a cada una de las filas de la matriz de estado de la siguiente forma: primera fila cero corrimientos, segunda fila un corrimiento, tercera fila dos corrimientos y cuarta fila tres corrimientos, de esta forma, la matriz resultante se puede apreciar en la Figura # 2.
Figura # 2: Transformación ShiftRow [2].
MixColumns
Esta función permite la mezcla de los bytes de las columnas, considerando los bytes de cada columna, como polinomios cuyos coeficientes pertenecen a GF(28). Dicha función consiste en multiplicar las columnas módulo x4+1 por el polinomio c(x) donde:
c(x)=03x3+01x2+01x+02
O bien, en forma matricial,
Utilizando la aplicación Rijndael Animation [1], se puede comprobar el resultado de aplicar el procedimiento anterior, a la primera columna de una matriz de estado (ver Figura # 3), la cual va ha ser sustituida en la primera columna de la nueva matriz.
Figura # 3: Transformación MixColumns [1].
AddRoundKey
Sea la matriz [aij] la matriz de estado y [kij] la matriz de la clave correspondiente a dicha ronda. La función AddRoundKey consiste en realizar una xor entre las matrices de estado y la de la clave (Figura # 4), para luego, sustituir con el valor correspondiente.
AddRoundKeyAES128bits=[aij]xor[kij]
Figura # 4: Transformación AddRoundKey [2].
Generación de subclaves
Este proceso permite generar subclaves a partir de la clave del sistema. La clave se extiende a una lista de palabras de 4 bytes que llamados W y que contiene Nb(Nr+1) palabras, donde,
Nr=Max(Nk,Nb)+6=Número de rondas
Los primeros Nk elementos de W corresponden a la clave. El resto de los elementos de W se definen recursivamente utilizando la función SubByte, desplazamientos cíclicos y operaciones xor. En la Figura # 5 se puede apreciar W en forma de arreglo.
Figura # 5: Expanción de claves [3].
Ahora, se utiliza la función RotByte, la cual devuelve una palabra, cuyos bytes se han desplazado cíclicamente una posición a la izquierda. Se utilizan unas constantes cuyos valores son:
Rcon[i]=(RC[i],0x00,0x00,0x00)
Siendo RC[i] un elemento de GF[28] definido por:
RC[1]=0x01, RC[i]=0x02*RC[i-1]
Ahora bien, para Nk<=6 y para todo i que no sea múltiplo de Nk, las palabras claves se calculan:
W(i)=W(i-Nk) xor W(i-1)
y para todo i que sea múltiplo de Nk, las palabras claves se calculan:
W(i)=W(i-Nk) xor [ByteSub(RotByte[W(i-1)]) xor Rcon(i/Nk)]
Para el caso de Nk>6 el funcionamiento es el mismo que para Nk<=6 excepto que cuando i satisface i mod Nk=4 las subclaves se calculan:
W(i)=W(i-Nk) xor ByteSub(W[i-1])
Referencias
- http://www.formaestudio.com/rijndaelinspector/
- J A. AES - Advanced Encryption Standard. (2005) Versión 2005: .
- A M. Seguridad Europea para EEUU Algoritmo criptográfico Rijndael. Madrid (2004) : .
- Joan Daemen VR. AES Proposal: Rijndael. NIST AES Proposal (1998) : .
- http://www.cryptosystem.net/aes/
- http://www.criptored.upm.es
- http://www.kriptopolis.es