Tenga en cuenta que esta pregunta describe un caso hipotético, que nunca debe utilizarse en el mundo real.
El servidor se comunica con los clientes con la estructura del mensaje: client_id, initialization_vector, encriptado. Cada cliente cada día intercambia con el servidor mensajes de 1-5KB promedio 100 veces. Los mensajes "de vez en cuando" pueden filtrarse debido a la red insegura (por ejemplo, la falsificación de DNS).
Las claves generadas se distribuyen de forma segura a los clientes por otro sistema. Cuando una clave se ve comprometida, el cliente puede emitir otra, pero actualmente la clave no tiene tiempo de caducidad (incluso después de algunos años). Quiero evitar mezclar RSA y otras cosas asimétricas para mantener esto simple. El protocolo de mensajes puede cambiar en el futuro, pero la clave emitida previamente se utilizará para un cifrado más sólido sin necesidad de volver a emitirlo.
¿Este tipo de sistema es seguro cuando se usa con, por ejemplo, relleno AES / CBC +? ¿Puedo seguir adelante con este enfoque básico durante años?
Edición 1:
Message initialization_vector es aleatorio (AES / CBC) en cada mensaje y encrypted_body tiene controles de integridad internos (encriptados con cuerpo) (MAC y resumen). ¿Qué lo hace inseguro a pesar de eso? ¿La opción de comprometer el cifrado AES con el tiempo es realmente viable en ese caso?
Edición 2:
Aquí hay un pseudocódigo de cifrado de mensajes. Cuando el mensaje MAC no es válido, la respuesta de error no se cifra (para evitar un ataque activo). El sistema eliminará los mensajes antiguos cuando la marca de tiempo sea anterior a T (para evitar un ataque de respuesta).
init_vector := secure_random (); // for AES/CBC or increment init_vector for AES/CTR
mac = hash (client_id + timestamp + init_vector + text); // MD5 or SHA-1
body = encrypt (mac + text); // AES/CBC
message = client_id + timestamp + init_vector + body;