Criptografía funcional: la alternativa al cifrado homomórfico para realizar cálculos sobre datos cifrados

8 de febrero de 2021

—Te ofrezco las coordenadas exactas de cada operativo desplegado en la zona de combate.
—¿Por cuánto?
­—100.000.
—Es mucho.
—Y un código que muestra en pantalla la posición actualizada de todos y cada uno de los soldados enemigos.
—¡Trato hecho!

Los videojuegos son un negocio muy serio. Mueven un mercado de muchos miles de millones de euros en todo el mundo y atraen a todo tipo de delincuentes.

Por ejemplo, en un videojuego multijugador online, cada dispositivo debe conocer la posición de todos los objetos sobre el terreno para poder renderizarlos correctamente en 3D. Además, necesita conocer las posiciones de otros jugadores, para representarlos si están a la vista del jugador local o no representarlos si se ocultan tras muros o rocas. El servidor se enfrenta a un dilema clásico: si proporciona las posiciones de los jugadores a los demás jugadores, podrán hacer trampas; pero si no las proporciona, el juego no sabrá cuándo mostrar a los jugadores ocultos.

En lugar de proporcionar las coordenadas exactas, lo ideal sería poder proporcionar la información de si un objetivo está o no a la vista del jugador local, pero sin filtrar su posición. Algo difícilmente posible hasta la invención de la criptografía funcional.

La criptografía funcional, un paso más allá de la criptografía convencional de clave pública

Con todos sus beneficios y maravillas, la criptografía de clave pública presenta algunas limitaciones prácticas:

  • Proporciona acceso todo-o-nada a los datos cifrados: o descifras el texto claro completo o no obtienes ninguna información sobre el texto claro.
  • Una vez cifrados los datos con la clave pública, solo existe una única clave privada capaz de descifrarlos.

En 2011, D. Boneh, A. Sahai y B. Waters propusieron ir más allá del cifrado asimétrico convencional con su criptografía funcional: una nueva propuesta de cifrado de clave pública en la que diferentes claves de descifrado permiten acceder a funciones sobre los datos en claro. En otras palabras, la criptografía funcional permite filtrar deliberadamente información sobre los datos cifrados a usuarios determinados.

En un esquema de cifrado funcional, se genera una clave pública, pk, con la que cualquier usuario puede cifrar un mensaje secreto, m, de manera que c = E(pk, m). Y aquí viene la vuelta de tuerca: en lugar de utilizar una clave de descifrado convencional, se crea una clave secreta maestra, msk, solo conocida por una autoridad central. Cuando esta autoridad recibe la descripción de una función, f, deriva a partir de msk una clave de descifrado funcional, dk[f], asociada con f. Cualquiera que use dk[f] para descifrar los datos cifrados, c, obtendrá en cambio el resultado de aplicar la función f a los datos en claro, f(m), pero ninguna información adicional sobre m. Es decir, D(dk[f], c) = f(m). La criptografía de clave pública convencional es un caso particular de criptografía funcional en el que f es la función identidad: f(m) = m.

Aplicaciones del cifrado funcional

Se pueden idear multitud de casos de uso para el cifrado funcional, allí donde se requiera operar sobre datos cifrados, pero sin verlos:

  • Filtrado de spam: un usuario no confía en su proveedor de correo, pero quiere que limpie sus mensajes de spam. El usuario puede implantar un sistema de cifrado funcional: cifra todos sus mensajes con pk y proporciona al servidor una clave de descifrado funcional, dk[f], donde f es una función de filtrado de spam que devuelve 1 si un mensaje m es spam y 0 en caso contrario. El servidor usará dk[f] para comprobar si un mensaje cifrado es spam, pero sin obtener ninguna información adicional sobre el mensaje en claro.
  • Búsquedas en bases de datos: un servicio en la nube almacena miles de millones de imágenes cifradas. La Policía quiere encontrar todas las imágenes que contengan la cara de un sospechoso. El servidor le proporciona una clave de descifrado funcional con la que descifra las imágenes que contienen la cara objetivo, pero que no revela nada sobre otras imágenes.
  • Análisis de grandes volúmenes de datos: considera un hospital que registra los datos médicos de sus pacientes y quiere ponerlos a disposición de la comunidad científica con fines de investigación. El hospital puede delegar en una nube pública el almacenamiento cifrado de los datos sensibles de sus pacientes. A continuación, puede generar claves de descifrado funcional que reparte a los investigadores, gracias a las cuales pueden calcular diferentes funciones estadísticas sobre los datos, sin revelar nunca los registros individuales de cada paciente.
  • Machine Learning sobre datos cifrados: después de entrenar un clasificador sobre un conjunto de datos en claro, se puede generar una clave de descifrado funcional asociada a este clasificador y con ella clasificar un conjunto de datos cifrados, de manera que al final solo se revela el resultado de la clasificación, sin filtrarse nada sobre los datos del conjunto.
  • Control de acceso: en una gran organización se desea compartir datos entre los usuarios de acuerdo con diferentes políticas de acceso. Cada usuario puede cifrar x = (P, m), donde m son los datos que el usuario desea compartir y P es la política de acceso que describe cómo el usuario quiere compartirlos. La clave de descifrado funcional dk[f] comprobará si las credenciales o los atributos del usuario coinciden con la política y revelará m solo en tal caso. Por ejemplo, la política P = ("CONTABILIDAD" O "TI") Y "EDIFICIO PRINCIPAL" devolvería m a un departamento de contabilidad o un departamento de TI con una oficina en el edificio principal de la organización.

Diferencias con respecto al cifrado totalmente homomórfico (FHE)

Si estás familiarizado con el concepto del cifrado totalmente homomórfico (FHE), posiblemente habrás pensado en él al leer sobre cifrado funcional. La diferencia entre ambos es crucial: el cifrado totalmente homomórfico (FHE) realiza operaciones sobre los datos cifrados y el resultado sigue estando cifrado. Para acceder al resultado de los cálculos sobre los datos cifrados se necesita descifrarlo, lo cual puede resultar un inconveniente en según qué casos de uso. La siguiente representación esquemática ayudará a visualizar la diferencia entre ambos esquemas de cifrado.

En el caso del cifrado totalmente homomórfico (FHE), la función f se calcula sobre los datos cifrados y el resultado queda cifrado:

E(m1), E(m2), …, E(mn) --> E(f(m1, m2, …, mn))

Mientras que con el cifrado funcional, el resultado queda directamente accesible tras el cálculo de f:

E(m1), E(m2), …, E(mn) --> f(m1, m2, …, mn)

Otra importante diferencia es que, en el caso de FHE, cualquiera puede realizar los cálculos sobre los datos cifrados, por lo que, dado el texto cifrado del resultado, no existen garantías de que los cálculos se hayan llevado a cabo correctamente. FHE exige el uso de protocolos de conocimiento nulo para verificar que se evaluó la función correcta. En cambio, en la criptografía funcional, solamente el poseedor de la clave de descifrado funcional puede realizar los cálculos, lo que aporta mayores garantías de corrección.

Seguridad del cifrado funcional

Existe una gran variedad de esquenas de cifrado funcional, basados en diferentes artificios matemáticos muy complejos. Por simplificar mucho, un cifrado funcional se considera seguro si un adversario no puede obtener más información sobre m que f(m). Incluso si n partes en posesión de las claves dk[f1], dk[f2], …, dk[fn], se ponen de acuerdo para atacar m en un ataque de colusión, no obtendrán más información que f1(m), f2(m), …, fn(m). El nivel de información sobre m revelado está totalmente controlado por quienquiera que genere las claves de descifrado funcional.

Criptografía de clave pública supervitaminada y supermineralizada para un futuro en la nube

El cifrado funcional es una disciplina aún muy joven, que está recibiendo un fuerte impulso investigador por sus infinitas aplicaciones en servicios en la nube y en IoT. Una aplicación especialmente interesante potenciada por el proyecto europeo FENTEC es la posibilidad de trasladar el proceso de toma de decisiones basado en datos cifrados de extremo a extremo desde los sistemas back-end a algunas pasarelas en redes complejas, lo que se llama toma de decisiones local. Poder habilitar las pasarelas para que realicen dicha toma de decisiones local es un gran paso adelante para asegurar las redes IoT y otras redes altamente descentralizadas que podrían querer implementar el cifrado de extremo a extremo, sin perder demasiadas capacidades de decisión a nivel de las pasarelas.

Si quieres probar la criptografía funcional, puedes hacerlo gracias a varias bibliotecas publicadas por los investigadores del proyecto FENTEC. Puedes ir directamente a Github y empezar a jugar con CiFEr, una implementación en C, y con GoFE, implementada en Go. Incluso puedes probarlo en tu navegador usando WASM.

El cifrado funcional representa un paso más hacia una criptografía más potente y versátil, capaz de proteger la privacidad de los usuarios en casos de uso que hasta ahora resultaban impensables con la criptografía convencional.