छद्म यादृच्छिक जनरेटर पर शैक्षिक कार्यक्रम

मुझे ब्रैक v1.0 की मदद से बनाए गए ब्रेकिंग पासवर्ड के बजाय धूमिल आँकड़ों द्वारा छद्म यादृच्छिक पासवर्ड उत्पन्न करने की आवश्यकता के बारे में सोचने के लिए प्रेरित किया गया था; हालाँकि, पहले सॉफ्टवेयर पासवर्ड जनरेटर को लेने के लिए जो भर में आता है और इसका उपयोग सभी पासवर्डों को बदलने के लिए मूर्खतापूर्ण लगता है। मैंने तैयार जनरेटर कार्यक्रमों का विस्तृत विश्लेषण नहीं किया है, लेकिन मैं आपको कुछ सरल, लेकिन अच्छी गुणवत्ता वाले छद्म आयामी संख्या उत्पन्न करने के गणित से संबंधित जानकारीपूर्ण तथ्य बताऊंगा जो आपको स्वयं सही कार्यक्रम चुनने की अनुमति देगा।

इस वर्ग के किसी भी कार्यक्रम के दिल में एक छद्म यादृच्छिक जनरेटर है , जो कि फ़ंक्शन G: {0,1} n -> {0,1} n + 1 है । दरअसल, छद्म यादृच्छिक जनरेटर का कार्य कुछ प्रारंभिक डेटा के आधार पर कम से कम एक "यादृच्छिकता" प्राप्त करना है। फिर, इस तरह के जनरेटर को कई बार वांछित संख्या प्राप्त करने के लिए चलाया जा सकता है, और उन्हें एक नया पासवर्ड प्राप्त करते हुए, चरित्र सीमा में अनुवाद किया जा सकता है। दरअसल, दो समस्याएं उत्पन्न होती हैं:

प्रारंभिक डेटा

हर सी प्रोग्रामर के लिए एक यादृच्छिक संख्या जनरेटर को शुरू करने के लिए एक काफी परिचित तरीका वर्तमान समय मूल्य के लिए प्रारंभिक मूल्य निर्धारित करना है:
srand ( time(NULL) );

यह विधि बहुत खराब है, यह सिर्फ एक आपदा है! हम time फ़ंक्शन का विवरण पढ़ते हैं - और हम देखते हैं कि यह पूरे सेकंड की संख्या को 00:00 घंटे से शुरू करता है, 1 जनवरी, 1970 यूटीसी।

इस प्रकार, यह जानते हुए कि एक व्यक्ति एक विशिष्ट जनरेटर का उपयोग करता है जो time फ़ंक्शन पर चलता है, यह केवल संसाधन पर पंजीकरण की तारीख (या अंतिम पासवर्ड परिवर्तन, उदाहरण के लिए, साइट पर अंतिम यात्रा के समय) का पता लगाने के लिए पर्याप्त है और 86400 से अधिक मूल्यों (एक दिन में कई सेकंड) पर पुनरावृति करता है। मिनटों में। और इससे कोई फर्क नहीं पड़ता कि एक ही समय में उसके पासवर्ड में विभिन्न रजिस्टरों, संख्याओं, विशेष वर्णों के सैकड़ों वर्ण होते हैं, क्योंकि जनरेटर शुरू होने के समय एकमात्र दुर्घटना होती है।

आरडीटीसीटी फ़ंक्शन के साथ चीजें कुछ हद तक बेहतर होती हैं, जो प्रोसेसर के रीसेट होने के बाद से घड़ी चक्र की संख्या लौटाता है, हालांकि, इसका मान 0 से 2 64 64 तक होता है और विभिन्न चरणों के लिए अलग-अलग प्रोसेसर के लिए असतत होते हैं; अपने व्यामोह को संतुष्ट करने के लिए - यह अच्छा नहीं है। वास्तव में, यादृच्छिकता का यह मार्जिन केवल 6-8 वर्ण उत्पन्न पासवर्ड (उपयोग किए गए वर्ण सेट के आधार पर) के लिए पर्याप्त होगा।

ये सबसे सरल तरीके हैं (और मुझे आशा है कि वे सबसे अधिक बार उपयोग नहीं किए जाते हैं, अन्यथा ऐसे कार्यक्रमों में कोई समझ नहीं है)। एक पर्याप्त अच्छा प्रारंभिक मूल्य क्या दे सकता है?

सबसे पहले, पर्यावरण विश्लेषण: स्टार्टअप पर एक कार्यक्रम, जो उपयोगकर्ता दस्तावेजों का एक हैश पढ़ता है। कोई भी भविष्यवाणी नहीं कर सकता है कि वे क्या होंगे, और हम लगभग किसी भी लंबाई और अच्छी गुणवत्ता के जनरेटर के लिए प्रारंभिक मूल्य प्राप्त करेंगे। एक अपवाद एक व्यावहारिक नंगे कंप्यूटर है जहां कुछ भी नहीं है।

दूसरे, यह उपयोगकर्ता के साथ इंटरएक्टिव है: यह संभवतया व्यर्थ है कि प्रेस करने के लिए एक दर्जन बटन मजबूर करें, यहां तक ​​कि qwerty123456 जैसे पैटर्न के लिए भी लगभग स्पष्ट है (यह पासवर्ड नहीं है, लेकिन एक यादृच्छिक संख्या जनरेटर इनिशियलाइज़र, जो निश्चित रूप से बाद में A6 @ sIp! V0 की तरह एक जटिल पासवर्ड देगा) ] x, लेकिन इसे तोड़ना बहुत सरल होगा, यह जानकर कि आपने जनरेटर प्रोग्राम का उपयोग किया है), लेकिन माउस को चिकोटी देने के लिए एक बहुत अच्छा विकल्प है, सामान्य पैटर्न के बिना यादृच्छिक संख्या की एक बहुत बड़ी मात्रा होगी।

इससे भी बेहतर, कैमरे को चालू करें या माइक्रोफ़ोन से रिकॉर्ड करें - "शोर" डेटा की एक बड़ी धारा, जो हैश फ़ंक्शन से गुजर रही है, मनमाना लंबाई का एक उत्कृष्ट इनिशियलाइज़र देगी।

इसलिए कुछ नैतिकता: यह इतना महत्वपूर्ण नहीं है कि कार्यक्रम पासवर्ड कैसे उत्पन्न करता है, कितना - यह कहां से प्रारंभिक डेटा प्राप्त करता है। यदि कोई अन्तरक्रियाशीलता बिल्कुल नहीं होती है, तो किसी को संदेह करना चाहिए।

सृजन कार्य

वास्तव में, कुछ का आविष्कार करने का कोई मतलब नहीं है। सबसे अच्छा ऑब्जेक्ट जो एक अच्छा मौका दे सकता है वह हैश फ़ंक्शन है

यदि प्रोग्राम कुछ और उपयोग करता है, तो उस पर भरोसा न करने का हर मौका है। X i + 1 = (a * X i + c) mod m जैसा कोई अद्भुत जादू का क्रम कोई विश्वसनीय (क्रिप्टोग्राफिक यादृच्छिकता) नहीं देगा।

हैश कार्यों के लिए, उनके उपयोग की वैधता के लिए काफी सरल औचित्य है। So.

एक फंक्शन F: {0,1} n -> {0,1} m को वन-वे फंक्शन कहा जाता है अगर
1) यह बहुपद समय में कम्प्यूटेशनल है;
2) कोई बहुपद एल्गोरिथ्म नहीं है जो एक अच्छी संभावना (2 -मी से अधिक) के साथ एफ -1 की सही गणना करता है।
यदि m = n, तो ऐसे फ़ंक्शन को एक तरफ़ा क्रमोन्नति कहा जाता है।

सामान्य तौर पर, किसी भी छद्म यादृच्छिक जनरेटर एक तरह से कार्य है।

और कोई भी एकतरफा क्रमपरिवर्तन आपको छद्म यादृच्छिक जनरेटर का निर्माण करने की अनुमति देता है:
जी ({ए , ए , ... ए) = {ए , ए , ... ए, एफ ({{ए , ए , ... ए एन })}।

सामान्य निर्माण योजना इस प्रकार है:

जहां G एक तरह से फ़ंक्शन कॉल है, उदाहरण के लिए MD5, और y ', y, ... आउटपुट यादृच्छिक पासवर्ड के बिट्स हैं।

इसलिए, यह तर्क दिया जाता है कि [*] कि छद्म आयामी जनरेटर का अस्तित्व एक तरफ़ा कार्यों के अस्तित्व से होता है, जो यदि पी = एनपी में मौजूद है।

हैश फ़ंक्शंस (MD5, SHA1, GOST) के विशिष्ट मामलों के लिए, आउटपुट मूल्यों की यादृच्छिकता पर संदेह करने के लिए F- 1 की गणना के लिए बस ऐसे कोई एल्गोरिदम नहीं हैं।

इस प्रकार, छद्म यादृच्छिक पीढ़ी में हैश कार्यों के उपयोग से डरना केवल तभी संभव होगा जब यह अचानक उस पी = एनपी से बाहर हो जाए।

लेकिन यह हमें या तो परेशान नहीं करता है: आखिरकार, यदि हैश फ़ंक्शन के व्युत्क्रम को आसानी से बनाना संभव है, तो डेटाबेस से हैश मान को बदलकर पासवर्ड प्राप्त करना आसान होगा, बजाय छद्म डायनामिक चेन की एक श्रृंखला का निर्माण करने के लिए जो एक सैद्धांतिक पासवर्ड का नेतृत्व करता है जिसे अभी भी मूल्य के अनुपालन के लिए जांचने की आवश्यकता है। आधार से।

एक साधारण थीसिस: यहां तक ​​कि एमडी 5 का उपयोग छद्म यादृच्छिक जनरेटर (पासवर्ड के लिए) के लिए किया जा सकता है!

ब्लॉक सिफर का उपयोग अक्सर छद्म यादृच्छिक जनरेटर, साथ ही अण्डाकार घटता और अंतर समीकरणों के समाधान प्राप्त करने के लिए किया जाता है - और इसके कारण भी हैं, लेकिन मैं (अब के लिए?) उन्हें स्पर्श नहीं करेगा।

[*] एप्लाइड क्रिप्टोग्राफी की हैंडबुक, ए। मेनेज़, पी। वैन ऑर्सचॉट, एस। वनस्टोन।

UDP: एक साफ तस्वीर के लेखक - bad_guy

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


All Articles