Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Seguridad Informática Criptografı́a de clave pública Ramón Hermoso, Rubén Ortiz y Matteo Vasirani Universidad Rey Juan Carlos Firma digital Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 2 Tiene que hacerse de forma segura 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, ...) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Nacimiento de la clave pública I Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 2 3 Esquemas de cifrado de clave pública Esquemas de firma digital Protocolos de intercambio de claves Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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%$·%&$ sk Protocolo de intercambio de claves sk Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 3 4 A elige x ← Zq u.a.a. y calcula h = gx A envı́a (G, q, g, h) a B B recibe (G, q, g, h) y: Elige y ← Zq u.a.a. Calcula l = gy Envı́a l a A Obtiene la clave kB = hy 5 A recibe l y genera la clave kA = lx Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Intercambio de claves Diffie-Hellman II El protocolo es correcto si: kA = lx = (gy )x = gyx kB = hy = (gx )y = gxy Para poder usarlo es necesario tener una forma adecuada de codificar elementos de G en cadenas de bits Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Seguridad II Una elección habitual, para la que se cree que DDH es difı́cil, es la siguiente: 1 2 Se elige p ”primo fuerte”, es decir p = 2 · q + 1 donde q también es primo 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Seguridad IV Ataque Man-in-the-Middle Pierre Elmo Susi Hola Susi, soy Elmo, dame tu pk Hola Susi, soy Elmo, dame tu pk pksusi pkpierre Encpk_pierre("Quedamos a las 10") Encpk_susi("Me duele la cabeza, quedamos otro día") . . . Firma digital Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Esquema de cifrado de clave pública Consta de 3 algoritmos (Gen, Enc, Dec) (pk, sk) ← Gen(1n ) → genera un par hclave pública / clave privadai c ← Encpk (m) cifra el texto en claro m = Decsk (c) descifra el texto cifrado. En algunos casos Decsk (c) =⊥ (mensaje de error) Corrección: m = Decsk (Encpk (m)) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Experimento IND-CPA I A es el adversario y C el retador Se genera (pk, sk) mediante Gen(1n ) A recibe como input (1n , pk) A devuelve dos mensajes m0 , m1 de la misma longitud Se elige b ← {0, 1} C envı́a Encpk (mb ) a A A devuelve un bit b0 Si b = b0 se dice que Succ(A, n) = 1 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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) ≤ 21 + 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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Cifrado hı́brido III (Genh , Ench , Deck ) (Gen, Enc, Dec) esquema de cifrado de clave secreta (ECCS) (Gen0 , Enc0 , Dec0 ) esquema de cifrado de clave pública (ECCP) Genh (1n ): genera (pk, sk) ← Gen0 (1n ) Ench (pk, m): Genera k ← Gen(1n ) c1 = Enc0pk (k) c2 = Enc0k (m) c = c1 ||c2 Dech (sk, c1 ||c2 ): Calcula k = Dec0sk (c1 ) Calcula m = Deck (c2 ) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Algoritmo RSA I GenRSA(1n ): 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) Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Algoritmo RSA II Gen(1n ): 1: (N, e, d) ← GenRSA(1n ) 2: pk = (N, e) 3: sk = (N, d) Encpk (m) = [me mod N] donde m ∈ Z∗N Decsk (c) = [cd mod N] donde c ∈ Z∗N Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Algoritmo RSA III Corrección: Decsk (Encpk (m)) = [me mod N]d = [med 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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Ataques contra RSA I Al cifrar mensajes cortos cuando e es pequeño: Por ejemplo, si e = 3 y m < N 1/3 , entonces [m3 mod N] = m3 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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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: pk1 = (N1 , 3) pk2 = (N2 , 3) pk3 = (N3 , 3) Al cifrar el mismo mensaje con las tres claves: c1 = [m3 mod N1 ] c2 = [m3 mod N2 ] c3 = [m3 mod N3 ] Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Ataques contra RSA III Usando el teorema chino del resto se puede construir c < N = N1 N2 N3 tal que: c = c1 mod N1 c = c2 mod N2 c = c3 mod N3 Por lo tanto, c = m3 mod N y se puede aplicar el ataque anterior (hallar la raı́z cúbica de c en los números enteros) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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: c1 = [me1 mod N] c2 = [me2 mod N] y mcd(e1 , e2 ) = 1 entonces puede calcular X e Y tales que X · e1 + Y · e2 = 1 (con el algoritmo de Euclides) Luego recupera m de la siguiente forma: cx1 · cy2 = m mod N Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 ZN ) Después de descifrar se descarta la parte superflua Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Encpk (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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Cifrado de El Gamal I Gen(1n ) Se eligen (G, q, g) como en el intercambio de claves de Diffie-Hellman x ← Zq h = gx pk = (G, q, g, h) sk = (G, q, g, x) Encpk (m) y ← Zq c1 = gy c2 = hy m Devuelve c = (c1 , c2 ) Decsk (c) Devuelve m = c2 /cx1 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Cifrado de El Gamal II Corrección: supongamos (c1 , c2 ) = Encpk (m) = (gy , hy m). Entonces: c2 /cy1 = hy m/(gy )x = (gx )y m/(gy )x = m Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 ← Zq pk = gx A diferencia de lo que ocurre con RSA, esto no compromete la seguridad del sistema Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Zp∗ de orden q Para codificar la cadena m0 de longitud n − 1, construimos m = [(m0 + 1)2 ) mod N]. A continuación, ciframos m utilizando El Gamal Después de descifrar, para recuperar m0 a partir de m, obtenemos las dos raı́ces cuadradas de m0 (se puede hacer eficientemente), nos quedamos con la menor y le restamos 1 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Implementación: un ejemplo I q = 83; p = 2q + 1 = 167 (p, q primos) g = 22 = 4 mod 167 ∗ G =< g > de orden 83 dentro de Z167 sk = 37 ← Z83 pk = (167, 83, 4, [437 mod 167]) = (167, 83, 4, 76) n = |q| = 7 Queremos el mensaje de 6 bits m0 = 011101 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Implementación: un ejemplo II Interpretamos m0 como 29 [(29 + 1)2 mod 167] = 65 Para cifrar elegimos y = 71 ← Z83 c = ([471 mod 167], [7671 · 65 mod 167]) = (132, 44) Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Implementación: un ejemplo III Para descifrar: [13237 mod 167] = 124 66 = [124−1 mod 167] m = [44 · 66 mod 167] = 65 65 tiene dos raı́ces cuadradas mod 167, son 30 y 137; elegimos la menor, 30 m0 = 30 − 1 = 29 = 011101 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Experimento IND-CCA Se genera (pk, sk) mediante Gen(1n ) A recibe el input (1n , pk) y acceso a un oráculo Decsk (.) A devuelve dos mensajes m0 , m1 de la misma longitud Se elige b ← {0, 1} Se envı́a c ← Encpk (mb ) a A A ya no puede solicitar Decsk (c) A devuelve un bit b0 Si b = b0 se dice que Succ(A, n) = 1 Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Ataque (CCA) contra algoritmo RSA (básico) A intercepta c = [me mod N] A elige r ∈ ZN∗ A pide descifrar c0 = [re · c mod N] Decsk (c0 ) = (re · c)d = r · cd = r · m = m0 mod N A recupera m = r−1 m0 mod N Introducción Clave pública Intercambio de claves (Diffie-Hellman) Ataque (CCA) contra El Gamal A intercepta c = (c1 , c2 ) = (gy , hy m) A elige m0 ∈ G A pide descifrar c0 = (c1 , c2 · m0 ) A recibe respuesta m · m0 = m00 A recupera m = (m0 )−1 m00 Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital ¿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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital ¿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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública 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 6= y tales que H(x) = H(y) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital ROM En la idealización llamada ROM se supone que se dispone de una función H (oráculo aleatorio) cuyas entradas son cadenas de bits arbitrarias El oráculo H funciona como una caja negra, la única forma de calcular H(m) es solicitarlo al oráculo Podemos pensar que el oráculo funciona de la siguiente forma: 1 2 Cuando se le solicita H(mi ) por primera vez genera un valor hi en el rango adecuado, devuelve H(mi ) = hi y almacena el par (mi , hi ) Si se le pide de nuevo H(mi ) devuelve hi Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Funciones hash y el ROM la estrategia habitual es construir protocolos usando un oráculo aleatorio y demostrar la noción de seguridad deseada Cuando estos protocolos se quieren implementar se sustituye el oráculo aleatorio por una modificación adecuada de una función hash resistente a colisiones Estas pruebas de seguridad no ofrecen las mismas garantı́as (se supone un modelo ideal) que aquellas en las que no se necesita un oráculo aleatorio (standard model) Sin embargo, son útiles porque proporcionan, al menos, una demostración de seguridad para esquemas eficientes utilizados en la práctica (para los que no se conoce ninguna en el standard model) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital OAEP OAEP: Optimal Asymmetric Encryption Padding En realidad es un algoritmo que codifica cadenas de n/2 bits en cadenas de 2n bits y que se puede usar combinado con distintos esquemas de cifrado Observación: se pueden generalizar estas longitudes Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública RSA-OAEP: descripción I Se dispone de dos funciones: G : {0, 1}n → {0, 1}n H : {0, 1}n → {0, 1}n Gen(1n ) (N, e, d) ← GenRSA(1n+1 ) pk = (N, e) sk = (N, d) Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública RSA-OAEP: descripción II Encpk (m) (donde m tiene longitud n/2) r ← {0, 1}n m1 = m||0n/2 m2 = G(r) ⊕ m1 m3 = r ⊕ H(m2 ) m0 = m2 ||m3 c = [(m0 )e mod N] Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública RSA-OAEP: descripción III Decsk (c) m0 = [cd mod N] m0 = m2 ||m3 r = H(m2 ) ⊕ m3 m1 = G(r) ⊕ m2 m1 = m||m0 SI m0 = 0n/2 ENTONCES m SI NO ⊥ Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital RSA-OAEP: seguridad Teorema Si G y H se comportan como oráculos aleatorios (ROM) y el problema es RSA difı́cil entonces el esquema RSA-OAEP es IND-CCA seguro Introducción Clave pública Intercambio de claves (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 y el ROM RSA-OAEP 5 Firma digital Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Firma digital Sirve para garantizar la integridad de los mensajes, es decir, da una prueba al receptor de que el mensaje no ha sido modificado por un adversario 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Esquema de firma Consiste en tres algoritmos: (Gen, Sign, Vrfy) (pk, sk) ← Gen(1n ) σ ← Signsk (m) b = Vrfypk (m, σ ) donde b = 1 significa válido y b = 0 significa no válido Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Definición de seguridad: experimento forge I Se genera (pk, sk) ← Gen(1n ) A recibe pk y acceso al oráculo Signsk (.) 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: Vrfypk (m, σ ) = 1 m no está en Q Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital Definición de seguridad: experimento forge II Corrección: ∀m Vrfypk (m, Signsk (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) Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma RSA (básica) Gen(1n ) (N, e, d) ← GenRSA(1n ) pk = (N, e) sk = (N, d) σ = Signsk (m) = [md mod N] Vrfypk (σ , m) = 1 si y sólo si: m = [σ e mod N] Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 m1 cualquiera m2 = [m/m1 mod N] A obtiene firmas σ1 y σ2 σ = σ1 σ2 es firma válida de m Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma RSA con hash Se dispone de una función hash H : {0, 1} → ZN∗ Para firmar m ∈ {0, 1}∗ se calcula: σ = [H(m)d mod N] Para verificar se comprueba si: σ e = H(m) mod N Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital 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 Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital DSS (o DSA) II Gen(1n ) produce: p y q primos, |q| = n, p = 2q + 1 g generador de un subgrupo de orden q de Zp∗ H : {0, 1}∗ → Zq una función hash x ← Zq y = gx pk = (H, p, q, g, y) sk = (H, p, q, g, x) Introducción Clave pública Intercambio de claves (Diffie-Hellman) DSS (o DSA) III Signsk (m) calcula: k ← Zq r = [[gk mod p] mod q] s = [(H(m) + x · r)/k mod q σ = (r, s) Cifrado de clave pública Firma digital Introducción Clave pública Intercambio de claves (Diffie-Hellman) Cifrado de clave pública Firma digital DSS (o DSA) IV Vrfypk (m, σ ) calcula: σ = (r, s) u = [H(m)/s mod q] v = [r/s mod q] y comprueba si: [[gu yv mod p] mod q] = r Si se cumple se devuelve VÁLIDO, en caso contrario, devuelve NO VÁLIDO