¿Cómo sincronizar un nonce entre dos participantes?

1

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?

    
pregunta Sossenbinder 06.07.2017 - 14:52
fuente

1 respuesta

2

La solución más sencilla es simplemente enviar la notificación junto con cada mensaje. No hay ningún requisito de que el nonce sea secreto, y de hecho, en el protocolo que está describiendo, un atacante probablemente podría adivinar los nonces de todos modos. Si solo transmite el nonce, no hay necesidad de sincronización, todo lo que el servidor debe hacer es garantizar que no reutilizará un nonce.

Tenga en cuenta que no es necesario que literalmente envíe el nonce completo; cualquier valor que pueda enviar que pueda usarse para reconstruir el nonce completo servirá. Por ejemplo, si está usando un contador para el nonce, está bien usar una codificación compacta de longitud variable del contador.

Es posible que desee considerar otros trucos para reducir la necesidad de sincronización entre los dos participantes. Por ejemplo, si la comunicación es dúplex completo (es decir, ambos participantes alternan roles como remitente y destinatario), es posible que desee:

  1. Use claves separadas para cada dirección de la comunicación: Alice usa la clave # 1 para cifrar sus mensajes a Bob, y Bob usa la clave # 2 para cifrar sus mensajes a Alice. De esa manera, si cualquiera de los dos utiliza el mismo nombre que el otro, no hay ningún problema debido al uso de claves diferentes.
  2. Haga que las partes utilicen subconjuntos distintos del espacio nonce. Por ejemplo, el servidor puede usar solo valores de contador pares cuando encripta los mensajes, y solo los impares del cliente.

Estas sugerencias adicionales comparten un tema con su pregunta: confiar en la sincronización es arriesgado . Lo ideal es que desee asegurarse de que los participantes en el protocolo puedan actuar de manera segura incluso si no conocen el estado de sus contrapartes. O incluso peor, quieres que actúen de manera segura incluso si su contraparte es de hecho un adversario .

    
respondido por el Luis Casillas 07.07.2017 - 02:23
fuente

Lea otras preguntas en las etiquetas