Seguridad Informática Criptografía de clave pública Ramón Hermoso y Matteo Vasirani Universidad Rey Juan Carlos
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Limitaciones de l criptografía de clave secreta I Necesidad de compartir una clave La clave debe transmitirse por un canal seguro (hay que implementarlo!) No siempre es posible No es eficiente/fiable en grupos grandes que se comunican dos a dos Además: Almacenamiento de claves: 1 Tiene que hacerse de forma segura 2 Una clave para cada usuario distinto con el que se establece comunicación Sistemas abiertos: existen entornos, en los que por su naturaleza, no se puede distribuir las claves de forma físicamente segura (teléfono, Internet,...)
Limitaciones de l criptografía de clave secreta II Solución parcial: Centro de Distribución de Claves (KDC) Cada usuario guarda una única clave secreta para comunicarse con el KDC (que las guarda todas) Si B quiere comunicarse con C envía al KDC el mensaje B quiere hablar con C autenticado con su clave secreta El KDC genera una clave de sesión que envía cifrada a B y C B y C se pueden comunicar de manera segura con esta clave, que desechan al terminar
Limitaciones de l criptografía de clave secreta III Ventajas: Cada usuario almacena una única clave Cuando llega un usuario nuevo sólo tiene que intercambiar la clave con el KDC Desventajas: Si se rompe el KDC, el sistema ya no sirve para ningún usuario Si el KDC falla se corta la comunicación entre todos los usuarios No resuelve el problema de los sistemas abiertos
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Nacimiento de la clave pública I
Nacimiento de la clave pública II En 1976 W. Diffie y M. Hellman publican el artículo New Directions in Cryptography donde establecen las bases de la criptografía pública Introducen tres primitivas de clave pública (o asimétrica): 1 Esquemas de cifrado de clave pública 2 Esquemas de firma digital 3 Protocolos de intercambio de claves
Cifrado con clave pública A genera dos claves: pk y sk Asimetría en las claves: una para cifrar (pk) y otra para descifrar (sk) La seguridad del esquema sólo depende de que sk se mantenga en secreto pk se hace pública: cualquiera puede enviar un mensaje a A utilizando pk (de A) Resuelve los problemas de distribución y almacenamiento de claves
Firma digital Preserva la autenticidad de los mensajes Sólo A puede firmar sus mensajes usando su sk Cualquiera puede verificar la firma de un mensaje utilizando la pk de A Se obtiene no repudio: sólo A puede haber firmado el mensaje, la firma es una prueba
Intercambio de claves Dos partes que no comparten información a priori intercambian mensajes por un canal inseguro para acabar compartiendo un valor común Los mensajes intercambiados no permiten obtener información de manera eficiente del valor común compartido A Canal inseguro B #@ # @ # ###@ #??!" $ @ 3%$ %&$ s k Protocolo de intercambio de claves s k
Implementación de la primitivas En el artículo de 1976, Diffie y Hellman introducen las primitivas, pero sólo presentan un protocolo de intercambio de claves En 1977 Rivest, Shamir y Adleman presentan esquemas de cifrado y firma En 1985, El Gamal publica un esquema de cifrado basado en el protocolo Diffie-Hellman
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Intercambio de claves Diffie-Hellman I Protocolo: Parámetro de seguridad común: n 1 A usa un algoritmo de generación y obtiene: G grupo cíclico de orden q (con q = n) g un generador de G 2 A elige x Z q u.a.a. y calcula h = g x 3 A envía (G,q,g,h) a B 4 B recibe (G,q,g,h) y: Elige y Z q u.a.a. Calcula l = g y Envía l a A Obtiene la clave k B = h y 5 A recibe l y genera la clave k A = l x
Intercambio de claves Diffie-Hellman II El protocolo es correcto si: k A = l x = (g y ) x = g yx k B = h y = (g x ) y = g xy Para poder usarlo es necesario tener una forma adecuada de codificar elementos de G en cadenas de bits
Seguridad I Si DLP (Problema del Logaritmo Discreto) se puede resolver eficientemente en G, la clave común se recupera a partir de los mensajes intercambiados por A y B Teorema: si el algoritmo de generación hace que DDH sea difícil con (G,q,g) entonces el protocolo es seguro Para que DDH sea difícil se cree conveniente que G sea de orden primo
Seguridad II Una elección habitual, para la que se cree que DDH es difícil, es la siguiente: 1 Se elige p primo fuerte 2 Dentro de Z p se elige un elemento g de orden q y se toma G =< g > Observación: los elementos de G son exactamente los elementos de Z p con raíz cuadrada
Seguridad III Vulnerable a ataques MitM (Man in the Middle) Existe un adversario capaz de interceptar los mensajes enviados por A y B y sustituirlos por otros de su elección Al final, el adversario es capaz de que A y B terminen el protocolo con claves distintas y conocidas por él
Seguridad IV Ataque Man-in-the-Middle Pierre Elmo Susi Hola Susi, soy Elmo, dame tu pk Hola Susi, soy Elmo, dame tu pk pk susi pk pierre Enc pk_pierre ("Quedamos a las 10")... Enc pk_susi ("Me duele la cabeza, quedamos otro día")
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Esquema de cifrado de clave pública Consta de 3 algoritmos (Gen, Enc, Dec) (pk,sk) Gen(1 n ) genera un par clave pública / clave privada c Enc pk (m) cifra el texto en claro m = Dec sk (c) descifra el texto cifrado. En algunos casos Dec sk (c) = (mensaje de error) Corrección: m = Dec sk (Enc pk (m))
Experimento IND-CPA I A es el adversario y C el retador Se genera (pk,sk) mediante Gen(1 n ) A recibe como input (1 n,pk) A devuelve dos mensajes m 0,m 1 de la misma longitud Se elige b {0,1} C envía Enc pk (m b ) a A A devuelve un bit b Si b = b se dice que Succ(A,n) = 1
Experimento IND-CPA II Decimos que un esquema de cifrado es IND-EAV seguro si para cualquier adversario PPT A se tiene P(Succ(A,n) = 1) 1 2 + negl(n) En el contexto de clave pública el acceso a un oráculo de cifrado no aporta nada a A Por tanto, seguridad IND-EAV y seguridad IND-CPA son equivalentes (se suele usar la segunda)
Observaciones sobre seguridad Importante NO es posible conseguir secreto perfecto (seguridad incondicional o contra adversarios sin limitaciones computacionales) en cifrado de clave pública Similitudes con clave secreta: Al igual que en clave secreta, cualquier esquema determinista no puede ser IND-CPA seguro Como en clave secreta, seguridad IND-CPA cifrando un único mensaje es equivalente a seguridad IND-CPA cifrando múltiples mensajes
Cifrado híbrido I Característica fundamental El cifrado de clave secreta es significativamente más eficiente que el de clave pública Importante Por lo que para cifrar mensajes largos es habitual usar clave secreta y clave pública de manera conjunta
Cifrado híbrido II Se tiene a disposición un esquema de clave secreta y uno de clave pública En primer lugar B cifra una clave k para el esquema de clave secreta utilizando la pk de A Después, B cifra el mensaje m con el esquema de clave secreta utilizando k B envía ambos textos cifrados a A
Cifrado híbrido III (Gen h, Enc h, Dec k ) (Gen, Enc, Dec) esquema de cifrado de clave secreta (ECCS) (Gen,Enc,Dec ) esquema de cifrado de clave pública (ECCP) Gen h (1 n ): genera (pk,sk) Gen (1 n ) Enc h (pk,m): Genera k Gen(1 n ) c 1 = Enc pk (k) c 2 = Enc k (m) c = c 1 c 2 Dec h (sk,c 1 c 2 ): Calcula k = Dec sk (c 1) Calcula m = Dec k (c 2 )
Cifrado híbrido: seguridad El cifrado híbrido se ajusta a la definición de esquema de cifrado de clave pública Teorema Teorema: si el ECCS es IND-EAV seguro y el ECCP es IND-CPA seguro, entonces el esquema híbrido es IND-CPA seguro
Algoritmo RSA I GenRSA(1 n ): Genera al azar dos primos p,q de n bits Para ello, se generan al azar números de n bits y se les pasa un test de primalidad hasta que se consiga un número primo N = p q φ(n) = (p 1) (q 1) Elige e tal que mcd(e,φ(n)) = 1 Calcula d = [e 1 mod φ(n)]] Devuelve (N,e,d)
Algoritmo RSA II Gen(1 n ): 1: (N,e,d) GenRSA(1 n ) 2: pk = (N,e) 3: sk = (N,d) Enc pk (m) = [m e mod N] donde m Z N Dec sk (c) = [c d mod N] donde c Z N
Algoritmo RSA III Corrección: Dec sk (Enc pk (m)) = [m e mod N] d = [m ed mod N] = [m mod N] = m Observación: la penúltima igualdad es cierta porque φ(n) es el orden de Z N y ed = 1 mod φ(n)
Seguridad en RSA Saber factorizar N permite recuperar la clave secreta de forma sencilla Este esquema NO es IND-CPA seguro puesto que es determinista Se puede probar una noción débil de seguridad (OW-CPA): si el problema RSA es difícil entonces la probabilidad de recuperar el mensaje completo a partir del texto cifrado es despreciable
Implementación de RSA Es necesario determinar una manera de codificar cadenas de bits en elementos de Z N Es posible acelerar el proceso de descifrado utilizando el teorema chino del resto La elección de e es importante. Una elección popular fue e = 3 (para acelerar el cifrado). Pero ésto hace el esquema vulnerable a diversos ataques
Ataques contra RSA I Al cifrar mensajes cortos cuando e es pequeño: Por ejemplo, si e = 3 y m < N 1/3, entonces [m 3 mod N] = m 3 Por lo tanto, para descifrar, basta con obtener la raíz cúbica del texto cifrado en los números enteros (y ésto se puede hacer eficientemente)
Ataques contra RSA II e pequeño y mismo mensaje con distintos módulos: Por ejemplo, e = 3 y tres claves públicas para tres usuarios distintos: pk 1 = (N 1,3) pk 2 = (N 2,3) pk 3 = (N 3,3) Al cifrar el mismo mensaje con las tres claves: c 1 = [m 3 mod N 1 ] c 2 = [m 3 mod N 2 ] c 3 = [m 3 mod N 3 ]
Ataques contra RSA III Usando el teorema chino del resto se puede construir c < N = N 1 N 2 N 3 tal que: c = c 1 mod N 1 c = c 2 mod N 2 c = c 3 mod N 3 Por lo tanto, c = m 3 mod N y se puede aplicar el ataque anterior (hallar la raíz cúbica de c en los números enteros)
Ataques contra RSA IV Al usar el mismo módulo para usuarios distintos (un usuario interno puede descifrar mensajes dirigidos a otros): Esto sucede porque a partir de dos números tales que: ed 1 mod φ(n) es posible hallar eficientemente la factorización de N
Ataques contra RSA V Al usar el mismo módulo para usuarios distintos (un adversario externo puede descifrar un mensaje si se le envía a dos usuarios distintos) Si un adversario intercepta: c 1 = [m e 1 mod N] c 2 = [m e 2 mod N] y mcd(e 1,e 2 ) = 1 entonces puede calcular X e Y tales que X e 1 + Y e 2 = 1 (con el algoritmo de Euclides) Luego recupera m de la siguiente forma: c x 1 cy 2 = m mod N
Padded RSA Idea: completar el mensaje de forma aleatoria antes de cifrar Visión general: Se cifran mensajes de longitud fija l(n) 2n 2 Un mensaje de longitud l(n) se completa con una cadena aleatoria de bits r de longitud N l(n) 1 antes de cifrar Se cifra el mensaje r m (visto como un elemento de Z N ) Después de descifrar se descarta la parte superflua
Seguridad de padded RSA I Si l(n) está demasiado cerca de 2n, es posible un ataque por fuerza bruta probando con todos los valores aleatorios posibles y el esquema no será IND-CPA seguro Si l(n) = cn con c < 2, es razonable pensar que el esquema es seguro, pero no se conoce demostración Si l(n) es pequeño, l(n) = O(logN), se puede demostrar que el esquema es IND-CPA seguro, suponiendo que el problema es RSA difícil
Seguridad de padded RSA II Ejemplo: PKCS #1 v1.5 Si pk = (N,e) se toma k = longitud de N en bytes Se cifran mensajes de longitud D k 11 bytes Enc pk (m) = [(00000000 00000010 r 00000000 m) e mod N] donde r es una cadena generada al azar de (k D 3) bytes Esencialmente es un caso concreto de Padded RSA Con el límite para la longitud de m se asegura que r tiene, al menos, 8 bytes Se cree que es IND-CPA seguro (pero no hay demostración)
Cifrado de El Gamal I Gen(1 n ) Se eligen (G,q,g) como en el intercambio de claves de Diffie-Hellman x Z q h = g x pk = (G,q,g,h) sk = (G,q,g,x) Enc pk (m) y Z q c 1 = g y c 2 = h y m Devuelve c = (c 1,c 2 ) Dec sk (c) Devuelve m = c 2 /c x 1
Cifrado de El Gamal II Corrección: supongamos (c 1,c 2 ) = Enc pk (m) = (g y,h y m). Entonces: c 2 /c x 1 = hy m/(g y ) x = (g x ) y m/(g y ) x = m
Seguridad de El Gamal Teorema Si DDH es difícil con la generación elegida de (G,q,g), entonces el esquema de cifrado de El Gamal es IND-CPA seguro La demostración se basa en que, si no se tiene ningún conocimiento del exponente y, entonces c 2 = h y m es, esencialmente un one-time pad de m
Implementación Compartiendo parámetros En lugar de que cada usuario genere (G,q,p) se puede optar por que un administrador del sistema los fije para un grupo de usuarios Cada usuario elige: sk = x Z q pk = g x A diferencia de lo que ocurre con RSA, esto no compromete la seguridad del sistema
Implementación Codificando mensajes Hace falta codificar las cadenas de bits como elementos del grupo Por ejemplo, supongamos p = 2q + 1, con p y q primos, y que tomamos G =< g > donde g es un elemento de Z p de orden q Para codificar la cadena m de longitud n 1, construimos m = [(m + 1) 2 ) mod N]. A continuación, ciframos m utilizando El Gamal Después de descifrar, para recuperar m a partir de m, obtenemos las dos raíces cuadradas de m (se puede hacer eficientemente), nos quedamos con la menor y le restamos 1
Implementación: un ejemplo I q = 83; p = 2q + 1 = 167 (p, q primos) g = 2 2 = 4 mod 167 G =< g > de orden 83 dentro de Z167 sk = 37 Z 83 pk = (167,83,4,[4 37 mod 167]) = (167,83,4,76) n = q = 7 Queremos el mensaje de 6 bits m = 011101
Implementación: un ejemplo II Interpretamos m como 29 [(29 + 1) 2 mod 167] = 65 Para cifrar elegimos y = 71 Z 83 c = ([4 71 mod 167],[76 71 65 mod 167]) = (132,44)
Implementación: un ejemplo III Para descifrar: [132 37 mod 167] = 124 66 = [124 1 mod 167] m = [44 66 mod 167] = 65 65 proviene de dos posibles raíces cuadradas mod 167, son 30 y 137; elegimos la menor, 30 m = 30 1 = 29 = 011101
Seguridad IND-CCA en clave pública Definición análoga a la de clave secreta El adversario tiene acceso a la clave pública y a un oráculo de descifrado (al que no le puede pedir el reto ) Ninguno de los esquemas vistos hasta ahora es seguro ante este tipo de ataques
Experimento IND-CCA Se genera (pk,sk) mediante Gen(1 n ) A recibe el input (1 n,pk) y acceso a un oráculo Dec sk (.) A devuelve dos mensajes m 0,m 1 de la misma longitud Se elige b {0,1} Se envía c Enc pk (m b ) a A A ya no puede solicitar Dec sk (c) A devuelve un bit b Si b = b se dice que Succ(A,n) = 1
Ataque (CCA) contra algoritmo RSA (básico) A intercepta c = [m e mod N] A elige r Z N A pide descifrar c = [r e c mod N] Dec sk (c ) = (r e c) d = r c d = r m = m mod N A recupera m = r 1 m mod N
Ataque (CCA) contra El Gamal A intercepta c = (c 1,c 2 ) = (g y,h y m) A elige m G A pide descifrar c = (c 1,c 2 m ) A recibe respuesta m m = m A recupera m = (m ) 1 m
Hay esquemas INC-CCA seguros? I Padded RSA también es vulnerable a este tipo de ataques El primer esquema de cifrado eficiente para el que se demostró seguridad INC-CCA fue introducido por Crame y Shoup en 2003 Es una evolución de El Gamal y su seguridad está basada en la dificultad de DDH
Hay esquemas INC-CCA seguros? II No se conocen esquemas prácticos y seguros IND-CCA basados en el problema RSA En general, hay pocos esquemas seguros IND-CCA y suelen ser complejos y tener problemas de eficiencia El enfoque que se ha usado con mucha frecuencia es construir esquemas eficientes cuya seguridad IND-CCA se puede demostrar en un modelo idealizado llamado Random Oracle Model (ROM)
Funciones hash (funciones resumen) I Son funciones H : {0,1} {0,1} k computables en tiempo polinomial (Asocian a una cadena de bits de longitud arbitraria otra cadena de bits de longitud fija más corta) Tiene aplicaciones criptográficas en códigos de autenticación de mensajes (MAC), esquemas de cifrado de clave pública y de firma digital
Funciones hash (funciones resumen) II Dado un valor m, se espera que H(m) sea un valor que sólo es asociable a m Para conseguir ésto es necesario que la función hash tenga la propiedad de resistencia a colisiones: Es computacionalmente difícil encontrar valores x y tales que H(x) = H(y)
Ejemplos de funciones hash Familia MD: MD4, MD5,... Familia SHA: SHA-0, SHA-1, SHA-2 Desde 2009 se está desarrollando SHA-3, mediante una competición abierta similar a la convocada para diseñar AES
Índice 1 Introducción 2 Clave pública 3 Intercambio de claves (Diffie-Hellman) 4 Cifrado de clave pública Cifrado RSA Cifrado de El Gamal Seguridad IND-CCA Funciones hash 5 Firma digital
Firma digital Sirve para garantizar la autenticidad de los mensajes, es decir, da una prueba al receptor de que el mensaje ha sido enviado por un emisor en concreto. B genera un par (pk,sk). Para firmar un mensaje m que quiere enviar, usa sk para producir una firma σ(m). Cualquiera que conozca pk puede comprobar si σ(m) es una firma válida de m relativa a pk
Esquema de firma Consiste en tres algoritmos: (Gen, Sign, Vrfy) (pk,sk) Gen(1 n ) σ Sign sk (m) b = Vrfy pk (m,σ) donde b = 1 significa válido y b = 0 significa no válido
Definición de seguridad: experimento forge I Se genera (pk,sk) Gen(1 n ) A recibe pk y acceso al oráculo Sign sk (.) Se almacena en una lista Q todos los mensajes cuya firma solicita A al oráculo A devuelve un par (m,σ) Succ(A,n) = 1 si y sólo si: Vrfy pk (m,σ) = 1 m no está en Q
Definición de seguridad: experimento forge II Corrección: m Vrfy pk (m,sign sk (m)) = 1 Ataques CMA Decimos que un esquema de firma es existencialmente infalsificable para ataques CMA (Chosen Message Attack) si para cualquier adversario PPT A se tiene, en el experimento forge que: P(Succ(A,n) = 1) negl(n)
Firma RSA (básica) Gen(1 n ) (N,e,d) GenRSA(1 n ) pk = (N,e) sk = (N,d) σ = Sign sk (m) = [m d mod N] Vrfy pk (σ,m) = 1 si y sólo si: m = [σ e mod N]
Ataques contra firma RSA I Un adversario que tenga acceso a pk puede obtener una firma válida sin acceder a ningún par firmado por el usuario legítimo (no-message attack): Elige σ cualquiera Calcula m = σ e Observación: el adversario no controla qué mensaje está firmando
Ataques contra firma RSA II Con dos peticiones al oráculo de firma, A es capaz de generar una firma válida para cualquier mensaje: A quiere obtener una firma de m A elige un m 1 cualquiera m 2 = [m/m 1 mod N] A obtiene firmas σ 1 y σ 2 σ = σ 1 σ 2 es firma válida de m
Firma RSA con hash Se dispone de una función hash H : {0,1} Z N Para firmar m {0,1} se calcula: σ = [H(m) d mod N] Para verificar se comprueba si: σ e = H(m) mod N
Seguridad Firma RSA con hash Los ataques anteriores ya no funcionan de forma inmediata si H es difícil de invertir RSA con hash cumple la definición de seguridad (es existencialmente infalsificable para ataques CMA) en el ROM (es decir, en el modelo ideal en el que H es un oráculo aleatorio) bajo la suposición de que el problema es RSA difícil No hay demostración de seguridad en el modelo estándar
DSS (o DSA) I DSS (Digital Signature Standard), también llamado DSA (Digital Signature Algorithm), fue propuesto por el NIST de EE.UU. en 1991 y se ha usado desde entonces sin que se hayan encontrado ataques relevantes Su seguridad está basada en la dificultad de DLP. Sin embargo, no se conocen demostraciones de seguridad ni en el modelo estándar ni en el ROM
DSS (o DSA) II Gen(1 n ) produce: p y q primos, q = n, p = 2q + 1 g generador de un subgrupo de orden q de Z p H : {0,1} Z q una función hash x Z q y = g x pk = (H,p,q,g,y) sk = (H,p,q,g,x)
DSS (o DSA) III Sign sk (m) calcula: k Z q r = [[g k mod p] mod q] s = [(H(m) + x r)/k mod q σ = (r,s)
DSS (o DSA) IV Vrfy pk (m,σ) calcula: σ = (r,s) u = [H(m)/s mod q] v = [r/s mod q] y comprueba si: [[g u y v mod p] mod q] = r Si se cumple se devuelve VÁLIDO, en caso contrario, devuelve NO VÁLIDO