CRIPTOGRAFíA

Anuncio
Universidad de la República
Facultad de Ingenierı́a
Instituto de Matemática y Estadı́stica
Criptografı́a
Matemática Discreta 2
Curso 2007
Material teórico para estudiantes
1
Criptografı́a de Clave Pública
1.
Criptosistemas César y Vigenere
Para comenzar comenzaremos introduciendo dos criptosistemas sencillos para ilustrar
algunas técnicas de cifrado.
1.1. Método de cifrado César. Lleva este nombre en honor a Julio César, que lo
usaba para comunicarse con sus generales. El método comienza enumerando las letras del
abecedario, por ejemplo la letra A tiene asignado el 0, la letra B el 1, . . ., la letra Z el 25.
Luego definimos la clave k como un número entre 0 y 25. Para encriptar un mensaje lo
que hacemos es sumarle a cada letra la clave k y reducir módulo 26. Para desencriptar el
mensaje debemos restar k a cada letra y reducir módulo 26.
Por ejemplo supongamos que queremos encriptar el mensaje “ATACAREMOS POR
LA NOCHE”, y que el valor de la clave es k = 15 (correspondiente a la letra P):
A T A C A R E M O S
0 19 0 2 0 17 4 12 14 18
15 8 15 17 15 6 19 1 3 7
P I P R P G T B D H
P O R
15 14 17
4 3 6
E D G
L A
11 0
0 15
A P
N O C H E
13 14 2 7 4
2 3 17 22 19
C D R W T
En la primer fila se ha colocado el texto plano (mensaje sin encriptar), en la segunda
se ha sustituido cada letra por su correspondiente número, en la tercer fila se ha sumado
k = 15 módulo 26 a cada elemento de la segunda fila, finalmente sustituimos cada número
de la tercer fila y obtenemos el texto cifrado “PIPRPGTBDH EDG AP CDRWT”.
Para evitar que se vean en el texto cifrado los tamaños de las palabras originales se le
puede asignar también un número al caracter espacio, por ejemplo el 26, y tratarlo como
una letra más, esta vez eligiendo una clave k entre 0 y 26 y realizando las operaciones
módulo 27.
De todas formas, es muy sencillo romper este criptosistema por fuerza bruta, pues solo
habrı́a que chequear con las 27 posibles claves y ver cuál tiene sentido.
Para el criptosistema César podemos definir la función de encriptado:
E : Zn → Zn ,
E(x) = x + k
(mód n)
donde k es la clave utilizada. Entonces podemos decir que el criptosistema César consiste
en aplicar a cada letra del texto, dicha función de encriptar.
3
4
CRIPTOGRAFÍA DE CLAVE PÚBLICA
Para desencriptar, restamos a cada letra la clave k, con lo que la función de desencriptado viene dada en este caso por:
D : Zn → Zn ,
E(x) = x − k
(mód n)
Una posible variante del criptosistema César es el criptosistema afı́n, cambiando la
función de encriptado por una función lineal:
E : Zn → Zn ,
E(x) = ax + k
(mód n)
Pero para poder desencriptar el mensaje original la función de encriptado debe ser
inyectiva. Queda como ejercicio para el lector probar que la inyectividad de la función de
encriptado definida anteriormente es equivalente a pedirle que mcd(a, n) = 1.
Ejercicio. Probar que la función
E : Zn → Zn ,
E(x) = ax + k
(mód n)
es biyectiva si y solo si mcd(a, n) = 1.
De ahora en adelante supondremos que mcd(a, n) = 1, en dicho caso la función de
desencriptar en el criptosistema afı́n viene dado por
D : Zn → Zn ,
D(y) = a0 (y − k)
(mód n)
donde a0 es un inverso de a módulo n. Esto último es fácil de ver, en efecto:
ax + k ≡ y
(mód n) ⇔ ax ≡ y − k
(mód n) ⇔ x ≡ a0 (y − k) (mód n)
A modo de ejemplo encriptemos nuevamente el texto “ATACAREMOS POR LA
NOCHE”, pero esta vez utilizando un sistema afı́n con clave (a, k) = (5, 2). Como la
vez pasada asignemos a cada letra un número de la siguiente manera: a A le asignaremos
el número 0, a B el 1, a C el 2 y ası́ sucesivamente hasta la letra Z a la cual le corresponde
el número 25. Asignemos por último al caracter espacio el número 26, de modo que para
este caso la cantidad de caracteres codificados es n = 27.
A T A C A R E M O S
P O R
L A
N O C H E
0 19 0 2 0 17 4 12 14 18 26 15 14 17 26 11 0 26 13 14 2 7 4
2 16 2 12 2 6 22 8 18 11 24 23 18 6 24 3 2 24 13 18 12 10 22
C Q C M C G W I S L Y X S G Y D C Y N S M K W
Al igual que en el criptosistema César, la primer fila representa el texto plano, la
segunda de sustituir cada letra por su correspondiente valor, la tercer fila de aplicar la
función de encriptado a cada número de la segunda fila (en este caso E(x) = 5x + 2
(mód 27)), la última fila de sustituir cada letra de la tercer fila por su correspondiente
valor, obteniendo ası́ el texto cifrado “CQCMCGWISLYXSGYDCYNSMKW”.
Aquı́ se vuelve una tarea más dura poder desencriptar el texto sin conocimiento de
la clave, por lo menos a mano, pues a fuerza bruta en el peor de los casos deberı́amos
chequear φ(27) · 27 = 18 · 27 = 486 casos (contra 27 del sistema Cesar). No obstante
con una computadora llevarı́a un tiempo insignificante, y puede acelerarse el ataque si
agregamos un análisis de frecuencias.
A continuación veremos otra mejora del método César; el método Vigenere. En lugar
de realizar una sustitución en el texto letra a letra, lo haremos bloque a bloque.
1. CRIPTOSISTEMAS CÉSAR Y VIGENERE
5
1.2. Método de cifrado Vigenere. Aquı́ la clave consiste en una palabra, el método consiste en repetir debajo del texto cifrado la palabra clave, luego sumar cada letra del
texto plano, con la letra de la palabra clave que está debajo de ella (codificando cada letra
con un natural como vimos anteriormente) y reduciendo módulo la cantidad de caracteres
codificados (por ejemplo 27 en el caso que utilizemos la letras de la A a la Z y el caracter
espacio).
A modo de ejemplo encriptaremos nuevamente el texto plano “ATACAREMOS POR
LA NOCHE”, esta vez utilizando el método Vigenere con la palabra clave “PRUEBA”:
A T A C A R E M O S
P O R
L A
N O C H E
P R U E B A P R U E B A P R U E B A P R U E B
P J U G B R T C H W A P C H T P B
B E W L F
donde la primer fila consiste en el texto plano, en la segunda hemos repetido la palabra
clave varias veces, en este caso “PRUEBA”. En la tercera aparece el texto cifrado, que
fue construido sumando las dos letras que aparecen arriba en la misma columna. De esa
forma obtenemos el texto cifrado “PJUGBRTCHWAPCHTPH BEWLF”. Para sumar las
letras lo que hemos hecho es sumar sus valores númericos correspondiente módulo 27 y
luego sustituimos este valor por su caracte correspondiente, por ejemplo:
A+P= 0 + 15 ≡ 15 (mód 27), la letra que corresponde a 15 es P, luego A+P=P.
T+R= 19 + 17 = 36 ≡ 9 (mód 27), la letra que corresponde a 9 es J, luego T+R=J y
ası́ sucesivamente.
Para desencriptar el texto simplemente repetimos la palabra clave debajo del texto
plano, pero esta vez en vez de sumar, restamos.
Ejercicio. A cada letra del alfabeto le asignamos un número de la siguiente manera
a A le correspondemos un 1, a B un 2, a C un 3, y asi sucesivamente hasta la Z que le
corresponde un 25 y asignemos al caracter espacio el número 26 (o sea que en este ejemplo
n = 27). Desencriptar el mensaje “CUIAPGT GZOBQZGO” si se sabe que fue encriptado
con la palabra clave “COPA”.
Observemos que ahora no es tan fácil chequear a fuerza bruta, la cantidad de claves
posibles crece exponencialmente con el tamaño del texto. Este método de cifrado fue
bastante utilizado e incluso considerado invulnerable hasta el siglo XIX, cuando fueron
introducido algunos métodos para romper este criptosistema.
Un método para romper este criptosistema es el denominado método de Kasiski. Este
método consiste primero en hallar el tamaño de clave (supongamos que la clave tenga
largo k), luego las letras que ocupan lugares congruentes módulo k en el texto fueron
cifrados con la misma letra de la palabra clave, luego es posible hallar esa letra con un
análisis de frecuencias. Para hallar el largo de clave básicamente lo que se hace es buscar
secuencias de dos letras (bigramas) o de tres (trigramas) que se repiten en el texto cifrado,
se conjetura que si el texto es suficientemente largo, entonces la distancias entre bigramas
o entre trigramas será múltiplo del tamaño de la clave, y se obtiene el tamaño de clave
probable como el máximo común divisor de tales distancias.
6
CRIPTOGRAFÍA DE CLAVE PÚBLICA
Una mejora sobre el cifrado Vigenere fue introducida por el sistema de Vernam, utilizando una clave aleatoria de longitud igual a la del mensaje; la confianza en este nuevo
criptosistema hizo que se utilizase en las comunciaciones confidenciales entre la Casa Blanca y el Kremlin, hasta, por lo menos, el año 1987.
2.
Criptosistemas de clave privada - métodos de intercambio de clave
Se llaman criptosistemas de clave privada a aquellos criptosistemas que se puede obtener facilmente la clave de desencriptar a partir de la de encriptar.
Por ejemplo los criptosistemas vistos anteriormente son ejemplos de criptosistemas
que son muy faciles de desencriptar conociendo la clave de encriptar. En el método César
se restaba la clave de encriptar a cada letra, en el afı́n basicamente hay que hallar un
inverso modular que se puede hacer facilmente a través del Algoritmo de Euclides y luego
obtenemos la función de desencriptado que se la aplicamos a cada letra. En el Vigenere
es restar la palabra clave reiteradas veces como ya vimos, al igual que en el criptosistema
Vernam.
Entonces en estos sistemas, la clave de encriptar ha de ser confidencial entre las personas que llevan la comunicación, dado que a partir de ellas un espı́a puede calcular la
clave de desencriptar con facilidad. Pero: ¿cómo hacer para intercambiar claves a distancia
para que alguien que intercepte la conversación no descubra la clave?
Existen varios métodos para intercambiar claves entre dos personas, entre ellos el que
veremos a continuación denominado Método de Diffie-Hellman de intercambio de clave.
2.1. Método Diffie-Helmann de intercambio de clave. Supongamos que Alicia y Bob quieren ponerse de acuerdo en una clave común que sea secreta (o sea que solo
ellos conozcan la clave). Pero ellos se encuentran lejos uno del otro y la única forma de
comunicarse entre ellos es a través de un canal. El problema es que el canal está interceptado por espı́as que pueden acceder a la conversación de Alicia y Bob.1 Diffie-Helman nos
da un posible método para resolver el problema:
1.
2.
3.
4.
5.
6.
Alicia y Bob se ponen de acuerdo en un primo p y un número g con 1 < g < p.
Alicia elige un número al azar n
Bob elige un número al azar m
Alicia calcula g n (mód p) y se lo manda por el canal.
Bob calcula g m (mód p) y se lo manda por el canal.
La clave común es g nm = (g n )m = (g m )n que tanto Alicia como Bob pueden
calcular.
El espı́a que accede a la conversación puede conocer p, g, g n y g m . Si el espı́a con esos datos fuese capaz de calcular g nm entonces hemos fallado en el intento de acordar la
clave común, pero la única manera (conocida) de calcular g nm es calculando previamente
n ó m. Esto en general es un problema computacionalmente difı́cil y es conocido como el
problema del logaritmo discreto en Zp ∗ .
1Estamos suponiendo que los espı́as son atacantes pasivos, es decir, tienen la capacidad de acceder a
la información, pero no de modificarla
2. CRIPTOSISTEMAS DE CLAVE PRIVADA - MÉTODOS DE INTERCAMBIO DE CLAVE
7
2.2. Problema del logaritmo discreto en Zp ∗ . Dado un primo p y dos números
g y a = g n (mód p), hallar un m tal que g m ≡ a (mód p). A un tal m se le llama
logaritmo discreto de a en base g y se lo nota por m = dlogg a.
Se puede probar fácilmente que el logaritmo discreto de un número, si existe, no es
único sino que está determinado módulo el orden de g módulo p (i.e. el menor s ≥ 1 tal que
g s ≡ 1 (mód p), cuya existencia está garantizada por ejemplo, por el Pequeño Teorema
de Fermat). La prueba se deja como ejercicio para el lector.
Hay que observar que el problema del logaritmo discreto puede ser fácil de resolver si
no se escogen bien los parámetros, por ejemplo el primo p debe elegirse grande (200 dı́gitos
o más es razonable). También hay que cuidar que el orden de g módulo p no sea pequeño,
sabemos por el Pequeño Teorema de Fermat que ese orden es a lo sumo p − 1, se puede
probar que para todo primo p, siempre es posible hallar elementos de orden exactamente
p − 1 (a esos elementos se lo conocen como raı́z primitiva módulo p).
Otra cosa a observar es que tanto Alicia en el paso 4 como Bob en el paso 5 necesitan
calcular g n (mód p) (y g m (mód p) respectivamente). Un algoritmo eficiente es el algoritmo egipcio de exponenciación rápida (antes podemos utilizar Fermat para achicar aún
más el exponente) visto en el curso que es un algoritmo lineal en la cantidad de bits de n
y por lo tanto muy eficiente en la práctica.
Para ilustrar el método veamos un ejemplo con números pequeños:
Bob y Alicia eligen p = 97 y g = 5. Alicia elige n = 31, calcula 531 ≡ 7 (mód 97) y
le comunica el 7 a Bob por el canal. Bob elige m = 95, calcula 595 ≡ 39 (mód 97) y le
comunica el 39 por el canal. Ahora Alicia calcula 3931 ≡ 14 (mód 97) y Bob 795 ≡ 14
(mód 97), ası́ que ambos tienen a k = 14 como su clave secreta.
Un ejemplo un poco más real puede obtenerse tomando:
Como primo p = 93450983094850938450983409623 y g = −2 (que resulta ser una raı́z
primitiva módulo p). Supongamos que los números secretos de Alicia y Bob vienen dados
por:
n = 18319922375531859171613379181
y
m = 82335836243866695680141440300
Alicia le envia a Bob:
g n = 45416776270485369791375944998
Bob le envia a Alicia:
g m = 15048074151770884271824225393
La clave secreta común viene dada por:
g nm = 85771409470770521212346739540
8
CRIPTOGRAFÍA DE CLAVE PÚBLICA
3.
Criptosistemas de clave pública
Los criptosistema de clave pública basan su seguridad en que no haya un método eficiente de calcular la clave de desencriptado, aún conociendo la clave de encriptar. Estos
sistemas tienen la ventaja de que, como la clave de encriptar no nos ayuda a calcular la
clave de desencriptar, puede almacenarse todas las claves de encriptar de muchos usuarios en una guı́a pública a la cual todos tengan acceso, evitando ası́ que cada vez que dos
usuarios quieran comunicarse tengan que ponerse de acuerdo en una clave común. Veremos
como ejemplo de criptosistema de clave pública el RSA.
3.1. Criptosistema RSA. Este criptosistema creado por Rivest, Shamir y Adleman (RSA) es uno de los criptosistemas de clave pública más famosos. La idea atrás de
este criptosistema es construir una función que sea fácil de calcular (en este caso multiplicar dos primos), pero que su inversa sea difı́cil de calcular (en este caso dado un número
que es producto de 2 primos, hallar esos primos). Veamos en que consiste.
1. Alicia elige dos primos (distintos) grandes p y q y calcula n = pq.
2. Luego calcula:
ϕ(n) = ϕ(p)ϕ(q) = (p − 1)(q − 1)
3. Luego elige un número aleatorio e con:
1 < e < ϕ(n) y mcd(e, ϕ(n)) = 1
4. Con ayuda del Algoritmo de Euclides Alicia calcula d ∈ Z+ tal que:
de ≡ 1 (mód ϕ(n))
5. Finalmente Alicia tiene definida una función (función de encriptado) definida por:
E : Zn → Zn : E(x) = xe
(mód n)
La clave pública de Alicia viene dado por el par (n, e) que puede ser publicada en
una guı́a de claves pública. Observemos que el par (n, e) nos brinda toda la información
necesaria para calcular la función de encriptado E.
Alguien que desee mandarle un mensaje confidencial x a Alicia, busca la clave pública de
Alicia en la guı́a y le envia el mensaje encriptado E(x).
Definimos la función de desencriptado como:
D : Zn → Zn : D(x) = xd
(mód n)
Para calcular la función de desencriptado es necesario conocer a d, que resulta equivalente a conocer los primos p y q que factorizan n. Si los parámetros están bien elegidos,
factorizar n llevarı́a demasiado tiempo, aún usando los mejores algoritmos de factorización
conocidos hasta el momento y las computadoras más rápidas en la actualidad. Entonces
la seguridad de dicho criptosistema se basa en la dificultad de factorizar números grandes.
Por otra parte observemos que Alicia, conociendo d no tiene problema en, dado x, calcular D(x), pues cuenta para ello con algoritmos eficientes para calcular potencias módulo
n con el método de exponenciación rápida.
3. CRIPTOSISTEMAS DE CLAVE PÚBLICA
9
Comenzaremos viendo que efectivamente la función D definida arriba es una función
de desencriptado.
Proposición. Sean p, q, n, d y e definidos como antes, y las funciones de encriptado
E(x) = xe (mód n) y D(x) = xd (mód n). Entonces se tiene que:
D(E(x)) = x (mód n), ∀x ∈ Zn
Dem. Como D(E(x)) = xde (mód n), debemos probar que xde ≡ x (mód n) para
todo x ∈ Z. Conviene aquı́ separar en casos.
Caso 1: p y q dividen a x.
En este caso tenemos que pq = n|x y por lo tanto también n|xde , luego xde ≡ 0 ≡ x
(mód n).
Para los siguientes casos conviene recordar que d fue elegido tal que de ≡ 1 (mód ϕ(n)),
donde ϕ(n) = (p − 1)(q − 1), por lo tanto existe un k entero tal que de = (p − 1)(q − 1)k + 1.
Caso 2: p divide a x pero q no divide a x.
Como x ≡ 0 (mód p) entonces xde ≡ 0 (mód p). Por otra parte xde = x(p−1)(q−1)k+1 =
· x ≡ 1 · x = x (mód q), donde se ha usado el Pequeño Teorema de Fermat
dado que q no divide a x. Asi que tenemos:
½ de
x ≡ x (mód p)
xde ≡ x (mód q)
(xq−1 )(p−1)k
Luego por la unicidad del Teorema Chino del Resto xde ≡ x (mód n).
Caso 3: Ni p ni q dividen a x.
Tenemos que x y n son coprimos, luego por el Teorema de Fermat-Euler:
xϕ(n) ≡ 1
(mód n)
ası́ que:
xde = xϕ(n)k+1 = (xϕ(n) )k x ≡ 1 · x = x (mód n)
.
3.2. Método de cifrado de bloques. Una manera ingenua de encriptar usando
RSA es encriptando letra a letra, es decir asignamos a cada letra un valor del 0 al 25 y
luego aplicamos la función de encriptado a cada letra. Es fácil hacer una tabla de valores de
E(n) para n = 0, 1, 2, . . . , 25 y luego en el mensaje encriptado ver a que letra corresponde
cada valor, de esa manera cualquier espı́a tendrı́a acceso a una conversación confidencial.
Otra forma es usando un método de cifrado de bloques, si bien existen varios métodos
nos centraremos en el ECB (Electronic Codebook), no por ser el más eficiente, sino por
10
CRIPTOGRAFÍA DE CLAVE PÚBLICA
ser el más fácil de describir.
Éste como los otros métodos de cifrado en bloques es independiente del cirptosistema
utilizado, aunque aquı́ a modo de ejemplo veamos como se emplea para un cifrado RSA.
El esquema para RSA serı́a el siguiente, supongamos que tenemos la clave pública
(n, e) y que los caracteres que aparecen en nuestro texto son las 26 letras del alfabeto y
el espacio en blanco (en total 27 caracteres) y sea k entero tal 27k < n < 27k+1 (observar
que ambas desigualdades son estrictas pues n es producto de 2 primos). Ahora separamos
nuestro texto en bloques de tamaño k:
←− b1 −→ ←− b2 −→ ←− b3 −→ . . . ←− bt −→
Donde bi es el bloque i-ésimo, supongamos que bi = lk−1 lk−2 lk−3 . . . l1 l0 donde los li
son caracteres (en nuestro caso las letras del alfabeto y el espacio). Para cada caracter li ,
sea li el número asociado, es decir A = 0, B = 1, C = 2, . . . Z = 25 y Space = 26.
Ahora a cada bloque le asignamos un valor entre 0 y 27k − 1 de la siguiente manera:
bi = lk−1 · 27k−1 + lk−2 · 27k−2 + lk−3 · 27k−3 + . . . + l1 · 27 + l0
Recı́procamente, cada número entre 0 y 27k −1 tiene un k-bloque (bloque de tamaño k)
asociado. Para hallarlo basta escribir al número en base 27 y luego sustituir cada “dı́gito”
por su correspondiente letra.
←− b1 −→ ←− b2 −→ ←− b3
↓
←− b1 −→ ←− b2 −→ ←− b3
↓
←− c1 −→ ←− c2 −→ ←− c3
↓
←− c1 −→ ←− c2 −→ ←− c3
−→ . . . ←− bt −→
−→ . . . ←− bt −→
−→ . . . ←− ct −→
−→ . . . ←− ct −→
En la primer fila está el texto plano separado en bloques, en la segunda fila cada bloque
ha sido sustituido por su valor correpondiente, en la tercer fila se ha aplicado la función
de encriptado E, a cada bloque, es decir E(bi ) = ci (recordemos que como E : Zn → Zn
tenemos que 0 ≤ E(bi ) < n).
Se puede afirmar que E(bi ) < 27k+1 puesto que n < 27k+1 , pero podrı́a suceder que
E(bi ) ≥ 27k+1 ası́ que podemos escribir:
ci = sk · 27k + . . . + s1 · 27 + s0
donde cada sj es un entero entre 0 y 26 (sj es su caracter correspondiente). Finalmente
el (k + 1)-bloque ci se define como ci = sk sk−1 . . . s1 s0 y concatenando dichos bloques
obtenemos la cuarta fila que es el texto cifrado.
Veamos esto con un ejemplo.
Ejemplo. Supongamos que Ana tiene la clave pública (n, e) = (25573, 1089) y que le
queremos enviar a Ana el mensaje “PEPITO PIDE PAPA PELADA” utilizando el método
3. CRIPTOSISTEMAS DE CLAVE PÚBLICA
11
de encriptado en bloque ECB codificando cada letra y cada bloque como más arriba.
Primero observamos que 273 < 25573 < 274 y procedemos a partir el texto plano en
3-bloques:
PEP ITO
PI DE
PAP A P ELA DA
Recordemos la asociación entre los caracteres y los números:
A B C D E ... I ... L ... O P ... T ... Z
0 1 2 3 4 . . . 8 . . . 11 . . . 14 15 . . . 19 . . . 25 26
Ahora calculamos el valor asociado a cada uno de esos 3-bloques:
PEP = 15 · 272 + 4 · 27 + 15 = 11058
ITO = 8 · 272 + 19 · 27 + 14 = 6359
PI = 26 · 272 + 15 · 27 + 8 = 19367
..
.
Ası́ que el primer pasaje del texto plano a bloques de números nos queda:
PEP ITO
PI DE
PAP A P ELA DA
↓
11058 6359 19367 2321 10950 717 3213 2213
Ahora aplicamos nuestra función de encriptado a cada bloque de números de la segunda
fila obteniendo los siguientes valores:
110581089 (mód 25573) = 18461
63591089 (mód 25573) = 2977
193671089 (mód 25573) = 4494
..
.
Ası́ construimos la tercer fila, formada por el texto cifrado dado como bloques de
números:
PEP ITO
PI DE
PAP A P ELA DA
↓
11058 6359 19367 2321 10950 717 3213 2213
↓
18461 2977 4494 7817 7311 6453 10431 19891
Finalmente escribimos a cada número de la tercer fila en base 27 (con 4 “dı́gitos”)
para ver el bloque correspondiente a cada número.
Por ejemplo 18461 = 0 · 273 + 25 · 272 + 8 · 27 + 20.
Recordemos la correspondencia 0 ↔ A, 25 ↔ Z, 8 ↔ I, 20 ↔ U , entonces 18461 ↔ AZIU .
Y ası́ sucesivamente hasta obtener el texto cifrado:
12
CRIPTOGRAFÍA DE CLAVE PÚBLICA
PEP ITO
PI DE
PAP A P ELA DA
↓
11058 6359 19367 2321 10950 717 3213 2213
↓
18461 2977 4494 7817 7311 6453 10431 19891
↓
AZIU AECH AGEM AKTO AKAV AIXA AOIJ BAHT
Ası́ que el texto cifrado enviado a Alicia nos queda: “AZIUAECHAGEMAKTOAKAVAIXAAOIJBAHT”.
Para desencriptar, Alicia separará en bloques de a 4 y decodificará bloque a bloque. A
cada bloque desencriptado lo escribe con 3-dı́gitos en base 27 y luego lo pasa a un bloque
formado por 3 caracteres.
Hay que aclarar que lo expuesto aquı́ es solo una simplificación de la realidad. Por
ejemplo vimos que los bloques del texto plano y los del texto cifrado nos quedaron de
distinta longitud, para evitar esto lo que se hace es agrandar el tamaño de los bloques, a
los bloques del texto plano se le agrega “para rellenar” un número aleatorio, esto tiene la
ventaja de que bloques asociados a números pequenños ya no son tan fáciles de descifrar
a fuerza bruta. Otra cuestión es que nosotros utilizamos en general un sistema en base 27,
pues fueron la cantidad de caracteres que usamos en nuestro texto, en la práctica suele
usarse la base 128 (cantidad de caracteres del código ASCII) o 256 (cantidad de caracteres
del código ASCII extendido).
Este método de cifrado en bloques (nos referimos al ECB) tiene la debilidad de que
un espı́a podria buscar la manera de descifrar cada bloque por separado. Como descifrar
cada bloque puede ser (y lo será en general) más fácil que descifrar el texto entero esto
puede ser una desventaja.
Otros métodos de cifrado en bloques empleados son:
CBC (Cipher-block chaining)
PCBC (Propating cipher-block chaining)
CFB (Cipher feedback)
OFB (Output feedback)
SIC (Segmented integer counter)
Para ver como funcionan dichos métodos recomendamos al lector ver por ejemplo la
página web: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
3.3. Ataques al RSA. Observemos que si podemos factorizar n, es decir hallar los
primos p y q tales que n = pq entonces podemos calcular ϕ(n) = (p − 1)(q − 1) y usar el
Algoritmo de Euclides para calcular d tal que:
de ≡ 1 (mód ϕ(n))
y de esa forma poder desencriptar todos los mensajes que le llegan a Alicia. Vale resaltar
que existe un Algoritmo probabilı́stico que permite factorizar n conociendo la función de
desencriptado D (es decir, conociendo d). De forma que resulta equivalente encontrar la
función de desencriptado D a factorizar n.
3. CRIPTOSISTEMAS DE CLAVE PÚBLICA
13
Hace pocos años se ha obtenido un gran avance al descubrirse un algoritmo que factoriza n en tiempo polinomial en la cantidad de bits de n, aunque los coeficientes son tan
grandes que todavı́a no es muy eficiente en la práctica. Por otro lado en los años 80 se ha
creado el modelo de las computadoras cuánticas, que junto a un algoritmo de Shor nos
otorgarı́a un método efectivo para la factorización de un entero. Todavı́a no se sabe si es
posible en la práctica la construcción de dichos computadores cuánticos.
Regresando a la parte matemática, si hubiese algún método efectivo para calcular ϕ(n)
entonces serı́a posible factorizar n en forma efectiva, esto queda como ejercicio para el lector.
Ejercicio. Sea n = pq con p y q primos. Conociendo ϕ(n) describir un método para
hallar los primos p y q.
Otra debilidad del criptosistema puede surgir si no son bien elegidos los parámetros.
Por ejemplo si p y q son primos cercanos entonces el Método de Fermat nos otorga un
método efectivo de factorizar n.
3.4. Método de Fermat. Sea n = pq con p < q primos. Para s = 1, 2, . . . calculamos n + s2 y paramos cuando nos de un cuadrado perfecto, digamos n + s2 = t2 con
t ∈ Z+ . Entonces p = t − s y q = t + s.
Para comenzar observemos que:
µ
n = pq =
q+p
2
¶2
µ
−
q−p
2
¶2
ası́ que el algoritmo se detiene (y por lo tanto es efectivamente un algoritmo) en a lo sumo
s = q−p
2 pasos.
Por otra parte sean s y t los enteros positivos que nos otorga el algoritmo. Observemos
que q − p < n − p < n − 1 ası́ que por la observación previa s < (n − 1)/2.
Como n + s2 = t2 entonces t > s y n = t2 − s2 = (t − s)(t + s). Si t − s = 1 entonces
t + s = n, luego t = (n + 1)/2 y s = (n − 1)/2 lo cual es absurdo, por lo tanto t − s y t + s
son factores de n mayores que 1, ası́ que t − s = p y t + s = q.
Observemos que q − p = 2s, luego si q − p es pequeño entonces s también lo es y el
algoritmo termina rápido.
Para terminar, si volvemos a analizar detalladamente los pasos a seguir por Alicia para
la creación de su clave pública, nos topamos con un posible inconveniente en la primer
parte.
Alicia debe elegir dos primos grandes p y q para formar su número n = pq. El problema es que como dijimos, no se conoce ningún algoritmo realmente efectivo para factorizar
números grandes en tiempo razonable, entonces ¿Cómo hace Alicia para saber elegir los
14
CRIPTOGRAFÍA DE CLAVE PÚBLICA
primos p y q que forman n? Alicia podria tomar dos números al azar p y q y luego factorizarlos para ver si es primo, pero eso podrı́a llevarle mucho tiempo (años o inclusive siglos!).
Afortunadamente es posible decidir si un número es primo o compuesto sin necesidad
de encontrar sus factores. Por ejemplo con el Pequeño Teorema de Fermat, supongamos
que queremos ver si n > 2 es primo o no, entonces calculamos 2n−1 (mód n), si n fuese
primo entonces 2n−1 ≡ 1 (mód n), asi que si esto no se verifica podemos asegurar que
n es compuesto (Criterio de primalidad de Fermat) sin tener mayor información sobre su
factorización (si diese 1 no podrı́amos afirmar que fuese primo, pero podrı́amos probar con
otro a, 1 < a < n, calculando an−1 (mód n)). Una mejora de esta observación lo da el
test de primalidad conocido como Test de primalidad Miller-Rabin.
3.5. Test de primalidad Miller-Rabin. Tomamos como entrada del test un entero positivo n > 1 impar del cual queremos determinar si es primo o no, los pasos del
algoritmo son los siguientes:
1.
2.
3.
4.
5.
6.
7.
8.
9.
Escribir n − 1 = 2α m donde m es un entero impar.
Elegir un entero a al azar con 1 < a < n − 1.
Si am ≡ ±1 (mód n) ⇒ Return “n es probablemente primo”.
Si α = 1 ⇒ Return “n es compuesto”
Ingreso una nueva variable i = 0.
i++
Si i = α ⇒ Return “n es compuesto”
i
Si a2 m ≡ −1 (mód n) ⇒ Return “n es probablemente primo”
Retornar al paso 6.
Antes de comenzar a analizar el algoritmo vale recalcar que en el momento que este
retorna “n es probablemente primo” ó “n es compuesto” entonces se detiene (es decir, no
seguimos con los siguientes pasos), entonces si hemos llegado a un paso, es porque en los
pasos anteriores no ha retornado nada el algoritmo. En el paso 6, el i + + significa que se
incrementa el valor de la variable en 1, es decir si en determinado paso i = j y nos toca el
paso 6, entonces en el siguiente paso el valor de i es i = j + 1.
Ahora veamos la eficiencia del algoritmo, primero observemos que para el paso 1, lo
que se puede hacer para hallar el α y el m es simplemente dividir sucesivamente entre 2
comenzando por n − 1 hasta que de un resultado impar (que es el m), la cantidad de veces
que se ha divido entre 2 es α. Entonces escribir a n de la forma que lo estipula el paso 1,
lleva a lo sumo log2 (n) pasos.
Luego en las iteraciones de los pasos 6,7,8 y 9 lo que se hace es ir calculando la lista de
i
números a2 m (mód n) con i = 1, 2, . . . , α − 1, observando que cada término de la lista es
i
i+1
el cuadrado del anterior (es decir (a2 m )2 = a2 m ). Entonces para calcular cada término a
partir del anterior solo hay que elevar al cuadrado y reducir módulo n, tomando esto como
una sola operación. Ası́ calcular los números de la lista lleva a lo sumo α − 1 < log2 (n)
pasos, ası́ el algoritmo en sı́ lleva un total de 2log2 (n) pasos, ası́ que es lineal en la cantidad
de bits de n.
3. CRIPTOSISTEMAS DE CLAVE PÚBLICA
15
Ahora finalmente veamos que el algoritmo funciona, es decir que si retorna “n es compuesto” entonces n es compuesto, antes de ver esto veamos un lema previo.
Lema. Si p es primo y x2 ≡ 1
(mód p) entonces x ≡ ±1 (mód p)
Dem. Si x2 ≡ 1 (mód p) entonces p|x2 − 1 = (x − 1)(x + 1), luego p|x − 1 ó p|x + 1
pues p es primo, en el primer caso x ≡ 1 (mód p) en el segundo x ≡ −1 (mód p)
Volviendo al algoritmo, observemos que para que el algoritmo retorne “n es compuesto”
solo son posibles dos casos:
1. Que α = 1 y que am 6≡ ±1 (mód n).
Tenemos que n = 2m, si n fuese primo entonces por el Pequeño Teorema de
Fermat tenemos que an−1 ≡ 1 (mód n), pero an−1 = (am )2 ası́ que (am )2 ≡ 1
(mód n). Luego por el lema am ≡ ±1 (mód n) ABS, por lo tanto n es compuesto.
2. Que α > 1, que am 6≡ ±1 (mód n) y para i = 1, 2, . . . , α − 1 ninguno de los
i
números a2 m es congruente con −1 módulo n.
Si n fuese primo entonces por Fermat:
αm
an−1 = a2
α
= (am )2 ≡ 1 (mód n)
i
consideremos el menor j tal que (am )2 ≡ 1 (mód n) para i = j, j + 1, j +
j−1
2, . . . , α, como am 6≡ ±1 (mód n) entonces j > 1. Por otra parte x = (am )2
j
verifica x2 ≡ 1 (mód n) (pues (am )2 ≡ 1 (mód n)). Luego por el lema x ≡ ±1
(mód n) ası́ que concluimos que j − 1 6= 0, ası́ que j − 1 ≥ 1, luego por hipótesis x
no puede ser congruente con −1 módulo n ası́ que x ≡ 1 (mód n) contradiciendo
la minimalidad de j ABS, por lo tanto n es compuesto.
Se puede probar que si el algoritmo devuelve “n es probablemente primo” entonces la
probabilidad que n sea compuesto es aproximadamente 1/4. También se prueba que si se
aplica el test k veces con el mismo n (eligiendo valores de a independientes) y supongamos
que en las k iteradas retorna “n es probablemente primo” entonces la probabilidad de
que n sea compuesto es del orden de 1/4k que decrece exponencialmente a medida que k
aumenta, por eso si k es suficientemente grande el algoritmo es bastante seguro.
Para culminar, dejaremos al lector como ejercicio sencillo que pruebe que el test de
Rabin-Miller es efectivamente una generalización del criterio de de primalidad de Fermat.
Ejercicio. Si el a elegido en el paso 2 del Test de Miller-Rabin verifica que an−1 6≡ 1
(mód n) entonces el Test de Miller-Rabin devuelve “n es compuesto”.
Descargar