+ All Categories
Home > Documents > Step by Step AES in Java with Web...

Step by Step AES in Java with Web...

Date post: 14-Oct-2018
Category:
Upload: vodung
View: 214 times
Download: 0 times
Share this document with a friend
22
Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional Departamento de Ingeniería Eléctrica Sección de Computación Axel Ernesto Moreno Cervantes 1 Step by Step AES in Java with Web Interface Alumno: Axel Ernesto Moreno Cervantes
Transcript

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 1

Step by Step AES in Java with Web Interface

Alumno: Axel Ernesto Moreno Cervantes

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 2

Indice

Título . . . . . . . . . 3 Resumen . . . . . . . . 3 Introducción . . . . . . . . 3 Un poco de historia . . . . . . . 3 Características de AES . . . . . . 3 Aplicaciones de AES en ambiente web . . . . 3 Implementaciones de AES . . . . . . 4 Operaciones sobre campos finitos . . . . . 4 Estructura de Rijndael . . . . . . 5 Algoritmo de Rijndael . . . . . . 7 ...Programación CGI . . . . . . . 11 Análisis del problema . . . . . . 15 Modelo Conceptual . . . . . . 15 Diagrama de Bloques . . . . . . 15 Pantallas . . . . . . . . 16 Implementación y/o Desarrollo . . . . . 17 Resultados y conclusiones . . . . . . 20 Referencias . . . . . . . . 22

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 3

Titulo del Proyecto: Step by Step AES in Java with Web Interface Resumen En este proyecto se logró implementar el algoritmo AES con una interfase web sobre el lenguaje de programación java y utilizando tecnología de CGI’s. El programa encripta y desencripta archivos de texto produciendo como salida otro archivo de texto(código fuente incluido en el Apéndice). Cabe aclarar que dada la arquitectura cliente servidor utilizada para programar dicho algoritmo, la eficiencia del mismo puede variar dependiendo de la velocidad de la red. Introducción. En este proyecto me propongo implementar el algoritmo de Rijndael sobre Java con una interfaz web de modo que el usuario pueda interactuar con la aplicación desde un browser para encriptar / desencriptar texto. Pero primero es necesario hablar un poco de AES(Rijndael) así que dedicare unas cuantas líneas para dar un panorama general de AES y luego detallare aspectos más enfocados a su implementación. Un poco de historia. El algoritmo AES, también conocido como Rijndael, fue desarrollado por los científicos belgas Vincent Rijmen y Joan Daemen hace unos años pero no fue hasta el 2 de octubre del pasado año cuando el Instituto Nacional de Estándares y Tecnología (NIST) norteamericano lo seleccionó como el mejor estándar de encriptación entre más de una docena de competidores correspondientes a criptólogos de considerable fama mundial y a empresas de renombre como IBM, RSA o Conterpane Características de AES

El gran avance de este estándar es que además de trabajar con claves de 128 y 192 bits, también acepta longitudes de 256 bits, una característica importante si se tiene en cuenta que DES sólo permitía claves de 56 bits. Para comparar la eficacia de AES, desde su página web NIST afirma que mientras que el desfasado DES podría actualmente quebrantarse después de varias horas de intento, se necesitarían 149 trillones de años con un algoritmo AES de sólo 128 bits siempre y cuando se crease previamente el equipo adecuado para hacerlo.

AES también tiene las siguientes características:

No tiene una estructura Feistel Cada ronda consiste de 3 capas diferentes Su implementación es simple Número variable de rondas

AESTexto plano Texto cifrado

Llave

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 4

Aplicaciones de AES en el ambiente web

AES se puede aplicar a una amplia variedad de transacciones electrónicas: desde cajeros automáticos, comercio electrónico, e-mails confidenciales, etc Implementaciones de AES(Rijndael) Hay mucha información acerca de cómo implementar Rijndael y en la bibliografía incluyo direcciones donde se pueden encontrar implementaciones de este Algoritmo, la gran mayoría de las implementaciones existentes están escritas en lenguaje C dado su velocidad, pero casi no hay implementaciones de Rijndael sobre java, especialmente con una interfaz web y mucho menos con tecnología de CGI’s, así que creo que si vale la pena realizar este trabajo. En las secciones restantes de este documento me enfocaré en el diseño de AES y su implementación en java, pero para poder comenzar con AES antes es necesario ver un poco de teoría de números. Operaciones sobre campos finitos Adición en Campos Finitos La adición de dos elementos de campos finitos es llevada a cabo por adición de los correspondientes potencias de sus coeficientes en sus representaciones polinómicas, esta suma se realiza en ) (2 GF , que es, módulo 2, de manera que 1 + 1 =0. Consecuentemente, adición y substracción son dos equivalentes a una operación de or-exclusivo en los bytes que representan los elementos del campo. Las operaciones de adición para los elementos de campos finitos serán denotados por el símbolo �. Por ejemplo, las siguientes expresiones son equivalentes:

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 5

l)hexadecima(notación {D4}{83}{57}binaria)(notación {11010100}{10000011}{01010111}

)polinomial(notación )1()1( 24677246

≡⊕≡⊕

+++≡+++++++ xxxxxxxxxx

Multiplicación de campos finitos La multiplicación de campos finitos es más difícil que la adición y es llevada a cabo por la multiplicación de los polinomios para los dos elementos involucrados y recogiendo las potencias de x en el resultado. Puesto que cada polinomio puede tener potencias de x arriba de 7, el resultado puede tener potencias de x arriba de 14 y ya no encajará dentro de un solo byte. Esta situación es manejada reemplazando el resultado con el remanente Polinomial después de la división por un especial polinomio irreducible de octavo orden que, para Rijndael, es:

1)( 348 ++++= xxxxxm Puesto que este polinomio tiene potencias de x arriba de 8 que no puede ser representados por un solo byte y se escribiría como 1{00011011} ó 1{1b} como se indicó anteriormente. Ejemplo: 1}83{}57{ C≡•

Este resultado intermedio es ahora dividido por m(x) anterior

Estructura de Rijndael Rijndael es un cifrador de bloque con valores de llave y bloque variables (128,192 y 256 bits). Estado: Las diferentes transformaciones operan sobre resultados intermedios

llamados el Estado. El estado puede visualizarse como un arreglo rectangular de bytes con cuatro filas y Nb número de columnas el cual es igual a la longitud de bloque dividida por 32.

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 6

La llave de cifrado también puede visualizarse como un arreglo rectangular de bytes con cuatro filas y Nk número de columnas el cual es igual a la longitud de llave dividida por 32.

En la figura se muestran la representación del estado con Nb=6 y la llave con Nk=4 La entrada y salida utilizadas por Rijndael en su interfaz externa son consideradas como arreglos unidimensionales de bytes(8bits) numerados de 0 a 4*Nb-1. Estos bloque pueden tener longitudes de 16,24 o 32 bytes e índices en los rangos 0..15,0..23, 0..31 (dependiendo de la longitud de bloque). El texto plano puede ser introducido en el Estado en el siguiente orden:

......1,31,21,11,00,30,20,10,0 aaaaaaaa La llave de cifrado también se mapea en la siguiente forma:

......1,31,21,11,00,30,20,10,0 kkkkkkkk Rondas El número de rondas en Rijndael depende del tamaño de llave y longitud de bloque elegidos. En la siguiente tabla se muestran el número de rondas para cada combinación posible:

Como puede verse en la tabla, si Nb=4 y Nk=4 entonces se utilizarán 10 rondas en el algoritmo. Cada ronda está compuesta por cuatro diferentes transformaciones(excepto la última ronda que sólo consta de tres) las cuales son:

Una substitución de la entrada ar,c por su equivalente en la caja S( si,j) Un corrimiento de i bytes hacia la izquierda para cada fila de la matriz

de entrada i=0,1,...,3 Una mezcla de columnas por medio de una multiplicación con una

matriz Se suma la llave para la ronda correspondiente

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 7

Gráficamente esto puede verse así:

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 8

Ahora veremos el algoritmo de Rijndael: Algoritmo de Rijndael –Rijndael CypherAES(data_block, key) {in State, RoundKeys State State xor RoundKey0 for Round = 1 to Nr SubBytes(State) ShiftRow (State) If not(last Round) then MixColumn(State) State � State xor RoundKeyRound out State } Cifrado Siguiendo el algoritmo los pasos para cifrar un texto plano son:

1) Obtener las llaves de ronda 2) Hacer XOR de la llave k0 con el Estado 3) Sustituir la entrada ai,j de estado por su equivalente en S (byte sub) 4) Hacer corrimiento en las filas(shift row) 5) Mezcla de columnas(mix column) 6) Xor con llave de ronda(ark) 7) Repetir pasos 3..7 otras 9 veces, pero en la ultima ronda omitir el paso 5

Mix

Colum

n A

dd Round

key

Shift R

ow

S-Box

substitution

s s s s sss s s s s s ss s s

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 9

Subbyte step En este paso cada entrada de la matriz estado es intercambiado por su equivalente en la caja S

Caja S

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 10

ShiftRow Esta transformación opera individualmente sobre cada una de las tres últimas filas del estado cambiando los bytes de forma tal que se hacen i corrimientos circulares de bytes donde i depende de la longitud de bloque :

funcionamiento de shiftrow

desplazamiento por diferentes filas y longitud de bloques

Mix Column En esta transformación cada columna de estado es considerada como polinomio sobre GF(28) y es multiplicada módulo 14 +x como una matriz contra un polinomio fijo c(x) dado por:

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 11

ARK(Round Key Addition) En esta transformación una llave de ronda es aplicada a estado por medio de una operación XOR

Key Schedule Consiste de dos fases: la expansión de la llave y la selección de la llave de la ronda, el principio es el siguiente:

El número total de bits en una llave de ronda es igual a la longitud de bloque multiplicada por el número de rondas +1(ej. Un bloque de 128 bits y 10 rondas implican un una llave de 1048 bits)

La llave de cifrado es expandida a una llave expandida Las llaves de ronda son tomadas de esta llave expandida de la

siguiente forma: la primer llave de ronda consiste de las primeras Nb palabras, la siguiente de las siguientes Nb palabras, etc.

Key expansion La llave original es una matriz de 4*4 palabras, esta matriz es expandida añadiendo 40 columnas más de la siguiente manera: Etiquetamos las primeras cuatro columnas de la matriz como W(0), W(1), W(2) y W(3), para generar los valores de las demás columnas es necesario tomar en cuenta las siguientes reglas: Supongamos que hemos generado la columna W(i-1), entonces si i no es múltiplo de 4, entonces la nueva columna i será Descifrado El desencriptado del texto cifrado se realiza de una manera muy parecida a la encriptación: ARK, IBS, ISR IMC, IARK, IBS, ISR; IMC, IARK, IBS, ISR; ..... IMC, IARK, IBS, ISR; ARK. Programación CGI (Common Gateway Interface) Una de las formas más comunes de crear páginas dinámicas es usando CGI, ya que con el, el servidor puede interactuar con aplicaciones para realizar consultas

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 12

en bases de datos, búsqueda de documentos y procesamiento de solicitudes, entre otros. Funcionamiento de un CGI

1. El cliente acumula datos de la forma HTML y los prepara para su uso en la aplicación enviándolos hacia el servidor en el URL usando el protocolo HTTP

2. El servidor lee el URL que acompaña a la petición, determina la aplicación que debe ejecutar y entonces la activa.

3. El servidor pasa la información del URL a la aplicación 4. El programa CGI procesa los datos de la forma y prepara la respuesta,

generalmente la respuesta se formatea como un documento HTML de acuerdo al protocolo HTTP

5. El programa CGI pasa la respuesta al servidor quien la redirige hacia el cliente

Obtención de Datos del Servidor Los datos se pueden pasar al servidor web de varias maneras:

Como argumentos en la línea de comandos Como variables de entorno del sistema operativo Como entrada de datos estándar a un programa

La mayoría de los lenguajes de programación trabajan con los datos que se pasan en la línea de comandos y la entrada estándar.

Argumentos en la Línea de comandos Los argumentos en la línea de comandos son parámetros que usan los programas a través de mecanismos propios del lenguaje:

Public static void main(String[] args) en JAVA void main(int argc char * argv[]) en C

Ejemplo: El siguiente programa usa la línea de comandos para recibir los parámetros de la aplicación: Nota: 1) El programa Ejemplo.exe debe residir en el directorio /cgi-bin/ para ejecutarse

como programa CGI.. 2) El directorio /cgi-bin/ puede ser un subdirectorio de htdocs en el servidor

Apache(para ambos Unix y Windows).

// Ejemplo.java public class Ejemplo { public static void main(String[] args) {

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 13

String argv; if (args.length > 0) argv = args[0]; else argv = new String("Implementando AES!"); System.out.println("Content-Type: text/html\n\n"); System.out.println("<HTML><BODY>"); System.out.println("<H1>+argv+"</H1>"); System.out.println("</BODY></HTML>"); } } El programa se activa con el siguiente URL del lado del cliente(browser): http://computacion/cgi-bin/Ejemplo&criptografia!! Y la salida será:

criptografia!!

Variables de entorno del sistema operativo La forma de comunicación más común es mediante las variables de entorno del sistema operativo con los siguientes aspectos a tomar en cuenta:

o Las variables son externas a la ejecución del programa o El tamaño de los datos no pueden exceder los 40 kb

Algunas de estas variables son:

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 14

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 15

Procesamiento de Formularios Los programas CGI procesan la información de un formulario dependiendo del método usado GET o POST.

Si el formulario usa GET los datos se obtienen de QUERY_STRING Si el formulario usa POST los datos se obtienen de la entrada estándar

Desventaja de CGI Durante la recopilación de datos de una form a, el program a CGI no almacena información intermedia ya que no ofrece un estado persistente (stateless). La falta de persistencia la podemos resolver de las siguientes formas: –Usando campos ocultos en la forma –Usando persistencia de objetos –Usando galletas (cookies) Java posee un conjunto de clases para implementar persistencia: ObjectInputStream, Serializable, Externalizable Analisis del Problema El problema como ya se mencionó es implementar el algoritmo Aes en Java con una interfaz web utilizando tecnología de CGI’s, para esto el modelo conceptual planeado es: La aplicación residirá en el servidor y cuando el usuario realice una petición http a el, este ejecutará la aplicación (programa en java) el cual recibirá los datos de la forma, ejecutará algunos métodos y devolverá una salida en forma ya sea de página web y/o un archivo conteniendo los resultados.

Servidor de web

http

usuario

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 16

Diagrama de Bloques El siguiente diagrama de bloques muestra la forma en que operará el cifrador/descifrador AES:

1) El usuario hace uso de un browser y realiza una petición http 2) El usuario llena una forma e indica si cargará los datos desde un archivo de

texto o los tecleará en la caja de texto de la forma 3) Al enviar los datos se realiza una petición a un programa CGI 4) El programa CGI lo único que realizará será ejecutar la aplicación .class

(archivo de java) 5) La aplicación de java procesará la información, ejecutará el algoritmo de

Rijndael y emitirá una salida. 6) La salida podrá ser guardada en un archivo de texto siempre y cuando el

usuario haya elegido cargar los datos de entrada desde un archivo, en otro caso devolverá la salida a la hoja web.

Pantallas

Archivo de entrada

Archivo de salida

Hoja web

Hoja web

CGI aplicación

Java Entrada de datos

Salida de datos

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 17

Implementación y/o Desarrollo Primero quiero especificar las herramientas de desarrollo que utilizaré:

Lenguaje de programación: Hay principalmente dos, los cuales son: o Java versión 1.31 o HTML version2

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 18

Plataforma: La programación la realizaré sobre windows, pero dado que java es totalmente portable (windows y linux) realmente no importa la plataforma

En seguida se muestran los pseudocódigos de los métodos que se implementarán para java:

Rijndael Multiplicación campos binarios Reducción Shift row MixColumn Add round key subbyte

Expansión de llaves

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 19

Multiplicación Polinomial

Algoritmo de Rijndael –Rijndael CypherAES(data_block, key) {in State, RoundKeys State State xor RoundKey0 for Round = 1 to Nr SubBytes(State) ShiftRow (State) If not(last Round) then MixColumn(State) State � State xor RoundKeyRound out State } Reducción modular(una palabra a la vez)

public int[][] shift_rows(int[][] matrix){ int r,c,c_pos; int[][]tmp= new int[4][4]; for(r=0;r<4;r++){ for(c=0;c<4;c++){ c_pos=(c+r) % 4;

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 20

tmp[r][c] = matrix[r][c_pos]; }//for }//for return tmp; } public void dos_digitos(int num){ int i,j; i=(num & 0x0F); j=(num & 0xF0); j>>= 16; System.out.println("\nPrimer digito: "+j+" Ultimo digito: "+i); } public int[][] subbytes(int[][] s){ int r,c,i,j; int[][] temp=new int[4][4]; for(r=0;r<4;r++){ for(c=0;c<4;c++){ i=(s[r][c] & 0x0F); j=(s[r][c] & 0xF0); j>>= 16; temp[r][c]=S[(i*16)+j]; }//for }//for return temp; }//subbytes Resultados y conclusiones Pros y contras de la metodología utilizada

Pros Contras

Java Es muy portable Sencillo Gran soporte para aplicaciones web

No maneja tipos sin signo Es más lento que C

CGI Es muy útil para lanzar aplicaciones que no son documentos html

No tiene persistencia de datos

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 21

Medición de eficiencia de la implementación Para realizar la medición de eficiencia de la implementación se tomaron a consideración los siguientes puntos:

• Velocidad en la Generación de llaves de ronda • Velocidad de encriptación • Tiempo de inicialización de parámetros

Para medir la velocidad de generación de llaves se tomó el siguiente algoritmo: Repeat 128 times Generate 32 random keys Start timer For each key Repeat 1024 times Initialize cipher with key Stop timer Para medir la velocidad de encriptación se tomó en cuenta el siguiente algoritmo: Repeat 128 times Generate a random key Initialize cipher with key Start timer Repeat 2048 times Encrypt a 128 byte array Stop timer Nota: La medición completa de la eficiencia todavía no está terminada

Centro de Investigación y Estudios Avanzados del Instituto Politécnico Nacional

Departamento de Ingeniería Eléctrica Sección de Computación

Axel Ernesto Moreno Cervantes 22

Bibliografía

“Especificaciones para Rijndael el Algoritmo AES” by Dr Brian Gladman v3.2 4th Julio 2001 “Report on the NIST JavaTM AES candidate Algorithm Analisys” by Jim Dray Computer Security

Division. The National Institute of Standards and Technology November 8 1999 “AES Proposal:Rijndael” by Joan Daemen & Vincent Rijmen The National Institute of Standards

and Technology September 3rd 1999 “The Design of Rijndael” by Joan Daemen “Cryptography in C and C++” by Michael Welschenbach Editorial Apress http://csrc.nist.gov/encryption/aes/round2/round2.htm http://www.iaik.at http://www.esat.kuleuven.ac.be/~rijmen/rijndael http://islab.oregonstate.edu/koc/ece575/02Project/Anu/AES/ http://delta.cinvestav.mx/~olmedo


Recommended