RDRAND और RDSEED CPU फ़ंक्शंस अब उपलब्ध हैं

सभी को नमस्कार!

मैं स्वयं क्रिप्टोग्राफी नहीं करता हूं, लेकिन मेरा थोड़ा शोध बहुत काम आ सकता है। मैंने अंतर्निहित प्रोसेसर फ़ंक्शन RDRAND और RDSEED से निपटने का निर्णय लिया। डेल्फी कंपाइलर ने एक अघोषित पहचानकर्ता कहा। हम्म। बीएमआई, बीएमआई 2, एवीएक्स, एवीएक्स 2, और यहां तक ​​कि एवीएक्स -51 लंबे समय से अस्तित्व में है, और डेलफियंस एसएसई 4.2 पर बसे हैं। इससे कोई फर्क नहीं पड़ता हम खुद कोड संकलित करते हैं।

पहले मैंने प्रोसेसर द्वारा इन कार्यों के समर्थन के लिए एक चेक बनाया। बेशक, सीपीयूआईडी। आप पहले Pentium प्रोसेसर के साथ CPUID का उपयोग कर सकते हैं। मुझे उम्मीद है कि कोई भी 486 मशीन पर सीपीयूआईडी चलाने के बारे में नहीं सोचता, क्योंकि यह अभी तक नहीं हुआ है। वैसे, IDRBridge प्रोसेसर से पहले RDRAND और RDSEED भी मौजूद नहीं है।

function CPU_support_RDRAND: Boolean; asm mov rax, $01 cpuid test ecx, 40000000h // 30-  setne al end; function CPU_support_RDSEED: Boolean; asm mov rcx, 0 mov rax, $07 // №7 cpuid test ebx, 40000h // 18-  setne al end; 

यह पता चला कि मेरा कोर i7 G6950X एक्सट्रीम इन सुविधाओं का समर्थन करता है। तो फिर मैंने मैन्युअल रूप से बायटेकोड को संकलित करने का फैसला किया। अनुभवी के लिए मैं REX और REX। कोड उपसर्ग दे दूंगा। आप एक अलग रजिस्टर में परिणाम लिखना चाह सकते हैं:

 const REX_RDRAND32: Byte = $F0; //(11b:REG, 110b:OPCODE, 000b:EAX) REX_RDSEED32: Byte = $F8; //(11b:REG, 111b:OPCODE, 000b:EAX) REX_W_RDRAND64: Byte = $48; //(11b:REG, 110b:OPCODE, 000b:RAX) REX_W_RDSEED64: Byte = $48; //(11b:REG, 111b:OPCODE, 000b:RAX) 

फ़ंक्शंस 32-बिट मोड में और 64-बिट मोड में दोनों काम कर सकते हैं। इसलिए, मैंने दोनों किया, और यहां तक ​​कि दो संस्करणों में भी। परिणाम 4 कार्य है:

 function RDRand32: DWord; asm @Retry: db $0F, $C7, $F0 //RDRAND EAX (CF = 1    ) jnc @Retry end; function RDSeed32: DWord; asm @Retry: db $0F, $C7, $F8 //RDSEED EAX (CF = 1    ) jnc @Retry end; function RDRand64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F0 //RDRAND RAX (CF = 1    ) jnc @Retry end; function RDSeed64: QWord; asm .NOFRAME @Retry: db $48, $0F, $C7, $F8 //RDSEED RAX (CF = 1    ) jnc @Retry end; 

वे लाइब्रेरी फ़ंक्शन रैंडम की तुलना में धीमी गति से होते हैं। RDRand लगभग 35% है, और RDSeed 50% या अधिक है, लेकिन उत्पन्न मूल्यों की विशिष्टता की गुणवत्ता बहुत अधिक है। इस संसाधन पर इस विषय पर कुछ अच्छे लेख हैं, लेकिन मेरा मिशन (डेल्फी में उपलब्ध कार्य करने के लिए) पूरा हो चुका है। मैंने इसे लाजर में परीक्षण नहीं किया, लेकिन यह बिना किसी बदलाव के सबसे अधिक संभावना है। फ़ंक्शन घोषणा के अंत में, आपको बस बैकअप शब्द कोडांतरक जोड़ना होगा।

यहाँ परीक्षण कंसोल एप्लिकेशन के लिए स्रोत कोड है। वहां आप अंतर्निहित प्रोसेसर के आधार पर रैंडम 32 और रैंडम 64 के कार्यों का प्रोटोटाइप पा सकते हैं। शायद यही आप ढूंढ रहे थे। सबको बाय!

Source: https://habr.com/ru/post/hi441392/


All Articles