Krypto-Zufallsgenerator



  • Nein da spricht nichts dagegen. Ich dachte nur, die USB Lösung wäre vielleicht besser geeignet. Kennst du eine Anleitung wie man das am besten anstellt?



  • s. z.B. RDRAND: Compilers

    Edit: als Windows spezifische Funktion CryptGenRandom bzw. die neuere API BCryptGenRandom.
    Und unter Linux /dev/hwrng.



  • Witzig, dass ich sogar schon CryptGenRandom mal verwendet hatte 😅

    Mich hat es halt immer etwas abgestoßen, dass die Function durchs OS und somit ja von Microsoft kommt. Ist halt die Frage wem man da jetzt mehr trauen kann. Glaube deshalb bin ich sogar mal ursprünglich auf die Idee gekommen nach einer anderen Lösung zu schauen und dadurch wiederum kam der USB-Gedanke.




  • Mod

    @Zhavok sagte in Krypto-Zufallsgenerator:

    Mich hat es halt immer etwas abgestoßen, dass die Function durchs OS und somit ja von Microsoft kommt. Ist halt die Frage wem man da jetzt mehr trauen kann. Glaube deshalb bin ich sogar mal ursprünglich auf die Idee gekommen nach einer anderen Lösung zu schauen und dadurch wiederum kam der USB-Gedanke.

    Wem kannst du trauen? Das ist die große Frage, nicht wahr? Microsoft und Intel vermutlich nur begrenzt. Aber kannst du Kryptohardware trauen, die du nicht selber gebaut hast? So etwas kauft schließlich primär jemand, der etwas interessantes verbergen möchte, aber selber wenig Ahnung hat. Entsprechend sind schon viele Fälle von Hintertüren (oder verdächtigen Bugs…) bekannt.

    Du musst übrigens nicht unbedingt gezielt die Hardwaregeneratoren des Systems ansprechen. Unter Linux ist so etwas wie /dev/urandom auch sicher für alle üblichen kryptografischen Zwecke, und /dev/random sogar für unübliche Zwecke. Die speisen sich, wenn vorhanden, auch aus diesen Hardwarequellen, aber eben nicht nur, so dass nicht alles aus der gleichen Quelle kommt. Und den Code kannst du auch angucken. Windows hat gewiss ähnliches, weil das halt übliche Anwendungszwecke sind, die ein Betriebssystem erfüllen muss. Aber da kannst du den Code nicht angucken. Wenn du jetzt nicht unbedingt etwas speziell vorm CIA verstecken musst, dann wird's sicher auch reichen. Aber dann solltest du primär erst überhaupt nicht Windows benutzen.



  • Mir geht's dabei eigentlich garnicht drum etwas zu verbergen sondern einfach um den Spaß der Sache. Habe vor kurzer Zeit begonnen mich etwas mit dem Thema Kryptologie zu beschäftigen und nach der Umsetzung des AES wäre das nächste interessante Ziel natürlich einen Inhalt so zu verschlüsseln, dass er definitiv sicher ist. Dabei steht der Spaß zwar im Vordergrund aber das Ziel soll natürlich trotzdem erfüllt werden. Vielleicht sollte ich mir auch anschauen ob man selbst einen Microcontroller für so etwas basteln kann oder welche Quellen man noch für Zufallszahlen gebräuchlich sind. Vielleicht erscheint mir auch der Hersteller meiner Soundkarte vertrauenswürdiger als Intel 😉
    Dahingehend gibt's ja auch Möglichkeiten zur Generierung.





  • Wenn ich irgendwo wirklich extrem gute Zufallszahlen für cryptographische Zwecke brauchen würde, würde ich vermutlich versuchen alle möglichen Quellen zusammenzumischen. Darunter definitiv auch CryptGenRandom bzw. /dev/urandom, aber eben nicht nur. QueryPerformanceCounter, rdtsc, GetTickCount64, CLOCK_BOOTTIME, CLOCK_MONOTONIC, aktuelle Systemzeit, Mauskoordinaten wenn sie zur Verfügung stehen, die Computer-SID, die MAC-Adressen aller Netzwerkkarten, meine PID, meine TID, ein paar Speicher Werte (z.B. freier Speicher), evtl. auch den aktuell freien Speicher irgend einer Disk. Man könnte auch ein paar hundert mallocs machen und die Adressen und einen Hash über den Speicherinhalt mit aufnehmen. Zusätzlich bei jedem Schritt noch mitstoppen wie lange er gedauert hat (mit rdtsc bzw. QueryPerformanceCounter - auf jeden Fall so genau wie möglich). Wenn Netzwerk zur Verfügung steht und es etwas länger dauern darf evtl. einen Request zu einem Server schicken bzw. einen Server anpingen und die Zeit bis zur Antwort messen. Dinge dieser Art. Bzw. wenn ich mir ansehe wie verrauscht Ergebnisse von Micro-Benchmarks üblicherweise sind... vielleicht auch einfach irgend einen kleinen Micro-Benchmark bauen, den 100k~1Mio mal laufen lassen, alle 10~100 Steps die Zeit messen und jeden Zeitstempel mit aufnehmen.

    Das alles packt man zusammen in ein Array und rechnet z.B. einen SHA256 darüber. Vorausgesetzt es ist zumindest eine halbwegs gute Zufallsquelle darunter (wie z.B. CryptGenRandom - mit oder ohne Schwachstellen) sollte das Ergebnis etwas sein was für alle praktischen Zwecke sicher ist.

    Bzw. wenn ich weniger Grund hätte paranoid zu sein würde ich einfach CryptGenRandom bzw. /dev/urandom nehmen und mich damit zufrieden geben. Vielleicht maximal noch eine high-resolution Clock (QueryPerformanceCounter/rdtsc oder auch einfach std::high_resolution_clock) dazunehmen und mit SHA zusammenmischen für's gute Gewissen.



  • Besten Dank @Swordfish und @hustbaer . Das sind beides sehr interessante Ansätze. Ich denke ich werde mir vieles von @hustbaer rausziehen und nutzen. Zusätzlich vielleicht mit der Hardware von @Swordfish . Das sollte dann wohl zufällig genug sein. 👍🏻



  • @Zhavok Ja, ich glaube nicht, dass das bis 100€ kostet. Vielleicht versuchst du etwas aus Verbatim zu finden.


Log in to reply