Forum: Mikrocontroller und Digitale Elektronik Zufall per Hardware erzeugen


von Christian J. (Gast)


Lesenswert?

Hallo,

auch wenn mir die random Funktion genügt, so würde ich doch für den 
STm32F1xx eine zufällige Startzahl benöitigen, damit nicht immer die 
gleichen Zahlen entstehen. Der F1 hat keinen RNG wie der F4. Nur ist es 
bei uC mit Zufall so eine Sache. Einen Rauschgenerator wollte ich auch 
nicht aufbauen. Und auch die Unterschiede zwischen Watchdog RC Takt und 
einem Timer am Quarz erzeugen meist die gleichen Zahlen.

Interessant aber wie sie es gemacht haben steht da nicht:
https://winfuture.de/news,93326.html

Gibt es da einfache Lösungen mit wenigen Bauteilen? Also wie gesagt nur 
für den Seed?

Gruss,
Christian

von c-hater (Gast)


Lesenswert?

Christian J. schrieb:

> Gibt es da einfache Lösungen mit wenigen Bauteilen?

Nicht wirklich.

> Also wie gesagt nur für den Seed?

"Nur"? Wer so fragt, hat nicht begriffen, dass ein wirklich zufälliger 
Seed der Kern der Sache ist. Damit steht und fällt die ganze Lösung.

Also: entweder muss es zufällig sein, dann muss auch ein wirklich 
zufälliger Seed her oder es muss eben nicht zufällig sein, dann reicht 
eine Konstante als Seed.

Alles andere ist nutzlose Frickelei. Reine Vertuschung der objektiven 
Untauglichkeit der Lösung.

von Falk B. (falk)


Lesenswert?

Christian J. schrieb:
> Hallo,
>
> auch wenn mir die random Funktion genügt, so würde ich doch für den
> STm32F1xx eine zufällige Startzahl benöitigen, damit nicht immer die
> gleichen Zahlen entstehen.

Ich hab das bei meinem LED-Spiel einfach gelöst. rand() wir nach dem 
Programmstart periodisch mit 100 Hz aufgerufen. Damit kommt der 
Pseudozufallsgenerator in Schwung. Wenn dann im normalen Programmablauf 
ein Aufruf erfolgt, ist die aktuelle Position abhängig vom Zeitpunkt des 
Aufrufs. Der ist aber nie auf 10ms genau reproduzierbar. Also hat man 
einen  praktisch zufälligen Startwert.

von Sven B. (scummos)


Lesenswert?

Falk B. schrieb:
> Christian J. schrieb:
>> Hallo,
>>
>> auch wenn mir die random Funktion genügt, so würde ich doch für den
>> STm32F1xx eine zufällige Startzahl benöitigen, damit nicht immer die
>> gleichen Zahlen entstehen.
>
> Ich hab das bei meinem LED-Spiel einfach gelöst. rand() wir nach dem
> Programmstart periodisch mit 100 Hz aufgerufen. Damit kommt der
> Pseudozufallsgenerator in Schwung. Wenn dann im normalen Programmablauf
> ein Aufruf erfolgt, ist die aktuelle Position abhängig vom Zeitpunkt des
> Aufrufs. Der ist aber nie auf 10ms genau reproduzierbar. Also hat man
> einen  praktisch zufälligen Startwert.

Das ist denke ich die pragmatische Lösung. Für ein Gadget ist das super, 
evtl. würde ich die Frequenz etwas erhöhen (kann mir vorstellen dass man 
mit Übung zumindest eine Häufung in einem bestimmten 10ms-Slice erzeugen 
kann beim Knopf drücken). Für kryptographische Anwendungen ist ein 
ordentlicher Hardware-RNG sicherlich die Wahl.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Der ist aber nie auf 10ms genau reproduzierbar. Also hat man
> einen  praktisch zufälligen Startwert.

Die Variabilität dieses Zeitpunkts ist der einzige Zufall darin. Der 
Rest verkompliziert nur den Determinismus des PRNG. Wenn sich das also 
zwar nicht auf 10ms reproduzieren lässt, aber beispielsweise auf 100ms, 
dann sind allenfalls 3 Bits Zufall drin.

von Max707 (Gast)


Lesenswert?

Quark hoch zehn!

Nimm den Sekundenwert der Echtzeituhr und leite dann das ab was du haben 
möchtest.

von MaWin (Gast)


Lesenswert?

Christian J. schrieb:
> so würde ich doch für den STm32F1xx eine zufällige Startzahl benöitigen,
> damit nicht immer die gleichen Zahlen entstehen

Kommt auf die Anwendung an:

Zufall nur nach Benutzeraktion, und sei es  wie lange der 
Einschalttaster betätigt wird ?

Mache den seed von dieser Benutzeraktion abhängig.

Das System kennt die Zeit ? Mache den seed von der Zeit abhängig.

Analogeingang ? Sample sein Rauschen ggf. mit langer Antenne.

Oder einfacb de  alten RNG im EEPROM speichern und nach neuem 
Einschalten dort weitermachen.

von Falk B. (falk)


Lesenswert?

A. K. schrieb:
> Falk B. schrieb:
>> Der ist aber nie auf 10ms genau reproduzierbar. Also hat man
>> einen  praktisch zufälligen Startwert.
>
> Die Variabilität dieses Zeitpunkts ist der einzige Zufall darin. Der
> Rest verkompliziert nur den Determinismus des PRNG. Wenn sich das also
> zwar nicht auf 10ms reproduzieren lässt, aber beispielsweise auf 100ms,
> dann sind allenfalls 3 Bits Zufall drin.

Stimmt, aber auch das ist bei meiner Anwendung nicht gegeben. Zumal auch 
das neu ziehen von Zufallszahlen immer wieder vom Zeitpunkt abhängt und 
damit auch geschätzt auf bestenfalls 1s genau reproduzierbar ist.

Ist sicherlich nicht der Königsweg, aber für viele einfache Anwendung 
ausreichend.

von Bla (Gast)


Lesenswert?

Es könnte sein dass ein Tastendruck bzw. die Dauer in kleinen 
Zeiteinheiten wirklich zufällige Werte ergibt.

von Christian J. (Gast)


Lesenswert?

Hallo,

es geht nur um eine Deko, wo auf einer MAX7219 1024 LED Matrix das "Game 
of Life" läuft. Da ich, damit es am Leben bleibt immer zufällige neue 
"unsichtbare Zellen" im Feld erzeuge sollten sie wirklich zufällig sein, 
da sonst immer die gleichen Muster entstehen. Habe das mit dem F429 mal 
schön gelöst, nur hat der eben den RNG drin. Das System arbeitet ohne 
jede Eingaben von außen. Ok, man kann auch einen LDR nehmen und den 
auslesen, da das Licht nie immer gleich ist. Als Startwert reicht das. 
Ich brauche neue Zahlen, wenn die Anzahl Zellen unter bestimmte Werte 
fällt. UIhrzeit hätte ich, einen Dallas Chip dran ist kein Thema, die 
benutze ich oft. I2C Routinen sind fertig für die Statemachine des F1 
und laufen auch.

von Christian J. (Gast)


Lesenswert?

Ok,

ich glaube ich mache es so, dass ich wirklich nur einen LDR nehme und 
den alle n Zufallszahlen neu auslese, zb 1 x pro Stunde und damit den 
neuen Seed erzeuge.Das Modell steht am Fenster und von daher schwankt 
die Helligkeit unentwegt um mindestens ein paar Digits.

von foo (Gast)


Lesenswert?


von Christian J. (Gast)


Lesenswert?

foo schrieb:
> http://www.jtxp.org/tech/xr232web.htm

Zu aufwendig, nur für Kryptoanwendungen.

von Jim M. (turboj)


Lesenswert?

Christian J. schrieb:
> Gibt es da einfache Lösungen mit wenigen Bauteilen? Also wie gesagt nur
> für den Seed?

Hat der STM32 nicht eine interne Temperaturdiode am ADC? Damit könnte 
man eine Zufallsgenerator aufbauen, indem man das unterste Bit (die 
untersten Bits) des ADCs benutzt, wenn er die interne Chip Temperatur 
misst. Da ist i.d.R. nur Rauschen drin.

Für Crypto Zwecke würde man dieses Rauschen noch durch "Hash" Funktionen 
wie SHA1 oder MD5 jagen, was auf einem STM32 aber zu teuer sein dürfte.

von Sven B. (scummos)


Lesenswert?

Jim M. schrieb:
> Für Crypto Zwecke würde man dieses Rauschen noch durch "Hash" Funktionen
> wie SHA1 oder MD5 jagen, was auf einem STM32 aber zu teuer sein dürfte.

Für Krypto-Zwecke nutzt man weder den leicht beeinflussbaren ADC als 
Zufallsquelle, noch verwendet man veraltete Hashfunktionen wie SHA1 oder 
gar MD5.

Beitrag #5920439 wurde von einem Moderator gelöscht.
Beitrag #5920459 wurde vom Autor gelöscht.
von Elbi (Gast)


Lesenswert?

Lustig, diese Frage hatten wir gestern im Meeting. Hitzige Diskussionen, 
Tausend Vorschläge :-)

Ergebnis:

Wir lassen einen Zähler laufen und messen ein paar male den 
Nulldurchgang der 50Hz, die wir per Antenne empfangen. Start des System 
und die Phase der 50Hz sind extrem stark abweichend. Der Zähler zählt im 
uc bis 65535 und hat bei 1000 Versuchen jede Zahl nur einmal gebracht.

von Sven B. (scummos)


Lesenswert?

Elbi schrieb:
> Der Zähler zählt im
> uc bis 65535 und hat bei 1000 Versuchen jede Zahl nur einmal gebracht.

... was massiv unwahrscheinlicher ist, als dass Zahlen doppelt 
vorkommen. So unwahrscheinlich, dass es eigentlich fast nicht sein kann.

von Nop (Gast)


Lesenswert?

Christian J. schrieb:
> Also wie gesagt nur für den Seed?

Wirf doch einfach den Zustand des PRNG alle paar Sekunden in ein 
Backup-Register und lade ihn beim Powerup von da aus. Braucht natürlich 
Speisung an V_BAT, wozu Du entweder einen Goldcap nehmen kannst (mit 
Vorwiderstand und Rücksperrdiode), oder Du verbaust eine Knopfzelle.

Alternativ kannste auch einen ADC-Eingang mit zwei 
Spannungsteilerwiderständen in ungefähr die Mitte seines Bereiches legen 
und zum Startup N Messungen machen, von denen Du jeweils nur das LSB 
mitnimmst. Wobei N halt die Bitbreite Deines Seeds ist.

von Stefan F. (Gast)


Lesenswert?

Einigermaßen zufällig wirkende Zahlen lassen sich recht einfach 
erzeugen, indem man die Spannung von rauschenden Bauteilen misst oder 
die Dauer eines Tastendruckes auswertet.

Es hängt von deinen Anforderungen ab:

1) Ist es egal, wenn der Zufallszahlen-Generator von außen beeinflussbar 
ist?
2) Ist es egal, wenn der Generator nach hinreichend vielen Aufrufen 
manche Zahlen besonders häufig oder selten ausgibt?

Bei einem Würfel wäre 1) noch Ok, aber 2) ganz sicher nicht.

von Jemand (Gast)


Lesenswert?

Sven B. schrieb:
> noch verwendet man veraltete Hashfunktionen wie SHA1

Gilt der Linux Zufallsgenerator als unsicher? Nein.

von Sven B. (scummos)


Lesenswert?

Jemand schrieb:
> Sven B. schrieb:
>> noch verwendet man veraltete Hashfunktionen wie SHA1
>
> Gilt der Linux Zufallsgenerator als unsicher? Nein.

Was ist "der Linux Zufallsgenerator"? /dev/urandom? Wo benutzt das sha1 
(oder irgendeine Hashfunktion)?

: Bearbeitet durch User
von Sebastian S. (amateur)


Lesenswert?

Nutze doch einfach die "Hardware" die vor dem Teil steht/sitzt!
Wird im Zusammenhang mit irgendwelchen Eingaben eine Zufallszahl 
benötigt, so sollte der erste Tastendruck als Referenz herangezogen 
werden.
Ich kann mir nicht vorstellen, das jemand wiederholt nach 6,8888888... 
Sekunden die erste Taste nach dem Einschalten, betätigen kann.
Ab diesem Zeitpunkt kommt es natürlich auf den Algorithmus an der 
verwendet werden soll.
Was noch zufällig wäre ist ein von der Netzspannung, hochohmig 
aufgeladener Kondensator hinter einem gleich riecht er. Ein einfacher 
Komparator und eventuell ein Optokoppler schaffen hier Sicherheit. Die 
Größe des Kondensators bzw. des Widerstandes sorgen dafür, dass der 
Schwellwert erst nach der Initialisierung erreicht wird. Der Zufall 
kommt dadurch ins Spiel, dass der Ladezustand des Kondensators davon 
abhängt, zu welchem Spannungswert die Netzspannung eingeschaltet wird. 
Die Si-Nuss rollt ja ständig Rum und es sollte schwierig werden einen 
definierten, aktuellen Wert zwischen nichts und 180° zu treffen.

: Bearbeitet durch User
von Jemand (Gast)


Lesenswert?

Sven B. schrieb:
> Jemand schrieb:
> Sven B. schrieb:
> noch verwendet man veraltete Hashfunktionen wie SHA1
>
> Gilt der Linux Zufallsgenerator als unsicher? Nein.
>
> Was ist "der Linux Zufallsgenerator"? /dev/urandom? Wo benutzt das sha1
> (oder irgendeine Hashfunktion)?

Wenn man Daten aus den Entropy-Pools input_pool oder blocking_pool (-> 
/dev/random) entnimmt, weden diese mit SHA-1 gehasht und gefalten. Für 
/dev/urandom wird ChaCha20 aus dem input_pool geseedet.

von dOOfi (Gast)


Lesenswert?

srand(time(NULL));

von Bla (Gast)


Lesenswert?

Vielleicht kann man den Inhalt eines RAM-Speicherbereiches 
zusammenzählen - beim Einschalten könnten da zufällige Werte stehen.

Beitrag #5920634 wurde von einem Moderator gelöscht.
von tim (Gast)


Lesenswert?

Meine, mich dunkel zu erinnern, dass bei einem Elektor-Projekt zur 
Zufallserzeugung an einem oder mehreren Pins eines Mikrocontrollers 
kleine Kondensatoren über Widerstände angeschlossen waren.
Die wurden jeweils über den gleichen Pin geladen/entladen und dann 
abgefragt, um ein Zufallselement zu erhalten.


Christian J. schrieb:
> Zufall per Hardware erzeugen

Übrigens fände ich den umgekehrten Fall auch sehr cool! ;)

von tim (Gast)


Lesenswert?

Wilma Streit schrieb im Beitrag #5920634:
> Jemand schrieb:
>> gefalten.
>
> Wo spricht man so?

https://de.wikipedia.org/wiki/Mansfeldisch
https://www.youtube.com/watch?v=zbM083Emf3w
(Achtung, gewöhnungsbedürftig)

von Enrico Eichelhardt (Gast)


Lesenswert?

Statt nur einen LDR auszuwerten, kann man auch zwei auswerten und diese 
nach zwei unterschiedlichen Richtungen ausrichten.
Dann potenziert sich sogar der Zufall! Je nach Sonnenstand kann der eine 
oder andere LDR mehr im Schatten sein.

von c-hater (Gast)


Lesenswert?

Christian J. schrieb:

> es geht nur um eine Deko

Diese Information hät in das OP gehört, findest du nicht?

Für reinen Spielkram reicht es natürlich, wenn's nur hinreichend 
zufällig aussieht. Aber sowas sollte jeder halbwegs mit Eigenintelligenz 
begabte ja locker hinbekommen können, ohne ein Forum dazu befragen zu 
müssen...

von (prx) A. K. (prx)


Lesenswert?

Elbi schrieb:
> Der Zähler zählt im
> uc bis 65535 und hat bei 1000 Versuchen jede Zahl nur einmal gebracht.

Es gibt etablierte mathematische Methoden, eine Verteilung von Zahlen zu 
untersuchen. Diese gehört eher nicht dazu (*). Als Einstieg:
https://de.wikipedia.org/wiki/Zufallszahlengenerator#Güte_eines_Zufallszahlengenerators
https://en.wikipedia.org/wiki/Statistical_randomness

*: for i := 1 to 1000... hat die gleiche Eigenschaft. ;-)

von (prx) A. K. (prx)


Lesenswert?

Bla schrieb:
> Vielleicht kann man den Inhalt eines RAM-Speicherbereiches
> zusammenzählen - beim Einschalten könnten da zufällige Werte stehen.

Ob die Summe gleichverteilter Zahlen wohl gleichverteilt ist? 
Ausserdem ist sehr offen, wie verteilt die Startup-Werte der RAM Zellen 
unter allen Randbedingungen tatsächlich sind.

Ein weiteres Problem dabei liegt in der Erkennung vom Powerup. RAM 
behält seinen Inhalt meist noch bei einer Spannung, die weit unter der 
Schwelle der entsprechenden Detektoren in µCs liegt.

von Jemand (Gast)


Lesenswert?

Hallo

"Für reinen Spielkram reicht es natürlich, wenn's nur hinreichend
zufällig aussieht. Aber sowas sollte jeder halbwegs mit Eigenintelligenz
begabte ja locker hinbekommen können, ohne ein Forum dazu befragen zu
müssen..."

Da gibt es so Typen im Forum die lassen einen (oft überheblichen) 
Kommentar zu gefühlt jeden zweiten Thema seit den letzten zehn Jahren 
ab, haben aber noch immer nicht verstanden wie ein Forum funktioniert 
und wofür es alles gut ist.

Und nein es geht nicht nur darum die Frage eines TO allein für den TO zu 
beantworten (PN, oder "Danke ich habe eine Lösung gefunden" Mitteilungen 
durch den TO ohne weiter Ausführungen sind zu recht verpönt) sondern 
auch darum das andere mitlesen die ähnliche Fragen haben, das die 
Threads archiviert und immer wieder aufrufbar und somit die Information 
für Jedermann nutzbar sind (Wie gut dieses Archiv bzw. Datenbank zu 
nutzen ist und wie gut die Treffer sind ist eine andere Baustelle). Es 
ist ja kein Zufall das wenn man in deutscher Sprache mal etwas 
spezieller im Bereich µC und Elektronik googlet Threads aus diesem Forum 
hier recht oft mit zu den ersten Treffern gehören.

Und einigen regelmäßigen Forennutzern ist auch nicht klar das sie unter 
ihren Nutzernamen sehr schnell Foren weit (teilweise auch in der 
entsprechenden gesamten Online Szene) bekannt, berüchtigt werden.
Aber scheinbar ist es diesen Zeitgenossen egal (oder sind sogar noch 
stolz darauf...?) als arrogante, unsoziale Zeitgenossen zu gelten egal 
wie viel sie Fachspezifisch drauf haben.
Oder sie leben in ihrer Scheinwelt und verwechseln Arroganz, Unfähigkeit 
zur Empathie, Mobben und Beleidigen mit Selbstsicherheit.

Jemand

von Rainer V. (a_zip)


Lesenswert?

Zizat aus dem Artikel: "In dem Verfahren werden im Grunde zwei 
verschiedene Quellen für Pseudo-Zufallszahlen herangezogen. Diese werden 
dann so miteinander kombiniert, dass eine Sequenz von Nummern entsteht, 
die als echte Zufallszahlen angesehen werden können. Sprich: Es ist 
bewiesenermaßen nicht möglich, vorherzusagen, welcher Wert an der 
nächsten Stelle kommt. Wie Zuckerman ausführte, habe er sich seit 20 
Jahren immer wieder mit dem Problem befasst. "Ich bin begeistert, es nun 
gelöst zu haben", sagte er. "

Das Problem der "echten" Zufallszahlen ist ja nun hinreichend bekannt. 
Und dass der Startwert dieses "Game of Life" nun so unheimlich zufällig 
sein sollte, erschließt sich mir nicht. Speicher einfach die letzten 
10000 Zahlen, die dir angeboten wurden und wenn die nächste schon da 
war, dann hol die Nächste Nächste. Die Zuschauer werden kaum stundenlang 
vor der Leinwand stehen, um irgendwann mal entrüstet auszurufen: das war 
doch schon mal da! :-)
Gruß Rainer

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.