Professional Documents
Culture Documents
Benem
ritaU
UniverssidadA
Autno
omade
ePueblla
F
Facultad
ddeCieenciasd
delaEllectrn
nica
T
Tesinapar
raelgrado
odeLicen
nciaturaeenElectr
nica:
Implem
mentacinenH
Hardwa
aredel
E
Estnda
ardeEn
ncriptaccinAva
anzado
(A
AES),en
nunap
plataforrmaFPG
GA,
u
utilizand
doelMicrocon
ntrolado
or
P
PicoBlaz
ze
esista:JuanFernand
doPialMo
octezuma
Te
A
Asesorinte
rno:MCRicardolvaarezGonzlez.FCEB
BUAP
A
Asesorexte
erno:MCA
AlbaMaribelSnchezzGlvez.FFCCBUAP
H.Pueblade
eZ.Abrilde
e2008
Agradecimientos
Pormediodeestetrabajodeinvestigacinseestudianlascaractersticasquesustentanal
Algoritmo de Encriptacin Avanzado (AES), y la manera de realizar la sntesis de dicho
algoritmoparasuimplementacinenunArreglodeCompuertasProgramableenCampo
(FPGA) al utilizar una de las herramientas de procesamiento embebido del fabricante
Xilinx.
Resumen
Pormediodeestetrabajodeinvestigacinseestudianlascaractersticasquesustentanal
Algoritmo de Encriptacin Avanzado (AES), y la manera de realizar la sntesis de dicho
algoritmoparasuimplementacinenunArreglodeCompuertasProgramableenCampo
(FPGA) al utilizar una de las herramientas de procesamiento embebido del fabricante
Xilinx.
II
ContenidoGeneral
Introduccin.............VIII
Planteamientodelproblema.............VIII
Metasyobjetivos......VIII
Justificacin.IX
CaptuloI.
MARCOHISTRICO......1
1.1 Criptografaenlahistoria........1
1.2 Criptografaclsica........1
1.2.1
LaEscitala(sigloVa.C).......2
1.2.2
CifradodeCsar(sigloIa.C).2
1.2.3
CifradordePolybius(sigloIIa.C)3
1.3 Criptografamoderna........3
1.3.1
DiscodeAlberti.....3
1.3.2
CilindrodeJefferson......4
1.3.3
DiscodeWheatstone.......5
1.3.4
ElsigloXXylaSegundaGuerraMundial..5
1.4 LaCriptografaenlaeradelaInformacin....7
1.5
QuesunFPGA?....8
1.5.1
1.6
HistoriadelosFPGA...9
ElalgoritmoAES.....10
1.6.1
EvaluacindeAES....11
CaptuloII.
MARCOTERICO.......13
2.1
Notacinyconvenciones.......13
2.1.1
Byte....13
2.1.2
ArreglosdeBytes......14
2.1.3
ElState.....15
III
2.1.4
2.2
2.3
ElStatecomounarreglodecolumnas...15
IntroduccinalaMatemtica........16
2.2.1
Grupos,AnillosyCampos....16
2.2.2
Grupos...16
2.2.3
Anillos....17
2.2.4
Campos....17
2.2.5
CamposFinitosdelaformaGF(28)......18
2.2.6
Suma...18
2.2.7
Multiplicacin.....19
2.2.8
Multiplicacinporx....20
2.2.9
PolinomiosconcoeficientesenGF(28)......21
DescripcindelAlgoritmoAES........23
2.3.1
EtapaSubBytes...23
2.3.2
EtapaShiftRows.....24
2.3.3
EtapaMixColumns...24
2.3.4
EtapaAddRoundKey....27
CaptuloIII. DISEODELSISTEMA......29
3.1
DescripcindelaplataformadedesarrollodeHardware.......29
3.2
DescripcindelaplataformadedesarrollodeSoftware......30
3.3
Diagramaconceptualdelsistema.....30
3.4
Metodologa.....31
3.5
PorquutilizarunmicrocontroladorenunFPGA?..31
3.6
CaractersticasdelmicrocontroladorPicoBlaze..32
3.6.1
3.7
pBlazeIDE,softwarededesarrolloenensambladorparaPicoBlaze.33
ImplementacindelSistema..34
3.7.1
3.7.2
GestindeEntrada/SalidadedatosalSistema......................35
3.7.1.1
ComunicacinSerial............................35
3.7.1.2
ComunicacinmedianteuntecladoPS/236
GestindelaLCD......................38
IV
3.7.3
3.8
3.9
Encriptacindedatos.......................41
3.7.3.1
ImplementacinparaAddRoundKey..............................42
3.7.3.2
ImplementacinparaSubBytes..43
3.7.3.3
ImplementacinparaShiftRows.45
3.7.3.4
ImplementacinparaMixColumns46
ArquitecturadelSistema...48
3.8.1
MicrocontroladorPicoBlaze.......................49
3.8.2
MemoriadeprogramaparaelmicrocontroladorPicoBlaze.49
3.8.3
Interface49
DiseodelprogramaparaelintercambiodedatosPCFPGAatravsdeMatLab50
CaptuloIV. ANLISISDERESULTADOS.......51
4.1
Resultadosdelaimplementacindelsistema........53
4.1.1
rea....53
4.1.2
Throughput....54
4.1.3
ComparacinconotrasArquitecturas....54
CaptuloV.
CONCLUSIONES.......56
5.1
Resumendelosresultadosobtenidos........56
5.2
Conclusionesdeltrabajorealizado.........56
5.3
Trabajofuturo........57
Apndices............58
ApndiceA.
TrminosyAcrnimos..58
ApndiceB.
CdigoenensambladorparaelmicrocontroladorPicoBlaze.59
ApndiceC.
CdigoenVHDLparalaentidadinterface.77
ApndiceD.
CdigoMparaelintercambiodedatosPCFPGAatravsde
MatLab..83
Listadodereferencias..........66
ContenidodeFiguras
Figura1.
Figura2.
Figura3.
Figura4.
Figura5.
Figura6.
Figura7.
Figura8.
Figura9.
Figura10.
Figura11.
Figura12.
Figura13.
Figura14.
Figura15.
Figura16.
Figura17.
Figura18.
Figura19.
Figura20.
Figura21.
Figura22.
Figura23.
Figura24.
Figura25.
Figura26.
Figura27.
Figura28.
Figura29.
Figura30.
Figura31.
Figura32.
Figura33.
Figura34.
Figura35.
LaEscitala..........2
AlfabetodecifradodeCsar......2
EjescoordenadosparaelcifradordePolybius......3
DiscodeAlberti........................................4
CilindrodeJefferson..............................5
DiscodeWheatstone.............................................5
Enigma.............................................6
FPGAXilinxSPARTAN3............................................8
Dr.VincentRijmenyDr.JoanDaemen......................10
RepresentacinHexadecimaldelospatronesdenibbles.............................................14
ndicesparaBytesybits...............................................14
EntradasysalidasparaelarregloState...........15
EtapaSubBytes...23
EtapaShiftRows.............................................24
EtapaMixColumns...............................................27
EtapaAddRoundKey............................................28
TarjetadedesarrolloSPARTAN3E.29
Diagramaconceptualdelsistema....30
ArquitecturadelmicrocontroladorPicoBlaze.33
SoftwarepBlazeIDEdeldesarrolladorMediatronix..33
ProgramaqueejecutaelmicrocontroladorPicoBlaze..34
PuertosSerialesRS232delatarjetaSPARTAN3EStarterKit..35
Comportamientodelsistemaenlacomunicacindedatosserial..36
ConectorPS/2delatarjetaSPARTAN3EStarterKit...36
FormasdeondaydiagramadetiemposparalacomunicacinPS/237
Scancodesparacadaunadelasteclas.37
DiagramadeflujoparalasrutinasdelaLCD.38
ProtocolodecomunicacindelaLCD.39
Secuenciadelmendeusuariodelsistemacriptogrfico...40
DiagramadeflujoparaelalgoritmodeencriptacinAES41
DiagramadeflujoparaimplementarAddRoundKey42
SboxempleadaparalaejecucindeAES..43
DiagramadeflujoparaimplementarSubBytes...44
DiagramadeflujoparaimplementarShiftRows.45
DiagramadeflujoparaimplementarMixColumns46
VI
Figura36. SubrutinaparalamultiplicacindematricesenGF(28).47
Figura37. Diagramaesquemticodelaarquitecturadelsistema..48
Figura38. DiagramadeflujoparaelCdigoMdeMatLab...50
Figura39. EjemploparaAESsegnFIPSPUB197..51
Figura40. DatosenviadosyrecibidosatravsdeMatLabhaciaelFPGA........51
Figura41. ResultadosdesplegadosenlaLCDdelatarjetadedesarrollo........52
Figura42. Vistadelosrecursosutilizadosporeldiseo.53
Figura43. Reportedelmapeodeldiseo..54
Figura44. ComparacindedesempeoentrearquitecturasdecifradoAES128....55
VII
Introduccin
Planteamiento del problema
La criptografa es tan antigua como la historia de la humanidad, debido a que siempre ha existido la necesidad
de poder enviar y recibir informacin sin que esta sea interceptada o modificada en su trayecto. As, el
principio bsico de la criptografa, es mantener la privacidad en la comunicacin entre dos personas alterando
el mensaje original de modo que sea incomprensible a toda persona distinta del los destinatarios.
Debido a esta necesidad, a travs 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
criptogrfico del que se tiene registro, (siglo V a.C.), hasta sofisticados sistemas que aprovechan la teora
desarrollada a travs del tiempo.
Los sistemas criptogrficos actuales surgen en base a las necesidades contemporneas, ya que en este
momento la humanidad transmite grandes cantidades de informacin, la cual en su mayora son enviadas
recibidas por dispositivos que manipulan seales discretas ( digitales), como son telfonos celulares, medios
de almacenamiento (pticos, magnticos, tarjetas de memoria), computadoras que se interconectan entre s
(Internet Intranet), etc. Mucha de esta informacin requiere de gran confidencialidad debido a que se
transmiten datos sensibles como: contraseas, nmeros de tarjetas de crdito, informacin cientfica, militar,
etc. As surgen los sistemas criptogrficos modernos, basados en plataformas electrnicas digitales.
Metas y Objetivos
En base al contexto descrito anteriormente, el Objetivo General de este trabajo es implementar en hardware
el Algoritmo de Encriptacin Avanzada (AES) en un Arreglo de Compuertas Programable en Campo (FPGA).
As el Objetivo Especfico del trabajo es utilizar el algoritmo AES, tambin conocido como Rijndael, en un
FPGA del fabricante Xilinx, utilizando el microcontrolador PicoBlaze. Este algoritmo criptogrfico es
reconocido como el estndar actualmente en la mayor parte del mundo.
Adems la plataforma FPGA ha tenido un gran auge en los ltimos aos, debido a su amplio rango de
aplicaciones que incluyen a los DSP (Procesadores Digitales de Seales), radio definido por software,
sistemas aeroespaciales y de defensa, prototipos de ASIC (Circuito Integrado de Aplicacin Especfica),
sistemas de imgenes para medicina, sistemas de visin, reconocimiento de voz, Bioinformtica, emulacin
de Hardware de computadora, etc.
VIII
Introduccin
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 perifricos 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.
Justificacin
En base a este trabajo se pretende manejar el ms nuevo estndar en el rea de criptografa informtica;
adems de utilizar una de las plataformas digitales que ms auge ha tenido en los ltimos aos debido a su
flexibilidad de aplicacin y reconfiguracin, adems del gran desempeo que presentan.
Utilizando estas herramientas, se intenta proveer un instrumento para seguridad informtica, que presente un
desempeo aceptable respecto a un ASIC (Circuito Integrado de Aplicacin Especfica), y un desempeo
notable en comparacin con Procesadores de Propsito General. Con la respectiva ventaja de utilizar un
FPGA en lugar de un ASIC que es el bajo coste de la lgica reconfigurable.
La viabilidad de este proyecto para su realizacin no es un obstculo, 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
investigacin. Para sustentar la investigacin con argumentos bibliogrficos se utiliza la publicacin oficial
del algoritmo AES, adems de contar con texto especializado en el tema que apoya la investigacin y los
resultados.
El algoritmo AES se sustenta en dos teoras matemticas, por una parte la llamada Teora de Campos Finitos
especficamente Campos de Galois; y por otro lado utiliza tambin Aritmtica Modular.
Por desgracia, este tipo de Fundamentos Matemticos no son impartidos en la Licenciatura, por lo que es uno
de los principales obstculos que habrn de resolverse. Sin embargo, gracias al asesor externo de este trabajo
de investigacin, el cual, su rea de especialidad abarca este tipo de Fundamentos, este inconveniente puede
ser solventado.
IX
Ca
aptuloI
M
MarcoHist
rico
A contiinuacin se mu
uestran algunoss mecanismos criptogrficos relevantes, quue se han utilizaado a travs dee la
historiaa:
1.2.1
La Escitala
E
(sigllo V a.C)
Ell primer caso conocido del uso de mtoddos criptogrficcos se dio durrante la guerraa entre Atenass y
Essparta, por parrte de los lacedemonios. Ell cifrado se basaba
b
en la alteracin
a
del mensaje origiinal
mediante la incllusin de smbbolos innecesaarios en ste, que desapareccan al enrollarrlo en un rodiillo
a, de longitud y grosor prefijaados.
llaamado escitala
An sabiendo laa tcnica utilizzada, si no se tenan las dim
mensiones exaactas de la esccitala, un posible
intterceptor del mensaje
m
tena un
u complicado criptoanlisis.
Figura 1. La Escitala.
1.2.2
Cifra
ado de Csarr (siglo I a.C
C)
Figura 2. Alfa
fabeto de cifrado de
d Csar.
Teexto cifrado: Wx
W wdoelhp Euuxwxv?
M
Mensaje
originall: T tambin Brutus?
B
MarcoHistrico
CaptuloI
1.2.3
Es el cifrador por substitucin ms antiguo que se conoce. El mtodo se basaba en una tabla secreta, en
cuyos ejes se ponan diferentes combinaciones de letras o nmeros y dentro de la tabla las letras del
alfabeto. Cada letra del mensaje a cifrar era substituida por sus coordenadas:
i/j
Disco de Alberti
En 1465, Len Battista Alberti, msico, pintor, escritor y arquitecto, concibi el primer sistema
polialfabtico que se conoce, que emplea varios abecedarios, utilizando uno u otro, cada tres o cuatro
palabras. El emisor y el destinatario haban de ponerse de acuerdo para fijar la posicin relativa de los
crculos concntricos, 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, ms los nmeros del 1 al 4.
Este disco define 24 posibles sustituciones dependiendo de la posicin 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
Ca
aptuloI
M
MarcoHist
rico
coorrespondiente (prefijado por los comunicanntes) cada x paalabras, habienndo sido x tambbin prefijada por
p
los comunicantes.
Otro dee los criptgraafos ms importantes del sigglo XVI fue ell francs Blaisse de Vigeneree que escribi un
importaante tratado sob
bre la "escriturra secreta" y quue dise un ciifrado que ha llegado
l
a nuesttros das asociaada
a su noombre. A Selenus se le debee la obra cripttogrfica "Crypptomenytices et
e Cryptographhiae" (Lnebuurg,
1624). Durante
D
los sig
glos XVII, XVIII y XIX, el innters de los monarcas
m
por la criptografa fuue notable.
Las hueestes de Felipee II utilizaron durante
d
muchoo tiempo una cifra
c
con un alffabeto de ms de 500 smboolos
que los matemticos del
d rey consideeraban inexpuggnable.
o francs Franois Viete connsigui criptoannalizar aquel sistema para el rey de Franciaa, a
Cuandoo el matemtico
la saznn Enrique IV, el
e conocimientto mostrado poor el rey francs impuls unaa queja de la coorte espaola ante
a
del pappa Po V acusaando a Enriquee IV de utilizaar magia negraa para vencer a sus ejrcitos. Por su parte,, la
reina Mara
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 criptoanlisis exitosoo por parte de los matemticoos de Isabel.
1.3.2
Cilin
ndro de Jeffe
ferson
Esste dispositivo fue inventado por el famosoo Thomas Jeffeerson (1743-18826), redactor de la declaraciin
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 lnea que
q ser el mennsaje cifrado. Tras haber siido
ennviado, el receeptor solamentte tiene que pooner las letras recibidas en lnea y buscarr en otra lneaa el
mensaje en claro
o.
Ca
aptuloI
M
MarcoHist
rico
1.3.3
Disco
o de Wheatsstone
Ell disco de Wheeatstone (18022-1875) realizaa una sustitucin polialfabtiica, muy pareccida a la utilizaada
poor Alberti. El in
nvento consta de dos discos concntricos:
c
e el exterior se
en
s escriben, en orden alfabtiico,
lass 26 letras del alfabeto inglss ms 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 pequeo da una vueelta ms 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
1.3.4
El sig
glo XX y la Segunda Gu
uerra Munddial
Ca
aptuloI
M
MarcoHist
rico
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 razn? Quueran seguir sacndole
s
partiido
dos de los secretos mejor
g
potenciaando su uso enn diversos passes, que, al instalarla, hacan transparentes sus secretos para
tras la guerra
las poteencias anglosajonas.
Tras laa conclusin de la Segunda Guerra Munddial, la criptoggrafa tiene un desarrollo terico importannte;
siendo Claude Shann
non y sus invvestigaciones sobre
s
teora de
d la informaccin esencialess hitos en diccho
l avances enn computacinn automtica suuponen tanto una
u amenaza para
p
los sistem
mas
desarrollo. Adems, los
o
paara el desarrolloo de nuevos sisstemas.
existenttes como una oportunidad
CaptuloI
MarcoHistrico
Ca
aptuloI
M
MarcoHist
rico
1.5 Qu es un FPGA?
Un FPG
GA (field progrrammable gatee array) es un dispositivo
d
sem
miconductor diigital que contiiene componenntes
lgicos programables e interconeexiones tambin programabbles entre elloos. Los compponentes lgiccos
program
mables pueden
n ser programaados para dupliicar la funcionnalidad de puertas lgicas bsicas tales com
mo
AND, OR,
O XOR, NO
OT funcioness combinacionales ms compplejas tales coomo decodificaadores simpples
funcionnes matemticaas. En muchos FPGA,
F
estos componentes
c
lgicos program
mables (o bloquues lgicos, seggn
el lenguuaje comnmente usado) tam
mbin incluyenn elementos de memoria, los cuales puedenn ser simples flipfl
flops bloques de meemoria ms com
mplejos.
i
Una jeerarqua de interconexione
s programables permite a los bloquess lgicos de un FPGA, ser
interconnectados segn
n la necesidad del diseador del sistema, algo
a
parecido a un tablero prrogramable. Esstos
bloquess lgicos e in
nterconexiones pueden ser programados
p
d
despus
del proceso de maanufactura porr el
usuario/diseador, as que el FPGA
GA puede desem
mpear cualquuier funcin lgica 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 FPGAs dee alto desempeeo se incluyenn dichas funcioones con unidaddes
de clcuulo con punto flotante.
f
La recconfigurabilidaad de los FPGA
A radica en quee una parte dell diseo puede ser
reprogrramada mientraas el resto conttina funcionanndo, esto es el principio de laa computacinn reconfigurable o
sistemaas reconfigurab
bles. Los FPGA son geneeralmente ms lentos que sus
s contraparttes, los circuiitos
integraddos de aplicaciiones especficas (ASIC), no pueden
p
soportaar diseos muyy complejos enn los modelos ms
m
bsicos, y consumen ms energa. Sin
S embargo, tienen
t
muchass ventajas taless como la reduuccin del tiem
mpo
para la salida al merrcado de prodductos, la habiilidad para serr reprogramaddos despus dee haber salidoo al
mo investigacin,
mercaddo a fin de corrregir posibless errores, y redduccin los coostos de ingenniera tales com
diseo y prueba de un
n nuevo produccto. Los vendedores pueden proporcionar
p
v
versiones
de FP
PGA, ms baraatos
y menoos flexibles, las cuales no pueden ser modifiicados despus de que el diseeo haya sido im
mplementado.
Figura 8. FP
PGA Xilinx Sparttan-3.
CaptuloI
1.5.1
MarcoHistrico
Ross Freeman, cofundador de Xilinx, invent el arreglo matricial de compuertas. La raz histrica de las
FPGA son los Dispositivos de lgica programable compleja (CPLD) de mediados de 1980. CPLD y
FPGA incluyen un relativo gran nmero de elementos lgicos programables.
El rango de densidad de los CPLD va desde miles hasta decenas de miles de compuertas lgicas,
mientras que el de los FPGA va tpicamente desde decenas de miles hasta varios millones. La diferencia
primaria entre CPLDs y FPGAs son sus arquitecturas. Un CPLD tiene una estructura restringida,
consistiendo la unin de uno o ms arreglos lgicos que alimentan a un nmero pequeo de registros con
entrada de reloj.
El resultado de estos es menos flexibilidad, con la ventaja de una mejor prediccin de los tiempos de
retraso. Las arquitecturas de los FPGAs, por otro lado, son dominadas por las interconexiones. Esto los
hace ms flexibles (en trminos del rango de diseos prcticos para los cuales pueden ser usados) pero
tambin es posible ir un poco ms lejos en el diseo. Otra diferencia notable entre CPLDs y FPGAs es
la presencia de funciones de ms alto nivel (tales como sumadores y multiplicadores) dentro de los
FPGAs, adems de memorias. Una diferencia importante es que muchos FPGAs modernos, soportan
una total o parcial reconfiguracin del sistema, permitiendo que una parte del diseo sea reprogramada
mientras las otras partes siguen funcionando. Una tendencia reciente ha sido llevar la arquitectura un
paso ms lejos, combinado los bloques lgicos e interconexiones de los tradicionales FPGAs, con
microprocesadores y con perifricos relacionados para formar un completo Sistema programable en un
chip.
Ejemplo de estas tecnologas hibridas pueden ser encontradas en los FPGA Xilinx Virtex, los cuales
incluyen uno o ms procesadores PowerPC embebidos junto con la lgica FPGA. El Atmel FPSLIC
es otro dispositivo como tal, el cual usa un procesador AVR en combinacin con la arquitectura lgica
programable de Atmel.
Otra alternativa es hacer uso de ncleos de procesadores, los cuales son implementados junto con la
lgica FPGA. Esos ncleos 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 metodologa.
CaptuloI
MarcoHistrico
Figura 9. Dr. Vincent Rijmen y Dr. Joan Daemen, creadores del algoritmo Rijndael, que fue adoptado como AES.
10
CaptuloI
1.6.1
MarcoHistrico
Evaluacin de AES
Vale la pena examinar el criterio utilizado por NIST para evaluar a los candidatos potenciales. Existieron
tres categoras para el criterio de seleccin:
Seguridad: se refiere al esfuerzo requerido para criptoanalizar un algoritmo. El nfasis en la
evaluacin fue en la practicidad del ataque. Debido a que el tamao mnimo para la llave en
AES es de 128-bits, los ataques de fuerza bruta con tecnologa actual y prevista no necesitan ser
considerados.
Costo: NIST intent en AES ser prctico en un amplio rango de aplicaciones. Por lo tanto AES
deba de poseer una alta eficiencia computacional, para as poder ser usado en aplicaciones de
alta velocidad, y en conexiones de banda ancha.
Caractersticas e implementacin del algoritmo: Esta categora incluye una variedad de
consideraciones, como flexibilidad, e idoneidad para una gran variedad de implementaciones en
software y en hardware, lo que hara un anlisis de seguridad ms 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 evaluacin 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 anlisis de
seguridad pblica, dirigido por la comunidad criptogrfica. Durante el curso de tres aos del
proceso de evaluacin, un gran nmero de criptgrafos publicaron sus anlisis de las fortalezas
y debilidades de los distintos candidatos. Existi un nfasis particular en analizar a los
candidatos con respecto a ataques conocidos, como criptoanlisis diferencial y particular. Sin
embargo, comparado a los anlisis de DES, la carga de tiempo y el nmero de criptgrafos
dedicados a analizar Rijndael fueron eventualmente limitados. Ahora que se ha elegido un solo
cifrado AES, se puede esperar a ver un anlisis de seguridad mucho ms extenso por parte de la
comunidad criptogrfica
Implementaciones en Software: las principales preocupaciones en esta categora fueron
velocidad de ejecucin, desempeo en distintas plataformas, y velocidad en funcin de la
variacin de la llave.
Ambientes con espacio restringido: en algunas aplicaciones, como en smart-cards, reas
relativamente pequeas de memoria RAM y/o memoria ROM, representacin de objetos de
datos como S-boxes las cuales pueden almacenarse en memoria ROM RAM, dependiendo si
existe precmputo si se utilizan representaciones Booleanas y almacenamiento de la subllave.
11
CaptuloI
MarcoHistrico
12
Notacin 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 nmero 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
tamaos para la entrada, salida y llave de cifrado en este estndar.
Los bits dentro de tales secuencias se numeran empezando en cero, y terminando en uno menos la longitud de
la secuencia de bits. El nmero 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 tamao del bloque y el tamao de la llave.
2.1.1
Byte
Secuencia de ocho bits tratada como una entidad simple y unidad bsica 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:
Tamao de la llave = 128 bits, 0 n < 16 ,
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
aptuloII
M
MarcoTer
rico
Poor ejemplo, {0
01100011} ideentifica al elem
mento especfiico de un cam
mpo finito: x6 + x5 + x + 1 . Es
coonveniente tam
mbin denotar a los valores deel byte utilizanndo una notacin 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:
2.1.2
Arreg
glos de Bytees
enntrada0entrada
a1entrada2 ...entrrada126entradaa127 , de la siguieente manera:
n +7
}.
Enn la tabla siguiente se muestraa como se ordeenan los ndicees para bytes y bits:
14
Ca
aptuloII
2.1.3
M
MarcoTer
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
mao del bloqu
ue dividido enttre 32.
Enn el arreglo Sta
ate (denotado por
p el smboloo S), cada byte individual posee dos ndices, con su nmeero
dee fila r dentro del
d rango 0 r < 4, y su nm
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 estndar, 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:
d
se dirigen
d
entonces, al arreglo State,
S
despus 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
15
CaptuloII
MarcoTerico
2.2.1
Grupos, anillos y campos son los elementos fundamentales de una rama de las matemticas conocida
como lgebra abstracta lgebra moderna. El lgebra abstracta, se interesa con conjuntos en los cuales
sus elementos puedan ser operables algebricamente, 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 especficas, las cuales definen la naturaleza del conjunto. Por convencin, la
notacin para las dos clases principales de operaciones en el conjunto de elementos es usualmente la
misma para la suma y multiplicacin de los nmeros ordinarios. Sin embargo, es importante notar que en
lgebra abstracta no se est limitado a las operaciones aritmticas ordinarias
2.2.2
Grupos
Un grupo G, algunas veces denotado por {G , i} , es un conjunto de elementos con una operacin binaria
expresada por (elemento genrico que puede referirse a suma, multiplicacin o alguna otra operacin
matemtica), 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)
(A2)
(A3)
(A4)
16
CaptuloII
MarcoTerico
Si un grupo tiene un nmero finito de elementos, se refiere a l como un grupo finito, y el orden del
grupo es igual al nmero de elementos en el grupo. De otra forma, el grupo es un grupo infinito.
Un grupo es llamado abeliano si satisface la siguiente condicin adicional:
(A5)
2.2.3
Anillos
Un anillo R, algunas veces expresado por { R , + , } , es un conjunto de elementos con dos operaciones
binarias, llamadas suma y multiplicacin, 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.
2.2.4
Campos
Un campo F, algunas veces denotado por { F , + , } , es un conjunto de elementos con dos operaciones
binarias llamadas suma y multiplicacin en las cuales para toda a, b y c en F, los siguientes axiomas se
cumplen:
(A1-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 divisin es definida con la regla siguiente: a/b = a(b-1).
17
CaptuloII
2.2.5
MarcoTerico
Los campos infinitos no son de inters particular en el contexto de la criptografa, Sin embargo, los
campos finitos juegan un rol crucial en los algoritmos criptogrficos. Puede mostrarse que el orden de un
campo finito (nmero de elementos del campo) debe ser una potencia de un nmero primo pn, donde n
es un entero positivo, sabiendo que un nmero 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 matemtico que estudi a los campos finitos. Existen dos casos especiales que son
interesantes para propsitos criptogrficos: 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 caracterstica 0, contiene a los racionales y es por lo tanto infinito,
todos los campos finitos tienen caracterstica prima, y por lo tanto su tamao 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 caracterstica prima es finito. Para un primo p los enteros mdulo 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] / <f(t)>, donde
Fp[X] denota el anillo de todos los polinomios con coeficientes en Fp, <f(X)> 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 operacin
lgica (expresada por ), por ejemplo para el modulo 2 tenemos que 11 = 0, 10 = 1, y 00 = 0.
En consecuencia, la substraccin de polinomios es idntica 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
{b7b6b5b4b3b2b1b0 } ,
la suma es
18
CaptuloII
MarcoTerico
Por ejemplo, las expresiones siguientes son equivalentes una con otra:
Notacin polinomial:
( x6 + x4 + x2 + x + 1) + ( x7 + x +1) = x7 + x6 + x4 + x2 .
2.2.7
Multiplicacin
(x
Y:
extendido, se computan dos polinomios a(x) y c(x) tales b(x) a(x) + m(x) c(x) = 1.
Adems, 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
MarcoTerico
CaptuloII
Entonces se dice que el arreglo de 256 posibles valores del byte, con la operacin lgica XOR usada en
la suma y la multiplicacin acabada de definir, tiene la estructura de un campo finito GF(28).
2.2.8
Multiplicacin por x
b x
i =0
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
reduccin se acompaa substrayendo (XOR) el polinomio m(x). Entonces podemos decir que la
multiplicacin por x, (por ejemplo {00000010} {02}) se puede implementar a nivel de bytes como
un corrimiento a la izquierda y una subsiguiente operacin lgica XOR con {1b}. Esta operacin en
bytes se denota como xtime(). La multiplicacin de potencias mayores a x puede ser implementada al
repetir la operacin xtime().
Para agregar ms recursos, la multiplicacin por cualquier constante puede tambin 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},
Adems:
{57} {13} = {57} ({01} {02} {10})
= {57} {ae} {07}
= {fe}.
20
CaptuloII
2.2.9
MarcoTerico
Los polinomios de cuatro trminos, 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 sern 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 definicin de campo finito. An 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; adems la multiplicacin de
polinomios de cuatro trminos, utiliza un polinomio diferente de reduccin, definido a continuacin. As
que debe de existir siempre una distincin que nos indique en qu contexto se est trabajando.
Para ilustrar la suma y multiplicacin de estos campos definamos un segundo polinomio de cuatro
trminos: 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 operacin lgica XOR entre los bytes correspondientes en cada una de las palabras,
expresado de otra manera la ejecucin de la operacin XOR de los valores completos de la palabra.
As usando los polinomios de cuatro trminos anteriores tenemos:
c( x) = c6 x6 + c5 x5 + c4 x4 + c3 x3 + c2 x2 + c1 x1 + c0 , donde:
c0 = a0 ib0
c1 = a1 ib0 a0 ib1
c5 = a3 ib2 a1 ib3
c6 = a3 ib3
21
CaptuloII
MarcoTerico
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
trminos d(x), definido como: d ( x ) = d 3 x 3 + d 2 x 2 + d 1 x + d 0 por:
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
22
Ca
aptuloII
2.3
M
MarcoTer
rico
2.3.1
Etap
pa SubBytes
Figura 13. En la fase SubbBytes, cada Byte del State es reempplazado segn unaa tabla de bsquedda.
23
Ca
aptuloII
2.3.2
M
MarcoTer
rico
Etap
pa ShiftRowss
Figura 14. En
E la fase ShiftRoows, cclicamente se
s cambian las filaas en el State.
2.3.3
Etap
pa MixColum
mns
Laa transforma
acin 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 funcin de toddos
c
los cuatro bytes que se encuenttran en dicha columna.
24
CaptuloII
MarcoTerico
La transformacin puede ser definida por la siguiente multiplicacin 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 cdigo lineal con una distancia mxima entre palabras de cdigo, 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 multiplicacin son llevadas a cabo en GF(28). La transformacin MixColumns
en una sola columna j(0 j 3) del State puede expresarse como:
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 operacin XOR. Para la multiplicacin 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 operacin XOR con (0001 1011) si el bit ms significativo del valor original es 1.
25
CaptuloII
MarcoTerico
{ 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}
(0001
1011) = (0001
Para modelos de cifrado CFB (cipher block feedback) y OFB (output feedback mode), solo se
utiliza encriptacin.
2.
Como cualquier bloque de cifrado, AES puede ser utilizado para construir un cdigo de
autenticacin de mensaje MAC, en el cual solamente se requiere encriptacin.
26
Ca
aptuloII
M
MarcoTer
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
macin adicin
n de llave de ronda, llamadda AddRoundK
Key, los 128-bbits del State son
s
prrocesados mateemticamente bit a bit mediiante una operracin XOR con
c los 128-biits de la llave de
roonda. La operaacin puede serr vista como una
u operacin entre columnaas, tomando loos 4-bytes de una
u
coolumna del Sta
ate y una palabbra de la llave de ronda, y taambin puede ser
s vista comoo una operacinn 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
27
Ca
aptuloII
M
MarcoTer
rico
) .
Figura 16. En la ettapa AddRoundKey
ey, cada byte del Sttate se combina coon un byte de la suubclave usando la operacin XOR (
28
F
Figura
17. Tarjetaa de desarrollo SPA
ARTAN-3E.
29
CapttuloIII
DisseodelSisstema
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 diseo, ya quue el diseadorr 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 cddigo HDL. Siintetizar, simuular
i
implementar,
enrutar
e
y aconddicionar diseoos. Adems de descargar el diiseo para proggramar al FPG
GA.
M
Microcontrola
ador PicoBlazze. Procesadoor en software que se implem
menta en FPGA
As 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 perifricoos. Esta herram
mienta es fundaamental en estte trabajo, ya que
q
l controladorres para los disspositivos I/O, y el algoritmoo de encriptacin AES se desaarrollaron en baase
los
a este.
S
System
Geneerator. Softw
ware que perm
mite crear y verificar diseos para FPG
GAs de Xilinnx.
F
Funciona
en co
onjunto con Sim
mulink de MaatLab, permittiendo trabajar con bloques enn un alto nivell de
a
abstraccin.
Se pueden desaarrollar ncleoos DSP para su
s implementaacin en un FPGA,
F
generanndo
a
automticamen
nte el cdigo enn VHDL a parttir de su modellado en Simulinnk.
3.3 Diagrama
D
conceptuaal del sisteema
El diseo del sistema se realiz en funcin
fu
del siguuiente diagram
ma conceptual:
Ingreso de
d datos
Salida de dattos
Salida de dattos
Cifr
frado de Datos
Ingreso de
d datos
30
CaptuloIII
DiseodelSistema
Como se observa en la figura anterior, el sistema criptogrfico es capaz de ingresar los datos a encriptar de
dos maneras distintas: va comunicacin 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 recuperacin de los datos encriptados se pueden
mostrar en LCD de la tarjeta de desarrollo y tambin pueden recuperarse mediante comunicacin serial y el
puerto DB-9. Para la eleccin de la gestin 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 ms le convenga.
3.4 Metodologa
El sistema se encarga de ejecutar 4 tareas principales:
Gestionar el men de eleccin del usuario para el ingreso de datos.
Ingresar los datos al sistema para su encriptacin.
Encriptar los datos utilizando el algoritmo AES-128.
Encargarse de regresar los datos encriptados va serial y desplegarlos en la LCD.
31
CaptuloIII
DiseodelSistema
32
CapttuloIII
DisseodelSisstema
3
3.6.1
pBllazeIDE, software
s
de desarrollo
d
en
n ensambladdor para PiccoBlaze
D
Despus
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 adems de permitir
p
escribbir y compilaar el cdigo 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
investigacin.
33
CaptuloIII
DiseodelSistema
Desplegar mensaje de
bienvenida en la LCD
Limpiar la
memoria SPM del
El usuario an
no ha elegido
una gestin
Esperar eleccin de
gestin del usuario
(leer switches)
No
Detectar el bit de
inicio en la lnea de
Rx del puerto RS-232
No
Comunicacin
Serial
Comunicacin
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 lnea de
reloj del puerto PS2
No
S
S
Subrutina de
retardo de 4.3s
Detectar un nivel
bajo en la lnea de
reloj en PS2
Cifrado
Examinar si han
ingresado 8-bits
al sistema
Detectar un flanco
de subida en la
lnea de reloj en
Escanear la lnea Rx de
RS-232 y realizar un
registro de corrimiento a
la izquierda en el registro
de recepcin con un 0
un 1 segn lo detectado
Subrutina de
retardo de 8.3s
PicoBlaze
Subrutina de
retardo de 8.3s
Detectar el bit de
parada en la lnea de
Rx del puerto RS-232
No
No
No
S
No
Examinar si han
ingresado 8-bits
al sistema
S
Detectar el bit de
parada en la lnea de
reloj del puerto PS2
No
S
Decodificar el
Scan-Key recibido
y traducirlo a
cdigo ASCII
Almacenar en la
memoria SPM del
PicoBlaze
Almacenar en la
memoria SPM del
PicoBlaze
34
Desplegar el carcter
ingresado, en la LCD de
la tarjeta de desarrollo
No
CapttuloIII
3.7.1
DisseodelSisstema
Gestiin de Entraada/Salida de
d datos al Sistema
S
3.7.1.1
Comuniccacin Serial
Figura 22
2. Puertos Serialess RS-232 montadoos en la tarjeta de desarrollo
d
SPART
TAN-3E Starter-K
Kit.
35
CapttuloIII
DisseodelSisstema
p
un bit de inicio que satisfaga
s
el Tieempo de Smboolo,
Para la transmisin a laa PC se enva primero
despus se
s toma el byyte a enviar, bit por bit cadaa 8.68s empeezando por el LSB (bit mennos
significattivo), despus realizar
r
un despplazamiento y transmisin dee cada uno de los
l bits del bytte a
enviar, y finalizar ponieendo la lnea Tx
T en alto paraa indicar un bitt de paro. De nueva
n
cuenta esta
e
d microcontroolador PicoBlaaze.
tarea se reealiza dentro del
3.7.1.2
36
CapttuloIII
DisseodelSisstema
Figura 25.
2 Formas de ondda y diagrama de tiempos
t
para la coomunicacin PS/2..
El sistem
ma, de la mismaa manera que loo hace con la comunicacin
c
s
serial,
gestionaa la comunicaciin
con el tecclado por meddio del microcoontrolador PicooBlaze, con el
e fin de ahorrrar recursos enn el
diseo, lo
o que se hace es esperar un flanco de bajaada en la lneaa de reloj, com
mprobar un bit de
inicio con
n un 0 lgicoo en la lnea 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 cdigo ASC
CII,
por lo qu
ue se requiri la
l implementaccin de un deccodificador por hardware parra que el sistema
pueda enccriptar los datoos.
37
DiseodelSistema
CaptuloIII
3.7.2
Gestin de la LCD
A)
B)
Inicio
Iniciar
Esperar 20ms
Limpiar el bus de
datos de la LCD
Especificar a la lnea
LCD_RS de la LCD
que se desea enviar
un dato
Habilitar la operacin
de escritura
Esperar 5ms
Configurar la memoria
DDRAM, y al puntero de la
LCD con los parmetros:
Movimiento del cursor a la
derecha y autoincremento en
DDRAM Address
No
Enviar nibble
superior a
LCD_DAT
S
Enviar nibble
inferior a LCD DAT
Configurar a la pantalla de
la LCD con los parmetros:
Encender el display entero,
activar cursor, desactivar
posicin del cursor
Esperar 240ns
Deshabilitar las
operaciones de
Lectura/Escritura en la
LCD poniendo en bajo
LCD_E
Esperar 2ms
Deshabilitar la admisin
de datos a la LCD
poniendo en bajo la lnea
LCD_RW
Escribir mensajes de
bienvenida y mensajes
de men de usuario:
Esperar gestin
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 funcin de los
switches de la tarjeta
El usuario ha
indicado una nueva
rutina de encriptacin?
38
CapttuloIII
DisseodelSisstema
F
Figura
28. Protocoolo de comunicacin de la LCD.
39
CapttuloIII
40
DisseodelSisstema
CaptuloIII
3.7.3
DiseodelSistema
Encriptacin de datos
Tarea esencial del sistema, una vez que los datos se encuentran en el microcontrolador PicoBlaze, se
les aplica el algoritmo de encriptacin AES-128 para despus ponerlos a disposicin 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 aplicacin 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
matemticamente, dichos pasos se ejecutan a nivel de bytes, lo que lo hace ms 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
41
CaptuloIII
3.7.3.1
DiseodelSistema
En la etapa AddRoundKey, la subclave se combina con el State. En cada ronda se obtiene una subclave
de la clave principal, usando la iteracin de la clave; cada subclave es del mismo tamao del State. La
subclave se agrega combinando cada byte del State con el correspondiente byte de la subclave usando
la operacin lgica XOR.
Inicio
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 diseo del algoritmo empleado para la implementacin de la etapa AddRoundKey en el
microcontrolador PicoBlaze.
42
CapttuloIII
3
3.7.3.2
DisseodelSisstema
Im
mplementaciin 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 operracin provee la no linealidaad en el cifraddo. La S-box utilizada
u
provieene de la funciin
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 coombinacin dee la
f
funcin
inverssa con una trannsformacin affn invertible. La S-box tambbin se elije para
p
evitar punntos
e
estables
y tamb
bin 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,).
43
CaptuloIII
DiseodelSistema
Direccionar a la
memoria ROM externa
con el valor que se
encuentra en regstate
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 diseo del algoritmo empleado para la implementacin de la etapa SubBytes en el
microcontrolador PicoBlaze.
44
CaptuloIII
3.7.3.3
DiseodelSistema
El paso ShiftRows opera en las filas del State; rota de manera cclica los bytes en cada fila por un
determinado offset. En AES, la primera fila queda en la misma posicin. Cada byte de la segunda fila
es rotado una posicin 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 direccin 1 del
SPM del Picoblaze
Leer y almacenar en el
registro sA la direccin 3 del
SPM del Picoblaze
Leer y almacenar en el
registro s8 la direccin 5 del
SPM del Picoblaze
Leer y almacenar en el
registro s6 la direccin 7 del
SPM del Picoblaze
Leer y almacenar en el
registro s9 la direccin 9 del
SPM del Picoblaze
Leer y almacenar en el
registro s7 la direccin 11 del
SPM del Picoblaze
Leer y almacenar en el
registro sA la direccin 13 del
SPM del Picoblaze
Leer y almacenar en el
registro s8 la direccin 15 del
SPM del Picoblaze
Leer y almacenar en el
registro sA la direccin 14 del
SPM del Picoblaze
Leer y almacenar en el
registro s8 la direccin 10 del
SPM del Picoblaze
Leer y almacenar en el
registro s7 la direccin 6 del
SPM del Picoblaze
Guardar en la direccin 11
del SPM del Picoblaze el
registro s6
Guardar en la direccin 13
del SPM del Picoblaze el
registro s7
Leer y almacenar en el
registro s6 la direccin 2 del
SPM del Picoblaze
Guardar en la direccin 15
del SPM del Picoblaze el
registro s7
Terminar
Figura 34. Diagrama de flujo utilizado para el diseo del algoritmo empleado para la implementacin de la etapa ShiftRows en el
microcontrolador PicoBlaze.
45
CaptuloIII
3.7.3.4
DiseodelSistema
En el paso MixColumns, los cuatro bytes de cada columna del State se combinan usando una
transformacin lineal invertible. La funcin 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 difusin en el cifrado. Cada columna se trata como un polinomio GF (28) y luego
se multiplica el mdulo x4 + 1 con un polinomio fijo c(x). El paso MixColumns puede verse como una
multiplicacin matricial en el campo finito de Rijndael.
Inicio
Leer y almacenar en el
registro s4 la direccin 0 del
SPM del Picoblaze
Leer y almacenar en el
registro s4 la direccin 8 del
SPM del Picoblaze
Guardar en la direccin 15
del SPM del Picoblaze el
registro s7
Leer y almacenar en el
registro s5 la direccin 1 del
SPM del Picoblaze
Leer y almacenar en el
registro s5 la direccin 9 del
SPM del Picoblaze
Guardar en la direccin 14
del SPM del Picoblaze el
registro s6
Leer y almacenar en el
registro s6 la direccin 2 del
SPM del Picoblaze
Leer y almacenar en el
registro s6 la direccin 10 del
SPM del Picoblaze
Guardar en la direccin 13
del SPM del Picoblaze el
registro s5
Leer y almacenar en el
registro s7 la direccin 3 del
SPM del Picoblaze
Leer y almacenar en el
registro s7 la direccin 11 del
SPM del Picoblaze
Guardar en la direccin 12
del SPM del Picoblaze el
registro s4
Llamar subrutina
MixColumn
Llamar subrutina
MixColumn
Llamar subrutina
MixColumn
Llamar subrutina
MixColumn
Leer y almacenar en el
registro s7 la direccin 7 del
SPM del Picoblaze
Leer y almacenar en el
registro s7 la direccin 15 del
SPM del Picoblaze
Leer y almacenar en el
registro s6 la direccin 6 del
SPM del Picoblaze
Leer y almacenar en el
registro s6 la direccin 14 del
SPM del Picoblaze
Leer y almacenar en el
registro s5 la direccin 5 del
SPM del Picoblaze
Guardar en la direccin 10
del SPM del Picoblaze el
registro s6
Leer y almacenar en el
registro s5 la direccin 13 del
SPM del Picoblaze
Leer y almacenar en el
registro s4 la direccin 4 del
SPM del Picoblaze
Guardar en la direccin 11
del SPM del Picoblaze el
registro s7
Leer y almacenar en el
registro s4 la direccin 12 del
SPM del Picoblaze
Figura 35. Diagrama de flujo utilizado para el diseo del algoritmo empleado para la implementacin de la etapa MixColumns en el
microcontrolador PicoBlaze.
46
Terminar
CaptuloIII
DiseodelSistema
MixColumns
Cargar el registro
s4(c[0]) en s9
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 instruccin anterior?
Cargar el registro
s5(c[1]) en sA
Cargar el registro
s9(c[0] c[3]) en sB
No
S
Existi un desbordamiento en el
microcontrolador PicoBlaze al
ejecutar la instruccin anterior?
Cargar el registro
s9(c[0] c[3]) 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 instruccin anterior?
Cargar el registro
s4(c[0]) en s8
Existi un desbordamiento en el
microcontrolador PicoBlaze al
ejecutar la instruccin anterior?
No
No
No
S
XOR s8(c[0] c[1])
con 1Bhex, depositar
el resultado en s8
Terminar
Figura 36. Subrutina empleada para la implementacin de la multiplicacin de matrices en GF(28) en el microcontrolador
PicoBlaze.
47
CapttuloIII
DisseodelSisstema
P
Para
realizar una
u implemenntacin ms 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
matemticaa
para
GF(228):
{03} i x = ({022} i x ) x , y si se parte dee las ecuacionnes para MixCoolumns mostraadas en el Marrco
T
Terico,
se tien
ne entonces quue:
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 )
3.8 Arquitectu
A
ura del Sistema
48
CaptuloIII
DiseodelSistema
Como se observa en la figura anterior la arquitectura del sistema, como resultado del procesamiento embebido
en el microcontrolador PicoBlaze ha resultado muy prctica de implementar. A continuacin 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 adems de la gestin de perifricos externos. El cdigo fuente para
implementarse en un proyecto se puede encontrar de manera gratuita desde la pgina web del fabricante
Xilinx: www.xilinx.com
3.8.2
3.8.1
Interface
Esta es la entidad encargada de realizar la interfaz entre el microcontrolador PicoBlaze y los perifricos
externos a este: LCD, push-buttons, switches, puerto RS-232 y PS/2. Adems se encarga de decodificar
los Scan-codes que enva el teclado a cdigo ASCII; y realiza la transformacin SubBytes del algoritmo
AES-128 almacenando la S-box necesaria para ello.
49
CaptuloIII
DiseodelSistema
Terminar
Inicio
Almacenar en la variable
llave los nmeros ingresados
por el usuario para usar en el
proceso de encriptacin
Almacenar en la variable
datos los nmeros
ingresados por el usuario
para su encriptacin
Figura 38. Diagrama de flujo para el diseo del programa que ejecuta MatLab para la gestin de datos.
50
Captulo IV
V. AN
NLISIIS DE RESUL
R
LTADO
OS
e sistema codificara correctaamente segn 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 Encrriptacin Avannzada AES, y se
s compararon los ejemplos que contiene dicho
d
documennto
contra los
l datos que el sistema procees:
A)
B)
Figura
F
40. Datos enviados
e
y recibidoos por la PC a travvs de MatLab haacia el FPGA.
51
CaptuloIV
AnlisisdeResultados
s observa en las
l imgenes anteriores
a
los datos
d
utilizadoss en el ejemploo de FIPS y los datos obteniddos
Como se
en el sistema de encriiptacin desarrrollado en este trabajo, concuuerdan, por lo que
q se puede teener la certezaa de
s
encriptta datos segn 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 imgenes
desarrollo. Estos caraacteres concuerrdan con los reesultados anteriiores ya que soon los mismos valores pero con
c
su correespondiente traaduccin a cddigo ASCII.
52
CaptuloIV
AnlisisdeResultados
4.1 Resultados
R
s de la impplementaciin del sisttema
Para deeterminar las propiedades finales del sisstema se mueestran algunass de sus caractersticas en su
implem
mentacin:
4.1.1
rea
a
Seegn la herram
mienta de softw
ware ISE Fooundation del fabricante
f
Xiliinx el espacioo ocupado porr el
diseo en el FPG
GA es:
A)
B)
Figura 42
2. Vista de los recuursos utilizados poor el diseo. A) Edditor de interconexxiones. B) Editor FloorPanel.
F
53
CaptuloIV
Valor utilizado
25 de 232
2 de 24
1 de 20
276 de 4656
78 de 2328
Recurso
IOBs Externos
BUFGMUXs
RAMB16s
Slices
SLICEMs
AnlisisdeResultados
Porcentaje XC3S500E
10%
8%
5%
5%
3%
Como se puede observar en las imgenes y en el reporte de recursos, el nmero de elementos utilizado
por el diseo es mnimo, debido a que el procesamiento y la gestin 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 diseo.
4.1.2
Throughput
Al utilizar el microcontrolador PicoBlaze se puede conocer con gran precisin 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 diseo, el nmero de ciclos de reloj necesarios para encriptar 128bits a 50MHz segn los datos obtenidos con la herramienta pBlazeIDE es de 5,247-ciclos. Para un
algoritmo criptogrfico el Throughput (cantidad de datos procesados por unidad de tiempo) es:
Throughput =
En especfico para el sistema diseado en este trabajo de investigacin el Throughput obtenido es:
Throughput =
4.1.3
Con el propsito de conocer la manera en que se comporta el sistema en el mundo real se compar el
desempeo del sistema con algunas otras implementaciones encontradas en literatura abierta. Dichas
implementaciones se dividen en dos categoras: Arquitecturas basadas en FPGAs y Arquitecturas
basadas en microcontroladores.
54
CaptuloIV
AnlisisdeResultados
A continuacin 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]
Caldern[18]
Bernstein[19]
Bernstein[19]
Bernstein[19]
ChungHuang[20]
Permadi[21]
Permadi[21]
ChungHuang[20]
ChungHuang[20]
SIC-IAIK[22]
FlowersSchlunder[23]
Trabajo de
Investigacin
Tecnologa/Dispositivo
Slices BRAMs
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 AthlonX2 4600+
(213 ciclos @ 2.4GHz)
Microprocesador/Intel Core2 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)
PicoBlazeMicrocontrolador
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 (terico)
1.44Tbps (terico)
1.52Tbps (terico)
30Kbps
41.8Kbps
112.3Kbps
141Kbps
153.1Kbps
262.2Kbps
729Kbps
1.21Mbps
Figura 44. Comparacin de desempeo entre diferentes Arquitecturas para cifrado de AES-128
55
Captulo V.
CONCLUSIONES
56
CaptuloV
57
Conclusiones
APNDICES
Apndice A. Trminos y Acrnimos
A continuacin se enlista una serie de trminos y acrnimos que se utilizarn durante la realizacin de esta
investigacin. Algunos trminos que nativamente se encuentran en el idioma ingls, se les aplicar una
traduccin inmediata al espaol para una mejor comprensin:
58
Apndices
Palabra. Un grupo de 32 bits que es tratado como una entidad simple como un arreglo de 4 bytes.
Rijndael. Algoritmo criptogrfico especificado en el Estndar de Encriptacin Avanzado (AES).
Rondas de la llave. S valores derivados del texto cifrado utilizando la Rutina de expansin de la llave; son
aplicados al State en la etapa de cifrado y descifrado.
Rutina de expansin 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. Substitucin no lineal basada en la bsqueda en tablas, usada en varias substituciones de bytes y en
la rutina de Expansin de la llave para llevar a cabo una substitucin 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.
EQU
EQU
EQU
EQU
EQU
EQU
EQU
s0
s1
s2
s3
s4
s5
s6
;
;
;
;
;
;
;
scan_byte
comp_supp
EQU
EQU
s7
s8
gral_reg0
gral_reg1
gral_reg2
gral_reg3
gral_reg4
rc
EQU
EQU
EQU
EQU
EQU
EQU
sA
sB
sC
sD
sE
sF
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
$10
$11
$12
$13
$14
$15
$16
;
;
;
;
;
;
puerto
puerto
puerto
puerto
puerto
puerto
59
Apndices
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
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
;
;
;
;
;
;
upper nibble,
rw = '1', e =
lower nibble,
lower nibble,
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
Apndices
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
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
; Configuracin de la LCD
LOAD
LOAD
CALL
gral_reg1, rs_com ; Function set x"28", interface de 8-bits, 2 lneas, caracteres de 5x8
puntos de resolucin
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 posicin 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
Apndices
Mensaje_bienvenida:
; Configura direccin 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
gral_reg0, $C2
gral_reg1, rs_com
escribir_lcd
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
Apndices
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
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
Apndices
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
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
STORE
ADD
SUB
JUMP
scan_byte, sF
sF, 1
s9, 1
NZ, ps2_in_state
;
;
;
;
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
;
;
;
;
RET
64
Apndices
; -----------------------------------------------------------------------------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
Apndices
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
gral_reg0, gral_reg3
gral_reg1, rs_com
escribir_lcd
gral_reg1, rs_dat
gral_reg0, caracter_espacio
escribir_lcd
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
gral_reg0, gral_reg3
gral_reg1, rs_com
escribir_lcd
LOAD
LOAD
CALL
gral_reg1, rs_dat
gral_reg0, caracter_espacio
escribir_lcd
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
66
Apndices
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
cargado en RAM
serial_in_key:
cargado en RAM
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
FETCH
FETCH
XOR
regstate, statep
regkey, keyp
regstate, regkey
STORE
ADD
ADD
SUB
JUMP
transformacin 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
s_box:
FETCH
OUT
IN
STORE
regstate,
regstate,
regstate,
regstate,
;
;
;
;
statep
sbox_out
sbox_in
statep
67
Apndices
ADD
SUB
JUMP
statep, $01
countint, $01
NZ, s_box
; -----------------------------------------------------------------------------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
68
cargado en RAM
Apndices
nowrap:
key96:
OUT
IN
s4, sbox_out
s4, sbox_in
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
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
ADD
FETCH
XOR
STORE
ADD
SUB
JUMP
keyp, 1
s8, keyp
s7, s8
s7, keyp
keyp, 1
countint, 4
NZ, key96
; -----------------------------------------------------------------------------cleanark:
LOAD
LOAD
LOAD
statep, state
keyp, key
countint, b16
addroundkey:
FETCH
FETCH
XOR
regstate, statep
regkey, keyp
regstate, regkey
STORE
ADD
ADD
SUB
JUMP
transformacin addroundkey
regstate, statep
statep, $01
keyp, $01
countint, $01
NZ, addroundkey
; -----------------------------------------------------------------------------SUB
JUMP
round, $01
NZ, cleanbox
RET
; -----------------------------------------------------------------------------; -----------------------------------------------------------------------------gestion_salida:
transmision:
out_state:
out_key:
LOAD
LOAD
countint, b16
statep, state
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
; -----------------------------------------------------------------------------lcd_salida:
IN
scan_byte, lcd_sel
69
cargado en RAM
de cuenta
cargado en RAM
Apndices
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
; -----------------------------------------------------------------------------; 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
70
cargado en RAM
Apndices
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
mcf3
G
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
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
Apndices
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
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
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
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
gral_reg1, rs_dat
72
Apndices
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
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
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
gral_reg0, $C0
gral_reg1, rs_com
escribir_lcd
gral_reg1, rs_dat
RET
; ------------------------------------------------------------------------------
73
Apndices
;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
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
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
Apndices
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
Apndices
; -----------------------------------------------------------------------------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
; ------------------------------------------------------------------------------
LOAD
LOAD
cicl_supp, $01
scan_byte, $00
RET
; -----------------------------------------------------------------------------VHDL
; ------------------------------------------------------------------------------
76
Apndices
:
:
:
:
:
:
:
:
:
:
:
:
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
---------------------------------------------------------------------------------------------------------------------Seales 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 <= x"00"; Tx <= '1'; look <= x"00"; lcd_dat <= x"00"; rs <= x"0"; up_case <= '0'; code <=
x"00";
elsif rising_edge(write_strobe) then
if port_id_pB = x"10" then
Tx <= out_port_pB(0);
elsif port_id_pB = x"11" then leds <= out_port_pB;
elsif port_id_pB = x"12" then look <= out_port_pB;
elsif port_id_pB = x"13" then lcd_dat <= out_port_pB;
elsif port_id_pB = x"14" then rs <= out_port_pB(3 downto 0);
end if;
end process;
---------------------------------------------------------------------------------------------------------------------Puertos de Lectura
-------------------------------------------------------------------------------------------------------------------process(read_strobe, port_id_pB, Rx, dato, gestion,ps2_clk, ps2_data, ascii, lcd_sel, reload_port)
begin
if rising_edge(read_strobe) then
if port_id_pB = x"20" then in_port_pB <= "0000000" & Rx;
elsif port_id_pB = x"21" then in_port_pB <= dato;
elsif port_id_pB = x"22" then in_port_pB <= "000000" & gestion;
elsif port_id_pB = x"23" then in_port_pB <= "0000000" & ps2_clk;
elsif port_id_pB = x"24" then in_port_pB <= "0000000" & ps2_data;
elsif port_id_pB = x"25" then in_port_pB <= ascii;
elsif port_id_pB = x"26" then in_port_pB <= "0000000" & lcd_sel;
elsif port_id_pB = x"27" then in_port_pB <= "0000000" & reload_port;
end if;
end if;
77
Apndices
---------------------------------------------------------------------------------------------------------------------Seleccion de gestion I/O
-------------------------------------------------------------------------------------------------------------------process(rst,clk,sw)
begin
if rst = '1' then gestion <= "00";
elsif rising_edge(clk) then
end if;
end process;
case sw is
when "01" => gestion <= "01";
when "10" => gestion <= "10";
when others => gestion <= "00";
end case;
---------------------------------------------------------------------------------------------------------------------Ciclos LCD
-------------------------------------------------------------------------------------------------------------------process(rst,clk,ciclo)
begin
if rising_edge(clk) then
case
when
when
when
when
ciclo is
x"A" => lcd_rs <= rs_to_lcd; lcd_rw <= '0'; lcd_e <= '1'; lcd_data <= lcd_dat(7 downto 4);
x"B" => lcd_rw <= '1'; lcd_e <= '0';
x"C" => lcd_rs <= rs_to_lcd; lcd_rw <= '0'; lcd_e <= '1'; lcd_data <= lcd_dat(3 downto 0);
x"D" => lcd_e <= '1'; lcd_data <= lcd_dat(3 downto 0);
end if;
end process;
case rs is
when x"C" => rs_to_lcd <= '0';
when x"D" => rs_to_lcd <= '1';
when others => null;
end case;
---------------------------------------------------------------------------------------------------------------------Sbox
-------------------------------------------------------------------------------------------------------------------process(rst,clk,look)
begin
if rst = '1' then dato <= x"00";
elsif rising_edge(clk) then
case look is
when x"00" => dato <= x"63";
when x"01" => dato <= x"7C";
when x"02" => dato <= x"77";
when x"03" => dato <= x"7B";
when x"04" => dato <= x"F2";
when x"05" => dato <= x"6B";
when x"06" => dato <= x"6F";
when x"07" => dato <= x"C5";
when x"08" => dato <= x"30";
when x"09" => dato <= x"01";
when x"0A" => dato <= x"67";
when x"0B" => dato <= x"2B";
when x"0C" => dato <= x"FE";
when x"0D" => dato <= x"D7";
when x"0E" => dato <= x"AB";
when x"0F" => dato <= x"76";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"10"
x"11"
x"12"
x"13"
x"14"
x"15"
x"16"
x"17"
x"18"
x"19"
x"1A"
x"1B"
x"1C"
x"1D"
x"1E"
x"1F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"CA";
x"82";
x"C9";
x"7D";
x"FA";
x"59";
x"47";
x"F0";
x"AD";
x"D4";
x"A2";
x"AF";
x"9C";
x"A4";
x"72";
x"C0";
when
when
when
when
x"20"
x"21"
x"22"
x"23"
=>
=>
=>
=>
dato
dato
dato
dato
<=
<=
<=
<=
x"B7";
x"FD";
x"93";
x"26";
78
Apndices
when
when
when
when
when
when
when
when
when
when
when
when
x"24"
x"25"
x"26"
x"27"
x"28"
x"29"
x"2A"
x"2B"
x"2C"
x"2D"
x"2E"
x"2F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"36";
x"3F";
x"F7";
x"CC";
x"34";
x"A5";
x"E5";
x"F1";
x"71";
x"D8";
x"31";
x"15";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"30"
x"31"
x"32"
x"33"
x"34"
x"35"
x"36"
x"37"
x"38"
x"39"
x"3A"
x"3B"
x"3C"
x"3D"
x"3E"
x"3F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"04";
x"C7";
x"23";
x"C3";
x"18";
x"96";
x"05";
x"9A";
x"07";
x"12";
x"80";
x"E2";
x"EB";
x"27";
x"B2";
x"75";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"40"
x"41"
x"42"
x"43"
x"44"
x"45"
x"46"
x"47"
x"48"
x"49"
x"4A"
x"4B"
x"4C"
x"4D"
x"4E"
x"4F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"09";
x"83";
x"2C";
x"1A";
x"1B";
x"6E";
x"5A";
x"A0";
x"52";
x"3B";
x"D6";
x"B3";
x"29";
x"E3";
x"2F";
x"84";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"50"
x"51"
x"52"
x"53"
x"54"
x"55"
x"56"
x"57"
x"58"
x"59"
x"5A"
x"5B"
x"5C"
x"5D"
x"5E"
x"5F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"53";
x"D1";
x"00";
x"ED";
x"20";
x"FC";
x"B1";
x"5B";
x"6A";
x"CB";
x"BE";
x"39";
x"4A";
x"4C";
x"58";
x"CF";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"60"
x"61"
x"62"
x"63"
x"64"
x"65"
x"66"
x"67"
x"68"
x"69"
x"6A"
x"6B"
x"6C"
x"6D"
x"6E"
x"6F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"D0";
x"EF";
x"AA";
x"FB";
x"43";
x"4D";
x"33";
x"85";
x"45";
x"F9";
x"02";
x"7F";
x"50";
x"3C";
x"9F";
x"A8";
when
when
when
when
when
when
when
when
when
when
when
when
when
x"70"
x"71"
x"72"
x"73"
x"74"
x"75"
x"76"
x"77"
x"78"
x"79"
x"7A"
x"7B"
x"7C"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"51";
x"A3";
x"40";
x"8F";
x"92";
x"9D";
x"38";
x"F5";
x"BC";
x"B6";
x"DA";
x"21";
x"10";
79
Apndices
when x"7D" => dato <= x"FF";
when x"7E" => dato <= x"F3";
when x"7F" => dato <= x"D2";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"80"
x"81"
x"82"
x"83"
x"84"
x"85"
x"86"
x"87"
x"88"
x"89"
x"8A"
x"8B"
x"8C"
x"8D"
x"8E"
x"8F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"CD";
x"0C";
x"13";
x"EC";
x"5F";
x"97";
x"44";
x"17";
x"C4";
x"A7";
x"7E";
x"3D";
x"64";
x"5D";
x"19";
x"73";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"90"
x"91"
x"92"
x"93"
x"94"
x"95"
x"96"
x"97"
x"98"
x"99"
x"9A"
x"9B"
x"9C"
x"9D"
x"9E"
x"9F"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"60";
x"81";
x"4F";
x"DC";
x"22";
x"2A";
x"90";
x"88";
x"46";
x"EE";
x"B8";
x"14";
x"DE";
x"5E";
x"0B";
x"DB";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"A0"
x"A1"
x"A2"
x"A3"
x"A4"
x"A5"
x"A6"
x"A7"
x"A8"
x"A9"
x"AA"
x"AB"
x"AC"
x"AD"
x"AE"
x"AF"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"E0";
x"32";
x"3A";
x"0A";
x"49";
x"06";
x"24";
x"5C";
x"C2";
x"D3";
x"AC";
x"62";
x"91";
x"95";
x"E4";
x"79";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"B0"
x"B1"
x"B2"
x"B3"
x"B4"
x"B5"
x"B6"
x"B7"
x"B8"
x"B9"
x"BA"
x"BB"
x"BC"
x"BD"
x"BE"
x"BF"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"E7";
x"C8";
x"37";
x"6D";
x"8D";
x"D5";
x"4E";
x"A9";
x"6C";
x"56";
x"F4";
x"EA";
x"65";
x"7A";
x"AE";
x"08";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"C0"
x"C1"
x"C2"
x"C3"
x"C4"
x"C5"
x"C6"
x"C7"
x"C8"
x"C9"
x"CA"
x"CB"
x"CC"
x"CD"
x"CE"
x"CF"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"BA";
x"78";
x"25";
x"2E";
x"1C";
x"A6";
x"B4";
x"C6";
x"E8";
x"DD";
x"74";
x"1F";
x"4B";
x"BD";
x"8B";
x"8A";
when
when
when
when
when
x"D0"
x"D1"
x"D2"
x"D3"
x"D4"
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
x"70";
x"3E";
x"B5";
x"66";
x"48";
80
Apndices
end if;
end process;
when
when
when
when
when
when
when
when
when
when
when
x"D5"
x"D6"
x"D7"
x"D8"
x"D9"
x"DA"
x"DB"
x"DC"
x"DD"
x"DE"
x"DF"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"03";
x"F6";
x"0E";
x"61";
x"35";
x"57";
x"B9";
x"86";
x"C1";
x"1D";
x"9E";
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"E0"
x"E1"
x"E2"
x"E3"
x"E4"
x"E5"
x"E6"
x"E7"
x"E8"
x"E9"
x"EA"
x"EB"
x"EC"
x"ED"
x"EE"
x"EF"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
dato
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"E1";
x"F8";
x"98";
x"11";
x"69";
x"D9";
x"8E";
x"94";
x"9B";
x"1E";
x"87";
x"E9";
x"CE";
x"55";
x"28";
x"DF";
x"8C";
x"A1";
x"89";
x"0D";
x"BF";
x"E6";
x"42";
x"68";
x"41";
x"99";
x"2D";
x"0F";
x"B0";
x"54";
x"BB";
x"16";
---------------------------------------------------------------------------------------------------------------------Scan-code to ASCII
-------------------------------------------------------------------------------------------------------------------process(rst,clk,code,up_case)
begin
if rst = '1' then ascii <= x"20";
elsif rising_edge(clk) then
case up_case is
when
case
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
'0' =>
code is
x"1C" =>
x"32" =>
x"21" =>
x"23" =>
x"24" =>
x"2B" =>
x"34" =>
x"33" =>
x"43" =>
x"3B" =>
x"42" =>
x"4B" =>
x"3A" =>
x"31" =>
x"4C" =>
x"44" =>
x"4D" =>
x"15" =>
x"2D" =>
x"1B" =>
x"2C" =>
x"3C" =>
x"2A" =>
x"1D" =>
x"22" =>
x"35" =>
x"1A" =>
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"61";
x"62";
x"63";
x"64";
x"65";
x"66";
x"67";
x"68";
x"69";
x"6A";
x"6B";
x"6C";
x"6D";
x"6E";
x"EE";
x"6F";
x"70";
x"71";
x"72";
x"73";
x"74";
x"75";
x"76";
x"77";
x"78";
x"79";
x"7A";
--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
when
when
when
when
x"45"
x"16"
x"1E"
x"26"
ascii
ascii
ascii
ascii
<=
<=
<=
<=
x"30";
x"31";
x"32";
x"33";
--0
--1
--2
--3
=>
=>
=>
=>
81
Apndices
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"25"
x"2E"
x"36"
x"3D"
x"3E"
x"46"
x"0E"
x"61"
x"41"
x"49"
x"4A"
x"29"
x"52"
x"5D"
x"54"
x"5B"
x"7C"
x"79"
x"7B"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"34";
x"35";
x"36";
x"37";
x"38";
x"39";
x"7C";
x"3C";
x"2C";
x"2E";
x"B0";
x"20";
x"7B";
x"7D";
x"5B";
x"5D";
x"78";
x"2B";
x"2D";
--4
--5
--6
--7
--8
--9
--vertical |
--menor que <
--coma ,
--punto .
--guin --espacio
--corchete a {
--corchete b }
--parentesis c_a[
--parentesis c_b ]
--multiplicacion
--suma
--resta
code is
x"1C" =>
x"32" =>
x"21" =>
x"23" =>
x"24" =>
x"2B" =>
x"34" =>
x"33" =>
x"43" =>
x"3B" =>
x"42" =>
x"4B" =>
x"3A" =>
x"31" =>
x"4C" =>
x"44" =>
x"4D" =>
x"15" =>
x"2D" =>
x"1B" =>
x"2C" =>
x"3C" =>
x"2A" =>
x"1D" =>
x"22" =>
x"35" =>
x"1A" =>
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"41";
x"42";
x"43";
x"44";
x"45";
x"46";
x"47";
x"48";
x"49";
x"4A";
x"4B";
x"4C";
x"4D";
x"4E";
x"EE";
x"4F";
x"50";
x"51";
x"52";
x"53";
x"54";
x"55";
x"56";
x"57";
x"58";
x"59";
x"5A";
--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
when
when
when
when
when
when
when
when
when
when
when
when
when
when
x"0E"
x"16"
x"1E"
x"26"
x"25"
x"2E"
x"36"
x"3D"
x"3E"
x"46"
x"45"
x"61"
x"29"
x"4A"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"DF";
x"21";
x"22";
x"23";
x"24";
x"25";
x"26";
x"2F";
x"28";
x"29";
x"3F";
x"3E";
x"20";
x"5F";
--grados
--exclamacion !
--parentesis "
--nmero #
--pesos $
--porcentaje %
--ampersand &
--diagonal /
--parntesis a (
--parntesis b )
--interrogacin ?
--mayor que >
--espacio
--guion bajo
when
when
when
when
when
when
when
when
when
when
when
when
when
x"70"
x"69"
x"72"
x"7A"
x"6B"
x"73"
x"74"
x"6C"
x"75"
x"7D"
x"7C"
x"79"
x"7B"
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
ascii
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
x"30";
x"31";
x"32";
x"33";
x"34";
x"35";
x"36";
x"37";
x"38";
x"39";
x"78";
x"2B";
x"2D";
--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
--multiplicacion
--suma
--resta
82
Apndices
Apndice D.
clc;
datos = input('Ingrese los datos a cifrar (16, 8 bits c/u) en formato hexadecimal: ','s');
llave = input('Ingrese la llave utilizada para el cifrado (16, 8 bits c/u) en formato hexadecimal: ','s');
% ------------------------------------------------------------------------envio = 0;
matriz = 0;
for n = 1:3:46
sub0 = datos(n);
sub1 = datos(n+1);
envio = hex2dec([sub0 sub1]);
matriz = [matriz envio];
end
n = 1;
for n = 1:3:46
sub0 = llave(n);
sub1 = llave(n+1);
envio = hex2dec([sub0 sub1]);
matriz = [matriz envio];
end
elementos = length(matriz);
matriz = matriz(2:elementos);
matriz = uint8(matriz);
% ------------------------------------------------------------------------port = 'COM1';
puerto_serial = serial(port);
set(puerto_serial,'Timeout', 30);
set(puerto_serial,'OutputBufferSize',32);
set(puerto_serial,'InputBufferSize',32);
set(puerto_serial,'BaudRate',115200);
set(puerto_serial,'DataBits',8);
set(puerto_serial,'Parity','none');
set(puerto_serial,'StopBits',1);
fopen(puerto_serial);
fwrite(puerto_serial,matriz,'uint8');
%------------------------------------------------------------------------[A,cuenta] = fread(puerto_serial);
fclose(puerto_serial);
salida = dec2hex(A(1:16))
key_schedule = dec2hex(A(17:32))
83
Listadodereferencias
[1] Chapman,Ken;XilinxLtd.PicoBlazeKCSPM3Manual2(Rev.7)[enlnea].USAOctubre
de2003.DisponibleenInternet:<http://www.xilinx.com>
[2] Federal Information Processing Standards Publication 197. Announcing the Advanced
Encryption Standard (AES) [en lnea]. USA Noviembre 26 2001. Disponible en Internet:
<http://www.csrc.nist.gov>
[3] CryptographyandNetworkSecurity.PrinciplesandPractices
WilliamStallings
3Edicin
Pearson/PrenticeHall
USA,2003
[4] Xilinx. Spartan3E Starter Kit Board User Guide (UG230 v1.0) [en lnea]. USA Marzo 9
2006.DisponibleenInternet:<http://www.xilinx.com>
[5] TheDesignofRijndael:AES,TheAdvancedEncryptionStandard
DaemenJoan,RijmenVincent.
1Edicin
Springer/Verlag
USA,2002
[6] HandbookofAppliedCryptography
MenezezAlfredJ.,VanOorschotPaulC.,VanstoneScottA.
5Edicin
USA,2001
[7] SecurityonFPGAs:Stateoftheartimplementationsandattacks
InACMTransactionsonEmbeddedComputingSystems(TECS)volume3
USA,2004
[8] EfficientmodularpipelinedAESimplementationincountermodeonAlteraFPGA
Infieldprogrammablelogicandapplications,pages:282291,534574.
SystemTECSvolume3
USA,2004
[9] Techinical report, U.C. Berkeley BRASS group. High performance, compact AES
implementations in Xilinx FPGAs [en lnea]. USA 2002. Disponible en internet:
<http://www.cs.berkey.edu/nnweaver/sfra/rijndael.pdf>
[10]LabbA.PrezA.AESimplementationsonFPGA:Timeflexibilitytradeoff.
84
ListadodeReferencias
[11]An FPGAbased performance analysis of the unrolling, tiling and pipelining of the AES
algorithminfieldprogrammablelogicandapplications.
SaggeseG.P.,MazzeoA.,MazzoccaN.andStrolloA.G.M.
Ches2003
Pginas:292302
Kln,2003
[12]VerycompactFPGAimplementationoftheAESalgorithmincryptographichardwareand
embeddedsystems.
Chodowiec,PawelandGajKris.
Ches2003
Pginas:319333
Kln,2003
[13]EfficientimplementationofRijndaelencryptioninreconfigurablehardware:Improvments
andDesigntradeoffs.
StandaertFranoisXavier,RouvroyGael,QuisquartJeanJacquesandLegatJeanDidier.
Ches2003
Pginas:334350
Kln,2003
[14]Comparison of the hardware performance of the AES candidates using reconfigurable
hardware.
GajKrisandChodowiecPawel.
InthethirdAEScandidateconference.
NewYork,2000
[15]4.2Gbit/ssinglechipFPGAimplementationofAESalgorithm.
RodriguezHenriquezF.,SaqibN.A.andDiazPerezA.
Electronicslettersvolumen39.
Pginas:11151116
USA,2003
[16]Amphion.CS521010:HighperformanceAESencryptioncores.2003
[17]DiseodeunprocesadorcriptogrficoRijndaelenFPGA.
SegredoasAlejandro,ZabalaEnriqueyBelloGustavo.
InXWorkshopIBERCHIP
Pgina:64
Cartagena,2004
[18]ImplementacinenHardwaredelalgoritmoRijndael.
JcomeCaldernGermn,VelazcoMedinaJaime,LpezHernndezJulio.
InXWorkshopIBERCHIP
Pgina:113
Cartagena,2004
85
ListadodeReferencias
[19]DanielJuliusBernstein.AESSpeed.[enlnea].USAMarzo2008.Disponibleeninternet:
<http://cr.yp.to/aesspeed.html>
[21]EdiPermadi.ImplementingAESusingPIC16F84.[enlnea].USAMarzo2008.Disponible
en internet: <http://edipermadi.wordpress.com/2008/01/21/implementingaesusing
pic16f84>
[23]DavidFlowersandHowardHenrySchlunder;MicrochipTechnologyInc.DataEncryption
RoutinesforPIC24anddsPICdevices.[enlnea].USAMarzo2008.Disponibleeninternet:
<http://ww1.microchip.com/downloads/en/AppNotes/0144a.pdf>
[24]AnalysisanddesignofdigitalsystemswithVHDL.
AllenM.Dewey.
PSWpub.
Boston,1997
[25]IntroductoryVHDLfromsimulationtosynthesys.
SudhakarYalamanchili.
PrenticeHall
USA,2001
[26]Programmablelogichandbook.
Sharma,AshokK.
McGrawHill.
USA,1998
[27]Programmablelogic,PLDsandFPGAs.
SealsR.C.
McGrawHill.
USA,1997
[28]DigitalSignalProcessingwithFieldProgrammableGateArrays.
UweMeyerBaese.
Springer.
USA,2007
86