Se l'utente A e l'utente B conoscono la stessa password utilizzata per AES (senza inviarlo tramite la rete), è sufficiente aggiungere un checksum alla fine del messaggio e crittografare [ messaggio + checksum] . L'uomo nel mezzo non può decifrare il messaggio senza conoscere la chiave. Se tenta di inviare i propri dati crittografati con una chiave errata (non conosce la chiave giusta), l'utente B riceverebbe una serie di assurdità dopo aver tentato di decodificarlo con la chiave corretta e il checksum sarà ovviamente errato, il che conferma che il messaggio ha stato forgiato. D'altra parte se la chiave AES viene inviata attraverso una connessione non sicura, rende la crittografia del messaggio insignificante.
Per creare una chiave condivisa senza prima accettarla e senza farla trapelare attraverso una connessione non sicura durante lo scambio, è possibile utilizzare l'handshake Diffie-Hellman . Entrambi gli utenti creano una coppia di chiavi private e pubbliche per l'handshake di Diffie-Hellman. Le chiavi pubbliche sono firmate e inviate attraverso una connessione non protetta. Quindi viene generato un segreto condiviso (guarda l'handshake di Diffie-Hellman in wikipedie per maggiori informazioni). Fondamentalmente, anche se tutto ciò che viene inviato attraverso la connessione è visibile all'uomo nel mezzo, non sarebbe in grado di recuperare il segreto condiviso a meno che non abbia partecipato alla sua creazione. E le firme si assicureranno che non forgia l'iniziale stretta di mano.
Un altro modo per creare una connessione sicura è Firma RSA + . L'utente A crittografa il messaggio con la chiave pubblica dell'utente B e lo firma (prima o dopo la crittografia, non importa: la firma dopo la crittografia consentirebbe all'uomo nel mezzo di verificare che A sia il responsabile che non è un segreto e consentire all'utente B per eliminare il messaggio contraffatto con firma errata senza dover prima decrittografarlo). Quindi [messaggio + firma + somma di controllo] viene inviato all'utente B. Il checksum deve essere aggiunto prima della crittografia. L'utente B verifica la firma, decrittografa il messaggio e verifica il checksum.
Da quello che hai detto, oserei dire che hai un malinteso su come funziona la firma. La firma non cambia il messaggio. Crea un ulteriore blocco di dati (la firma). Quindi invii messaggio + firma all'utente B. L'utente B combina la tua chiave pubblica, il messaggio stesso e la firma da verificare.