41
Implementaci´ on del Advanced Encryption Standard Rijndael en C Jorge Alfonso Briones Garc´ ıa Secci´ on Computaci´ on Departamento de Ingenier´ ıa El´ ectrica Centro de Investigaci´ on y de Estudios Avanzados del IPN Curso: C´ odigos y Criptograf´ ıa Profr. Dr. Francisco Rodr´ ıguez Henr´ ıquez exico, D.F. Agosto 5, 2002

Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Implementacion delAdvanced Encryption Standard

Rijndaelen C

Jorge Alfonso Briones GarcıaSeccion Computacion

Departamento de Ingenierıa ElectricaCentro de Investigacion y de Estudios Avanzados del IPN

Curso: Codigos y CriptografıaProfr. Dr. Francisco Rodrıguez Henrıquez

Mexico, D.F.

Agosto 5, 2002

Page 2: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Contenido

1.1 Rijndael . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Campos finitos binarios GF (2m) . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.2.1 GF (28) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.1 Aspectos de implementacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2 La librerıa de la implementacion . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.3 Implementacion del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.3.1 Definicion de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.3.2 Implementacion de los bloques basicos . . . . . . . . . . . . . . . . . 16

2.3.3 Implementacion del algoritmo . . . . . . . . . . . . . . . . . . . . . . 21

2.3.4 Implementacion de funciones de utilerıa . . . . . . . . . . . . . . . . 23

2.3.5 Implementacion de programas de prueba y aplicaciones . . . . . . . 25

3.1 Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.1.1 Pruebas con vectores de NIST . . . . . . . . . . . . . . . . . . . . . . 30

3.1.2 Pruebas de eficiencia . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.1.3 Pruebas cifrando archivos . . . . . . . . . . . . . . . . . . . . . . . . 36

1

Page 3: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Resumen

Rijndael es un metodo criptografico que ha cobrado una importancia significativa, ya queha reemplazado a DES, y se ha convertido en un estandar (AES). El siguiente documentosurge como parte del proyecto de implementacion de Rijndael (AES) en C, el documentoabarca desde la explicacion del algoritmo, una breve introduccion a la aritmetica de camposfinitos binarios, se presentan algunos detalles sobre la implementacion en C, se ilustra comousar el API para incorporar AES a una aplicacion, se muestran las pruebas realizadas a laimplementacion, finalmente explicamos la construccion de una mini-aplicacion que permiteel cifrado de archivos.

Page 4: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Introduccion

Rijndael es el metodo criptografico que vino a substituir a DES (Data Encryption Standard)el cual era uno de los algoritmos mas usados en el mundo, y que poco a poco es desplazadopor Rijndael.

El surgimiento de Rijndael es interesante, todo comienza en 1997, cuando el National Insti-tute of Standars and Technology (NIST) hacen un concurso para reemplazar a DES. Entrelos requerimientos estaba que el nuevo algoritmo deberıa de soportar llaves de tamano de128, 192, y 256 bits, deberıa operar en bloques de 128 bits, tambien deberıa de poder trabajaren un gran variedad de hardware, por ejemplo, procesadores de 8-bits que puedan ser usa-dos en tarjetas inteligentes (smart cards), en arquitecturas de 32 bits usadas comunmenteen computadoras personales, de igual manera fue importante la velocidad y la fortalezacritpografica [1].

Los cinco finalistas resultantes fueron: MARS (IBM), RC6 (RSA), Rijndael (Joan Daemen yVincent Rijmen),Serpent (Ross Anderson, Eli Biham, y Lars Knudsen), Twofish (Bruce Schneier,John Kelsey, Doug Whiting, David Wagner, Chris Hall, y Niels Fergunson)

Finalmente, en octubre 2 de 2002, NIST anuncio que el metodo criptografico ganador de lacompetencia de AES (Advanced Encryption Standard) era Rijndael.

Rijndael es el metodo que se escogio para su implementacion, y aunque oficialmente es unestandar para el gobierno de los Estados Unidos, se espera que tambien sea adoptado porotros gobiernos. Este hecho fue una de las motivaciones mas fuertes del proyecto.

El proyecto realizara la implementacion del algoritmo, de esta resultara una librerıa la quedespues va a ser usada para el desarrollo de la aplicacion de prueba.

Considero de gran importancia el que surga una librerıa a partir de la implementacion deRijndael, ya que existen muchas posibilidades para que en aplicaciones posteriores se reuseesta, y se anada seguridad a las aplicaciones.

Las fases del proyecto se organizaron de la siguiente manera:

1

Page 5: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

1. Investigacion y recoleccion de informacion acerca de AES.

2. Comprension y estudio del algoritmo.

3. Implementacion de las operaciones basicas del algoritmo.

4. Implementacion del algoritmo.

5. Desarrollo de la aplicacion de prueba usando la librerıa resultante de la implementacion.

6. Documentacion del proyecto y de la librerıa.

7. Pruebas de la implementacion y de la librerıa.

Evidentemente algunas fases se realizan durante todo el proyecto, entre ellas esta la primeraque es la investigacion y recoleccion de informacion, y la fase de documentacion.

El documento esta organizado de la siguiente manera, en la siguiente seccion explicamosel problema que deseamos atacar, en la seccion posterior se explica algunos detalles deimplementacion del algoritmo, posteriormente se explica la librerıa de la implementacion,luego algunos lineamientos de la aplicacion de prueba y finalmente como se realizaran laspruebas.

2

Page 6: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Analisis del Problema

De forma general el objetivo principal del proyecto es realizar la implementacion del metodocriptografico en C, pero de forma particular el proyecto al final debe de cumplir con ciertosrequerimientos que hemos definido como:

• Generacion de un documento general que explique la implementacion

• Generacion de una librerıa en C que tenga funciones que permita a otras aplicacionescontar con el metodo criptografico Rijndael

• Generacion de una aplicacion de prueba que muestre el uso de la librerıa generada.

• Establecer de alguna manera pruebas que permitan medir la eficiencia de la imple-mentacion

Considero de importancia la librerıa ya que va a permitir que otras aplicaciones usen esta ycifren la informacion que estan procesando.

Para poder cumplir con este objetivo uno de los primeros pasos que debemos llevar a caboes la comprension del algoritmo, ya que esto nos permite identificar, sus principales bloquesde construccion, las herramientas matematicas que necesitan ser implementadas y de igualmanera tambien nos permite definir una estrategia de diseno para la librerıa.

1.1 Rijndael

Rijndael es un metodo criptografico de cifrado de bloque, en Rijndael tanto la longitud delbloque como la longitud de la llave son variables. Ellos pueden ser variados de maneraindependiente entre 128 y 256 bits en incrementos de 32 bits. Sin embargo, NIST solo va aestandarizar las versiones con un bloque de entrada de longitud de 128 bits y una llave delongitud de 128,192 y 256 bits [2].

3

Page 7: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Rijndael fue disenado tambien para ofrecer resistencia al criptoanalisis lineal y diferencial.En la estrategia, las rondas de transformacion son dividas en diferetes componentes, cadauno con su propia funcionalidad.

Definimos el estado del cifrado de bloque como el resultado intermedio del proceso de en-criptado. El estado es representado por un arreglo rectangular de bytes con 4 renglones. Elnumero de columnas esta determinado por la longitud del bloque, por ejemplo, si el bloquees de longitud N , el numero de columnas Nb es igual a N/32. El estado es inicializado conel texto claro en el orden a0,0, a1,0, a2,0, a3,0, a0,1, a1,1, ..., como se muestra a continuacion:

a =

a0,0 a0,1 a0,2 a0,3 a0,4 a0,5

a1,0 a1,1 a1,2 a1,3 a1,4 a1,5

a2,0 a2,1 a2,2 a2,3 a2,4 a2,5

a3,0 a3,1 a3,2 a3,3 a3,4 a3,5

︸ ︷︷ ︸

Nb columns

En el caso anterior Nb = 6 dado que la longitud del bloque es N = 192.

La ronda de transformacion es construida de componentes de transformacion que operansobre el estado. Finalmente, al final de la operacion de cifrado, el texto cifrado es leido delestado tomando los bytes de estado en el mismo orden.

La llave de cifrado es similar al arreglo rectangular con 4 renglones. El numero de columnasde la llave de cifrado es igual a la longitud de la llave divida por 32, como se muestra acontinuacion:

a =

k0,0 k0,1 k0,2 k0,3

k1,0 k1,1 k1,2 k1,3

k2,0 k2,1 k2,2 k2,3

k3,0 k3,1 k3,2 k3,3

︸ ︷︷ ︸

Nk columns

Algunas veces la llave de cifrado se ve como un arreglo lineal de palabras de 4 bytes. Elnumero de rondas es denotado por Nr y depende de los valores Nb y Nk como se muestra acontinuacion:

Nb

4 6 84 10 12 14

Nk 6 12 12 148 14 14 14

4

Page 8: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Las rondas de transformacion estan compuestas por 4 diferentes componentes de transfor-macion, los cuales mostramos a continuacion:

Round(State,RoundKey){

ByteSub(State);

ShiftRow(State);

MixColumn(State);

AddRoundKey(State,RoundKey)

}

La ronda final del cifrado es ligeramente diferente y esta definida como:

FinalRound(State,RoundKey){

ByteSub(State);

ShiftRow(State);

AddRoundKey(State,RoundKey);

}

La transformacion ByteSub es una substitucion de bytes no lineal, operando sobre cada unode los bytes de estados independientemente. La transformacion usa la misma tabla de subs-titucion (S-Box) para cada byte. La caja S-box ha sido seleccionada de tal manera queRijndael sea resistente contra ataques lineales y diferenciales, asi como ataques de interpo-lacion. Esto asegura que los requerimientos tales como tener una pequena correlacion entrelos bits de entrada y bits de salida y del hecho de que la salida no puede ser representadacomo una funcion matematica de la entrada.

En la transformacion ShiftRow, las ultimas tres columnas del estado se les realizan co-rrimientos cıclicos con diferentes offsets. El renglon 1 es desplazado C1 bytes, renglon 2se desplaza C2 bytes, y el renglon 3 se desplaza C3 bytes. Los offsets de los desplazamientoso corrimientos dependen de la longitud del bloque Nb. Los diferentes valores se especificanen la siguiente tabla:

Nb C1 C2 C3

4 1 2 36 1 2 38 1 3 4

Un ejemplo de ShiftRow serıa:

5

Page 9: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

00 44 88 CC

11 55 99 DD

22 66 AA EE

33 77 BB FF

00 44 88 CC

55 99 DD 11

AA EE 22 66

FF 33 77 BB

En la transformacion MixColumn, las Nb columnas del estado son transformadas por unamultiplicacion con una matriz fija.

b0,i

b1,i

b2,i

b3,i

=

2 3 1 11 2 3 11 1 2 33 1 1 2

×

a0,i

a1,i

a2,i

a3,i

, 0 ≤ i ≤ Nb

Las operaciones son ejecutadas en el campo finito binario GF (28). La adicion es un XORy la multiplicacion es diferente a la multiplicacion de enteros. Los coeficientes de la matrizestan basados en un codigo lineal con una distancia maxima entre las palabras de codigo.Esto asegura que los bytes de cada columna sean mezclados adecuadamente, y esta operacionjunto con la operacion ShiftRow, asegura que despues de unas rondas, todos los bits de salidadependan de todos los bits de entrada. El segundo criterio de diseno para los coeficientesera la posibilidad de una implementacion eficiente.

En la operacion de AddRoundKey la llave de ronda es sumada al estado simplemente con unXOR. La longitud de la llave de ronda es igual a la longitud del bloque.

Las llaves de ronda son derivadas de la llave de cifrado por medio del key schedule.

Este consiste de dos componentes: la expansion de la llave y la seleccion de la llave de ronda.

Los principios basicos son los siguientes:

• El numero total de los bits de la llave de ronda es igual a la longitud del bloquemultiplicada por el numero de rondas mas 1. (Por ejemplo, para un bloque de longitudde 128 bits y 10 rondas, 128× (10 + 1) = 1408 bits de la llave de ronda ).

• La llave de cifrado es expandida para formar una llave expandida.

• Las llaves de ronda son tomadas de la llave de expansion en la siguiente manera: Laprimera llave de ronda consiste de las primeras Nb palabras, la segunda de las siguientesNb palabras y asi sucesivamente.

En el siguiente pseudocodigo podemos ver el procedimiento de expansion de la llave [2]:

6

Page 10: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

KeyExpansion(CipherKey,W){for(i=0;i < Nk;i++)W[i]=CipherKey[i];for(j=Nk;j< Nb(Nr + 1);j+=Nk){

W[j]=W[j-Nk] ⊕ SubByte(Rot(W[j-1])) ⊕ Rcon[j=Nk];if(Nk £ 6 ){for(i=1; i < Nk;i++)

W[i+j]=W[i+j-Nk] ⊕ W[i+j-1];}else{for(i=1; i < 4; i++)

W[i+j]=W[i+j-Nk] ⊕ W[i+j-1];W[j+4]=W[j+4-Nk] ⊕ SubByte(W[j+3]);for(i=5; i < Nk ; i++)

W[i+j]=W[i+j-Nk] ⊕ W[i+j-1];}

}}

El metodo criptografico consiste de la suma inicial de la llave de ronda, seguida de Nr − 1rondas, y una ronda final, como en el siguiente pseudocodigo:

Rijndael(State,CipherKey){

KeyExpansion(CipherKey,ExpandedKey);

AddRoundKey(State,ExpandedKey);

for(i=1; i < Nr ; i++)Round(State,ExpandedKey + Nbi);

FinalRound(State,ExpandedKey+NbNr);

}

Un diagrama muy util para entender el cifrado es el siguiente:

7

Page 11: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Para realizar el decifrado, es util darnos cuenta de que las transformaciones ByteSub, ShiftRow,MixColumn, AddRoundKey son invertibles:

1. El inverso de ByteSub es otra tabla de busqueda llamada InvByteSub (IBS).

2. El inverso de ShiftRow se obtiene al realizar un corrimiento a la derecha del renglonen vez que a la izquierda, esto lo realizamos en InvShiftRow (ISR).

3. El inverso de MixColumn existe por que la matriz usada en MixColumn es invertible.La matriz de InvMixColumn (IMC) es la matriz.

00001110 00001011 00001101 0000100100001001 00001110 00001011 0000110100001101 00001001 00001110 0000101100001011 00001101 00001001 00001110

4. AddRoundKey(IARK) es su propia inversa.

El proceso de decifrado lo podemos ver como:

1. ARK, usando la llave de ronda 10.

2. Nueve rondas de IBS,ISR,IMC,IARK, usando las llaves de ronda de 9 a 1.

3. Una ronda final: IBS,ISR,ARK,usando la llave de ronda 0.

Hemos explicado de manera breve el algoritmo, algunas de las siguientes referencias explicande manera mas amplia al mismo [1] [2] [3] [4], sobre todo la propuesta de AES [3] por loscreadores del mismo es muy completa.

1.2 Campos finitos binarios GF (2m)

En la seccion anterior explicamos el algoritmo de Rijndael, algunas de las operaciones deeste algoritmo se realizan en el campo finito binario GF (28), por lo cual es importante daruna introduccion a estos.

Un Campo es un conjunto de elementos con las operaciones de suma y multiplicacion. Dondedeben de cumplirse ciertas propiedades como: El resultado al realizar alguna operacioncon cualquiera dos elementos del campo resultara en un elemento que tambien esta en elcampo. Debe de haber un elemento cero (0), tal que cuando se sume a algun elemento del

8

Page 12: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

campo resulte el mismo elemento. Tambien debe de haber un elemento identico (1) tal quecuando multipliquemos cualquier elemento por este resulte el mismo elemento. Tambien esun requisito que tenga inversos multiplicativos y aditivos para cualquier numero (excepto elcero que no tiene inverso multiplicativo), debe de cumplir con las leyes de conmutatividad,asociatividad y la distributiva. [5].

Ejemplos de campos son: numeros reales, numeros complejos, numeros racionales y losenteros modulo un primo.

Por ejemplo, consideremos el siguiente campo con 4 elementos:

GF (4) = {0, 1, w, w2},

con las siguientes leyes:

1. 0 + x = x para toda x

2. x + x = 0 para toda x

3. 1 ∗ x = x para toda x

4. w + 1 = w2

5. Adicion y multiplicacion son conmutativas, asociativas, y cumplen la ley distributivax(y + z) = xy + xz para toda x, y, z

Luego dado que

w3 = w ∗ w2 = w ∗ (1 + w) = w + w2 = w + (1 + w) = 1,

observamos que w2 es el inverso multiplicativo de w. De ahı que cada elemento no cero deGF (4) tenga un inverso multiplicativo.

En general, un Campo es un conjunto que tiene elementos 0 y 1 (con 1 6= 0 ) y satisfacen:

1. Tienen operaciones de multiplicacion y adicion que satisfacen (1),(3),(5).

2. Cada elemento tiene un inverso aditivo.

3. Cada elemento no cero tiene un inverso multiplicativo.

9

Page 13: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Para cada potencia de un primo pn, hay exactamente un campo finito con pn elementos. Elcampo con pn elementos es llamado GF (pn), GF deriva de “Galois field”, el cual quedo parahonrar la matematico Frances Evariste Galois (1811-1832).

Otra manera de producir el campo GF (4) es considerando Z2[X] como el conjunto de todoslos polinomios cuyos coeficientes son enteros modulo 2. Por ejemplo, 1+X3 +X6 y X estanen el conjunto, como tambien los polinomios constantes 0 y 1. Se puede sumar, restar ymultiplicar en este conjunto, siempre y cuando trabajemos con los coeficientes modulo 2.Por ejemplo,

(X3 + X + 1)(X + 1) = X4 + X3 + X2 + 1

Hay que notar que el termino 2X desparece modulo 2. Una propiedad importante es quepodemos realizar la division con residuo, tal como lo hacemos en los enteros. Por ejemplo ladivision de X4 + X3 + 1 entre X2 + X + 1, podemos realizar las operaciones y al final quedaque:

X4 + X3 + 1 = (X2 + 1)(X2 + X + 1) + X

y esto lo podemos escribir como:

X4 + X3 + 1 ≡ X (mod X2 + X + 1)

Un metodo general para construir un campo finito con pn elementos donde p es primo yn ≥ 1 es el siguiente:

1. Zp[X] es el conjunto de polinomios con coeficientes modulo p.

2. Escoga P (X) un polinomio irreducible modulo p de grado n

3. Sea GF (pn) igual a Zp[X] mod P (X). Entonces GF (pn) es un campo con pn elementos.

Para cada n, hay un polinomio irreducible mod p de grado n, asi la construccion producecampos con pn elementos para cada n ≥ 1 [1].

1.2.1 GF (28)

Rijndael trabaja mod el polinomio irreducible X8 +X4 +X3 +X +1. Cada elemento puedeser representado de forma unica por:

10

Page 14: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

b7X7 + b6X

6 + b5X5 + b4X

4 + b3X3 + b2X

2 + b1X + b + 0

donde cada bi es 0 o 1. Los 8 bits b7b6b5b4b3b2b1b0 representan un byte, ası la representacion delos elementos de GF (28) es en bytes de 8-bits. Por ejemplo, el polinomio X7+X6+X3+X+1se convierte en 11001011. La suma en GF (28) es un XOR de los bits:

(X7 + X6 + X3 + X + 1) + (X4 + X3 + 1)

→ 11001011⊕ 00011001 = 11010010

→ X7 + X6 + X4 + X

La multiplicacion es un poco mas complicada y no tiene una interpretacion sencilla. Y estose debe a que estamos trabajando mod el polinomio X8 + X4 + X3 + X + 1, el cual puedeser representado por los 9 bits 100011011.

Por ejemplo, realizemos la multiplicacion de X7 + X6 + X3 + X + 1 por X:

(X7 + X6 + X3 + X + 1)(X) = X8 + X7 + X7 + X2 + X

= (X7 + X3 + X2 + 1) + (X8 + X4 + X3 + X + 1)

≡ X7 + X3 + X2 + 1 (mod X8 + X4 + X3 + X + 1)

La misma operacion en bits es:

11001011 → 110010110→ 110010110⊕ 100011011= 010001101,

En general, podemos multiplicar por X con el siguiente algoritmo:

1. Corrimiento hacia la izquierda y apendizamos un 0 como el ultimo bit.

2. Si el primer bit es 0, pare.

3. Si el primer bit es 1, XOR con 100011011.

De lo anterior podemos inferir que las operaciones de suma y multiplicacion se puedenimplementar eficientemente en GF (28).

Suma y multiplicacion son las principales operaciones en GF (28) que vamos a utilizar en laimplementacion de Rijndael, de ahı la importancia de este breve seccion, para mas infor-macion sobre campos finitos revisar las siguientes referencias [6] [5] [1] .

11

Page 15: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Implementacion

La metodologıa que vamos a usar para el desarrollo del proyecto, la explicamos a continuacon:

1. Investigacion y recoleccion de informacion acerca de AES.

2. Comprension y estudio del algoritmo.

3. Implementacion de las operaciones basicas del algoritmo.

4. Implementacion del algoritmo.

5. Desarrollo de la aplicacion de prueba usando la librerıa resultante de la implementacion.

6. Documentacion del proyecto y de la librerıa.

7. Pruebas de la implementacion y de la librerıa.

2.1 Aspectos de implementacion

Rijndael va a ser programado implementando primero todas las diferentes transformacionesy luego con estos modulos se implementara el algoritmo.

Ya implementado el algoritmo se desarrollara la aplicacion. Con respecto a las pruebas,generalmente la metodologıa preferida es realizar las pruebas de cada una de las unidadesque se van programando y al final una prueba integral con todas las unidades trabajando enconjunto, estas pruebas iniciales generalmente sirven para garantizar que el algoritmo se hayaimplementado correctamente, luego vienen las pruebas de eficiencia donde principalmentela plataforma a usar para realizar estas es Linux y las comparaciones se haran tomando lainformacion de [7].

Una de las ideas que tambien tenemos para la implementacion es hacer uso de las directivasdel preprocesador de C para poder definir los tamanos tanto del bloque como de la llave entiempo de compilacion, de igual forma lo haremos para los casos, como por ejemplo, para la

12

Page 16: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

caja-S, ya sea que deseemos usarla por tabla o por la generacion de la misma en tiempo deejecucion.

Para el proceso de implementacion es importante recalcar que algunos documentos de Rijn-dael como [2] mecionan que las operaciones de AddRoundKey, ByteSub y RowShift se puedencombinar eficientemente y ejecutadas serialmente por estado.

Para la implementacion de MixColumn se requiere la multiplicacion en el campo finito bi-nario GF (28), al igual que en el caso anterior, los autores del algoritmo mencionan que loscoeficientes del polinomio irreducible han sido influenciados por consideraciones de imple-mentacion. Para la implementacion ellos mencionan que el uso de instrucciones condicionalespuede causar debilidad con respecto a los ataques de tiempo (timing attaks), y esto se debea que el tiempo de ejecucion de cada una de las operaciones dependen del valor de entrada.

Ellos indican que timing attack puede ser contrarestado insertando operaciones NOP adi-cionales para igualar los tiempos de cada una de las operaciones, pero esto probablementeintroducira debilidad con respecto a la analisis de potencias. El uso de una tabla contrarestaefectivamente cada uno de los ataques anteriores.

Tambien mencionan que las operaciones ByteSub, ShiftRow, y MixColumn pueden ser ejecu-tadas con 4 tablas y tres operaciones XOR por columna.

2.2 La librerıa de la implementacion

La libreria de la implementacion estara conformada por los siguientes bloques de proce-dimientos:

• Procedimientos relacionados con los bloques basicos del algoritmo (componentes detransformacion).

• Procedimiento relacionado con la implementacion del algoritmo

• Procedimientos de utileria

Dentro de las funciones de utileria el proposito es desarrollar funciones que faciliten a losdesarrolladores el uso de la librerıa.

2.3 Implementacion del algoritmo

La implementacion la podemos dividir en fases como se habıa comentado anteriormente:

13

Page 17: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

• Definicion de estructuras y constantes.

• Implementacion de los bloques basicos del algoritmo

• Implementacion del algoritmo

• Implementacion de funciones de utilerıa

• Implementacion de programas de prueba y aplicaciones

Esta seccion la dividiremos en subseccion que ilustren cada una de estas fases.

2.3.1 Definicion de estructuras

La definicion de las estructuras la podemos ver en el siguiente archivo de encabezado RjndlDefs.h:

#ifndef _RJNDLDEFS_H_

#define _RJNDLDEFS_H_

#define RJNDL_IRRED_PLNM 0x011B /* x^8 + x^4 + x^3 + x + 1 */

#ifdef RJNDL_128BLK

#define RJNDL_N 128 /*Block length*/

#endif

#ifdef RJNDL_192BLK

#define RJNDL_N 192 /*Block length*/

#endif

#ifdef RJNDL_256BLK

#define RJNDL_N 256 /*Block length*/

#endif

#define RJNDL_N_b (RJNDL_N/32) /*Number of columns*/

#define RJNDL_N_lb (RJNDL_N/8) /*Number of lineal blocks*/

#ifdef RJNDL_128KEY

#define RJNDL_K 128 /*Key length*/

#endif

14

Page 18: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

#ifdef RJNDL_192KEY

#define RJNDL_K 192 /*Key length*/

#endif

#ifdef RJNDL_256KEY

#define RJNDL_K 256 /*Key length*/

#endif

#define RJNDL_N_k (RJNDL_K/32) /*Number of columns (cipher key)*/

#define RJNDL_N_lk (RJNDL_K/8) /*Number of lineal key blocks*/

#define RJNDL_ROWS 4 /*Number of rows*/

/*GFbits (Type)

*An element of GF(2^8)

*8-bit (1 byte) representation.

*/

typedef unsigned char GFBits;

struct Rjndl{

GFBits a[RJNDL_ROWS][RJNDL_N_b]; //State

GFBits k[RJNDL_ROWS][RJNDL_N_k]; //Cipher key

GFBits *ek[RJNDL_ROWS]; //Expanded Key

int rounds; //Number of rounds

int crntRound; //Current Round

int ncek; //Number of columns for expanded Key

};

typedef struct Rjndl Rjndl;

#endif /* _RJNDLDEFS_H_ */

Para la implementacion se definio un nuevo tipo que es GFBits y Rjndl, el primero identificaa un byte el cual nos sirve para representar elementos del campo GF (28) y el segundo es unaestructura formada por a que es el estado del algoritmo, k corresponde a la llave de cifrado,ek corresponde a la llave de cifrado expandida, tambien cuenta con la variable rounds quecontiene el numero de rondas que debe de llevar a cabo el algoritmo en base al tamano de lallave y del bloque, luego tenemos una variable crntRound que sirve para indicarnos la rondaen la que se encuentra el algoritmo, y una variable ncek que indica el numero de columnasque tendra la llave expandida y que de igual manera esta determinada por el tamano del

15

Page 19: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

bloque y de la llave.

En la parte superior del encabezado vemos algunas definiciones de constantes como:

• RJNDL IRRED PLNM Polinomio irreducible de Rijndael

• RJNDL N Longitud del bloque

• RJNDL K La longitud de la llave

• RJNDL N b Numero de columnas de la matriz del bloque.

• RJNDL N lb Numero de elementos del bloque si es un arreglo lineal.

• RJNDL N k Numero de columnas de la matriz de la llave.

• RJNDL N lk Numero de elementos del bloque si es un arreglo lineal.

Como tambien podemos observar estas estan encerradas entre directivas del compilador,de tal manera que estas variables van a ser definidas en tiempo de compilacion, nuestraimplementacion es flexible en el sentido que podemos manejar bloques y llaves de tamanos128,192,256.

Unicamente tenemos que indicar el tamano que deseemos en el archivo Makefile que estaasociado a este proyecto.

2.3.2 Implementacion de los bloques basicos

Dentro de los bloques basicos podemos identificar a todas aquellas funciones que permitanimplementar los bloques basicos del algoritmo, como por ejemplo, funciones que permitanrealizar la suma, multiplicacion en el campo finito binario GF (28).

En el siguiente archivo de encabezado RjndlBase.h mostramos algunas:

/*GF Operations

*All the operations are done in GF(2^8)

*/

/*rjndlGFAdd

*GF(2^8) addition

*r=a+b

*/

16

Page 20: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

GFBits rjndlGFAdd(GFBits a, GFBits b);

/*rjndlGFLogMul

*GF(2^8) multiplication

*using logarithms and power tables

*r = a*b

*/

GFBits rjndlGFLogMul(GFBits a, GFBits b);

/*rjndlGFMulInv

*GF(2^8) multiplicative inverse

*using logarithms and power tables

*r = a^{-1}

*/

GFBits rjndlGFMulInv(GFBits a);

/*rjndlGFMulby2

*r=a*X

*/

GFBits rjndlGFMulby2(GFBits a);

/*rjndlGFMulby3

*r=a*(X+1)

*Since 3*x=(2^1)*x=(2*x)^(1*x)

*multiplication by 3 can be done by multiplying with 2

*then XORIng the argument

*/

GFBits rjndlGFMulby3(GFBits a);

/*rjndlGFMulby9

*/

GFBits rjndlGFMulby9(GFBits a);

/*rjndlGFMulbyB

*/

GFBits rjndlGFMulbyB(GFBits a);

/*rjndlGFMulbyD

*/

GFBits rjndlGFMulbyD(GFBits a);

/*rjndlGFMulbyE

*/

GFBits rjndlGFMulbyE(GFBits a);

17

Page 21: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

/*rjndlGFHighBits

*Return the 4 high bits of a

*/

GFBits rjndlGFHighBits(GFBits a);

/*rjndlGFLowBits

*Return the 4 low bits of a

*/

GFBits rjndlGFLowBits (GFBits a);

/*rjndlShiftOffsets

*Return the shift offsets for different block

*lengths

*/

GFBits rjndlShiftOffsets(int row);

/*rjndlNmbrOfRnds

*Number of rounds

*

*The block and key length are taken from the

*RJNDL_N_b and RJNDL_N_k

*/

GFBits rjndlNmbrOfRnds(void);

En este encabezado encontramos funciones como rjndlAdd que permite realizar la suma enGF (28) y algunas otras como multiplicacion en GF (28), es relevante tomar en cuenta que sirevisamos el codigo de la implementacion tambien encontraremos directivas del compilador,esto es util ya que algunas como la multiplicacion se implementaron de forma algorıtmica yotra haciendo acceso a las tablas de logaritmos.

En tiempo de compilacion se decide si se usa la multiplicacion haciendo acceso a tablas o laalgorıtmica, la directiva es: RJNDL OPTMUL y debe ser modificada en el Makefile.

Esto nos fue util para evaluar los tiempos de la implementacion variando algunos parametroscomo la multiplicacion.

Una vez que contamos con la implementacion de cada una de las funciones anteriores se im-plementaron los bloques del algoritmo, a continuacion mostramos su archivo de encabezado:

/*rjndlByteSub

*ByteSub transformation

*/

18

Page 22: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

GFBits rjndlByteSub(Rjndl *rjn);

/*rjndlMByteSub

*Long Byte sub calculation using sMtrx instead of lookup table sbox

*/

GFBits rjndlMByteSub(GFBits p);

/*rjndlIMByteSub

*Long Inv Byte sub calculation using isMtrx instead of lookup table isbox

*/

GFBits rjndlMByteSub(GFBits p);

/*rjndlInvByteSub

*ByteSub transformation

*/

GFBits rjndlInvByteSub(Rjndl *rjn);

/*rjndlShiftRow

*ByteSub transformation

*/

GFBits rjndlShiftRow(Rjndl *rjn);

/*rjndlInvShiftRow

*ByteSub transformation

*/

GFBits rjndlInvShiftRow(Rjndl *rjn);

/*rjndlMixColumn

*MixColumn transformation

*/

GFBits rjndlMixColumn(Rjndl *rjn);

/*rjndlMixColumn

*InvMixColumn transformation

*/

GFBits rjndlInvMixColumn(Rjndl *rjn);

/*AddRoundKey

*RoundKeyAddition transformation

*/

GFBits rjndlAddRoundKey(Rjndl *rjn);

/*InvAddRoundKey

*Inverse Round Key

*/

19

Page 23: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

GFBits rjndlInvAddRoundKey(Rjndl *rjn);

/*rjndlKeyExpansion

*KeyExpansion

*/

GFBits rjndlKeyExpansion(Rjndl *rjn);

/*rjndlRound

*A Rijndael Round

*/

GFBits rjndlRound(Rjndl *rjn);

/*rjndlInvRound

*A Rijndael Inverse Round

*/

GFBits rjndlInvRound(Rjndl *rjn);

/*rjndlFinalRound

*A Rijndael Final Round

*/

GFBits rjndlFinalRound( Rjndl *rjn);

/*rjndlInvFinalRound

*A Rijndael Inverse Final Round

*/

GFBits rjndlInvFinalRound( Rjndl *rjn);

/*rjndlRijndael

*Rijndael Encryption algorithm

*/

GFBits rjndlRijndael(Rjndl *rjn);

En el archivo de encabezado anterior podemos identificar la implementacion de los bloquespara el proceso de cifrado como:

• rjndlKeyExpansion(Rjndl *rjn);

• rjndlAddRoundKey(Rjndl *rjn);

• rjndlByteSub(Rjndl *rjn);

• rjndlShiftRow(Rjndl *rjn);

20

Page 24: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

• rjndlMixColumn(Rjndl *rjn);

Todas reciben como parametro una varible de tipo Rjndl y la cual como se explico anterior-mente sirve para guardar el estado del algoritmo.

Luego para el proceso de descifrado tenemos:

• rjndlKeyExpansion(Rjndl *rjn);

• rjndlInvAddRoundKey(Rjndl *rjn);

• rjndlInvByteSub(Rjndl *rjn);

• rjndlInvShiftRow(Rjndl *rjn);

• rjndlInvMixColumn(Rjndl *rjn);

Luego a partir de ellas se formaron las siguientes :

• rjndlRound(Rjndl *rjn);

• rjndlFinalRound( Rjndl *rjn);

• rjndlInvRound(Rjndl *rjn);

• rjndlInvFinalRoundRjndl *rjn);

Las cuales como vamos a ver en la seccion que sigue sirven para la implementacion delalgoritmo.

En esta parte tambien dentro del codigo se definieron directivas del compilador que sirve paradecidir si el proceso de ByteSub lo hacemos usando las tablas o si lo hacemos multiplicandopor la matriz y sumando el vector.

Para habilitar el proceso de ByteSub usando tablas lo hacemos indicando la directiva RJNDL OPTBSen el Makefile y recordemos que esto lo definimos en el momento de la compilacion.

2.3.3 Implementacion del algoritmo

La definicion de las funciones del algoritmo los encontramos en el siguiente archivo de en-cabezado Rjndl.h:

21

Page 25: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

/*rjndlInit

*Initialization

*The initialization is based upon the constants

*/

GFBits rjndlInit(Rjndl *rjn);

/* rjndlFree

* Free the memory that was allocated for the

* expanded key mainly.

*/

GFBits rjndlFree(Rjndl *rjn);

/*rjndlInitWithKeyAndKeyExpansion

*Initialization

*Set up the key and will call the function key expansion.

*/

GFBits rjndlInitWithKeyAndKeyExpansion(Rjndl *rjn, GFBits

cipherKey[RJNDL_N_lk]);

/*rjndlRijndael

*Rijndael Encryption algorithm

*/

GFBits rjndlRijndael(Rjndl *rjn);

/*rjndlInvRijndael

*Rijndael Decryption algorithm

*/

GFBits rjndlInvRijndael(Rjndl *rjn);

Una vez que se implementaron todas las funciones basicas, el codigo del algoritmo es muysencillo como se muestra a continuacion:

GFBits rjndlRijndael(Rjndl *rjn)

{

int i=0;

rjn->crntRound=0;

rjndlAddRoundKey(rjn);

#ifdef jdebug

rjndlPrintState(rjn->a," %x ","InitialRound->AddRoundKey\n-----\n");

#endif

22

Page 26: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

for(i=1; i < rjn->rounds ; i++){

rjndlRound(rjn);

}

rjndlFinalRound(rjn);

return 0;

}

GFBits rjndlInvRijndael(Rjndl *rjn)

{

int i;

rjn->crntRound=rjn->rounds;

rjndlInvFinalRound(rjn);

#ifdef jdebug

rjndlPrintState(rjn->a," %x ","InvInitialRound->InvFinal\n-----\n");

#endif

for(i= rjn->rounds -1 ; i > 0; i--){

rjndlInvRound(rjn);

}

rjndlInvAddRoundKey(rjn);

return 0;

}

En el codigo anterior como se puede observar se definio una directiva del compilador con elnombre jdebug, la cual es util cuando deseamos que todos los pasos del algoritmo se muestrenel pantalla, sobre todo la matriz de estado, al igual que en las directivas anteriores se defineen tiempo de compilacion con la opcion jdebug en el archivo Makefile.

El codigo del algoritmo podemos observar el uso de las variables de la estructura Rjndl comorjn->crntRound De igual manera hay que resaltar las funciones de inicializacion , ya que sonnecesarias para el buen funcionamiento del algoritmo.

2.3.4 Implementacion de funciones de utilerıa

Dentro de las funciones de utilerıa se construyeron las siguientes:

/*rjndlSetPlainBlock

*Set the plain text block

*

*Note:

*The first element pblk[0] will be in the rjn->a[0][0]

*The second element pblk[1] will be in the rjn->a[1][0]

23

Page 27: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

*...

*The last element pblk[RJNDL_N_lb-1] will be in the rjn->[RJNDL_N_b-1][RJNDL_N_b-1]

*/

GFBits rjndlSetPlainBlock(Rjndl *rjn,GFBits pblk[RJNDL_N_lb]);

/* rjndlSetKeyAndKeyExpansion

* Set up the key and call Key Expansion

*/

GFBits rjndlSetKeyAndKeyExpansion(Rjndl *rjn, GFBits cklk[RJNDL_N_lk]);

/* rjndlGetStateArray

* Returns the state in form of an array

* You must deallocate the array with free

*/

GFBits * rjndlGetStateArray(Rjndl *rjn );

/*rjndlEncFile

*Encripts a file.

*Return -1 if something is wrong

*/

/* rjndlGetStateIntoArray

* Returns the state in form of an array

* You must deallocate the array with free

*/

GFBits * rjndlGetStateIntoArray(Rjndl *rjn, GFBits rsl[RJNDL_N_lb] );

int rjndlEncFile(char *source, char *dest, GFBits ck[RJNDL_N_lk]);

/*rjndlDecFile

*Decripts a file.

*Return -1 if something is wrong

*/

int rjndlDecFile(char *source, char *dest, GFBits ck[RJNDL_N_lk]);

• rjndlSetPlainBlock(Rjndl *rjn,GFBits pblk[RJNDL N lb]); Sirve para definir el bloque ini-cial para el proceso de cifrado o descifrado

• rjndlSetKeyAndKeyExpansion(Rjndl *rjn, GFBits cklk[RJNDL N lk]); Permite definir ocambiar la llave de cifrado o descifrado, ademas realiza la invocacion al proceso queexpande la llave.

• rjndlGetStateArray(Rjndl *rjn ); Regresa el apuntador a un arreglo que contiene el estadoen forma de arreglo lineal, es necesario liberar el espacio del apuntador una vez que yano se necesita.

24

Page 28: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

• rjndlGetStateIntoArray(Rjndl *rjn, GFBits rsl[RJNDL N lb] ); Regresa la informacion delestado en el arreglo que es pasado como parametro, recordemos que el arreglo es lineal.

• rjndlEncFile(char *source, char *dest, GFBits ck[RJNDL N lk]); Permite encriptar unarchivo usando Rijndael, unicamente es necesario pasarle la ruta absoluta del archivoorigen, el destino y la llave de cifrado

• rjndlDecFile(char *source, char *dest, GFBits ck[RJNDL N lk]);Permite desencriptar unarchivo usando Rijndael, unicamente es necesario pasarle la ruta absoluta del archivocifrado, el destino y la llave de descifrado

2.3.5 Implementacion de programas de prueba y aplicaciones

Un programa de prueba muy sencillo que ilustra la prueba del API es el siguiente:

#include "../rjndl/Rjndl.h"

struct nist128{

GFBits keys[RJNDL_N_lk];

};

struct nist128 ck[]= {

{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},

};

int main(int argc, char *argv[])

{

Rjndl rjn,rjn1;

int i;

GFBits *cphrtxt;

GFBits pb[RJNDL_N_lb]=

{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

rjndlInit(&rjn);

rjndlSetKeyAndKeyExpansion(&rjn,ck[0].keys);

rjndlSetPlainBlock(&rjn,pb);

rjndlPrintInfo(&rjn);

rjndlPrintState(rjn.a," %x ","plain text\n----\n");

rjndlPrintKey(rjn.k," %x ","key \n----\n");

rjndlRijndael(&rjn);

rjndlPrintState(rjn.a," %x ","cipher text\n----\n");

cphrtxt=rjndlGetStateArray(&rjn);

25

Page 29: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

rjndlInit(&rjn1);

rjndlSetKeyAndKeyExpansion(&rjn1,ck[0].keys);

rjndlSetPlainBlock(&rjn1,cphrtxt);

rjndlPrintInfo(&rjn1);

rjndlPrintState(rjn1.a," %x ","cipher text\n----\n");

rjndlInvRijndael(&rjn1);

rjndlPrintState(rjn1.a," %x ","plain text\n----\n");

free(cphrtxt);

rjndlFree(&rjn);

rjndlFree(&rjn1);

return 0;

}

La primera lınea incluye el encabezado Rjndl.h el cual contiene todas las definiciones y esnecesario incluir en cada programa que haga uso de la librerıa.

Posteriormente definimos la llave de cifrado la cual va estar representada por el elementock[0].keys, luego en la funcion main se realizan las siguientes actividades para realizar elcifrado:

• Definir variables del tipo Rjndl rjn, rjn1

• Definir el bloque a cifrar variable pb

• Inicializar la varibale rjn

• Asignar la llave y expandirla

• Definir el bloque de cifrado

• Imprimir informacion

• Invocar al algoritmo de Rijndael

• Mandar el bloque cifrado a un arreglo lineal

y las siguientes para realizar el descifrado:

• Inicializar la variable rjn1

26

Page 30: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

• Asignar la llave y expandirla

• Imprimir informacion

• Invocar al algoritmo de Rijndael para cifrar

• Imprimir el texto descifrado

Las ultimas lineas son necesarias para evitar problemas con la memoria.

Para compilar este programa lo hacemos con:

make nist128iv

una vez compilado lo ejecutamos con:

nist128iv

y la salida generada es la siguiente:

Rijndael (Jabg Implementation 2002)

Block Length: 128

Key Lenght: 128

Nb: 4 , Nlb: 16

Nk: 4 , Nlk: 16

Nr: 10

Number of columns for expanded key 44

Current round 0

--------------------------------------

plain text

----

0 4 8 c

1 5 9 d

2 6 a e

3 7 b f

-----

key

----

0 4 8 c

1 5 9 d

2 6 a e

27

Page 31: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

3 7 b f

-----

cipher text

----

a 41 f1 c6

94 6e c3 53

b f0 94 ea

b5 45 58 5a

-----

Rijndael (Jabg Implementation 2002)

Block Length: 128

Key Lenght: 128

Nb: 4 , Nlb: 16

Nk: 4 , Nlk: 16

Nr: 10

Number of columns for expanded key 44

Current round 0

--------------------------------------

cipher text

----

a 41 f1 c6

94 6e c3 53

b f0 94 ea

b5 45 58 5a

-----

plain text

----

0 4 8 c

1 5 9 d

2 6 a e

3 7 b f

-----

Los datos de prueba de este programa corresponde a los vectores de prueba definidos porNIST (ecb iv.txt).

Otro programa aun mas sencillo que el anterior es el que permite cifrar archivos, el codigoes el siguiente:

#include "../rjndl/Rjndl.h"

#include <stdio.h>

28

Page 32: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

int main(int argc, char *argv[])

{

char *src="gm.jpg";

char *dst="gmc.jpg";

GFBits key[RJNDL_N_lk]=

{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

if( rjndlEncFile(src,dst,key) == -1)

printf("Error !\n");

return 0;

}

En donde practicamente los pasos para cifrar un archivo usando AES es:

• Definir la llave de cifrado

• Invocar a la funcion rjndlEncFile con los nombres de los archivos y con la llave cifrado.

29

Page 33: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Pruebas

3.1 Pruebas

La etapa de pruebas es muy relevante y entre los objetivos primordiales tenemos:

• Probar la implementacion con los vectores de NIST.

• Evaluar la eficiencia de la implementacion.

• Pruebas cifrando archivos

A continuacion explicamos cada una de estas pruebas.

3.1.1 Pruebas con vectores de NIST

Para la implementacion de las pruebas con los vectores de NIST se realizaron programaspara probar estos vectores, el archivo de NIST que se uso como referencia fue ecb vk.txt.

Las pruebas se realizaron para llaves variables de 128,192,y 256, los programas son nist 128.cnist 192.c nist 256.

El programa nist 128 mostramos su codigo a continuacion:

#include "../rjndl/Rjndl.h"

struct nist128{

GFBits keys[RJNDL_N_lk];

};

30

Page 34: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

struct nist128 ck[]= {

{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

{0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}

};

int main(int argc, char *argv[])

{

Rjndl rjn,rjn1;

int i;

GFBits pb[RJNDL_N_lb]=

{0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00};

rjndlInit(&rjn);

for(i=0 ; i < 10; i++){

rjndlSetKeyAndKeyExpansion(&rjn,ck[i].keys);

rjndlSetPlainBlock(&rjn,pb);

rjndlPrintInfo(&rjn);

rjndlPrintState(rjn.a," %x ","plain text\n----\n");

rjndlPrintKey(rjn.k," %x ","key \n----\n");

rjndlRijndael(&rjn);

rjndlPrintState(rjn.a," %x ","cipher text\n----\n");

}

rjndlFree(&rjn);

return 0;

}

En este programa mostramos los primeros vectores de NIST.

Despues de compilar el programa y ejecutarlo se obtiene la siguiente salida:

31

Page 35: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Rijndael (Jabg Implementation 2002)

Block Length: 128

Key Lenght: 128

Nb: 4 , Nlb: 16

Nk: 4 , Nlk: 16

Nr: 10

Number of columns for expanded key 44

Current round 0

--------------------------------------

plain text

----

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

-----

key

----

80 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

-----

cipher text

----

e c6 45 14

dd 21 5b 18

33 e5 d8 be

d3 46 ba c8

-----

En donde el texto cifrado corresponde a lo especificado por NIST:

I=1

KEY=80000000000000000000000000000000

CT=0EDD33D3C621E546455BD8BA1418BEC8

De la misma manera se realizo para las llaves de 128,192,256, resultando las pruebas exitosascon los vectores probados.

32

Page 36: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

3.1.2 Pruebas de eficiencia

Para las pruebas de eficiencia se crearon los programas:

• tm128.c

• tm192.c

• tm256.c

El programa tm128.c se muestra a continuacion:

#include "../rjndl/Rjndl.h"

#include <time.h>

struct nist128{

GFBits keys[RJNDL_N_lk];

};

struct nist128 ck[]= {

{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},

};

int main(int argc, char *argv[])

{

Rjndl rjn,rjn1;

int i;

time_t t1,t2;

GFBits pb[RJNDL_N_lb]=

{0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00};

rjndlInit(&rjn);

rjndlSetKeyAndKeyExpansion(&rjn,ck[0].keys);

time(&t1);

for(i=0 ; i < 8192 ; i++){

rjndlSetPlainBlock(&rjn,pb);

//rjndlPrintInfo(&rjn);

//rjndlPrintState(rjn.a," %x ","plain text\n----\n");

33

Page 37: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

//rjndlPrintKey(rjn.k," %x ","key \n----\n");

rjndlRijndael(&rjn);

//rjndlPrintState(rjn.a," %x ","cipher text\n----\n");

}

time(&t2);

t2-=t1;

printf("El tiempo es %02i:%02i\n",(int)t2/60,(int)t2%60);

rjndlFree(&rjn);

return 0;

}

Las pruebas se realizaron con los siguientes numeros de bloques:

• 8192 (8192 * 128 bits )= 1048576 bits

• 16384 (16384 * 128 bits)= 2097512 bits

• 32768 (32768 * 128 bits)= 4194304 bits

• 65536 (65536 * 128 bits)= 8388608 bits

Las graficas se muestran a continuacion:

34

Page 38: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

35

Page 39: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

3.1.3 Pruebas cifrando archivos

Para las pruebas cifrando archivos se utilizaron los programas encF.c y decF.c.

El primer programa se encarga de cifrar una imagen gm.jpg y la deja en el archivo gmc.jpg, elsegundo programa se encarga de tomar el archivo cifrado y descifrarlo, el archivo descifradolo deja en gmo.jpg

Despues de realizar el cifrado se comprobo que los archivos gm.jpg y gmo.jpg son iguales, acontinuacion se muestra los tamanos de cada uno de los archivos:

-rw-r--r-- 1 jbriones users 103521 Aug 6 2002 gmc.jpg

-rw-r--r-- 1 jbriones users 103504 Aug 6 2002 gm.jpg

-rw-r--r-- 1 jbriones users 103504 Aug 6 2002 gmo.jpg

36

Page 40: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Resultados

Los resultados obtenidos son los siguientes:

• Se comprendio, se estudio y se implemento el algoritmo de Rijndael.

• Se cuenta con una librerıa flexible que permite usar Rijndael con llaves y bloquesindependientes de 128,192, y 256

• Se cuenta con una librerıa a la cual se le pueden agregar mas funciones y algun metodode intercambio de llaves.

• Se cuenta con una implementacion que cumple con los vectores de prueba proporciona-dos por NIST.

37

Page 41: Implementacion del Advanced Encryption Standard …delta.cs.cinvestav.mx/~francisco/arith/AESJbriones.pdfPara poder cumplir con este objetivo uno de los primeros pasos que debemos

Bibliografıa

[1] Lawrence C. Washington. Introduction to Cryptography with Coding Theory. Prentice-Hall, 2002.

[2] Joan Daemen and Vincent Rijmen. Rijndael: The advanced encryption standard. Dr.Dobb’s Journal, pages 137–139, March 2001.

[3] AES proposal: Rijndael. http://www.esat.kuleuven.ac.be/~rijmen/rijndael.

[4] Michael Welschenbach. Cryptography in C and C++. Apress, 2001.

[5] Finite field arithmetic. http://www.anujseth.com/crypto/ffield.html.

[6] Introduction to finite fields. http://www-math.cudenver.edu/~rwcherowi/courses/finflds.html.

[7] AES performance table for various plataform. http://www.tml.hut.fi/~helger/aes/table.html.

38