Halo semuanya!
Saya sendiri tidak melakukan kriptografi, tetapi penelitian kecil saya mungkin berguna. Saya memutuskan untuk berurusan dengan fungsi prosesor bawaan RDRAND dan RDSEED. Kompilator Delphi mengatakan pengidentifikasi yang tidak diumumkan. Hmm BMI, BMI2, AVX, AVX2, dan bahkan AVX-512 sudah lama ada, dan orang-orang Delphia memilih SSE4.2. Itu tidak masalah. Kami mengkompilasi kode sendiri.
Pertama saya melakukan pengecekan untuk dukungan fungsi-fungsi ini oleh prosesor. Tentu saja, CPUID. Anda dapat menggunakan CPUID dimulai dengan prosesor Pentium pertama. Saya harap tidak ada yang berpikir menjalankan CPUID pada mesin 486, karena belum ada di sana. By the way, RDRAND dan RDSEED sebelum prosesor IvyBridge juga tidak ada.
function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h
Ternyata Core i7 G6950X Extreme saya mendukung fitur ini. Jadi saya memutuskan untuk mengkompilasi bytecode secara manual. Untuk yang berpengalaman saya akan memberikan kode awalan REX dan REX.W. Anda mungkin ingin menulis hasilnya di register yang berbeda:
const REX_RDRAND32: Byte = $F0;
Fungsi dapat bekerja dalam mode 32-bit dan dalam mode 64-bit. Karena itu, saya melakukan keduanya, dan bahkan dalam dua versi. Hasilnya adalah 4 fungsi:
function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0
Mereka lebih lambat dalam kecepatan daripada fungsi perpustakaan acak. RDRand sekitar 35%, dan RDSeed adalah 50% atau lebih, tetapi kualitas keunikan dari nilai yang dihasilkan jauh lebih tinggi. Ada beberapa artikel bagus tentang hal ini pada sumber ini, tetapi misi saya (untuk membuat fungsi tersedia dalam Delphi) telah selesai. Saya tidak mengujinya di Lazarus, tetapi kemungkinan besar itu akan berhasil tanpa perubahan. Di akhir deklarasi fungsi, Anda hanya perlu menambahkan assembler kata cadangan.
Berikut adalah kode sumber untuk aplikasi konsol uji. Di sana Anda dapat menemukan prototipe fungsi Random32 dan Random64 berdasarkan pada prosesor bawaan. Mungkin ini yang Anda cari. Selamat tinggal semuanya!