2009-11-23 5 views
14

Sono sicuro che non c'è una risposta a questa domanda, ma solo cercando di trovare un approccio generale.Come si genera un vettore di inizializzazione?

Utilizzando Java 1.4.2, ho bisogno di generare una chiave e IV per l'utilizzo in un algoritmo simmetrico. Questi valori saranno pre-condivisi con il destinatario attraverso un canale sicuro.

La chiave che posso generare con KeyGenerator.keyGenerate(). Ma a meno che non mi manchi, non c'è alcuna funzione per generare un IV casuale.

Devo fare qualcosa di completamente arbitrario come tirare 16 byte casuali dalla memoria? O c'è un modo preferito di generare vettori di inizializzazione sufficientemente casuali?

Qualsiasi consiglio apprezzato.

risposta

7

Per alcune implementazioni, la classe SecureRandom vi aiuterà fuori producendo numeri vera casuali:

Molte implementazioni SecureRandom sono sotto forma di un generatore di numeri pseudo-casuali (PRNG), il che significa che utilizzare un algoritmo deterministico per produrre una sequenza pseudo-casuale da un seme casuale vero . Altre implementazioni possono produrre numeri casuali veri e ancora altri possono utilizzare una combinazione di entrambe le tecniche .

Ha due metodi, getProvider() e getAlgorithm() che dovrebbero dare alcune informazioni su cui viene utilizzato attuazione. Da this page sembra che il generatore pseudo-casuale SHA1PRNG (che è seminato con dati casuali veri) sia uno di essi o addirittura l'unico attualmente disponibile.

+1

@schnaader - nit-pick - SHA1PRNG non è un vero RNG. È un PRNG con (in base alla pagina a cui sei collegato) un vero seme casuale. –

+0

Hai ragione, hai modificato la risposta. – schnaader

13

Dipende dalla modalità in cui si utilizza il codice. Se si utilizza CBC, i byte da SecureRandom sono i più semplici e probabilmente i più sicuri e dannosi, a condizione che l'RNG sia buono.

La maggior parte dei provider Java genererà automaticamente i parametri richiesti, ma per poter capire cosa è stato scelto, è necessario comprendere il codice e la modalità. Ad esempio, se si utilizza una modalità che richiede un IV, si farebbe qualcosa di simile:

cipher.init(Cipher.ENCRYPT_MODE, secret); 
IvParameterSpec spec = 
    cipher.getParameters().getParameterSpec(IvParameterSpec.class); 
byte[] iv = spec.getIV(); 

Questo permette al fornitore di scegliere un metodo adeguato per la generazione del IV stesso. Ma se dovessi usare lo stesso metodo su cipher usando la modalità ECB, fallirebbe.

L'utilizzo di una modalità contatore richiede ovviamente grande attenzione per evitare il riutilizzo del contatore.

6

Come suggerito dalle altre risposte, utilizzare un generatore di numeri casuali sicuro per creare l'IV.

Proprio come una parte, però, non è necessario inviare l'IV attraverso un canale sicuro: è normale aggiungerlo semplicemente al messaggio. Ricorda che è lontano più importante che tu usi una IV fresca per ogni messaggio, piuttosto che mantenere gli IV segreti. La pre-condivisione degli IV contemporaneamente alla chiave implica che stai riusando IV (male) o hai un limite al numero di messaggi che puoi inviare.

1

Se si utilizza la GUI o si ha accesso alle chiamate di sistema all'hardware di immissione dati utente (mouse preferito) è possibile creare un vettore di coppie di coordinate del puntatore del mouse mentre l'utente lo sposta. Aggiungili ad una stringa. Utilizzare la funzione hash preferita sulla stringa per creare un IV completamente casuale con un'alta entropia.