Come sincronizzare un nonce tra due partecipanti?

1

Attualmente sto lavorando con un algoritmo simmetrico che richiede un nonce per la crittografia e logicamente anche per la decrittografia.

Tuttavia, sono un po 'confuso su come andrei a sincronizzare il nonce su entrambi i client.

Supponiamo che il mio nonce inizi a 0 e sia codificato su entrambi i lati.

Vorrei quindi crittografare i miei dati e aumentare il nonce per evitare perdite attraverso il riutilizzo. Il valore crittografato verrà inviato al mio cliente, che decrittografa i dati e aumenta anche il nonce. Ora entrambe le parti hanno un nonce di 1, pronto per il successivo ciclo di crittografia / decrittografia.

Funziona bene, a patto che non si verifichino eventi inaspettati.

Diciamo che il server ora sta crittografando con un nonce di 5. Aumenta poi il nonce a 6, ma in qualche modo la connessione fallisce e il valore non viene mai trasmesso. L'altro partecipante non riceve un aggiornamento e il suo nonce rimarrà al 5.

La prossima volta che crittografiamo qualcosa, il crittografo ora usa il nonce 6, lo aumenta e invia il valore. Il lato del decryptor tuttavia è ancora a un nonce di 5 e quindi la decifrazione fallirà.

Come faccio a uscire da questo ciclo? Come posso sincronizzare in modo sicuro i nonces, così posso evitare un errore completo se la connessione fallirà almeno una volta? È sicuro trasmettere semplicemente il nonce corrente con ogni pacchetto di dati? Ci sono altri approcci?

    
posta Sossenbinder 06.07.2017 - 14:52
fonte

1 risposta

2

La soluzione più semplice è inviare semplicemente il nonce insieme a ciascun messaggio. Non è necessario che il nonce sia segreto, e infatti, nel protocollo che si sta descrivendo, un utente malintenzionato potrebbe comunque indovinarlo. Se trasmetti solo il nonce, non c'è bisogno di sincronizzazione: tutto ciò che il server deve fare è garantire che non riutilizzerà un nonce.

Si noti che non è necessario letteralmente inviare il full nonce lungo - qualsiasi valore che è possibile inviare che può essere utilizzato per ricostruire il completo nonce lo farà. Ad esempio, se stai utilizzando un contatore per il nonce, è possibile utilizzare una codifica del contatore compatta e variabile.

Ci sono altri trucchi che potresti voler prendere in considerazione per ridurre la necessità di sincronizzazione tra i due partecipanti. Ad esempio, se la comunicazione è full duplex (vale a dire, entrambi i partecipanti alternano ruoli come mittente e destinatario), è possibile che sia necessario:

  1. Utilizza chiavi separate per ogni direzione della comunicazione: Alice utilizza la chiave n. 1 per crittografare i suoi messaggi su Bob e Bob utilizza la chiave n. 2 per crittografare i suoi messaggi ad Alice. In questo modo, se per errore usa lo stesso nonce dell'altro, non ci sono problemi a causa dell'uso di chiavi diverse.
  2. Fai in modo che le parti usino sottoinsiemi distinti dello spazio nonce. Ad esempio, il server potrebbe utilizzare solo valori contatore pari quando esegue la crittografia dei messaggi e solo i client con valori dispari.

Questi suggerimenti aggiuntivi condividono un tema con la tua domanda: affidarsi alla sincronizzazione è rischioso . Idealmente, assicurati che i partecipanti al protocollo possano agire in sicurezza anche se non conoscono lo stato delle loro controparti. O peggio ancora, vuoi che agiscano in modo sicuro anche se la loro controparte è in realtà un avversario .

    
risposta data 07.07.2017 - 02:23
fonte

Leggi altre domande sui tag