Sie sind auf Seite 1von 27

Capı́tulo 5

Seguridad Criptográfica

En este tema vamos a dar una definición moderna de crip-


tosistema, definiremos que quiere decir romper el criptosistema
y probaremos bajo qué hipótesis existen criptosistemas seguros.
Los criptosistemas con los que trabajaremos serán de clave pri-
vada. Esto quiere decir que supondremos que las personas o en-
tidades A y B que quieren comunicarse se han intercambiado un
secreto o clave previamente. El cómo se consigue intercambiar
ese secreto se discutirá en el siguiente tema cuando hablemos de
clave pública.
Como vimos en el tema anterior, uno puede romper un crip-
tosistema usando no tanto la estructura del criptosistema en
sı́, como la estructura de los mensajes que usamos para encrip-
tar. Por lo tanto, tendremos que tener esto también en cuenta
y deberán considerarse en nuestras definiciones. Además, tam-
bién deberemos incluir en nuestras definiciones las capacidades
Figura 5.1: Claude Elwood
de cómputo, tanto de los usuarios como de los adversarios, ya
Shannon(1916-2001). Fuen-
que de nada sirve que el criptosistema sea seguro si los partes
te: Wikipedia
interesadas en usarlo/romperlo no pueden realizar los cálculos
necesarios en un tiempo razonable.
La criptografı́a moderna se podrı́a decir que nace con los trabajos de Claude Shannon.
A este matemático e ingeniero se le considera el padre de la teorı́a de información, y sentó
las bases para la teorı́a de códigos correctores que vimos en los primeros capı́tulos,1 y fue el
fundador de el estudio criptográfico moderno. Fue pionero en dar un enfoque matemático a la
criptografı́a exigiendo definiciones precisas y pruebas rigurosas.2
En este tema estudiaremos la criptografı́a de clave privada moderna. Veremos el resultado
de Shannon sobre encriptaciones perfectamente secretas. Veremos a lo largo del tema, que para
conseguir distintos niveles de seguridad necesitaremos disfrazarnos de azar.
1
Shannon, Claude Elwood (1948). ((A mathematical theory of communication)). Bell System Technical Jour-
nal 27 (379-423 and 623-656).
2
Shannon, Claude Elwood (1949). ((Communication theory of secrecy systems)). Bell System Technical Journal
28 (656-715).

1
5.1. Breve discusión de la teorı́a de la complejidad
5.1.1. Algoritmos
Una manera de definir formalmente lo que es un algoritmo es mediante el concepto de
máquina de Turing. Estas máquinas, pueden realizar una serie de operaciones elementales. La
maquina ejecuta una secuencia de estas operaciones que depende de la máquina en sı́ y alguna
entrada o parámetros que le demos a dicha máquina.
Se podrı́a definir algoritmo como una máguina de Turing, pero esto incrementarı́a la com-
plejidad de la exposición y en general tenemos una idea intuitiva de lo que es un algoritmo.
Por ejemplo, en el tema anterior hemos recordado el algoritmo de Euclides para el cálculo del
máximo común divisor, y todos entendemos que es una secuencia de operaciones básicas que
depende de los números para lo cuales queramos calcular el mcd. Nos quedaremos con esta idea
intuitiva ya que será suficiente y consideraremos que las operaciones elementales son aquellas
operaciones que realizamos de manera sencilla, como sumar dos dı́gitos, leer un dı́gito o escribir
un dı́gito.
Un algoritmo será por tanto una secuencia finita de instrucciones bien definida que dada
una entrada realiza una secuencia de operaciones elementales. Por bien definida nos referimos
a que el algoritmo siempre produce la misma secuencia de operaciones elementales bajo la
misma entrada.
En general, a las entradas de los algoritmos les podemos asignar un tamaño. Por ejemplo,
el número de bits que necesitamos para representar dicha entrada. La complejidad de tiempo
de un algoritmo es una cota superior del número de operaciones elementales necesarias para
llevar acabo el proceso en términos de la longitud de los parámetros de entrada.
Ejemplo 5.1.1 (Suma de dos números en binario).

Entrada: n = n0 + n1 2 + · · · + np 2p y m = m0 + m1 2 + · · · + mp 2q .
Proceso: ri = mi + ni + li donde li es cuanto nos llevamos de la suma anterior.
Repetimos t = máx(p, q) + 1 veces.
Salida: r0 + r1 2 + · · · + r2 22 + · · · + rt 2t .

El algoritmo emplea ≤ 3(máx(p, q) + 1) ≤ 3(p + q + 1) operaciones elementales. Su complejidad


de tiempo es lineal en los parámetros de entrada.
Diremos que un algoritmo A tiene complejidad (de tiempo) polinomial si existe un polinomio
p tal que el número de operaciones elementales que emplea A dada una entrada de longitud
≤ n está acotada por p(n).
Existe una operación elemental que generalmente no se considera en los algoritmos clási-
cos pero que es conveniente considerar. Esta operación elemental es tomar un bit de manera
aleatoria. Dado que nos interesa describir modelos de computación que puedan existir actual-
mente, el tomar números aleatorios (lanzar una moneda) es un tipo de operación que podemos
asumir que los algoritmos pueden realizar. Un algoritmo que use esta operación elemental lo
llamaremos algoritmo probabilı́stico. Observamos que un algoritmo probabilistico puede tener
procesos distintos con la misma entrada.

2
Ejemplo 5.1.2 (Algoritmo de integración de Montecarlo). Este es un algoritmo para el calculo
de integrales definidas en intervalos cerrados y acotados. El algoritmo toma como entrada una
función real de variable real f , un intervalo I = [a, b] y número n que será la tolerancia.
El algoritmo divide I en n subintervarlos I1 , I2 , . . . , In de [a, b] de la misma longitud, y usa
la posibilidad de generar números aleatorios para tomar n puntos aleatorios x1 ∈ I1 , x2 ∈
b−a
I2 , . . . , xn ∈ In , calcula ni=1
P
f (xi ).
n
Un algoritmo probabilistico de tiempo polinomial A es un algoritmo probabilistico para el
cual existe un polinomio p tal que para toda entrada de longitud ≤ n, el algoritmos A emplea
≤ p(n) operaciones elementales. Si queremos remarcar que un algoritmo no es probabilistico,
lo llamaremos determinista.
Escribiremos s ← A(e) para decir que s es la salida del algoritmo A con entrada e. En el
caso de que el algoritmo sea determinista escribiremos s = A(e).

5.1.2. Complejidad de algunas operaciones usuales


Hay que incidir en que la complejidad de un algoritmo, depende de como hemos dado
nuestra entrada al algoritmo y esto denderá del alfabeto o conjunto de sı́mbolos que usemos.
Por ejemplo, hemos visto que sumar dos números binarios tiene una complejidad polinómica.
¿Qué pasa si damos los números en 1-ario? Es decir, por ejemplo escribimos el número 5 como
11111 y en general el número n ∈ N como 1n . Veamos un ejemplo.
Ejemplo 5.1.3 (Suma de dos números en unario).

Entrada: a = 1n y b = 1m con n, m ∈ Z≥0 .


Proceso: Mientras b 6= 10 , añadimos un 1 a a y quitamos un 1 a b.
Salida: 1n+m .

El algoritmo emplea ≤ 2(n + m) operaciones elementales. Su complejidad de tiempo es lineal


en los parámetros de entrada.
Tanto el algoritmo de la suma en unario como la suma en binario necesitan un número de
operaciones lineales en la entrada.
Sin embargo, para dar un número n ∈ N en unario necesitamos n unos, mientras para
representarlo en binario necesitamos log2 (n) bits. Por tanto, al mismo problema que es el de
sumar dos números n y m, si estos están dados en binario usaremos ≈ log2 (n + m) operaciones
y si lo hacemos en unario n + m operaciones. Observamos que en el segundo caso estamos
usando exponencialmente más operaciones que en el primero.
Ejemplo 5.1.4 (Multiplicación de dos números n y m en binario). El algoritmo que apren-
demos en la escuela para calcular n · m es multiplicar n por la primera cifra de m, después
multiplicar n por la segunda cifra de n y mover las cifras una posición a la izquierda (multiplicar
por la base), etc. Al final sumamos todos esos números que hemos calculado.
Veamos un ejemplo concreto de multiplicar 29 · 13 en binario. En el caso de multiplicar en
binario, podemos multiplicar en cada paso por 1 (no hacemos nada) o por 0 (el resultado es
cero).

3
1 1 1 0 1
× 1 1 0 1
1 1 1 0 1
0 0 0 0 0
1 1 1 0 1
+ 1 1 1 0 1
1 0 1 1 1 1 0 0 1
Supongamos que n < m. Tenemos que sumar log2 n números, y cada uno de ellos tiene
longitud a los sumo log2 (n) + log2 (m) ≤ 2 log2 (m).

Tiempo(n × m) ≤ K2 log2 (n) log2 (m)


donde K es una constante.

A la hora de analizar la complejidad de un algoritmo, siempre buscamos tener una cota


superior para el número de operaciones en el tamaño de la entrada. En general nos basta
comparar el comportamiento asimptótico para decidir si un algoritmo es mas eficiente que
otro. Ası́ nos interesará si el algoritmo es lineal, cuadrático, cúbico, exponencial... pero no nos
fijaremos exactamente en la función que acota el tiempo usado por el polinomio.

Nota 5.1.5. Sean f, g funciones de Nr → R≥0 .


Diremos que f = O(g) si existen constantes B y C tales que

f (n1 , . . . , nr ) ≤ Cg(n1 , . . . , nr ) ∀(n1 , . . . , nr ) con ni > B.

El siguiente lema es sencillo y se deja su prueba como ejercicio.

Lema 5.1.6.
f (n)
f (n) = O(g(n)) ⇔ lı́m supn→∞ <∞
g(n)
log(n) = O(n ) para todo  > 0.

logb (n) = O(logb0 (n)) para todo b, b0 > 1.

En particular, desde el punto de vista de O, no importa la base en la que trabajemos


(mientras no sea base 1). Además vemos que g ∈ O(f ) 6⇒ f ∈ O(g).
En esta notación, hemos visto que la suma y el producto se pueden calcular con el siguiente
número de operaciones

Tiempo(n + m) = O(log(m + n))

Tiempo(n × m) = O(log2 (m + n))

De forma similar, analizando como se calcular la división de dos números

Tiempo(m/n) = O(log2 (m + n))

4
Las operaciones de suma, multiplicación y división son crı́ticas y cualquier algoritmo que
mejore los anteriores tiene una gran importancia. Por ejemplo, se sabe que la complejidad de
la multiplicación se puede mejorar, obteniendo que Tiempo(producto k − bits × k − bits) =
O(k log(k) log(log k)). Sin embargo, no entraremos en este tipo de detalles.
Para terminar, veamos dos operaciones algo más complejas que usaremos en muchos a
menudo. La primera es calcular identidades de Bezout y la segunda es exponenciar módulo n.

Proposición 5.1.7. Supongamos a ≥ b

1. Tiempo(mcd(a, b) usando alg Euclides) = O(log3 (a))

2. Tiempo(d = ax + by usando alg Euclides) = O(log3 (a))

Demostración. Repasemos el algoritmo de Euclides

a = bq1 + r1 mcd(a, b) = mcd(b, r1 )


b = r1 q2 + r2 mcd(b, r1 ) = mcd(r1 , r2 )
..
.
rk−1 = rk qk+1 + rk+1 mcd(rk−1 , rk ) = mcd(rk , rk+1 )
rk = rk+1 qk+2 + 0 mcd(rk , rk+1 ) = rk+1 .

Calcular cada división cuesta O(log2 (a)), ası́ que cada paso han sido ≤ O(log2 (a)) operaciones.
La clave es acotar el número de pasos. Veamos que rj+2 < 21 rj .
1
Efectivamente, si tenemos que rj+1 ≤ rj entonces como rj+2 < rj+1 , obtenemos la
2
desigualdad buscada. Si suponemos que rj+1 > 21 rj . Entonces qj+1 = 1 y tenemos que
1
rj = rj+1 + rj+2 y por tanto rj+2 = rj − rj+1 < rj .
2
Ası́ que por lo tanto tenemos a lo sumo 2 log2 (a) pasos. Y ası́ hemos podido calcular
mcd(a, b) con O(2 log2 (a) log2 (a)) operaciones. Para calcular la identidad de Bezuout, sola-
mente hay que ir hacia atrás sustituyendo el valor de rj en términos de los valores obtenidos
en el paso siguiente. Esta sustitución se hace empleando sumas y restas, y tenemos que hacer
otra vez a lo sumo 2 log2 (a) pasos. Ası́ que en total tenemos que invertir aproximadamente el
doble de operacioens de O(log3 (a)) que sigue siendo O(log3 (a)).

Exponenciación módulo m. Dado 0 ≤ b ≤ m queremos calcular bn mód m. Una primera


aproximación serı́a calcular bn usando n multiplicaciones por b y acabar reduciendo módulo n.
Un sencillo análisis, nos dice que este procedimiento serı́a exponencial en la longitud de b en
binario. Efectivamente:

• Operación Complejidad
b2 b·b O(log2 b)
b3 b2 · b O(log2 b2 ) = O(22 log2 b)
.. .. ..
. . .
bn bn−1 · b O(log2 bn−1 ) = O(n2 log2 b)

5
En particular, si b tiene longitud k (= log b), para calcular bn con este método necesitamos
O(k 2 ek ) operaciones elementales. Veamos que hay una manera mucho más razonable para
hacer este cálculo.

Proposición 5.1.8.
Tiempo(bn mód m) = O(log(n) log2 (m))

Demostración. Expresemos n en binario:

n = n0 + 2n1 + 4n2 + · · · + 2i ni + . . . 2k nk ,

donde los ni ∈ {0, 1}. Observamos k = log2 n.


Definimos el siguiente el algoritmo. Sea a una nueva variable que denota el producto parcial
calculado en cada paso. Empezamos poniendo a = 1. Sea b0 = b y bi = (bi−1 )2 mód m.
Repetimos desde i = 0 hasta i = k

Si ni = 0 no hacemos nada.

Si ni = 1, cambiamos a por a · bi mód m.

El algoritmo tiene como salida a = bn mód m. El número de pasos empleados ha sido


k = log2 n y en cada paso hemos usado el algoritmo de multiplicar dos números longitud a
lo sumo log2 m y hallar el resto (dividir) un número de a lo sumo 2 log2 m cifras por m. Los
dos algoritmos tienen un coste cada uno de a lo sumo O(log2 m) operaciones. Ası́ que en total
hemos empleado O(log n log2 m).

Ejemplo 5.1.9. Supongamos que queremos calcular 3875 mód 103. Primero expresamos 75
en binario
75 = 20 + 21 + 23 + 26

382 ≡ 2 mód 103


22
38 ≡ 22 ≡ 4 mód 103
23
38 ≡ 42 ≡ 16 mód 103
24
38 ≡ 162 ≡ 50 mód 103
25 2
38 ≡ 50 ≡ 28 mód 103
26 2
38 ≡ 28 ≡ 63 mód 103

Ası́ tenemos
3 +26
3875 = 381+2+2 ≡ 38 · 2 · 16 · 63 ≡ 79 mód 103

Aprovechando que hemos hablado de exponenciar módulo m, a la función inversa se le


denomina el logaritmo inverso. Recordamos que dado m, b ∈ U (Z/mZ) el logaritmo discreto
en base b de x ∈ Z/mZ, denotado logb (x), es un número n tal que x ≡ bn mód m. Siempre
podemos tomar n entre 0 y o(b), el orden de b.

6
Acabamos de ver tenemos un algoritmo eficiente para calcular bn mód m. Se cree que
exponenciar módulo m es una función de un sólo sentido. La definición formal la veremos
al final de este tema, pero básicamente la idea es que pese que exponenciar es un proceso
poco costoso computacionalmente, su proceso inverso, calcular el logaritmo, es muy costoso
computacionalmente.

5.1.3. P vs NP
Uno de los siete problemas del milenio del Clay Institute of mathematics es problema de
P contra N P . Este problema pregunta si dos familias de algoritmos, definidos en términos de
su complejidad, son iguales o no.
Dado que no hemos dado una definición formal de máquina de Turing, tampoco daremos
una definición formal de las clases P y N P . Sin embargo, igual que durante el resto de la
sección, una idea informal es suficiente para entender en qué consiste el problema P vs N P .

P : problemas para los que existe un algoritmo deterministico de tiempo polinomial en-
contrar la solución.

N P : problemas para los que existe un algoritmo deterministico de tiempo polinomial que
comprueban que si algo es solución del problema.

Lo primero que hay que observar es que la clase P está contenida en la clase N P . La
pregunta es por tanto si hay algún problema en la clase N P que no esté en la clase P .
Un ejemplo de clásico de problema N P es el problema de decidir si un mapa plano se puede
colorear con 3 colores (dos paises adyacentes tienen que usar colores distintitos). Se sabe que
siempre se puede hacer con 4 y si uno da un coloreado con 3 colores, es inmediato comprobar
que dicho colorado es o no una solución al problema, y por lo tanto el problema de decidir si un
mapa es 3-coloreable está en P . Además, este problema (como el resto de problemas N P ) se
puede resolver en tiempo exponencial, ya que podemos probar todos los posibles 3-coloreados
del mapa que hay 3n , donde n es el número de paı́ses y comprobar si alguno de ellos es una
solución.
El problema del 3-coloreado es además N P -completo que quiere decir que si alguien prueba
que este problema está en la clase P , entonces P = N P .
Muchos juegos o puzzles que nos entretienen son problemas N P . Es complicado encontrar
una solución pero es relativamente fácil comprobar que hemos ganado. Por ejemplo, el Su-
doku también es N P -completo. Para que esta última afirmación tenga sentido tenemos que
considerar Sudokus generalizados n2 × n2 .
En principio, este problema no tiene repercusiones inmediatas sobre la criptografı́a, aunque
si se probase que P = N P habrı́a que comprobar si algún criptosistema está usando como
hipótesis que para cierto problema no hay algoritmos deterministas de tiempo polinomial.

5.2. Criptografı́a de clave privada moderna


Los criptosistemas que vimos hasta ahora asumı́an que la clave para encriptar y desencriptar
era un secreto común compartido entre las dos partes que intervienen en la comunicación.

7
Este tipo de criptosistemas se llaman de clave privada y en el criptosistema no se discute
como se hace para establecer ese secreto común, también llamado el intercambio de claves. El
intercambio de claves se puede solucionar usando criptografı́a de clave pública, que veremos
en el siguiente tema. Sin embargo, por ahora, nos centramos en la clave privada, veremos un
enfoque moderno y discutiremos las posibilidades de alcanzar diversos niveles de seguridad.
Por simplicidad, supondremos que el alfabeto siempre es {0, 1} y K, P, C ⊆ {0, 1}∗ .

Definición 5.2.1. Un criptosistema de clave privada Π es una tupla Π = (Gen, Enc, Dec) de
algoritmos probabilı́sticos de tiempo polinomial que satisfacen:

El algoritmo de generación de claves Gen tiene como entrada un parámetro de seguridad


n ∈ N y k ← Gen(n), satisface `(k) ≥ n.

El algoritmo de encriptación tiene como parámetros k ∈ K y m ∈ Pk , un conjunto finito


no vacı́o de mensajes que depende de k, y es polinómico en `(k) + `(m). Tiene salida
c ← Enck (m).

El algoritmo de desencriptación Dec tiene como parámetros k ∈ K y c ∈ C y es polinómico


en `(k) + `(c). Asumimos que Dec es determinista y satisface m = Deck (Enck (m)).

Respecto a la definición que tenı́amos de criptosistema clásico, tenemos una serie de cambios
que debemos señalar. Primero, hemos especificado un algoritmo Gen que es el que decidirá la
clave a utilizar. El mismo criptosistema puede ser más o menos seguro dependiendo de cómo
elijamos las claves que emplearemos. Por eso, a la hora de decidir si un criptosistema es seguro
o no, tenemos que considerar el modo en el que se eligen las claves. De todas formas, en la
mayorı́a de los casos, podemos suponer que Gen(n) elige una clave k ∈ {0, 1}n uniformemente
al azar.
La razón de requerir que Enc sólo pueda encriptar mensajes de un conjunto finito Pk es una
condición principalmente técnica para poder definir fácilmente una distribución de probabilidad
en el espacio Pk , pero no supone una limitación real. En general, simplemente escribiremos P
sin referencia a la clave k. En la mayorı́a de los casos tomaremos P = {0, 1}f (n) donde n es el
parámetro de seguridad y f es una función.
Observamos que Gen al ser un algoritmos de tiempo polinomial, su salida nunca puede
tener una longitud arbitrariamente larga. Ası́, dado n {k | k ← Gen(n)} es un conjunto finito,
y tiene una distribución de probabilidad que está generada por el algoritmo Gen.
A efectos prácticos, podemos pensar que fijado n, nuestro criptosistema trabaja con un
conjunto de claves Kn finito y un conjunto de mensajes Pn = ∪k∈Kn Pk finito. Y por lo tanto
el conjunto de posibles textos cifrados Cn = {c | c ← Enck (m), k ∈ Kn , m ∈ Pn } es finito. Sin
embargo, para simplificar la notación, sólo hablaremos de K, P, C sin sub-ı́ndices y pensando
que en cada caso son conjuntos finitos que dependen del parámetro de seguridad n.
El requerir que Enc y Dec sean algoritmos de tiempo polinomial es una condición razonable
ya que a la hora de transmitir la información queremos que esto se produzca en un tiempo
razonable. Para implementaciones en la vida real, se requiere que estos algoritmos sean real-
mente rápidos (tiempos acotados por polinomios de grado bajo). Sin embargo, en este tema
no entraremos en esas consideraciones.

8
5.3. Criptosistemas perfectamente secretos
Habı́amos visto que el análisis de frecuencias nos permitı́a diseñar un ataques de texto
cifrado conocido de los criptogramas de Cesar, Afines, Vigenère etc. Eso se debı́a a que P
tiene una cierta estructura que nos ha permitido descifrar los mensajes. Dicho de otra forma.
Hay una distribución de probabilidad en P que hace que ciertos mensajes o cadenas sean más
probables que otros. La distribución de probabilidad sobre P será una hipótesis a la hora de
definir seguridad.
Esta distribución de probabilidad combinada con la distribución de probabilidad generada
por Gen en K y con los algoritmos probabilı́sticos Enck define una distribución de probabilidad
sobre C. Ası́ si K, P, C son variables aleatorias sobre K, P, C escribiremos respectivamente

Pr[M = m] la probabilidad de seleccionar el mensaje m ∈ P.

Pr[C = c] la probabilidad de que el mensaje cifrado sea c ∈ C.

Pr[K = k] la probabilidad de usar la clave k ∈ K.

La siguiente definición la propuso Shannon.

Definición 5.3.1. Un criptosistema (Gen, Enc, Dec) es perfectamente secreto si para cualquier
distribución de probabilidad sobre P, para todo m ∈ P y para todo c ∈ C con Pr[C = c] > 0
tenemos que
Pr[M = m | C = c] = Pr[M = m].

La condición que c satisface Pr[C = c] > 0 es una puramente técnica para que la probabi-
lidad condicionada tenga sentido. Por simplicidad, supondremos siempre que nuestras distri-
buciones de probabilidad en P y las asociadas a C satisfacen Pr[C = c] > 0 y Pr[M = m] > 0
para todo m ∈ P y para todo c ∈ C, ya que si no fuese ası́, podrı́amos cambiar P y C por
subconjuntos que satisfagan esta condición.
La definición dice esencialmente que conocer el texto cifrado no nos da ninguna información
sobre que texto plano se ha cifrado. En particular, y esto lo formaliza el ejercicio 5.3.3, dado
un texto cifrado c tenemos varios textos planos que son igual de probables que produzcan c.
La definición de seguridad asume que el adversario no puede tener acceso a la clave de
cifrado, y en ningún caso posemos asegurar algún tipo de seguridad ante esta situación. Hay
que tener en cuenta, que esto es algo que ocurre en la vida real, los ataques de ingenierı́a social
como el phishing, buscan que las partes implicadas revelen la clave secreta y las nociones de
seguridad que estudiamos no contemplan este tipo de ataques.

Ejemplo 5.3.2 (Cifrado de Vernam o libreta de un sólo uso). Es un criptosistema patentado


en 1917 por Vernam, veremos que es perfectamente seguro. El Cifrado de Vernam no es más
que un cifrado de Vigenère donde la clave es tan larga como el texto cifrado. Se cree que el
teléfono rojo que conectaba la casa blanca y el Kremlin durante la guerra frı́a estaba protegido
por una libreta de un solo uso.
Consideramos el alfabeto A = {0, 1}, identificado con Z/2Z. Dado el parámetro n tomamos
P = C = K = {0, 1}n = (Z/2Z)n . Definamos Gen, Enc, Dec.

9
Gen(n) escoge aleatoriamente k ∈ {0, 1}n con respecto a la distribución uniforme.

para m ∈ P = {0, 1}n , m + k = Enck (m) (en este caso el algoritmo es determinista).

para c ∈ C = {0, 1}n , c + k = Deck (c).

Observamos que tanto Gen, Enc, Dec tienen complejidad O(n).


Veamos que el criptosistema de Vernam es es perfectamente seguro. Fijamos una distribu-
ción de probabilidad sobre P y sean m ∈ P y c ∈ C arbitrarios.
1
Primero observemos que Pr[C = c] = n . Efectivamente
2
X
Pr[C = c] = Pr[C = c | M = m]Pr[M = m]
m∈M
X
= Pr[K + M = c | M = m]Pr[M = m]
m∈P
X
= Pr[K = c + m]Pr[M = m]
m∈P
1 X 1
= n
Pr[M = m] = n
2 2
m∈M

Ahora vemos que el criptosistema es perfectamente seguro. Usando Bayes tenemos que

Pr[C = c | M = m]Pr[M = m]
Pr[M = m | C = c] =
Pr[C = c]
1 1
Como hemos visto Pr[C = c] = n
y Pr[C = c | M = m] = n y por tanto
2 2
Pr[C = c | M = m]Pr[M = m]
Pr[M = m | C = c] = = Pr[M = m].
Pr[C = c]

El criptositema de Vernam o libreta de un solo uso, data al menos de 1917 donde Gilbert
Vernam dio una descripción de este criptosistema. Durante mucho tiempo se creyó que este
criptosistema era “irromplible”, aunque no se tenı́a una idea muy clara de qué querı́a decir
esto. No fue hasta 30 años más tarde que Shanon dio una definición matemática y de lo que
querı́a decir “perfectamente secreto”.
Como hemos visto aunque el criptosistema de Vernam sea perfectamente seguro, es un
criptosistema poco práctico. La complejidad de compartir claves de la misma longitud que el
mensaje a encriptar esta fuera del alcance de la mayorı́a de las personas, y aún en el caso que
se pueda conseguir compartir claves, estas tienen que ser cambiadas en cada uso.
Hay que hacer hincapié que como dice el nombre “libreta de un solo uso”, la clave se puede
usar una única vez por mensaje, ya que si siempre usamos la misma clave no estarı́amos usando
un criptosistema tipo Vigenère.
Las ideas de la siguiente equivalencia están en el Ejemplo 5.3.2 y se dejan como ejercicio.

10
Ejercicio 5.3.3. Sea Π = (Gen, Enc, Dec) un criptosistema. Demuestra que las siguientes
afirmaciones son equivalentes:
(i) Π es perfectamente secreto.
(ii) para cualquier distribución de probabilidad sobre P, para todo m ∈ P y para todo c ∈ C
tenemos que
Pr[C = c | M = m] = Pr[C = c].

(iii) para cualquier distribución de probabilidad sobre P, para todos m0 , m1 ∈ P y para todo
c ∈ C tenemos que

Pr[C = c | M = m0 ] = Pr[C = c | M = m1 ].

5.3.1. Caracterización de los criptosistema perfectamente secretos


Ahora que tenemos una buena definición de seguridad y al menos un ejemplo de cripto-
sistema que lo cumple, la cuestión es si existen criptositemas perfectamente secretos que sean
más prácticos que la libreta de un solo uso. Veremos el Teorema de Shannon, que nos dice que
el criptosistema de Vernam es ’esencialmente’ el único cifrado perfectamente seguro.
Observemos que como Deck (Enck (m)) = m, Enck es “inyectivo”. Aunque Enck no es una
función, ya que es un algoritmo probabilı́stico y a la misma entrada puede dar distintas salidas,
lo que si ocurre es que si c ← Enck (m) y c ← Enck (m0 ) entonces m = Deck (c) = m0 . Ası́
siempre tenemos que |C| ≥ |P|.
Empezamos con la observación de que se necesitan al menos tantas claves como texto plano.
Lema 5.3.4. Supongamos que (Gen, Enc, Dec) es un criptosistema perfectamente secreto sobre
un espacio de mensajes P. Entonces para todo c ∈ C y todo m ∈ P existe k ∈ K tal que
Deck (c) = m. En particular |K| ≥ |P|.
Demostración. Sea c ∈ C y definimos

P(c) := {m0 | m0 = Deck (c), k ∈ K}.

Si P(c) 6= P, entonces existe m ∈ P tal que Pr[M = m | C = c] = 0. Pero entonces, tomando


la distribución uniforme sobre P tenemos que
1
Pr[M = m | C = c] = 0 6= Pr[M = m] = ,
|P|
y el criptosistema no puede ser perfectamente secreto.
Ası́ que tenemos que para todo c ∈ C, P(c) = P y por tanto K → P, k 7→ Deck (c) ∈ P es
sobreyectiva y |K| ≥ |P|. Fijamos m ∈ P, y sea C(m) = {c ← Enck (m) | k ∈ K}.

Por lo tanto si Π es perfectamente secreto tenemos que |K| ≥ |P| y |C| ≥ |P|. En el caso
que tengamos igualdades, |K| = |P| = |C| tenemos esta caracterización de Shannon.
Teorema 5.3.5 (Teorema de Shannon (1949)). Supongamos que Π = (Gen, Enc, Dec) es un
criptosistema sobre un espacio de mensajes P tal que |P| = |C| = |K|. Entonces es criptosistema
perfectamente secreto si y solo si

11
(1) Gen escoge cada clave de K con la misma probabilidad

(2) ∀m ∈ P y ∀c ∈ C hay una única k ∈ K tal que Enck (m) produce c.

Demostración. Si un criptosistema cumple (1) y (2), entonces es esencialmente como la libreta


de un solo uso, y los argumentos del Ejemplo 5.3.2 se adaptan perfectamente para probar que
Π es perfectamente secreto.
Veamos entonces que perfectamente secreto implica (1) y (2).
Fijados c ∈ C y m ∈ P el Lema 5.3.4 nos dice que existe al menos k1 ∈ K tal que m =
Deck1 (c). Si existiese k2 ∈ K tal que m = Deck2 (c) entonces la función K → P, k 7→ Deck (c)
no serı́a inyectiva y habrı́a m ∈ P que nunca se podrı́a encriptar como c, contradiciendo el
Lema 5.3.4. Por tanto, dado c ∈ C y m ∈ P existe una única k ∈ K con m = Deck (c). Por
tanto dado c ∈ C y m ∈ P existe una única k ∈ K con c ← Enck (m) y hemos probado (2).
De hecho, podemos concluir que Enck tiene que ser determinista ya que {c ∈ C | c ←
Enck (m) para algún m ∈ P} tiene al menos |P| elementos por ser Enck inyectiva, y a lo sumo
|C|. Por cardinalidad tenemos que {c ∈ C | c ← Enck (m)} tiene que tener un único elemento.
Fijamos ahora c0 ∈ C y dado m ∈ P denotamos por km a la única clave tal que c0 =
Enckm (m). Tenemos que

Pr[C = c0 | M = m]Pr[M = m]
Pr[M = m | C = c0 ] =
Pr[C = c0 ]
Pr[K = km ]Pr[M = m]
=
Pr[C = c0 ]

Como estamos suponiendo que Π es perfectamente secreto, tenemos que

Pr[K = km ]Pr[M = m]
Pr[M = m] = Pr[M = m | C = c0 ] =
Pr[C = c0 ]

y por tanto Pr[K = km ] = Pr[C = c0 ] para todo m ∈ P forzando que la distribución en K sea
uniforme. Esto prueba (1).

5.3.2. Otro enfoque para los criptosistemas perfectamente secretos


La definición de perfectamente secreto aun siendo una buena definición, tiene varios pro-
blemas. El primero y más serio es que los criptosistemas que satisfacen la definición van a ser
poco viables. La segunda, es que aunque quisiésemos tomar esa definición como punto base y
después debilitarla levemente para intentar admitir criptosistemas más versátiles, no hay una
manera obvia para debilitarla.
Una de las maneras de debilitar nuestra condición de perfectamente secreto es imponiendo
restricciones al computo del adversario, ya que es una limitación del mundo real que no hemos
incorporado aún en nuestras definiciones. Para ello, vamos a buscar una noción que sea igual
de válida que perfectamente secreto que incorpore a un adversario.
Un adversario no será más que un algoritmo probabilistico A, sin embargo, no vamos a poner
ninguna restricción para A. La complicación viene a la hora de decidir qué quiere decir que un
adversario “rompa” nuestro criptosistema. Partiendo de perfectamente secreto, queremos que

12
“romper” signifique que en alguna situación, el adversario conociendo c ← Enck (m) sea capaz
de obtener alguna información sobre m.
Definimos el siguiente juego en el que A gana si consigue desencriptar dándole además dos
posibilidades respecto a las cuales hemos podido obtener el texto cifrado.

Definición 5.3.6. Experimento de indistinguibilidad para espı́as. Dado un criptosistema Π =


(Gen, Enc, Dec) y un adversario A definimos el siguiente juego:

Le damos a A el parámetro n y adversario A elige m0 , m1 ∈ P.

Usamos Gen para generar una clave i.e. k ← Gen, elegimos b ∈ {0, 1} con probabilidad
uniforme y producimos c ← Enck (mb ) y se lo damos a A.

b0 ← A(m0 , m1 , c) donde b0 ∈ {0, 1}.

Definimos (
1 si b = b0
ExpIndespia
Π,A =
0 6 b0
si b =

Observamos que la única elección que hacemos nosotros es la del parámetro n. Esto es
importante ya que es un parámetro con el que controlaremos el nivel de seguridad y siempre
tendremos la posibilidad de fijarlo independientemente de lo que haga el adversario.
El adversario tiene total libertad para elegir los mensajes m0 , m1 ∈ P con los que quiere
jugar. De lo que se trata es que aún en la situación más ventajosa para A, comprobar si A es
capaz de obtener alguna información.
Dado que A es un algoritmo probabilı́stico y fijado A y Π, ExpIndespia Π,A es una variable
aleatoria que toma valor 1 si A acierta que mensaje se ha encriptado (A gana el juego) y 0
en otro caso (A pierde el juego). Ası́ si el criptosistema no fuese seguro, deberı́a haber algún
adversario A que sea capaz de ganar el juego mejor que jugando totalmente al azar. Por eso
hacemos la siguiente definición.

Definición 5.3.7. Un criptosistema Π = (Gen, Enc, Dec) es perfectamente indistinguible para


espı́as, si para todo adversario A
1
Pr[ExpIndespia
Π,A = 1] = .
2
Vamos a ver ahora un ejemplo de criptosistema que no es perfectamente indistinguible
para espı́as, para entender cómo podrı́a operar el adversario A.

Ejemplo 5.3.8. Supongamos que Π es un criptosistema de tipo Vigenère sobre el alfabeto


{0, 1}. Supongamos que Gen(n) elige con probabilidad uniforme ` ← {1, 2, 3, . . . , n} y después
elige con probabilidad uniforme una palabra k0 ← {0, 1}l y la clave k ∈ K = {0, 1}n será igual
a repetir k0 hasta obtener una palabra de longitud n.
Tomaremos Pk = {0, 1}n y Enck (m) = k + m y Deck (m) = k + m.
Consideramos el adversario A que hace lo siguiente: Cuando le damos n, A elige mensajes
m0 = 0n y m1 = 010101 · · · ∈ {0, 1}n . Cuando recibe el texto cifrado c = c1 c2 . . . cn , A elige

13
b0 = 0 si c1 = c2 y 1 en caso contrario. Observamos que la probabilidad de que el adversario
gane el juego es
1 1
Pr[ExpIndespia espia espia
Π,A = 1] = Pr[ExpIndΠ,A = 1 | b = 0] + Pr[ExpIndΠ,A = 1 | b = 1]
2 2
1 1
= Pr[A elige 0 | b = 0] + Pr[A elige 1 | b = 1]
2 2
Tenemos que considerar los dos casos para b por separado
Si b = 0 entonces m = 0n . En este caso c1 = c2 si y solo si ell = 1 (que tiene probabilidad 1/n)
o ` > 2 (que tiene probabilidad 1 − 1/n) y las dos primeras letras de k0 sea iguales (evento que
tiene probabilidad 1/2). Poniendo todo junto
 
1 1 1 1
Pr[A elige 0 | b = 0] = + 1 − · = + 12n
n n 2 2

Si b = 1 entonces m = 0101010 . . . . En este caso c1 = c2 si y solo si ` ≥ 2 (que tienen


probabilidad 1 − 1/n) y k0 = 01 . . . o k0 = 10 . . . (y este evento tiene probabilidad 1/2)
 
1 1 1 1
Pr[A elige 1 | b = 1] = 1 − Pr[A elige 0 | b = 1] = 1 − 1 − · = +
n 2 2 2n

Poniéndolo todo junto tenemos:


1 1
Pr[ExpIndespia
Π,A = 1] = Pr[A elige 0 | b = 0] + Pr[A elige 1 | b = 1]
2   2
1 1 1 1 1
=2· + = + .
2 2 2n 2 2n

Por tanto este criptosistema no es perfectamente indistinguible para espı́as.

Es fácil ver que en el ejemplo anterior, si hubiésemos usado el cifrado de Vernan o libreta de
un solo uso (i.e. k0 siempre fuese de longitud n), entonces la el adversario que hemos descrito
tendrı́a probabilidad 1/2 de ganar.
Una observación importante del Ejemplo 5.3.8 es ver la probabilidad de éxito del adversario
está acotada controlada por n. A medida que hagamos nuestro parámetro de seguridad n más
grande, la estrategia del adversario de 5.3.8 será cada vez más parecida a dar una respuesta al
azar. A efectos prácticos, si todos los adversarios tuviesen una probabilidad de acertar que fuese
1 1
≤ + , tomando n suficientemente grande, tendrı́amos bastante confianza en la seguridad
2 n
de nuestro criptosistema. Este será el camino que seguiremos en la siguiente sección.
Para ver que efectivamente, vamos a necesitar debilitar la definición de perfectamente indis-
tinguible para espı́as vamos a ver esta definición es tan fuerte como la definición de criptosistema
perfectamente secreto, y por tanto es un nivel de seguridad tan grande que hace que sea poco
viable en la práctica.

Proposición 5.3.9. Sea Π = (Gen, Enc, Dec) un criptosistema perfectamente indistinguible


para espı́as si y sólo si Π es perfectamente secreto.

14
Demostración. Supongamos que Π es perfectamente indistinguible para espı́as. Fijemos una
una distribución de probabilidad en P, y fijemos c ∈ C con Pr[C = c] > 0. Tenemos que ver
que para todo m ∈ P tenemos que
Pr[M = m | C = c] = Pr[M = m].
Supongamos que no fuese ası́. Por tanto existe m0 ∈ P que satisface que Pr[M = m0 | C =
c] 6= Pr[M = m0 ]. Entonces A puede construir conjuntos
P< = {m ∈ P | Pr[M = m | C = c] < Pr[M = m]}
y
P≥ = {m ∈ P | Pr[M = m | C = c] ≥ Pr[M = m]}.
Dado que m∈P Pr[M = m | C = c] = m∈P Pr[M = m] como Pr[M = m0 | C = c] 6=
P P
Pr[M = m0 ], entonces los dos conjuntos P< y P≥ son no vacı́os. Efectivamente, si P< fuese
0 | C = c] > Pr[M = m0 ] y tendrı́amos que 1 =
P
vacı́o, entonces
P Pr[M = m m∈P Pr[M =m|
C = c] > m∈P Pr[M = m] = 1, una contradicción. De manera similar vemos que P≥ 6= ∅.
Ahora A elige m0 ∈ P< y m1 ∈ P≥ y actúa de la siguiente manera. Si le dan c0 6= c, A
elige b0 ← {0, 1} uniformemente al azar. Si le dan c0 = c, entonces A elige b = 1. Tenemos
Pr[ExpIndespia
Π,A = 1] =

1 1
= Pr[A elige 0 | M = m0 ] + Pr[A elige 1 | M = m1 ]
2 2
1 1 1 1
= [(1 − Pr[C = c]) ] + [(1 − Pr[C = c]) + Pr[C = c]]
2 2 2 2
1
= (1 + Pr[C = c])
2
1
> .
2
Esto es una contradicción con que el criptosistema es perfectamente indistiguible para espı́as.
Por tanto tenemos que para todo c ∈ C con Pr[C = c] > 0, Pr[M = m | C = c] = Pr[M = m]
y Π es perfectamente secreto.
Supongamos ahora que Π es perfectamente secreto. Sea A un adversario fijado. Denotamos
por B 0 la variable aleatoria de la elección de A y por B la variable aleatoria de la elección del
texto encriptado. Veamos que
Pr[A elige 1 | se ha encriptado m1 ] = Pr[A elige 1 | se ha encriptado m0 ].
Efectivamente
Pr[A elige 1 | se ha encriptado m1 ] =
= Pr[B 0 = 1 | B = 1]
X
= Pr[B 0 = 1 | C = c] · Pr[Deck (c) = m1 ]
c∈C
X
= Pr[B 0 = 1 | C = c] · Pr[Deck (c) = m0 ] Ejercicio 5.3.3(ii)
c∈C
= Pr[B 0 = 1 | B = 0].

15
Por tanto tenemos que

Pr[ExpIndespia espia
Π,A = 1 | B = 1] = Pr[ExpIndΠ,A = 0 | B = 0].

De forma similar uno obtiene que

Pr[A elige 0 | se ha encriptado m1 ] = Pr[A elige 0 | se ha encriptado m0 ],

de lo que se deduce que

Pr[ExpIndespia espia
Π,A = 0 | B = 1] = Pr[ExpIndΠ,A = 1 | B = 0].

Por tanto la probabilidad de que A gane el juego es

Pr[ExpIndespia
Π,A = 1] =

= Pr[ExpIndespia espia
Π,A = 1 | B = 0]Pr[B = 0] + Pr[ExpIndΠ,A = 1 | B = 1]Pr[B = 1]
1
= (Pr[ExpIndespia espia
Π,A = 1 | B = 0]] + Pr[ExpIndΠ,A = 1 | B = 1])
2
1
= (Pr[ExpIndespia espia
Π,A = 0 | B = 0]] + Pr[ExpIndΠ,A = 0 | B = 1])
2
= Pr[ExpIndespia
Π,A = 0].

Por tanto Pr[ExpIndespia 1


Π,A = 1] = 2 .

Una observación que será importante en el futuro:

Corolario 5.3.10. El criptosistema de Vernam es perfectamente indistiguible.

Demostración. En el ejemplo 5.3.2 habı́amos visto que el criptosistema de Vernam era perfec-
tamente secreto.

Ahora tenemos dos definiciones equivalentes pero la definición de perfectamente indistingui-


ble será más apropiada para generalizar y debilitar que ser perfectamente secreto. En la prueba
anterior, hemos usado que el adversario en la definición de perfectamente indistinguible tiene
una capacidad de computo ilimitado (es capaz de conocer P< , P≥ ). Esto tipo de situaciones no
las consideraremos más adelante. A la hora de generalizar nuestras definiciones utilizaremos
los siguientes dos principios de seguridad:

La seguridad sólo se garantizará contra adversarios eficientes que son capaces de realizar
su ataque en un tiempo razonable.

Los adversarios pueden descifrar el texto cifrado con una probabilidad muy pequeña.

16
5.4. Encriptaciones indistiguibles para espı́as
Como indicamos con el Ejemplo 5.3.8, utilizaremos el parámetro de seguridad n de Gen
para controlar la probabilidad de éxito de los adversarios. Para ellos, introducimos el concepto
de función negligible

Definición 5.4.1. Diremos que una función f es negligible3 si para todo polinomio positivo p
existe N tal que para todo n > N
1
f (n) < .
p(n)

Por ejemplo, las funciones 2−n , 2− n y n− log n son negligibles.
El siguiente lema es fácil de probar y su demostración se deja como ejercicio.

Lema 5.4.2. Sean f y g funciones negligibles. Entonces f +g es negligible y para todo polinomio
p, p · f es negligible.

Diremos que A ∈ PPT si A es un algoritmo probabilistico que trabaja en tiempo polinomial.


Consideraremos la siguiente noción de seguridad.

Definición 5.4.3. Un criptosistema de clave privada Π = (Gen, Enc, Dec) tiene encriptacio-
nes indistiguibles para espı́as si para todo adversario A ∈ PPT, existe una función negligible
negl tal que
1
Pr[ExpIndespia
A,Π (n) = 1] ≤ + negl(n)
2
dónde la probabilidad se toma respecto a las variable aleatorias usados para el experimento y
por los bits aleatorias usadas por los algoritmos durante el experimento.

Algunos comentarios sobre la definición. Por un lado la definición de encriptaciones indis-


tiguible relaja la definición de perfectamente seguro concediendo un pequeño margen de éxito
al adversario, aunque es más restrictiva respecto a los adversarios que permite. La definición
garantiza seguridad contra ataques de texto cifrado conocido la situación más simple ante la
que hay que garantizar seguridad, pero no ante ataques más sofisticados como a ataques de
texto plano conocido, de texto plano escogido o de texto cifrado escogido.
La definición captura fielmente la situación del mundo real y por ello es una buena definición
de seguridad, sin embargo, el que se adapte bien al mundo real, hace que sea una definición
poco manejable. Reduciremos la existencia de criptosistemas con encriptaciones indistiguibles
a la existencia de objetos más simples. En concreto la existencia de algoritmos que generan
números pseudo aleatorios.

5.4.1. Generadores de números pseudoaleatorios


Habı́amos visto que la libreta de un solo uso era un criptosistema perfectamente seguro.
La seguridad se obtenı́a sumando a m una clave k ∈ K tomada aleatoriamente. Dado que el
adversario A trabaja en tiempo polinomial, para alcanzar encriptaciones indistinguibles será
3
también lo podrı́amos llamar despreciable, pero tiene otro tipo de connotaciones

17
suficiente con que k parezca tomado de forma aleatoria desde el punto de visto de un algoritmo
de tiempo polinomial. Introduciremos el concepto de número pseudoaleatorio. Intuitivamente,
un número es pseudoaleatorio si es indistiguible para un algoritmo en PPT de un número
aleatorio.

Definición 5.4.4. Un distinguidor es un algoritmo D ∈ PPT que toma como entrada un


elemento de {0, 1}∗ y tiene como salida un bit b ∈ {0, 1}.

Aunque la definición no dice que intenta hacer el algoritmo D, estamos pensando que D
está intentando adivinar si la entrada se ha obtenido por un proceso totalmente aleatorio o si
se ha obtenido por un algoritmo determinista.

Definición 5.4.5. Sea `(·) un polinomio tal que `(n) > n, ∀n ∈ N.


Un generador de números pseudoaleatorios con factor de expansión ` es un algoritmo
determinista G que tiene entrada s ∈ {0, 1}n (llamada semilla) y salida un elemento de {0, 1}`(n)
tal que para todo distinguidor D existe una función negiligible negl tal que

|Pr[D(r) = 1] − Pr[D(G(s)) = 1]| ≤ negl(n)

donde r es un elemento de {0, 1}`(n) escogido uniformemente al azar.

En general un número pseudoaleatorio es muy diferente a un número aleatorio. Supongamos


que `(n) = 2n y G es un generador de números pseudoaleatorios. Dado que G es un algoritmo
determinista, G produce una distribución en un subconjunto de {0, 1}2n de tamaño ≤ 2n .
Ası́ que la probabilidad de que un elemento aleatorio de {0, 1}2n sea producido por G es
1 2n
≤ n = 2n .
2 2
Notamos que existe un algoritmo que decide si un elemento de {0, 1}2n es producido por
G. Basta con calcular cada G(s) para cada s ∈ {0, 1}n . Este algoritmo requiere al menos 2n
operaciones y por tanto no es un algoritmo de tiempo polinomial.

5.4.2. Un criptosistema con encriptaciones indistinguibles para espı́as


Sea G un generador de números pseudoaleatorios con factor de expansión `. Construimos
el siguiente criptosistema de clave privada:

Gen: con entrada n ∈ N, produce k ← {0, 1}n ∼


= Fn2 con probabilidad uniforme.
`(n)
Enc: con entrada la clave k y el texto plano m ∈ {0, 1}`(n) ∼
= F2 produce

c = G(k) + m.

`(n)
Dec: con entrada k y el texto cifrado c ∈ {0, 1}`(n) ∼
= F2 produce el mensaje m =
G(k) + c.

Teorema 5.4.6. El criptosistema descrito arriba tiene encriptaciones indistiguibles para


espı́as.

18
Demostración. Sea A un algoritmo probabilı́stico de tiempo polinomial. Tenemos que demos-
trar que existe una función negligible negl tal que
1
Pr[ExpIndespia
A,Π (n) = 1] ≤ + negl(n).
2
Vamos a usar un distinguidor de números pseudoaleatorios para G para probar esta afir-
mación. Definimos la siguiente función
1
(n) = Pr[ExpIndespia
A,Π (n) = 1] −
2
tenemos que ver que  es negligible.
Vamos a definir un criptosistema auxiliar Π e = (Gen,
g Enc,
g Dec)
g en el que Enc g = Enc, y
Dec
g = Dec y Gen g es un algoritmo que tiene entrada un número n y salida una cadena aleatoria
k ← {0, 1} `(n) producida respecto a la densidad uniforme.
Es decir, para cada n, Πe es una libreta de un solo uso y por tanto, es perfectamente secreta.
Tenemos que
1
Pr[ExpIndespia (n) = 1] = .
A,Πe 2
Usamos A para construir un distinguidor D, que recibe como entrada w ∈ {0, 1}`(n) y hace
los siguientes pasos:

Invoca a A con parámetro n y obtiene un par de mensajes m0 , m1 ∈ {0, 1}`(n) .

Elige un bit al azar b ← {0, 1} y define c = w + mb .

D le da c a A y recibe b0 . La salida de D es 1 si b0 = b y 0 en otro caso.

Observamos que D esencialmente hace las mismas operaciones que A y por tanto es un
algoritmo de tiempo polinomial. Veamos como actúa D con una entrada w ∈ {0, 1}`(w) generada
de forma aleatoria o producida por G.

w escogida uniformemente al azar de {0, 1}`(n) . Entonces la distribución de D es la misma


que la distribución del experimento ExpIndespia
e (n). Tenemos
A,Π

1
Pr[D(w) = 1] = Pr[ExpIndespia
e (n) = 1] =
A,Π 2

w ← G(k) con k ← {0, 1}n uniformemente al azar. Entonces la distribución de D es la


misma que la distribución del experimento ExpIndespia
A,Π (n). Tenemos

1
Pr[D(w) = 1] = Pr[D(G(k)) = 1] = Pr[ExpIndespia
A,Π (n) = 1] = + (n)
2
Por hipótesis, G es un generador de números pseudoaleatorios y por tanto

|Pr[D(w) = 1] − Pr[D(G(k)) = 1]|

19
es negligible. Donde w esta escogida uniformamente al azar en {0, 1}`(n) y k escogida unifor-
memente al azar en {0, 1}n .
Por el análisis anterior,

|Pr[D(w) = 1] − Pr[D(G(k)) = 1]| = (n)

y por tanto  es una función negligible como querı́amos demostrar.

Con el criptosistema descrito, es posible encriptar con indistinguibilidad para espı́as ar-
chivos de varios megabytes usando claves de 128-bits. De hecho, las ideas del criptosistema
que hemos descrito son similares a las que se han usado para el criptosistema RC4 que se
ha implementado en el protocolo WEP (de cifrado de redes Wifi) o por Microsoft para cifrar
documentos Excel y Word.
Hay que notar, que el criptosistema requiere cambiar de clave para cada encriptación.
Efectivamente si encriptamos m1 y m2 con la misma clave, el observador puede averiguar
m1 + m2 = Enck (m1 ) + sEnck (m2 ). En particular el criptosistema no es seguro tampoco
contra ataques de texto plano escogido, donde damos al adversario la posibilidad de encriptar
lo que quiera usando nuestra clave. Este tipo de problemas han aparecido implementaciones
en el mundo real. Al parecer, el reuso de claves, fue un motivo de problemas de seguridad en
versiones antiguas de las aplicaciones ofimáticas de Microsoft (ver Figura 5.2).

Figura 5.2: Abstract de un articulo explicando como malas implementaciones por no cambiar
la clave han dado origen a vulnerabilidades.

20
5.5. Un Criptosistema seguro contra ataques de texto plano
escogido
En esta sección vamos a ver como podemos seguir utilizando las ideas anteriores para
construir un criptosistema seguro contra ataques de texto plano escogido. Recordamos que
estos son ataques en los que el adversario tiene la capacidad de saber el cifrado de los textos
claros que desee.
Seguiremos usando como idea fundamental la libreta de un sólo uso. En la sección anterior,
vimos que en lugar de tomar claves aleatorias, podı́amos usar generadores de números pseudo-
aleatorios ya que un adversario de tiempo polinomial no puede discernir una clave aleatoria de
una pseudoaleatoria. Si queremos protección contra ataques de texto plano escogido, además
de generar una clave de forma aleatoria, necesitamos que cada vez que usemos dicha clave, se
incluya algún tipo de azar para protegernos del adversario.
Empecemos definiendo un juego que capture los objetivos de un adversario que que tenga
acceso a Enck . Primero vamos definir que quiere decir dar acceso a una función.

Definición 5.5.1. Diremos que un algoritmo A tiene acceso de oráculo a la función/algoritmo


O si A puede usar O y casa uso de O solo supone una unidad de tiempo.

Si queremos señalar la función de oráculo a la que tiene acceso A, escribiremos AO .

Definición 5.5.2 (Experimento de indistinguibilidad para ataques de texto plano escogido).


Dado un criptosistema de clave privada Π = (Gen, Enc, Dec) y un adversario A que trabaja
en tiempo polinomial en n definimos el siguiente juego:

Generamos k ← Gen(n).

Le damos a A el valor n y la acceso de oráculo a Enck . El adversario A elige m0 , m1 ∈ P.

Elegimos b ∈ {0, 1} con probabilidad uniforme y producimos c ← Enck (mb ) y se lo damos


a A.

A sigue acceso de oráculo a Enck y escoge un número b0 ∈ {0, 1}.

Definimos (
1 si b = b0
ExpIndtpe
Π,A (n) =
0 6 b0
si b =

Consideramos que una consulta a Enck solo requiere una unidad de tiempo para A. i.e. no
tiene que hacer los cálculos que Enck necesite. En cualquier caso, el número de consultas del
valor de Enck es polinómico en n.
Como antes, si ExpIndtpeΠ,A = 1, quiere decir que A ha ganado el juego y si es igual a 0 ha
perdido. Nuestro criptosistema será seguro si A no juega sustancialmente mejor que elegir un
bit b0 al azar.

21
Definición 5.5.3. Un criptosistema de clave privada Π = (Gen, Enc, Dec) tiene encriptacio-
nes indistinguibles para ataques de texto plano escogido si para todo adversario A que trabaja
en tiempo polinomial en n, existe una función negligible negl tal que
1
Pr[ExpIndtpe
A,Π (n) = 1] ≤ + negl(n)
2
dónde la probabilidad se toma respecto a las variable aleatorias usados para el experimento y
por los algoritmos durante el experimento.
Observaciones que si Π es tiene encriptaciones indistinguibles para ataques tpe entonces
tiene encriptaciones indistinguibles para espı́as. Dado que el adversario A puede elegir m0 y m1
y calcular ci ← Enck (mi ). Si Π tiene encriptaciones indistinguibles para ataques tpe entonces
Enck no puede ser determinista.
La idea va a ser la siguiente. Generaremos como siempre una clave k de forma aleatoria.
La función Enck producirá una cadena r también de forma aleatoria y dado un texto m ∈ P,
Enck (m) = (r, Fk,r (m)). La cuestión es cómo encontrar esa función F . Igual que en la sección
anterior, queremos que Fk,r (m) sea indistinguible de un número aleatorio en para un algoritmo
de tiempo polinomial. Usaremos lo que se llaman funciones pseudo-aleatorias.
Definición 5.5.4. Un distinguidor de funciones es un algoritmo probabilistico de tiempo
polinomial D con entrada n y salida salida un bit b ∈ {0, 1}. El algoritmo tiene acceso de
oráculo a una función f : {0, 1}n → {0, 1}n (pero la función no es un parámetro) y cada
consulta tiene como coste una unidad de tiempo.
Es importante que f no sea un parámetro, ya que para dar f necesitamos especificar f (x)
para los 2n posibles x ∈ {0, 1}n y teniendo en cuenta que f (x) ocupa n bits, el tamaño que
podemos necesitar para especificar f es n2n y entonces D deberı́a estar autorizado a hacer un
número p(n2n ) cálculos para algún polinomio p.
Dado s ∈ {0, 1}∗ denotamos por |s| la longitud de s.
Definición 5.5.5. Una función pseudoaleatoria es un algoritmo determinista F de tiempo
polinomial que tiene entrada s ∈ {0, 1}∗ (llamada semilla) y salida una función Fs : {0, 1}|s| →
{0, 1}|s| tal que para todo distinguidor D existe una función negligible negl tal que

|Pr[DFs (n) = 1] − Pr[Df (n) = 1]| ≤ negl(n)

donde f es una función {0, 1}n → {0, 1}n escogida aleatoriamente respecto a la distribución
uniforme.
¿Cuantas funciones hay f : {0, 1}n → {0, 1}n ? Como vimos antes, especificar una función
f : {0, 1}n → {0, 1}n es lo mismo que especificar n2n bits. Como para cada bit hay dos opciones,
n
tenemos que hay 2n2 funciones de {0, 1}n → {0, 1}n . Por tanto, poniendo la distribución
uniforme en el conjunto de las funciones {0, 1}n → {0, 1}n , cada función tiene probabilidad
1
de ser escogida al azar.
2n2n
Ejemplo 5.5.6 (Criptosistema con encriptaciones indistinguibles tpe). Sea F una función
pseudoaleatoria. Construimos el siguiente criptosistema de clave privada:

22
Gen: con entrada n ∈ N, produce k ← {0, 1}n con probabilidad uniforme.

Enc: con entrada la clave k y el texto plano m ∈ {0, 1}n escoge r ← {0, 1}n uniforme-
mente al azar y define
c = (r, Fk (r) + m).

Dec: con entrada k y el texto cifrado c = (r, s) ∈ {0, 1}n × {0, 1}n produce el mensaje
m = Fk (r) + s.

Notemos que la clave es tan larga como el mensaje a encriptar y en principio tenemos el
mismo problema que con la libreta de un sólo uso. Sin embargo, la clave de esta sitación es
que si Π tiene encriptaciones indistinguibles para ataques tpe podemos usar la misma clave
para encriptar varios mensajes sin perdida de seguridad, es decir si m = m1 , . . . , mt , con
mi ∈ {0, 1}n podemos definir

Enck (m) = Enck (m1 )Enck (m2 ) . . . Enck (mt ).

Teorema 5.5.7. El criptosistema descrito arriba tiene encriptaciones indistinguibles para ata-
ques tpe.

Demostración. La demostración va a ser muy similar a la del Teorema 5.4.6. En aquel caso,
comparamos el criptosistema propuesto con la libreta de un solo uso que era perfectamente
seguro. i.e. cambiábamos el generador de números pseudoaleatorios por verdaderos números
aleatorios y utilizabamos al adversario para construir un distiguidor de números aleatorios.
En este caso, analizaremos un criptosistema construido de manera similar al propuesto en
el que la función F es una verdadera función aleatoria. Igual que antes, fijaremos un adversario
A y construiremos un distinguidor de funciones D que emule el trabajo de A y concluiremos
que un adversario A puede desencriptar tan bien como el distinguidor pueda distinguir, que
por hipótesis será con éxito negligible.
Definimos Π e = (Gen,
g Enc,g Dec)
g un criptosistema de clave privada con:

Gen(n)
g elige f : {0, 1}n → {0, 1}n uniformemente al azar.
g elige r ← {0, 1}n uniformemente al azar y dado un mensaje m ∈ {0, 1}m produce
Enc
c = (r, f (r) + m).

Dec
g calcula m = f (r) + c.

Recordemos que A puede acceder al computo de Enc


g un número polinomial de veces,
digamos q(n). Vamos a probar

1 q(n)
Pr[ExpIndtpe
A,Π̃
= 1] ≤ + n
2 2
Recordemos que A escoge m0 y m1 , se escoge un bit b ← {0, 1} uniformemente al azar, se
escoge r ← {0, 1}n uniformemente al azar y se le da a A el texto cifrado c = (r, f (r) + mb ).

Caso 1: A al menos recibe una vez (r, −) cuando usa Enc


g

23
Entonces, si al llamar a Encg con entrada m recibe (r, s), A obtiene f (r) = m+s y por tanto
puede saber si hemos encriptado m0 o m1 . La probabilidad de que la primera coordenada de
Enc(m)
g sea igual a r es 21n . Como A puede acceder a Enc
g a lo sumo q(n) veces, la probabilidad
de que A averigüe de esta manera b es ≤ q(n)
2n .

Caso 2: A nunca recibe (r, −) cuando usa a Enc


g

Entonces, A no obtiene ninguna información relevante de usar A y estamos en el caso de


un espı́a usual enfrentándose una libreta de un sólo uso. Tenemos
1
Pr[ExpIndtpe
A,Π̃
= 1|A nunca recibe (r, −)] = .
2
Combinando los resultados tenemos
Pr[ExpIndtpe
A,Π̃
= 1] = Pr[ExpIndtpe
A,Π̃
= 1|A rebice (r, −)]
+ Pr[ExpIndtpe
A,Π̃
= 1|A nunca recibe (r, −)]
q(n)

2n
Utilizando A, vamos a construir ahora un distinguidor de funciones D que puede consultar
valores de una función O : {0, 1}n → {0, 1}n dada. Nuestro distinguidor de funciones DO hace
lo siguiente:
Invoca a A con paramatro n. Cada vez que A quiera consultar el valor de Enc para m,
D elige r ← {0, 1}n uniformemente al azar, consulta el valor de O(r) y le devuelve a A
el texto cifrado (r, O(r) + m).
Cuando A entrega mensajes m0 y m1 de {0, 1}n , D escoge b ← {0, 1} uniformemente
al azar, D escoge r ← {0, 1}n uniformemente al azar, D consulta el valor de O(r) y le
devuelve a A el texto cifrado (r, O(r) + mb ).
Cuando A devuelve b0 , D devuelve 1 si b0 = b y 0 en caso contrario.
Es decir D devuelve 1 si A gana el juego de indistiguibilidad usando el criptositema similar
al Π pero usando la función O. En el caso de que O es una función pseudoaleatoria Fk con k
escogido uniformemente al azar. En este caso,
Pr[DFk (·) (n) = 1] = Pr[ExpIndtpe
A,Π = 1].

Si O es una función aleatoria f . En este caso,


1 q(n)
Pr[Df (·) (n) = 1] = Pr[ExpIndtpe
A,Π̃
(n) = 1] ≤ + n .
2 2
Tenemos
1 q(n)
Pr[ExpIndtpe
A,Π = 1] − ≤ Pr[DFk (·) (n) = 1] − Pr[Df (·) (n) = 1] + n
2 2
q(n)
y como Fk es pseudo aleatorio, Pr[DFk (·) (n) = 1] − Pr[Df (·) (n) = 1] es negligible. Como 2n
1
es negligible, tenemos que Pr[ExpIndtpe
A,Π = 1] ≤ + negl(n) como querı́amos demostrar.
2

24
5.6. Existencia de funciones pseudoaleatorias
Hemos reducido la existencia de criptosistemas con encriptaciones indistiguibles tpe a la
existencia de funciones pseudoaleatorias. Las construcciones que hemos hecho son esencialmen-
te las únicas ideas que se usan dentro de la criptografı́a, es decir, tener funciones o números
que siendo generados de forma determinista no podemos distinguirlo de funicones o números
tomados al azar. La pregunta natural es ¿existen?
Desgraciadamente no tenemos respuesta a esa pregunta. Pero podemos reformular la pre-
gunta en términos de otros problemas ’más naturales’ o al menos en los que se ha hecho más
investigación a lo largo de la historı́a: la existencia de funciones de un sólo sentido. Una función
de un solo sentido es un algoritmo de tiempo polinomial (fácil de calcular) para el que es muy
difı́cil dar una preimagen. Probablemente una de las contribuciones principales de los últimos
años de la criptografı́a a la matemática es el siguiente resultado de J. Hastad, R. Impagliazzo,
L.A. Levin y M. Luby de 1999.
Teorema 5.6.1. Los siguientes afirmaciones son equivalentes:
(i) Existen generadores de números pseudo aleatorios.

(ii) Existen funciones pseudo aleatorias.

(iii) Existen funciones de un sólo sentido.


La demostración del teorema no forma parte del curso.4
No nos sorprenderá que para definir formalmente función de un solo sentido, necesitemos
decir que no haya ningún algoritmo probabilistico de tiempo polinomial que pueda llevar a
cabo la tarea de invertir significativamente mejor que puramente al azar.
Definición 5.6.2. Experimento de inversión Sea f : {0, 1}∗ → {0, 1}∗ una función y A un
algoritmo de tiempo polinomial en n. Definimos ExpInvA,f (n), el experimento de inversión, de
la siguiente manera:
Escogemos x ← {0, 1}n uniformemente al azar y calculamos y = f (x).

Le damos n e y a A como entradas y A produce x0 .

ExpInvA,f (n) = 1 si f (x0 ) = f (x) y 0 en caso contrario.


Formalmente, fijados A, f y n, ExpInvA,f (n) es una variable aleatoria binaria.
Definición 5.6.3. Una función f : {0, 1}∗ → {0, 1}∗ es de un solo sentido si
(facil de calcular) existe un algoritmo de tiempo polinomial Mf en la longitud de x ∈
{0, 1}∗ tal que Mf (x) = f (x).

(dificil de invertir) Para todo algoritmo probabilistico de tiempo polinomial existe una
función negligible negl tal que

Pr[ExpInvA,f (n) = 1] ≤ negl(n).


4
Esta demostración ocupa el capı́tulo 7 del libro de Katz y Lindell ’Introduction to Modern Criptography’.

25
Como hemos dicho, no se conoce de la existencia de ninguna función de un solo sentido. Sin
embargo, si que hay diversos candidatos. Estos candidatos son problemas que han aparecido de
forma natural en las matemáticas y que pese al haber sido objeto de mucho estudio, no se han
encontrado buenos métodos para resolverlos. Vamos a describir brevemente dos candidatos.

Ejemplo 5.6.4 (Problema de la suma de subconjuntos).

f : (Z/2n Z)n × Subconjuntos({1, . . . , n}) → (Z/2n Z)n+1


X
f (x1 , x2 , . . . , xn , J) = (x1 , . . . , xn , xj ).
i∈J

J0
P
El problema se trata dado (x1 , . . . , xn , y) encontrar ⊆ {1, . . . , n} tal que y = j∈J 0 xj .

Ejemplo 5.6.5 (Problema del logaritmos discreto). Dado n y g ∈ U (Z/nZ) definimos la


función
f (k) = g k mód n
La inversa de esta función se llama logaritmo discreto.

5.6.1. Criptografı́a de clave privada en el mundo real


R

Las funciones pseudoaleatorias que se implementan en la práctica no vienen de funciones


de un sólo sentido y la aplicación del teorema 5.6.1 ya que en principio pueden tener una
complejidad de tiempo un polinomio de un grado alto. Es por eso que se buscan alternativas
de complejidad de tiempo lineal.
Los tipos de funciones pseudo aleatorias que se usan, son permutaciones. Estas funciones
dividen el texto en bloques y se mezclan los bloques, como si estuviesen barajando una baraja
de cartas.5 Esta es la idea de las funciones de Feistel:

Ejemplo 5.6.6. Fijaremos una función F : {0, 1}n → {0, 1}n para ‘barajar’. Cada vez que
’barajamos’ se llama una ronda de Feistel. Una ronda de Feistel aplicada al mensaje m de
longitud 2n consiste en

Dividir m en dos mitades (ml , mr ).

El resultado de la ronda es (mr , F (mr ) + ml )

Ası́ dado m = (m0l , m0r ) de longitud 2n, tras aplicar t rondas de Feistel, obtenemos algo de la
forma (mtl , mtr ) y es fácil recuperar m sabiendo F ya mt−1
r = mtl y mt−1
l = F (mtl ) + mr . Sin
embargo, sin conocer F el recuperar m de (mtl , mtr ) puede ser extremadamente complejo.
5
Estamos convencidos que barajar las cartas produce que las cartas acaben en una posición aleatoria.
Definimos mezcla como cortar la baraja en dos bloques y entremezclar los bloques uno a uno. En 1992, Bayer
and Diaconis probaron que con siete mezclas de una baraja de 52, todas las configuraciones obtenidas son casi
equiprobables.

26
Figura 5.3: Diagrama de las rondas de Feistel

Las funciones pseudoaleatorias que se usan en las criptosistemas actuales funcionan de


forma similar al cifrado de Feistel y de hecho suele estar incorporado dentro de la función. Por
ejemplo, en los años 70, IBM desarrollo el Data Encryption Standart (DES). Usaba cifrados de
Feistel de 16 rondas. El DES fue durante mucho tiempo el prótocolo estandar para la mayorı́a
de los criptosistemas de clave pública, aunque se abandonó en los 90 ya que se empezó a
haber ordenadores que eran capaces de romperlo, en parte por tener una longitud de claves
relativamente pequeña (54-bits).
El heredero del DES es el Advanced Encryption Standard (AES) de los esquema de cifrado
más populares entre clave cifrada y ha sido adoptado como estándar por el gobierno de los
Estados Unidos desde 2002. Los creadores del AES son los belgas Vincent Rijmen y Joan
Daemen y presentaron al AES al concurso público del NIST a principios de los años 2000.
En este concurso los que los candidatos defendı́an sus criptosistemas y buscaban ataques a
los de los rivales. Actualmente se está desarrollando un concurso del NIST para seleccionar
algoritmos criptográficos resistentes al ordenador cuántico.6
Desafortunadamente no hay fundamentos matemáticos para certificar un nivel de seguridad
para el AES, ni está basada en hipótesis tan concretas como ’el logaritmo discreto es una función
de un sólo sentido’. Aunque a efectos prácticos y dado el tiempo que ha estado a prueba, se
puede considerar que AES es seguro, la complejidad de su definición hace que sea dı́ficil reducir
la esencia de romper AES a algún problema matemático concreto y fácil de enunciar.

6
https://csrc.nist.gov/projects/post-quantum-cryptography

27