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”.