Générateurs de nombres aléatoires utilisant une broche GPIO?

22

Je viens de lire la question AVR Random Number Generator et j'ai rencontré un certain nombre de façons de générer des graines aléatoires dans un AVR:

  • Utilisez un "AVR sécurisé" spécial
  • Utilisez un capteur de température interne
  • Lire l'EEPROM non écrite
  • Mesurer les intervalles de temps entre l'entrée utilisateur
  • Utilisez une broche ADC flottante.

Pourquoi pas juste une seule broche numérique, configurée en entrée sans pull-up et flottante? En théorie, cela devrait générer un flux de bits aléatoires. Pourquoi ne pas l'utiliser? L'État change-t-il trop lentement? A-t-il tendance à rester bloqué à 1 ou 0? D'autres problèmes?

Vorac
la source
1
AVR sécurisé est mort AFAIK
vicatcu
1
Le eeprom non écrit n'est-il pas toujours 0xFF?
vsz
@vsz, peut-être que si vous y écrivez quelque chose et oubliez ce que vous avez écrit, c'est "aléatoire" maintenant. lol.
Vorac

Réponses:

5

"Aléatoire" est un mot délicat. Dans certains contextes, cela signifie simplement «imprévisible», mais dans d'autres contextes - en particulier ceux associés au traitement du signal et à la cryptographie - cela signifie «statistiquement non corrélé».

Même si la valeur lue à partir d'une broche flottante est imprévisible ("aléatoire" dans le premier sens), il est peu probable qu'elle soit utile dans le second sens.

Dave Tweed
la source
15

La différence évidente entre l'utilisation d'une entrée numérique et d'une entrée analogique est qu'il existe une plus grande plage de valeurs de départ possible en analogique.

Deuxièmement, mais peut-être plus crucial: si la valeur "médiane" flottante de la broche numérique n'est pas précisément à mi-chemin entre les niveaux de détection logique (qui ne sont pas les niveaux de puissance et de rail de masse, mais les seuils de commutation pour les circuits d'entrée), le flux binaire résultant aura un un fort biais vers 1 ou 0. Ce biais biaise les graines beaucoup plus fortement qu'un biais dans les niveaux analogiques.

Il faudrait très peu de couplage, soit à partir de traces ou de signaux à proximité, soit par le biais d'un pull-up / pull-down résistif, qu'il soit conçu ou accidentel, pour pousser une broche numérique "flottante" à flotter - et cela pourrait aussi se produire après déploiement. Dans l'ingénierie de toute conception, il est préférable d'éviter cette forme de mode de défaillance.

Anindo Ghosh
la source
14

Une entrée flottante n'est pas définie. Il pourrait vous donner des bits aléatoires, mais il pourrait également avoir tendance à rester bloqué à 0 ou 1. La plupart du temps, il restera bloqué. Et quand il est vraiment flottant, il peut entraîner une augmentation du bruit du système et de la consommation d'énergie. Les entrées flottantes sont généralement une mauvaise chose, même lorsque les entrées ne sont utilisées pour rien.


la source
Se il se coincer non seulement à 0 ou 1 partie du temps, mais à moins que les deux transistors qui composent la première étape de la mémoire tampon sont entrée PARFAITEMENT équilibré, ou il y a une source de courant externe sur le chemin ou d'une autre, l'entrée sera flotter jusqu'à un 1 ou jusqu'à un 0 éventuellement.
wjl
9

La solution la plus simple consiste à construire un circuit générateur de signal aléatoire matériel à partir d'un circuit transistor à collecteur ouvert mal utilisé. Utilisez la sortie du flux binaire vers une entrée du microcontrôleur. Échantillonnez les bits entrants à intervalles. Pour garantir un nombre à peu près pair de 1 et de 0, utilisez simplement le changement d'état comme 1 et aucun changement comme zéro. Google pour le générateur de bruit de transistor pour plus d'informations.

chris
la source
Intéressant. À quoi ressemble un "circuit transistor à collecteur ouvert mal utilisé"?
Stephen Collings le
7
@Remiel - Vous inversez la jonction base-émetteur d'un transistor, et il agit comme un zener vraiment merdique. Vous prenez le zener très bruyant et vous amplifiez le bruit pour obtenir un train de bits aléatoire. Voir robseward.com/misc/RNG2
Connor Wolf
3

Un générateur aléatoire qui est disponible dans de nombreux microcontrôleurs est l'erreur entre deux sources d'horloge (peut-être une interne et une autre externe). Lorsque vous les comparez, ils dérivent légèrement à cause du bruit et peuvent être utilisés.

En fin de compte, cela dépend de ce dont vous avez besoin? Un peu de randomisation et vous pouvez même utiliser une broche ADC connectée à rien. Ou utilisez simplement un algorithme comme

Twister de Mersenne http://en.wikipedia.org/wiki/Mersenne_twister

Aucun si c'est cryptographiquement sécurisé, mais assez bon pour la plupart des utilisations.

Gustavo Litovsky
la source
c'est l'approche adoptée dans la note de l'application msp430 dans la question précédente référencée, à ma connaissance le système d'horloge AVR ne prend pas en charge cette technique
vicatcu
Correct. Il devrait toujours être possible de le faire avec la même source d'horloge, même si elle n'est pas directement prise en charge.
Gustavo Litovsky
3

La qualité d'une graine aléatoire et de son algorithme est déterminée par la quantité d'entropie ou d'incertitude dans chaque bit aléatoire. Ensuite, le meilleur générateur d'une graine utilise une entropie élevée avec très peu d'étapes plutôt que de nombreuses étapes d'entropie faible.

Un bon exemple d'entropie élevée utilise la méthode des carrés latins pour une graine aléatoire.

L'entrée flottante est facilement biaisée par des défauts, des fuites ou des bruits d'entrée.

Tony Stewart Sunnyskyguy EE75
la source
0

Dans un microprocesseur PIC18F, vous devez avoir une valeur de départ pour le nombre aléatoire. La valeur de départ peut être comprise entre 0 et 32 ​​767 (15 bits). Je suggérerais au début du programme que vous fassiez l'une des broches et une broche d'entrée analogique. Lisez cette broche et prenez le bit le moins significatif et mettez-le dans une variable de 16 bits. Décalez ensuite la variable vers la gauche de 1. Relisez la broche et placez le LSB du résultat ADC dans le premier bit de la variable dans laquelle vous avez stocké le dernier bit. Décalez de nouveau vers la gauche .....

Répétez cette opération jusqu'à ce que vous ayez 15 bits dans votre variable. C'est le nombre que vous devez mettre dans votre graine.

Après avoir fait cela, vous pouvez simplement faire de la broche d'entrée analogique une broche d'entrée numérique et activer une traction faible vers le haut, ou en faire une broche de sortie numérique. Soit on arrêtera cette broche de flotter.

portreathbeach
la source