Esta es una suposición aleatoria ya que no soy un experto ...
Para responder a la pregunta del título, "¿Cuál es el motivo de la falta en el modo CTR?", diría que es hacer que el protocolo sea sin estado . Lo que significa que ambos lados no necesitan almacenar ninguna información para cifrar / descifrar múltiples ejecuciones, excepto la clave.
Para entender la declaración anterior, veamos el cifrado de bloque y algunos protocolos como SSL.
Un cifrado de bloque es como una función con dos argumentos, clave y entrada. Si proporciona los mismos dos argumentos (clave + entrada) dos veces, siempre producirá la misma salida.
En SSL, genera una clave simétrica al principio que utilizará para cifrar / descifrar muchos mensajes diferentes. Por lo tanto, uno de sus argumentos en el cifrado de bloque ya está arreglado para toda la conversión. Esto significa que nunca debe repetir el segundo o producirá la misma salida del cifrado de bloque dos veces.
¿Por qué es malo producir el mismo resultado del cifrado de bloque dos veces?
Es malo porque te hace vulnerable a los ataques de repetición. Si está bien generar el mismo resultado del cifrado de bloque dos veces, significa que está permitido que un atacante vuelva a enviar uno de sus mensajes antiguos durante la conversación y el servidor lo aceptará con gusto.
Entonces, ¿es por eso que necesitamos un nonce?
Sí y no.
Si ha corregido el error, está bien siempre y cuando nunca reutilice la misma clave con el mismo contador durante toda la conversación, lo que puede incluir muchos mensajes. Por lo tanto, tanto el cliente como el servidor necesitan saber el último valor del contador, por lo tanto, necesitarían mantener un estado.
Al utilizar un nonce, asumimos que nunca tendremos la misma entrada que está formada por la combinación del nonce y el contador. Por lo tanto, no necesitamos mantener ningún estado.