Módulo 2.3. Criptografía de Clave Simétrica

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 56

Criptografía de

clave simétrica
Criptosistemas en flujo y en bloque
PID_00235167

Jordi Herrera Joancomartí


Cristina Pérez Solà

Tiempo mínimo de dedicación recomendado: 4 horas


© FUOC • PID_00235167 Criptografía de clave simétrica

Jordi Herrera Joancomartí Cristina Pérez Solà

Licenciado en Matemáticas por la Doctora en Informática por la Uni-


Universidad Autónoma de Barcelo- versidad Autónoma de Barcelona y
na y doctor por la Universidad Po- la Universidad Católica de Lovaina.
litécnica de Cataluña. Sus ámbitos Actualmente es profesora de los Es-
de investigación son la criptografía, tudios de Informática, Multimedia
las criptomonedas y la tecnología y Telecomunicaciones de la Univer-
blockchain. Ha publicado numero- sitat Oberta de Catalunya. Sus ám-
sos textos docentes y más de cien bitos de investigación son las cripto-
artículos de investigación en revistas monedas basadas en blockchain y,
y congresos nacionales e internacio- en especial, los aspectos relaciona-
nales. Ha dirigido nueve tesis docto- dos con la seguridad y la privacidad
rales y ha sido investigador principal de estas. También está interesada
de varios proyectos de investigación en los problemas de privacidad que
nacionales. Ha participado como surgen a raíz del uso de las redes so-
evaluador para agencias de investi- ciales y en la adaptación de técnicas
gación de varios países europeos y de minería de datos a la naturaleza
también para la Comisión Europea. específica de este tipo de redes.
Actualmente es profesor agregado
del departamento de Ingeniería de
la Información y las Comunicaciones
en la Universidad Autónoma de Bar-
celona.

El encargo y la creación de este recurso de aprendizaje UOC han sido coordinados


por la profesora: Helena Rifà Pous

Segunda edición: febrero 2021


© de esta edición, FUOC, 2021
Av. Tibidabo, 39-43, 08035 Barcelona
Autoría: Jordi Herrera Joancomartí, Cristina Pérez Solà
Producción: FUOC
Todos los derechos reservados

Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea este eléctrico,
mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
del titular de los derechos.

c FUOC • PID_00235167 Criptografía de clave simétrica

Índice

Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1 Criptografía de clave simétrica o compartida . . . . . . . . . . . . . . . . 9

2 El cifrado en flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1 Periodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Aleatoriedad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 Test de aleatoriedad del NIST . . . . . . . . . . . . . . . . . . . . . . . . . 13

3 Generadores lineales de secuencia cifrante . . . . . . . . . . . . . . . . . . . 17


3.1 Generadores congruenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Registros de desplazamiento realimentados linealmente . . . . . . 18
3.3 Limitaciones de los generadores lineales . . . . . . . . . . . . . . . . . . . . . . 21

4 Generadores no lineales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1 A5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 Trivium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.1 Inicialización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

5 El cifrado en bloque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.1 Modos de operación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

6 El criptosistema AES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.1 Descripción del funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.2 Detalle de una iteración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.3 Función AddRoundKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.4 Función ByteSub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.4.1 Las cajas S del AES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.5 Función ShiftRow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.6 Función MixColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.7 Generación de subclaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

c FUOC • PID_00235167 Criptografía de clave simétrica

6.8 Descifrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Ejercicios de autoevaluación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Solucionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

c FUOC • PID_00235167 5 Criptografía de clave simétrica

Introducción

Ya hemos visto en anteriores módulos didácticos que un criptosistema incon-


dicionalmente seguro necesita tantos bits de clave como bits de texto para
cifrar. El cifrado de Vernam es el criptosistema que consigue esta seguridad
incondicional, pero el precio que paga es la ineficiencia del cifrado. Esta in-
eficiencia recae justamente en el hecho de que la clave debe tener la misma
longitud del texto que se quiere cifrar. Esto comporta que la longitud de las
claves sea muy grande y, por lo tanto, sea más difícil guardarlas en secreto.
Además, se da la paradoja que si tenemos un canal seguro para intercambiar
las claves, entonces también podemos utilizarlo para intercambiar los mensa-
jes, puesto que tienen la misma longitud.

El cifrado en flujo surge como una aproximación optimizada al cifrado de


Vernam. La idea es construir una clave suficientemente larga (como mínimo
de la longitud del mensaje) a partir de una clave inicial corta. Esto se consigue
utilizando lo que se denomina un generador seudoaleatorio. Este generador
expande una clave pequeña, llamada semilla; así se obtiene una mucho más
larga. Es necesario que la operación de expansión tenga ciertas características,
puesto que la secuencia que resultará es la que se utilizará para cifrar el texto
en claro. Será necesario, pues, ver qué propiedades tendrán que cumplir estas
secuencias y estudiar qué tipo de generadores hay para obtenerlas.

El cifrado en flujo es un cifrado de clave compartida, puesto que la semilla (que


se usa para obtener la secuencia cifrante) es utilizada tanto para cifrar como
para descifrar, y es, por lo tanto, compartida entre el emisor y el receptor.

Una alternativa al cifrado en flujo es lo que se denomina cifrado en bloque.


Este cifrado se incluye también dentro de los criptosistemas de clave compar-
tida, puesto que la clave que se utiliza para cifrar y descifrar es la misma y la
comparten emisor y receptor. La diferencia básica entre el cifrado en flujo y el
cifrado en bloque es la utilización de memoria en los algoritmos de cifrado.

Como veremos en este módulo, el cifrado en flujo utiliza una clave diferente
para cada bit de información. Esta clave depende del estado inicial del gene-
rador, pero también del estado del generador en el momento de cifrar un bit
concreto. Por lo tanto, dos bits iguales se pueden cifrar de maneras diferentes
dependiendo del estado en que se encuentre el generador. En el cifrado en blo-
que esto no pasa. El cifrado en bloque actúan sin memoria y, por lo tanto, el
texto cifrado solo depende del texto en claro y de la clave. De este modo, dos
bloques de texto en claro iguales se cifran siempre del mismo modo cuando
se utiliza la misma clave.

c FUOC • PID_00235167 6 Criptografía de clave simétrica

Habrá que estudiar este hecho en detalle, puesto que si no se corrige, los siste-
mas de cifrado que resultan de él son bastante vulnerables, porque se pueden
insertar o borrar bloques de texto cifrado sin que se pueda detectar. Además,
el hecho de que dos bloques de texto en claro queden cifrados de una misma
manera, puede dar pistas para un posible criptoanálisis de tipo estadístico.

En cuanto a su utilización, el cifrado en bloque es bastante utilizado, puesto


que consiguen una velocidad aceptable de cifrado. En concreto, el cifrador en
bloque más usado es el Advanced Encryption Standard (AES), puesto que está
establecido como estándar por el Instituto Nacional de Estándares y Tecnolo-
gía (NIST) desde el año 2002.

c FUOC • PID_00235167 7 Criptografía de clave simétrica

Objetivos

En este módulo se estudiarán el cifrado en flujo y en bloque, que forman


parte de los criptosistemas de clave compartida. A continuación se fijan los
objetivos que el estudiante tiene que lograr:

1. Comprender el esquema general del cifrado en flujo.

2. Asimilar las características necesarias que tiene que cumplir una secuencia
seudoaleatoria para que sea utilizable en un esquema de cifrado en flujo.

3. Entender el funcionamiento de diferentes generadores seudoaleatorios.

4. Comprender el esquema general del cifrado en bloque y las características


comunes de todos ellos.

5. Entender los diferentes modos de operación del cifrado en bloque.

6. Conocer el funcionamiento del criptosistema AES.



c FUOC • PID_00235167 9 Criptografía de clave simétrica

1. Criptografía de clave simétrica o compartida


.

En este módulo didáctico introduciremos el cifrado de clave compartida.

Los criptosistemas de clave simétrica o compartida son aquellos en


los cuales el emisor y el receptor comparten una misma clave, que es la
que utilizan para cifrar y descifrar mensajes.

Es decir, en el cifrado de clave compartida, la clave que se utiliza para cifrar es


la misma que se usa para descifrar y, por lo tanto, en cualquier momento, el
emisor puede pasar a hacer de receptor y a la inversa, utilizando siempre las
mismas claves.

Por sus características, el cifrado de clave compartida no puede ofrecer la pro-


piedad de no-repudio. Como veremos más adelante, existen otras construc-
ciones que sí que nos permitirán ofrecer esta propiedad.

Los dos tipos de cifrado de clave simétrica más utilizados son el cifrado en
flujo y en bloque. La diferencia entre los dos tipos de cifrados radica en có-
mo se procesa la información: en el cifrado en flujo la información se cifra
bit por bit, es decir, los bits se cifran de manera individual, mientras que los
criptosistemas en bloque cifran un bloque entero de n bits a la vez.

c FUOC • PID_00235167 10 Criptografía de clave simétrica

2. El cifrado en flujo
.

De una manera esquemática, un criptosistema en flujo se puede expresar tal


como muestra la figura 1.

Figura 1. Esquema general en flujo

Tanto el emisor como el receptor disponen de una misma clave k, llamada se-
milla del generado, y de un mismo algoritmo determinista Alg, llamado gene-
rador seudoaleatorio. Al proporcionar la clave k como entrada al algoritmo,
este da como salida una secuencia s, que se denomina secuencia cifrante.

Para cifrar el mensaje, el emisor va sumando cada bit del mensaje m con ca-
da bit de la secuencia cifrante s, obteniendo el mensaje cifrado y. Cuando el
receptor recibe el mensaje cifrado y, utiliza el mismo algoritmo determinista
Alg y la clave k, que comparte con el emisor, para obtener la misma secuen-
cia cifrante. Así, sumando bit a bit el mensaje y que le llega con la secuencia
resultante del algoritmo s, obtiene el texto en claro m enviado por el emisor.
A lo largo de todo este módulo didáctico las secuencias con las que trabajare-
mos serán binarias y las operaciones a las que haremos referencia serán todas
módulo 2.

Para que este criptosistema sea seguro, es básico que la secuencia cifrante no Suma módulo 2

sea conocida, es decir, que en ningún momento se pueda saber cuál será el bit De manera equivalente,
de salida siguiente. Idealmente, lo que se necesita para la seguridad incondi- podemos pensar la suma
módulo 2 como una XOR.
cional es que la clave, en este caso la secuencia cifrante, sea completamente

c FUOC • PID_00235167 11 Criptografía de clave simétrica

aleatoria. En nuestro esquema no se puede dar esta condición, puesto que el


generador que utilizamos tiene que ser determinista, para que emisor y recep-
tor obtengan la misma secuencia cuando dan como entrada la misma clave
secreta. Así pues, la secuencia cifrante tendrá propiedades muy cercanas a las
que tiene una secuencia completamente aleatoria y, por lo tanto, se denomi-
nará secuencia seudoaleatoria.

Concretamente, si una secuencia no es aleatoria, quiere decir que a partir de


un cierto momento se repite. Esta subsecuencia que se va repitiendo es lo
que se denomina periodo. Lo importante, pues, es que esta subsecuencia, el
periodo, sea indistinguible de una secuencia completamente aleatoria de igual
longitud. Por eso esta secuencia tiene que cumplir ciertas propiedades que
veremos a lo largo de los apartados de este módulo.

No tenemos que olvidar que los criptosistemas de clave compartida basan su


seguridad en el hecho de que la clave utilizada para cifrar y descifrar solo es
conocida por el emisor y el receptor. En el cifrado en flujo, si bien la clave
no se utiliza directamente para cifrar, es igualmente necesario que no se haga
pública, puesto que el algoritmo determinista es conocido y, por lo tanto, se
podría obtener la secuencia cifrante a partir de él y la clave.

Si nos fijamos en el esquema de cifrado en flujo de la figura 1 vemos que, para No olvidemos el mundo
real
obtener el texto cifrado que enviamos al receptor, tenemos que ir sumando
el texto en claro con la secuencia cifrante que resulta del generador seudo- Los teléfonos móviles con
tecnología GSM incorporan
aleatorio. Esto quiere decir que la velocidad de transmisión de los datos entre
un cifrador en flujo. Sería
el emisor y el receptor viene determinada por el mínimo entre la velocidad impensable que el coste
económico del cifrador
de generación del mensaje, m, y la velocidad de generación de la secuencia
incrementara el precio del
cifrante, s. Así pues, hay que tener en cuenta este hecho cuando estudiamos teléfono móvil. Tampoco no
sería admisible que la
los posibles generadores seudoaleatorios, puesto que en función de su imple- velocidad de la comunicación
mentación (ya sea en hardware o en software), obtendremos una velocidad u se viera afectada por la
velocidad de este cifrador.
otra. Es necesario que el algoritmo que nos genere la secuencia sea de fácil im-
plementación, tanto desde el punto de vista de complejidad como en cuanto
a la vertiente económica.

2.1 Periodo

Hemos visto que para implementar un criptosistema de cifrado en flujo nece-


sitamos un algoritmo que nos dé como salida la secuencia cifrante. Como ya
hemos dicho anteriormente, el hecho de que este algoritmo sea determinista
hace que la secuencia que resulta no sea completamente aleatoria y, por lo
tanto, implica que a partir de un cierto momento se repite. Esta subsecuencia
que se va repitiendo es lo que se denomina periodo. Formalmente, sea {si }i≥0
una secuencia periódica, el periodo p es el entero más pequeño:

si+p = si

Esto pasa para todo i ≥ 0.



c FUOC • PID_00235167 12 Criptografía de clave simétrica

Dado que el periodo se repite, una vez se conoce, ya se puede determinar exac-
Periodo grande
tamente toda la secuencia cifrante y, por lo tanto, el criptosistema se puede
romper. Por eso es necesario que las secuencias que se utilizan para el cifra- El concepto de periodo
do en flujo tengan un periodo muy grande, puesto que de este modo tardan grande es relativo al cifrador
y a la aplicación. Un periodo
mucho en repetirse y, por lo tanto, es más difícil predecir su salida. de 232 puede no ser lo
suficientemente largo para
un cifrador que cifre a 1
megabyte/seg, ya que a esta
velocidad el período se repite
2.2 Aleatoriedad solo cada 8,5 minutos.

Como hemos comentado, el cifrado en flujo usan generadores seudoaleato-


rios.

. Determinismo de los
PRNG
Un generador seudoaleatorio (o PRNG, del inglés pseudo random num-
Notad que los PRNG son
ber generator) es un algoritmo determinista que genera una secuencia algoritmos deterministas, es
a partir de una entrada que denominamos semilla. La secuencia gene- decir, dado un PRNG y una
semilla, la secuencia
rada por un PRNG intenta reproducir las propiedades que tendría una generada será siempre la
secuencia generada de manera aleatoria. misma.

Los generadores seudoaleatorios criptográficamente seguros (o CSPRNG,


PRNG y CSPRNG
del inglés cryptographycally secure pseudo random number generator) son un tipo
especial de PRNG que genera secuencias no predecibles. En concreto, para que Todos los CSPRNG son PRNG,
pero la afirmación contraria
un PRNG sea considerado un CSPRNG, es necesario que las secuencias que no es cierta, es decir, un
genera tengan dos propiedades. A partir de k bits de la secuencia generada, generador seudoaleatorio no
tiene por qué ser
si+1 ,si+2 , · · · ,si+k , podemos afirmar: criptográficamente seguro.

1) No existe un algoritmo en tiempo polinomial que pueda predecir el si-


guiente bit de la secuencia, si+k+1 , con una probabilidad más alta del 50%.

2) No es computacionalmente posible predecir el bit anterior de la secuencia, si .

El concepto de complejidad lineal nos mide el grado de impredictibilidad de


una secuencia. En concreto, la complejidad lineal nos dice qué parte de la
secuencia hay que conocer para poderla predecir toda. Para calcular la com-
plejidad lineal utilizaremos el algoritmo de Massey. La definición formal de la
complejidad lineal va ligada al concepto de LFSR, que presentaremos más ade-
lante. Así pues, detallaremos la definición formal de complejidad lineal una
vez hayamos introducido la arquitectura de los LFSR.

Una configuración bastante habitual en criptografía es usar CSPRNG con va- Ruido térmico
lores verdaderamente aleatorios como semillas. Conseguir números (verdade-
Se llama ruido térmico o
ramente) aleatorios no es una tarea sencilla. Para generarlos hay que disponer ruido de Johnson-Nyquist a
las fluctuaciones eléctricas
de una fuente de aleatoriedad natural. Adicionalmente, si esta fuente de alea-
generadas por la agitación
toriedad se quiere usar en criptografía, habrá que asegurar también que un térmica de los electrones.
adversario no es capaz de manipularla ni observarla. Existen, principalmente,

c FUOC • PID_00235167 13 Criptografía de clave simétrica

dos maneras de obtener valores realmente aleatorios: por medio de hardware,


explotando la aleatoriedad que se produce en fenómenos físicos, o por me-
dio de software, a partir de observaciones afectadas por el comportamiento
del usuario. Así, por ejemplo, se puede usar el sonido capturado por un mi-
crófono, el ruido térmico de una resistencia o de un diodo, las turbulencias
creadas por los aires en según qué dispositivos o el movimiento del ratón.

2.2.1 Test de aleatoriedad del NIST

El National Institute of Standards and Technology (NIST) de los Estados Uni-


Test estadísticos
dos dispone de un banco de pruebas estadísticas para evaluar la aleatoriedad
de secuencias binarias generadas por PRNG. El banco consta de quince test. El lector interesado en los
detalles sobre los test
En este subapartado, describiremos los test más sencillos, con el objetivo de estadísticos puede consultar
dar una idea de lo que se busca en la evaluación de la aleatoriedad de secuen- la publicación original del
NIST: A. Rukhin; J. Soto; J.
cias. Para describir los test, supondremos que se evalúa la secuencia binaria Nechvatal y otros (2010). A
S = {s1 ,s2 , · · · ,sn } de tamaño n bits. Statistical Test Suite for
Random and Pseudorandom
Number Generators for
Cryptographic Applications.
El test de frecuencia de bits individuales comprueba que la proporción de
unos y ceros de la secuencia proporcionada se aproxima a la que observaría-
mos en una secuencia verdaderamente aleatoria, es decir, que la proporción
de unos y ceros es similar y se aproxima, por lo tanto, a 0.5. Para hacerlo, en
primer lugar se transforma la secuencia binaria de entrada en una secuencia
de –1 y 1:

X = {xi | xi = 2 · si – 1,∀i ∈ [1,n]}


Superación de los test

Así pues, los ceros se convierten en –1 y los unos siguen representándose con 1. A partir del valor sobs , los test
del NIST calculan el nivel de
significación observado para
Después, se calcula sobs : decidir si la secuencia supera
∑n o no la comprobación. En
| xi | concreto, se considera que la
sobs = √
i=1
n secuencia supera la prueba si
el valor p és más elevado o
igual que 0.01.
Si la secuencia es aleatoria, sobs tenderá hacia 0, mientras que si hay demasia-
dos ceros o demasiados unos en la secuencia, entonces sobs tenderá a ser más
Superación del test
grande que cero.
En este caso, el nivel de
Ejemplo de cálculo de la prueba de frecuencia de bits individuales significación para
sobs = 1.1339 es de 0.256, lo
Dada la secuencia S = {0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0} con n = 28, que hace que el test se
procedemos a calcular sobs . considere superado, ya que
0.256 ≥ 0.01
En primer lugar, transformamos la secuencia de ceros y unos en una secuencia de –1 y 1:

X = { – 1,1, – 1,1, – 1, – 1, – 1, – 1, – 1, – 1, – 1,1,1, – 1, – 1,1,1,1,1, – 1,1, – 1,


1, – 1,1, – 1, – 1, – 1}

Seguidamente, calculamos el valor sobs :

∑28
| xi | | –6 |
sobs = √i=1 = √ ≈ 1.1339
28 28

c FUOC • PID_00235167 14 Criptografía de clave simétrica

El test de frecuencia en un bloque comprueba que el número de ceros y unos


en un bloque de m bits sea aproximadamente m/2. Para hacerlo, se particiona
la secuencia que se quiere evaluar en b = ⌊n/m⌋ bloques m de bits, descartando
los bits sobrantes.

k=1 k=2 k=b


z }| {z }| { z }| {
s1 , s2 , . . . ,sm sm+1 ,sm+2 , . . . ,sm+m ... s(b–1)m+1 , . . . ,s(b–1)m+m

m bits m bits m bits

Entonces, para cada bloque k (con k = 1, · · · ,b), se calcula:

∑m
j=1 s(k–1)m+j
πk =
m

Es decir, se calcula la proporción de unos que hay en cada bloque.

Finalmente, se calcula:

2

b
χobs = 4m (πk – 1/2)2
k=1

Ejemplo de cálculo de la prueba de frecuencia en un bloque

Dada la misma secuencia que en el ejemplo anterior:


S = {0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0} con n = 28, procedemos a cal-
cular πk para cada bloque con m = 6.

En primer lugar, dividimos la secuencia en b = ⌊n/m⌋ = ⌊28/6⌋ = 4 bloques m = 6 de bits.

k=1 k=2 k=3 k=4


z }| {z }| {z }| {z }| {
0,1,0,1,0,0 0,0,0,0,0,1 1,0,0,1,1,1 1,0,1,0,1,0 1,0,0,0

6 bits 6 bits 6 bits 6 bits

Los últimos 4 bits de la secuencia se descartan y no se utilizan en el test.

Entonces, para cada bloque k (con k = 1, · · · ,4), calculamos πk :

∑m ∑6
j=1 s(k–1)m+j j=1 sj 2
π1 = = = = 1/3
m 6 6

∑6
j=1 s6+j
π2 = = 1/6
6

∑6
j=1 s2·6+j 4
π3 = = = 2/3
6 6

∑6
j=1 s3·6+j 3
π4 = = = 1/2
6 6

c FUOC • PID_00235167 15 Criptografía de clave simétrica

Y finalmente estamos en disposición de calcular χobs


2 :


b
2
χobs = 4m (πk – 1/2)2
k=1
Superación del test

En este caso, el nivel de



4
=4·6 (πk – 1/2)2 significación para χobs
2 =4

k=1
(teniendo en cuenta que
tenemos b = 4 bloques) es de
( ) 0.4060, lo que hace que el
= 24 · (1/3 – 1/2)2 + (1/6 – 1/2)2 + (2/3 – 1/2)2 + (1/2 – 1/2)2 test se considere superado,
ya que 0.4060 ≥ 0.01.

= 24 · (1/36 + 1/9 + 1/36 + 0) = 4

El test de ráfagas comprueba si el número de ráfagas tanto de unos como


de ceros de la secuencia se asemeja al que encontraríamos en una secuencia
aleatoria.

Definiremos una ráfaga como un conjunto de bits consecutivos iguales, es


decir, una ráfaga de longitud k consta de los elementos st , · · · ,st+k–1 , tales que
st–1 ̸= st = st+1 = · · · = st+k–1 ̸= st+k .

Para evaluar el test de ráfagas, se calcula:

( n–1 )

Vn (obs) = r(i) +1
i=1

donde r(i) es la función:




 0, si si = si+1
r(i) =


1, en otro caso

Valores más grandes de Vobs indican que las oscilaciones de valores en la se-
cuencia evaluada (es decir, los cambios de uno a cero o de cero a uno) suceden
Oscilaciones
rápidamente, mientras que valores pequeños indican que las oscilaciones son
lentas. La secuencia 10101010 oscila
muy rápidamente, ya que
cada bit cambia el valor
El NIST recomienda que las secuencias evaluadas con este test tengan como respecto al bit anterior. En
cambio, la secuencia
mínimo 100 bits (es decir, n ≥ 100). Adicionalmente, este test tiene como 11111100 oscila muy
prerrequisito que la secuencia pase el test de frecuencia de bits individuales lentamente, ya que solo se
produce un cambio de valor
que hemos descrito anteriormente. Es decir, si una secuencia no supera el test en toda la secuencia.
de bits individuales, entonces ya no se realiza el test de ráfagas.

Ejemplo de cálculo de la prueba de ráfagas

Siguiendo con la evaluación de la misma secuencia que en los ejemplos anteriores:


S = {0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,1,0,1,0,1,0,0,0} con n = 28. Notad que si si-
guiéramos las recomendaciones del NIST, no efectuaríamos el test de ráfagas sobre esta
secuencia, puesto que esta no tiene una longitud mínima de 100 bits. A modo de ejem-
plo, sin embargo, realizaremos los cálculos para esta secuencia.

c FUOC • PID_00235167 16 Criptografía de clave simétrica

En primer lugar, comprobamos que la secuencia supere el test de frecuencia de bits indi-
viduales. Como hemos visto en el primer ejemplo, la secuencia supera este test, así que
procedemos a calcular V28 (obs).

( n–1 )
∑ Superación del test
Vn (obs) = r(y) +1
i=1
En este caso, el nivel de
significación para
= (1 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 1 + 0+ Vn (obs) = 15 (y teniendo en
cuenta que la secuencia tiene
28 bits y una proporción de
+ 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0) + 1 = 15
11/28) es de 0.5151, de
manera que el test se
considera superado, ya que
0.5151 ≥ 0.01.
Como se ha comentado, el banco de pruebas del NIST recoge quince test dife-
rentes. Además de los tres comentados, los otros test comprueban la aparición
de las ráfagas de unos más largas, la repetición de subsecuencias concretas
dentro de la secuencia, la facilidad de comprimirla, su complejidad lineal o
sus propiedades espectrales, entre otros.

c FUOC • PID_00235167 17 Criptografía de clave simétrica

3. Generadores lineales de secuencia cifrante


.

En el apartado 2, hemos estudiado las propiedades que deben tener las se-
cuencias cifrantes para poderlas utilizar en criptosistemas de cifrado en flujo.
Tratamos ahora cómo tienen que ser los algoritmos deterministas que generan
estos tipos de secuencias.

Desde un punto de vista general tenemos dos tipos de generadores: los lineales
y los no lineales.

Los generadores lineales son aquellos que solo realizan operaciones lineales
sobre los elementos de entrada para obtener la secuencia de salida. Contraria-
mente, los generadores no lineales son los que realizan, además, operaciones
no lineales, como podrían ser permutaciones.

3.1 Generadores congruenciales

Los generadores congruenciales se basan en ecuaciones modulares recurren-


tes del tipo:
xn = (axn–1 + b) mod m

En este caso el valor x0 sería la semilla de la secuencia cifrante. Un criptosiste-


ma que utilice un generador de este tipo tendrá como clave secreta los valores
{x0 ,a,b,m} y, para que el periodo sea máximo, será necesario que cumpla que
mcd(a,m) = 1.

Hay que decir, sin embargo, que estos tipos de generadores seudoaleatorios
no son seguros desde un punto de vista criptográfico, puesto que se ha podi-
do demostrar que con pocos valores xi conocidos ya se pueden averiguar los
parámetros secretos {x0 ,a,b,m}. Incluso solo con una parte de los bits que for-
man los xi , pero, eso sí, conociendo los parámetros {a,b,m}, se puede llegar a
determinar el valor de la semilla x0 .

Aun así, estos tipos de generadores son muy utilizados en sistemas informáti-
cos para aplicaciones no criptográficas.

Ejemplo 1

La función rand() del sistema UNE BSD utiliza el generador congruencial afín siguiente:

xn = (1103515245xn–1 + 12345) mod 231

en el que la semilla especifica el valor inicial.



c FUOC • PID_00235167 18 Criptografía de clave simétrica

3.2 Registros de desplazamiento realimentados linealmente

Un registro de desplazamiento realimentado linealmente (o LFSR, del inglés


linear feedback shift register) de longitud n es un dispositivo físico o lógico for-
mado por n celdas de memoria y n puertas lógicas que tiene una estructura
como se muestra en la figura 2.

Figura 2. Esquema general de un LFSR

Inicialmente, las celdas contienen los valores de entrada, y a cada impulso


de reloj el contenido de la celda si se desplaza a la celda si–1 realizando las
operaciones asociadas. De este modo, se genera un nuevo elemento, sn+1 , que
es determinado por la expresión:

sn+1 = c1 sn + · · · + cn s1 (1)

en que los ci ∈ {0,1} corresponden a los valores de las puertas lógicas del
esquema. Es decir, los coeficientes serán 1 si hay una conexión y 0 si no la
hay. Este nuevo elemento, sn+1 , se sitúa en la celda sn , que ha quedado vacía
debido al desplazamiento.

El conjunto de valores contenidos en cada celda en un instante de tiempo se


denomina estado. El estado inicial es el estado en el que se encuentra el LFRS
en el momento de empezar el proceso.

Ejemplo del funcionamiento de un LFSR

Este ejemplo sigue el funcionamiento del LFSR de cuatro celdas que encontraréis repre-
sentado en la figura 3.

Figura 3. Ejemplo de un LFSR



c FUOC • PID_00235167 19 Criptografía de clave simétrica

Como se puede ver, el estado inicial es 1010, que corresponde al impulso de reloj t = 0.
La tabla 1 muestra la evolución del LFSR en los diferentes instantes de tiempos.

Tabla 1. Evolución del LFSR en el tiempo


Impulso de reloj (t) s4 s3 s2 s1 Salida
0 1 0 1 0 0
1 0 1 0 1 1
2 0 0 1 0 0
3 0 0 0 1 1
4 1 0 0 0 0
5 0 1 0 0 0
6 1 0 1 0 0
7 0 1 0 1 1
.. .. ..
. . .

En t = 0, las celdas s1 y s3 contienen un 0 y, por lo tanto, el bit s4 será 0 al siguiente


impulso de reloj (t = 1). Notad que el resto de valores se desplazan: a t = 1 la celda s1
contiene el valor que había en t = 0 en la celda s2 , la celda s2 contiene el valor que había
en s3 , etc.

En general, por i ≥ 1 tenemos:

s1 (t = y) = s2 (t = y – 1)

s2 (t = y) = s3 (t = y – 1)

s3 (t = y) = s4 (t = y – 1)

s4 (t = y) = s1 (t = y – 1) ⊕ s3 (t = y – 1)

Si nos fijamos en el impulso de reloj t = 6, volvemos a tener el estado inicial y, por


lo tanto, a partir de aquí la secuencia se vuelve a repetir. Esta secuencia, pues, tiene
periodo 6.

Una vez definido lo que es un LFSR podemos pasar a hacer un estudio algo
más exhaustivo para determinar las características más importantes. La ven-
taja principal de los LFSR es que tienen una formulación matemática muy
simple, como veremos a continuación y, por lo tanto, se pueden estudiar de
forma bastante clara y completa. Además, como se definen por medio de cel-
das y puertas lógicas, se implementan fácilmente en el hardware, hecho que
permite obtener generadores de gran velocidad.

Primeramente hay que hacer notar que el estado inicial de un LFSR no puede
ser el cero. Si así fuera, la secuencia que produciría sería también toda de ceros,
puesto que todas las operaciones son lineales. Se dice que el estado que tan
solo tiene ceros es un estado absorbente. También conviene destacar que el
periodo máximo de un LFSR es 2n – 1. Este valor se obtiene de considerar todos
los estados posibles 2n y eliminar el estado absorbente.

Si nos fijamos en la expresión 1 nos daremos cuenta de que toda la secuencia


de salida de un LFSR queda determinada por el estado inicial {s1 , · · · ,sn } y por
la relación

n
sn+k = ci sn+k–i para k ≥ 0 (2)
i=1

en que ci ∈ {0,1} por 1 ≤ i ≤ n.



c FUOC • PID_00235167 20 Criptografía de clave simétrica

El polinomio de conexiones de un LFSR de longitud n es el polinomio de


grado n.

C(x) = 1 + c1 x1 + c2 x2 + · · · + cn xn

en que los ci ∈ {0,1} corresponden a los valores de las puertas lógicas de la


figura del esquema general de un LFSR.

Polinomio de conexiones del LFSR del ejemplo anterior

El polinomio de conexiones correspondiente a el LFSR del ejemplo anterior es:

C(x) = 1 + 0 · x1 + 1 · x2 + 0 · x3 + 1 · x4 = 1 + x2 + x4

Un LFSR queda determinado por su polinomio de conexiones. Una se-


cuencia queda determinada por el polinomio de conexiones y por su
estado inicial.

Definido el polinomio de conexiones, ya podemos determinar las característi-


cas del LFSR de acuerdo con las de su polinomio de conexiones:

1) Polinomio de conexiones factorizable: los LFSR que tienen polinomios de


conexiones factorizables generan secuencias que dependen del estado inicial.
Además, el periodo de estas secuencias es siempre más pequeño que el periodo
máximo que puede tener un LFSR, que es 2n – 1.

2) Polinomio de conexiones irreducible: las secuencias generadas por los


LFSR que tienen polinomios de conexiones irreducibles no dependen del esta-
do inicial, sino que simplemente quedan desplazadas. En este caso, el periodo
será un divisor de 2n – 1.

3) Polinomio de conexiones primitivo: un LFSR con polinomio de conexio-


Polinomio primitivo
nes primitivo tiene la secuencia de salida de periodo máximo 2n – 1. Esta se-
cuencia de periodo máximo se obtiene para cualquier estado inicial, salvo el Un polinomio primitivo
también es irreductible. Por
estado absorbente.
lo tanto, las secuencias
generadas por los LFSR con
polinomios de conexiones
primitivos no dependerán del
Considerando las propiedades de las secuencias según sus polinomios de co- estado inicial.
nexiones, vemos que para esquemas de cifrado en flujo es aconsejable usar la
que determina el periodo máximo.

Ejemplo de LFSR con polinomio de conexiones primitivo

El polinomio 1 + x3 + x4 (con coeficientes a Z2 ) es primitivo. Construimos un LFSR con


este polinomio de conexiones y observamos la secuencia de salida del LFSR al usar los
valores 0001 como estado inicial. Ved este LFSR en la figura 4.

c FUOC • PID_00235167 21 Criptografía de clave simétrica

Figura 4. LFSR con el polinomio de conexiones 1 + x3 + x4

La secuencia generada será:

L1 = 1000100110101111000 . . .

Efectivamente, el periodo de la secuencia generada es 2n – 1 = 24 – 1 = 15; a partir del bit


16, la secuencia vuelve a repetirse.

Si generamos una segunda secuencia con el mismo LFSR, pero usando los valores 1010
como estado inicial, la secuencia que se obtiene es:

L2 = 0101111000100110101 . . .

De nuevo, el periodo de la secuencia generada es 15.

El polinomio de conexiones que hemos usado es también irreducible. Por lo tanto, las
secuencias generadas con diferentes estados iniciales son las mismas, pero con un des-
plazamiento. En efecto, podemos ver que la secuencia L2 es la secuencia L1 desplazada 9
posiciones a la izquierda:

L1 = 100010011 0101111000100110101
L2 = 0101111000100110101

Para acabar, aprovecharemos el ejemplo para mostrar por qué no podemos generar una
secuencia de periodo superior con un LFSR de 4 celdas. La tabla 2 muestra todos los
estados por los cuales pasa el LFSR a la hora de generar la secuencia L1 :

Tabla 2. Estados del LFSR


t Estado Salida t Estado Salida
0 0 0 0 1 1 8 0 1 0 1 1
1 1 0 0 0 0 9 1 0 1 0 0
2 0 1 0 0 0 10 1 1 0 1 1
3 0 0 1 0 0 11 1 1 1 0 0
4 1 0 0 1 1 12 1 1 1 1 1
5 1 1 0 0 0 13 0 1 1 1 1
6 0 1 1 0 0 14 0 0 1 1 1
7 1 0 1 1 1 15 0 0 0 1 1

Fijaos que el estado t = 15 corresponde al estado inicial (t = 0), por cuyo motivo la
secuencia empieza a repetirse. Notad también que el LFSR pasa por quince estados dife-
rentes, que son todos los posibles estados que se pueden generar con 4 bits, exceptuando
el estado absorbente (0000). El periodo es, pues, máximo, y no hay manera de generar un
periodo superior con la estructura de un LFSR, puesto que no hay más estados posibles.

Adicionalmente, fijaos que el estado t = 9 corresponde al estado inicial con el que gene-
ramos la secuencia L2 .

Número de polinomios
primitivos
3.3 Limitaciones de los generadores lineales
No debemos olvidar que el
número de polinomios
Ya hemos puesto de relieve que los LFSR se comportan muy bien en términos
primitivos de grado n viene
de facilidad de análisis, de implementación y de velocidad. Uno de los puntos dado por la expresión
ϕ (2n – 1)/n, donde ϕ es la
función totiente de Euler.

c FUOC • PID_00235167 22 Criptografía de clave simétrica

negativos de estos generadores es que para que el periodo 2n – 1 sea grande es


necesario que la longitud del LFSR también lo sea. Esto puede representar un
problema, puesto que el coste de encontrar polinomios primitivos con grado
grande es bastante elevado.

A pesar de las ventajas e inconvenientes presentados, la razón principal por la


que los LFSR no sirven por sí solos para sistemas de cifrado en flujo es que son
fácilmente predecibles.

En efecto, supongamos que conocemos 2n bits consecutivos, sk+1 ,sk+2 , · · · ,sk+2n ;


entonces, podemos determinar los coeficientes del polinomio de realimenta-
ción, ci , y, por lo tanto, toda la secuencia. Para hacerlo solo hay que basarse
en la expresión 2 para plantear el sistema de ecuaciones siguiente:
Resolución del sistema de
ecuaciones
    
 sk+1 sk+2 ··· sk+n   cn   sk+n+1  Notad que este sistema de
    
     ecuaciones se puede resolver
 s sk+3 ··· sk+n+1   cn–1    fácilmente con cualquier
 k+2    sk+n+2 
  =  método de resolución de
 .. .. ..   ..   .. 
 . . ··· .  .   .  sistemas de ecuaciones
     lineales, por ejemplo, el
    
método de Gauss. Para una
sk+n sk+n+1 ··· sk+2n–1 c1 sk+2n
introducción a los sistemas
de ecuaciones lineales, podéis
consultar el primer capítulo
del libro Elementary linear
Por lo tanto, tenemos un sistema de n ecuaciones con n incógnitas ci , por 1 ≤ algebra, de H. Anton.
i ≤ n, con lo que podemos determinar todos los coeficientes. Así pues, a la hora
de utilizar un generador para un proceso de cifrado en flujo, hay que fijarse
también, como ya hemos mencionado anteriormente, en su predictibilidad,
es decir, la denominada complejidad lineal.

Dado que cualquier secuencia periódica se puede generar con un LFSR no


singular, J. L. Massey definió la complejidad lineal de una secuencia de la
siguiente manera:

La complejidad lineal de una secuencia es el número de celdas del LFSR


más corto capaz de generarla.

Por lo tanto, una secuencia generada por un LFSR de longitud n tiene obvia-
Algoritmo de Massey
mente como mucho complejidad lineal n, muy baja comparada con el pe-
riodo, 2n – 1. El mismo Massey propuso un algoritmo que, a partir de una Massey propuso un algoritmo
para sintetizar el LFSR más
secuencia, determina el LFSR mínimo que la genera con el estado inicial co- corto capaz de generar una
rrespondiente. secuencia en 1969 en el
artículo “Shift-Register
Synthesis and BCH
decoding”.
Para disminuir la predictibilidad de la secuencia de cifrado es necesario, pues,
aumentar la complejidad lineal de la secuencia de cifrado, que convendría que
fuera de longitud cercana a la del periodo. Una forma de hacerlo es basándose
en operaciones no lineales, tal como veremos más adelante.

c FUOC • PID_00235167 23 Criptografía de clave simétrica

4. Generadores no lineales
.

A continuación analizaremos algunos de los generadores no lineales destina-


dos a aumentar la complejidad lineal de las secuencias en flujo que se usan en
la actualidad. En concreto, describiremos el A5 y el Trivium.

4.1 A5

El A5 es uno de los algoritmos de cifrado en flujo que más se usan actualmen- GSM

te, en parte por su utilización para el cifrado de datos en las transmisiones GSM son las siglas de global
de la red GSM. El A5 dispone de cuatro variantes, denotadas con los nombres system for mobile
communication, la red que
A5/0, A5/1, A5/2 y A5/3. El A5/0 no usa cifrado (devuelve el mismo texto en englobaba más del 80% de
claro), el A5/1 corresponde a la versión original del algoritmo que se usa en las conexiones móviles en
2010. El uso de la red ha ido
Europa, el A5/2 es un algoritmo de cifrado más débil creado para poder cum- menguando con la aparición
plir con las regulaciones para exportar criptografía (y que se usa en los Estados de redes con más ancho de
banda, como por ejemplo el
Unidos) y el A5/3 es un algoritmo de cifrado totalmente diferente (añadido 3G o 4G.
con posterioridad). En este subapartado, describiremos el funcionamiento del
algoritmo A5/1.

El A5 empezó a utilizarse en la red GSM sin hacer pública su especificación, Principio de Kerckhoffs
siguiendo el principio de seguridad por oscuridad (en inglés, security through
Recordemos que el principio
obscurity). El uso de este paradigma está totalmente desaconsejado por los ex- de Kerckhoffs postula que un
pertos, puesto que viola el principio de Kerckhoffs. A pesar de no hacerse pú- criptosistema debe ser seguro
aunque toda la información
blico oficialmente, un primer borrador del algoritmo fue publicado en 1994 sobre el criptosistema sea
y la especificación completa fue finalmente obtenida a través de un proceso pública, exceptuando la
clave, que debe permanecer
de ingeniería inversa del firmware de un teléfono móvil y dada a conocer al privada. Es decir, la seguridad
público en 1999. de un criptosistema debe
recaer únicamente en el
secreto de la clave.

El criptosistema A5/1 es un criptosistema en flujo que utiliza una combinación


no lineal de la salida de tres LFSR. Si pensamos que el A5/1 cifra cadenas de
texto en claro de 228 bits (tramas de bits), podemos dividir el funcionamiento
del A5/1 en tres etapas:

1) la inicialización de los LFSR,

2) la obtención de los 228 bits de la secuencia de cifrado a partir del movi-


miento de los LFSR,

3) el cifrado del texto en claro propiamente dicho, que sigue el procedimiento


habitual en los cifrados en flujo, realizando una XOR de la secuencia de cifrado
con el texto en claro.

c FUOC • PID_00235167 24 Criptografía de clave simétrica

Para cifrar 228 bits más habrá que volver a reinicializar los LFSR, obtener los
nuevos 228 bits de la secuencia cifrante y hacer la XOR con los nuevos bits de
texto en claro.

La inicialización de los tres LFSR que forman el A5/1 no se limita a dar sus
valores iniciales, sino que el contenido inicial de las celdas de los LFSR se
calcula a partir de unas claves de entrada y de unas transformaciones que
describiremos más adelante. Como la inicialización de los LFSR se hace a partir
de mismo funcionamiento del sistema, pasamos primero a describir cómo se
obtienen los bits de la secuencia de cifrado.

El A5/1 tiene una estructura formada por tres LFSR, tal como se muestra en la
figura 5.

Figura 5. Esquema del A5

La tabla 3 detalla las longitudes de cada uno de los LFSR del A5/1, así como
sus polinomios de conexiones.

Tabla 3. Descripción de los LFSR del A5


LFSR Longitud Polinomio de conexiones Clocking bit
1 19 x 19 + x 18 + x 17 + x 14 +1 9
2 22 x 22 + x 21 + 1 11
3 23 x 23 + x 22 + x 21 + x 8 + 1 11

La no linealidad del sistema viene dada porque en cada impulso de reloj no


todos los LFSR avanzan. Solo lo hacen aquellos LFSR cuyos bits son mayoría
en las celdas llamadas clocking bit (en el caso del esquema, los clocking bits son
las celdas marcadas en gris, es decir, la celda 9 para el primer LFSR y las celdas
11 para el segundo y tercero). Este esquema se conoce como clocking irregular
según la función mayoritaria.

Así, por ejemplo, si en la celda 9 del primer LFSR hay un 1, y en las celdas
11 del segundo y tercero LFSR hay un 0, solo avanzarán el segundo y el tercer
LFSR, que tienen un 0. Si los tres son iguales, entonces avanzan todos. De este
modo se van obteniendo las salidas de cada uno de los LFSR que forman la
XOR, que acabará proporcionando cada bit de la secuencia de cifrado.

c FUOC • PID_00235167 25 Criptografía de clave simétrica

Ejemplo de una iteración de la A5

En el instante t tenemos los estados internos siguientes en los LFSR:


Agrupación de bits
LFSR1: 1011100011 011000010
LFSR2: 1011011011 1101000010 01 La agrupación de bits de 10
LFSR3: 1110111110 0111001000 001 en 10 responde únicamente a
cuestiones estéticas: se ha
Así pues, la salida en este mismo instante de tiempo t será: escogido esta representación
para que sea más fácil de leer.
z=0⊕1⊕1=0

Se calcula a partir de la salida de los tres LFSR (los bits subrayados en los estados internos).

Para calcular el estado de los LFSR en el instante de tiempo t + 1, observaremos el bit de


clocking de cada LFSR (indicado en negrita). En este caso, los bits de clocking son 1, 1 y 0
para el LFSR 1, 2 y 3, respectivamente. Por lo tanto, el bit mayoritario es 1, y avanzarán,
pues, los LFSR 1 y 2. Así, el estado interno de los LFSR a t + 1 es:

LFSR1: 1101110001 101100001


LFSR2: 1101101101 1110100001 00
LFSR3: 1110111110 0111001000 001

Pasamos ahora a describir el proceso de inicialización de A5. La inicialización


requiere dos valores, una clave de sesión de 64 bits y un número de trama de
22 bits, y consta de cuatro pasos:

1) En primer lugar, se llenan todos los registros de los tres LFSR con el valor 0.

2) Seguidamente, se ejecutan 64 impulsos de reloj de los tres LFSR sin usar


clocking irregular. Es decir, a cada impulso de reloj, los tres LFSR avanzan. La
particularidad de este paso es que el bit de retroalimentación del LFSR hace
una XOR con un bit de la clave de sesión antes de ser insertado en la primera
celda del LFSR. Cada una de las 64 pulsaciones usa uno de los bits de la clave
de sesión diferente, de manera secuencial.

3) De forma similar al paso anterior, se ejecutan 22 impulsos de reloj de los


tres LFSR sin usar clocking irregular. Esta vez, sin embargo, el bit de retroali-
mentación hace una XOR con los bits del número de trama antes de insertarse
de nuevo en la celda correspondiente.

4) Finalmente, se realiza una fase de calentamiento, donde se ejecutan 100


impulsos de reloj con clocking irregular.

La figura 6 esquematiza el proceso utilizado para realizar los pasos 2 y 3 del


algoritmo de inicialización. Notad que los pasos 2 y 3 pueden unirse también
con un solo paso, donde se ejecutan 64+22 = 86 pulsaciones de reloj haciendo
una XOR con cada uno de los bits de la clave de sesión seguida del número de
trama.

Es importante remarcar que en estos pasos de inicialización lo que interesa es


el contenido que acabarán teniendo las celdas de los LFSR y, por lo tanto, los
bits de salida de los LFSR en todos estos pasos se descartan. Una vez inicia-
lizados los LFSR se procede a obtener los 228 bits de la secuencia de cifrado.

c FUOC • PID_00235167 26 Criptografía de clave simétrica

Finalmente, para cifrar una trama, se hará una XOR con los 228 bits obtenidos
de la salida de la A5/1 y los 228 bits que representan el texto en claro de la
trama.

Figura 6. Esquema de los pasos 2 y 3 de la inicialización del A5

Para cifrar la trama siguiente de 228 bits, procederemos a incrementar el con-


tador de trama y volveremos a realizar el proceso de inicialización con la mis-
ma clave de sesión y el nuevo valor de contador de trama.

Notad que la clave de sesión no se cambia por cada nueva trama que se quiere
cifrar, sino que se actualiza cuando la red decide volver a autenticar el dispo-
sitivo móvil.

4.2 Trivium

El Trivium es un generador seudoaleatorio diseñado por los criptógrafos Chris-


tophe de Cannière y Bart Preneel que aprovecha una implementación de hard-
ware muy simple con una velocidad elevada de generación de la secuencia,
hecho que lo hace interesante en dispositivos con unas capacidades limita-
das de procesado, como por ejemplo etiquetas RFID. Su funcionamiento está
descrito en el estándar ISO/IEC 29192-3.

El Trivium utiliza una clave de bits 80 y un vector de inicialización también


de 80 bits y permite generar secuencias de hasta 264 bits.

A diferencia del A5, el Trivium no se basa en LFSR, pero sí que está formado
por tres registros de desplazamiento, a pesar de que su realimentación no es
lineal. Es decir, las celdas que contienen los registros se desplazan a la derecha
como en un LFSR, pero su retroalimentación no está definida por una función
lineal. En la figura 7 podemos ver el esquema del Trivium.

c FUOC • PID_00235167 27 Criptografía de clave simétrica

Figura 7. Esquema del Trivium

Como se puede ver, el Trivium está formado por tres registros de desplaza-
miento, A, B y C, de 93, 84 y 111 celdas, respectivamente. La retroalimen-
tación de cada registro no es lineal y, además, la salida de cada uno de los
registros retroalimenta otro de los registros.

Por un lado, la salida del Trivium (z) viene determinada en cada instante por
las salidas de los tres registros (t a , t b , t c ):

z = ta + tb + tc

donde cada uno de los elementos son bits y, por lo tanto, la suma se realiza
módulo 2.

Cada una de las salidas t quedan determinadas por el estado de los registros
de la manera siguiente:

t a =sa93 + sa66

t b = sb84 + sb69

t c = sc111 + sc66

Para calcular el valor de la celda en la retroalimentación, se usan las salidas t,


de forma que la salida del registro a, t a se utiliza en el cálculo de la retroalimen-
tación del registro b; la salida del registro b, t b se usa en la retroalimentación
de c, i finalmente, la salida del registro c, t c se usa en la retroalimentación del
registro a. En concreto, la retroalimentación de cada registro viene dada por
las expresiones:

sanew = t c + (sc109 · sc110 ) + sa69

sbnew = t a + (sa91 · sa92 ) + sb78

scnew = t b + (sb82 · sb83 ) + sc87

donde, de nuevo, todos los operandos son bits y tanto la suma como el pro-
ducto de esta expresión se realizan módulo 2.

c FUOC • PID_00235167 28 Criptografía de clave simétrica

La tabla 4 resume las acciones que realiza cada posición específica de cada uno
de los registros.

Tabla 4. Posiciones destacadas de los registros del Trivium


Producto módulo 2
Registro Feedback bit Feedforward bit AND inputs
A 69 66 91,92 De manera equivalente,
B 78 69 82,83 también podemos pensar el
producto módulo 2 como un
C 87 66 109,110
AND.

Ejemplo de una iteración del Trivium

En el instante t tenemos los estados internos siguientes en los registros:


Agrupación de bits
A :. 0111111100 1101111010 1111100101 1101010001 0111100010 0110110001
1100110111 1111100110 0101011100 011
De nuevo, la agrupación de
B : 0100001010 1111011011 0110101000 1100010001 1111011000 1011110001 bits de 10 en 10 responde
1101110100 0111100001 1011
únicamente a cuestiones
estéticas: se ha escogido esta
C : 1111110100 0111011101 0101111100 1010111100 0100011100 0001111011 representación para que sea
1000011010 0111000011 1101010011 0101001000 0100000011 0
más fácil de leer. Notad, sin
embargo, que los 80 bits
Las salidas de los registros t corresponden a los valores: corresponden al estado del
registro, sin ninguna
separación entre ellos.
t a =sa93 + sa66 = 1 + 1 = 0

t b = sb84 + sb69 = 1 + 0 = 1

t c = sc111 + sc66 = 0 + 1 = 1

Notad que los bits involucrados en los cálculos de los valores t se encuentran subrayados
en el estado de los registros para facilitar la lectura.

Así, la salida del Trivium en el instante t corresponde a:

z = ta + tb + tc = 0 + 1 + 1 = 0

Podemos calcular también los bits que se usarán en la retroalimentación de los registros,
para actualizar el estado:

sanew = t c + (sc109 · sc110 ) + sa69 = 1 + (1 · 1) + 1 = 1 + 1 + 1 = 1

sbnew = t a + (sa91 · sa92 ) + sb78 = 0 + (0 · 1) + 0 = 0 + 0 + 0 = 0

scnew = t b + (sb82 · sb83 ) + sc87 = 1 + (0 · 1) + 0 = 1 + 0 + 0 = 1

Notad que los bits involucrados en los cálculos de los valores snews se encuentran indica-
dos en negrita en el estado de los registros para facilitar la lectura.

Los bits snew servirán para actualizar el estado interno de cada uno de los registros. A
modo de ejemplo, vemos cuál sería el estado del registro A en el instante t + 1:

A :. 1011111110 0110111101 0111110010 1110101000 1011110001 0011011000


1110011011 1111110011 0010101110 001

c FUOC • PID_00235167 29 Criptografía de clave simétrica

4.2.1 Inicialización

A la hora de cifrar un mensaje, en primer lugar habrá que realizar la fase de


inicialización del Trivium. Esta fase usa el vector inicial, VI, y la clave, k,
ambos valores de 80 bits. Entonces, se toman los 80 bits del vector inicial y
se ponen en las celdas de más a la izquierda del registro B. Seguidamente, se
toman los 80 bits de la clave y se ponen en las celdas de más a la izquierda del
registro A. El resto de celdas, de cualquiera de los tres registros, que no han
quedado llenas, se llenan con ceros, salvo las tres celdas de más a la derecha
del registro C, en las cuales se incluye un 1. La figura 8 muestra gráficamente
la inicialización del Trivium.

Figura 8. Fase de inicialización del Trivium

Una vez se han situado estos valores en los estados de los tres registros, se
ejecutan 1152 ciclos de reloj descartando los bits de salida de estas 1152 itera-
ciones.

Finalmente, una vez se ha inicializado el generador ya se puede utilizar la


secuencia de salida para cifrar el mensaje en claro. Así, cada bit de salida del
generador a partir de la iteración 1153 (una vez se ha inicializado el generador)
se combinará con una XOR con el bit de texto en claro que hay que cifrar.

Para descifrar un mensaje utilizando el Trivium, habrá que realizar exacta-


mente el mismo proceso, pero esta vez sobre el mensaje cifrado, proceso que
se puede llevar a cabo porque emisor y receptor comparten tanto el vector
inicial como la clave, puesto que estamos ante un criptosistema de clave si-
métrica.

c FUOC • PID_00235167 30 Criptografía de clave simétrica

5. El cifrado en bloque
.

El cifrado en bloque es uno de los elementos más importantes en criptogra-


fía y se usa en diferentes contextos. Por un lado, se puede usar directamente
en esquemas de cifrado para proporcionar confidencialidad. Por otro lado, sin
embargo, también se usa como primitivas básicas en otros esquemas criptográ-
ficos, como por ejemplo los generadores seudoaleatorios, las funciones hash o
los códigos de autentificación de mensajes (conocidos por sus siglas en inglés,
MAC, de message authentication codes).

Una cifrado en bloque es una función que recibe un bloque b de n bits de


texto en claro y devuelve un texto cifrado c también de n bits:

c = Ek (b)

Decimos que n es, entonces, la medida en bloque del criptosistema.

Notad que la función recibe como parámetro el valor k, que representa la


clave. La medida de la clave es la longitud en bits de k.

Para asegurar que al descifrar un texto cifrado con E (con una misma clave k)
obtenemos el texto original, la función E tiene que ser invertible. Así pues, el
cifrado en bloque también disponen de una función de descifrado, que realiza
el proceso inverso de la de cifrado:

b = Dk (c)

La mayoría de veces que usemos un criptosistema en bloque querremos cifrar


contenido que supera el tamaño del bloque del criptosistema utilizado. En
estos casos, lo que se hace es partir el texto que hay que cifrar, m, en varios
bloques, m1 ,m2 , . . . , cada uno de los cuales tiene la longitud correspondiente
al bloque para cifrar (n bits), y cifrar cada uno de los fragmentos. El proce-
dimiento que hay que seguir para cifrar cada uno de los fragmentos queda
determinado por el modo de operación.

5.1 Modos de operación

El modo de operación más sencillo se conoce como ECB (del inglés electronic
code book) y consiste en cifrar cada uno de los bloques del mensaje en claro,
mi , de forma individual, usando la misma clave. Así, se obtienen los bloques
cifrados ci , que se concatenan para formar el texto cifrado c. La figura 9 esque-
matiza el proceso de cifrado en modo ECB.

c FUOC • PID_00235167 31 Criptografía de clave simétrica

Figura 9. Esquema de cifrado con el modo ECB

Las propiedades principales que nos ofrece el modo ECB son las siguientes:

1) Los bloques de texto en claro idénticos resultan en bloques cifrados tam-


bién idénticos (si se usa la misma clave).

2) Cada bloque se cifra de manera independiente a los otros bloques.

3) Permite acceso aleatorio al contenido, es decir, es posible descifrar un blo-


que sin tener que descifrar los anteriores.

4) Los errores no se propagan: un error en un bloque afecta solo aquel bloque.

Como consecuencia inmediata de estas propiedades, el modo ECB es vulnera-


ble a ciertos ataques. Por un lado, por la propiedad 1: un atacante que observe
el texto cifrado puede aprender directamente si el texto original contiene blo-
ques iguales. Además, esta propiedad también puede facilitar los ataques de
tipo estadístico para obtener la clave k. Así mismo, el modo ECB no es capaz
de esconder los patrones en los datos. Por otro lado, por la propiedad 2: un ata-
cante puede reordenar el texto cifrado, haciendo que al descifrarse se obtenga
el texto en claro reordenado, sin que el receptor pueda detectar el cambio.
Adicionalmente, un atacante también puede insertar bloques de texto cifrado
o eliminarlos, sin que el descifrado falle.

Para ejemplificar las consecuencias de usar el modo ECB para cifrar datos de
tamaño superior al bloque, procedemos a cifrar una imagen con este modo,
y a visualizar el texto cifrado resultante también en forma de imagen (ved la
figura 10).

Figura 10. Ejemplo de cifrado de una imagen con ECB



c FUOC • PID_00235167 32 Criptografía de clave simétrica

La imagen de la izquierda corresponde a la imagen en claro y la de la derecha


es el resultado de cifrar la primera imagen usando el modo de operación ECB
(concretamente con el esquema de cifrado AES). Como se puede apreciar, a pe-
sar de que detalles concretos de la imagen original no se revelan en la versión
cifrada (por ejemplo, el color), la silueta de la imagen queda perfectamente
reconocible.

El modo CBC (del inglés, cipher block chaining) consiste en el encadenamiento


de los bloques para el cifrado, de forma que se crea una dependencia del ci-
frado de cada bloque con el inmediatamente anterior. De nuevo, cada bloque
se cifra con la misma clave k, pero el texto que se cifra no es directamente
el bloque en claro, sino el resultado de una XOR entre el bloque en claro y el
bloque cifrado anterior. La figura 11 esquematiza el funcionamiento del modo
CBC.

Figura 11. Esquema de cifrado con el modo CBC

Supongamos un cifrado en bloque con una clave k, una función de cifrado E


y una de descifrado D. Si m1 , . . . ,mm son los bloques de texto en claro que hay
que cifrar, mediante el sistema CBC el cifrado del bloque mi se lleva a cabo de
la manera siguiente:

ci = Ek (mi ⊕ ci–1 )

Para hacer el descifrado también hay que partir del texto cifrado anterior, y
entonces tenemos que ejecutar la operación siguiente:

Dk (ci ) ⊕ ci–1 = Dk (Ek (mi ⊕ ci–1 )) ⊕ ci–1 ) = (mi ⊕ ci–1 ) ⊕ ci–1 ) = mi

Para cifrar el primer bloque necesitaremos un bloque inicial aleatorio, c0 , que


no es necesario que sea secreto. Entonces, incluyendo este nuevo vector inicial
al cifrado podremos obtener dos textos en claro iguales pero cifrados de mane-
ra diferente; así, aunque empleemos la misma clave, k, solo habrá que cambiar

c FUOC • PID_00235167 33 Criptografía de clave simétrica

el vector inicial, c0 , que, además, puede incorporar una marca temporal.

En contraposición con el modo ECB, si un atacante cambia la orden de los blo-


ques cifrados con CBC, entonces el proceso de descifrado no se realiza correc-
tamente. Adicionalmente, un error en un bloque cifrado afecta al descifrado
de aquel bloque, pero también del siguiente. Notad que los bloques sucesivos
ya se descifran correctamente.

Con esta estructura, el modo CBC consigue ocultar los patrones del texto en
claro mucho mejor que el modo ECB. Si repetimos el procedimiento de cifrar
la imagen del candado usando ahora el modo CBC (utilizando también el
AES), podremos observar que ahora no podemos intuir el perfil de la imagen
a partir de la imagen cifrada (ved la figura 12).

Figura 12. Ejemplo de cifrado de una imagen con CBC

El modo de cifrado CFB (del inglés, cipher feedback) utiliza indirectamente el


cifrador en bloque, como veremos a continuación. Por eso, la longitud de los
bloques que se tienen que cifrar no hace falta que sea la misma que la de los
bloques del criptosistema con que actúa, sino que puede ser más pequeña. El
esquema general de funcionamiento de este método se muestra en la figura 13.

Figura 13. Esquema de cifrado con el modo CFB



c FUOC • PID_00235167 34 Criptografía de clave simétrica

Dado m = m1 m2 . . . , donde m es el mensaje de texto en claro, y m1 ,m2 , . . .


representan los bloques de longitud n que forman el mensaje, si consideramos
el vector inicial VI como una concatenación de l bloques de longitud n, es
decir, VI = VI1 VI2 . . . VIl , donde VIi tiene n bits de longitud, podremos calcular
el cifrado del vector VI, E(VI), mediante el criptosistema en bloque.

El resultado tendrá la misma longitud que VI y, por lo tanto, lo podremos


descomponer del mismo modo que aquel:

E(VI) = E(VI)1 E(VI)2 . . . E(VI)l

Finalmente, ya podremos cifrar el primer bloque de texto en claro, m1 , ha-


ciendo la suma bit por bit con el último bloque, E(VI)l :

c1 = m1 ⊕ E(VI)l

Obtenemos así el primer bloque cifrado de longitud n, c1 .

Para cifrar el segundo bloque, m2 , volveremos a hacer el mismo proceso, pero


esta vez tomaremos como vector inicial el vector formado por los fragmentos
siguientes:

VI = VI2 VI3 . . . VIl c1

Es decir, hemos desplazado los bloques de n bits hacia la izquierda para añadir
el bloque c1 y descartar el VI1 . De este modo, el segundo bloque de texto
cifrado lo obtenemos haciendo la operación siguiente:

c2 = E(VIb )l ⊕ m2

El proceso se repite a lo largo de los bloques de texto que se quiere cifrar:


para el bloque siguiente se desplazan los bloques del vector inicial anterior,
VIb , . . . a la izquierda para añadir el último bloque de texto cifrado obtenido e
ir aplicando el que ya hemos descrito anteriormente.

El modo de cifrado OFB (del inglés, output feedback) utiliza el criptosistema


en bloque como generador seudoaleatorio. Es un sistema muy parecido al an-
terior; la única diferencia que presenta es que el vector inicial se realimenta
directamente con el resultado del cifrado en bloque antes de hacer la suma bit
por bit con el bloque de texto en claro, como se puede ver en la figura 14.

c FUOC • PID_00235167 35 Criptografía de clave simétrica

Figura 14. Esquema de cifrado con el modo OFB

Como el cifrador en bloque actúa como un generador seudoaleatorio, es nece-


sario que los criptosistemas en bloque que empleamos con el modo OFB cum-
plan las características requeridas para los generadores seudoaleatorios, tanto
en cuanto a la impredictibilidad de la secuencia resultante como la compleji-
dad lineal.

El modo CTR (del inglés, counter) es similar al OFB, puesto que también con-
vierte el criptosistema en bloque con un cifrador en flujo. La secuencia de
cifrado se genera cifrando valores sucesivos de un contador (de aquí surge su
nombre), que puede ser cualquier función que tenga un periodo grande.

Figura 15. Esquema de cifrado con el modo CTR



c FUOC • PID_00235167 36 Criptografía de clave simétrica

Un uso habitual es utilizar un valor de nonce aleatorio concatenado con un


contador que se incremente de uno en uno. Así, por ejemplo, si la medida en
bloque del cifrador que se utiliza es de 128 bits, se selecciona una nonce de
64 bits y un contador de 64 bits. Para cifrar el primer bloque, se concatena la
nonce con el contador inicializado a 0. Para cada nuevo bloque, el contador
se incrementa en 1. De este modo, se pueden cifrar 264 bloques con la misma
nonce.

La principal ventaja de este modo de operación es que permite paralelizar


tanto el proceso de cifrado como el de descifrado, hecho que lo hace adecuado
para funcionar en dispositivos con más de un procesador. Además, permite
acceso aleatorio (como el modo ECB).

c FUOC • PID_00235167 37 Criptografía de clave simétrica

6. El criptosistema AES
.

El año 1998, los criptógrafos belgas Vincent Rijmen y Joan Daemen desarro-
llaron el algoritmo llamado (en reconocimiento a los autores) criptosistema
de Rijndael. Este criptosistema fue elegido por el NIST como AES (del inglés,
advanced encryption standard) en 2000, reemplazando el DES.

De hecho, el Rijndael es una familia de algoritmos de cifrado con diferentes Medidas en bloque y en
clave
medidas en clave y en bloque. El AES es solo un subconjunto, con medida en
bloque fijada a 128 bits. El Rijndael permite múltiples
medidas en bloque y en
clave. En concreto, el Rijndael
. define bloques y claves de
medida mínima de 128 y
El criptosistema AES cifra bloques de texto en claro de 128 bits de lon- máxima de 256, aceptando
múltiples de 32 bits.
gitud. La longitud de las claves de cifrado que este criptosistema emplea
puede variar entre 128, 192 o 256 bits. Las operaciones criptográficas
se basan en un grupo finito de orden 28 .

6.1 Descripción del funcionamiento

El funcionamiento del AES se muestra en la figura 16. Se basa en una transfor-


mación inicial seguida de un número de iteraciones que varían entre 10 y 14,
según la longitud de la clave.

Número de iteraciones
Figura 16. Estructura del AES
El número de iteraciones que
se muestran en la figura 16 es
n – 1, ya que la iteración final,
a pesar de ser considerada
una iteración, no contiene la
función mixColumn.

c FUOC • PID_00235167 38 Criptografía de clave simétrica

La tabla siguiente muestra el número exacto de iteraciones Nr en función del


número de palabras de bits 32 que tiene la clave que se utiliza para cifrar (Nk):

Nk = 4 Nk = 6 Nk = 8

10 12 14

La unidad básica de información con que trabaja el AES es el byte. Todas las
cadenas de bits (textos en claro y claves) se representan con matrices de bytes.
Por ejemplo, tenemos una cadena de 128 bits de texto en claro:

m = m1 m2 · · · m127 m128

Se representará con 16 bytes de la manera siguiente:

a0,0 = m1 m2 m3 m4 m5 m6 m7 m8
a1,0 = m9 m10 m11 m12 m13 m14 m15 m16
···
a3,3 = m121 m122 m123 m124 m125 m126 m127 m128

Estos bytes se pueden expresar de manera matricial:

a0,0 a0,1 a0,2 a0,3

a1,0 a1,1 a1,2 a1,3

a2,0 a2,1 a2,2 a2,3

a3,0 a3,1 a3,2 a3,3

Las diferentes funciones que ejecuta el AES (por ejemplo, AddRoundKey, By-
teSub, etc.) tienen como entrada y como salida una matriz de bytes como la
anterior.

Las matrices intermedias con que trabaja el criptosistema AES se deno-


minan matrices de estado. Las matrices de estado son matrices 4 × 4 y
cada elemento de la matriz es un byte. Los elementos de cada estado se
denotan por sij , donde i determina la fila y j la columna.

Las operaciones de suma y producto de bytes que ejecuta el AES no son las
operaciones convencionales que conocemos. En concreto, el AES considera los
bytes en una representación de polinomio. Cada byte b se puede representar
con 8 bits:

b = [b7 ,b6 ,b5 ,b4 ,b3 ,b2 ,b1 ,b0 ],on bi ∈ {0,1}

c FUOC • PID_00235167 39 Criptografía de clave simétrica

Este conjunto de bits se puede expresar como los coeficientes de un polinomio


de grado 7:

∑7
b7 x7 + b6 x6 + b5 x5 + b4 x4 + b3 x3 + b2 x2 + b1 x + b0 = i=0 bi xi
Ejemplo de
representación
polinómica
Para simplificar la notación, representaremos los bytes en notación hexadeci-
mal. Así, el elemento 01100011 en base binaria se representará por un 63 en El byte 01100011 tiene como
representación el polinomio
base hexadecimal, puesto que 01100011(2 = 99(10 = 63(16 . x6 + x5 + x + 1.

Dadas estas representaciones, consideramos que la suma y el producto se de-


finen de la manera siguiente:

Sean las representaciones binarias de los bytes x = (x7 ,x6 ,x5 ,x4 ,x3 ,x2 ,x1 ,x0 ) y Operación XOR
y = (y7 ,y6 ,y5 ,y4 ,y3 ,y2 ,y1 ,y0 ).
Recordad que la operación
XOR queda definida por:
1 ⊕ 0 = 0 ⊕ 1 = 1,1 ⊕ 1 =
Por un lado, definimos la operación suma:
0 ⊕ 0 = 0.

x ⊕ y = (x7 ⊕ y7 ,x6 ⊕ y6 ,x5 ⊕ y5 ,x4 ⊕ y4 ,x3 ⊕ y3 ,x2 ⊕ y2 ,x1 ⊕ y1 ,x0 ⊕ y0 )

donde ⊕ denota la operación XOR bit por bit.

Por otro lado, definimos la operación producto:

x ⊗ y = (x7 x7 + x6 x6 + x5 x5 + x4 x4 + x3 x3 + x2 x2 + x1 x + x0 )(y7 x7 + y6 x6 + y5 x5 +
y4 x4 + y3 x3 + y2 x2 + y1 x + b0 ) (mod x8 + x4 + x3 + x + 1)

Ejemplo de cálculo de suma y producto

Dados los bytes x y y siguientes:

x = 57(16 = 01010111(2 = x6 + x4 + x2 + x + 1
y = 83(16 = 10000011(2 = x7 + x + 1

Calculamos la suma y el producto de bytes:

x ⊕ y = 57(16 ⊕ 83(16 = D4(16

Esto es así porque:

01010111(2 ⊕ 10000011(2 = 11010100(2 = D4(16

Por otro lado, por el producto tenemos:

x ⊗ y = 57(16 ⊗ 83(16 = C1(16

Esto es así porque:

(x6 + x4 + x2 + x + 1) · (x7 + x + 1) (mod x8 + x4 + x3 + x + 1) =

= (x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1) (mod x8 + x4 + x3 + x + 1) =

= x7 + x6 + 1 = 11000001(2 = C1(16

Una vez vistas estas representaciones, ya podemos pasar a ver el funciona-


miento del algoritmo.

c FUOC • PID_00235167 40 Criptografía de clave simétrica

6.2 Detalle de una iteración

En la figura 16 el funcionamiento general del algoritmo se muestra como el


AES realiza, primero, una transformación inicial del texto de entrada, apli-
cando la función AddRoundKey. Después, se ejecutan n – 1 iteraciones, cada
una de las cuales aplica las funciones ByteSub, ShiftRow, MixColumn y Ad-
dRoundKey. Finalmente, se realiza una transformación final que ejecuta tres
de las cuatro funciones anteriores, dejando de aplicar la función MixColumn.

Además de hacer estas operaciones, en la transformación inicial el texto en


claro se tiene que convertir en una matriz de estado, que será utilizada por la
función AddRoundKey. De manera similar, la transformación final transforma
la salida de la función AddRoundKey (que es una matriz de estado) en el texto
cifrado final.

A continuación, pasamos a describir cada una de las funciones que se ejecutan


en cada iteración.

6.3 Función AddRoundKey

La función AddRoundKey se utiliza tanto en las transformaciones inicial y


final como en las iteraciones estándar.

. Subclaves

La función AddRoundKey hace una suma XOR de la matriz de esta- El índice i denota la subclave
de 128 bits que se usa en la
do con cada byte de la subclave K(i) correspondiente. En el caso de la i-ésima iteración teniendo en
transformación inicial, tenemos i = 0; por lo tanto, utilizamos la prime- cuenta que K(0) será la
subclave que se usará para la
ra subclave K(0). transformación inicial. Podéis
encontrar la descripción de
cómo se obtienen las
subclaves a partir de la clave
Ejemplo de cálculo de la función AddRoundKey inicial de cifrado en el
subapartado 6.7 de este
Consideramos la subclave: módulo.

K(0) = b692cf 0b643dbdf 1be9bc5006830b3fe


 
9d 28 91 00
 
 
f 7 7f 78 a6
y la matriz de estado S = 



39 c1 6c c6 
 
3c aa 25 a5

El resultado de aplicar la función AddRoundKey será:


     
9d 28 91 00 b6 64 be 68 2b 4c 2f 68
     
     
f 7 7f 78 a6  30  96
AddRoundKey(S,K(0)) =  ⊕92 3d 9b  = 65 42 e3 
     
39 c1 6c c6   b3  75
   cf bd c5  f 6 7c a9 
3c aa 25 a5 0b f1 00 fe 37 5b 25 5b

Fijaos que la suma XOR de las matrices corresponde a la suma XOR de cada una de sus
entradas. Así, por ejemplo, la primera posición de la transformación vale 2B, puesto que
9D ⊕ B6 = 10011101 ⊕ 10110110 = 2B.

c FUOC • PID_00235167 41 Criptografía de clave simétrica

Figura 17. Ejemplo de cálculo de la función AddRoundKey

6.4 Función ByteSub

. Nombre de la función
ByteSub
La función ByteSub aplica una sustitución no lineal de los bytes de la
matriz de estado. La función ByteSub aparece
con esta denominación en la
propuesta inicial del
criptosistema de Rijndael. En
la publicación del AES en el
La función recibe como entrada una matriz de estado A, aplica una trans- estándar FIP-197, la función
formación S y obtiene otra matriz de estado B, de forma que bij = S(aij ). La se denomina SubBytes. Sea
cual sea el nombre que se le
transformación de cada byte de la matriz se realiza de manera independiente. da, en los dos casos es la
misma función.

6.4.1 Las cajas S del AES

Las cajas S del AES son una matriz de 256 elementos que se utiliza como tabla Tabla de consulta
de consulta. Normalmente se representan como una matriz de 16 filas y 16
Una tabla de consulta (en
columnas. Si representamos cada byte que hay que procesar con dos caracteres inglés, lookup table) es una
estructura de datos que
hexadecimales x y y, entonces el valor x indica la fila, y el valor y, la columna
sustituye una ejecución
de la posición donde se encuentra el byte resultante. algorítmica por una
operación de indexación.
Normalmente el objetivo de
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf utilizar tablas de consulta es
reducir el tiempo de
0y 63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76 obtención del resultado
esperado.
1y ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
2y b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
3y 04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
4y 09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
5y 53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
6y d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
7y 51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
8y cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
9y 60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db
ay e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
by e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
cy ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
dy 70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
ey e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
fy 8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16

c FUOC • PID_00235167 42 Criptografía de clave simétrica

Ejemplo de cálculo de la función ByteSub

 
b5 b1 b9 b5
 
 c9 cc c5 c8 
S=



17 11 1b 15
9e 99 92 9d

Calculamos la transformación de la primera entrada de la matriz, S00 = b5. Buscamos


el valor de primera componente, b, en las filas de la tabla de las cajas S, y el valor de
la segunda componente 5 en las columnas. Esto nos indica que el valor que hay en la
intersección será el valor resultante, en este caso el d5. Si hacemos el mismo proceso con
todos los elementos de la matriz, tenemos como resultado:

 
d5 c8 56 d5
 
dd 4b a6 e8 
ByteSub(S) = 



f 0 82 af 59
0b ee 4f 5e

6.5 Función ShiftRow

La función ShiftRow desplaza las filas de la matriz de estado de forma


que la fila cero se deja igual, la fila 1 se desplaza una posición a la iz-
quierda, la fila 2 se desplaza dos posiciones a la izquierda, y la fila 3, tres
posiciones a la izquierda.

Ejemplo de cálculo de la función ShiftRow


 
d5 c8 56 d5
 
dd 4b a6 e8 
Supongamos la matriz de estado S = 



f 0 82 af 59
0b ee 4f 5e

Podemos realizar el cálculo de la función ShiftRow tal como se muestra en la figura 18,
dejando la fila cero de la matriz sin modificar y desplazando las filas 1, 2 y 3, una, dos y
tres posiciones, respectivamente:

Figura 18. Ejemplo de cálculo de la función ShiftRow

La matriz de estado resultante de la transformación será, pues:

 
d5 c8 56 d5
 
4b a6 e8 dd 
ShiftRow(S) = 



 af 59 f0 82
5e 0b ee 4f

c FUOC • PID_00235167 43 Criptografía de clave simétrica

6.6 Función MixColumns

La función MixColumns mezcla las columnas de la matriz de estado a


partir de operaciones polinomiales.

Concretamente, esta función considera las columnas de la matriz de estado


como polinomios de grado 3. Cada columna se multiplica por el polinomio
c(x) = “03”x3 + “01”x2 + “01”x + “02” y el resultado se reduce módulo x4 + 1. Este
producto de los polinomios se puede escribir como un producto de matrices:
    
s′0j 02 03 01 01 s
     0j 
 ′    
s1j  01 02 03 01  
 =  s1j 
 ′    
s  01 01 02 03  
 2j    s2j 

s3j 03 01 01 02 s3j

Tened en cuenta que las operaciones de suma y producto entre los elementos
de la matriz y los del vector columna son las operaciones ⊕ y ⊗ definidas en
el subapartado 6.1

El polinomio c(x) es coprimo con x4 + 1 y, por lo tanto, invertible. De este mo-


do, la operación MixColumns se puede deshacer multiplicando cada columna
por el polinomio d(x):
c(x) ⊗ d(x) = “01”

El polinomio d(x) es, pues, “0B”x3 + “0D”x2 + “09”x + “0E”.

Ejemplo de cálculo de la función MixColumns


 
d5 c8 56 d5
 
4b a6 e8 dd 
Supongamos una matriz de estado S = 



 af 59 f0 82
5e 0b ee 4f

Para obtener la transformación de la primera columna calcularemos:


   
02 03 01 01 d5
   
01 02 03 01  
  · 4b
   
01 01 02 03  af 
03 01 01 02 5e

Esto nos dará un vector columna de cuatro bytes determinados por los valores siguientes:
 
(02 ⊗ d5) ⊕ (03 ⊗ 4b) ⊕ (01 ⊗ af ) ⊕ (01 ⊗ 5e)
 
(01 ⊗ d5) ⊕ (02 ⊗ 4b) ⊕ (03 ⊗ af ) ⊕ (01 ⊗ 5e)
 
 
(01 ⊗ d5) ⊕ (01 ⊗ 4b) ⊕ (02 ⊗ af ) ⊕ (03 ⊗ 5e)
(03 ⊗ d5) ⊕ (01 ⊗ 4b) ⊕ (01 ⊗ af ) ⊕ (02 ⊗ 5e)

Por ejemplo, veamos cuánto vale la segunda posición del vector columna:

(01 ⊗ d5) ⊕ (02 ⊗ 4b) ⊕ (03 ⊗ af ) ⊕ (01 ⊗ 5e)



c FUOC • PID_00235167 44 Criptografía de clave simétrica

Si pasamos los valores hexadecimales a representación polinómica (pasando por su re-


presentación binaria) tenemos los valores de la tabla 5.

Tabla 5. Representación polinómica de valores hexadecimales


Hexadecimal Binario Polinomio
01 0 0 0 0 0 0 0 1 1
d5 1 1 0 1 0 1 0 1 x7 + x6 + x4 + x2 + 1
02 0 0 0 0 0 0 1 0 x
4b 0 1 0 0 1 0 1 1 x6 + x3 + x + 1
03 0 0 0 0 0 0 1 1 x+1
af 1 0 1 0 1 1 1 1 x7 + x5 + x3 + x2 + x + 1
5e 0 1 0 1 1 1 1 0 x6 + x4 + x3 + x2 + x

Si ahora hacemos los cálculos, resulta:

(“01”⊗“D5”) == (1)(x7 +x6 +x4 +x2 +1) (mod x8 +x4 +x3 +x+1) = x7 +x6 +x4 +x2 +1 → 11010101

(“02” ⊗ “4B”) == (x)(x6 + x3 + x + 1) (mod x8 + x4 + x3 + x + 1) = x7 + x4 + x2 + x → 10010110

(“03” ⊗ “AF”) == (x + 1)(x7 + x5 + x3 + x2 + x + 1) (mod x8 + x4 + x3 + x + 1) = x7 + x6 + x5 + x3


+ x → 11101010

(“01”⊗“5E”) == (1)(x6 +x4 +x3 +x2 +x) (mod x8 +x4 +x3 +x+1) = x6 +x4 +x3 +x2 +x → 01011110

Finalmente, hacemos la XOR:


11010101 ⊕ 10010110 ⊕ 11101010 ⊕ 01011110 ⊕ 11110111 → f 7
Concretamente, el resultado de todos los elementos de la primera columna es:
   
(02 ⊗ d5) ⊕ (03 ⊗ 4b) ⊕ (01 ⊗ af ) ⊕ (01 ⊗ 5e) 9d
   
(01 ⊗ d5) ⊕ (02 ⊗ 4b) ⊕ (03 ⊗ af ) ⊕ (01 ⊗ 5e) f 7
 = 
   
(01 ⊗ d5) ⊕ (01 ⊗ 4b) ⊕ (02 ⊗ af ) ⊕ (03 ⊗ 5e) 39
(03 ⊗ d5) ⊕ (01 ⊗ 4b) ⊕ (01 ⊗ af ) ⊕ (02 ⊗ 5e) 3c

Y el resultado de la función MixColumns sobre toda la matriz de estado es:


 
9d 28 91 00
 
f 7 7f 78 a6
MixColumns(S) = 



39 c1 6c c6 
3c aa 25 a5

6.7 Generación de subclaves

Igual que la mayoría de criptosistemas en bloque, el algoritmo de Rijndael


trabaja con diferentes subclaves en cada iteración. Estas subclaves se obtienen
por la aplicación de una función de ampliación a la clave de cifrado inicial.

La función de expansión genera, a partir de las Nk palabras de 32 bits de clave Parámetros Nk i Nr


de cifrado, K = (K0 ,K1 , . . . ,KNk–1 ), una clave extendida W = (W0 ,W1 , . . . ,W4(Nr+1)–1 )
Hay que recordar que los
que contiene 4(Nr + 1) palabras de 32 bits. Cada iteración del algoritmo de ci- parámetros (Nk,Nr), que
representan respectivamente
frado usará cuatro palabras de 32 bits y serán necesarias cuatro palabras adicio-
el tamaño de la clave en
nales para la inicialización. Si denotamos por K(i) cada una de las subcadenas palabras de 32 bits y el
número de iteraciones,
de W de cuatro palabras de 32 bits tendremos que K(i) es la subclave que se
pueden tomar los valores
utiliza en la i-ésima iteración. Gráficamente las subclaves de cada iteración en (4,10), (6,12) y (8,14).
relación con la clave extendida se pueden expresar de la manera siguiente:

W = ( W0 ,W1 ,W2 ,W3 , W4 ,W5 ,W6 ,W7 , ... W4Nr , . . . ,W4(Nr+1)–1 )


| {z }| {z } | {z }
K(0) K(1) K(Nr)

c FUOC • PID_00235167 45 Criptografía de clave simétrica

Así, la transformación inicial utiliza la subclave K(0) formada por las primeras
4 palabras de W y en cada una de las Nr iteraciones se utilizan 4 palabras. De
este modo, por valores de Nk de 4, 6 y 8 se generarán, respectivamente, claves
extendidas W de 44, 52 y 60 palabras de 32 bits(que corresponden a 1408,
1664 y 1920 bits).

El algoritmo de expansión de clave consta de dos fases:

• Fase de inicialización, donde la clave de cifrado es una copia íntegramente


de las primeras posiciones de la clave extendida. Es decir:

Wi = Ki ,∀i = 0, . . . ,Nk – 1

• Fase de expansión, donde se coge la última palabra calculada y se extiende.


El algoritmo que implementa esta fase queda descrito por el seudocódigo
siguiente:

for (y = Nk ; y 4(Nr < + 1); y++)


temp = Wi–1
if i = 0 mod Nk then
temp = SubWord(RotWord(temp)) ⊕ Rcon[i/Nk]
else if ((Nk > 6) and (i mod Nk = 4)) then
temp = SubWord(temp)
endif
Wi = Wi–Nk ⊕ temp

La fase de expansión usa dos funciones: SubWord y RotWord. La función Representación


SubWord es la misma función que ByteSub (definida anteriormente). La fun- hexadecimal

ción SubWord es la misma función que ByteSub (definida anteriormente). Recordad que cada carácter
La función RotWord simplemente hace una permutación cíclica a la pala- hexadecimal permite
representar 4 bits; es decir,
bra de 4 bytes, es decir, si tenemos [a0, a1, a2, a3] como entrada, la salida valores desde 0 hasta 15.
será [a1, a2, a3, a0]. Asimismo, también se usa la constante Rcon[i], que va-
le Rcon[i] = [xi–1 ,“00”,“00”,“00”]. Recordad que el polinomio x en hexadecimal
vale “02”, puesto que corresponde a la representación en binario de 00000010.

La figura 19 resume el proceso de expansión de claves para el caso Nk = 4,


es decir, para claves de 128 bits. En este caso, si consideramos la clave K =
(K0 K1 K2 K3 ), entonces los valores W0 . . . W3 contendrían la clave inicial K, y el
resto de valores (hasta W43 ) se calcularían en función de estas cuatro palabras
iniciales.

Notad que el esquema incluye la función f , que correspondería a aplicar


SubWord(RotWord(temp)) ⊕ Rcon[i/Nk] sobre el valor que se recibe en la entrada.

Ejemplo de cálculo de la expansión de claves

Supongamos que la longitud de la clave es de 128 bits, es decir, Nk = 4 palabras de 32


bits y que la clave de cifrado (representada en hexadecimal) corresponde a:

K = 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
| {z }| {z }| {z }| {z }
K0 K1 K2 K3

c FUOC • PID_00235167 46 Criptografía de clave simétrica

Figura 19. Esquema de expansión de claves del AES para Nk = 4

Con estos parámetros tenemos que el número de iteraciones es Nr = 10. Esto quiere decir
que la clave extendida W tendrá 4 · (10 + 1) = 44 palabras de 32 bits.

Denotando por K(i) la clave que se usa en la i-ésima iteración. Los primeros bytes de la
clave extendida son los mismos que los de la clave de cifrado:

W0 = 00 01 02 03
W1 = 04 05 06 07
W2 = 08 09 0A 0B
W3 = 0C 0D 0E 0F

Por lo tanto:

K(0) = W0 W1 W2 W3 = 00010203 04050607 08090A0B 0C0D0E0F = K

Estas cuatro palabras son las que se usan en la transformación inicial del algoritmo.

La segunda subclave será:

W4 =W0 ⊕ SubWord(RotWord(W3 )) ⊕ Rcon[1]

SubWord(RotWord(W3 )) = RotWord(0C 0D 0E 0F) = 0D 0E 0F 0C

SubWord(0D 0E 0F 0C) = (D7 AB 76 FE)

W4 = 00 01 02 03 ⊕ D7 AB 76 FE ⊕ 01 00 00 00 = D6 AA 74 FD

W5 =W1 ⊕ W4 = 04 05 06 07 ⊕ D6 AA 74 FD = D2 AF 72 FA

W6 =W2 ⊕ W5 = 08 09 0A 0B ⊕ D2 AF 72 FA = DA A6 78 F1

W7 =W3 ⊕ W6 = 0C 0D 0E 0F ⊕ DA A6 78 F1 = D6 AB 76 FE

Por lo tanto, la subclave K(1) = D6 AA 74 FD D2 AF 72 FA DA A6 78 F1 D6 AB 76 FE.


El resto de la clave ampliada se calcula del mismo modo.

c FUOC • PID_00235167 47 Criptografía de clave simétrica

6.8 Descifrado

En subapartados anteriores hemos definido con todo detalle las operaciones


de cifrado del AES. Todas las funciones que se utilizan en el proceso de cifrado
(ByteSub, ShiftRow, MixColumn y AddRoundKey) son invertibles y, por lo
tanto, se puede definir la función inversa correspondiente.

Si las funciones definidas en el cifrado se aplican en el orden opuesto al que


se ejecutan en el proceso de cifrado, obtenemos el proceso de descifrado del
criptosistema.

c FUOC • PID_00235167 48 Criptografía de clave simétrica

Resumen

En este módulo didáctico hemos descrito el funcionamiento y las característi-


cas principales de los esquemas de cifrado en flujo y en bloque.

En cuanto al cifrado en flujo, hemos estudiado las propiedades que debe tener
una secuencia aleatoria para que se pueda utilizar como secuencia de cifrado.
Hemos presentado igualmente diferentes tipos de generadores para obtener se-
cuencias seudoaleatorias. Hemos señalado que los registros de desplazamiento
realimentados linealmente (LFSR) son los más interesantes porque son fáciles
de estudiar, a pesar de que, como ya hemos apuntado, no aconsejamos su
aplicación en criptografía, porque su criptoanálisis es muy sencillo. Finalmen-
te, hemos estudiado dos generadores que se usan hoy en día en productos
habituales, el A5 y el Trivium.

En relación con el cifrado en bloque, en primer lugar hemos descrito la estruc-


tura general. Después, hemos pasado a detallar cómo se puede usar el cifrado
en bloque para cifrar textos de medida superior al bloque, describiendo dife-
rentes modos de operación: ECB, CBC, CFB, OFC y CTR. Finalmente, hemos
presentado el criptosistema en bloque más utilizado hoy en día, el AES, deta-
llando tanto la arquitectura como las funciones internas que usa.

c FUOC • PID_00235167 49 Criptografía de clave simétrica

Ejercicios de autoevaluación

1. Calculad los primeros 15 bits de la secuencia de salida de un LFSR de 5 celdas que tiene
como polinomio de conexiones 1 + x2 + x5 y que se inicializa con el estado 0,0,0,1,1.

2. ¿Cuál es el periodo y la complejidad lineal máxima de las secuencias generadas por el LFSR
con polinomio de conexiones 1 + x2 + x5 ?

3. Dada la secuencia s = 00010011010111100010, sintetizad el LFSR que la ha generado,


sabiendo que el polinomio de conexiones tiene grado 4.

4. Supongamos un esquema de cifrado en bloque como el de la tabla 6 con medida en bloque


de 2 bits y medida de clave también de 2 bits que implementa esta función de cifrado E:

Tabla 6. Función de cifrado


Entrada k Salida Entrada k Salida
00 00 11 00 01 00
01 00 10 01 01 01
10 00 01 10 01 10
11 00 00 11 01 11
00 10 01 00 11 10
01 10 11 01 11 00
10 10 00 10 11 11
11 10 10 11 11 01

Cifrad el mensaje m = 1001100100110000 con k = 10 usando la función de cifrado E y el


modo de operación ECB.

5. Cifrad el mismo mensaje m con la función E y la clave k = 10, usando ahora el modo de
operación CBC con el vector inicial 10.

6. Cifrad el mismo mensaje m con la función E y la clave k = 10, usando ahora el modo de
operación CFB con el vector inicial 10.

7. Cifrad el mismo mensaje m con la función E y la clave k = 10, usando ahora el modo de
operación OFB con el vector inicial 10.

8. Cifrad el mismo mensaje m con la función E y la clave k = 10, usando ahora el modo de
operación CTR con el vector inicial 10.

9. Supongamos que la clave de cifrado de 192 bits de un cifrador AES expresada en hexade-
cimal es la siguiente:
8E 73 B0 F7 DA 0E 64 52 C8 10 F3 2B 80 90 79 E5 62 F8 EA D2 52 2C 6B 7B

Dad las dos primeras subclaves, es decir, K(0) y K(1).

10. Dado un cifrador Rijndael con clave de cifrado K y un bloque de texto para cifrar B:
K = 2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C
B = 32 43 F6 A8 88 5A 30 8D 31 31 98 A2 E0 37 07 34

¿Cuántas iteraciones hay que hacer para cifrar este bloque de texto en claro con esta clave?
¿Cuál es la matriz de estado al inicio de la segunda iteración?

c FUOC • PID_00235167 50 Criptografía de clave simétrica

Solucionario
1. Teniendo en cuenta el polinomio de conexiones del LFSR, el nuevo bit se calcula haciendo
una XOR entre los bits de las celdas s4 y s1 (que se encuentran subrayados en la tabla 7) en
el instante de tiempo anterior:

Tabla 7. Evolución del LFSR


Impulso de reloj (t) Estado Salida
0 0 0 0 1 1 1
1 1 0 0 0 1 1
2 1 1 0 0 0 0
3 1 1 1 0 0 0
4 1 1 1 1 0 0
5 1 1 1 1 1 1
6 0 1 1 1 1 1
7 0 0 1 1 1 1
8 1 0 0 1 1 1
9 1 1 0 0 1 1
10 0 1 1 0 0 0
11 1 0 1 1 0 0
12 0 1 0 1 1 1
13 0 0 1 0 1 1
14 1 0 0 1 0 0

Así pues, los 15 primeros bits de la secuencia de salida son: 110001111100110

2. El polinomio 1 + x2 + x5 tiene grado n = 5 y es un polinomio primitivo. Por lo tanto, la


complejidad lineal máxima de las secuencias que genera es n = 5 y el periodo será 2n – 1 =
25 – 1 = 31.

3. Para encontrar el polinomio de conexiones necesitamos únicamente 2n = 8 bits consecuti-


vos de la secuencia de salida. Si cogemos, por ejemplo, los 8 primeros bits, podemos plantear
el sistema de ecuaciones siguiente:
    
0 0 0 1 c4 0
    
 0 0 1 0     0 
   c3 = 
    
 0 1 0 0   c2   1 
1 0 0 1 c1 1

La solución del sistema es c4 = 1,c3 = 1,c2 = 0,c1 = 0 y, por lo tanto, el polinomio de


conexiones es x4 + x3 + 1.

4. En primer lugar, procedemos a separar el mensaje en bloques de 2 bits, la medida en


bloque de la función de cifrado:
m = 10 01 10 01 00 11 00 00
Después procedemos a aplicar la función de cifrado a cada bloque individual, y concatena-
mos los resultados:
c = 00 11 00 11 01 10 01 01

5. En primer lugar, procedemos a separar el mensaje en bloques de 2 bits. Después, para


cada bloque, realizamos una XOR con el bloque cifrado anterior (usando el vector inicial
como bloque cifrado anterior para el primer bloque, M1 ). Finalmente, aplicamos el cifrador
en bloque sobre la salida de la XOR. El proceso que hay que seguir es, pues, el que se muestra
en la tabla 8.

Tabla 8. Proceso con el modo CBC


Bloque Mi ⊕ Ci–1 Ci = E(Mi ⊕ Ci–1 )
M1 = 10 M1 ⊕ C0 = 10 ⊕ 10 = 00 E(00) = 01
M2 = 01 M2 ⊕ C1 = 01 ⊕ 01 = 00 E(00) = 01
M3 = 10 M3 ⊕ C2 = 10 ⊕ 01 = 11 E(11) = 10
M4 = 01 M4 ⊕ C3 = 01 ⊕ 10 = 11 E(11) = 10
M5 = 00 M5 ⊕ C4 = 00 ⊕ 10 = 10 E(10) = 00
M6 = 11 M6 ⊕ C5 = 11 ⊕ 00 = 11 E(11) = 10
M7 = 00 M7 ⊕ C6 = 00 ⊕ 10 = 10 E(10) = 00
M8 = 00 M8 ⊕ C7 = 00 ⊕ 00 = 00 E(00) = 01

El texto cifrado corresponde a la concatenación de los bloques cifrados: 0101101000100001.



c FUOC • PID_00235167 51 Criptografía de clave simétrica

6. En este caso, la medida en bloque del criptosistema es de 2 bits, por lo cual los bloques de
texto que hay que cifrar pueden ser como mucho de 2 bits. Cogemos, pues, bloques de texto
que queremos cifrar de 2 bits y procedemos a realizar el proceso de cifrado. Particionamos
el mensaje M en bloques de 2 bits y hacemos una XOR de cada bloque con el resultado de
cifrar el bloque anterior, utilizando el vector inicial como bloque anterior para la primera
iteración. Ved todo el proceso en la tabla 9.

Tabla 9. Proceso con el modo CFB


Bloque E(Ci–1 ) Ci = E(Ci–1 ) ⊕ Mi
M1 = 10 E(C0 ) = E(10) = 00 M1 ⊕ E(C0 ) = 10 ⊕ 00 = 10
M2 = 01 E(C1 ) = E(10) = 00 M2 ⊕ E(C1 ) = 01 ⊕ 00 = 01
M3 = 10 E(C2 ) = E(01) = 11 M3 ⊕ E(C2 ) = 10 ⊕ 11 = 01
M4 = 01 E(C3 ) = E(01) = 11 M4 ⊕ E(C3 ) = 01 ⊕ 11 = 10
M5 = 00 E(C4 ) = E(10) = 00 M5 ⊕ E(C4 ) = 00 ⊕ 00 = 00
M6 = 11 E(C5 ) = E(00) = 01 M6 ⊕ E(C5 ) = 11 ⊕ 01 = 10
M7 = 00 E(C6 ) = E(10) = 00 M7 ⊕ E(C6 ) = 00 ⊕ 00 = 00
M8 = 00 E(C7 ) = E(00) = 01 M8 ⊕ E(C7 ) = 00 ⊕ 01 = 01

El texto cifrado corresponde a la concatenación de los bloques cifrados: 1001011000100001.

7. En este caso, la medida en bloque del criptosistema es de 2 bits, por lo cual los bloques
de texto que se quieren cifrar pueden ser como mucho de 2 bits. Cogemos, pues, bloques
de texto que se quieren cifrar de 2 bits y procedemos a realizar el proceso de cifrado. Parti-
cionamos el mensaje M en bloques de 2 bits y hacemos una XOR de cada bloque Mi con el
resultado de cifrar vi , donde vi = E(vi–1 ), con v0 = VI. Ved todo el proceso en la tabla 10.

Tabla 10. Proceso con el modo OFB


Bloque vi = E(vi–1 ) Ci = vi ⊕ Mi
M1 = 10 v1 = E(v0 ) = E(10) = 00 v1 ⊕ M1 = 00 ⊕ 10 = 10
M2 = 01 v2 = E(v1 ) = E(00) = 01 v2 ⊕ M2 = 01 ⊕ 01 = 00
M3 = 10 v3 = E(v2 ) = E(01) = 11 v3 ⊕ M3 = 11 ⊕ 10 = 01
M4 = 01 v4 = E(v3 ) = E(11) = 10 v4 ⊕ M4 = 10 ⊕ 01 = 11
M5 = 00 v5 = E(v4 ) = E(10) = 00 v5 ⊕ M5 = 00 ⊕ 00 = 00
M6 = 11 v6 = E(v5 ) = E(00) = 01 v6 ⊕ M6 = 01 ⊕ 11 = 10
M7 = 00 v7 = E(v6 ) = E(01) = 11 v7 ⊕ M7 = 11 ⊕ 00 = 11
M8 = 00 v8 = E(v7 ) = E(11) = 10 v8 ⊕ M8 = 10 ⊕ 00 = 10

El texto cifrado corresponde a la concatenación de los bloques cifrados: 1000011100101110.


8. En este caso, como la medida en bloque es muy pequeña, usaremos directamente un con-
tador que se incrementa uno por uno, sin incorporar ningún nonce. Notad que el contador
solo tiene cuatro valores, por lo cual la secuencia se repite. En una situación real, hay que
evitar este hecho, puesto que compromete la seguridad del sistema.

Procedemos, pues, a particionar el mensaje M en bloques de 2 bits, y hacemos una XOR de


cada bloque Mi con el resultado de cifrar vi , donde vi es un contador cíclico que se inicia con
el valor 00 y se incrementa por cada nuevo bloque a cifrar. Ved todo el proceso en la tabla 11.

Tabla 11. Proceso con el modo CTR


Bloque vi = E(i – 1 mod 4) Ci = vi ⊕ Mi
M1 = 10 v1 = E(00) = 01 v1 ⊕ M1 = 01 ⊕ 10 = 11
M2 = 01 v2 = E(01) = 11 v2 ⊕ M2 = 11 ⊕ 01 = 10
M3 = 10 v3 = E(10) = 00 v3 ⊕ M3 = 00 ⊕ 10 = 10
M4 = 01 v4 = E(11) = 10 v4 ⊕ M4 = 10 ⊕ 01 = 11
M5 = 00 v5 = E(00) = 01 v5 ⊕ M5 = 01 ⊕ 00 = 01
M6 = 11 v6 = E(01) = 11 v6 ⊕ M6 = 11 ⊕ 11 = 00
M7 = 00 v7 = E(10) = 00 v7 ⊕ M7 = 00 ⊕ 00 = 00
M8 = 00 v8 = E(11) = 10 v8 ⊕ M8 = 10 ⊕ 00 = 10

El texto cifrado corresponde a la concatenación de los bloques cifrados: 1110101101000010.

9. Dado que la clave de cifrado es de 192 bits, el número de palabras de 32 bits de la clave
vale Nk = 6; por lo tanto, tendremos que aplicar el algoritmo para el caso Nk ≤ 6.

c FUOC • PID_00235167 52 Criptografía de clave simétrica

Los primeros bits de la clave extendida son exactamente los mismos bits de la clave de
cifrado:

W0 = 8E 73 B0 F7

W1 = DA 0E 64 52

W2 = C8 10 F3 2B

W3 = 80 90 79 E5

W4 = 62 F8 EA D2

W5 = 52 2C 6B 7B
Por lo tanto:

K(0) = W0 W1 W2 W3 W4 W5 =

= 8E73B0F7 DA 0E 64 52 C810F32B 809079E5 62F8EAD2 522C6B7B =

=K

Si aplicamos el algoritmo para el caso Nk ≤ 6 con los valores Wi anteriores obtenemos:


W6 =W0 ⊕ SubWord(RotWord(W5 )) ⊕ Rcon[1]

RotWord(W5 ) = RotWord(52 2C 6B 7B) = 2C 6B 7B 52

SubWord(2C 6B 7B 52) = (71 7F 21 00)

W6 = 8E 73 B0 F7 ⊕ 71 7F 21 00 ⊕ 01 00 00 00 = 8E 73 B0 F7 ⊕ 70 7F 21 00 = FE 0C 91 F7

W7 =W1 ⊕ W6 = DA 0E 64 52 ⊕ FE 0C 91 F7 = 24 02 F5 A5

W8 =W2 ⊕ W7 = C8 10 F3 2B ⊕ 24 02 F5 A5 = EC 12 06 8E

W9 =W3 ⊕ W8 = 80 90 79 E5 ⊕ EC 12 06 8E = 6C 82 7F 6B

W10 =W4 ⊕ W9 = 62 F8 EA D2 ⊕ 6C 82 7F 6B = 0E 7A 95 B9

W11 =W5 ⊕ W10 = 52 2C 6B 7B ⊕ 0E 7A 95 B9 = 5C 56 FE C2


Por lo tanto, la subclave:

K(1) = FE 0C 91 F7 24 02 F5 A5 EC 12 06 8E 6C 82 7F 6B 0E 7A 95 B9 5C 56 FE C2

10. Habrá que hacer diez iteraciones para cifrar este bloque de texto en claro, puesto que la
longitud de la clave es de 16 bytes; por lo tanto, Nk = 4.
En la transformación inicial se aplica la transformación AddRoundKey. En nuestro caso:
  
 
32 88 31 e0 2b 28 ab 09 19 a0 9ae9
     
43 5a31 37  7e ae f7 cf  3d f4 c6 f 8
AddRoundKey(S,K(0)) = 

⊕
 
=
 
 = S1

f 6 30 98 07 15 d2 15 4f   e3 e2 8d 48
a8 8d a2 34 16 a6 88 3c b3 2b 2a08

El resultado de la primera iteración corresponderá a ejecutar las funciones ByteSub, ShiftRow,


MixColumns y AddRoundKey. El resultado de la función ByteSub sobre la matriz de estado
S1 es:

c FUOC • PID_00235167 53 Criptografía de clave simétrica

   
19 a0 9a e9 d4 e0 b8 1e
   
3d f4 c6 f 8   41
ByteSub    = 27 bf b4  = S2
   
 e3 e2 8d 48 11 98 5d 52
b3 2b 2a 08 ae f1 e5 30
El resultado de la función ShiftRow sobre la matriz de estado S2 es:
   
d4 e0 b8 1e d4 e0 b8 1e
   
27 bf b4 41  bf b4 41 27
ShiftRow  

 = 
 
 = S3

11 98 5d 52 5d 52 11 98
ae f1 e5 30 30 ae f1 e5
El resultado de la función MixColumns sobre la matriz de estado S3 es:
   
d4 e0 b8 1e 04 e0 48 28
   
 bf b4 41 27   
MixColumns    = 66 cb f 8 06 = S4
   
5d 52 11 98 81 19 d3 26
30 ae f1 e5 e5 9a 7a 4c
Calculamos el valor de la clave de la segunda iteración:
 
a0 88 23 2a
 
 fa 54 a3 6c 
 
 
 fe 2c 39 76
17 b1 39 05
Finalmente, el resultado de la función AddRoundKey sobre la matriz de estado S4 resulta:
     
04 e0 48 28 a0 88 23 2a a4 68 6b 02
     
66 cb f 8 06  fa 54 a3 6c   9c 9f 5b 6a
 ⊕ = 
     
81 19 d3 26  fe 2c 39 76 7f 35 ea 50
e5 9a 7a 4c 17 b1 39 05 f2 2b 43 49
Así, el valor de la matriz de estado al inicio de la segunda iteración valdrá:
 
a4 68 6b 02
 
 9c 9f 5b 6a
S= 


7f 35 ea 50
f2 2b 43 49

c FUOC • PID_00235167 54 Criptografía de clave simétrica

Glosario
A5 m Familia de algoritmos de cifrado en flujo utilizada en la red GSM.

advanced encryption standard m Subconjunto del criptosistema en bloque Rijndael escogi-


do como estándar de cifrado por el NIST.
sigla AES

AES m Véase advanced encryption standard.

CBC m Véase cipher block chaining.

CFB m Véase cipher feedback.

cipher block chaining m Modo de operación del cifrado en bloque en el que no se cifra
directamente cada bloque de texto en claro, sino que primero se aplica una XOR con el
bloque cifrado anterior.
sigla CBC

cipher feedback m Modo de operación del cifrado en bloque que usa el cifrador en bloque
como generador seudoaleatorio utilizando cada bloque cifrado para realimentar el cifrado
del bloque siguiente.
sigla CFB

complejidad lineal de una secuencia f Número de celdas del LFSR más corto que es capaz
de generarla.

counter m Modo de operación del cifrado en bloque que usa el cifrador en bloque como
generador seudoaleatorio, generando la secuencia cifrante a partir de cifrar un contador.
sigla CTR

criptosistema en bloque m Sistema de cifrado de clave simétrica que procesa los bits de
entrada en bloques de un tamaño predeterminado de bits.

criptosistema de clave compartida m Criptosistema en que tanto el emisor como el recep-


tor comparten una sola clave que usan tanto para cifrar como para descifrar.

criptosistema en flujo m Sistema de cifrado que utiliza un generador seudoaleatorio para


cifrar un mensaje, sumando bit por bit el texto en claro con la secuencia seudoaleatoria que
resulta del generador.

CTR m Véase counter.

ECB m Véase electronic code book.

electronic code book m Modo de operación del cifrado en bloque en que cada bloque de
entrada se cifra de manera individual, usando la misma clave.

estado de un LFSR m Conjunto de valores contenidos en cada celda de un LFSR en un


instante de tiempo.

generador congruencial m Proceso determinista que genera secuencias según ecuaciones


modulares recurrentes.

generador lineal m Generador de secuencias de bits que solo ejecuta operaciones lineales
sobre los elementos de entrada para obtener la secuencia de salida.

generador no lineal m Generador de secuencias de bits que ejecuta operaciones no lineales,


como por ejemplo permutaciones, sobre los elementos de entrada para obtener la secuencia
de salida; además, puede usar también operaciones lineales.

generador seudoaleatorio m Proceso determinista capaz de generar una secuencia seudo-


aleatoria.
sigla PRNG
en pseudo random number generator

global system for mobile communication m Red que englobaba más del 80% de las conexio-
nes móviles en 2010.

GSM m Véase global system for mobile communication.



c FUOC • PID_00235167 55 Criptografía de clave simétrica

LFSR Véase registro de desplazamiento realimentado linealmente.

linear feedback shift register m Véase registro de desplazamiento realimentado lineal-


mente.

OFB Véase output feedback.

output feedback m Modo de operación del cifrado en bloque que usa el cifrador en bloque
como generador seudoaleatorio, usando la salida del cifrador a cada iteración para realimen-
tar el cifrado del bloque siguiente.

periodo m En una secuencia {si }i≥0 periódica, entero más pequeño p tal que si+p = si para
todo i ≥ 0.

polinomio de conexiones de un LFSR m Polinomio que determina o que es determinado


por la función lineal de realimentación del LFSR.

PRNG m Véase generador seudoaleatorio.

pseudo random number generator m Véase generador seudoaleatorio.

ráfaga f Conjunto de bits consecutivos iguales dentro de una secuencia.

registro de desplazamiento realimentado linealmente m Dispositivo físico o lógico for-


mado por n celdas de memoria y una función de realimentación lineal.
sigla LFSR
en linear feedback shift register

secuencia de cifrado f Secuencia que resulta del generador seudoaleatorio en un criptosis-


tema en flujo.

secuencia seudoaleatoria f Secuencia generada por un algoritmo determinista que exhibe


propiedades similares a las de una secuencia verdaderamente aleatoria.

Trivium m Generador seudoaleatorio ligero a partir de registros con realimentación no li-


neal.

c FUOC • PID_00235167 56 Criptografía de clave simétrica

Bibliografía
Cannière, C. de; Preneel, B. (2005). Trivium Specifications. Lovaina: Universidad Católica de
Lovaina.

Daemen, J.; Rijmen, V. (2002). The Design of Rijndael, AES - The Advanced Encryption Standard
(pág. 238). Springer-Verlag.

GSMA (2017). GSMA The Mobile Economy 2017.


<https://www.gsmaintelligence.com/research/>

Instituto Nacional de Estándares y Tecnología (2001). Advanced Encryption Standard (AES).


(núm. 197). <http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf>

Massey, J. L. (1969). “Shift-register synthesis and BCH decoding”. IEEE transactions donde
Information Theory (vol. 15, núm. 1, págs. 122-127).

Menezes, A.; Oorschot, P. van; Vanstone, S. (1996). Handbook of Applied Cryptography. Flo-
rida: CRC Press. <http://cacr.uwaterloo.ca/hac/>

Paar, C.; Pelzl, J. (2009). Understanding Cryptography: A Textbook for Students and Practitioners.
Nueva York: Springer.

Rukhin, A.; Soto, J.; Nechvatal, J. y otros (2010). A Statistical Test Suite for Random and
Pseudorandom Number Generators for Cryptographic Applications. Maryland: Instituto Nacional
de Estándares y Tecnología.
<http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf>

Stockinger, T. (2005). GSM network and its privacy - the A5 stream cipher.

También podría gustarte