Estoy diseñando un servidor que acepta mensajes anónimos usando ECIES: al igual que en, los usuarios anónimos envían al servidor una clave pública EC efímera, y el servidor usa ECDH para derivar un secreto compartido, y algunos KDF para obtener una clave simétrica compartida para descifrar el mensaje real. El problema es que ECDH, que se encuentra entre el intercambio de claves más rápido disponible, es realmente lento. A partir de algunas pruebas rápidas, mi computadora solo puede manejar aproximadamente 3000 intercambios de teclas por segundo.
Un atacante podría estar constantemente calculando intercambios de claves y enviándolos al servidor. No estoy muy preocupado por esto si el atacante realmente ha hecho los intercambios de claves. Al menos de esa manera, el atacante estará haciendo tanto trabajo (un poco más con ECDH) como el servidor. El problema es que un atacante puede enviar una clave de basura y hacer que el servidor realice un gran trabajo para realizar el intercambio de claves en la basura. Mi primera pregunta es que, en una implementación razonable como OpenSSL, ¿el intercambio de claves volverá rápidamente con un error o tardará mucho tiempo en realizar cálculos inútiles?
Suponiendo que lo anterior sea fijo, hay dos problemas más: un atacante podría usar la misma clave efímera una y otra vez, manteniendo el secreto compartido pero haciendo que el servidor realice el intercambio de claves repetidamente; y un atacante podría calcular de antemano muchas claves efímeras y enviarlas todas a la vez.
Un intento de una solución a ambos problemas es que el servidor mantenga su propio par de claves efímero que cambia cada ~ 10 minutos. Puede publicar su clave pública efímera firmada con su clave privada permanente. Entonces no sería irrazonable que el servidor recuerde las claves y los secretos correspondientes recibidos durante este período. Sin embargo, esto realmente no resuelve el ataque de precomputación porque las claves EC generadas correctamente seguirán funcionando con un intercambio de claves, solo producirían datos de basura. ¿Existe alguna forma rápida para que un servidor sepa que una clave determinada descifra el mensaje?
Lo siento por el largo post, y gracias de antemano por cualquier comentario.