Posso generare una chiave casuale a 32 bit utilizzando l'hash Java e le parole inglesi casuali?

4

Voglio generare e comunicare una chiave a 32 bit a Bob durante una conversazione telefonica. So che a lui capita di avere lo stesso Java e il mio SO installati come me.

Supponiamo di avere un dizionario di 100.000 parole (in inglese). Posso scegliere a caso due parole in modo uniforme, concatenarle e quindi eseguire hashCode(word1 + word2) senza perdita di entropia in modo che possa facilmente generare lo stesso codice?

Come domanda di follow-up, posso quindi, se voglio una chiave a 64 bit, semplicemente selezionare quattro parole e concatenare i tasti hashCode(word1 + word2) con hashCode(word3 + word4) ecc.?

Modifica: Ps: 100.000 2 > 2 32 se la matematica è giusta.

    
posta Pål GD 08.03.2016 - 21:23
fonte

1 risposta

5

In breve: non funzionerà bene.

In parole più lunghe: il metodo String.hashCode() di Java ha bias; funziona moltiplicando ripetutamente uno stato di esecuzione per 31, quindi aggiungendo il valore numerico del prossimo carattere. L'uso delle lettere in inglese è parziale, i gruppi di lettere sono di parte e questi verranno visualizzati. In altre parole, perdi un po 'di entropia.

Probabilmente, passare attraverso un elenco di parole è una cosa molto strana da fare. Per scegliere una parola a caso in un elenco di 100000 parole, devi avere un modo per uniforme ottenere un numero nell'intervallo da 0 a 99999. Perché, oh perché, non useresti direttamente quel valore? Perché trasformare i numeri in parole, quindi sperare che il metodo hashCode() li restituisca ai numeri senza perdere troppa entropia nel processo, invece di utilizzare i numeri direttamente?

Se è possibile generare un numero intero uniforme nell'intervallo 0..65535, allora ... questo è tutto. Hai un numero intero casuale a 16 bit perfettamente preciso. Genera due di essi, sposta uno di essi di 16 bit, combinalo con OR bit a bit (o con un'aggiunta) e il gioco è fatto.

Inoltre , una chiave a 32 bit è atrocemente debole, per sua natura, dal momento che può avere solo 2 32 valori possibili, la cui esaustiva enumerazione è un pezzo di torta per un PC non così potente. Queste bestie contano il tempo in gigahertz.

    
risposta data 08.03.2016 - 21:34
fonte

Leggi altre domande sui tag