Generatori di numeri casuali che utilizzano un pin GPIO?


22

Ho appena letto la domanda sul generatore di numeri casuali AVR e ho incontrato diversi modi per generare semi casuali in un AVR:

  • Utilizzare un "AVR sicuro" per scopi speciali
  • Utilizzare un sensore di temperatura interno
  • Leggi EEPROM non scritta
  • Misurare gli intervalli di tempo tra l'input dell'utente
  • Utilizzare un pin ADC mobile.

Perché non un solo pin digitale, configurato come input senza pull-up e mobile? In teoria ciò dovrebbe generare un flusso di bit casuali. Perché non usarlo? Lo stato sta cambiando troppo lentamente? Tende a rimanere a 1 o 0? Altri problemi?


1
Secure AVR è morto AFAIK
vicatcu il

1
La eeprom non scritta non è sempre 0xFF?
vsz

@vsz, forse se ci scrivi qualcosa e dimentichi ciò che hai scritto, adesso è "casuale". lol.
Vorac,

Risposte:


5

"Casuale" è una parola complicata. In alcuni contesti, significa semplicemente "imprevedibile", ma in altri contesti - in particolare quelli associati all'elaborazione del segnale e alla crittografia - significa "statisticamente non correlato".

Anche se il valore letto da un perno mobile è imprevedibile ("casuale" nel primo senso), non è probabile che sia utile nel secondo senso.


15

La differenza evidente tra l'uso di un ingresso digitale e uno analogico è che esiste un intervallo maggiore di valori seed in analogico.

In secondo luogo, ma forse più cruciale: se il valore "mediano" mobile del pin digitale non è esattamente a metà strada tra i livelli di senso logico (che non sono i livelli di alimentazione e di terra, ma le soglie di commutazione per i circuiti di ingresso) il flusso di bit risultante avrà un una forte inclinazione verso 1 o 0. Questa inclinazione inclina i semi molto più fortemente di una inclinazione nei livelli analogici.

Ci vorrebbe pochissimo accoppiamento, da tracce o segnali vicini, o attraverso un pull-up / pull-down resistivo, progettato o accidentale, per spingere un pin digitale "fluttuante" a galla - e ciò potrebbe accadere anche dopo- distribuzione. Nella progettazione di qualsiasi progetto, è meglio evitare questa forma di modalità di errore.


14

Un input mobile non è definito. Potrebbe darti bit casuali, ma potrebbe anche rimanere bloccato a 0 o 1. Il più delle volte rimarrà bloccato. E quando è veramente fluttuante, potrebbe causare un aumento del rumore del sistema e del consumo energetico. Gli input fluttuanti sono generalmente una cosa negativa, anche quando gli input non vengono utilizzati per nulla.


Non solo si incastrarsi a 0 o 1 parte del tempo, ma a meno che i due transistori che costituiscono il primo stadio del buffer di ingresso sono PERFETTAMENTE bilanciato, o v'è una certa sorgente di corrente esterna in modo o nell'altro, l'ingresso sarà galleggiare fino a 1 o infine a 0.
wjl

9

La soluzione più semplice è quella di costruire un circuito generatore di segnali casuali hardware da un circuito a transistor a collettore aperto usato in modo improprio. Utilizzare l'uscita bit-stream per un ingresso sul microcontrollore. Campionare i bit in entrata a intervalli. Per garantire un numero approssimativamente pari di 1 e 0, utilizzare semplicemente il cambio di stato come 1 e nessun cambiamento come zero. Google per generatore di rumore a transistor per ulteriori informazioni.


Interessante. Che aspetto ha un "circuito transistor a collettore aperto usato in modo improprio"?
Stephen Collings,

7
@Remiel: polarizzi al contrario la giunzione emettitore di base di un transistor e si comporta come uno zener davvero schifoso. Prendi lo zener molto rumoroso e amplifichi il rumore per ottenere bitstream casuale. Vedi robseward.com/misc/RNG2
Connor Wolf

3

Un generatore casuale disponibile in molti microcontrollori è l'errore tra due sorgenti di clock (forse una interna e un'altra esterna). Quando li confronti, si spostano leggermente a causa del rumore e possono essere utilizzati.

Alla fine dipende da cosa ti serve? Un po 'di randomizzazione e puoi persino usare un pin ADC collegato a nulla. O semplicemente usa un algoritmo come

Mersenne twister http://it.wikipedia.org/wiki/Mersenne_twister

Nessuno se questo è crittograficamente sicuro, ma abbastanza buono per la maggior parte degli scopi.


questo è l'approccio adottato nella nota sull'app msp430 nella domanda precedente citata, per quanto ne so il sistema di clock AVR non supporta questa tecnica
vicatcu

Corretta. Dovrebbe essere comunque possibile farlo con la stessa sorgente di clock, anche se non è supportato direttamente.
Gustavo Litovsky,

3

La qualità di un seme casuale e del suo algoritmo è determinata dalla quantità di entropia o incertezza in ciascun bit casuale. Quindi il miglior generatore di un seme usa un'entropia elevata con pochissimi passaggi anziché molti passaggi di bassa entropia.

Un buon esempio di elevata entropia utilizza il metodo dei quadrati latini per un seme casuale.

L'ingresso flottante è facilmente distorto da difetti, perdite o rumore in ingresso.


0

In un microprocessore PIC18F è necessario disporre di un seme per il numero casuale. Il seme può essere compreso tra 0 e 32767 (15 bit). Vorrei suggerire all'inizio del programma di creare uno dei pin e il pin di ingresso analogico. Leggi questo pin e prendi il bit meno significativo e inseriscilo in una variabile a 16 bit. Quindi spostare la variabile a sinistra di 1. Leggere nuovamente il pin e inserire l'LSB del risultato ADC nel primo bit della variabile in cui è stato memorizzato l'ultimo bit. Spostare di nuovo a sinistra .....

Ripeti fino a quando non hai 15 bit nella tua variabile. Questo è il numero che devi inserire nel tuo seme.

Dopo aver fatto ciò, è possibile semplicemente rendere il pin di ingresso analogico un pin di ingresso digitale e abilitare un pull up debole su di esso, oppure renderlo un pin di uscita digitale. Uno dei due impedirà a questo pin di fluttuare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.