Tesis AES FPGA

            B Benemé érita U Universsidad A  Autóno oma de e Pueblla  F Facultad d de Cieencias d de la Ellectrón nica 

Views 98 Downloads 2 File size 17MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

            B Benemé érita U Universsidad A  Autóno oma de e Pueblla  F Facultad d de Cieencias d de la Ellectrón nica   

T Tesina par ra el grado o de Licen nciatura een Electró ónica: 

“Implem mentación en H Hardwa are del  E Estánda ar de En ncriptacción Ava anzado   (A AES), en n una p plataforrma FPG GA,  u utilizand do el Microcon ntrolado or  P PicoBlaz ze™”    esista: Juan Fernand do Piñal Mo octezuma Te A Asesor inte rno: MC Ricardo Álvaarez Gonzáález. FCE‐B BUAP  A Asesor exte erno: MC A Alba Maribel Sánchezz Gálvez. FFCC‐BUAP     

H. Puebla de e Z. Abril de e 2008   

           

Agradecimientos  Por medio de este trabajo de investigación se estudian las características que sustentan al  Algoritmo  de  Encriptación  Avanzado  (AES),  y  la  manera  de  realizar  la  síntesis  de  dicho  algoritmo para su implementación en un Arreglo de Compuertas Programable en Campo  (FPGA)  al  utilizar  una  de  las  herramientas  de  procesamiento  embebido  del  fabricante  Xilinx®.  

I

Resumen  Por medio de este trabajo de investigación se estudian las características que sustentan al  Algoritmo  de  Encriptación  Avanzado  (AES),  y  la  manera  de  realizar  la  síntesis  de  dicho  algoritmo para su implementación en un Arreglo de Compuertas Programable en Campo  (FPGA)  al  utilizar  una  de  las  herramientas  de  procesamiento  embebido  del  fabricante  Xilinx®.  

II

Contenido General  Introducción...……...……….………………………….………………….…………...……………………….VIII  Planteamiento del problema………....………………….……………………………..….………....….…VIII  Metas y objetivos…………………………….……………………………..…………..……………………….…VIII  Justificación……………………………………….………………………………………………………………………IX 

Capítulo I.

MARCO HISTÓRICO……………………………….…...……………….…………………….1 

1.1 Criptografía en la historia….………………………………………………...………………………..……..1 1.2 Criptografía clásica………………….…………………………………………...………………………..……..1 1.2.1

La Escitala (siglo V a.C)…………………...……………………………………………………………..……..2

1.2.2

Cifrado de César (siglo I a.C)………………………………………………………………………………….2

1.2.3

Cifrador de Polybius (siglo II a.C)……………………………………………………………………………3 

1.3 Criptografía moderna…………….…………………………………………...………………………..……..3 1.3.1

Disco de Alberti………………………………...……………………………………………………………..……3

1.3.2

Cilindro de Jefferson……………...……………………………………………………………..…………….…4

1.3.3

Disco de Wheatstone…………...……………………………………………………………..………………..5

1.3.4

El siglo XX y la Segunda Guerra Mundial…………………………………………..……………………5

1.4 La Criptografía en la era de la Información….…………………………………………...……………7 1.5

¿Qué es un FPGA?………………….………………………...……………………………………………………8 1.5.1

1.6

Historia de los FPGA…………………………………………………………………………...…………………9

El algoritmo AES………………………………………….…………………………………………...………….10 1.6.1

Evaluación de AES……………….……………………………………………………………...………………11

Capítulo II.

MARCO TEÓRICO………………………………….…...……………….…………………..13 

2.1

Notación y convenciones………………………..………………………………………...………………..13 2.1.1

Byte………………………….……………………………………………………………………...…………………13

2.1.2

Arreglos de Bytes…..….……………………………………………………………………...…………………14

2.1.3

El State.…………………….……………………………………………………………………...…………………15

III

2.1.4

2.2

2.3

El State como un arreglo de columnas……………………………………………...…………………15

Introducción a la Matemática……….………..………………………………………...………………..16 2.2.1

Grupos, Anillos y Campos.………………………………………………………………...…………………16

2.2.2

Grupos……………………………………………………………………………………………...…………………16

2.2.3

Anillos.……………………………………………………………………………………………...…………………17

2.2.4

Campos.…………………………………………………………………………………………...…………………17

2.2.5

Campos Finitos de la forma GF(28)………..…….…………………………………...…………………18

2.2.6

Suma………………………………………………………………………………………………...…………………18

2.2.7

Multiplicación..………………………………………………………………………………...…………………19

2.2.8

Multiplicación por x………………………………………………………………………...…………….……20

2.2.9

Polinomios con coeficientes en GF(28)…..………………………………………...…………….……21

Descripción del Algoritmo AES….………..……………………………………………...………………..23 2.3.1

Etapa SubBytes………………………………………………………………………………...…………………23

2.3.2

Etapa ShiftRows…..…………………………………………………………………………...…………………24

2.3.3

Etapa MixColumns…………………………………………………………………………...…………………24

2.3.4

Etapa AddRoundKey………………………………………………………………………...………………….27

Capítulo III. DISEÑO DEL SISTEMA………………………….…...……………….…………………….29  3.1

Descripción de la plataforma de desarrollo de Hardware..………………...………………..29

3.2

Descripción de la plataforma de desarrollo de Software….………………...………………..30

3.3

Diagrama conceptual del sistema……………………………...………………………………………..30

3.4

Metodología…..…………...………………………………………………………………………………………31

3.5

¿Por qué utilizar un microcontrolador en un FPGA?……………………………………………..31

3.6

Características del microcontrolador PicoBlaze™…………………………………………………..32  3.6.1

3.7

pBlazeIDE™, software de desarrollo en ensamblador para PicoBlaze™…….……………33

Implementación del Sistema………………………………………………………………………………..34  3.7.1

3.7.2

Gestión de Entrada/Salida de datos al Sistema….………………….....................…………35 3.7.1.1

Comunicación Serial.……………………......……………………………….....................…………35

3.7.1.2

Comunicación mediante un teclado PS/2 …………………………………………………………36 

Gestión de la LCD………………….....................………………………………………………………….38

IV

3.7.3

3.8

3.9

Encriptación de datos.………………….....................……………………………………………….…41  3.7.3.1

Implementación para AddRoundKey.......………………..……………….....................……42

3.7.3.2

Implementación para SubBytes………………………………………………………………………..43

3.7.3.3

Implementación para ShiftRows……………………………………………………………………….45

3.7.3.4

Implementación para MixColumns……………………………………………………………………46

Arquitectura del Sistema……………………………………………………………………………………...48  3.8.1

Microcontrolador PicoBlaze™…………………..…………………………….....................…………49

3.8.2

Memoria de programa para el microcontrolador PicoBlaze™…………………………….…49 

3.8.3

Interface………………………………………………………………………………………………………………49 

Diseño del programa para el intercambio de datos PC‐FPGA a través de MatLab® 50   

Capítulo IV. ANÁLISIS DE RESULTADOS.………………….…...……………….…………………….51  4.1

Resultados de la implementación del sistema……………………………...…...………………..53 4.1.1

Área…………………………………………………………………………...…………………………………….…53

4.1.2

Throughput………………………………………………………………...…………………………………….…54

4.1.3

Comparación con otras Arquitecturas………………………...…………………………………….…54  

Capítulo V.

CONCLUSIONES……………….…...……………….………………………………………..56 

5.1

Resumen de los resultados obtenidos…………………………………………...…...………………..56

5.2

Conclusiones del trabajo realizado…….………………………………………...…...………………..56

5.3

Trabajo futuro……………………………………………………………………………...…...………………..57  

Apéndices……...……...……….………………………….………………….…………...………………………58  Apéndice A.

Términos y Acrónimos……………………………………………………………………..58 

Apéndice B.

Código en ensamblador para el microcontrolador PicoBlaze™………….59 

Apéndice C.

Código en VHDL para la entidad interface……………………………………….77 

Apéndice D.

Código‐M para el intercambio de datos PC‐FPGA a través de  MatLab®………………………………………………………………………………………..…83 

Listado de referencias..….………….……………….………………….…………...……………………….66 

V

Contenido de Figuras   

Figura 1. Figura 2. Figura 3. Figura 4. Figura 5. Figura 6. Figura 7. Figura 8. Figura 9. Figura 10. Figura 11. Figura 12. Figura 13. Figura 14. Figura 15. Figura 16. Figura 17. Figura 18. Figura 19. Figura 20. Figura 21. Figura 22. Figura 23. Figura 24. Figura 25. Figura 26. Figura 27. Figura 28. Figura 29. Figura 30. Figura 31. Figura 32. Figura 33. Figura 34. Figura 35.

La Escitala………….……………………………………....…………………….……………………………………....2  Alfabeto de cifrado de César………………………………….…………………….…………………………....2  Ejes coordenados para el cifrador de Polybius……………………………………..…………………....3  Disco de Alberti…………………….……………………………………………….......................................4  Cilindro de Jefferson…………………….………………………………………………….............................5  Disco de Wheatstone.………………….……………………………………...........................................5  Enigma…………………….………………….……………………………………...........................................6  FPGA Xilinx® SPARTAN™‐3…………….……………………………………...........................................8  Dr. Vincent Rijmen y Dr. Joan Daemen……….………………………………………….....................10  Representación Hexadecimal de los patrones de nibbles.............................................14  Índices para Bytes y bits..………….……………………………………............................................14  Entradas y salidas para el arreglo State………….………………………………………………..........15  Etapa SubBytes…………….…………………………………………………………………………………………..23  Etapa ShiftRows……………………….……………………………………............................................24  Etapa MixColumns………..………….……………………………………............................................27  Etapa AddRoundKey………………….……………………………………...........................................28  Tarjeta de desarrollo SPARTAN‐3E™………………………………………………………………………….29  Diagrama conceptual del sistema………….………………………………………………………………...30  Arquitectura del microcontrolador PicoBlaze™……….…………………………………………………33  Software pBlazeIDE™ del desarrollador Mediatronix®……….…………………………………….…33 Programa que ejecuta el microcontrolador PicoBlaze™………………………..……………………34  Puertos Seriales RS‐232 de la tarjeta SPARTAN‐3E™Starter‐Kit™………………………………..35  Comportamiento del sistema en la comunicación de datos serial……………………………..36  Conector PS/2 de la tarjeta SPARTAN‐3E™Starter‐Kit™………….…………………………………..36  Formas de onda y diagrama de tiempos para la comunicación PS/2…………………………37  Scan‐codes para cada una de las teclas……….……………………………………………………………37  Diagrama de flujo para las rutinas de la LCD………….…………………………………………………38  Protocolo de comunicación de la LCD………….……………………………………………………………39  Secuencia del menú de usuario del sistema criptográfico.………………………………………..40  Diagrama de flujo para el algoritmo de encriptación AES…………………………………………41  Diagrama de flujo para implementar AddRoundKey…………………………………………………42  Sbox empleada para la ejecución de AES…….………………………………………………………….…43  Diagrama de flujo para implementar SubBytes.……………………………………………..…………44  Diagrama de flujo para implementar ShiftRows…………………………………………………….…45  Diagrama de flujo para implementar MixColumns……………………………………………………46 

VI

Figura 36. Subrutina para la multiplicación de matrices en GF(28)………………………………………….…47  Figura 37. Diagrama esquemático de la arquitectura del sistema…….……………………………………….48  Figura 38. Diagrama de flujo para el Código‐M de MatLab®……………………………………………………...50  Figura 39. Ejemplo para AES según FIPS PUB 197…….………………………………………………………….……51  Figura 40. Datos enviados y recibidos a través de MatLab® hacia el FPGA…….………….......…………51  Figura 41. Resultados desplegados en la LCD de la tarjeta de desarrollo……….………….......…………52  Figura 42. Vista de los recursos utilizados por el diseño.……………………………………………………………53  Figura 43. Reporte del mapeo del diseño…….……………………………………………………………………….……54  Figura 44. Comparación de desempeño entre arquitecturas de cifrado AES‐128…………....…………55 

VII

Introducción  Planteamiento del problema La criptografía es tan antigua como la historia de la humanidad, debido a que siempre ha existido la necesidad de poder enviar y recibir información sin que esta sea interceptada o modificada en su trayecto. Así, el principio básico de la criptografía, es mantener la privacidad en la comunicación entre dos personas alterando el mensaje original de modo que sea incomprensible a toda persona distinta del ó los destinatarios. Debido a esta necesidad, a través de la historia se han desarrollado numerosos aparatos que realizan la tarea de cifrar y descifrar mensajes; ya sean dispositivos “rudimentarios” como la Escilata que es el primer sistema criptográfico del que se tiene registro, (siglo V a.C.), hasta sofisticados sistemas que aprovechan la teoría desarrollada a través del tiempo. Los sistemas criptográficos actuales surgen en base a las necesidades contemporáneas, ya que en este momento la humanidad transmite grandes cantidades de información, la cual en su mayoría son enviadas ó recibidas por dispositivos que manipulan señales discretas (ó digitales), como son teléfonos celulares, medios de almacenamiento (ópticos, magnéticos, tarjetas de memoria), computadoras que se interconectan entre sí (Internet ó Intranet), etc. Mucha de esta información requiere de gran confidencialidad debido a que se transmiten datos sensibles como: contraseñas, números de tarjetas de crédito, información científica, militar, etc. Así surgen los sistemas criptográficos modernos, basados en plataformas electrónicas digitales.

Metas y Objetivos En base al contexto descrito anteriormente, el Objetivo General de este trabajo es implementar en hardware el Algoritmo de Encriptación Avanzada (AES) en un Arreglo de Compuertas Programable en Campo (FPGA). Así el Objetivo Específico del trabajo es utilizar el algoritmo AES, también conocido como Rijndael, en un FPGA del fabricante Xilinx®, utilizando el microcontrolador PicoBlaze™. Este algoritmo criptográfico es reconocido como el estándar actualmente en la mayor parte del mundo. Además la plataforma FPGA ha tenido un gran auge en los últimos años, debido a su amplio rango de aplicaciones que incluyen a los DSP (Procesadores Digitales de Señales), radio definido por software, sistemas aeroespaciales y de defensa, prototipos de ASIC (Circuito Integrado de Aplicación Específica), sistemas de imágenes para medicina, sistemas de visión, reconocimiento de voz, Bioinformática, emulación de Hardware de computadora, etc.

VIII

Introducción

Al mismo tiempo los FPGA encuentran aplicaciones en muchas áreas donde se requiera del paralelismo ofrecido por su arquitectura, otra de sus grandes ventajas contra procesadores de uso general. Por lo tanto, las Metas de este trabajo son: •

Utilizar los periféricos de entrada/salida de la tarjeta de desarrollo SPARTAN™-3E Starter Kit, para ingresar, procesar y mostrar los datos a encriptar, utilizando el microcontrolador PicoBlaze™.



Emplear el microcontrolador PicoBlaze™ para sintetizar el algoritmo AES.



El sistema diseñado debe de ser rápido, eficiente y versátil.

Justificación En base a este trabajo se pretende manejar el más nuevo estándar en el área de criptografía informática; además de utilizar una de las plataformas digitales que más auge ha tenido en los últimos años debido a su flexibilidad de aplicación y reconfiguración, además del gran desempeño que presentan. Utilizando estas herramientas, se intenta proveer un instrumento para seguridad informática, que presente un desempeño aceptable respecto a un ASIC (Circuito Integrado de Aplicación Específica), y un desempeño notable en comparación con Procesadores de Propósito General. Con la respectiva ventaja de utilizar un FPGA en lugar de un ASIC que es el bajo coste de la lógica reconfigurable. La viabilidad de este proyecto para su realización no es un obstáculo, ya que se cuenta con la tarjeta SPARTAN™-3E Starter Kit, la cual incluye el FPGA que se necesita para implementar los resultados de la investigación. Para sustentar la investigación con argumentos bibliográficos se utiliza la publicación oficial del algoritmo AES, además de contar con texto especializado en el tema que apoya la investigación y los resultados. El algoritmo AES se sustenta en dos teorías matemáticas, por una parte la llamada Teoría de Campos Finitos específicamente Campos de Galois; y por otro lado utiliza también Aritmética Modular. Por desgracia, este tipo de Fundamentos Matemáticos no son impartidos en la Licenciatura, por lo que es uno de los principales obstáculos que habrán de resolverse. Sin embargo, gracias al asesor externo de este trabajo de investigación, el cual, su área de especialidad abarca este tipo de Fundamentos, este inconveniente puede ser solventado.

IX

Capítulo I. MARCO HISTÓRICO 1.1 Criptografía en la historia La criptografía (del griego kryptos "ocultar", y grafos "escribir") es la técnica, ó arte de la escritura secreta, actualmente considerada una ciencia que utiliza técnicas matemáticas que hacen posible el intercambio de mensajes de manera que sólo puedan ser leídos por las personas a quienes van dirigidos. El principio básico de la criptografía es mantener la privacidad de la comunicación entre dos personas alterando el mensaje original de modo que sea incomprensible a toda persona distinta del destinatario. Esta necesidad se remonta desde tiempos sumamente antiguos. A la transformación del mensaje original en el mensaje cifrado (criptograma) le llamamos cifrado, y a la operación inversa, le llamamos descifrado; estos pasos se realizan mediante un conjunto de reglas preestablecidas entre los comunicantes a la que llamamos clave. El criptoanálisis es el conjunto de técnicas que intenta encontrar la clave utilizada entre dos comunicantes, revelando así el mensaje original.

1.2 Criptografía clásica La primera aplicación conocida de la criptografía se remonta hace 4000 años, cuando los egipcios utilizaban jeroglíficos crípticos para narrar la vida y hazañas de sus faraones. La encriptación no se empleaba para esconder el significado del texto sino para darle un carácter más solemne. En la antigua China, el carácter ideográfico del idioma servía para esconder el significado de las palabras, aunque no parece que esta particularidad se hubiera empleado para encriptar y desencriptar mensajes. Varios pueblos de la antigüedad emplearon diversos métodos de encriptación y desencriptación de escritos, como los griegos, los espartanos y los hebreos, pero los árabes y los indios fueron los que mayor desarrollo lograron en este campo, destacándose un árabe, Muhammad Al-Qalqashandi, quien inventó una técnica para descifrar mensajes que todavía se usa en la actualidad. La criptografía se tornó importante durante la Edad Media, cuando los gobiernos se comunicaban con sus embajadores por medio de mensajes cifrados. En 1453, el gobierno Italiano establece un grupo dedicado exclusivamente al estudio de la criptografía, con el fin de perfeccionar los métodos de encriptación así como para descifrar los de sus enemigos.

1

Ca apítulo I

M Marco Histó órico

A contiinuación se mu uestran algunoss mecanismos criptográficos relevantes, quue se han utilizaado a través dee la historiaa:

1.2.1

La Escitala E (sigllo V a.C)

Ell primer caso conocido del uso de métoddos criptográficcos se dio durrante la guerraa entre Atenass y Essparta, por parrte de los lacedemonios. Ell cifrado se basaba b en la alteración a del mensaje origiinal mediante la incllusión de símbbolos innecesaarios en éste, que desapareccían al enrollarrlo en un rodiillo a, de longitud y grosor prefijaados. llaamado escitala Aúún sabiendo laa técnica utilizzada, si no se tenían las dim mensiones exaactas de la esccitala, un posible intterceptor del mensaje m tenía un u complicado criptoanálisis.

Figura 1. La Escitala.

1.2.2

Cifra ado de Césarr (siglo I a.C C)

Juulio César preseenta este cifraddor cuyo algorritmo consiste en e el desplazam miento de tres espacios haciaa la deerecha de los caracteres del teexto en claro. Es un cifradorr por sustitución monoalfabéttico, en el que las opperaciones se realizan r utilizaando aritméticca modular n, siendo n iguaal al número de d elementos del alffabeto.

A

B

C

D

E

F

G

H

I

J

K

L

M

N

Ñ

O

P

Q

R

S

T

U

V

W

X

Y

Z

D

E

F

G

H

I

J

K

L

M

N

Ñ

O

P

Q

R

S

T

U

V

W

X

Y

Z

A

B

C

Figura 2. Alfa fabeto de cifrado de d César.

Teexto cifrado: Wx W wdoelhp Euuxwxv? M Mensaje originall: Tú también Brutus? B

2

Marco Histórico

Capítulo I 1.2.3

Cifrador de Polybius (siglo II a.C)

Es el cifrador por substitución más antiguo que se conoce. El método se basaba en una tabla secreta, en cuyos ejes se ponían diferentes combinaciones de letras o números y dentro de la tabla las letras del alfabeto. Cada letra del mensaje a cifrar era substituida por sus coordenadas:

A

B

C

D

E

A

a

b

c

d

e

B

f

g

h

i/j

k

C

l

m

n

o

p

D

q

r

s

t

u

E

v

w

x

y

z

Figura 3. Ejes coordenados para el cifrador de Polybius.

Texto cifrado: CECDCAEDABBDDEDC AEDC AECA DBAEED Mensaje: Polybious es el rey

1.3 Criptografía moderna 1.3.1

Disco de Alberti

En 1465, León Battista Alberti, músico, pintor, escritor y arquitecto, concibió el primer sistema polialfabético que se conoce, que emplea varios abecedarios, utilizando uno u otro, cada tres o cuatro palabras. El emisor y el destinatario habían de ponerse de acuerdo para fijar la posición relativa de los círculos concéntricos, que determinara la correspondencia de los signos. Los diferentes abecedarios utilizados eran representados en uno de los discos, mientras que el otro se rellenaba con el abecedario normal, más los números del 1 al 4. Este disco define 24 posibles sustituciones dependiendo de la posición del disco interior. Una vez establecida la correspondencia entre caracteres de ambos discos, se sustituye el texto en claro del disco exterior por cada una de las letras correspondientes del disco interior, cambiando al abecedario

3

Ca apítulo I

M Marco Histó órico

coorrespondiente (prefijado por los comunicanntes) cada x paalabras, habienndo sido x tambbién prefijada por p los comunicantes.

Figura 4. Disco de Alberrti.

Otro dee los criptógraafos más importantes del sigglo XVI fue ell francés Blaisse de Vigeneree que escribió un importaante tratado sob bre la "escriturra secreta" y quue diseñó un ciifrado que ha llegado l a nuesttros días asociaada a su noombre. A Selenus se le debee la obra cripttográfica "Crypptomenytices et e Cryptographhiae" (Lünebuurg, 1624). Durante D los sig glos XVII, XVIII y XIX, el innterés de los monarcas m por la criptografía fuue notable. Las hueestes de Felipee II utilizaron durante d muchoo tiempo una cifra c con un alffabeto de más de 500 símboolos que los matemáticos del d rey consideeraban inexpuggnable. o francés François Viete connsiguió criptoannalizar aquel sistema para el rey de Franciaa, a Cuandoo el matemático la sazónn Enrique IV, el e conocimientto mostrado poor el rey francéés impulsó unaa queja de la coorte española ante a del pappa Pío V acusaando a Enriquee IV de utilizaar magia negraa para vencer a sus ejércitos. Por su parte,, la reina María M Estuardo,, reina de los Escoceses, E fue ejecutada por su prima Isabel I de Inglaterrra al descubriirse un com mplot de aquellaa tras un criptoanálisis exitosoo por parte de los matemáticoos de Isabel.

1.3.2

Cilin ndro de Jeffe ferson

Esste dispositivo fue inventado por el famosoo Thomas Jeffeerson (1743-18826), redactor de la declaraciión dee independenciia de Estados Unidos, U aunquue el primero en e fabricarla en e serie fue Etttiene Bazeries en 18891. El aparato o consiste en unna serie de disccos que giran libremente alreededor de un mismo m eje y llevvan im mpresas las letrras del alfabetto escritas en cada c disco en diferente ordeen. El emisor mueve m los disccos haasta configurarr el mensaje enn claro, y eligge otra línea que q será el mennsaje cifrado. Tras haber siido ennviado, el receeptor solamentte tiene que pooner las letras recibidas en línea y buscarr en otra líneaa el mensaje en claro o.

4

Ca apítulo I

M Marco Histó órico

Figura 5. Cilindro de Jefferrson.

1.3.3

Disco o de Wheatsstone

Ell disco de Wheeatstone (18022-1875) realizaa una sustitucióón polialfabétiica, muy pareccida a la utilizaada poor Alberti. El in nvento consta de dos discos concéntricos: c e el exterior se en s escriben, en orden alfabétiico, lass 26 letras del alfabeto ingléss más el espaciio, y en el interior se distribuuyen esas mism mas 26 letras pero aleeatoriamente. Soobre los discoss hay dos maneecillas como laas de un reloj, de forma que a medida que avanza la mayyor poor el disco exteerior, la menorr se desplaza por p el disco innterior. Cuandoo el puntero grrande recorre una u vuuelta, el pequeño da una vueelta más una leetra. El mensaj aje en claro se cifraba “prohiibiendo” al dissco exxterior ir en sen ntido antihorariio, siendo el mensaje m secreto lo indicado poor el puntero menor. m

Figura 6. Disco de Wheatsttone.

1.3.4

El sig glo XX y la Segunda Gu uerra Munddial

Ell siglo XX ha revolucionadoo la criptograffía. Retomando el concepto de las ruedass concéntricas de Allberti, a princiipios del siglo se diseñaron teletipos equippados con unaa secuencia de rotores móvilles, ésstos giraban con n cada tecla quue se pulsaba.

5

Ca apítulo I

M Marco Histó órico

Dee esta forma, en e lugar de la letra l elegida, aparecía a un siggno escogido por p la máquinaa según diferenntes reglas en un cód digo polialfabético complejo. Estos aparatoos, se llamaron traductores mecánicos. m Unaa de suus predecesorass fue la Rueda de Jefferson. Laa primera paten nte data de 1919, y es obra del d holandés Alexander A Köchh, que compartte honores conn el aleemán Arthur Scherbius, el inventor de Enigma E una máquina m criptoográfica a rotoor que los naazis creyeron inviolaable, sin saber que q aceleraría su derrota. Enn efecto, en el desenlace d de laa contienda, huubo unn factor decisiv vo y apenas coonocido: los aliados eran cappaces de desciffrar todos los mensajes m secreetos aleemanes. Unna organizació ón secreta britáánica, en la quee participó Alaan Turing, uno de los padres de la informáttica y de la inteligen ncia artificial, había logradoo desenmascarrar las claves de Enigma y de su "hermaana q develaban los mayor" Lorenz, desarrollando más de una doocena de artiluugios llamadoss las bombas que mensajes cifrado os. La máquinaa alemana se convertía c así en e el talón de Aquiles A nazi, un u topo en el que q coonfiaban y quee en definitivaa, trabajaba paara el enemigoo. Paralelamennte, Los códiggos de la versiión japponesa de En nigma (llamadoos Purple) see descifraron por p un grupo de analistas, dirigidos porr el coomandante Joseeph J. Rochefoort, cuyo criptooanálisis fue viital para la victtoria americanna en la batalla de M Midway.

Figgura 7. Enigma.

La existencia de Enig gma y el hechoo de que los aliados conocieseen sus secretoss fueron durantte mucho tiemppo, m guardadoos de la II Gueerra Mundial. ¿La razón? Quuerían seguir sacándole s partiido dos de los secretos mejor g potenciaando su uso enn diversos paísses, que, al instalarla, hacían transparentes sus secretos para tras la guerra las poteencias anglosajonas. Tras laa conclusión de la Segunda Guerra Munddial, la criptoggrafía tiene un desarrollo teóórico importannte; siendo Claude Shann non y sus invvestigaciones sobre s teoría de d la informacción esencialess hitos en diccho l avances enn computaciónn automática suuponen tanto una u amenaza para p los sistem mas desarrollo. Además, los o paara el desarrolloo de nuevos sisstemas. existenttes como una oportunidad

6

Capítulo I

Marco Histórico

1.4 La Criptografía en la era de la Información Finalizada la contienda, las nuevas tecnologías electrónicas y digitales se adaptaron a las máquinas criptográficas. Se dieron así los primeros pasos hacia los sistemas criptográficos más modernos, mucho más fiables que la sustitución y transposición clásicas. A mediados de los años 70 del siglo pasado, el Departamento de Normas y Estándares norteamericano publica el primer diseño lógico de un cifrador que estaría destinado a ser el principal sistema criptográfico de finales de siglo: el Estándar de Cifrado de Datos o DES (inventado por IBM) que utiliza algoritmos de gran complejidad para cifrar los mensajes. En esas mismas fechas ya se empezaba a gestar lo que sería la, hasta ahora, última revolución de la criptografía teórica y práctica: los sistemas asimétricos. Estos sistemas supusieron un salto cualitativo importante ya que permitieron introducir la criptografía en otros campos que hoy día son esenciales, como el de la firma digital. Una de las aportaciones del último cuarto del siglo XX son los sistemas de cifrado asimétrico o de clave pública (como RSA), en contraposición con todos los anteriores, que son criptosistemas simétricos o de clave privada, que usaban la misma clave para el cifrado y el descifrado del mensaje. La ventaja de estos sistemas es que permiten solucionar uno de los problemas de la criptografía clásica, la distribución de las claves secretas a los participantes en la comunicación. En la criptografía de clave pública, una de las claves puede hacerse pública sin que por ello la seguridad de la clave secreta se vea afectada. Lo cifrado con la clave secreta puede descifrarse con la pública y viceversa. Esta propiedad de los criptosistemas asimétricos permite también otras aplicaciones de estos criptosistemas, como la firma digital que es tan importante en las redes de telecomunicaciones hoy. Existen dos trabajos fundamentales sobre los que se apoya prácticamente toda la teoría criptográfica actual. Uno de ellos, desarrollado por Claude Shannon en sus artículos "A Mathematical Theory of Communication" (1948) y "Communication Theory of Secrecy Systems" (1949), sienta las bases de la Teoría de la Información y de la Criptografía moderna. El segundo, publicado por Whitfield Diffie y Martin Hellman en 1976, se titulaba "New directions in Cryptography", e introducía el concepto de Criptografía de Clave Pública, abriendo enormemente el abanico de aplicación de esta viejísima disciplina. Con la publicación del algoritmo RSA en 1977 por parte de los matemáticos Ron Rivest, Adi Shamir y Len Adleman la criptografía "moderna" o de clave pública alcanza su consolidación. Entonces en la actualidad, los sistemas criptográficos se implementan de forma electrónica y los sistemas mecánicos han sido desplazados casi por completo. Esta nueva técnica abre una amplia variedad de implementación como puede ser una computadora digital, ASIC o FPGA.

7

Ca apítulo I

M Marco Histó órico

1.5 ¿Qué es un FPGA? Un FPG GA (field progrrammable gatee array) es un dispositivo d sem miconductor diigital que contiiene componenntes lógicos programables e interconeexiones tambiéén programabbles entre elloos. Los compponentes lógiccos program mables pueden n ser programaados para dupliicar la funcionnalidad de puertas lógicas báásicas tales com mo AND, OR, O XOR, NO OT ó funcioness combinacionales más compplejas tales coomo decodificaadores ó simpples funcionnes matemáticaas. En muchos FPGA, F estos componentes c lóógicos program mables (o bloquues lógicos, seggún el lenguuaje comúnmente usado) tam mbién incluyenn elementos de memoria, los cuales puedenn ser simples flipfl flops ó bloques de meemoria más com mplejos. i Una jeerarquía de interconexione s programables permite a los bloquess lógicos de un FPGA, ser interconnectados según n la necesidad del diseñador del sistema, algo a parecido a un tablero prrogramable. Esstos bloquess lógicos e in nterconexiones pueden ser programados p d después del proceso de maanufactura porr el usuario/diseñador, así que el FPGA GA puede desem mpeñar cualquuier función lóógica necesariia. En los FPG GA ncontrar funcioones de alto niivel (como sum madores y multiplicadores) empotrados e enn la actualess se pueden en matriz de d interconexio ones, inclusivee en FPGA’s dee alto desempeeño se incluyenn dichas funcioones con unidaddes de cálcuulo con punto flotante. f La recconfigurabilidaad de los FPGA A radica en quee una parte dell diseño puede ser reprogrramada mientraas el resto conttinúa funcionanndo, esto es el principio de laa computaciónn reconfigurable o sistemaas reconfigurab bles. Los FPGA son geneeralmente más lentos que sus s contraparttes, los circuiitos integraddos de aplicaciiones específicas (ASIC), no pueden p soportaar diseños muyy complejos enn los modelos más m básicos, y consumen más energía. Sin S embargo, tienen t muchass ventajas taless como la reduucción del tiem mpo para la salida al merrcado de prodductos, la habiilidad para serr reprogramaddos después dee haber salidoo al mo investigación, mercaddo a fin de corrregir posibless errores, y redducción los coostos de ingenniería tales com diseño y prueba de un n nuevo produccto. Los vendedores pueden proporcionar p v versiones de FP PGA, más baraatos y menoos flexibles, las cuales no pueden ser modifiicados después de que el diseeño haya sido im mplementado.

Figura 8. FP PGA Xilinx® Sparttan™-3.

8

Capítulo I

1.5.1

Marco Histórico

Historia de los FPGA

Ross Freeman, cofundador de Xilinx®, inventó el arreglo matricial de compuertas. La raíz histórica de las FPGA son los Dispositivos de lógica programable compleja (CPLD) de mediados de 1980. CPLD y FPGA incluyen un relativo gran número de elementos lógicos programables. El rango de densidad de los CPLD va desde miles hasta decenas de miles de compuertas lógicas, mientras que el de los FPGA va típicamente desde decenas de miles hasta varios millones. La diferencia primaria entre CPLD’s y FPGA’s son sus arquitecturas. Un CPLD tiene una estructura restringida, consistiendo la unión de uno o más arreglos lógicos que alimentan a un número pequeño de registros con entrada de reloj. El resultado de estos es menos flexibilidad, con la ventaja de una mejor predicción de los tiempos de retraso. Las arquitecturas de los FPGA’s, por otro lado, son dominadas por las interconexiones. Esto los hace más flexibles (en términos del rango de diseños prácticos para los cuales pueden ser usados) pero también es posible ir un poco más lejos en el diseño. Otra diferencia notable entre CPLD’s y FPGA’s es la presencia de funciones de más alto nivel (tales como sumadores y multiplicadores) dentro de los FPGA’s, además de memorias. Una diferencia importante es que muchos FPGA’s modernos, soportan una total o parcial reconfiguración del sistema, permitiendo que una parte del diseño sea reprogramada mientras las otras partes siguen funcionando. Una tendencia reciente ha sido llevar la arquitectura un paso más lejos, combinado los bloques lógicos e interconexiones de los tradicionales FPGA’s, con microprocesadores y con periféricos relacionados para formar un completo “Sistema programable en un chip”. Ejemplo de estas tecnologías hibridas pueden ser encontradas en los FPGA Xilinx® Virtex™, los cuales incluyen uno o más procesadores PowerPC™ embebidos junto con la lógica FPGA. El Atmel® FPSLIC™ es otro dispositivo como tal, el cual usa un procesador AVR™ en combinación con la arquitectura lógica programable de Atmel®. Otra alternativa es hacer uso de núcleos de procesadores, los cuales son implementados junto con la lógica FPGA. Esos núcleos incluyen el Xilinx® MicroBlaze™ y PicoBlaze™, el Altera® Nios™ y procesador NiosII™, y los de open source LatticeMicro32 y LatticeMicro8. Como previamente se dijo, muchos FPGA modernos, tienen la habilidad de ser reprogramados en tiempo de funcionamiento lo cual permite que estos sistemas se reconfiguren a sí mismos para cumplir con la tarea actual. Sin embargo no todos los FPGA actuales soportan esta metodología.

9

Capítulo I

Marco Histórico

1.6 El algoritmo AES En el año 1999, NIST (National Institute of Standards and Technology) de EUA, lanzó una nueva versión de su estándar DES, el cual indicaba que DES solamente debía ser usado por sistemas antiguos y Triple-DES (3DES) sería el estándar vigente. 3DES tenía dos características interesantes que aseguraban su uso generalizado en los próximos años. La primera con su longitud en la llave de 168-bits, superaba la vulnerabilidad de ataques de fuerza bruta en DES. La segunda, el algoritmo de encriptación subyacente en 3DES es el mismo que en DES. Este algoritmo ha sido sometido a mucho más escrutinio que cualquier otro algoritmo de encriptación durante un gran periodo de tiempo, y no existe un ataque criptoanalítico efectivo contra el algoritmo, más que ataques de fuerza bruta. En consecuencia, existe un alto nivel de confianza que 3DES es muy resistente al criptoanálisis. Si la seguridad fuera la única consideración, entonces 3DES sería una elección apropiada para un algoritmo criptográfico estandarizado para las décadas venideras. Sin embargo la principal desventaja de 3DES es que el algoritmo es relativamente lento en software. El DES original fue diseñado a mediados de los años 70’s para una implementación en hardware, y no producía un código en software eficiente. 3DES, el cual posee tres veces más rondas que DES es correspondientemente más lento. Una desventaja secundaria es que ambos DES y 3DES utilizan un tamaño de bloque de 64-bits. Por razones de seguridad y eficiencia, un tamaño de bloque más grande es mejor. Debido a estas desventajas, 3DES no fue un candidato razonable para su uso a largo plazo. Como reemplazo, NIST en 1997 lanzó una convocatoria para proponer un nuevo Algoritmo de Encriptación Avanzada AES por sus siglas en inglés, el cual debía tener una fuerza en seguridad igual o mayor que 3DES y una eficiencia significativamente mejorada. Además de estos requerimientos generales, NIST especificó que AES debía ser un cifrado a bloques simétrico, con el tamaño del bloque de 128-bits y tener soporte para tamaños de llave de 128, 192 y 256-bits. En la primera ronda de evaluación se aceptaron 15 algoritmos para participar. Una segunda ronda redujo el campo a 5 algoritmos. NIST completó su proceso de evaluación y publicó un estándar final (FIPS PUB 197) en noviembre de 2001. NIST seleccionó a Rijndael como el nuevo algoritmo AES. Los dos investigadores que desarrollaron y presentaron Rijndael para AES son los criptógrafos de Bélgica: Dr. Joan Daemen y Dr. Vincent Rijmen. En última instancia AES intenta reemplazar a 3DES, pero este proceso todavía tomará algunos años. NIST anticipa que 3DES se mantendrá como un algoritmo aprobado (para uso del gobierno de USA) en un futuro previsible.

Figura 9. Dr. Vincent Rijmen y Dr. Joan Daemen, creadores del algoritmo Rijndael, que fue adoptado como AES.

10

Capítulo I

1.6.1

Marco Histórico

Evaluación de AES

Vale la pena examinar el criterio utilizado por NIST para evaluar a los candidatos potenciales. Existieron tres categorías para el criterio de selección: Seguridad: se refiere al esfuerzo requerido para criptoanalizar un algoritmo. El énfasis en la evaluación fue en la practicidad del ataque. Debido a que el tamaño mínimo para la llave en AES es de 128-bits, los ataques de fuerza bruta con tecnología actual y prevista no necesitan ser considerados. Costo: NIST intentó en AES ser práctico en un amplio rango de aplicaciones. Por lo tanto AES debía de poseer una alta eficiencia computacional, para así poder ser usado en aplicaciones de alta velocidad, y en conexiones de banda ancha. Características e implementación del algoritmo: Esta categoría incluye una variedad de consideraciones, como flexibilidad, e idoneidad para una gran variedad de implementaciones en software y en hardware, lo que haría un análisis de seguridad más sencillo. Utilizando estos criterios, el campo principal de 21 algoritmos candidatos a AES se redujo primero a 15 candidatos y posteriormente a 5. Al mismo tiempo en la evaluación final como se indicó en (NECH00) de FIPS, los criterios utilizados fueron los siguientes: Seguridad general: para evaluar la seguridad general, NIST lo delegó en el análisis de seguridad pública, dirigido por la comunidad criptográfica. Durante el curso de tres años del proceso de evaluación, un gran número de criptógrafos publicaron sus análisis de las fortalezas y debilidades de los distintos candidatos. Existió un énfasis particular en analizar a los candidatos con respecto a ataques conocidos, como criptoanálisis diferencial y particular. Sin embargo, comparado a los análisis de DES, la carga de tiempo y el número de criptógrafos dedicados a analizar Rijndael fueron eventualmente limitados. Ahora que se ha elegido un solo cifrado AES, se puede esperar a ver un análisis de seguridad mucho más extenso por parte de la comunidad criptográfica Implementaciones en Software: las principales preocupaciones en esta categoría fueron velocidad de ejecución, desempeño en distintas plataformas, y velocidad en función de la variación de la llave. Ambientes con espacio restringido: en algunas aplicaciones, como en smart-cards, áreas relativamente pequeñas de memoria RAM y/o memoria ROM, representación de objetos de datos como S-boxes las cuales pueden almacenarse en memoria ROM ó RAM, dependiendo si existe precómputo ó si se utilizan representaciones Booleanas y almacenamiento de la subllave.

11

Capítulo I

Marco Histórico

Implementaciones en Hardware: como en software, implementaciones en hardware pueden ser optimizadas para tamaño ó velocidad. Sin embargo, en caso de hardware, el tamaño se traduce mucho más directamente en costo que es comúnmente el mismo caso para implementaciones en software. Duplicar el tamaño de un programa de encriptación puede hacer una pequeña diferencia en una computadora de propósito general con mucha memoria, pero duplicar el área usada en hardware típicamente puede doblar el costo de un dispositivo. Ataques a las implementaciones: el criterio de la seguridad general, discutida en el primer punto de la lista, se refiere a ataques criptoanalíticos que explotan las propiedades matemáticas de los algoritmos. Existe otra clase de ataques que utilizan medidas físicas de comportamiento durante la ejecución del algoritmo para reunir información acerca de cantidades como por ejemplo la llave. Dichos ataques explotan una combinación de características intrínsecas al algoritmo y características dependientes de la implementación. Ejemplos de estos ataques son los ataques basados en tiempo y ataques basados en consumo de potencia. La idea básica detrás de un análisis de potencia por ejemplo, es observar que la potencia consumida por una smart-card en cualquier momento particular durante la operación criptográfica está relacionada a la instrucción que está siendo ejecutada y al dato que está siendo procesado. Por ejemplo, la multiplicación consume más potencia que la suma, y la escritura de 1’s consume más potencia que escribir 0’s. Cifrado vs Descifrado: este criterio trata con varias cuestiones relacionadas tanto al cifrado como al descifrado. Si los algoritmos de cifrado y descifrado difieren, entonces se necesitará espacio extra para el descifrado, También aunque los dos algoritmos sean el mismo ó no, puede existir diferencias de tiempo entre cifrado y descifrado.

12

Capítulo II. MARCO TEÓRICO 2.1

Notación y Convenciones

Las entradas y salidas para el algoritmo AES consisten, cada una de ellas en secuencias de 128 bits. Estas secuencias son referidas como bloques y el número de bits que contiene estos bloques son referidos como la longitud del bloque. La llave de cifrado para el algoritmo AES es una secuencia de 128, 192 o 256 bits. No se permiten otros tamaños para la entrada, salida y llave de cifrado en este estándar. Los bits dentro de tales secuencias se numeran empezando en cero, y terminando en uno menos la longitud de la secuencia de bits. El número i adjunto a cada bit, es conocido como su índice y se encuentra dentro de los rangos 0 ≤ i < 128 , 0 ≤ i < 192 , 0 ≤ i < 256 que dependen del tamaño del bloque y el tamaño de la llave.

2.1.1

Byte

Secuencia de ocho bits tratada como una entidad simple y unidad básica de procesamiento en el algoritmo AES. Los bits que pertenecen a la entrada, salida y Llave de cifrado son procesados como arreglos de bytes que se forman dividiendo estas secuencias en grupos de ocho bits contiguos que forman arreglos de bytes. Para la entrada, salida ó llave de cifrado (denotada por a) los bytes que resulten del arreglo son referenciados usando una de las dos formas, an ó a [ n ] , donde n se encuentra en alguno de los rangos siguientes: Tamaño de la llave = 128 bits, 0 ≤ n < 16 ,

Tamaño del bloque = 128 bits, 0 ≤ n < 16 ;

Tamaño de la llave = 192 bits, 0 ≤ n < 24 , Tamaño de la llave = 256 bits, 0 ≤ n < 32 . Todos los valores de los bytes en el algoritmo AES se presentan como la concatenación de sus valores de bits individuales (0 ó 1) entre corchetes en el siguiente orden {b7, b6, b5, b4, b3, b2, b1, b0}. Estos bytes se interpretarán como elementos de un campo finito utilizando la siguiente representación polinomial: 7

b7 x 7 + b6 x 6 + b5 x 5 + b4 x 4 + b3 x 3 + b2 x 2 + b1 x1 + b0 x 0 = ∑ bi x i . i =0

13

Ca apítulo II

M Marco Teór rico

Poor ejemplo, {0 01100011} ideentifica al elem mento específiico de un cam mpo finito: x6 + x5 + x + 1 . Es coonveniente tam mbién denotar a los valores deel byte utilizanndo una notacióón hexadecimaal con dos gruppos dee cuatro bits (cada grupo es conocido c comoo nibble) que see expresan com mo un caracterr simple, como en la figura siguiente:

Figura 100. Representación Hexadecimal H de loos patrones de nibbles.

o {01100011} se puede repreesentar como {63}, { donde ell caracter que denota los cuaatro Assí el elemento bitts más significcativos del arreeglo se encuenntra a la izquieerda. Algunas operaciones que q se realizan en caampos finitos requieren un biit adicional (b8) a la izquierdaa de un byte dee 8 bits. Dondee este bit extraa se enncuentre presen nte, aparecerá como un ‘{01}’ e inmediataamente despuéss el byte de 8--bits; por ejempplo unna secuencia dee 9-bits se reprresentará comoo un {01} {1b}.

2.1.2

Arreg glos de Bytees

Loos arreglos de bytes b se repressentarán de la siguiente s formaa: a0 a1a2 ...a15 Loos bytes y el orden de bits dentro de loss bytes se deriivan de la seccuencia de enttrada de 128-bbits

enntrada0entrada a1entrada2 ...entrrada126entradaa127 , de la siguieente manera:

a0 = {entrada0 , enttrada1 ,..., entra ada7 } ; ada15 } ; a1 = {entrada8 , enttrada7 ,..., entra a15 = {entrada120 , entrada e e 121 ,..., entrada 127 } . Ell patrón puedee extenderse paara secuencias mayores (porr ejemplo: paraa llaves de 1922 y 256-bits), así quue en general see tiene: an = {entrada e ada8 +1 ,..., entradda8 8 , entra n

n

n +7

}.

Enn la tabla siguiente se muestraa como se ordeenan los índicees para bytes y bits:

Figura 11. Índices Í para Bytess y bits.

14

Ca apítulo II

2.1.3

M Marco Teór rico

El Sttate

Innternamente, laas operaciones del algoritmo AES se llevann a cabo en un arreglo bidimeensional de byytes llaamado State. El E State consistte en cuatro fillas de bytes cadda una conteniiendo Nb bytess, donde Nb ess el tam maño del bloqu ue dividido enttre 32. Enn el arreglo Sta ate (denotado por p el símboloo S), cada byte individual posee dos índices, con su númeero dee fila r dentro del d rango 0 ≤ r < 4, y su núm mero de columnna c en el rangoo 0 ≤ c < Nb. u byte individuual del State seer referido com mo Sr,c ó s[r,c].. Para este estáándar, Nb = 4, por p Essto permite a un ejeemplo, 0 ≤ c < 4. All principio de los bloques dee cifrado y descifrado el arreglo de bytes de d la entrada inn0, in1,…,in155 es coopiado al arregllo State como se muestra en la l figura siguieente:

Fiigura 12. Entradass y salidas para ell arreglo State.

d se dirigen d entonces, al arreglo State, S después su valor finall es Laas operacioness de cifrado y descifrado coopiado a la salid da teniendo el arreglo de bytees out0, out1,… …,out15. p del cifrado o descifrrado, el arregloo de entrada, in, es copiado al a arreglo State de Poor lo tanto al principio accuerdo al esqueema: s[r, c] = in[r + 4c] for 0 ≤ r < 4 and 0 ≤ c < Nb, y al final del cifr frado ó descifraado el State se copia al arreglo salidda de la siguiennte manera: ouut [r + 4c] = s [r, c] for 0 ≤ r < 4 and 0 ≤ c < Nb. Nb

2.1.4

El Sttate como un n arreglo dee columnas

Loos cuatro bytess de cada colum mna del arregloo State, formann palabras de 32 3 bits, donde el número de fila f r provee un índ dice para los cuatro bytes dentro de cadda palabra. Ell State puede por lo tanto ser

15

Capítulo II

Marco Teórico

interpretado como un arreglo unidimensional de palabras de 32 bits (columnas), w0...w3, en donde el número de columna suministra un índice dentro de este arreglo. Entonces, para el ejemplo de la figura anterior, el State puede ser considerado también, como un arreglo de cuatro palabras de la manera siguiente: w0 = s0,0 s1,0 s2,0 s3,0

w2 = s0,2 s1,2 s2,2 s3,2

w1 = s0,1 s1,1 s2,1 s3,1

w3 = s0,3 s1,3 s2,3 s3,3

2.2 Introducción a la Matemática Todos los bytes en el algoritmo AES se interpretan como elementos de campos finitos utilizando la notación descrita anteriormente. Los elementos en un campo finito pueden ser multiplicados y sumados, pero estas operaciones son diferentes de las que se usan para los números comunes. En las siguientes subsecciones se introduce a los conceptos matemáticos básicos necesarios para el desarrollo del tema de investigación.

2.2.1

Grupos, Anillos y Campos

Grupos, anillos y campos son los elementos fundamentales de una rama de las matemáticas conocida como álgebra abstracta ó álgebra moderna. El álgebra abstracta, se interesa con conjuntos en los cuales sus elementos puedan ser operables algebráicamente, esto es, que puedan ser combinados de diferentes maneras para obtener un tercer elemento del conjunto al que pertenecen. Estas operaciones se encuentran sujetas a reglas específicas, las cuales definen la naturaleza del conjunto. Por convención, la notación para las dos clases principales de operaciones en el conjunto de elementos es usualmente la misma para la suma y multiplicación de los números ordinarios. Sin embargo, es importante notar que en álgebra abstracta no se está limitado a las operaciones aritméticas ordinarias

2.2.2

Grupos

Un grupo G, algunas veces denotado por {G , i} , es un conjunto de elementos con una operación binaria expresada por • (elemento genérico que puede referirse a suma, multiplicación o alguna otra operación matemática), que asocia a cada par ordenado (a, b) de elementos en G un elemento (a • b) en G, y que obedece a los axiomas: (A1)

Cerradura: Si a y b pertenecen a G, entonces a • b se encuentra también en G.

(A2)

Asociativa: a • (b • c) = (a • b) • c para todo a, b, c en G.

(A3)

Elemento identidad: Existe un elemento e en G tal que a • e = e • a = a para todo a en G.

(A4)

Elemento inverso: Para cada a en G existe un elemento a’ en G tal que a • a’ = a’ • a = e.

16

Capítulo II

Marco Teórico

Si un grupo tiene un número finito de elementos, se refiere a él como un grupo finito, y el orden del grupo es igual al número de elementos en el grupo. De otra forma, el grupo es un grupo infinito. Un grupo es llamado abeliano si satisface la siguiente condición adicional: (A5)

2.2.3

Conmutativa: a • b = b • a para todo a, b en G.

Anillos

Un anillo R, algunas veces expresado por { R , + , ×} , es un conjunto de elementos con dos operaciones binarias, llamadas suma y multiplicación, en las cuales para toda a, b, y c en R se cumplen los siguientes axiomas: (A1-A5)

R es un grupo abeliano con respecto a la suma: R satisface los axiomas A1 al A5. Para este caso de un grupo aditivo, se le conoce al elemento identidad como 0 y el inverso de a como -a.

(M1) Cerradura para la multiplicación: Si a y b pertenecen a R, entonces ab se encuentra también en R. (M2) Asociatividad para la multiplicación: a(bc) = (ab)c para todo a, b y c en R. (M3) Leyes distributivas: a(b + c) = ab + ac para todo a, b, y c en R. (a + b)c = ac + bc para todo a, b, y c en R. (M4) Conmutatividad para la multiplicación: ab = ba para todo a, y b en R. (M5) Identidad multiplicativa: Existe un elemento 1 en R el cual a1 = a para todo a en R. (M6) No divisor 0: Si a y b están en R y ab = 0, entonces a = 0 ó b = 0. En esencia un anillo es un conjunto en el cual es posible sumar, restar [a – b = a + (-b)] y multiplicar sin dejar al conjunto.

2.2.4

Campos

Un campo F, algunas veces denotado por { F , + , ×} , es un conjunto de elementos con dos operaciones binarias llamadas suma y multiplicación en las cuales para toda a, b y c en F, los siguientes axiomas se cumplen: (A1-M6)

F es un dominio entero, esto es que F satisface los axiomas A1 al A5 y M1 al M6.

(M7) Inverso multiplicativo: Para cada a en F, excepto 0, existe un elemento a-1 en F tal que aa-1 = (a-1)a = 1. En esencia un campo es un conjunto en el cual es posible sumar, restar, multiplicar y dividir sin dejar al conjunto. La división es definida con la regla siguiente: a/b = a(b-1).

17

Capítulo II 2.2.5

Marco Teórico

Campos finitos de la forma GF(p)

Los campos infinitos no son de interés particular en el contexto de la criptografía, Sin embargo, los campos finitos juegan un rol crucial en los algoritmos criptográficos. Puede mostrarse que el orden de un campo finito (número de elementos del campo) debe ser una potencia de un número primo pn, donde n es un entero positivo, sabiendo que un número primo es un entero el cual sus únicos factores positivos enteros son el uno y él mismo. El campo finito de orden pn es generalmente escrito como GF(pn); GF para denotar un campo de Galois, en honor del primer matemático que estudió a los campos finitos. Existen dos casos especiales que son interesantes para propósitos criptográficos: con n = 1 se considera el campo finito GF(p), este campo finito tiene una estructura diferente que otros campos finitos con n > 1. El otro caso relevante es para el caso de los campos finitos de la forma GF(2n). Entonces dado que todo cuerpo de característica 0, contiene a los racionales y es por lo tanto infinito, todos los campos finitos tienen característica prima, y por lo tanto su tamaño es de la forma pn, para p primo generado por el elemento 1. No es en general cierto sin embargo se puede decir que todo cuerpo de característica prima es finito. Para un primo p los enteros módulo p forman un cuerpo de p elementos, denotado por Z/pZ. Si q = pn es una potencia de un primo, existe (salvo isomorfismo) exactamente un campo con q elementos, denotado por Fq ó GF(q). Se puede construir de la siguiente manera: encontrar un polinomio irreducible f(x) de grado n con coeficientes en Fp, y definir F = Fp[X] / , donde Fp[X] denota el anillo de todos los polinomios con coeficientes en Fp, denota el ideal generado por f(X), y la barra diagonal indica el anillo cociente (definido de forma similar al grupo cociente). El polinomio f(X) se puede hallar factorizando Xq – X sobre Fp. El campo Fq contiene una copia de Fp como subcampo. No existen otros campos finitos.

2.2.6

Suma

La suma de dos elementos en un campo finito se logra sumando los coeficientes de las potencias correspondientes en los polinomios de los dos elementos. La suma se lleva a cabo con la operación lógica (expresada por ⊕), por ejemplo para el modulo 2 tenemos que 1⊕1 = 0, 1⊕0 = 1, y 0⊕0 = 0. En consecuencia, la substracción de polinomios es idéntica a la suma de polinomios. Alternativamente, la suma de elementos de campos finitos puede ser descrita como el modulo 2 de los correspondientes bits de un byte. Para dos bytes

{c7 c6 c5 c4 c3c2 c1c0 } , donde cada c

i

{a7 a6 a5a4 a3a2a1a0 }

y

{b7b6b5b4b3b2b1b0 } ,

la suma es

= ai ⊕ bi . Por ejemplo c7 = a 7 ⊕ b7 , c6 = a6 ⊕ b6, ,…, c0 = a0 ⊕ b0

18

Capítulo II

Marco Teórico

Por ejemplo, las expresiones siguientes son equivalentes una con otra:

Notación polinomial:

( x6 + x4 + x2 + x + 1) + ( x7 + x +1) = x7 + x6 + x4 + x2 .

Notación binaria: {01010111} ⊕ {10000011} = {11010100}. Notación hexadecimal: {57} ⊕ {83} = {d4}.

2.2.7

Multiplicación

En la representación polinomial, una multiplicación en GF(28) (representado por •) corresponde a la multiplicación de polinomios modulo un polinomio irreducible de grado 8. Un polinomio es irreducible si sus únicos divisores son el uno y el mismo. Para el algoritmo AES, este polinomio irreducible es m( x) = x8 + x4 + x3 + x +1 , ó {01}{1b} en notación hexadecimal. Por ejemplo {57} • {83} = {c1}, porque:

(x

6

+ x 4 + x 2 + x + 1)( x 7 + x + 1) = x13 + x11 + x 9 + x8 + x 7 + x 7 + x 5 + x 3 + x 2 + x + x 6 + x 4 + x 2 + x + 1 = x13 + x11 + x 9 + x 8 + x 6 + x 5 + x 4 + x 3 + 1

Y:

x13 + x11 + x 9 + x 8 + x 6 + x 5 + x 4 + x 3 + 1 mod ( x8 + x 4 + x 3 + x + 1) = x 7 + x 6 + 1 La reducción modular por el polinomio m(x) asegura que el resultado será un polinomio binario de grado menor que 8, y así se puede representar como un byte. A diferencia de la suma, no existe una operación lógica simple a nivel de bytes que corresponda a la multiplicación. La multiplicación definida es asociativa, y el elemento {01} es la identidad multiplicativa. Para cualquier polinomio b(x) diferente de cero y de grado menor a 8, el inverso multiplicativo de b(x), representado por b −1 ( x ) , puede ser encontrado de la manera siguiente: usando el algoritmo Euclidiano

extendido, se computan dos polinomios a(x) y c(x) tales b(x) a(x) + m(x) c(x) = 1. Además, a(x) • b(x) mod m(x) = 1, lo que significa que b-1(x) = a(x) mod m(x). Generalizando, para cualquier a(x), b(x) and c(x) en el campo, se dice que: a(x) • (b(x) + c(x)) = a(x) • b(x) + a(x) • c(x).

19

Marco Teórico

Capítulo II

Entonces se dice que el arreglo de 256 posibles valores del byte, con la operación lógica XOR usada en la suma y la multiplicación acabada de definir, tiene la estructura de un campo finito GF(28).

2.2.8

Multiplicación por x

Al multiplicar el polinomio modelo: b7 x 7 + b6 x 6 + b5 x 5 + b4 x 4 + b3 x 3 + b2 x 2 + b1 x1 + b0 x =

7

∑b x i =0

i

i

,

con el polinomio x resulta en: b8 x + b7 x + b6 x + b5 x + b4 x + b3 x + b2 x + b1 x + b0 x . 8

7

6

5

4

3

2

1

El resultado x • b(x) se obtiene al reducir el resultado obtenido modulo m(x), como ya se definió anteriormente. Si b7 = 0, el resultado se encuentra entonces en una forma reducida. Si b7 = 1, la reducción se acompaña substrayendo (XOR) el polinomio m(x). Entonces podemos decir que la multiplicación por x, (por ejemplo {00000010} ó {02}) se puede implementar a nivel de bytes como un corrimiento a la izquierda y una subsiguiente operación lógica XOR con {1b}. Esta operación en bytes se denota como xtime(). La multiplicación de potencias mayores a x puede ser implementada al repetir la operación xtime(). Para agregar más recursos, la multiplicación por cualquier constante puede también ser implementada, por ejemplo: {57} • {13} = {fe}, debido a que: {57} • {02} = xtime({57}) = {ae} {57} • {04} = xtime({ae}) = {47} {57} • {08} = xtime({47}) = {8e} {57} • {10} = xtime({8e}) = {07}, Además: {57} • {13} = {57} • ({01} ⊕ {02} ⊕ {10}) = {57} ⊕ {ae} ⊕ {07} = {fe}.

20

Capítulo II 2.2.9

Marco Teórico

Polinomios con coeficientes en GF(28)

Los polinomios de cuatro términos, que poseen coeficientes que son elementos de campos finitos, pueden ser definidos de la siguiente manera: a( x) = a3 x3 + a2 x2 + a1 x + a0 Dichos polinomios serán expresados como una palabra de la forma: [ a0 , a1 , a2 , a3 ] . Se debe notar que los polinomios para estas definiciones se comportan de una manera diferente que los elementos de polinomios que satisfacen la definición de campo finito. Aún cuando ambos tipos de polinomios utilizan la misma x indeterminada. Los coeficientes para estas definiciones son ellos mismos elementos de un campo finito, por ejemplo: bytes, en lugar de bits; además la multiplicación de polinomios de cuatro términos, utiliza un polinomio diferente de reducción, definido a continuación. Así que debe de existir siempre una distinción que nos indique en qué contexto se está trabajando. Para ilustrar la suma y multiplicación de estos campos definamos un segundo polinomio de cuatro términos: b( x) = b3 x3 + b2 x2 + b1 x + b0 . La suma se lleva a cabo al sumar las potencias similares de los coeficientes del campo finito. Esta suma corresponde a una operación lógica XOR entre los bytes correspondientes en cada una de las palabras, expresado de otra manera la ejecución de la operación XOR de los valores completos de la palabra. Así usando los polinomios de cuatro términos anteriores tenemos:

a( x) + b( x) = (a3 ⊕ b3 ) x3 + (a2 ⊕ b2 ) x 2 + (a1 ⊕ b1 ) x1 + (a0 ⊕ b0 ) . La multiplicación puede ser realizada en dos pasos. En el primer paso, el producto de polinomios c(x) = a(x)•b(x), es expandido algebraicamente y las potencias similares se juntan para dar

c( x) = c6 x6 + c5 x5 + c4 x4 + c3 x3 + c2 x2 + c1 x1 + c0 , donde:

c0 = a0 ib0

c4 = a3 ib1 ⊕ a2 ib2 ⊕ a1 ib3

c1 = a1 ib0 ⊕ a0 ib1

c5 = a3 ib2 ⊕ a1 ib3

c2 = a2 ib0 ⊕ a1 ib1 ⊕ a0 ib2

c6 = a3 ib3

c3 = a3 ib0 ⊕ a2 ib1 ⊕ a1 ib2 ⊕ a0 ib3 El resultado, c(x) no representa una palabra de cuatro bytes. Por lo tanto, el segundo paso de la multiplicación es reducir c(x) modulo un polinomio de 4. El resultado puede ser reducido a un polinomio de grado menor a 4.

21

Capítulo II

Para el algoritmo AES, el polinomio que cumple estas condiciones es

Marco Teórico

x4 + 1, así que:

x i mod ( x 4 + 1) = x i mod 4 . El producto modular de a(x) y b(x), denotado como a(x) ⊗ b(x), está dado por el polinomio de cuatro términos d(x), definido como: d ( x ) = d 3 x 3 + d 2 x 2 + d 1 x + d 0 por:

d 0 = ( a0 ib0 ) ⊕ ( a3 ib1 ) ⊕ ( a2 ib2 ) ⊕ ( a1 ib3 ) d1 = ( a1 ib0 ) ⊕ ( a0 ib1 ) ⊕ ( a3 ib2 ) ⊕ ( a2 ib3 ) d 2 = ( a2 ib0 ) ⊕ ( a1 ib1 ) ⊕ ( a0 ib2 ) ⊕ ( a3 ib3 ) d3 = ( a3 ib0 ) ⊕ ( a2 ib1 ) ⊕ ( a1 ib2 ) ⊕ ( a0 ib3 ) Cuando a(x) es un polinomio fijo, el polinomio de cuatro términos d(x), se puede reescribir como la matriz:

⎡ d 0 ⎤ ⎡ a0 ⎢d ⎥ ⎢a ⎢ 1⎥ = ⎢ 1 ⎢ d 2 ⎥ ⎢ a2 ⎢ ⎥ ⎢ ⎣ d3 ⎦ ⎣ a3

a3

a2

a0 a1

a3 a0

a2

a1

a1 ⎤ ⎡b0 ⎤ a2 ⎥⎥ ⎢⎢ b1 ⎥⎥ a3 ⎥ ⎢b2 ⎥ ⎥⎢ ⎥ a0 ⎦ ⎣b3 ⎦

Como x 4 + 1 no es un polinomio irreducible sobre GF(28), la multiplicación por un polinomio fijo de cuatro términos no es necesariamente invertible. Sin embargo el algoritmo AES especifica un polinomio fijo de cuatro términos que posee una inversa que es: a(x) = {03}x3 + {01}x2 + {01}x + {02} a-1(x) = {0b} x3 + {0d} x2+ {09}x + {0e} Otro polinomio usado en el algoritmo AES tiene a0= a1 = a 2= {00} y a3 = {01}, el cual es el polinomio x3. Al revisar la matriz propuesta anteriormente, se muestra que su efecto es formar la palabra de salida al rotar los bytes de la palabra de entrada. Esto significa que [b0, b1, b2, b3] se transforma en [b1, b2, b3, b0].

22

Ca apítulo II

2.3

M Marco Teór rico

Descripción del Alggoritmo AE ES

El flujoo de datos en ell algoritmo AE ES consta de la iteración de las 4 etapas siguuientes:

2.3.1

Etap pa SubBytes

Laa etapa de tra ansformación n de byte susstituto conocidda como SubB Bytes, es una simple tabla de búúsqueda. AES define d una mattriz de 16x16 elementos e conn diferentes vallores de bytes, llamada S-boxx y quue contiene unaa permutación de todos los 256 valores possibles de 8-bits. Cada byte inddividual del Sttate ess mapeado a un n nuevo byte dee la siguiente manera: m el nibbble izquierdo del d byte se usa como el valorr de la fila, y el nibble derecho com mo el valor de la columna. Estos E valores de columnas y filas f sirven com mo box para selecccionar un valor de salida únicco de 8-bits. Poor ejemplo el valor v hexadecim mal índices en la S-b {995}, en la etapaa SubBytes hacce referencia a la fila 9, coluumna 5 de la S-box, S la cual contendrá c el vaalor {22A}. En conseccuencia, el valoor {95} es mappeado al valor {2A}

Figura 13. En la fase SubbBytes, cada Byte del State es reempplazado según unaa tabla de búsquedda.

Laa S-box está diseñada d para ser resistente a ataques cripptoanalíticos coonocidos. Específicamente, los diseñadores de Rijndael R buscarron un diseño que tuviera unna baja correlacción entre bits de entrada y bits b l salida no puuede ser descritta como una fuunción matemáática simple dee la dee salida, y la prropiedad que la enntrada.

23

Ca apítulo II

2.3.2

M Marco Teór rico

Etap pa ShiftRowss

Laa etapa de tra ansformación de cambio de d filas, llamaada ShiftRowss, es representtada en la figuura sigguiente:

Figura 14. En E la fase ShiftRoows, cíclicamente se s cambian las filaas en el State.

Laa primera fila se s mantiene sinn alteraciones. Para la segundda fila, se llevaa a cabo un corrrimiento circuular a la izquierda de 1-byte. Paara la terceraa fila se ejecuuta un corrim miento circularr de 2-bytes. Y suucesivamente en la cuarta filaa del State se lleeva a cabo un corrimiento c cirrcula de 3-bytees. Laa transformació ón ShiftRows es e más substanccial de lo que aparenta a a prim mera vista. Estoo es debido a que q tannto el State, co omo el cifrado de entrada y de d salida son trratados como un u arreglo coluumnas de 4-byttes. Poor lo tanto, en n la encriptaciión los primerros 4-bytes del texto sin ciffrar son copiaddos a la prim mera coolumna del State, y así sucesiivamente. Entoonces, la ronda de la llave serrá aplicada al State S columna por p coolumna. Así, un u cambio de fila f mueve un byte individuual desde una columna c a otrra, lo cual es una u distancia lineal de d múltiplos de d 4-bytes. Tam mbién hay quee notar que la transformaciónn asegura que los 4--bytes de una columna son exxtendidos haciaa las demás collumnas en el Sttate.

2.3.3

Etap pa MixColum mns

Laa transforma ación de mezzclado de columnas, llam mada MixColum mns opera enn cada colum mna individualmente. Cada byte dee una columna es mapeado a un nuevo vallor que es una función de toddos c los cuatro bytes que se encuenttran en dicha columna.

24

Capítulo II

Marco Teórico

La transformación puede ser definida por la siguiente multiplicación entre una matriz definida y el State:

⎡ 02 ⎢ 01 ⎢ ⎢ 01 ⎢ ⎣ 03

03 02 01 01

01 03 02 01

01⎤ ⎡ s0,0 ⎢ 01⎥⎥ ⎢ s1,0 03⎥ ⎢ s2,0 ⎥⎢ 02 ⎦ ⎣ s3,0

s0,1 s1,1 s2,1 s3,1

s0,2 s1,2 s2,2 s3,2

' s0,3 ⎤ ⎡ s0,0 ⎢ ' s1,3 ⎥⎥ ⎢ s1,0 = ' s2,3 ⎥ ⎢ s2,0 ⎥ ⎢ ' s3,3 ⎦ ⎢⎣ s3,0

' s0,1 ' s1,1 ' s2,1 ' s3,1

' s0,2 ' s1,2 ' s2,2 ' s3,2

' ⎤ s0,3 ' ⎥ s1,3 ⎥ ' ⎥ s2,3 ' ⎥ s3,3 ⎥⎦

Estos coeficientes se basan en un código lineal con una distancia máxima entre palabras de código, lo cual asegura una buena carga en la mezcla de bytes en cada columna. Cada elemento en la matriz producto, es la suma de productos de elementos de una fila y una columna. En este caso, cada suma y multiplicación son llevadas a cabo en GF(28). La transformación MixColumns en una sola columna j(0 ≤ j ≤ 3) del State puede expresarse como:

s0,' j = ( 2 i s0, j ) ⊕ ( 3 i s1, j ) ⊕ s2, j ⊕ s3, j s1,' j = s0,' j ⊕ ( 2 i s1, j ) ⊕ ( 3 i s2, j ) ⊕ s3, j s2,' j = s0,' j ⊕ s1, j ⊕ ( 2 i s2, j ) ⊕ ( 3 i s3, j ) s3,' j = ( 3 i s0, j ) ⊕ s1,' j ⊕ s2, j ⊕ ( 2 i s3, j ) El siguiente es un ejemplo de la transformación MixColumns:

⎡ 87 ⎢ 6E ⎢ ⎢ 46 ⎢ ⎣ A6

F2 4C E7 8C

4D 90 4A D8

97 ⎤ ⎡ 47 ⎢ 37 EC ⎥⎥ → ⎢ ⎢ 94 C3 ⎥ ⎥ ⎢ 95 ⎦ ⎣ ED

40 D4 E4 A5

A3 70 3A A6

4C ⎤ 9 F ⎥⎥ 42 ⎥ ⎥ BC ⎦

Verificando la primera columna de la matriz resultante se puede notar que para GF(28) la suma se lleva a cabo realizando una simple operación XOR. Para la multiplicación particularmente para un valor por x, por ejemplo [02] puede implementarse con un registro de corrimiento de 1-bit a la izquierda, seguido por una operación XOR con (0001 1011) si el bit más significativo del valor original es 1.

25

Capítulo II

Marco Teórico

Para verificar la primera columna del ejemplo anterior, se tiene que:

⊕ { A6} = {47} ({02} • {87}) ⊕ ({03} • {6 E}) ⊕ {46} ⊕ ({02} • {6 E} ) ⊕ ({03} • {46} ) ⊕ { A6} = {37} {87} ⊕ {6 E} ⊕ ({02} • {46} ) ⊕ ({03} • { A6} ) = {94} {87} ⊕ {46} ⊕ ({02} • { A6} ) = { ED} ({03} • {87}) ⊕ {6 E}

Para la primera ecuación se tiene la operación [02] • [87] = (0000 1110) 0101); [03] • [6E] = [6E]

⊕(0001

1011) = (0001

⊕([02] • [6E]) = (0110 1110) ⊕(1101 1100) = (1011 0010). Entonces:

{02} • {87} = 0001 0101 {03} • {6 E} = 1011 0010 = 0100 0110 {46} = 1010 0110 {a6} 0100 0111 = {47} La transformación MixColumns combinada con la transformación ShiftRows asegura que después de algunas rondas, todos los bits de salida dependan de todos los bits de entrada brindando difusión al proceso. Además, la elección de coeficientes en MixColumns: {01}, {02}, {03}, fueron elegidos substancialmente por razones de implementación. La multiplicación de estos coeficientes cuando se implementa de manera eficiente involucra a lo más un corrimiento y una operación XOR. Los coeficientes para InvMixColumns que es el proceso inverso para descifrar AES son más difíciles de implementar. Sin embargo, la encriptación fue considerada más importante durante el diseño de Rijndael y AES, que la desencriptación por dos razones: 1.

Para modelos de cifrado CFB (cipher block feedback) y OFB (output feedback mode), solo se utiliza encriptación.

2.

Como cualquier bloque de cifrado, AES puede ser utilizado para construir un código de autenticación de mensaje MAC, en el cual solamente se requiere encriptación.

26

Ca apítulo II

M Marco Teór rico

Figura 15 5. En la etapa MixxColumns, cada coolumna del State ess multiplicada porr un polinomio connstante c(x).

2.3.4

Etap pa AddRoundKey

Enn la transform mación adición n de llave de ronda, llamadda AddRoundK Key, los 128-bbits del State son s prrocesados mateemáticamente bit a bit mediiante una operración XOR con c los 128-biits de la llave de roonda. La operaación puede serr vista como una u operación entre columnaas, tomando loos 4-bytes de una u coolumna del Sta ate y una palabbra de la llave de ronda, y taambién puede ser s vista comoo una operaciónn a nivvel de bytes. u ejemplo de AddRoundKey: A : Ell siguiente es un

⎡ 47 ⎢ 37 ⎢ ⎢ 94 ⎢ ⎣ ED

40 D4 E4 A5

A3 70 3A A6

4C ⎤ ⎡ AC 9 F ⎥⎥ ⎢⎢ 77 ⊕ 4 ⎥ ⎢ 66 42 ⎥ ⎢ B ⎦ ⎣ F3 BC

19 FA DC 21

28 D1 29 47

57 ⎤ ⎡ EB E 59 ⎥ ⎢ 5C ⎥ ⎢ 440 2 E = 00 ⎥ ⎢ F 2 38 ⎥ ⎢ 6 A ⎦ ⎣ 1E 84

8B A1 133 E7

1B ⎤ C 3 ⎥⎥ 42 ⎥ ⎥ D2⎦

Laa primera matriz es el State y la segunda maatriz es la llavee de ronda. ón AddRoundK Key se diseñó taan simple com mo fue posible, y afecta a cadaa bit del State. La Laa transformació exxpansión de la llave, l junto conn la complejidaad de otras etappas en AES, manifiestan m seguuridad.

27

Ca apítulo II

M Marco Teór rico

⊕) . Figura 16. En la ettapa AddRoundKey ey, cada byte del Sttate se combina coon un byte de la suubclave usando la operación XOR (⊕

28

Capíttulo IIII. DISSEÑO DEL D SIISTEMA A 3.1 Descripció D ón de la plaataforma de d desarroollo de Harrdware El FPG GA utilizado paara este trabajoo fue un SPART TAN-3E™ XC33S500E del fabbricante Xilinx®, montado sobbre una tarjjeta de desarrolllo SPARTAN--3E™ Starter-K Kit™, del fabricaante Digilent®. Dicha tarjeta contiene: puerrtos Serialess, PS/2, VGA,, SMA; Conveertidores DAC C (Digital-Anallógico), ADC (Analógico-Diigital); Memorrias DDR-S SDRAM; Interfface PHY Etheernet; LCD (liqquid cristal dissplay) de 16 caaracteres por 2 líneas; Switchhes, Push-buuttons, Encodeer rotatorio, Led’s; entre otross periféricos.

F Figura 17. Tarjetaa de desarrollo SPA ARTAN-3E™.

29

Capíttulo III 

Disseño del Sisstema

3.2 Descripció D ón de la plaataforma de d desarroollo de Soft ftware Utilizarr un FPGA del fabricante Xilinx® incorporaa varias ventajaas en el flujo dee diseño, ya quue el diseñadorr es provistoo de herramien ntas muy eficacces para alcanzzar sus objetivoos; algunas de estas e herramienntas son: IISE™ Founda ation. Softwarre utilizado para p crear y compilar códdigo HDL. Siintetizar, simuular i implementar, enrutar e y aconddicionar diseñoos. Además de descargar el diiseño para proggramar al FPG GA. M Microcontrola ador PicoBlazze™. Procesadoor en software que se implem menta en FPGA A’s de Xilinx®. De 8 8-bits basado en e una arquitecctura RISC y puudiendo alcanzzar velocidadess de hasta 100--MIPS. Ideal para t tareas de contrrol en disposittivos periféricoos. Esta herram mienta es fundaamental en estte trabajo, ya que q l controladorres para los disspositivos I/O, y el algoritmoo de encriptacióón AES se desaarrollaron en baase los a este. S System Geneerator™. Softw ware que perm mite crear y verificar diseñños para FPG GA’s de Xilinnx®. F Funciona en co onjunto con Sim mulink™ de MaatLab®, permittiendo trabajar con bloques enn un alto nivell de a abstracción. Se pueden desaarrollar núcleoos DSP para su s implementaación en un FPGA, F generanndo a automáticamen nte el código enn VHDL a parttir de su modellado en Simulinnk™.

3.3 Diagrama D conceptuaal del sisteema El diseñño del sistema se realizó en función fu del siguuiente diagram ma conceptual:

Ingreso de d datos

Control del puerto serial

Conntrol del puerto serial

Salida de dattos

Conntrol del LCD

Salida de dattos

Cifr frado de Datos

Ingreso de d datos

Control del puerto PS/2

Figura 18. Diagrrama conceptual del d sistema.

30

Capítulo III 

Diseño del Sistema

Como se observa en la figura anterior, el sistema criptográfico es capaz de ingresar los datos a encriptar de dos maneras distintas: vía comunicación serial y el puerto DB-9 de la tarjeta de desarrollo y alternativamente utilizando un teclado y el puerto PS/2 de la misma. Para la recuperación de los datos encriptados se pueden mostrar en LCD de la tarjeta de desarrollo y también pueden recuperarse mediante comunicación serial y el puerto DB-9. Para la elección de la gestión de datos el sistema emplea los switches y la LCD de la tarjeta de desarrollo así el usuario puede ingresar los datos a encriptar de la manera que más le convenga.

3.4 Metodología El sistema se encarga de ejecutar 4 tareas principales: Gestionar el menú de elección del usuario para el ingreso de datos. Ingresar los datos al sistema para su encriptación. Encriptar los datos utilizando el algoritmo AES-128. Encargarse de regresar los datos encriptados vía serial y desplegarlos en la LCD.

3.5 ¿Por qué utilizar un microcontrolador en un FPGA? Tanto microcontroladores, como FPGA’s pueden implementar exitosamente prácticamente cualquier tipo de función digital lógica. Sin embargo cada uno posee características únicas en costo, desempeño y facilidad de uso. Los microcontroladores se encuentran muy bien ubicados en aplicaciones de control, especialmente para especificaciones altamente cambiantes. Los recursos del FPGA requeridos para implementar un microcontrolador son relativamente constantes. La misma lógica del FPGA es re-utilizada repetidamente por las instrucciones del microcontrolador, conservando recursos. Los requerimientos de la memoria de programa crecen cuando crece la complejidad. Programar secuencias de control ó máquinas de estado en código ensamblador es a menudo mucho más sencillo que crear estructuras similares en lógica para el FPGA. Los microcontroladores típicamente se encuentran limitados en desempeño. Cada instrucción se ejecuta secuencialmente. Y cuando una aplicación crece en complejidad, el número de instrucciones requeridas para implementarla también crece por lo que el desempeño del sistema decrece invariablemente. En contraste el desempeño en un FPGA es más flexible. Por ejemplo, un algoritmo puede ser implementado secuencialmente ó completamente en paralelo dependiendo de los requerimientos de desempeño.

31

Capítulo III 

Diseño del Sistema

Una implementación completamente en paralelo es más rápida pero consume más recursos en el FPGA. Un microcontrolador empotrado en un FPGA provee lo mejor de dos mundos. El microcontrolador implementa funciones complejas no cruciales de control, mientras funciones de Data-path ó críticas en el tiempo son mejor implementadas utilizando lógica del FPGA. Por ejemplo, un microcontrolador no puede responder a eventos más rápidos que algunos microsegundos. La lógica del FPGA puede responder a múltiples y simultáneos eventos en tan solo algunos nanosegundos. Anteriormente antes de que el microcontrolador PicoBlaze™ existiera, si se requería conectar un microcontrolador al FPGA se debía de hacer externamente a este, limitando la conectividad y afectando el desempeño del sistema. Utilizar el microcontrolador PicoBlaze™ para encriptar datos utilizando el algoritmo AES-128 es una opción viable, ya que un microcontrolador es una máquina de estados más o menos compleja dependiendo de su arquitectura, y esto lo hace una buena solución para este tipo de algoritmos donde la repetición de tareas y secuencias de operaciones son una constante.

3.6 Características del microcontrolador PicoBlaze™ El microcontrolador PicoBlaze™ es una de las soluciones de Xilinx®, para procesamiento embebido, siendo compacto, y optimizado para las familias Spartan™-3 y Virtex™-II. Es un microcontrolador RISC de 8-bits pensado para tareas de control y gestión de dispositivos periféricos externos, pero no por ello deja de ser efectivo en tareas de procesamiento de datos y algoritmos más complejos como es el caso de la AES-128. Este microcontrolador ocupa apenas 96 slices del FPGA. Puede albergar hasta 1024 instrucciones en la memoria de programa y puede ejecutar desde 44 hasta 100-MIPS dependiendo del dispositivo a utilizar. Algunas de las características del microcontrolador son:

Registros de propósito general de 16-bits Almacenamiento de 1K instrucciones de programa, automáticamente cargado durante la configuración del FPGA. ALU de 8-bits con banderas de CARRY y ZERO. Memoria RAM interna de 64 localidades de 8-bits. 256 direcciones de entrada y 256 direcciones de salida. Stack automático de 31 posiciones. Desempeño altamente predecible, siempre 2 ciclos de reloj por instrucción. Rápida respuesta a interrupciones, en el peor de los casos 5 ciclos de reloj.

32

Capíttulo III 

Disseño del Sisstema

Figura 19. Arquittectura del microcoontrolador PicoBllaze™.

3 3.6.1

pBllazeIDE™, software s de desarrollo d en n ensambladdor para PiccoBlaze™

D Después de que q tanto loss datos a ciffrar como la llave han siido ingresadoos al sistema el m microcontrolad dor PicoBlaze™ se encarga dee encriptarlos y enviarlos tannto por el puertoo serial como por p l LCD de la tarjeta la t de desaarrollo. Para ell programa quee ejecuta el microcontrolado m or PicoBlaze™, se u utilizó la herraamienta “thirdd-party” pBlazzeIDE™ que el desarrollador Mediatronix®, ofrece sin coosto d desde su sitio o web. Dichaa herramienta además de permitir p escribbir y compilaar el código en e ensamblador, permite p simular las instruccciones a ejecuutar por el miccrocontroladorr PicoBlaze™, así c como los puerttos de Entradaa/Salida del missmo.

Figura 20. Software pBlaazeIDE™ del desarrrollador Mediatronnix®, simulando ell programa del trabbajo del trabajo dee investigación.

33

Capítulo III 

Diseño del Sistema

3.7 Implementación del sistema Inicializar LCD

Desplegar mensaje de bienvenida en la LCD

Limpiar la memoria SPM del

El usuario aún no ha elegido una gestión

Esperar elección de gestión del usuario (leer switches)

No Detectar el bit de inicio en la línea de Rx del puerto RS-232

No

Comunicación Serial

Comunicación PS/2

Comprobar si han ingresado al sistema 32 bytes conteniendo la llave y el texto a cifrar

Comprobar si han ingresado al sistema 32 bytes conteniendo la llave y el texto a cifrar

No

Detectar el bit de inicio en la línea de reloj del puerto PS2

No



Sí Sí



Subrutina de retardo de 4.3µs

Detectar un nivel bajo en la línea de reloj en PS2

Cifrado

Examinar si han ingresado 8-bits al sistema

Detectar un flanco de subida en la línea de reloj en

Escanear la línea Rx de RS-232 y realizar un registro de corrimiento a la izquierda en el registro de recepción con un 0 ó un 1 según lo detectado

Extraer los datos obtenidos de la encriptación: Texto cifrado, y Keyschedule por medio de la línea TX del puerto SR-232 de manera similiar a la rutina de ingreso

Subrutina de retardo de 8.3µs



Escanear la línea de datos de PS2 y realizar un registro de corrimiento a la izquierda en el registro de recepción con un 0 ó un 1 según lo detectado

Almacenar los resultados en la memoria SPM del microcontrolador ™ PicoBlaze

Subrutina de retardo de 8.3µs

Detectar el bit de parada en la línea de Rx del puerto RS-232





No

No

Desplegar los datos obtenidos de la encriptación: Texto cifrado, y Keyschedule por medio de la LCD de la tarjeta de desarrollo

No

Sí No

Examinar si han ingresado 8-bits al sistema

Sí Detectar el bit de parada en la línea de reloj del puerto PS2

No

Sí Decodificar el Scan-Key recibido y traducirlo a código ASCII

Esperar a que el usuario desee iniciar una nueva encriptación de datos

Almacenar en la memoria SPM del PicoBlaze™ Almacenar en la memoria SPM del PicoBlaze™



Figura 21. Programa que ejecuta el microcontrolador PicoBlaze .

34

Desplegar el carácter ingresado, en la LCD de la tarjeta de desarrollo

No

Capíttulo III 

3.7.1

Disseño del Sisstema

Gestiión de Entraada/Salida de d datos al Sistema S

Ell sistema pued de gestionar daatos por medioo de un tecladoo PS/2 ó por el e puerto seriaal de la tarjeta de deesarrollo:

3.7.1.1

Comuniccación Serial

Para una comunicaciónn libre de erroores entre el FPGA F y la PC C debe seguir correctamentee el protocolo o de comunicacción serial, sinncronizar la deetección de seññales en la receepción, y geneerar formas de d onda acertaddas en la trannsmisión. Con el fin de ahoorrar hardware y aprovecharr la utilización del microconntrolador PicooBlaze™, toda la gestión de daatos se realiza dentro d del mism mo microcon ntrolador. El prrotocolo de com municación see estableció a 115,200 1 bps, utilizando 1-bit de inicio, 8--bits de datos y 1-bit de paarada. Para la recepción se utilizó la técnnica llamada BitB Banging que consiste en e detectar el bit b de inicio de la comunicación para desppués muestrearr el pin de Rxx en un intervalo de tiempo determinado, y finalizar detectando el bitt de parada dee la recepción n. Al utilizar unna velocidad de d transmisión de d 115,200 bpss que es el máxximo que perm mite el protoco olo, el intervaloo de muestreo se estableció a 8.68µs, para satisfacer s el Tiiempo de Símboolo de la com municación.

Figura 22 2. Puertos Serialess RS-232 montadoos en la tarjeta de desarrollo d SPART TAN-3E™ Starter-K Kit™.

35

Capíttulo III 

Disseño del Sisstema

p un bit de inicio que satisfaga s el Tieempo de Símboolo, Para la transmisión a laa PC se envía primero después se s toma el byyte a enviar, bit por bit cadaa 8.68µs empeezando por el LSB (bit mennos significattivo), después realizar r un despplazamiento y transmisión dee cada uno de los l bits del bytte a enviar, y finalizar ponieendo la línea Tx T en alto paraa indicar un bitt de paro. De nueva n cuenta esta e d microcontroolador PicoBlaaze™. tarea se reealiza dentro del

Figuraa 23. Comportamiiento del sistema en la comunicaciónn de datos serial.

3.7.1.2

Comuniccación mediaante un teclaado PS/2

Mediantee esta opción el e sistema puede ingresar los datos a encrriptar mediantee un teclado para computad dora, la gestiónn de los datos se s hace utilizanndo el protocoloo de comunicaaciones PS/2.

Figura 24. Coonector PS/2 de laa tarjeta de desarroollo SPARTAN-3E E™ Starter-Kit™.

36

Capíttulo III 

Disseño del Sisstema

Como se observa en la figura anteriorr, el protocolo PS/2 se basa en e dos líneas de d comunicacióón: d reloj, y la línea de datos. Un U caracter se conforma de 8-bits, 8 la manera de transmisiión la línea del y recepción de caracterres funciona dee manera muy similar al prottocolo Serial: 1-bit 1 de inicio,, 1bit de parada, 8-bits dee datos entre ellos e y 1-bit dee paridad, la diferencia d radicca en que paraa la d de laa comunicaciónn serial en la cuual, sincronización de bits se emplea la línnea de reloj a diferencia dicha sinccronización se hace de manerra implícita a la línea de datoos

Figura 25. 2 Formas de ondda y diagrama de tiempos t para la coomunicación PS/2..

El sistem ma, de la mismaa manera que loo hace con la comunicación c s serial, gestionaa la comunicaciión con el tecclado por meddio del microcoontrolador PicooBlaze™, con el e fin de ahorrrar recursos enn el diseño, lo o que se hace es esperar un flanco de bajaada en la líneaa de reloj, com mprobar un bit de inicio con n un ‘0’ lógicoo en la línea dee datos y comeenzar a recibir los bits de loss caracteres. Caada caracter recibido, r ingressa al sistema enn un formato llamado Scan-ccode, diferente al código ASC CII, por lo qu ue se requirió la l implementacción de un deccodificador por hardware parra que el sistema pueda enccriptar los datoos.

Figura 26. Scan-codes S para cada c una de las tecclas.

37

Diseño del Sistema

Capítulo III  3.7.2

Gestión de la LCD A)

B)

Inicio

Iniciar

Enviar dato de 8-bits a escribir en la LCD a la interface del sistema

Esperar 20ms

Limpiar el bus de datos de la LCD Especificar a la línea LCD_RS de la LCD que se desea enviar un dato

Habilitar la operación de escritura

Notificar a la LCD que se desea escribir poniendo la línea LCD_RW en un estado bajo

Esperar 5ms

Configurar la LCD con los parámetros: Interface de 8-bits, 2 renglones, caracteres de 5x8 puntos de resolución

Habilitar las operaciones de Lectura/Escritura en la LCD poniendo en alto la línea LCD_E

Configurar la memoria DDRAM, y al puntero de la LCD con los parámetros: Movimiento del cursor a la derecha y autoincremento en DDRAM Address

¿El nibble superior del byte a escribir ha sido enviado por LCD_DAT?

No

Enviar nibble superior a LCD_DAT

Sí Enviar nibble inferior a LCD DAT

Configurar a la pantalla de la LCD con los parámetros: Encender el display entero, activar cursor, desactivar posición del cursor

Esperar 240ns

Deshabilitar las operaciones de Lectura/Escritura en la LCD poniendo en bajo LCD_E

Limpiar todas las localidades de DDRAM Address y apuntar a la dirección “0”

Esperar 2ms

Deshabilitar la admisión de datos a la LCD poniendo en bajo la línea LCD_RW

Escribir mensajes de bienvenida y mensajes de menú de usuario: “Esperar gestión”

Esperar 1us

Se ha enviado el byte completo por LCD_DAT? Desplegar: “Recibiendo”

Desplegar cada caracter ingresado (32)

No

Sí Salir

No Esperar Cifrado

Desplegar texto cifrado o Key-schedule en función de los switches de la tarjeta

¿El usuario ha indicado una nueva rutina de encriptación?

38



Figura 27. A) Rutina para la LCD B) Subrutina de escritura.

Capíttulo III 

Disseño del Sisstema

h que tener en cuenta quee en la tarjeta de Paara la gestión de la pantallaa de cristal líqquido (LCD) hay deesarrollo el FP PGA se comuniica con la LCD D por medio dee 3 señales de control (Enablle, RS, R/W) y un buus de datos de 4-bits, sin em mbargo para escribir caracteres y enviar coomandos a la LCD L se tiene que q haacer con un pro otocolo de 8-bits de datos, por lo que entonnces se deben de enviar 2 niibbles de bits a la LC CD para que pueda p interprettar las instruccciones que se desean d que ejeecute. En la figura siguientee se muuestra el protocolo que ha dee seguirse para que la LCD puueda interpretar las operacionnes deseadas:

F Figura 28. Protocoolo de comunicacióón de la LCD.

Anntes de comenzar a escribiir caracteres en e la LCD, primero p ha dee inicializarse para que pueeda intterpretar los co omandos deseaados, por lo quue se configura para una interrface de 8-bits, con la LCD de d 2 línneas, caracteres de 5x8 pixelees de resolucióón, ubicar el cuursor en la prim mera línea y coolumna, activarr la memoria DDRAM M de la LCD, y limpiar la paantalla, despuéés de este inicioo el sistema maanda la secuenncia deel mensaje de bienvenida al usuario y esppera a que estee elija la gestiión de datos que q desea. En las im mágenes siguien ntes se muestraa la secuencia del d menú de ussuario: va en las imágeenes siguientess, después de haber h desplegaado los mensajees de bienveniida, Coomo se observ el sistema entra en espera a quue el usuario inndique la maneera en que deseea ingresar los datos a encripttar, s de la tarjeta t de desarrrollo. essto se hace por medio de los switches

39

Capíttulo III 

Figura 29. Secuencia del meenú de usuario dell sistema criptográáfico.

40

Disseño del Sisstema

Capítulo III 

3.7.3

Diseño del Sistema

Encriptación de datos

Tarea esencial del sistema, una vez que los datos se encuentran en el microcontrolador PicoBlaze™, se les aplica el algoritmo de encriptación AES-128 para después ponerlos a disposición del usuario. AES opera en una matriz de 4x4 bytes, llamada State (almacenado linealmente en el SPM scratch pad memory del microcontrolador PicoBlaze™). Para el cifrado cada ronda de la aplicación de AES (excepto la última) consiste en cuatro pasos: SubBytes, ShiftRows, MixColumns y AddRoundKey. Una de las grandes ventajas de AES, es que aunque cada paso es sustentado y ejecutado matemáticamente, dichos pasos se ejecutan a nivel de bytes, lo que lo hace más sencillo de implementar ya sea en hardware ó en software.

Inicio

AddRoundKey

SubBytes

ShiftRows

MixColumns

AddRoundKey

Comprobar si se han realizado 9 rondas

No

Sí SubBytes

ShiftRows

AddRoundKey

Terminar

Figura 30. Diagrama de flujo para el algoritmo de encriptación AES.

41

Capítulo III 

3.7.3.1

Diseño del Sistema

Implementación para AddRoundKey

En la etapa AddRoundKey, la subclave se combina con el State. En cada ronda se obtiene una subclave de la clave principal, usando la iteración de la clave; cada subclave es del mismo tamaño del State. La subclave se agrega combinando cada byte del State con el correspondiente byte de la subclave usando la operación lógica XOR. Inicio

Cargar al puntero state la dirección inicial donde está almacenado el State en la memoria SPM del Picoblaze™

Cargar al puntero key la dirección inicial donde está almacenado el KeySchedule en la memoria SPM del Picoblaze™

Cargar al registro count con el valor 16 dec

Cargar en regstate el valor que se encuentra almacenado en la localidad que está direccionando el puntero state

Cargar en regkey el valor que se encuentra almacenado en la localidad que está direccionando el puntero de Key-Schedule

Realizar una operación XOR entre regstate y regkey y depositar el resultado en resgstate

Almacenar el valor de regstate en el state, esto se realiza guardando dicho valor en la memoria SPM del PicoBlaze™ direccionándola con el valor que se encuentra en el puntero state

Incrementar en 1 el valor de los punteros state y key

No ¿Es el valor del registro count igual a cero?

Decremento en 1 al registro count



Salir

Figura 31. Diagrama de flujo utilizado para el diseño del algoritmo empleado para la implementación de la etapa AddRoundKey en el microcontrolador PicoBlaze™.

42

Capíttulo III 

3 3.7.3.2

Disseño del Sisstema

Im mplementaciión para SubbBytes

E la etapa Sub En bBytes, cada byyte en el arreglo del State es substituido usando la S-box de Rijndael dee 8b bits. Esta operración provee la no linealidaad en el cifraddo. La S-box utilizada u provieene de la funciión i inversa alreded dor del GF(28), conocido poor tener granddes propiedadees de no lineallidad. Para eviitar a ataques basado os en simples propiedades algebraicas, la S-box se consttruye por la coombinación dee la f función inverssa con una trannsformación affín invertible. La S-box tambbién se elije para p evitar punntos e estables y tamb bién puntos esttables inversoss. La S-box se construye c de laa siguiente mannera: 1.

Iniciaalizar la S-box con los valorres de los byttes en secuenccia ascendente fila por fila. La primeera fila contienne [00], [01], [002], … , [0F]; la segunda filaa contiene [10], [11], etc.; y así sucesiivamente. Por lo que el valorr del byte en la fila x, columnna y será [xy].

2.

Mapeear cada byte enn la S-box por su inverso mulltiplicativo en el campo finitoo GF(28); el vaalor [00] es e mapeado porr sí mismo.

3.

Consiiderar que cadaa byte en la S-bbox consiste dee 8-bits etiquettados como (b7, b6, b5, b4, b3, b2, b1, b0,).

Aplicar la siguiente transformacióón a cada bitt de cada byyte en la S-box:

bi' = bi ⊕ b( i + 4) mod88 ⊕ b(i −5) mod8 ⊕ b(i + 7) mod8 ⊕ ci , donde ci es el i-ésimo bit b del byte c con c valor [63], que es (cc7c6c5c4c3c2c1c0) = (01100011)

Fiigura 32. S-box em mpleada para la ejjecución del algoriitmo AES en el miccrocontrolador PiicoBlaze™.

43

Capítulo III 

Diseño del Sistema

El diagrama de flujo para la secuencia implementada en el microcontrolador PicoBlaze™ es la siguiente: Inicio

Cargar al puntero state la dirección inicial donde está almacenado el State en la memoria SPM del Picoblaze™

Cargar al registro count con el valor 16 dec

Cargar en regstate el valor que se encuentra almacenado en la localidad que está direccionando el puntero state

Direccionar a la memoria ROM externa con el valor que se encuentra en regstate

Leer el valor que entrega la memoria ROM externa y almacenarlo en regstate

Almacenar el valor de regstate en el state, esto se realiza guardando dicho valor en la memoria SPM del PicoBlaze™ direccionándola con el valor que se encuentra en el puntero state

Incrementar en 1 el valor del puntero state

Decremento en 1 al registro count

¿Es el valor del registro count igual a cero?

No

Sí Salir

Figura 33. Diagrama de flujo utilizado para el diseño del algoritmo empleado para la implementación de la etapa SubBytes en el microcontrolador PicoBlaze™.

44

Capítulo III  3.7.3.3

Diseño del Sistema

Implementación para ShiftRows

El paso ShiftRows opera en las filas del State; rota de manera cíclica los bytes en cada fila por un determinado offset. En AES, la primera fila queda en la misma posición. Cada byte de la segunda fila es rotado una posición a la izquierda. De manera similar, la tercera y cuarta filas son rotadas por los offsets de dos y tres respectivamente. De esta manera, cada columna del State resultante del paso ShiftRows está compuesta por bytes de cada columna del State inicial.

Inicio

Leer y almacenar en el registro s7 la dirección 1 del SPM del Picoblaze™

Guardar en la dirección 2 del SPM del Picoblaze™ el registro s8

Leer y almacenar en el registro sA la dirección 3 del SPM del Picoblaze™

Leer y almacenar en el registro s8 la dirección 5 del SPM del Picoblaze™

Guardar en la dirección 2 del SPM del Picoblaze™ el registro s8

Leer y almacenar en el registro s6 la dirección 7 del SPM del Picoblaze™

Leer y almacenar en el registro s9 la dirección 9 del SPM del Picoblaze™

Guardar en la dirección 2 del SPM del Picoblaze™ el registro s8

Leer y almacenar en el registro s7 la dirección 11 del SPM del Picoblaze™

Leer y almacenar en el registro sA la dirección 13 del SPM del Picoblaze™

Guardar en la dirección 2 del SPM del Picoblaze™ el registro s8

Leer y almacenar en el registro s8 la dirección 15 del SPM del Picoblaze™

Guardar en la dirección 1 del SPM del Picoblaze™ el registro s8

Leer y almacenar en el registro sA la dirección 14 del SPM del Picoblaze™

Guardar en la dirección 3 del SPM del Picoblaze™ el registro s8

Guardar en la dirección 5 del SPM del Picoblaze™ el registro s9

Leer y almacenar en el registro s8 la dirección 10 del SPM del Picoblaze™

Guardar en la dirección 7 del SPM del Picoblaze™ el registro sA

Guardar en la dirección 9 del SPM del Picoblaze™ el registro sA

Leer y almacenar en el registro s7 la dirección 6 del SPM del Picoblaze™

Guardar en la dirección 11 del SPM del Picoblaze™ el registro s6

Guardar en la dirección 13 del SPM del Picoblaze™ el registro s7

Leer y almacenar en el registro s6 la dirección 2 del SPM del Picoblaze™

Guardar en la dirección 15 del SPM del Picoblaze™ el registro s7

Terminar

Figura 34. Diagrama de flujo utilizado para el diseño del algoritmo empleado para la implementación de la etapa ShiftRows en el microcontrolador PicoBlaze™.

45

Capítulo III 

3.7.3.4

Diseño del Sistema

Implementación para MixColumns

En el paso MixColumns, los cuatro bytes de cada columna del State se combinan usando una transformación lineal invertible. La función MixColumns toma cuatro bytes como entrada y devuelve cuatro bytes, donde cada byte de entrada influye todas las salidas de cuatro bytes. Junto con ShiftRows, MixColumns implica difusión en el cifrado. Cada columna se trata como un polinomio GF (28) y luego se multiplica el módulo x4 + 1 con un polinomio fijo c(x). El paso MixColumns puede verse como una multiplicación matricial en el campo finito de Rijndael. Inicio

Leer y almacenar en el registro s4 la dirección 0 del SPM del Picoblaze™

Guardar en la dirección 7 del SPM del Picoblaze™ el registro s7

Leer y almacenar en el registro s4 la dirección 8 del SPM del Picoblaze™

Guardar en la dirección 15 del SPM del Picoblaze™ el registro s7

Leer y almacenar en el registro s5 la dirección 1 del SPM del Picoblaze™

Guardar en la dirección 6 del SPM del Picoblaze™ el registro s6

Leer y almacenar en el registro s5 la dirección 9 del SPM del Picoblaze™

Guardar en la dirección 14 del SPM del Picoblaze™ el registro s6

Leer y almacenar en el registro s6 la dirección 2 del SPM del Picoblaze™

Guardar en la dirección 5 del SPM del Picoblaze™ el registro s5

Leer y almacenar en el registro s6 la dirección 10 del SPM del Picoblaze™

Guardar en la dirección 13 del SPM del Picoblaze™ el registro s5

Leer y almacenar en el registro s7 la dirección 3 del SPM del Picoblaze™

Guardar en la dirección 4 del SPM del Picoblaze™ el registro s4

Leer y almacenar en el registro s7 la dirección 11 del SPM del Picoblaze™

Guardar en la dirección 12 del SPM del Picoblaze™ el registro s4

Llamar subrutina MixColumn

Llamar subrutina MixColumn

Llamar subrutina MixColumn

Llamar subrutina MixColumn

Guardar en la dirección 0 del SPM del Picoblaze™ el registro s4

Leer y almacenar en el registro s7 la dirección 7 del SPM del Picoblaze™

Guardar en la dirección 8 del SPM del Picoblaze™ el registro s4

Leer y almacenar en el registro s7 la dirección 15 del SPM del Picoblaze™

Guardar en la dirección 1 del SPM del Picoblaze™ el registro s5

Leer y almacenar en el registro s6 la dirección 6 del SPM del Picoblaze™

Guardar en la dirección 9 del SPM del Picoblaze™ el registro s5

Leer y almacenar en el registro s6 la dirección 14 del SPM del Picoblaze™

Guardar en la dirección 2 del SPM del Picoblaze™ el registro s6

Leer y almacenar en el registro s5 la dirección 5 del SPM del Picoblaze™

Guardar en la dirección 10 del SPM del Picoblaze™ el registro s6

Leer y almacenar en el registro s5 la dirección 13 del SPM del Picoblaze™

Guardar en la dirección 3 del SPM del Picoblaze™ el registro s7

Leer y almacenar en el registro s4 la dirección 4 del SPM del Picoblaze™

Guardar en la dirección 11 del SPM del Picoblaze™ el registro s7

Leer y almacenar en el registro s4 la dirección 12 del SPM del Picoblaze™

Figura 35. Diagrama de flujo utilizado para el diseño del algoritmo empleado para la implementación de la etapa MixColumns en el microcontrolador PicoBlaze™.

46

Terminar

Capítulo III 

Diseño del Sistema

MixColumns

Cargar el registro s4(c[0]) en s9

XOR s7(c[3]) con s8(c[0] ⊕ c[1]), depositar el resultado en s8

Realizar un registro de corrimiento a la izquierda SL0 a s8

Cargar el registro s6(c[2]) en s8

¿Existió un desbordamiento en el microcontrolador PicoBlaze™ al ejecutar la instrucción anterior?

XOR s7(c[3]) con s9(c[0]), depositar el resultado en s9

Cargar el registro s5(c[1]) en sA

XOR s6(c[2]) con sA(c[1]), depositar el resultado en sA

Cargar el registro s9(c[0] ⊕ c[3]) en sB

XOR sA(c[1] ⊕ c[2]) con XOR sB(c[0] ⊕ c[3]), depositar el resultado en sB(tmp)

No



XOR s8(c[0] ⊕ c[0] ⊕ c[1] ⊕ c[3])con s5(c[1]), depositar el resultado en s5. Segundo coeficiente obtenido

XOR s8(c[0] ⊕ c[1]) con 1Bhex, depositar el resultado en s8

XOR sB(c[0] ⊕ c[3]) con s8(c[0] ⊕ c[1]), depositar el resultado en s8

XOR sB(c[0] ⊕ c[3]) con s8(c[0] ⊕ c[1]), depositar el resultado en s8

XOR s8(c[0] ⊕ c[1]) con 1Bhex, depositar el resultado en s8

XOR con s8(c[0] ⊕ c[0] ⊕ c[1] ⊕ c[3]) con s6(c[2]), depositar el resultado en s6. Tercer coeficiente obtenido

Sí ¿Existió un desbordamiento en el microcontrolador PicoBlaze™ al ejecutar la instrucción anterior?

Cargar el registro s9(c[0] ⊕ c[3]) en s8

XOR s5(c[1]) con s8(c[0]), depositar el resultado en s8

Realizar un registro de corrimiento a la izquierda SL0 a s8

Realizar un registro de corrimiento a la izquierda SL0 a s8

Realizar un registro de corrimiento a la izquierda SL0 a s8

Cargar el registro sA(c[1] ⊕ c[2]) en

¿Existió un desbordamiento en el microcontrolador PicoBlaze™ al ejecutar la instrucción anterior?

Cargar el registro s4(c[0]) en s8

¿Existió un desbordamiento en el microcontrolador PicoBlaze™ al ejecutar la instrucción anterior?

No

No

No



XOR s4(c[0])con s8(c[0] ⊕ c[1] ⊕ c[0] ⊕ c[3]), depositar el resultado en s4. Primer coeficiente obtenido

XOR s8(c[0] ⊕ c[1]) con 1Bhex, depositar el resultado en s8

XOR sB(c[0] ⊕ c[3]) con s8(c[0] ⊕ c[1]), depositar el resultado en s8

XOR sB(c[0] ⊕ c[3]) con s8(c[0] ⊕ c[1]), depositar el resultado en s8

Sí XOR s8(c[0] ⊕ c[1]) con 1Bhex, depositar el resultado en s8

XOR s8(c[0] ⊕ c[0] ⊕ c[1] ⊕ c[3]) con s7(c[3]), depositar el resultado en s7. Cuarto y último coeficiente obtenido.

Terminar

Figura 36. Subrutina empleada para la implementación de la multiplicación de matrices en GF(28) en el microcontrolador PicoBlaze™.

47

Capíttulo III 

Disseño del Sisstema

P Para realizar una u implemenntación más efficiente en el microcontroladdor PicoBlazee™ y como se ha m mostrado que MixColumns solamente reqquiere de multtiplicaciones por p [02] y [033] en GF(28), las c cuales solamente hacen usoo de corrimienntos y operaciiones XOR coondicionales, estas e operacionnes p pueden

ser

eliminadas

si

se

utilizaa

la

siguiennte

identidadd

matemáticaa

para

GF(228):

{03} i x = ({022} i x ) ⊕ x , y si se parte dee las ecuacionnes para MixCoolumns mostraadas en el Marrco T Teórico, se tien ne entonces quue:

Tmp = s0, j ⊕ s1, j ⊕ s2, j ⊕ s3, j s0,' j = s0, j ⊕ Tm mp ⊕ ⎡⎣ 2 i ( s0, j ⊕ s1, j ) ⎤⎦

s1,' j = s1, j ⊕ Tm mp ⊕ ⎣⎡ 2 i ( s1, j ⊕ s2, j ) ⎦⎤ s2,' j = s2, j ⊕ Tm mp ⊕ ⎡⎣ 2 i ( s2, j ⊕ s3, j ) ⎤⎦ s3,' j = s3, j ⊕ Tm mp ⊕ ⎡⎣ 2 i ( s3, j ⊕ s0, j ) ⎤⎦

Y al emplear laas nuevas ecuaaciones el tiemppo de procesam miento se reducce en esta etapa del cifrado.

3.8 Arquitectu A ura del Sistema

Figurra 37. Diagrama esquemático e de la arquitectura a del siistema.

48

Capítulo III 

Diseño del Sistema

Como se observa en la figura anterior la arquitectura del sistema, como resultado del procesamiento embebido en el microcontrolador PicoBlaze™ ha resultado muy práctica de implementar. A continuación se describe cada uno de los bloques del sistema:

3.8.1

Microcontrolador PicoBlaze™

Nombrado en el diagrama como kcpsm3 es el bloque principal del sistema ya que en él se desarrolla todo el procesamiento de datos además de la gestión de periféricos externos. El código fuente para implementarse en un proyecto se puede encontrar de manera gratuita desde la página web del fabricante Xilinx®: www.xilinx.com

3.8.2

Memoria de programa para el microcontrolador PicoBlaze™

Designado en el diagrama esquemático como aes_mem es la memoria donde reside el programa a ejecutar por el microcontrolador. Este programa fue ensamblado con la herramienta pBlazeIDE™ del desarrollador Mediatronix®.

3.8.1

Interface

Esta es la entidad encargada de realizar la interfaz entre el microcontrolador PicoBlaze™ y los periféricos externos a este: LCD, push-buttons, switches, puerto RS-232 y PS/2. Además se encarga de decodificar los Scan-codes que envía el teclado a código ASCII; y realiza la transformación SubBytes del algoritmo AES-128 almacenando la S-box necesaria para ello.

49

Capítulo III 

Diseño del Sistema

3.9 Diseño del programa para el intercambio de datos PC-FPGA a través de MatLab® Por medio de este programa, la PC puede enviar una llave, y un texto plano para ser cifrado en el FPGA para posteriormente recibir el texto codificado según AES-128. El programa como ya se ha mencionado fue desarrollado en MatLab®, sin embargo no es necesario el uso de este programa para que el FPGA pueda lograr una comunicación exitosa, de hecho se puede prescindir de una PC, basta contar con algún dispositivo electrónico que cumpla con el protocolo de comunicación serial, para que la codificación de datos en el sistema se pueda llevar a cabo. Lo que significa que el software desarrollado fue creado solamente para corroborar el funcionamiento de la plataforma de hardware.

Terminar Inicio

Esperar la recepción de datos en COM1, y almacenar los resultados en la variable salida. Desplegar los resultados en la pantalla

Almacenar en la variable llave los números ingresados por el usuario para usar en el proceso de encriptación

Almacenar en la variable datos los números ingresados por el usuario para su encriptación

Configurar e inicializar el puerto serial COM1 utilizando el siguiente protocolo de comunicaciones: Tasa de transferencia = 115200bps, Número de bits = 8-bits, Bits de parada = 1-bit, No bit de paridad

Agrupar en una sola variable matriz las variables dato y llave, y convertirlas a un formato uint(8) para su posterior transmisión

Transmitir la variable matriz por el puerto serial utilizando los parámetros de comunicación ya establecidos

Figura 38. Diagrama de flujo para el diseño del programa que ejecuta MatLab® para la gestión de datos.

50

Capíítulo IV V. AN NÁLISIIS DE RESUL R LTADO OS e sistema codificara correctaamente según AES-128, se utilizó u el docum mento FIPS PUB Para coomprobar que el 197(Fedderal Informattion Processingg Standards Puublication 197) 7), el cual es el documento ofi ficial que descrribe al Algooritmo de Encrriptación Avannzada AES, y se s compararon los ejemplos que contiene dicho d documennto contra los l datos que el sistema proceesó:

A)

B)

Figura 39. Ejemp plo para AES-128 según s FIPS. A) Teexto y Llave antes del cifrado. B) Texxto cifrado y subclave final.

Figura F 40. Datos enviados e y recibidoos por la PC a travvés de MatLab® haacia el FPGA.

51

Capítulo IV 

Análisis de Resultados

s observa en las l imágenes anteriores a los datos d utilizadoss en el ejemploo de FIPS y los datos obteniddos Como se en el sistema de encriiptación desarrrollado en este trabajo, concuuerdan, por lo que q se puede teener la certezaa de s encriptta datos según AES-128 A de manera m correcta. que el sistema i sigu uientes se muesstran los resulttados del textoo cifrado mostrrado en la LCD D de la tarjeta de En las imágenes desarrollo. Estos caraacteres concuerrdan con los reesultados anteriiores ya que soon los mismos valores pero con c su correespondiente traaducción a códdigo ASCII.

Figura 41. Resultados R despleggados en la LCD de d la tarjeta de dessarrollo

52

Capítulo IV 

Análisis de Resultados

4.1 Resultados R s de la impplementaciión del sisttema Para deeterminar las propiedades finales del sisstema se mueestran algunass de sus características en su implem mentación:

4.1.1

Área a

Seegún la herram mienta de softw ware ISE™ Fooundation del fabricante f Xiliinx® el espacioo ocupado porr el diseño en el FPG GA es: A)

B)

Figura 42 2. Vista de los recuursos utilizados poor el diseño. A) Edditor de interconexxiones. B) Editor FloorPanel. F

53

Capítulo IV 

Valor utilizado 25 de 232 2 de 24 1 de 20 276 de 4656 78 de 2328

Recurso IOBs Externos BUFGMUXs RAMB16s Slices SLICEMs

Análisis de Resultados

Porcentaje XC3S500E 10% 8% 5% 5% 3%

Figura 43. Reporte del mapeo del diseño.

Como se puede observar en las imágenes y en el reporte de recursos, el número de elementos utilizado por el diseño es mínimo, debido a que el procesamiento y la gestión de datos se realizan en el microcontrolador PicoBlaze™, dejando bastantes recursos disponibles en el FPGA para otras necesidades. Con esto se cumple una de las metas principales para este diseño.

4.1.2

Throughput

Al utilizar el microcontrolador PicoBlaze™ se puede conocer con gran precisión el tiempo que requiere una tarea en ser procesada, ya que todas las instrucciones que ejecuta el microcontrolador requieren de dos ciclos de reloj. Para el caso del diseño, el número de ciclos de reloj necesarios para encriptar 128bits a 50MHz según los datos obtenidos con la herramienta pBlazeIDE™ es de 5,247-ciclos. Para un algoritmo criptográfico el Throughput (cantidad de datos procesados por unidad de tiempo) es:

Throughput =

Frecuencia del reloj × Número de bits Ciclos de procesamiento

En específico para el sistema diseñado en este trabajo de investigación el Throughput obtenido es:

Throughput =

4.1.3

50MHz × 128 bits = 1.21Mbps 5247 ciclos

Comparación del sistema con otras Arquitecturas

Con el propósito de conocer la manera en que se comporta el sistema en el mundo real se comparó el desempeño del sistema con algunas otras implementaciones encontradas en literatura abierta. Dichas implementaciones se dividen en dos categorías: Arquitecturas basadas en FPGA’s y Arquitecturas basadas en microcontroladores.

54

Capítulo IV 

Análisis de Resultados

A continuación se muestra una tabla con los resultados obtenidos para AES-128:

Autor Weaver[9] Labbé[10] Saggese[11] Chodwiec[12] Chodwiec[12] Standaert[13] Gaj[14] Saqib[15] Amphion [16] Amphion [16] Segredo[17] Segredo[17] Calderón[18] Bernstein[19]

Bernstein[19] Bernstein[19] ChungHuang[20] Permadi[21] Permadi[21] ChungHuang[20] ChungHuang[20] SIC-IAIK[22] FlowersSchlunder[23] Trabajo de Investigación

Tecnología/Dispositivo Slices BRAM’s FPGA/XVE600-8 460 10 FPGA/XCV1000-4 2151 4 FPGA/XCVE2000-8 446 10 FPGA/XC2530-5 222 3 FPGA/XC2530-6 222 3 FPGA/XC2300E 542 10 FPGA/XCV1000 2902 — FPGA/XCV812E 2744 — FPGA/XVE8 421 4 FPGA/XVE8 573 10 FPGA/XCV100-4 496 10 FPGA/XCV600E8 496 10 FPGA/Altera® EPF10K 1584 — Microprocesador/Intel® Pentium™ (611 ciclos @ 66MHz) Microprocesador/AMD® Athlon™X2 4600+ (213 ciclos @ 2.4GHz) Microprocesador/Intel® Core™2 Quad Q6600 (201 ciclos @ 2.4GHz) Microcontrolador/Motorola® 6805 (9000 ciclos @ 2.1MHz) Microcontrolador/Microchip® PIC16F84 (12225 ciclos @ 4MHz) Microcontrolador/Microchip® PIC16F877 (4559 ciclos @ 4MHz) Microcontrolador/Motorola® 68HC908 (7258 ciclos @ 8MHz) Microcontrolador/Hitachi® H8/300 (4180 ciclos @ 5MHz) Microcontrolador/Intel® 8051 (3905 ciclos @ 8MHz) Microcontrolador-DSP/Microchip® PIC24/dsPIC® (2808 ciclos @ 16MIPS) PicoBlaze™Microcontrolador Embebido-FPGA/XC3S500E 276 1 (5247 ciclos @ 50MHz)

Throughput 690Mbps 390Mbps 1Gbps 139Mbps 166Mbps 1.45Gbps 331.5Mbps 258.5Mbps 290Mbps 1.06Gbps 417Mbps 743Mbps 637.24Mbps

13.8Mbps (teórico) 1.44Tbps (teórico) 1.52Tbps (teórico) 30Kbps 41.8Kbps 112.3Kbps 141Kbps 153.1Kbps 262.2Kbps 729Kbps 1.21Mbps

Figura 44. Comparación de desempeño entre diferentes Arquitecturas para cifrado de AES-128

55

Capítulo V.

CONCLUSIONES

5.1 Resumen de los resultados obtenidos Se efectuó y se ahondó en el estudio del algoritmo AES, logrando realizar una síntesis correcta para la implementación exitosa de dicho algoritmo en un sistema electrónico digital. Se utilizaron varias de las herramientas de diseño de Hardware y procesamiento embebido para FPGA’s del fabricante Xilinx®. Se logró la asociación exitosa de los periféricos de Entrada/Salida de datos al sistema. Y de la misma manera la comunicación Hardware/Software entre el FPGA y la PC. La implementación obtenida del diseño del sistema demostró ser muy competente ante otros sistemas de la misma naturaleza.

5.2 Conclusiones del Trabajo realizado Por medio de este trabajo se corroboró la importancia con la que cuenta la Electrónica Digital hoy en día debido a las necesidades contemporáneas del hombre. Y dentro de esta área la manera en que los Arreglos de Compuertas Programables en Campo se posicionan conforme pasa el tiempo en áreas donde era impensable su utilización debido a los paradigmas acumulados durante muchos años. Ahora los FPGA tienden a encontrar un lugar cada vez más sólido debido a su gran capacidad y versatilidad para la implementación de soluciones en Hardware. Y es debido a esta nueva práctica, que los fabricantes de FPGA’s ofrecen más y mejores herramientas para lograr diseños exitosos y más fáciles de implementar, como es el caso del microcontrolador PicoBlaze™ utilizado en este tema de investigación. Dicho microcontrolador demostró poseer una capacidad de procesamiento muy superior a la mayoría de los microcontroladores actuales, debido a la inherente ventaja de estar embebido en una plataforma FPGA donde se cuentan con recursos para diseñar cualquier entidad necesaria para algún sistema que así lo requiera y al mismo tiempo contar con una frecuencia de reloj más alta, obteniendo así lo mejor de dos mundos. Como se vio en el capítulo de Análisis de Resultados, aunque el desempeño de una solución de procesamiento con microcontrolador no puede compararse con el desempeño de arquitecturas dedicadas, la solución con microcontrolador demostró ocupar menos recursos en la plataforma, por lo que es ideal para diseños donde la velocidad de cifrado de datos no sea una tarea crítica ó cuando las necesidades de espacio son ajustadas ya que el microcontrolador para el caso de este diseño no solamente se ocupa de la tarea de cifrado, sino que también se encarga de gestionar los periféricos de Entrada/Salida así como la comunicación con la PC.

56

Capítulo V

5.3 Trabajo Futuro Basándose en el mismo diseño y valiéndose de los pocos recursos que emplea el microcontrolador PicoBlaze™, se puede obtener un mejor desempeño empotrando varios microcontroladores en el FPGA para distribuir el procesamiento de datos y así elevar el Throughput final del sistema. Y siguiendo la misma línea de procesamiento embebido, sería muy interesante considerar el desempeño que se podría obtener al utilizar algún microprocesador empotrable como MicroBlaze™ ó PowerPC™ ya que con ellos se podría simplificar el algoritmo de encriptación al emplear instrucciones de 32-bits en lugar de las de 8 por lo que fortuitamente se prescindiría de iteraciones, alcanzando así un mucho mayor Throughput que el alcanzado para este diseño. Además, al utilizar alguno de estos microprocesadores eventualmente se utilizarían dispositivos más veloces como la memoria DDR-SDRAM ó el puerto PHY-Ethernet de la tarjeta de desarrollo por lo que la movilización de los datos en el sistema sería mucho mayor y mucho más rápida, obteniendo así una mejora global en la arquitectura.

57

Conclusiones

APÉNDICES Apéndice A. Términos y Acrónimos A continuación se enlista una serie de términos y acrónimos que se utilizarán durante la realización de esta investigación. Algunos términos que nativamente se encuentran en el idioma inglés, se les aplicará una traducción inmediata al español para una mejor comprensión:

AES. Estándar de Encriptación Avanzado Affine. Una transformación que consiste en la multiplicación de una matriz seguida por la suma de un vector. Arreglo. Una colección ordenada de entidades iguales (ejemplo: un arreglo de bytes). Bit. Un dígito binario, el cual tiene un valor de 0 ó 1. Bloque. Secuencia de bits binarios que abarcan la entrada, salida, State y la Ronda de la llave. El tamaño de una secuencia es el número de bits que contiene. Los bloques se interpretan también como arreglos de bytes. Byte. Un grupo de ocho bits que es tratado como una sola entidad ó como un arreglo de 8 bits individuales. Cifrado. Series de transformaciones que convierten texto simple a texto cifrado usando la llave de Cifrado. Descifrado. Series de transformaciones que convierten texto cifrado a texto simple usando la llave de cifrado. Llave de cifrado. Llave criptográfica secreta que es usada por la rutina de Expansión de llave para generar un arreglo de Rondas de llave; se puede imaginar como un arreglo rectangular de bytes que tienen cuatro filas y N k columnas.

58

Apéndices

Palabra. Un grupo de 32 bits que es tratado como una entidad simple ó como un arreglo de 4 bytes. Rijndael. Algoritmo criptográfico especificado en el Estándar de Encriptación Avanzado (AES). Rondas de la llave. S valores derivados del texto cifrado utilizando la Rutina de expansión de la llave; son aplicados al State en la etapa de cifrado y descifrado. Rutina de expansión de llave. Usada para generar una serie de Rondas de la llave a partir de la Llave de cifrado. Texto cifrado. Formato de salida que tienen los datos en la etapa de cifrado, ó entrada del descifrado. Texto simple. Entrada de datos al bloque de cifrado o salida del bloque de descifrado. S-box. Substitución no lineal basada en la búsqueda en tablas, usada en varias substituciones de bytes y en la rutina de Expansión de la llave para llevar a cabo una substitución uno a uno del valor de un byte. State. Es el resultado de cifrados intermedios, se puede imaginar como un arreglo rectangular de bytes que tienen cuatro filas y N k columnas.

Apéndice B. Código en ensamblador para el microcontrolador PicoBlaze™ ; -----------------------------------------------------------------------------; -----------------------------------------------------------------------------; Nombrando registros statep keyp countint round regstate regkey cicl_supp

EQU EQU EQU EQU EQU EQU EQU

s0 s1 s2 s3 s4 s5 s6

; ; ; ; ; ; ;

scan_byte comp_supp

EQU EQU

s7 s8

puntero del State puntero de la llave registro soporte de cuenta interna registro soporte de cuenta de rondas registro soporte del State registro soporte de la llave registro con la variable para revisar el registro con la constante para revisar estado del ingreso de los 10 bits de datos ; registro donde se almacena el byte formado de la comunicación serial ; registro donde se coloca el bit ingresado de la comunicación serial

gral_reg0 gral_reg1 gral_reg2 gral_reg3 gral_reg4 rc

EQU EQU EQU EQU EQU EQU

sA sB sC sD sE sF

; registro de constante de ronda para la expansión de la llave

; -----------------------------------------------------------------------------; Declarando puertos externos tx led sbox_out lcd_data lcd_rs lcd_ciclo mayusculas

DSOUT DSOUT DSOUT DSOUT DSOUT DSOUT DSOUT

$10 $11 $12 $13 $14 $15 $16

; ; ; ; ; ;

puerto puerto puerto puerto puerto puerto

de salida para la comunicación serial de salida para controlar los leds de la tarjeta de salida para la sbox de datos para la LCD de selección de registro en la LCD (datos ó comando) para manipular el ciclo en el que se encuentra la LCD

59

Apéndices

scan_code_out rx sbox_in gestion_port ps2_clk ps2_data ascii_in lcd_sel reload_port

DSOUT DSIN DSIN DSIN DSIN DSIN DSIN DSIN DSIN

$17 $20 $21 $22 $23 $24 $25 $26 $27

; puerto de entrada para la comunicación serial ; puerto de entrada para la sbox

; -----------------------------------------------------------------------------; Declarando constantes rn state key b16 G cicl

EQU EQU EQU EQU EQU EQU

$0A $00 $10 $10 $1B $0A

start delay_1us_cnt cnt_1us_LCD rs_com rs_dat ciclo_a ciclo_b ciclo_c ciclo_d

EQU EQU EQU EQU EQU EQU EQU EQU EQU

$01 $0A $0B $0C $0D $0A $0B $0C $0D

; ; ; ; ; ;

constante del state para el scratchpad constante del state para el scratchpad constante de la llave para el scratchpad constante para conteo (128 bits AES) 0x11B constante con el número de ciclos necesarios (10) para ingresar el byte de la comunicación serial

; constante para generar un retardo de 1us para la Comunicación Serial ; constante para generar un retardo de 1us para la LCD ; ; ; ;

upper nibble, rw = '1', e = lower nibble, lower nibble,

rs, rw = '0', e = '1' '0' rs, rw = '0', e = '1' e = '1'

; -----------------------------------------------------------------------------; Tabla de caracteres ASCII caracter_a caracter_b caracter_c caracter_d caracter_e caracter_f caracter_g

EQU EQU EQU EQU EQU EQU EQU

$61 $62 $63 $64 $65 $66 $67

caracter_h caracter_i caracter_j caracter_k caracter_l caracter_m caracter_n caracter_o caracter_p caracter_q caracter_r caracter_s caracter_t caracter_u caracter_v caracter_w caracter_x caracter_y caracter_z

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

$68 $69 $6A $6B $6C $6D $6E $6F $70 $71 $72 $73 $74 $75 $76 $77 $78 $79 $7A

caracter_AM caracter_BM caracter_CM caracter_DM caracter_EM caracter_FM caracter_GM caracter_HM caracter_IM caracter_JM caracter_KM caracter_LM caracter_MM caracter_NM caracter_OM caracter_PM caracter_QM caracter_RM caracter_SM caracter_TM caracter_UM caracter_VM caracter_WM caracter_XM caracter_YM caracter_ZM

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

$41 $42 $43 $44 $45 $46 $47 $48 $49 $4A $4B $4C $4D $4E $4F $50 $51 $52 $53 $54 $55 $56 $57 $58 $59 $5ª

60

Apéndices

caracter_0 caracter_1 caracter_2 caracter_3 caracter_4 caracter_5 caracter_6 caracter_7 caracter_8 caracter_9

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

$30 $31 $32 $33 $34 $35 $36 $37 $38 $39

caracter_colon caracter_punto caracter_semicolon caracter_menos caracter_division caracter_suma caracter_coma caracter_menor_que caracter_mayor_que caracter_igual caracter_espacio caracter_RC caracter_interr caracter_pesos caracter_excl caracter_bs

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

$3A $2E $3B $2D $2F $2B $2C $3C $3E $3D $20 $0D $3F $24 $21 $08

; ':'

; '/'

; retorno de carro ; '?' ; '!' ; Back Space

; -----------------------------------------------------------------------------; Programa principal inicio:

CALL CALL CALL

high iniciar_lcd mensaje_bienvenida

aes:

CALL CALL CALL

gestion_entrada encriptacion gestion_salida

JUMP

aes

; -----------------------------------------------------------------------------high:

LOAD OUT

gral_reg0, $01 gral_reg0, tx

RET ; -----------------------------------------------------------------------------iniciar_lcd:

CALL LOAD LOAD

delay_20ms gral_reg0, $03 gral_reg2, ciclo_d

OUT OUT CALL

gral_reg0, lcd_data gral_reg2, lcd_ciclo delay_5ms

LOAD OUT OUT CALL

gral_reg0, $02 gral_reg0, lcd_data gral_reg2, lcd_ciclo delay_40us

; Configuración de la LCD LOAD LOAD CALL

gral_reg1, rs_com ; Function set x"28", interface de 8-bits, 2 líneas, caracteres de 5x8 puntos de resolución gral_reg0, $28 escribir_lcd

; Entry mode set x"06", cursor se mueve a la derecha y DDRAM address se incrementa en 1 LOAD CALL

gral_reg0, $06 escribir_lcd

; Display On/Off x"0C", encender el display entero, activar cursor, desactivar posición del cursor LOAD CALL

gral_reg0, $0C escribir_lcd

; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD CALL CALL CALL

gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

RET ; ------------------------------------------------------------------------------

61

Apéndices

Mensaje_bienvenida: ; Configura dirección x"00" de la LCD LOAD LOAD CALL

gral_reg0, $84 gral_reg1, rs_com escribir_lcd

; Escribir "BUAP-FCE" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_bm escribir_lcd gral_reg0, caracter_um escribir_lcd gral_reg0, caracter_am escribir_lcd gral_reg0, caracter_pm escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_menos escribir_lcd gral_reg0, caracter_fm escribir_lcd gral_reg0, caracter_cm escribir_lcd gral_reg0, caracter_em escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL

gral_reg0, $C2 gral_reg1, rs_com escribir_lcd

; Escribir "Sistema cifrador" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_cm escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_f escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_r escribir_lcd

LOAD CALL

gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_am escribir_lcd gral_reg0, caracter_em escribir_lcd gral_reg0, caracter_sm escribir_lcd

CALL CALL CALL

delay_1s delay_1s delay_1s

; Esperar 3 segundos

RET ; -----------------------------------------------------------------------------leds:

OUT

scan_byte, led

RET ; -----------------------------------------------------------------------------gestion_entrada: ; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

62

Apéndices

; Escribir "Elegir gestión" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_em escribir_lcd gral_reg0, caracter_l escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_g escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_g escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_s escribir_lcd gral_reg0, caracter_t escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_n escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD LOAD CALL LOAD CALL LOAD CALL

gral_reg0, $C3 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_t escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_s escribir_lcd gral_reg0, caracter_colon escribir_lcd

CALL CALL

delay_1s delay_500ms

; Esperar 2 segundos

; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_sm escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_l escribir_lcd

; Desplegar menú

63

Apéndices LOAD CALL LOAD CALL

gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_pm escribir_lcd gral_reg0, caracter_sm escribir_lcd gral_reg0, caracter_division escribir_lcd gral_reg0, caracter_2 escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd

; Configura dirección x"40" de la LCD

elegir_gestion:

LOAD LOAD CALL

gral_reg0, $C3 gral_reg1, rs_com escribir_lcd

LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_sm escribir_lcd gral_reg0, caracter_wm escribir_lcd gral_reg0, caracter_1 escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_sm escribir_lcd gral_reg0, caracter_wm escribir_lcd gral_reg0, caracter_0 escribir_lcd

IN COMP JUMP COMP JUMP

scan_byte, gestion_port scan_byte, $00 Z, elegir_gestion scan_byte, $02 Z, serial_entrada

; -----------------------------------------------------------------------------ps2_entrada:

ps2_in_state:

CALL LOAD LOAD

introducir_texto sF, state s9, b16

CALL CALL COMP JUMP

ps2_routine deco_scan gral_reg2, $01 Z, ps2_in_state

; ingresa al sistema el código de la tecla presionada ; decodifica el código ó instrucción de la tecla presionada

STORE ADD SUB JUMP

scan_byte, sF sF, 1 s9, 1 NZ, ps2_in_state

; ; ; ;

; direcciona el puntero al state ; inicializa la variable de cuenta

almacena el byte ingresado incrementa el puntero del state decrementa el valor del registro de soporte de cuenta si el registro de soporte de cuenta es cero todos los bytes se han

cargado en RAM CALL

ps2_end_work COMP JUMP

ps2_in_key:

cargado en RAM

gral_reg2, $01 Z, ps2_in_state

CALL LOAD LOAD

introducir_llave sF, $10 s9, b16

CALL CALL COMP JUMP

ps2_routine deco_scan gral_reg2, $01 Z, ps2_in_key

STORE ADD SUB JUMP

scan_byte, sF sF, 1 s9, 1 NZ, ps2_in_key

CALL COMP JUMP

ps2_end_work gral_reg2, $01 Z, ps2_in_state

; direcciona el puntero a la entrada ; inicializa la variable de cuenta ; decodifica el código ó instrucción de la tecla presionada

; ; ; ;

almacena el byte ingresado incrementa el puntero de la llave decrementa el valor del registro de soporte de cuenta si el registro de soporte de cuenta es cero todos los bytes se han

RET

64

Apéndices

; -----------------------------------------------------------------------------ps2_routine:

LOAD LOAD

cicl_supp, $00 scan_byte, $00

ps2_wait_low:

COMP JUMP

cicl_supp, $0B Z, ps2_dat_out

ps2_wait:

IN COMP JUMP

comp_supp, ps2_clk comp_supp, $00 NZ, ps2_wait

ps2_scan:

ADD COMP JUMP COMP JUMP COMP JUMP

cicl_supp, $01 cicl_supp, $01 Z, ps2_wait_high cicl_supp, $0A Z, ps2_wait_high cicl_supp, $0B Z, ps2_wait_high

IN COMP JUMP

comp_supp, ps2_data comp_supp, $00 Z, ps2_zero_rut

ps2_one_rut:

SR1 JUMP

scan_byte ps2_wait_high

ps2_zero_rut:

SR0

scan_byte

ps2_wait_high:

IN COMP JUMP JUMP

comp_supp, ps2_clk comp_supp, $00 Z, ps2_wait_high ps2_wait_low

ps2_dat_out:

RET

; -----------------------------------------------------------------------------deco_scan: shift:

shift_work:

COMP JUMP COMP JUMP

scan_byte, $12 Z, shift_work scan_byte, $59 NZ, enter

LOAD OUT CALL CALL CALL JUMP JUMP

s3, $01 s3, mayusculas delay_100ms delay_100ms ps2_routine deco_scan deco_out

; -----------------------------------------------------------------------------enter:

COMP JUMP LOAD CALL CALL JUMP

scan_byte, $5A NZ, caps gral_reg2, $01 delay_100ms delay_100ms deco_end

; ------------------------------------------------------------------------------

caps:

COMP JUMP COMP JUMP

scan_byte, $58 NZ, backspace gral_reg4, $01 Z, uppcase_off

uppcase_on:

LOAD OUT LOAD LOAD CALL CALL JUMP

s3, $01 s3, mayusculas gral_reg4, $01 gral_reg2, $01 delay_100ms delay_100ms deco_end

uppcase_off:

LOAD OUT LOAD LOAD CALL CALL JUMP

s3, $00 s3, mayusculas gral_reg2, $01 gral_reg4, $00 delay_100ms delay_100ms deco_end

; -----------------------------------------------------------------------------backspace:

COMP JUMP COMP JUMP COMP

scan_byte, $66 NZ, deco_out sF, state NZ, backspace_work sF, key

65

Apéndices

backspace_work:

JUMP LOAD CALL CALL JUMP

NZ, backspace_work gral_reg2, $01 delay_100ms delay_100ms deco_end

SUB ADD LOAD AND XOR OR

sF, $01 s9, 1 gral_reg3, gral_reg3, gral_reg3, gral_reg3,

sF $0F $40 $80

; Configura dirección a borrar de la LCD LOAD LOAD CALL LOAD LOAD CALL

gral_reg0, gral_reg3 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat gral_reg0, caracter_espacio escribir_lcd

; Configura la nueva dirección a escribir de la LCD LOAD LOAD CALL LOAD LOAD CALL CALL JUMP

gral_reg0, gral_reg3 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat gral_reg2, $01 delay_100ms delay_100ms deco_end

; -----------------------------------------------------------------------------deco_out:

CALL CALL OUT IN LOAD CALL COMP JUMP LOAD OUT

deco_end:

RET

delay_100ms delay_100ms scan_byte, scan_code_out scan_byte, ascii_in gral_reg0, scan_byte escribir_lcd gral_reg4, $01 Z, deco_end s3, $00 s3, mayusculas

; -----------------------------------------------------------------------------; -----------------------------------------------------------------------------ps2_end_work:

CALL CALL CALL COMP JUMP COMP JUMP

backspace_end_work: SUB ADD LOAD AND XOR OR

ps2_routine delay_100ms delay_100ms scan_byte, $5A Z, ps2_end_out scan_byte, $66 NZ, ps2_end_work sF, $01 s9, 1 gral_reg3, gral_reg3, gral_reg3, gral_reg3,

sF $0F $40 $80

; Configura dirección a borrar de la LCD LOAD LOAD CALL

gral_reg0, gral_reg3 gral_reg1, rs_com escribir_lcd

LOAD LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_espacio escribir_lcd

; Configura la nueva dirección a escribir de la LCD LOAD LOAD CALL LOAD LOAD ps2_end_out:

gral_reg0, gral_reg3 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat gral_reg2, $01

RET

; -----------------------------------------------------------------------------; -----------------------------------------------------------------------------serial_entrada:

CALL LOAD LOAD

esperando statep, state countint, b16

serial_in_state:

CALL

clean

; direcciona el puntero al state ; inicializa la variable de cuenta

66

Apéndices CALL STORE CALL ADD SUB JUMP

start_rx scan_byte, statep leds statep, 1 countint, 1 NZ, serial_in_state

LOAD CALL LOAD LOAD

scan_byte, $08 leds keyp, $10 countint, b16

CALL CALL STORE CALL ADD SUB

clean start_rx scan_byte, keyp leds keyp, 1 countint, 1

JUMP

NZ, serial_in_key

LOAD CALL

scan_byte, $80 leds

; almacena el byte ingresado ; incrementa el puntero del state ; decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero todos los bytes se han

cargado en RAM

serial_in_key:

cargado en RAM

; direcciona el puntero a la entrada ; inicializa la variable de cuenta

; almacena el byte ingresado ; incrementa el puntero de la llave ; decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero todos los bytes se han

RET ; -----------------------------------------------------------------------------start_rx: wait_start:

IN COMP JUMP

comp_supp, rx comp_supp, $00 NZ, wait_start

CALL

delay_Rx0

polling:

CALL ADD COMP JUMP IN COMP JUMP

delay_Rx1 cicl_supp, $01 cicl_supp, cicl Z, wait_stop comp_supp, rx comp_supp, $00 Z, zero_rut

one_rut:

SR1 JUMP

scan_byte polling

zero_rut:

SR0 JUMP

scan_byte polling

wait_stop:

IN COMP JUMP

comp_supp, rx comp_supp, $00 Z, wait_stop

RET ; -----------------------------------------------------------------------------encriptacion: preround:

LOAD

round, $00

; ------------------------------------------------------------------------------

addroundkey0:

LOAD LOAD LOAD

statep, state keyp, key countint, b16

; direcciona el puntero statep al inicio del state ; direcciona el puntero keyp al inicio de la llave ; carga el valor con el número de bytes a procesar

FETCH FETCH XOR

regstate, statep regkey, keyp regstate, regkey

; carga al registro state el valor que está direccionando el puntero ; carga al registro key el valor que está direccionando el puntero key ; realiza la operación lógica XOR entre el state y la llave, deposita el valor en el registro state ; guarda el valor del registro state en el state ; incrementa en uno el valor del puntero state ; incrementa en uno el valor del puntero llave ; se decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero el state ha sufrido la

STORE ADD ADD SUB JUMP transformación addroundkey

regstate, statep statep, $01 keyp, $01 countint, $01 NZ, addroundkey0

; -----------------------------------------------------------------------------cipher:

LOAD LOAD

round, rn rc, $01

; -----------------------------------------------------------------------------cleanbox:

LOAD LOAD

statep, state countint, b16

; direcciona el puntero statep al inicio del state ; carga el valor con el número de bytes a procesar

s_box:

FETCH OUT IN STORE

regstate, regstate, regstate, regstate,

; ; ; ;

statep sbox_out sbox_in statep

carga en el registro state el valor que está direccionando el puntero le indica a la BlockRam la dirección que se desea leer ingresa el valor leído se almacena el byte deseado en la memoria RAM scratchpad

67

Apéndices ADD SUB JUMP

statep, $01 countint, $01 NZ, s_box

; se incrementa en uno el valor del puntero ; se decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero todos los bytes se han

; -----------------------------------------------------------------------------shiftrow:

FETCH FETCH FETCH FETCH STORE STORE STORE STORE

s7, s8, s9, sA, s8, s9, sA, s7,

state state state state state state state state

+ + + + + + + +

1 1 1 1 1 1 1 1

FETCH FETCH FETCH FETCH STORE STORE STORE STORE

s6, s7, s8, sA, s8, sA, s6, s7,

state state state state state state state state

+ + + + + + + +

2 2 2 2 2 2 2 2

FETCH FETCH FETCH FETCH

sA, s6, s7, s8,

state state state state

+ + + +

3 3 + 4 3 + 4 + 4 3 + 4 + 4 + 4

STORE STORE STORE STORE

s8, sA, s6, s7,

state state state state

+ + + +

3 3 + 4 3 + 4 + 4 3 + 4 + 4 + 4

+ 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4

; -----------------------------------------------------------------------------COMP JUMP

round, $01 Z, roundkey

; -----------------------------------------------------------------------------mixcolumns:

FETCH FETCH FETCH FETCH CALL STORE STORE STORE STORE

s4, state s5, state s6, state s7, state mixcolumn s4, state s5, state s6, state s7, state

+ + + +

0 1 2 3

+ + + +

0 1 2 3

FETCH FETCH FETCH FETCH CALL STORE STORE STORE STORE

s4, state s5, state s6, state s7, state mixcolumn s4, state s5, state s6, state s7, state

+ + + +

0 1 2 3

+ + + +

4 4 4 4

+ + + +

0 1 2 3

+ + + +

4 4 4 4

FETCH FETCH FETCH FETCH CALL STORE STORE STORE STORE

s4, state s5, state s6, state s7, state mixcolumn s4, state s5, state s6, state s7, state

+ + + +

0 1 2 3

+ + + +

4 4 4 4

+ + + +

4 4 4 4

+ + + +

0 1 2 3

+ + + +

4 4 4 4

+ + + +

4 4 4 4

FETCH FETCH FETCH FETCH CALL STORE STORE STORE STORE

s4, state s5, state s6, state s7, state mixcolumn s4, state s5, state s6, state s7, state

+ + + +

0 1 2 3

+ + + +

4 4 4 4

+ + + +

4 4 4 4

+ + + +

4 4 4 4

+ + + +

0 1 2 3

+ + + +

4 4 4 4

+ + + +

4 4 4 4

+ + + +

4 4 4 4

; -----------------------------------------------------------------------------roundkey:

FETCH FETCH FETCH FETCH LOAD LOAD LOAD LOAD LOAD

s4, s5, s6, s7, s8, s4, s5, s6, s7,

key key key key s4 s5 s6 s7 s8

+ + + +

12 13 14 15

; carga la última columna de la llave

; Aplica la transformación rotword

68

cargado en RAM

Apéndices

nowrap:

key96:

OUT IN

s4, sbox_out s4, sbox_in

; SubWord( RotWord( temp ) ) ; ingresa el valor leído

XOR SL0 JUMP XOR

s4, rc rc NC, nowrap rc, G

; xor Rcon( i / Nk ) ; x^(i-1) (i+=1)

OUT IN OUT IN OUT IN LOAD LOAD

s5, sbox_out s5, sbox_in s6, sbox_out s6, sbox_in s7, sbox_out s7, sbox_in keyp, key countint, b16

; SubWord( RotWord( temp ) )

FETCH XOR STORE ADD FETCH XOR STORE ADD FETCH XOR STORE

s8, keyp s4, s8 s4, keyp keyp, 1 s8, keyp s5, s8 s5, keyp keyp, 1 s8, keyp s6, s8 s6, keyp

; k[i]=k[i - Nk] ^ temp

ADD FETCH XOR STORE ADD SUB JUMP

keyp, 1 s8, keyp s7, s8 s7, keyp keyp, 1 countint, 4 NZ, key96

; SubWord( RotWord( temp ) ) ; SubWord( RotWord( temp ) )

; k[i]=k[i - Nk] ^ temp

; k[i]=k[i - Nk] ^ temp

; k[i]=k[i - Nk] ^ temp

; -----------------------------------------------------------------------------cleanark:

LOAD LOAD LOAD

statep, state keyp, key countint, b16

; direcciona el puntero statep al inicio del state ; direcciona el puntero keyp al inicio de la llave ; carga el valor con el número de bytes a procesar

addroundkey:

FETCH FETCH XOR

regstate, statep regkey, keyp regstate, regkey

; carga al registro state el valor que está direccionando el puntero ; carga al registro key el valor que está direccionando el puntero key ; realiza la operación lógica XOR entre el state y la llave, deposita el valor en el registro state ; guarda el valor del registro state en el state ; incrementa en uno el valor del puntero state ; incrementa en uno el valor del puntero llave ; se decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero el state ha sufrido la

STORE ADD ADD SUB JUMP transformación addroundkey

regstate, statep statep, $01 keyp, $01 countint, $01 NZ, addroundkey

; -----------------------------------------------------------------------------SUB JUMP

round, $01 NZ, cleanbox

; se decrementa el valor del registro de soporte de cuenta ;

RET ; -----------------------------------------------------------------------------; -----------------------------------------------------------------------------gestion_salida: transmision: out_state:

out_key:

LOAD LOAD

countint, b16 statep, state

; carga el valor con el número de bytes a procesar ; direcciona el puntero statep al inicio de la llave

CALL FETCH CALL CALL ADD SUB JUMP LOAD LOAD

clean scan_byte, statep leds start_tx statep, $01 countint, $01 NZ, out_state countint, b16 keyp, key

; ; ; ; ;

CALL FETCH CALL CALL ADD SUB JUMP LOAD CALL

clean scan_byte, keyp leds start_tx keyp, $01 countint, $01 NZ, out_key scan_byte, $01 leds

se incrementa en uno el valor del puntero se decrementa el valor del registro de soporte de cuenta si el registro de soporte de cuenta es cero todos los bytes se han se coloca nuevamente el valor de la cuenta para el registro de soporte direcciona el puntero keyp al inicio de la llave

; se incrementa en uno el valor del puntero ; se decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero todos los bytes se han

; -----------------------------------------------------------------------------lcd_salida:

IN

scan_byte, lcd_sel

69

cargado en RAM de cuenta

cargado en RAM

Apéndices COMP JUMP

scan_byte, $00 NZ, escribir_keysch

escribir_output:

CALL LOAD LOAD

texto_cifrado s4, state s5, b16

lcd_output:

FETCH LOAD CALL ADD SUB JUMP

scan_byte, s4 gral_reg0, scan_byte escribir_lcd s4, $01 ; se incrementa en uno el valor del puntero s5, $01 ; se decrementa el valor del registro de soporte de cuenta NZ, lcd_output ; si el registro de soporte de cuenta es cero todos los bytes se han

cambio_a:

IN COMP JUMP IN COMP JUMP JUMP

scan_byte, lcd_sel scan_byte, $01 Z, escribir_keysch scan_byte, reload_port scan_byte, $01 Z, reload cambio_a

escribir_keysch:

CALL LOAD LOAD

llave_procesada s4, key s5, b16

lcd_keysch:

FETCH LOAD CALL ADD

scan_byte, s4 gral_reg0, scan_byte escribir_lcd s4, $01 ; se incrementa en uno el valor del puntero

SUB JUMP

s5, $01 NZ, lcd_keysch

cambio_b:

IN COMP JUMP IN COMP JUMP JUMP

scan_byte, lcd_sel scan_byte, $00 Z, escribir_output scan_byte, reload_port scan_byte, $01 Z, reload cambio_b

reload:

RET

; direcciona el puntero statep al inicio de la llave ; carga el valor con el número de bytes a procesar

; carga el valor con el número de bytes a procesar

; se decrementa el valor del registro de soporte de cuenta ; si el registro de soporte de cuenta es cero todos los bytes se han

; -----------------------------------------------------------------------------; Bloque que genera las formas de onda protocolarias necesarias para transmitir a la PC start_tx:

LOAD OUT CALL

gral_reg0, $00 gral_reg0, tx delay_Tx0

byte_tx:

ADD COMP JUMP SRA JUMP

cicl_supp, $01 cicl_supp, cicl Z, stop_tx scan_byte C, tx_1

tx_0:

LOAD OUT CALL JUMP

gral_reg0, $00 gral_reg0, tx delay_Tx1 byte_tx

tx_1:

LOAD OUT CALL JUMP

gral_reg0, $01 gral_reg0, tx delay_Tx1 byte_tx

stop_tx:

LOAD LOAD LOAD OUT CALL

gral_reg0, $01 gral_reg0, $01 gral_reg0, $01 gral_reg0, tx delay_Tx_fin

RET ; -----------------------------------------------------------------------------mixcolumn:

mcf1:

LOAD XOR LOAD XOR LOAD XOR LOAD XOR SL0 JUMP XOR

s9, s9, sA, sA, sB, sB, s8, s8, s8 NC, s8,

s4 s7 s5 s6 s9 sA s4 s5

XOR XOR LOAD

s8, sB s4, s8 s8, sA

cargado en RAM

; t = c[0] ^ c[3] ; u = c[1] ^ c[2] ; v = t ^ u ; c[0] = c[0] ^ v ^ mul(0x02, c[0] ^ c[1])

mcf1 G

; c[1] = c[1] ^ v ^ mul(0x02, u)

70

cargado en RAM

Apéndices

mcf2:

mcf3:

mcf4:

SL0 JUMP XOR

s8 NC, mcf2 s8, G

XOR XOR LOAD XOR SL0 JUMP XOR

s8, s5, s8, s8, s8 NC, s8,

sB s8 s6 s7

XOR XOR LOAD SL0 JUMP XOR

s8, s6, s8, s8 NC, s8,

sB s8 s9

XOR XOR

s8, sB s7, s8

; c[2] = c[2] ^ v ^ mul(0x02, c[2] ^ c[3])

mcf3 G

; c[3] = c[3] ^ v ^ mul(0x02, t)

mcf4 G

RET ; -----------------------------------------------------------------------------; En el gral_reg0 se procesa el dato a enviar a la LCD (lcd_data) ; En el gral_reg1 se procesa el RS de la LCD (lcd_rs) ; En el gral_reg2 se indica el ciclo al que se quiere hacer referencia escribir_lcd:

OUT OUT LOAD OUT CALL

gral_reg0, lcd_data gral_reg1, lcd_rs gral_reg2, ciclo_a gral_reg2, lcd_ciclo delay_240ns

LOAD OUT CALL

gral_reg2, ciclo_b gral_reg2, lcd_ciclo delay_1us_lcd

LOAD OUT CALL

gral_reg2, ciclo_c gral_reg2, lcd_ciclo delay_240ns

LOAD OUT CALL

gral_reg2, ciclo_b gral_reg2, lcd_ciclo delay_40us

RET ; -----------------------------------------------------------------------------introducir_texto: ; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

; Escribir "Texto a cifrar:" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_tm escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_x escribir_lcd gral_reg0, caracter_t escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD

gral_reg0, caracter_c escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_f escribir_lcd gral_reg0, caracter_r

71

Apéndices CALL LOAD CALL LOAD CALL LOAD CALL

escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_colon escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD

gral_reg0, $C0 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat

RET ; -----------------------------------------------------------------------------introducir_llave: ; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

; -----------------------------------------------------------------------------; Escribir "Llave a utilizar" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_lm escribir_lcd gral_reg0, caracter_l escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_v escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL

gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_u escribir_lcd gral_reg0, caracter_t escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_l escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_z escribir_lcd

LOAD CALL LOAD CALL

gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_r escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD

gral_reg0, $C0 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat

RET ; -----------------------------------------------------------------------------texto_cifrado: ; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

; Escribir "Texto cifrado:" LOAD

gral_reg1, rs_dat

72

Apéndices LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_tm escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_x escribir_lcd gral_reg0, caracter_t escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD

gral_reg0, caracter_c escribir_lcd gral_reg0, caracter_i escribir_lcd gral_reg0, caracter_f escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_o

CALL LOAD CALL

escribir_lcd gral_reg0, caracter_colon escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD

gral_reg0, $C0 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat

RET ; -----------------------------------------------------------------------------esperando:

; Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

; Escribir "Texto cifrado:" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_espacio escribir_lcd gral_reg0, caracter_em escribir_lcd gral_reg0, caracter_s escribir_lcd gral_reg0, caracter_p escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_n escribir_lcd gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_punto escribir_lcd gral_reg0, caracter_punto escribir_lcd gral_reg0, caracter_punto escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD

gral_reg0, $C0 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat

RET ; ------------------------------------------------------------------------------

73

Apéndices

;Clear Display x"01", escribe x"20" en todas las direcciones de la DDRAM, y mueve el puntero a x"00" LOAD LOAD CALL CALL CALL

gral_reg1, rs_com gral_reg0, $01 escribir_lcd delay_1ms delay_1ms

; Escribir "Llave a cifrar:" LOAD LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg1, rs_dat gral_reg0, caracter_lm escribir_lcd gral_reg0, caracter_l escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_v escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_espacio escribir_lcd

LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL LOAD CALL

gral_reg0, caracter_p escribir_lcd gral_reg0, caracter_r escribir_lcd gral_reg0, caracter_o escribir_lcd gral_reg0, caracter_c escribir_lcd gral_reg0, caracter_e escribir_lcd gral_reg0, caracter_s escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_d escribir_lcd gral_reg0, caracter_a escribir_lcd gral_reg0, caracter_colon escribir_lcd

; Configura dirección x"40" de la LCD LOAD LOAD CALL LOAD

gral_reg0, $C0 gral_reg1, rs_com escribir_lcd gral_reg1, rs_dat

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo para Rx0 delay_Rx0:

LOAD

gral_reg1, $04

wait_Rx0:

CALL SUB JUMP LOAD SUB JUMP

delay_1us gral_reg1, $01 NZ, wait_Rx0 gral_reg1, $04 gral_reg1, $01 NZ, wait_Rx0_1

wait_Rx0_1:

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo para Rx1 delay_Rx1:

LOAD

gral_reg1, $08

wait_Rx1:

CALL SUB JUMP LOAD

delay_1us gral_reg1, $01 NZ, wait_Rx1 gral_reg1, $02

wait_Rx1_1:

SUB JUMP

gral_reg1, $01 NZ, wait_Rx1_1

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo para Tx0 delay_Tx0:

LOAD

gral_reg1, $08

wait_Tx0:

CALL SUB

delay_1us gral_reg1, $01

74

Apéndices

wait_Tx0_1:

JUMP LOAD

NZ, wait_Tx0 gral_reg1, $03

SUB JUMP

gral_reg1, $01 NZ, wait_Tx0_1

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo para Tx1 delay_Tx1:

LOAD

gral_reg1, $07

wait_Tx1:

CALL SUB JUMP LOAD

delay_1us gral_reg1, $01 NZ, wait_Tx1 gral_reg1, $0F

wait_Tx1_1:

SUB JUMP

gral_reg1, $01 NZ, wait_Tx1_1

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo para Tx_fin delay_Tx_fin:

LOAD

gral_reg1, $07

wait_Tx_fin:

CALL SUB JUMP LOAD

delay_1us gral_reg1, $01 NZ, wait_Tx_fin gral_reg1, $18

wait_Tx1_fin:

SUB JUMP

gral_reg1, $01 NZ, wait_Tx1_fin

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo de 1us delay_1us:

LOAD

gral_reg0, delay_1us_cnt

wait_1us:

SUB JUMP

gral_reg0, $01 NZ, wait_1us

RET ; -----------------------------------------------------------------------------delay_1us_lcd:

LOAD

s0, cnt_1us_lcd

wait_1us_lcd:

SUB JUMP

s0, 1 NZ, wait_1us_lcd

RET ; ------------------------------------------------------------------------------

delay_40us:

LOAD

s1, $28

wait_40us:

CALL SUB JUMP

delay_1us_lcd s1, $01 NZ, wait_40us

; 40 x 1us = 40us

RET ; -----------------------------------------------------------------------------delay_100us:

LOAD

s1, $64

wait_100us:

CALL SUB JUMP

delay_1us_lcd s1, $01 NZ, wait_100us

; 25 x 40us = 1ms

RET ; -----------------------------------------------------------------------------delay_1ms:

LOAD

s2, $19

wait_1ms:

CALL SUB JUMP

delay_40us s2, $01 NZ, wait_1ms

; 25 x 40us = 1ms

RET

75

Apéndices

; -----------------------------------------------------------------------------delay_5ms:

LOAD

s3, $05

wait_5ms:

CALL SUB JUMP

delay_40us s2, $01 NZ, wait_5ms

; 25 x 40us = 1ms

RET ; -----------------------------------------------------------------------------delay_20ms:

LOAD

s3, $14

wait_20ms:

CALL SUB JUMP

delay_1ms s3, $01 NZ, wait_20ms

; 20 x 1ms = 20ms

RET ; -----------------------------------------------------------------------------delay_100ms:

LOAD

s4, $05

wait_100ms:

CALL SUB JUMP RET

delay_20ms s4, $01 NZ, wait_100ms

; 50 x 20ms = 1000ms

; -----------------------------------------------------------------------------delay_500ms:

LOAD

s4, $19

wait_500ms:

CALL SUB JUMP

delay_20ms s4, $01 NZ, wait_500ms

; 25 x 20ms = 500ms

RET ; -----------------------------------------------------------------------------delay_1s:

LOAD

s4, $32

wait_1s:

CALL SUB JUMP

delay_20ms s4, $01 NZ, wait_1s

; 50 x 20ms = 1000ms

RET ; -----------------------------------------------------------------------------; Bloque que genera un retardo de 1us delay_240ns:

LOAD

gral_reg0, $07

wait_240ns:

SUB JUMP

gral_reg0, $01 NZ, wait_240ns

RET ; ------------------------------------------------------------------------------

; Bloque para limpiar los registros de control del sistema clean:

LOAD LOAD

cicl_supp, $01 scan_byte, $00

; limpia el registro "cicl_supp" ; limpia el registro "scan_byte"

RET ; -----------------------------------------------------------------------------VHDL

"ROM_form.vhd", "aes_mem.vhd", "aes_mem"

; ------------------------------------------------------------------------------

76

Apéndices

Apéndice C. Código VHDL para la entidad Interface ---------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Interface is Port ( --Entradas rst write_strobe read_strobe port_id_pB out_port_pB sw Rx clk ps2_clk ps2_data lcd_sel reload_port

: : : : : : : : : : : :

in in in in in in in in in in in in

std_logic; std_logic; std_logic; std_logic_vector(7 downto 0); std_logic_vector(7 downto 0); std_logic_vector(1 downto 0); std_logic; std_logic; std_logic; std_logic; std_logic; std_logic;

--Salidas Tx : out std_logic; leds : out std_logic_vector(7 downto 0); lcd_data : out std_logic_vector(3 downto 0); lcd_e : out std_logic; lcd_rs : out std_logic; lcd_rw : out std_logic; in_port_pB : out std_logic_vector(7 downto 0)); end Interface; architecture Behavioral of Interface is ---------------------------------------------------------------------------------------------------------------------Señales internas -------------------------------------------------------------------------------------------------------------------signal look : std_logic_vector(7 downto 0); signal dato : std_logic_vector(7 downto 0); signal rs : std_logic_vector(3 downto 0); signal rs_to_lcd : std_logic; signal gestion : std_logic_vector(1 downto 0); signal lcd_dat : std_logic_vector(7 downto 0); signal ciclo : std_logic_vector(3 downto 0); signal code : std_logic_vector(7 downto 0); signal ascii : std_logic_vector(7 downto 0); signal up_case : std_logic; -------------------------------------------------------------------------------------------------------------------begin ---------------------------------------------------------------------------------------------------------------------Puertos de Escritura -------------------------------------------------------------------------------------------------------------------process(rst, write_strobe, port_id_pB, out_port_pB) begin if rst = '1' then leds