Actualmente estoy trabajando con un algoritmo simétrico que requiere un nonce para el cifrado, y lógicamente también para el descifrado.
Sin embargo, estoy un poco confundido acerca de cómo iría y sincronizaría el nonce en ambos clientes.
Digamos que mi nonce comienza en 0 y está codificado en ambos lados.
Luego cifraría mis datos y aumentaría el número para evitar fugas a través de la reutilización. El valor cifrado se enviará a mi cliente, el cual descifra los datos y también aumenta el valor. Ahora ambas partes tienen un nonce de 1, listo para el próximo ciclo de cifrado / descifrado.
Esto funciona bien, siempre y cuando no ocurran cosas inesperadas.
Digamos que el servidor ahora está encriptando con un nonce de 5. Aumenta el nonce a 6 después, pero de alguna manera la conexión falló y el valor nunca se transmite. El otro participante no recibe una actualización y su nonce se quedará en 5.
La próxima vez que cifremos algo, el encriptador ahora usa el nonce 6, lo aumenta y envía el valor. Sin embargo, el lado del descifrador todavía está en una posición de 5 y, por lo tanto, el descifrado fallará.
¿Cómo salgo de este ciclo? ¿Cómo puedo sincronizar de forma segura los nonces para evitar un fallo completo si la conexión falla al menos una vez? ¿Es seguro simplemente transmitir el nonce actual con cada paquete de datos? ¿Hay otros enfoques?