Echter Zufall mit iTSC-counter

Sep 18, 2026 Last reply: 3 days ago 100 Replies
Jump to replies (100)

Mittels einer Assembler-Funktion rdtsc(), die ich schon lange besitze, habe ich nun einen Generator für echte Zufallszahlen entwickelt.



formatting link
Ausgabe: =========================================================================== 00000276457408345376 00000276457428358754 00000276457431266902 00000276457435366459 00000276457448473547 00000276457451206089 00000276457454226781 00000276457457223742 00000276457460060553 00000276457474314196 00000276457477764702 00000276457485946076 00000276457489986581 00000276457500216563 00000276457560363833 00000276457566068760 00000276457571709045 00000276457594841516 00000276457618375542 00000276457628372033 00000276457634496509 00000276457641473652 00000276457662760413 00000276457667772505 ===========================================================================



In Prozessoren amd64 befindet sich ein 64-bit-Counter, der von einer Taktfrequenz im Giga-Hertz-Bereich angetrieben wird. Der verändert sich durch die Zeitdauer von nur einem Funktionsaufruf bereits um Millionen in seinem Zählerstand.



Mindestens die 4/5 Ziffern von rechts können als random verwendet werden. Oft sind bereits 1- bis 2-stellige Zahlen in geringerer Anzahl nützlich.



Das Kommando nimmt ein Argument entgegen: Die Anzahl von ausgegebenen Zahlen. Voreingestellt ist die Anzahl 8.



Am 19.09.2026 um 01:59 schrieb Helmut Schellong:

Kompliziert! Warum benutzt Du keinen Maschinenbefehl?

retry_loop: RDRAND rax JNC retry_loop

RDRAND grift auf den internen, hardwarebasierten Zufallszahlengenerator zurück, der echtes thermisches Rauschen als Quelle benutzt.

:)

Etwas mehr Mühe sollte man sich schon machen:

formatting link

Was Du für einen diebischen Spaß daran hast, Probleme zu lösen die vor Dir schon zehntausendmal gelöst wurden und auf denen ganze akademische Karrieren fußen. Was musst Du von Dir überzeugt sein, dass Du Dir einbildest, sowas besser zu machen als jemand der sich schon sein ganzes fachliches Leben mit dem Thema beschäftigt, auf Konferenzen fährt und dort mit anderen Experten in dem Thema spricht etc bla.

Hast Du nichts zu tun an dem Du mehr Freude hättest als nochmal ein Rad zu erfinden?

Hey, pass auf, als nächstes erfindet unser Freund Feuer neu ... mit weniger Flammen und Hitze oder so.

SCNR, Alex.

Wie kann man eine Assembler-Funktion "besitzen"?

/ralph

Am 19.09.2026 um 10:26 schrieb Ralph Aichinger:

Man hat eine .a-Datei mit der Implementierung der genannten Funktion auf Platte?

Ber "Ich besitze schon lange memcpy()" nd

Hallo,

an seinem Audio-HyEnd steck er ja im Moment fest.

formatting link

peter

Am 19.09.2026 um 09:53 schrieb Alexander Schreiber:

[...]

Oder den tiefen Teller...

Leo Baumann wrote on 19.09.2026 04:32:

Neuere Prozessoren haben diese Instruktion, und auch eine für AES. Das kenne ich seit langer Zeit. Ich habe aber erst seit 2023 einen geeigneten Prozessor.

Und ich werde mein Kommando randtsc noch erweitern, zu einem Test- und Experimentier-Tool. Ich bin gerade dabei - wird heute fertig.

Du gehst von Absichten von mir aus, die ich jedoch gar nicht habe. Du weißt auch nicht, was ich mit dem kleinen Kommando so alles vorhabe.

Zwischen Besitz und Eigentum besteht ein semantischer Unterschied:

Tatsächliche Herrschaft über eine Sache. Rechtliche Herrschaft über eine Sache.

Im Alltagsleben gilt meist beides gleichzeitig.

Eric Bruecklmeier wrote on 19.09.2026 13:45:

Eher den doppelbödigen, mit geschlossenem Boden oben und unten.

Am 19.09.2026 um 13:54 schrieb Helmut Schellong:

nasmsection .text global get_rdrand_64

;

--------------------------------------------------------------------------- ; get_rdrand_64 ; Gibt eine 64-Bit-Hardware-Zufallszahl zurück. ; C-Prototyp: uint64_t get_rdrand_64(int *success); ; ; Input: RDI = Zeiger auf eine Status-Variable (success) ; Output: RAX = Die generierte Zufallszahl (0 bei Fehler) ;

--------------------------------------------------------------------------- get_rdrand_64: mov ecx, 10 ; Maximale Anzahl der Versuche (Retry-Counter)

.loop_rdrand: rdrand rax ; Versuche, 64-Bit-Zufall in RAX zu laden jc .success ; Wenn Carry-Flag (CF) = 1, war es erfolgreich -> Springe zu .success

pause ; Dem Prozessor eine kurze Pause gönnen (Strom sparen / Thread freigeben) loop .loop_rdrand ; ECX dekrementieren, wenn > 0, Schleife wiederholen

.fail: mov qword [rdi], 0 ; Setze *success = 0 (Fehlgeschlagen) xor rax, rax ; RAX auf 0 setzen ret

.success: mov qword [rdi], 1 ; Setze *success = 1 (Erfolgreich) ; Die Zufallszahl befindet sich bereits in RAX und wird zurückgegeben ret

Leo Baumann wrote on 19.09.2026 16:03:

Wo sind denn hier ausgegebene Zufallszahlen? Das wäre interessant.

Am 19.09.2026 um 14:33 schrieb Helmut Schellong:

Wie ein eingeöltes Ferkel...

Am 19.09.2026 um 20:41 schrieb Helmut Schellong:

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Am 19.09.2026 um 20:41 schrieb Helmut Schellong:

Die Zufallszahl befindet sich im 64 Bit-Register rax ...

Am 19.09.2026 um 20:41 schrieb Helmut Schellong:

Eine echte Zufallszahl wird erzeugt ausgegeben ...

formatting link

:)

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required