Si el usuario A y el usuario B conocen la misma contraseña utilizada para AES (sin enviarla a través de la red), es suficiente agregar una suma de comprobación al final del mensaje y cifrar [ mensaje + suma de comprobación] . El hombre en el medio no puede descifrar el mensaje sin conocer la clave. Si intenta enviar sus propios datos encriptados con una clave incorrecta (no conoce la clave correcta), el usuario B recibirá un montón de tonterías después de intentar descifrarlos con la clave adecuada y la suma de comprobación obviamente será incorrecta, lo que confirma que el mensaje tiene se ha forjado Por otro lado, si la clave AES se envía a través de una conexión no segura, el cifrado del mensaje no tiene sentido.
Para crear una clave compartida sin acordar de antemano y sin que se pierda la conexión insegura durante el intercambio, se puede utilizar el protocolo de enlace Diffie-Hellman . Ambos usuarios crean un par de claves privadas y públicas para el saludo de Diffie-Hellman. Las claves públicas se firman y envían a través de una conexión no segura. Luego se genera un secreto compartido (busque el saludo de Diffie-Hellman en wikipedie para obtener más información). Básicamente, incluso si todo lo que se envía a través de la conexión es visible para el hombre en el medio, no podrá recuperar el secreto compartido a menos que haya participado en su creación. Y las firmas se asegurarán de que no falsifique el saludo inicial.
Otra forma de crear una conexión segura es firma RSA + . El usuario A encripta el mensaje con la clave pública del usuario B y lo firma (antes o después del cifrado, no importa. Firmar después del cifrado permitiría a la persona en el medio verificar que A es el aughtor, que no es un secreto y permite al usuario B) para eliminar el mensaje falsificado con una firma incorrecta sin tener que descifrarlo primero). Luego se envía [mensaje + firma + suma de comprobación] al usuario B. La suma de comprobación debe agregarse antes de cifrar. El usuario B verifica la firma, descifra el mensaje y verifica la suma de comprobación.
Por lo que dijiste, me atrevería a dar a entender que tienes un malentendido de cómo funciona la firma. La firma no cambia el mensaje. Crea un bloque adicional de datos (la firma). Luego envía mensaje + firma al usuario B. El usuario B combina su clave pública, el mensaje en sí y la firma para verificar.