Con la modalità CTR, gli IV non devono essere imprevedibili o casuali. Tuttavia, devono essere univoci per una determinata chiave, riutilizzare una IV è un difetto fatale per la modalità CTR. Va perfettamente bene per il IV per essere solo i
(riempito alla lunghezza appropriata); va bene anche che chiami il tuo nemico mortale e chieda loro che cosa dovresti usare per il tuo messaggio, a condizione che controlli di non aver usato in precedenza la IV; finché lo controlli, non c'è nulla che possa fare per compromettere la crittografia. E dato che hai bisogno di più di "alta probabilità" - hai bisogno di certezza virtuale (per GCM, il NIST specifica una probabilità di 2^-32
che tu mai riusare la chiave e IV, e anche questo è permesso perché è accettabilmente improbabile e ti lascia andare con un po 'di casualità). Un modo decente sarebbe quello di avere i primi 32 bit univoci per la sequenza di messaggi (ad esempio, un valore contatore per la sequenza), e il prossimo 32 essere un indice del messaggio all'interno della sequenza, essendo anche un valore contatore.
Nota: si presume che il tuo IV sia solo una parte degli aspetti non crittografati per creare un keytream. Ad esempio, un modo comune per creare un keystream è concatenare un contatore a 64 bit su un IV a 64 bit; in tal caso, è sufficiente un semplice contatore per la flebo. Se la tua implementazione richiede un IV a 128 bit, probabilmente calcola il keystream come E(k,IV)||E(k,IV+1)||E(k,IV+2)||...
, nel qual caso non puoi solo incrementare il IV di una sequenza: ciò renderebbe il keytream% del messaggio 2 co_de %. Se si cripta la stessa cosa con la stessa chiave per costruire due diversi keytreams, questo è male. Con GCM, un IV tipico è di 96 bit e devi solo assicurarti di non ripetere gli IV a 96 bit per due messaggi. Il punto è che se i tuoi messaggi possono essere lunghi fino a E(k,IV+1)||E(k,IV+2)...
byte, i primi b
bit del tuo IV dovrebbero essere unici tra tutti i messaggi. 96 bit è comune, così come 64 bit.
Detto questo, c'è un problema separato: non hai autenticazione sul tuo sistema. Ciò significa che un attaccante che sa quale parte di un messaggio dice può cambiarlo per dire quello che vuole, purché tutto ciò che vogliono sia della stessa lunghezza della parte del messaggio che conoscono. CTR, come tutti i codici di flusso, è particolarmente facile da fare con. Una modalità AEAD come GCM o CCM o EAX è migliore in quasi tutti i casi: protegge i tuoi messaggi da attacchi attivi. Credo che GCM abbia gli stessi requisiti IV del CTR (vale a dire usato una volta, ma a parte questo non ci sono requisiti) e sono disponibili molte buone implementazioni. (Con GCM, gli IV sono in genere a 96 bit).