C Spezialisten für Zufallszahlengenerator

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Community.

    Bin auf der Suche nach einem möglichst neutralen Zahlen-Zufallsgenerator.
    Beispiele gibt es en Mass im I-net, das Prob ist nur : srand und ähnliches mit irgendwelchen Einbeziehungen von Uhrzeit o.ä. als Startbedingung will ich nicht.

    Hintergrund ist folgender.
    Der Generator wird gestartet, nach 1 min wird ne Taste gedrückt, der aktuelle Wert gespeichert, und nach loslassen das Spielchen erneut gestartet bzw. einfach weiterlaufengelassen..
    Wichtig ist nur: das drücken der Taste darf keinen Einfluss auf das neue starten des Generators nen Einfluß haben.

    Den Sinn des ganzen lassen wir mal auser acht.
    Mir geht es um nen "absolut neutralen" code, ohne irgendwelche Startbedingungen.
    Begrenzung der Zahlen +/- setze ich keine voraus.

    Das ganze mag bißchen dämlich klingen, aber wie gesagt... lassen wir das mal vorweg.

    gruß root

    Einmal editiert, zuletzt von root (27. April 2015 um 01:34)

  • Ein Pseudozufallszahlengenerator ist ein Algorithmus, der einmal initialisiert, statistisch gute oder weniger gute Pseudozufallszahlen in Sequenz generiert. D.h. er muss eimal irgendwie 'zufaellig' initialisiert werden und wird dann nur noch einfach benutzt - also nicht mehr initialisiert. In Deinem Falle sind dann auch die Zufallszahlen von dem Druecken der Taste unabhaengig. Deshalb verstehe ich nicht, was Du unter einem 'neutralen Zufallsgenerator' verstehst und was da anders sein soll.

  • Für C++ 11 wurde die Random-Library stark erweitert. Man kann
    jetzt die Generatoren und Verteilungen viel besser definieren.

    Ich brauch das normalerweise nicht, aber es waere sicher eine
    Suche wert. Die Leute die das gemacht haben, verstehen hoffentlich
    was davon :D

    - - - - - -

    Hatte ich vergessen: schon mal Werte aus /dev/urandom gelesen ?

    Ist anscheinend nicht so Random dass man hoechst sichere Verschluesselungen
    damit machen sollte, aber fuer sonstige Zwecke koennte es reichen.

    Und wenn der Random-Generator mit Werten aus /dev/urandom initialisiert wird,
    dann wird es schon recht Random.

    Oder sogar nach dem Wert aus /dev/urandom den Random-Generator waehlen und
    dann mit dem naechsten Wert seeden ...

    Einmal editiert, zuletzt von Tell (27. April 2015 um 09:36)

  • Hallo Root,

    sorry, Du hast Dich sehr undurchsichtig geäußert, was Du eigentlich haben willst.

    Du hast einmal die Möglicheit, einen Zufallszahlengenerator zu initialisieren. Dann liefert der Zufallszahlengenerator in Abhängigkeit des Initiators immer die gleiche Zufallsfolge.

    Initialisierst Du den Zufallszahlengenerator nicht, dann liefert er immer die gleiche Zufallszahlenfolge.

    Dann hängt die Zufallszahlenfolge möglicherweise noch von der Programmiersprache bzw. Betriebssystem ab. Es gibt Programmiersprachen, die die Zufallszahlenerzeugung über einen Algorithmus erledigen. Bei einigen Betriebssystemen kann die Zufallszahl auch über den Prozessor abgerufen werden (war früher auf dem 6502 / 6510 so der Fall) - ist wohl bei aktuellen Prozessoren nicht mehr der Fall.

    Das bedeutet, wenn Du ein Programm auf einem einzigen Betriebssystem ohne Initialisierung einsetzt, dann wird immer die gleiche Zufallszahlenfolge erzeugt. Unabhänig von Datum, Uhrzeit, Laune des Programmierers.

    Ist es das, was Du wissen wolltest?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (1. Mai 2015 um 10:27)

  • Hallo.

    @ Tell

    Zitat

    Hatte ich vergessen: schon mal Werte aus /dev/urandom gelesen ?


    ... werd ich mal mit rumspielen.

    Andreas.

    Zitat

    sorry, Du hast Dich sehr undurchsichtig geäußert, was Du eigentlich haben willst.


    ok, hab ich mich evtl. schlecht augedrückt.
    Ich will im Prinzip nichts anderes als quasi unvoreingenommen blind in einen unendlich großen Topf greifen, in dem gleich viel weisse und schwarze Kugeln sind, und nacheinander ne bestimmte Anzahl rauszufischen und dann gucken was ich erwischt habe.
    (Den Sinn oder Unsinn mal außen vor lassen).
    Sobald ich aber etwas initialisiert habe ... bestimme ich iwie schon was.

    Dein Satz :

    Zitat

    Du hast einmal die Möglicheit, einen Zufalsszalengenerator zu initialisieren. Dann liefert der Zufallszahlengenerator in Abhängigkeit des Initiators immer die gleiche Zufallsfolge.

    Initialisierst Du den Zufallszahlengenerator nicht, dann liefert er immer die gleiche Zufallszahlenfolge.


    hat mich jetzt komplett konfus gemacht ..:huh:
    ...gleiche Zufallsfolge...gleiche Zufallszahlenfolge ... :denker:

    gruß root


  • hat mich jetzt komplett konfus gemacht ..:huh:
    ...gleiche Zufallsfolge...gleiche Zufallszahlenfolge ... :denker:


    Ja, der Generator generiert fuer ein und denselben Startwert immer dieselbe deterministische Zahlenfolge. Deshalb ist es wichtig ihn 'zufaellig' zu initialisieren wenn Du keine Wiederholungen haben willst.

  • Das Problem ist, dass es afaik keine echten Zufallszahlen gibt.
    Ich erinnere mich an einen Bekannten von mir, der - noch etwas paranoider als ich - mal eine Encryption-Methode namens "entropy" entwickelt hat.
    Der nahm, wenn ich mich recht entsinne, das Rauschen aus offenen Eingängen des Computers als Grundwerte um entsprechend Zufallszahlen zu berechnen.
    Das ist wohl eine Wissenschaft für sich.
    Ich für meinen Teil habe mich bisher immer mit den Standard-Funktionen begnügt, die ich mit den Sekunden seit epoch (also time()) als Startwert gefüttert habe. Für mich war das bisher immer ausreichend.

    cu,
    -ds-

  • Hallo Root,

    keine Initialierung des Zufallszahlengenerators liefert immer die gleiche Folge an Zufallszahlen - egal welche.

    Ich hatte mal ein simples Spiel programmiert, da kam als dritte Zufallszahl immer die 4... Die Zahlen davor und danach waren auch immer die gleichen.

    Sowas macht dann Sinn, wenn Du ein Programm testen willst, um alle Fälle und Verzweigungen zu "erwischen".

    Für sinnvolle Anwendungen ist eine immer identische Folge an Zufallszahlen jedoch nicht erwünscht. Hier ist es sinnvoll, aus Datum, Uhrzeit, Laufzeit des Programms eine Zahl zu ermitteln, die dem Zufallszahlengenerator als Startwert übergeben wird.

    Dann wird zwar bein identischem Startwert immer noch die gleiche Folge erzeugt, aber da es zuviele unterschiedliche Startwerte gibt, merkt der Anwender davon nichts mehr.

    Wenn Du auch diesen Effekt beseitigen willst, dann hilft es nur noch, wenn man die Zufallszahlen bei bestimmten Ereignissen zieht, die dazwischen gezogenen Zufallszahlen aber verwirft. Eriegnisse können z.B. Anwendereingaben sein, Mausbewegungen, Mauskoordinaten, Werte analoger Eingänge (insbesondere wenn ein Kabel ohne Widerstand einfach so unmotiviert drinsteckt), ...

    Am besten probierst Du es mal aus. Schreibe mal ein kleines Programm, dass Dir ohne Initialisierung des Zufallszahlengenerators Zufallszahlen ausspuckt und speichert.

    Dann ergänzt Du das Programm. Die Zufallszahl wird genauso ermittelt, aber danch mit der jeweils gespeicherten Zufallszahl verglichen. Erwartung: Beide Folgen sind identisch.

    Dann ergänzt Du das Programm erneut. Dieses Mal wird der Zufallszahlengenerator mit irgendwelchen Zahlen initialisiert. Hier ist die Zufallszahlenfolge nur bei gleichem Initiator identisch.

    Was meinst Du, wie sonst Ver- und Entschlüsselungsprogramme funktionieren? Hier muss bei identischen Gegebenheiten (z.B. Schlüssel) immer die gleiche Zufallszahlenfolge bei beiden Systemen erzeugt werden.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (27. April 2015 um 15:33)

  • Moin Andreas,


    ...
    Was meinst Du, wie sonst Ver- und Entschlüsselungsprogramme funktionieren? Hier muss bei identischen Gegebenheiten (z.B. Schlüssel) immer die gleiche Zufallszahlenfolge bei beiden Systemen erzeugt werden.
    ...


    ich finde Deine, oft seitenlangen, Kommentare interessant und manchmal auch lehrreich ...
    Aber das ist, gelinde gesagt, Quatsch ;) ...
    Wieso sollte aus einen key eine Zufallszahl generiert werden? Da gehts um Sicherheit ... nicht um "security by obscurity" ala' MS :fies:


    cheers,
    -ds-


  • ..Hier ist die Zufallszahlenfolge nur bei gleichem Initiator identisch.
    Was meinst Du, wie sonst Ver- und Entschlüsselungsprogramme funktionieren? Hier muss bei identischen Gegebenheiten (z.B. Schlüssel) immer die gleiche Zufallszahlenfolge bei beiden Systemen erzeugt werden.


    ...war grade davor in's Kloster zu ziehen.
    Denn das würde bedeuten, dass jeder Key sinnlos ist... er lässt sich ja "erzeugen".

    Aber ok, genug des Themas.
    Werd mal rumprobieren.
    Sinn und Zweck des ganzen erklär ich später mal.

    Besten Dank ann alle.

    gruß root


  • ... mal eine Encryption-Methode namens "entropy" entwickelt hat ...

    'Entropy' bzw. 'Entropie": Das ist das richtige Stichwort zu dem, was 'root' meint.

    Zumindest Archlinux verwendet es seit einigen Monaten, es gibt dafür einen Dämon.
    "man -k entrophy" spuckt dazu aus:

    Code
    RAND_add (3ssl)      - add entropy to the PRNG
    RAND_egd (3ssl)      - query entropy gathering daemon
    RAND_egd_bytes (3ssl) - query entropy gathering daemon
    RAND_event (3ssl)    - add entropy to the PRNG
    RAND_query_egd_bytes (3ssl) - query entropy gathering daemon
    RAND_screen (3ssl)   - add entropy to the PRNG
    RAND_seed (3ssl)     - add entropy to the PRNG
    RAND_status (3ssl)   - add entropy to the PRNG

    Der "echte" Zufall ergibt sich u.a. dadurch, daß z.B. Daten aus anderen Prozessen, Tastendrücke des Anwenders, usw. in die Erzeugung einbezogen werden. Je länger der Entropie Prozess für die Erzeugung laufen darf, desto besser die Qualität - deshalb ist auch ein ständig laufender Dämon dafür ideal.

    Gruß, mmi

  • Moin mmi,
    das entropy ist ja eine im Linux eingebaute Methode zum Generieren von Zufallszahlen.
    Ein Freund von mir hatte das -> hier <- gebastelt. Das war allerdings schon als wir noch als Netzaktivisten unterwegs waren ( stop1984 - wir haben es sogar nach -> wikipedia <- geschafft ;) )

    cu,
    -ds-


  • ... - deshalb ist auch ein ständig laufender Dämon dafür ideal.

    Da gibt es auch noch haveged, z. B.:

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hallo Dreamshader,


    Moin Andreas,


    ich finde Deine, oft seitenlangen, Kommentare interessant und manchmal auch lehrreich ...
    Aber das ist, gelinde gesagt, Quatsch ;) ...

    :danke_ATDE: für das Teillob.


    Aber Deinen Kommentar muss ich leider erwidern, da - basierend auf meiner Erfahrung der vergangenen 33 Jahre - so nicht ganz korrekt. ;)

    Über einen recht langen Zeitraum (seit ca. 1982) habe ich beruflich immer wieder mal mit Verschlüsselung und Entschlüsselung von Daten zu tun gehabt.

    Es gibt im Wesentlichen zwei Herangehensweisen.

    Die eine basiert darauf, dass durch einem zu entwickelnden Algorithmus unabhängig von - ich nenne sie korrekterweise - Pseudozufallszahlen aus einer Bytefolge eine andere Bytefolge erzeugt wird (Chiffrieren, Verschlüsseln).
    Die Kunst besteht darin, den Algorithmus so umzukehren, dass dieser Vorgang umkehrbar gemacht wird (Dechiffrieren, Entschlüsseln).

    Wie gesagt, bei der einen Herangehensweise werden keine Zufallszahlen herangezogen. Hier ist der Algorithmus aus einer Analyse von Chiffrat und Dechiffrat möglich. Eine Sicherheit kann z.B. nur in einem mehrstufigen Verfahren erzielt werden.

    Wenn man an die ausführbare Datei herankommt, ist bei nicht zu komplexem Code dieser Algorithmus über das Disassemblat möglich. Für die, die sowas mögen...


    Die andere Herangehensweise nutzt Pseudozufallszahlen. Hier bist Du darauf angewiesen, dass der Rechner auf dem verschlüsselt wurde und der Rechner auf dem verschlüsselt werden soll, die gleichen Folgen an Zufallszahlen verwenden. Deswegen wird auch die Verwendung des Begriffes "Pseudozufallszahlen" nachvollziehbar. Es handelt sich nicht um echte Zufälle sondern um algorithmisch berechnete Werte, die auf beiden Systemen identisch sein müssen. Ansonsten würde die Dechiffrierung nicht mehr funktionieren.

    Echte Zufälle erhältst Du z.B., indem Du in einen Analogeingang ein blankes Kabel ohne nennenswerten Widerstand steckst. Das ist Dir, Dreamshader, ja bestens bekannt. Aber solche Zufallsereignisse sind für die Thematik Ver-/Entschlüsseln vollkommen ungeeignet, da durch keinen Algorithmus ein Zusammenhang zwischen Ereignis N und Ereignis N+1 herstellbar ist.


    Diese hier ansatzweise beschriebenen Erkenntnisse habe ich zahlreich in selbst entwickelten Lösungen in unterschiedlichsten Programmiersprachen auf diversen Betriebssystemen umgesetzt. Daher sind diese Aussagen allgemeingültig.


    Wenn die damaligen Auftraggeber irgendwie Probleme mit den von mir geschriebenen Programmen, die ausgiebig von Ver-/Entschlüsselungen, Pseudozufallszahlen etc. Gebrauch machen, gehabt hätten, dann würde ich kaum regelmäßig solche Anfragen und Aufträge erhalten.


    Ob man etwas als "Quatsch" oder "Unsinn" betrachtet, hängt immer von der Tiefe der individuellen Beschäftigung und Auseinandersetzung mit der Materie ab.

    Daher weiß ich ganz sicher, dass meine Aussagen in Beitrag #8 keinen - wie Du schreibst - Quatsch darstellen.

    Denn sonst würden Anwendungen wie die hier nicht funktionieren:

    Ich habe sogar Anwendungen geschrieben, deren Anwender-Eingaben direkt verschlüsselt in Variablen / Datenstrukturen abgelegt werden und nur für die Anzeige entschlüsselt werden. Ebenso werden in diesen Programmen nur verschlüsselte Daten gespeichert und beim Laden dieser Daten korrekt entschlüsselt.


    Zitat


    Wieso sollte aus einen key eine Zufallszahl generiert werden? Da gehts um Sicherheit ... nicht um "security by obscurity" ala' MS :fies:

    Aus einem Key wird keine Zufallszahl generiert. Da hast Du natürlich Recht. :thumbs1:

    Der Key dient dazu, den Algorithmus zur Ermittlung der Pseudozufallszahl auf einen definierten Stand zu setzen. Worin sich dieser Stand definieren lässt, hängt vom Algorithmus der Ermittlung der Pseudozufallszahl ab. In der Regel werden mehrere "Register gezogen", deren Bestand über die Laufzeit vom Algorithmus abhängt.


    Wenn diese Register abhängig vom zu verschlüsselnden Byte und der Zufallszahl byteweise neu berechnet werden, geht ein Zusammenhang von Chiffrat und Dechiffrat vollkommen verloren. Eine Entschlüsselung ist dann nur noch bei Kenntnis des Algorithmus zum Entschlüsseln und des initialen Keys möglich.


    Und deswegen ist es entscheidend, dass - wie oben ausgeführt - Verschlüsselungsrechner und Entschlüsselungerechner mit dem gleichen Algorithmus und dessen Umkehrung sowie dem gleichen Schlüssel (Key) arbeiten müssen.


    Ich hatte hier im Forum schon einmal einen ansonsten auch nicht verstandenen Beitrag zum Thema Rijndal gebracht.


    Man mag Fakten keinen Glauben schenken, man mag Fakten auch kritisieren - aber dabei bleiben es immer noch Fakten. :cool:
    Durch Kritik mögen Fakten zwar angezweifelt werden, es ändert aber nichts an deren Status als Tatsache. :denker: :s

    Aber dazu ist ein solches Forum ja auch da, das man sich austauscht und sich gegenseiteig auf einen höheren Grad der Erkenntnis hievt - sofern dazu die Bereitschaft vorhanden ist. ;)


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (1. Mai 2015 um 10:25)

  • Moin Andreas,
    es mag ja sein, dass Du es so programmiert hast ... aber das ist mit Sicherheit keine gängige Verfahrensweise.
    Allein schon die Annahme, dass auf allen Rechnern (egal ob x86, ARM, ... mit Windows, DOS, Linux) die Pseudozufallszahlen gleich erzeugt werden ist imho schon mehr als gewagt.


    ...
    Aus einem Key wird keine Zufallszahl generiert. Da hast Du natürlich Recht. :thumbs1:
    ...


    aha ...


    ...
    Der Key dient dazu, den Algorithmus zur Ermittlung der Pseudozufallszahl auf einen definierten Stand zu setzen. ...
    ...


    na was jetzt? Dann dient der key doch als Grundlage zur Berechnung der Zufallszahl :s


    ...
    Und deswegen ist es entscheidend, dass - wie oben ausgeführt - Verschlüsselungsrechner und Entschlüsselungerechner mit dem gleichen Algorithmus und dessen Umkehrung sowie dem gleichen Schlüssel (Key) arbeiten müssen.
    ...


    Und genau das ist imho keine professionelle Herangehensweise.
    Es mag irgendwie (zufällig) auch (mal) so gehen, wie Du es beschrieben hast ( denn sorry, anzunehmen dass die Algorithmen die gleichen Pseudos erzeugen ist imho blauäugig).
    Heise hat -> hier <- einen Beitrag, in dem gleich zu Anfang herausgestellt wird dass

    Zitat


    ...
    ... die Qualität der Zufallszahlen von Betriebssystem zu Betriebssystem stark variieren kann, setzt das auf vielen Plattformen verfügbare ...
    ...


    Deshalb ja: security by obscurity ...
    Moderne Algorithmen sind sogar quellofen und da hast Du so was


    Wenn man an die ausführbare Datei herankommt, ist bei nicht zu komplexem Code dieser Algorithmus über das Disassemblat möglich. Für die, die sowas mögen...


    gar nicht nötig ;)

    Die meisten Verfahren sind mittlerweise afaik asymetrische Encryption-Methoden.
    Hier wird auf einem Rechner der secret und der public key erzeugt und der public key dann zum z.B. client übertragen ( das ist z.B. -> hier <- etwas ausführlicher beschrieben ).

    Auch -> hier <- wird auf Dein vorgeschlagenes Verfahren eingegangen ... und dieses als nicht so gute Idee abgelehnt.

    Sorry, aber das konnte ich jetzt nicht so stehen lassen ...
    -ds-

  • Hallo Dreamshader,


    Und genau das ist imho keine professionelle Herangehensweise.
    Es mag irgendwie (zufällig) auch (mal) so gehen, wie Du es beschrieben hast ( denn sorry, anzunehmen dass die Algorithmen die gleichen Pseudos erzeugen ist imho blauäugig).
    Heise hat -> hier <- einen Beitrag, in dem gleich zu Anfang herausgestellt wird dass

    zwei Begriffe sind hier ganz deutlich voneinander zu unterscheiden:
    - Die Folge der Pseudozufallszahlen
    - Qualität der Pseudozufallszahlen

    Die Folge ist (z.B. Simulation eines Würfels): 1,5,4,6,2,3, ...

    Die Qualität trifft eine Aussage über die Verteilung der Pseudozufallszahlen. Also wie gut nähert sich die Anzahl gleicher Ereignisse an den statistischen Erwartungswert an. Beim Beispiel des Würfels: Wie gut stimmt die Anzahl jeder der sechs Zahlen mit 1/6 der Gesamtwürfe überein. Und wie gut ist der Verlauf über die gesamten Würfe.

    Diese Verteilung und Verlauf hängen auch wieder vom Initiator des Pseudozufallsgenerators ab. Es gibt "gute" und "schlechte" Initiatoren.

    Ein brauchbarer Algorithmus bestand darin, zufällige [x,y]-Paare im Bereich [-1.0,1.0] zu erzeugen und zu prüfen, ob [x,y] innerhalb des Einheitskreises liegt. Das Idealverhältnis (Anzahl der ermittelten [x,y]-Paare zu denen im Einheitskreis) liegt bei 4 : pi.


    Ein anderes Maß für die Qualität besteht darin,
    - bildlich formuliert eine Fläche pixelweise zufallsgesteuert zu füllen, bis jedes Pixel gesetzt ist
    - mathematisch formuliert Zeile und Spalte einer Matrix zufällig auszuwählen und auf einen Wert zu setzen.
    In beiden Fällen ist die Qualität hoch, wenn die Anzahl bis zum Setzen des letzten Pixel / Setzen des letzten Matrixelementes minimal wird.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (1. Mai 2015 um 11:42)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!