Generazione di molte chiavi: quanti CSPRNG usare?

1

Dire che voglio creare molte chiavi AES casuali e avere accesso a un'origine sicura di numeri casuali SecRand .

Vedo due estremi di come potrei scrivere una fabbrica di chiavi.

Utilizza la stessa fonte casuale per tutti i tasti:

KeyFactoryA {
    private r = new SecRand()

    makeKey() {
        // create a key using r
    }
}

Utilizza una nuova fonte per ogni chiave:

KeyFactoryB {
    makeKey() {
        r = new SecRand()
        // create a key using r
    }
}

Ricordo dalle lezioni di statistica (campo diverso, lo so) che il flusso aggregato di bit casuali usati in B non sarebbe necessariamente uniformemente casuale; cioè, B sarebbe statisticamente debole. Inoltre, richiede un pool più grande di entropia per inizializzare tutto il diverso r .

A , d'altra parte, può creare molte chiavi da un piccolo pool iniziale di entropia. Neanche questo sembra troppo bello.

Esistono differenze relative alla sicurezza tra le due opzioni?

    
posta Raphael 26.01.2017 - 11:52
fonte

1 risposta

3

Quello che vuoi per la tua chiave (s) deve essere completamente imprevedibile.

Ora ci sono tre casi da distinguere che dipendono realmente dalla classe / oggetto "sicuro aleatorio".

  1. Inizia con un'alta entropia e poi scende. Se la tua fonte di entropia è veramente buona, questo non dovrebbe accadere, ma se lo fai puoi usare una nuova istanza (come hai fatto in B) o istanziate ciò che i crittografi chiamano un generatore pseudo-casuale (PRG, cioè un strong codificatore di zeri che codifica zeri) usando l'input ad alta entropia e usate il flusso chiave resulding come fonte continua di materiale chiave computazionalmente imprevedibile. Nota che se usi direttamente l'output che l'output deve essere uniformemente random che significa che se usi un effetto fisico diretto o qualche RNG con campionamento gaussiano, tu davvero dovrebbe saldamente cancellare l'output del RNG e quindi inserirlo in un PRG che rimuoverà tutti i potenziali bias.
  2. Inizia male e poi aumenta di entropia nel tempo. In questo caso vuoi prendere l'entropia che guadagni nel tempo e condensare in una stringa breve altamente imprevedibile usando una funzione di hash sicura e la usa per creare un'istanza di un PRG.
  3. È sempre una buona fonte di numeri casuali uniformemente . In questo caso non importa quale approccio segui, ad esempio usando sempre l'istanza per sempre, generando molte nuove istanze o usando un PRG, tutti dovrebbero andare bene.
risposta data 26.01.2017 - 12:09
fonte

Leggi altre domande sui tag