È possibile prevedere Python's random.random () se è costantemente seminato con valori di entropia elevati?

1

Sono interessato a capire se è possibile prevedere Python 3% dirandom.random() quando seminato con un alto valore di entropia da un sistema fisico, come un lancio di dadi.

In altre parole, random.random() è una buona funzione che prende "entropia" e la riduce a un valore limite deterministico imprevedibile o no?

Da quanto ho capito, passa tutti i test di casualità che ho trovato.

Non mi interessa la buona pratica e che è meglio usare /dev/urandom , segreti o altre fonti di buoni valori casuali. Questo è un fatto noto.

Cose da considerare:

  • Il generatore casuale è seminato con un valore di entropia elevato e usato una sola volta per generare un singolo valore dallo stato iniziale prima di essere seminato di nuovo.
  • Il generatore è seminato con nuovi semi per ogni numero.
  • Il seme ha un'alta entropia, qualcosa attorno a 256 bit o entropia o più.

La ragione per cui voglio farlo è che mi permette di usare random.choise che è un modo estremamente conveniente per trasformare un seme in una scelta. Ecco una implementazione approssimativa dell'idea:

  1. random.random è seminato con un seme ad alta entropia.
  2. random.choice è usato.
  3. random.random è seminato con un nuovo seme ad alta entropia.
  4. random.choice è usato.
  5. ... ancora e ancora.

L'elenco delle scelte risultante è prevedibile?

    
posta PyWebDesign 12.12.2017 - 15:26
fonte

2 risposte

3

Se lo hai ridisegnato dopo ogni volta che disegni un numero, sarà sicuro come qualsiasi altro con cui lo hai riseminato. Pensalo in questo modo. La tua origine seme genera una serie di numeri x i . Esegui questi attraverso il generatore di numeri casuali Python, generando essentiamente una nuova serie di numeri f (x i ) . Dato che f non analizza la distribuzione (e un generatore di numeri casuali non dovrebbe), avrai appena applicato una trasformazione piuttosto inutile.

Questo non significa che quello che stai facendo è una buona idea. Mi sembra un brutto scherzo. Gli hack brutti introducono complessità che possono portare a errori che possono portare a vulnerabilità. Se fossi in te, scriverei il mio metodo securePick e usarlo. Non dovrebbe richiedere molte righe di codice.

    
risposta data 12.12.2017 - 17:20
fonte
2

È possibile prevedere i numeri random.random () di python? Se hai accesso alla macchina, è deterministico e assolutamente possibile. Questo è vero per tutti i generatori di numeri pseudo casuali.

Puoi prevedere il prossimo numero in base ai numeri precedenti. In teoria, qualsiasi generatore di numeri pseudo casuali può essere scoperto dall'esterno, anche se in pratica un potente generatore di numeri pseudo casuali impiega un tempo molto poco pratico.

Anche se riavviato ogni volta che viene usato, se il modo in cui è resettato non è veramente casuale, allora è ancora un generatore di numeri pseudo e tutte le dichiarazioni di cui sopra sono ancora vere.

Se è seminato con un vero numero casuale, dovresti usare il generatore di numeri casuali reale ed evitare il generatore di pseudonimi tutti insieme.

Se hai passato dei veri numeri casuali per seminare il generatore di numeri casuali, il risultato sarebbe casuale? Questa è una domanda interessante. Dipenderà dall'implementazione. Se l'implementazione fosse solo usare il seme come numero casuale, e il seme era un numero casuale reale che è stato costantemente riseminato, allora sì, sarebbe casuale. Nella maggior parte dei casi, suppongo, passare un vero numero casuale in un generatore di numeri pseudo casuali renderebbe il numero pseudo casuale. Questa è la mia ipotesi, almeno, quella particolare domanda sarebbe più ideale per esperti di crittografia piuttosto che esperti di sicurezza. È una domanda interessante, ma ancora una volta, non pratico in alcun modo a cui potrei pensare.

Non posso parlare troppo di come strong python random.random() è, ma la documentazione di python per random afferma:

The pseudo-random generators of this module should not be used for security purposes. Use os.urandom() or SystemRandom if you require a cryptographically secure pseudo-random number generator.

La risposta breve è sì, è possibile. random.random() appare in modo specifico che è usato per casualità, non per sicurezza, quindi usalo di conseguenza.

    
risposta data 12.12.2017 - 16:07
fonte

Leggi altre domande sui tag