Un buen primer paso sería introducir algo similar a una clave de sesión y luego usar un cifrado de bloque para cifrar la carga útil real.
El cifrado funcionaría así:
- Genere una contraseña aleatoria que debería ser más o menos globalmente única y nunca debe ser reutilizada. Si necesita editar el archivo cifrado y volver a cifrar, genere una nueva clave.
- Cifre esa frase de contraseña generada con ED 25519 y almacene la salida al principio del archivo junto con otros metadatos (es decir, el IV para su cifrado de bloque, etc.).
- Firme su contraseña cifrada con ED 25519, para que nunca descifre algo que no fue generado por usted. Guarde esto junto a la clave AES cifrada en el paso anterior.
- Usando su contraseña aleatoria para su cifrado de bloque, cifre la carga útil utilizando algo con autenticación como AES en modo GCM, o AES en modo CBC con un HMAC.
- Al final del archivo, genere una firma del texto cifrado que demuestre que usted, el titular de la clave privada, garantiza su integridad.
Esto te da muchos beneficios. Primero, ahora está utilizando un cifrado de bloque estándar para su carga útil, y AES (en los modos correctos de operación) no es vulnerable a los ataques de texto plano conocidos. Segundo, ahora que está usando un cifrado de bloque estándar, el cifrado y el descifrado serán operaciones mucho más rápidas en el tiempo de CPU. En tercer lugar, el uso de un modo de cifrado de bloque que tiene autenticación le da integridad, y al firmar el texto cifrado, usted afirma que no solo no se ha alterado el mensaje, sino que fue usted quien lo creó.
El paso 5 anterior puede no ser necesario, ya que su firma en el paso 3 debería ser lo suficientemente buena combinada con un cifrado de bloque autenticado como AES en modo GCM o CBC con HMAC.
El descifrado se ve así:
- Descifre su contraseña aleatoria usando ED 25519 y verifique su firma. Si todo se ve bien, proceda, si no, falle.
- Use su frase de contraseña desencriptada para descifrar el texto cifrado usando su cifrado de bloque. Su cifrado de bloque debe proporcionar soporte de integridad (GCM o CBC + HMAC) y debe fallar si se modificó algo.
- Al mismo tiempo que descifra cada bloque, canalice el texto cifrado original a través del método de verificación de firma ED 25519 para que no tenga que volver a escanear la carga útil completa una vez que haya terminado.
- Una vez que haya terminado de descifrar el texto cifrado, valide que la firma (generada en el paso 5 anterior) sea válida.
Esto debería proporcionar un sistema de cifrado bastante robusto.
Como ahora veo que está buscando principalmente la autenticación de mensajes, he ideado otra solución que simplemente hace eso.
Generando códigos de autenticación de mensaje:
- Genere una clave aleatoria para usar con su HMAC.
- Cifre y firme esa clave y péguela al frente de cada mensaje.
- Ejecute su HMAC en todo el texto plano.
- Agregue la salida del HMAC al final.
Validación de códigos de autenticación de mensajes:
- Descifre y valide la clave HMAC al principio del mensaje.
- Genere un HMAC sobre el texto sin formato como se indicó anteriormente.
- Compare la salida de su HMAC con la HMAC almacenada al final del mensaje.
Siempre que utilice una buena función hash para su HMAC (es decir, SHA-256), esta debería ser una solución bastante buena. Elimina de forma efectiva su preocupación por los ataques de texto sin formato conocidos para ED 25519 (no es que existan, necesariamente), y en general será una solución mucho más rápida en rendimiento que hacer firmas de forma nativa en ED 25519.