![]() |
Frage zu DEC wie Random?
Hallo,
ich habe eine Frage zu DEC. Ich würde gerne einer IInteger Zahl einen Random Werte zuweisen. So der Befehl nrnd funktioniert auch, jedoch generiert er bei jedem Programmstart die gleiche Zufallszahlen. Muss man den Zufallsgenerator auch irgenwie initialisieren. (So wie randomize bei delphi?) |
Re: Frage zu DEC wie Random?
Ja must du. Alles andere wäre auch falsch vom Konzept der Library her.
Neueste Version von Luckie's Server:
Delphi-Quellcode:
Wichtig ist das Unit DECRandom eingebunden wurde um einen sicheren YARROW Zufallsgenerator zu initialisieren. Falls dies nicht erfolgte so benutzen die Funktionen in DECUtls.pas eine Abart des LCGs von Borland (unsicher).
uses NInts, DECRandom, DECUtils;
procedure Test; var A: IInteger; begin NRnd(A, 512); // 512 Bit Zufall erzeugen, 2^512 <= A < 2^513 end; initialization // a.) RandomSeed; // randomisiert den installierten RNG mit Systemtimer ! // b.) randomSeed(Daten, SizeOf(Datan)); // mit eigenen Daten finalization end. Bei Programstart sollte nun dieser RNG randomisiert werden. Man kann den einfachen aber unsicheren Weg gehen indem man RandomSeed() ohne Paramater aufruft. Dann wird intern der RNG per Systemzeit initialisiert, also so wie es Randomize() im Borland RNG macht. Oder man geht den sicheren Weg und erzeugt seine eigenen Seed Daten die dann sicher sein können. Diese sollten mehr als 128 Bit haben und eben sicher sein. Das bedeutet nicht reproduzierbar aber auch nicht echt zufällig sondern beweisbar sicher zufällig für den Angreifer. Es hängt also davon ab WAS du mit den Zufallsdaten später machen möchtest. Einfache Statistiken brauchen keinen sicheren Zufall, probalistische Verfahren benötigen keinen sicheren Zufall. Aber kryptographische Systeme wie die Schlüsselerzeugungen beim RSA benötigen unbedingt einen sicheren Zufall. Die Systemzeit als Seed wäre damit absolut unsicher. Ein Angreifer könnte Pi*Daumen abschätzen wann ein Schlüssel erzeugt wurde und dann mit dem gleichen und bekannten Verfahren wie im DEC diesen Zufall reproduzieren. Als sehr einfach und denoch sicher hat sich die Methode herausgestellt das man den Anwender einfach wahllos par Tasten drücken läst, oder die Maus parmal hin&her bewegen lässt. Diese Daten werden gesammelt und RandomSeed() als Daten übergeben. Verwendet man heutzutage solche mathematisch sicheren Algorithmen, mit einer Library die technisch einwandfrei ist, so bleiben dem Angreifer nur 2 Angriffspunkte real übrig. Erstens die Brute Force Attacke deren Schranken aber so hoch gewählt wurden das sie absolut unpraktikabel ist. Und zweitens der Zufallsgenerator, denn zu jeder Zeit wird in der Kryptographie immer wieder Zufall benötigt. Ist also der RNG schlecht so stellt das eine theoretische Möglichkeit eines Angriffes dar. Der in DECRandom enthalten RNG ist ein YARROW typischer Vertreter (YARROW = Bruce Schneier). Er arbeitet auf Basis der SHA1 secure Hash Funktion auf einem interen Register mit 1024 Bits Größe und einem 32 Bit Counter. Dh. bei jedem Aufruf zur Erzeugung 1 Bytes wird dieser Counter + 128 Bytes Register gehasht und der Hash Digest[1] als Resultat zurückgegeben. Vorher wird aber das 128 Bytes register aktualisiert=modifiziert mit FRegister[Counter mod 128] := FRegister[Counter mod 128] xor Hash.Digest[0]; Das bedeutet: - es können 2^32 Bytes ohne Wiederholungen erzeugt werden bei gleichen Seedwerten. Dies Periode ist garantiert aber nicht die unterste Grenze für eine Wiederholung. - die maximale Periode beträgt 2^1024 Bits auf Grund des Registers und der Hashfunktion. - die Sichheitsrelevante Periode beträgt 2^(160+32) Bits auf Grund der Sichheirheit der hashfunktion (SHA1 = 160 Bits) und dem 32 Bit Counter. - das Interne Register wird demzufolge alle 128 Aufrufe komplett modizifiert worden sein. - um diesen RNG zu benutzen muß nur DECRandom in die Uses Klausel geschrieben werden. - die Aktualisierung des Register ist algorithmisch getrennt vom erzeugten Zufall. Weil zur Modifikation des FRegister der Hash.Digest[0] benutzt wird und für das Zufallsresultat Hash.Digest[1]. Die SHA1 Funktion stellt algorithmisch sicher das diese beiden Bytes zueinander nur indirekt aber zwangsläufig direkt abhängig von dem 1024 Bit Register ist. Das ist quasi die Wirkungsweise jeder sicheren Hashfunktion. Gruß Hagen |
Re: Frage zu DEC wie Random?
Riesen Dank.
Deine Library ist einfach klasse!!! Alle Achtung. PS: Ich brauche nur einen ganz einfachen Zufall. PPS: Danke für die Erklärung. Wenn ich mit Verschlüsselung beschäftige wird sie sicher sehr hilfreich sein. |
Re: Frage zu DEC wie Random?
Hi ich war wohl ein bisschen zu voreilig mit der Annahme, das alles klappt.
Ich finde die Unit DECRandom garnicht; DECUtil hab ich. Aber auch mit der DECUtil findet er RandomSeed nicht. Welche Funktion in DECUtil entspricht denn RandomSeed? PS: Wenn das nicht klappt könntest du mir die DECRandom.dcu schicken? E-Mail: roth-a@gmx.de |
Re: Frage zu DEC wie Random?
Schau mal hier
![]() Datei: DEC_5_1.zip. Michael war so freundlich die neueste Version vom DEC inklusive DECmath auf seinem Server bereitzustellen. Diese Version enthält auch denn DEC Part I neueste Version in Sourcen. Zusätzlich eben das neuste DECMath in binärer Form für Delphi 5,6,7 und 2006. Das ist natürlich dann keine Freeware sondern nur für akademische und private Zwecke angedacht. Entscheidend für die neu Version war ein Gedanke: einfacher, besser, schneller nicht so komplex und denoch universeller ;) Soll heisen: diese Version ist weitestgehend kompatibel zum alten DEC, aber eben nicht 100% kompatibel. Ein solcher Punkt sind die Zufallsgeneratoren und deren Benutzung wie in der alten Version gewohnt. Kurz gesagt: es gibt sie in der neuen Version nicht mehr. Sie wurden ersetzt zu gunsten eines "dynamsich installierbaren" YARROW RNGs. Dabei befindet sich das API für alle solche RNGs immer in der Unit DECUtils.pas. Einfach downloaden, unzippen und im Ordner \DEC\PART_I\ findest du die Sourcen. Gruß Hagen [edit] Übrigens, findest du unit DECRandom.pas ebenfalls als vollständigen Source im diesem ZIP. Da hätte ich mir ja die Beschreibungen oben sparen können. [/edit] |
Re: Frage zu DEC wie Random?
Zitat:
Ich lade mir die Datei gerade runter (modem: dauert seine 10 bis 20 min). Zitat:
Ich probiere es (sobald es runtergeladen hat) aus. Danke für alles. Zitat:
Aber nur so: Bedeutet Freeware nicht genau für "private Zwecke"? Also keine gewerblichen. Zur Sicherheit: Darf ich in Freeware-Programmen dein DEC benutzen? //Kommt natürlich in das Info-Fenster rein. |
Re: Frage zu DEC wie Random?
Zitat:
DEC darf immer in Freewareprogrammen benutzt werden, selbstverständlich. Und in echten Freewareprogrammen ist es auch üblich auf die Verwendung fremder Libraries hinzuweisen. Erst wenn Profit ins Spiel kommt fangen die Späße&Tricksereien an. Gruß Hagen |
Re: Frage zu DEC wie Random?
Delphi-Quellcode:
Klappt prima.
RandomSeed; // randomisiert den installierten RNG mit Systemtimer !
Danke. Tschüss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz