Beruflich Dokumente
Kultur Dokumente
Seguridad Criptográfica
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 .
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).
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).
Lema 5.1.6.
f (n)
f (n) = O(g(n)) ⇔ lı́m supn→∞ <∞
g(n)
log(n) = O(n ) para todo > 0.
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.
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)).
• 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))
n = n0 + 2n1 + 4n2 + · · · + 2i ni + . . . 2k nk ,
Si ni = 0 no hacemos nada.
Ejemplo 5.1.9. Supongamos que queremos calcular 3875 mód 103. Primero expresamos 75
en binario
75 = 20 + 21 + 23 + 26
Ası́ tenemos
3 +26
3875 = 381+2+2 ≡ 38 · 2 · 16 · 63 ≡ 79 mód 103
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.
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:
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
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.
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).
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 ].
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
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 ]
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).
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.
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.
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.
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
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.
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].
Pr[ExpIndespia espia
Π,A = 0 | B = 1] = Pr[ExpIndΠ,A = 1 | B = 0].
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].
Demostración. En el ejemplo 5.3.2 habı́amos visto que el criptosistema de Vernam era perfec-
tamente secreto.
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.
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.
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.
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.
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.
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:
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.
1
Pr[D(w) = 1] = Pr[ExpIndespia
e (n) = 1] =
A,Π 2
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
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,
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.
Generamos k ← Gen(n).
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
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
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.
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 ).
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 .
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.
(dificil de invertir) Para todo algoritmo probabilistico de tiempo polinomial existe una
función negligible negl tal que
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.
J0
P
El problema se trata dado (x1 , . . . , xn , y) encontrar ⊆ {1, . . . , n} tal que y = j∈J 0 xj .
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
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
6
https://csrc.nist.gov/projects/post-quantum-cryptography
27