مرحبا بالجميع!
أنا نفسي لا أفعل التشفير ، لكن بحثي الصغير قد يكون مفيدًا جدًا. قررت التعامل مع وظائف المعالج المدمج في RDRAND و RDSEED. وقال دلفي مترجم معرف غير معلنة. هم BMI ، BMI2 ، AVX ، AVX2 ، وحتى AVX-512 موجودة منذ فترة طويلة ، واستقر دلفيان على SSE4.2. لا يهم نحن نجمع الشفرة بأنفسنا.
أولاً ، قمت بالتحقق من دعم المعالج لهذه الوظائف. بالطبع ، CPUID. يمكنك استخدام CPUID بدءًا من معالجات Pentium الأولى. آمل ألا يفكر أحد في تشغيل CPUID على جهاز 486 ، لأنه لم يكن هناك حتى الآن. بالمناسبة ، RDRAND و RDSEED قبل معالجات IvyBridge أيضًا غير موجودة.
function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h
اتضح أن جهاز Core i7 G6950X Extreme يدعم هذه الميزات. إذن ، قررت أن أجمِّع الرمز الثانوي يدويًا. لذوي الخبرة ، سأقدم كودات REX و REX.W. قد ترغب في كتابة النتيجة في سجل مختلف:
const REX_RDRAND32: Byte = $F0;
يمكن أن تعمل الوظائف في وضع 32 بت وفي وضع 64 بت. لذلك ، فعلت كلا ، وحتى في نسختين. والنتيجة هي 4 وظائف:
function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0
فهي أبطأ في السرعة من وظيفة المكتبة عشوائية. RDRand حوالي 35 ٪ ، و RDSeed هو 50 ٪ أو أكثر ، ولكن جودة تفرد القيم التي تم إنشاؤها أعلى بكثير. هناك بعض المقالات الجيدة حول هذا الموضوع حول هذا المورد ، لكن مهمتي (لتوفير وظائف متوفرة في دلفي) قد اكتملت. لم أختبرها في لازاروس ، لكنها ستعمل على الأرجح دون أي تغييرات. في نهاية إعلان الوظيفة ، تحتاج فقط إلى إضافة أداة تجميع الكلمات الاحتياطية.
هنا هو شفرة المصدر لتطبيق وحدة الاختبار. هناك يمكنك العثور على نموذج أولي للوظائف Random32 و Random64 استنادًا إلى المعالج المضمن. ربما هذا هو ما كنت تبحث عنه. وداعا للجميع!