स्क्रीप्ट

क्रिप्टोग्राफी में, स्क्रीप्ट (उच्चारण ईएसएस क्रिप्ट ) कॉलिन पर्सिवल द्वारा मार्च 2009 में बनाया गया एक पासवर्ड-आधारित कुंजी व्युत्पत्ति कार्य है, जो मूल रूप से टार्स्नैप ऑनलाइन बैकअप सेवा के लिए है। एल्गोरिथ्म को विशेष रूप से बड़ी मात्रा में मेमोरी की आवश्यकता के कारण बड़े पैमाने कस्टम हार्डवेयर हमला हमलों को करने के लिए महंगा बनाने के लिए डिज़ाइन किया गया था। 2016 में, इंटरनेट इंजीनियरिंग टास्क फोर्स द्वारा आरएफसी 7914 के रूप में स्क्रीप्ट एल्गोरिथम प्रकाशित किया गया था। स्क्रीप्ट का एक सरलीकृत संस्करण कई cryptocurrency द्वारा -का-प्रमाण काम योजना के रूप में उपयोग किया जाता है, जिसे पहले टेनेब्रिक्स में आर्टफोर्ज़ नामक अज्ञात प्रोग्रामर द्वारा कार्यान्वित किया गया था और उसके बाद फेयरब्रिक्स और लाइटकॉइन द्वारा जल्द ही लागू किया गया था।

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

पिछले पासवर्ड-आधारित KDFs (जैसे कि RSA प्रयोगशालाओं से लोकप्रिय PBKDF2) में अपेक्षाकृत कम संसाधन की माँग होती है, जिसका अर्थ है कि उन्हें प्रदर्शन करने के लिए विस्तृत हार्डवेयर या बहुत अधिक मेमोरी की आवश्यकता नहीं होती है। इसलिए वे आसानी से और सस्ते में हार्डवेयर में लागू होते हैं (उदाहरण के लिए एक एप्लिकेशन-विशिष्ट एकीकृत सर्किट या यहां तक ​​कि एक क्षेत्र में प्रोग्राम की जा सकने वाली द्वार श्रंखला पर)। यह एक हमलावर को पर्याप्त संसाधनों के साथ हार्डवेयर में एल्गोरिथ्म के सैकड़ों या हजारों कार्यान्वयनों का निर्माण करके बड़े पैमाने पर समानांतर हमले शुरू करने की अनुमति देता है और प्रत्येक कुंजी स्थान के एक अलग उपसमुच्चय की खोज करता है। यह उपलब्ध कार्यान्वयन की संख्या से क्रूर-बल हमले को पूरा करने के लिए आवश्यक समय की मात्रा को विभाजित करता है, संभवतः इसे उचित समय सीमा तक कम कर देता है।

एल्गोरिथम की संसाधन मांगों को बढ़ाकर ऐसे प्रयासों में बाधा डालने के लिए स्क्रीप्ट फ़ंक्शन को डिज़ाइन किया गया है। विशेष रूप से, एल्गोरिथ्म को अन्य पासवर्ड-आधारित KDFs की तुलना में बड़ी मात्रा में मेमोरी का उपयोग करने के लिए डिज़ाइन किया गया है, एक हार्डवेयर कार्यान्वयन के आकार और लागत को और अधिक महंगा बनाना, और इसलिए वित्तीय संसाधनों की दी गई राशि के लिए एक हमलावर द्वारा उपयोग की जा सकने वाली समानता की मात्रा को सीमित करना।

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

क्योंकि वेक्टर के तत्व एल्गोरिथम से उत्पन्न होते हैं, प्रत्येक तत्व को आवश्यकतानुसार मक्खी पर उत्पन्न किया जा सकता है, एक समय में केवल एक तत्व को स्मृति में संग्रहित किया जाता है और इसलिए स्मृति आवश्यकताओं में काफी कमी आती है। हालांकि, प्रत्येक तत्व की पीढ़ी कम्प्यूटेशनल रूप से महंगी होने का इरादा है, और फ़ंक्शन के निष्पादन के दौरान तत्वों को कई बार एक्सेस करने की उम्मीद है। इस प्रकार बड़ी मेमोरी आवश्यकताओं से छुटकारा पाने के लिए गति में एक महत्वपूर्ण समझौता है।

इस प्रकार का स्पेस-टाइम ट्रेडऑफ़|टाइम-मेमोरी ट्रेड-ऑफ़ अक्सर कंप्यूटर एल्गोरिदम में मौजूद होता है: अधिक मेमोरी का उपयोग करने की कीमत पर गति बढ़ाई जा सकती है, या अधिक संचालन करने और अधिक समय लेने की लागत पर मेमोरी आवश्यकताओं को कम किया जा सकता है। स्क्रीप्ट के पीछे का विचार जानबूझकर इस व्यापार-बंद को किसी भी दिशा में महंगा बनाना है। इस प्रकार एक हमलावर एक कार्यान्वयन का उपयोग कर सकता है जिसके लिए कई संसाधनों की आवश्यकता नहीं होती है (और इसलिए सीमित व्यय के साथ बड़े पैमाने पर समानांतर हो सकता है) लेकिन बहुत धीमी गति से चलता है, या एक ऐसे कार्यान्वयन का उपयोग करता है जो अधिक तेज़ी से चलता है लेकिन बहुत बड़ी मेमोरी आवश्यकताएं होती हैं और इसलिए अधिक महंगी होती हैं समानांतर।

एल्गोरिथम
<अवधि शैली = रंग: नीला; >फंक्शन स्क्रीप्ट <अवधि शैली = रंग: नीला; > इनपुट्स: इस एल्गोरिदम में निम्नलिखित पैरामीटर शामिल हैं: पासफ़्रेज़: बाइट्स <अवधि शैली = रंग: हरा; > हैश किए जाने वाले वर्णों की स्ट्रिंग नमक (क्रिप्टोग्राफी): बाइट्स <अवधि शैली = रंग: हरा; >रैंडम वर्णों की स्ट्रिंग जो इंद्रधनुष तालिका  हमलों से बचाने के लिए हैश को संशोधित करती है कॉस्टफैक्टर (एन): पूर्णांक <अवधि शैली = रंग: हरा; >सीपीयू/मेमोरी लागत पैरामीटर - 2 की शक्ति होनी चाहिए (उदा. 1024) BlockSizeFactor (आर): पूर्णांक <अवधि शैली = रंग: हरा; >ब्लॉकसाइज पैरामीटर, जो अनुक्रमिक मेमोरी रीड साइज और परफॉर्मेंस को फाइन-ट्यून करता है। (8 आमतौर पर प्रयोग किया जाता है) समांतरता कारक (पी): पूर्णांक <अवधि शैली = रंग: हरा; >समानांतरीकरण पैरामीटर। (1.232-1 * hLen/MFlen) वांछित केलेन (डीकेलेन): पूर्णांक <अवधि शैली = रंग: हरा; > बाइट्स में वांछित कुंजी लंबाई (व्युत्पन्न कुंजी के ऑक्टेट में इच्छित आउटपुट लंबाई; एक सकारात्मक पूर्णांक संतोषजनक dkLen ≤ (2)32− 1) * hLen.)       hLen: पूर्णांक <अवधि शैली = रंग: हरा; >हैश फ़ंक्शन के ऑक्टेट में लंबाई (SHA256 के लिए 32).        MFlen: पूर्णांक <अवधि शैली = रंग: हरा; > मिक्सिंग फंक्शन के आउटपुट के ऑक्टेट में लंबाई (नीचे SMix)। RFC7914 में r * 128 के रूप में परिभाषित।     <अवधि शैली = रंग: नीला; >'आउटपुट:'        DerivedKey: बाइट्स <अवधि शैली = रंग: हरा; > बाइट्स की सरणी, DesiredKeyLen long     <अवधि शैली = रंग: हरा; >चरण 1. महंगा नमक उत्पन्न करें     ब्लॉकसाइज़ ← 128*ब्लॉकसाइज़फ़ैक्टर <स्पैन स्टाइल= रंग:हरा; >// SMix मिक्सिंग फ़ंक्शन आउटपुट की लंबाई (बाइट्स में) (उदा. 128*8 = 1024 बाइट्स)    <अवधि शैली = रंग: हरा; > प्रारंभिक 128*BlockSizeFactor*p बाइट डेटा उत्पन्न करने के लिए PBKDF2 का उपयोग करें (जैसे 128*8*3 = 3072 बाइट्स)     <अवधि शैली = रंग: हरा; >परिणाम को p तत्वों की एक सरणी के रूप में मानें, प्रत्येक प्रविष्टि बाइट्स को अवरुद्ध कर रही है (उदाहरण के लिए 3 तत्व, प्रत्येक 1024 बाइट्स)     [बी0...बीp−1] → पीबीकेडीएफ2HMAC-SHA256(पासफ़्रेज़, नमक, 1, ब्लॉक आकार*समानता फ़ैक्टर)    <अवधि शैली = रंग: हरा; > 'रोमिक्स' फ़ंक्शन का उपयोग करके प्रत्येक ब्लॉक को 'बी' कॉस्टफैक्टर समय में मिलाएं (प्रत्येक ब्लॉक को समानांतर में मिश्रित किया जा सकता है)     <अवधि शैली = रंग: नीला; >'for' i ← 0 'to' p-1 'करें'        बीi ← रोमिक्स (बीi, लागत कारक)    <अवधि शैली = रंग: हरा; >बी के सभी तत्व हमारा नया महंगा नमक है    महंगा नमक ← बी0∥B1∥B2∥ ... ∥Bp-1 <अवधि शैली = रंग: हरा; >// जहां ∥ संयोजन है     <अवधि शैली = रंग: हरा; >चरण 2. बाइट्स की वांछित संख्या उत्पन्न करने के लिए PBKDF2 का उपयोग करें, लेकिन महंगे नमक का उपयोग करके हमने अभी उत्पन्न किया <अवधि शैली = रंग: नीला; >'वापसी' PBKDF2HMAC-SHA256(पासफ़्रेज़, महंगा साल्ट, 1, डेसर्डकेलेन);

जहाँ PBKDF2(P, S, c, dkLen) अंकन को RFC 2898 में परिभाषित किया गया है, जहाँ c एक पुनरावृति संख्या है।

इस संकेतन का उपयोग RFC 7914 द्वारा PBKDF2 के c = 1 के उपयोग को निर्दिष्ट करने के लिए किया जाता है। 'फंक्शन' रोमिक्स (ब्लॉक, इटरेशन) <अवधि शैली = रंग: हरा; > X की पुनरावृति प्रतियाँ बनाएँ एक्स ← ब्लॉक 'के लिए' i ← 0 'से' पुनरावृत्तियों-1 'करो' वीi ← एक्स एक्स ← ब्लॉकमिक्स(एक्स) for i ← 0 to Iterations−1 do      जे ← इंटीग्रिफ़ाई (एक्स) मॉड इटरेशन एक्स ← ब्लॉकमिक्स (एक्स एक्स या वीj) वापसी एक्स

जहाँ RFC 7914 परिभाषित करता है Integerify(X) एक्स के अंतिम 64 बाइट्स को छोटे-अंत पूर्णांक ए के रूप में व्याख्या करने के परिणामस्वरूप1.

चूँकि पुनरावृत्तियाँ N की शक्ति के 2 के बराबर होती हैं, X के अंतिम 64 बाइट्स में से केवल पहला सीलिंग (N / 8) बाइट्स, जिसे एक छोटे-अंत पूर्णांक A के रूप में व्याख्या किया गया है2, वास्तव में गणना करने के लिए आवश्यक हैं.

फंक्शन ब्लॉकमिक्स (बी): <अवधि शैली = रंग: हरा; >ब्लॉक बी r 128-बाइट चंक्स है (जो 2r 64-बाइट चंक्स के बराबर है) आर ← लंबाई(बी) / 128; <अवधि शैली = रंग: हरा; >B को 2r 64-बाइट चंक्स की एक सरणी के रूप में मानें [बी0...बी2r-1] ← बी एक्स ← बी2r−1 i ← 0 से 2r−1 के लिए एक्स ← सालसा20/8(एक्स एक्सोर बीi) <विस्तार शैली = रंग: हरा; >// सालसा20/8 हैश 64-बाइट्स से 64-बाइट्स तक वाईi ← एक्स वापसी ← वाई0∥Y2∥...∥Y2r−2 ∥ और1∥Y3∥...∥Y2r−1 जहां साल्सा20/8 साल्सा20 का 8-राउंड संस्करण है।

क्रिप्टोक्यूरेंसी
का उपयोग करता है स्क्रीप्ट का उपयोग कई क्रिप्टोकरंसीज में प्रूफ-ऑफ-वर्क एल्गोरिथम के रूप में किया जाता है (अधिक सटीक रूप से, हशकाश  प्रूफ-ऑफ-वर्क एल्गोरिथम में हैश फ़ंक्शन के रूप में)। यह पहली बार टेनेब्रिक्स (सितंबर 2011 में जारी) के लिए लागू किया गया था और लिटकोइन और कुत्ता सिक्का के आधार के रूप में कार्य किया, जिसने इसके स्क्रीप्ट एल्गोरिथम को भी अपनाया।  क्रिप्ट का उपयोग करने वाली क्रिप्टोकरेंसी का खनन अक्सर ग्राफिक्स प्रोसेसिंग यूनिट (जीपीयू) पर किया जाता है क्योंकि सीपीयू की तुलना में जीपीयू में काफी अधिक प्रोसेसिंग पावर (कुछ एल्गोरिदम के लिए) होती है। इससे नवंबर और दिसंबर 2013 के महीनों में इन मुद्राओं की बढ़ती कीमतों के कारण उच्च अंत जीपीयू की कमी हो गई। मई 2014 तक, विशेष अनुप्रयोग-विशिष्ट एकीकृत सर्किट माइनिंग हार्डवेयर स्क्रीप्ट-आधारित क्रिप्टोकरेंसी के लिए उपलब्ध है।

उपयोगिता
स्क्रीप्ट उपयोगिता मई 2009 में कॉलिन पर्सिवल द्वारा स्क्रीप्ट कुंजी व्युत्पत्ति समारोह के प्रदर्शन के रूप में लिखी गई थी। यह अधिकांश Linux और BSD वितरणों में उपलब्ध है।

यह भी देखें

 * Argon2 - 2015 में पासवर्ड हैशिंग प्रतियोगिता का विजेता
 * bcrypt - ब्लोफिश-आधारित पासवर्ड-हैशिंग फ़ंक्शन
 * क्रिप्ट (सी) # ब्लोफिश-आधारित योजना - ब्लोफिश-आधारित क्रॉस-प्लेटफ़ॉर्म फ़ाइल एन्क्रिप्शन उपयोगिता 2002 में विकसित हुई
 * तहखाना (सी) - यूनिक्स सी लाइब्रेरी फ़ंक्शन
 * [[ ccrypt (यूनिक्स)]] - यूनिक्स उपयोगिता
 * सीक्रिप्ट - उपयोगिता
 * कुंजी व्युत्पत्ति समारोह
 * चाबी खींचना
 * mcrypt - उपयोगिता
 * PBKDF2 - एक व्यापक रूप से इस्तेमाल किया जाने वाला मानक पासवर्ड-आधारित कुंजी व्युत्पत्ति फ़ंक्शन 2
 * PufferFish - एक कैश-हार्ड पासवर्ड हैशिंग फ़ंक्शन जो बेहतर bcrypt डिज़ाइन पर आधारित है
 * स्पेस-टाइम ट्रेडऑफ़

बाहरी संबंध

 * The scrypt page on the Tarsnap website.
 * The original scrypt paper.