Criptografía Asimétrica
La criptografía asimétrica o criptografía de llave pública se diferencia de la criptografía simétrica en que se usan llaves distintas para cifrar y descifrar mensajes, lo que hace posible publicar la llave de cifrado con el objetivo de que otras personas puedan enviarnos mensajes que solo nosotros podremos descifrar, usando la llave de descifrado. Algo similar ocurre con la criptografía asimétrica usada para firmas digitales. Se usa una llave para “demostrar” que un mensaje fue enviado por nosotros mientras se publica la otra para que cualquiera pueda comprobar que la firma es válida.
En general, estos sistemas usan propiedades aritméticas para crear problemas matemáticos que son muy difíciles de resolver con información limitada, pero que conociendo un parámetro secreto puedes resolver de forma fácil. A este parámetro se le suele conocer como trapdoor.
Person-in-the-Middle en Criptografía Asimétrica
Los protocolos de criptografía asimétrica más básicos no consideran el problema de validar que la llave pública recibida es de quien dice ser. Nada evita que una tercera entidad que controle el canal de comunicación (Eva) pueda hacerse pasar por Bob frente a Alice, y por Alice frente a bob, generando su propio par de llaves asimétricas
RSA
Recibe su nombre por las iniciales de sus tres creadores: Rivest, Shamir y Adleman. Es uno de los sistemas criptográficos de llave pública más viejos.
Cifrado
Fue el primer esquema de cifrado de llave pública. Se destaca por el uso de aritmética modular, definiendo los siguientes parámetros:
es un número formado por la multiplicación de dos números primos obtenidos al azar y . es un grupo multiplicativo de enteros módulo . es nuestro mensaje en texto plano, codificado como un número perteneciente a . Debido a lo anterior, el tamaño de nuestro mensaje se encuentra limitado por la magnitud de (o sea, mientras más grande queramos que sea el mensaje a cifrar, más grande debe ser n). es nuestro exponente público y corresponde a un número menor que . es el inverso multiplicativo de e en el grupo , o sea, . es nuestro mensaje cifrado y se calcula como .
La Llave pública en RSA es el par de elementos
La gracia de saber que
En el algoritmo anterior, el valor de
Les recomendamos leer el capítulo 10 del libro Serious Cryptography para entender por qué ocurre esto.
Cifrado y descifrado en RSA
Para cifrar un mensaje en RSA, basta con calcular
En varias implementaciones, se suele fijar el valor de
Problemas de seguridad en RSA
Una mala implementación de RSA puede generar problemas de seguridad que permitirían incluso descifrar un mensaje. A continuación mencionamos algunos de ellos:
muy pequeño: En general, se suele usar un de tamaño 2048 bits o más para que el nivel de seguridad del valor cifrado sea similar a un cifrado con llave simétrica de 112 bits. En la práctica, un de tamaño 300 bits o menos, éste es fácilmente factorizable en un computador de uso personal. muy pequeño y mensajes sin padding: Si es un valor muy pequeño, y el mensaje cifrado no tienepadding
, es posible calcular la raíz ésima de para calcular .- Mala generación de números primos: Es muy importante que los números primos
y se generen de forma aleatoria. En caso que esto no sea así, se corre el riesgo de encontrarlos, y con esto poder derivar el valor secreto . - Problemas de maleabilidad en valores cifrados: Supongamos que ciframos con la misma llave pública dos valores
y , obteniéndose e respectivamente. Una persona externa podría calcular el valor cifrado de sin conocer y simplemente multiplicando los valores e . Para evitar este problema, se suele aplicar unpadding
especial a todos los valores cifrados con RSA, de forma que su representación numérica corresponda a un número grande. - Computación Cuántica El problema de factorización en el cual se basa la seguridad de RSA es resolvible en tiempo polinomial con computadores cuánticos usando el algoritmo de Shor. Afortunadamente, todavía no se conoce públicamente la existencia de un computador cuántico con la capacidad de factorizar números del tamaño de los usados en RSA.
La página en Wikipedia menciona con mayor detalle los ataques posibles a RSA, sin embargo, la comprensión de algunos de estos problemas requieren recordar hartos contenidos de teoría de números.
Padding en cifrado RSA: OAEP
El diagrama anterior, obtenido del libro Serious Cryptography, muestra en términos generales el uso de padding en RSA. Uno de los algoritmos de padding más usados en RSA es OAEP, el cual funciona de la siguiente forma:
- Se genera
( significa concatenar), donde es una constante conocida de tamaño , seguida de tantos bytes como sea necesario para que el tamaño de en bytes sea el mismo que el de , seguido de un byte . Finalmente, se coloca el mensaje original . - Se genera un valor
aleatorio de tamaño . - La función
recibe de entrada un valor de largo igual al de y devuelve un valor de largo igual al de . Llamaremos a este valor - La función
recibe de entrada un valor de largo igual al de y devuelve un valor de largo igual al de . Llamaremos a este valor - El valor paddeado
se construye de la siguiente forma: . Este es el valor que se cifra con RSA finalmente.
El proceso de descifrado requerirá seguir los pasos anteriores en orden inverso, con el objetivo de obtener el verdadero texto plano.
Firmas
En el caso de RSA, para un documento M, se define su firma
Hay que tener en consideración que, al igual que en el caso de cifrado RSA, el tamaño del mensaje a cifrar está limitado por el tamaño de
Potenciales ataques a las firmas RSA
- Firma de mensajes “triviales”: Si no se usa una función de padding, y existe la posibilidad de querer firmar un mensaje como
, o . En todos estos casos, es igual a , por lo que no es necesario conocer para generar la firma del mensaje. - Blinding Attack: Si no se usa una función de padding y se quiere obtener la firma de un mensaje
sin que la persona que firma el mensaje se entere que lo firmó, se le puede pasar un mensaje para firmarlo. La firma de este mensaje corresponderá a . Este valor se puede dividir por R de forma de obtener , que es la firma del mensaje M.
Padding en firmas RSA
A continuación se mencionan dos algoritmos de padding que suelen usarse en RSA:
PSS
Lamentablemente, no hay demostración de que OAEP es un método de padding seguro para firmas RSA. Sin embargo, existe otro algoritmo de padding para este caso, denominado PSS.
La implementación de PSS es algo compleja, por lo que la enlazaremos solamente: referencia.
FDH
Full Domain Hash es una forma más simple de paddear un documento, ya que considera simplemente calcular su hash con alguna función de hashing segura y luego firmar ese valor. Formalmente, no está demostrada su seguridad, pero en la práctica se considera una buena función de padding, debido a que su simplicidad disminuye considerablemente la posibilidad de error en implementación que sí posee PSS.
Acuerdo de llaves Diffie-Hellman
En general se considera que Withfeld Diffie y Martin Hellman son los creadores del concepto de criptografía de llave pública. Ellos crearon también un esquema para acordar una llave compartida entre dos partes, denominado generalmente como protocolo Diffie-Hellman
. Este protocolo requiere de los siguientes valores:
- Un número primo grande
de forma de definir un grupo multiplicativo sobre el cual trabajar. - Un número generador
, perteneciente a . En general se suele usar . - Cada parte que desea comunicarse debe elegir un número aleatorio en
. Los denominaremos y para y respectivamente. Estos valores son secretos y nunca se intercambian.
En este caso, se consideran como llave pública los valores
Para obtener el valor compartido que usarán como llave simétrica para comunicarse, primero Alicia envía a Bob el número
y Bob envía a Alicia el número . Si existiese una persona entre medio observando el intercambio, no tendría como deducir o a partir de o (al problema de obtener a partir de un se le conoce como de el problema del logaritmo discreto y se considera que no existe un método general de resolución para él).Finalmente, para calcular el secreto compartido, cada parte eleva el valor recibido por su número aleatorio secreto. De esta forma, Alicia obtendrá
, mientras que Bob obtendrá . Ahora, ambas partes pueden usar ese valor compartido para cifrar mensajes.
Problemas de seguridad DH
- Replay Attacks (Ataques de Repetición): Incluso si se pudiera autenticar el mensaje, no hay forma de demostrar si el mensaje que viene de Alicia fue emitido ahora o fue emitido hace tiempo, pero ahora Eva lo está reenviando. Una forma de evitar este problema es agregando interactividad al protocolo de generación del secreto compartido, por ejemplo, pidiendo recibir un “valor de confirmación” que utilice tanto la llave pública de Alicia como la de Bob en ese momento para su generación.
- Uso directo de
como secreto compartido: Sabemos por lo visto que es un número aleatorio del grupo . Sin embargo, esto no significa que sea un número aleatorio (en el sentido que la probabilidad de cada bit de ser 0 o 1 sea la misma), dado que el grupo que forma el generador podría tener algún sesgo en la codificación de los números generados. Para evitar esta posibilidad, se suele hashear el valor con alguna función resistente a colisiones, como SHA3 o alguna KDF.
Criptografía de Curvas Elípticas
La criptografía de curvas elípticas (ECC) utiliza la estructura algebráica de curvas elípticas sobre cuerpos finitos que puee ser usada tanto para negociación de llaves como para firmas digitales, y tiene la ventaja de que las llaves y firmas producidas en ella suelen ser mucho más pequeñas que las de Diffie-Hellman o RSA, manteniendo el nivel de seguridad. En este curso no trataremos con ellas, pero en caso de querer saber más, recomendamos leer el capítulo 12 del libro Serious Cryptography.
Editar en GitHub Modificado por última vez el 16/06/2023 a las 12:44:00 hrs.