Hallo allerseits!
Ich selbst mache keine Kryptographie, aber meine kleine Forschung kann sehr nützlich sein. Ich habe mich für die integrierten Prozessorfunktionen RDRAND und RDSEED entschieden. Der Delphi-Compiler hat eine nicht deklarierte Kennung angegeben. Hmm BMI, BMI2, AVX, AVX2 und sogar AVX-512 existieren seit langem, und die Delphianer entschieden sich für SSE4.2. Es spielt keine Rolle. Wir kompilieren den Code selbst.
Zuerst habe ich überprüft, ob diese Funktionen vom Prozessor unterstützt werden. Natürlich CPUID. Sie können die CPUID ab den ersten Pentium-Prozessoren verwenden. Ich hoffe, niemand denkt daran, CPUID auf einem 486-Computer auszuführen, da es noch nicht vorhanden war. RDRAND und RDSEED vor IvyBridge-Prozessoren existieren übrigens auch nicht.
function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h
Es stellte sich heraus, dass mein Core i7 G6950X Extreme diese Funktionen unterstützt. Also habe ich beschlossen, den Bytecode manuell zu kompilieren. Für erfahrene werde ich den Code REX und REX.W Präfixe geben. Möglicherweise möchten Sie das Ergebnis in ein anderes Register schreiben:
const REX_RDRAND32: Byte = $F0;
Funktionen können sowohl im 32-Bit-Modus als auch im 64-Bit-Modus ausgeführt werden. Deshalb habe ich beides gemacht und sogar in zwei Versionen. Das Ergebnis sind 4 Funktionen:
function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0
Sie sind langsamer als die Bibliotheksfunktion Random. RDRand beträgt ungefähr 35% und RDSeed 50% oder mehr, aber die Qualität der Eindeutigkeit der generierten Werte ist viel höher. Diese Ressource enthält gute Artikel zu diesem Thema, aber meine Mission (Funktionen in Delphi verfügbar zu machen) wurde abgeschlossen. Ich habe es nicht in Lazarus getestet, aber es wird höchstwahrscheinlich ohne Änderungen funktionieren. Am Ende der Funktionsdeklaration müssen Sie nur den Sicherungswort-Assembler hinzufügen.
Hier ist der Quellcode für die Testkonsolenanwendung. Dort finden Sie einen Prototyp der Funktionen Random32 und Random64 basierend auf dem eingebauten Prozessor. Vielleicht haben Sie danach gesucht. Tschüss alle!