Rompiendo llaves RSA expĺıcitamente con OpenSSL Eduardo Ruiz Duarte Facultad de Ciencias UNAM
Agenda Criptografía asimétrica y conceptos fundamentales RSA Criptoanálisis expĺıcito de una llave generada con OpenSSL 256 bits Conclusiones
Introducción En las telecomunicaciones hay dos tipos de cifrado muy importantes Simétrico: Utiliza la misma llave para cifrar y descifrar D k (E k (x)) = x Asimétrico: Utiliza una llave para cifrar y otra para descifrar D s (E p (x)) = x
Introducción Simétricos El simétrico generalmente se usa para cifrar flujos de información, y estos suelen ser muy rapidos. Éste tiene una desventaja, requiere una negociación previa de una llave, Y si las entidades están separadas, esta llave se tendría que negociarse a través de un medio no seguro, lo cual sería absurdo. Ejemplos de algoritmos simétricos Rijndael-AES, Blowfish, TEA, A5
Introducción Asimétricos Aquí hay dos llaves, pública y privada, la pública se usa para cifrar y la privada para descifrar únicamente, a partir de la llave pública es Turing-intratable el problema de calcular la llave privada utilizando algoritmos asimétricos basados en factorización en números primos o el problema de logaritmo discreto en ciertos grupos Ejemplos de algoritmos asimétricos RSA, Elgamal, XTR, Diffie-Hellman
Introducción Asimétricos Estos algoritmos son muy importantes en internet ya que proveen la manera de cifrar y firmar datos entre dos entidades sin la necesidad de negociación de password, muchos servicios usan esto, y tal vez sin darte cuenta usas criptografía asimétrica diario
Conceptos básicos Número primo: Un número primo n > 1 es aquel que no se puede descomponer como multiplicación de otros números (sólamente como n 1), dicho de otra manera, sólo tiene dos divisores, n y 1 máximo común divisor: El máximo común divisor (mcd) de dos números x,y es el máximo número que divide a ambos sin dejar residuo Función φ(n): Esta función φ(n) nos dice cuantos números menores que n tienen como máximo común divisor al 1 sólamente, o sea, cuantos números menores que n son primos relativos con n
Conceptos básicos Ejemplos: primos 2,3,11,29,233 Máximo común divisor mcd(48,60) = 12 ya que el 12 es el máximo divisor de ambos Función φ(n) φ(9) = 6 ya que #A = {1,2,4,5,7,8} = 6 y mcd(i,9) = 1 i A φ(p) = p 1 para p primo φ(pq) = (p q)(q 1) para p,q primos
Conceptos básicos Aritmética modular La artimética modular sobre Z resumida en un slide es operar enteros en un conjunto acotado, es decir a b c mod n por lo que c es el número más chico que cumple que (a b) c es múltiplo de n, esto es muy fácil calcularlo, veamos un ejemplo
Conceptos básicos Aritmética modular 5 3 1 mod 2 ya que 5 3 es 15 y el residuo de 15 entre 2 es 1 9 2 3 mod 5 ya que 9 2 es 18 y el residuo de 18 entre 5 es 3
RSA Generación de llaves: Se escogen dos dos números primos aleatorios (p,q) Se computa n = pq este nombre será el módulo Se computa φ(n) = (p 1)(q 1) Se escoge un e tal que 1 e < φ(n) y mcd(φ(n),e) = 1 Se computa d tal que d e 1 mod φ(n) Ahora (d,p,q) será la llave privada y (e,n) la llave pública
RSA Cifrado A recibirá M entonces A le manda a B su llave pública (e,n) B computa c = M e mod n y le manda c a A
RSA Descifrado A para obtener M computa sobre c lo siguiente: M = c d mod n que es lo mismo que M = (M e ) d mod n y así obtiene el mensaje M.
RSA Seguridad Si un atacante obtiene la llave pública (e,n) tenemos que d = e 1 mod φ(n) lo que es lo mismo que d = e 1 mod (p 1)(q 1) Esta persona tendrá que factorizar n = pq para poder calcular e 1 mod (p 1)(q 1) ya que se debe de saber (p 1)(q 1) para calcular e tal que ed 1 mod (p 1)(q 1) El problema de factorizar es no determinístico, es decir no se pueden calcular los factores de un entero en tiempo polinomial, al menos con una computaora no cuántica
RSA Conjeturas El problema más importante de la historia de las matemáticas modernas, actualmente sin responder, es la hipótesis de Riemann la cual como corolario nos dice que tan densos son los números primos usando la función zeta de Riemann, este problema de los números primos se ha ido resolviendo a maquinazos haciendo cada día el uso de las llaves más grandes por lo que esto implica mayor cómputo, por lo que existen mejores problemas para criptografía asimétrica como lo es el problema del logaritmo discreto el cual veremos en mi otra presentación
Rompiendo una llave OpenSSL OpenSSL es el standard de SSL libre que se usa actualmente para asegurar confidencialidad en sitios de internet por ejemplo éste tiene una interfaz para generar llaves, las cuales son standares los formatos y son los que usan los navegadores por ejemplo, veamos como funciona el cifrado y como se generan las llaves Creamos archivo plano de mensaje: echo jojojo > msg.txt Cifrado: openssl rsautl -encrypt -pubin -inkey pubkey.pem -in msg.txt -out msg.enc Descifrado: openssl rsautl -decrypt -inkey priv.pem -in msg.enc -out msg.nuevo
Rompiendo una llave OpenSSL Para generar una llave privada priv.pem (es decir (p,q) openssl genrsa -out privada.pem 256 Para generar una llave pública pub.pem con la privada, es decir (e,n) openssl rsa -in privada.pem -pubout -out pub.pem Para extraer el módulo : openssl rsa -in pub.pem -pubin -text -modulus El módulo nos los da en hex por lo que para convertirlo a decimal: echo ibase=16; 9ABAAD5BBE954A26BB1F9871865F bc Factorizamos: msieve -v 3138281169008962629484387769615967 Generamos la llave privada en formato PEM con los dos factores: http://math.co.ro/cgibin/genpriv?p=factor1&q=factor2&e=exp
Rompiendo una llave OpenSSL Con esto tendremos una llave en este formato que solo habremos generado con información de la pública y también nos servirá para descifrar nuestro ejemplo msg.enc BEGIN RSA PRIVATE KEY MIGsAgEAAiEAtOcoQsRl82tLz6QxHYKz/G9J0FaO408sJ2Yj/GTyVSsCAwEA AJIb8USb48wK6Rw3/QNcwYjRJctW0ZZl4n0j6y8QFBcBAhEA4z4k7kv3F7RI YbAICwIRAMvLxM4XkDsjvd+jGmtme2ECEQDQpainHBzeKOw1TMlQdJ6NA G5SYwsQIkexpVC00oQIQInCIzHp3Ex91s7AV+9Dm8A== END RSA PRIVATE KEY
Gracias! Eduardo Ruiz Duarte beck@math.co.ro http://math.co.ro blog: http://b3ck.blogspot.com twitter: @toorandom PGP key fingerprint: 0xFEE7F2A0