बीक्रिप्ट: Difference between revisions

From Vigyanwiki
(Text)
(Text)
Line 29: Line 29:


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


Provos और Mazières ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर एक्सब्लोफिश (महंगा कुंजी शेड्यूल ब्लोफिश) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से प्रारम्भ होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई राउंड होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक राउंड पिछले राउंड से उपकुंजी स्थिति से प्रारम्भ होता है। सिद्धांत रूप में, यह मानक ब्लोफिश कुंजी शेड्यूल से अधिक मजबूत नहीं है, लेकिन रीकीइंग राउंड की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को मनमाने ढंग से धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है।
प्रोवोस और मज़ीरेस ने इसका फायदा उठाया और इसे और आगे ले गए। उन्होंने ब्लोफिश के लिए एक नया कुंजी सेटअप एल्गोरिथम विकसित किया, परिणामी सिफर <nowiki>''</nowiki>एक्सब्लोफिश<nowiki>''</nowiki> (<nowiki>''</nowiki>महंगा कुंजी शेड्यूल ब्लोफिश<nowiki>''</nowiki>) को डब किया। कुंजी सेटअप मानक ब्लोफिश कुंजी सेटअप के एक संशोधित रूप से प्रारम्भ होता है, जिसमें सभी उपकुंजियों को सेट करने के लिए साल्ट और पासवर्ड दोनों का उपयोग किया जाता है। इसके बाद कई चरण होते हैं जिनमें मानक ब्लोफिश कीइंग एल्गोरिथ्म को वैकल्पिक रूप से साल्ट और पासवर्ड को कुंजी के रूप में उपयोग करते हुए लागू किया जाता है, प्रत्येक चरण पिछले चरण से उपकुंजी स्थिति से प्रारम्भ होता है। सैद्धांतिक रूप में, यह मानक ब्लोफिश कुंजी कार्यसूची से अधिक मजबूत नहीं है, लेकिन रीकीइंग चरण की संख्या विन्यास योग्य है; इसलिए इस प्रक्रिया को स्वेच्छतः  धीमा किया जा सकता है, जो हैश या साल्ट पर क्रूर-बल के हमलों को रोकने में मदद करता है।


== विवरण ==
== विवरण ==


बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट आमतौर पर एक यादृच्छिक मूल्य है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है:
बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट प्रायः एक यादृच्छिक मान है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट्स का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है:


  $2<nowiki><a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]</nowiki>
  $2<nowiki><a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]</nowiki>


उदाहरण के लिए, इनपुट पासवर्ड के साथ <code>abc123xyz</code>, लागत <code>12</code>, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है
उदाहरण के लिए, इनपुट पासवर्ड के साथ<code>abc123xyz,</code> लागत <code>12</code>, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है


  $2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
  $2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
  \__/\/ \____________________/\________________________________________/
  \__/\/ \____________________/\________________________________________/
  एल्ग कॉस्ट सॉल्ट हैश
  एल्ग कॉस्ट       सॉल्ट                           हैश


कहाँ:
जहां:


* <code>$2a$</code>: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट)
* <code>$2a$</code>: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट)
Line 52: Line 52:
* <code>PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW</code>: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग
* <code>PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW</code>: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग


बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है <code>./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</code>,<ref name="bcrypt.c_lines_57-58">{{Cite web|last=Provos|first=Niels|date=13 February 1997|title=bcrypt.c स्रोत कोड, लाइन्स 57-58|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c?rev=1.1&content-type=text/x-cvsweb-markup|access-date=29 January 2022}}</ref> जो इससे अलग है {{IETF RFC|4648}} [[बेस 64]] एन्कोडिंग।
बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है <code>./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</code>,<ref name="bcrypt.c_lines_57-58">{{Cite web|last=Provos|first=Niels|date=13 February 1997|title=bcrypt.c स्रोत कोड, लाइन्स 57-58|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c?rev=1.1&content-type=text/x-cvsweb-markup|access-date=29 January 2022}}</ref> जो {{IETF RFC|4648}} [[बेस 64]] एन्कोडिंग से अलग है।


== संस्करण इतिहास ==
== संस्करण इतिहास ==


  $2$ (1999)
  '''$2$ (1999)'''


मूल बीक्रिप्ट विनिर्देशन के एक उपसर्ग को परिभाषित करता है <code>$2$</code>. यह मॉड्यूलर [[ तहखाना (सी) ]] प्रारूप का अनुसरण करता है<ref>{{cite web|url=https://passlib.readthedocs.io/en/stable/modular_crypt_format.html|title=Modular Crypt Format — Passlib v1.7.1 Documentation|website=passlib.readthedocs.io}}</ref> ओपनबीएसडी पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला प्रारूप:
मूल बीक्रिप्ट विनिर्देशन <code>$2$</code> के एक उपसर्ग को परिभाषित करता है। यह ओपनबीएसडी पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला '''मॉड्यूलर [[ तहखाना (सी) |क्रिप्ट]] प्रारूप<ref>{{cite web|url=https://passlib.readthedocs.io/en/stable/modular_crypt_format.html|title=Modular Crypt Format — Passlib v1.7.1 Documentation|website=passlib.readthedocs.io}}</ref>''' का अनुसरण करता है:


* <code>$1$</code>: MD5-आधारित क्रिप्ट ('md5crypt')
* <code>$1$</code>: MD5-आधारित क्रिप्ट ('md5क्रिप्ट ')
* <code>$2$</code>: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट')
* <code>$2$</code>: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट')
* <code>$sha1$</code>: SHA-1-आधारित क्रिप्ट ('sha1crypt')
* <code>$sha1$</code>: SHA-1-आधारित क्रिप्ट ('sha1क्रिप्ट')
* <code>$5$</code>: SHA-256-आधारित क्रिप्ट ('sha256crypt')
* <code>$5$</code>: SHA-256-आधारित क्रिप्ट ('sha256क्रिप्ट')
* <code>$6$</code>: SHA-512-आधारित क्रिप्ट ('sha512crypt')
* <code>$6$</code>: SHA-512-आधारित क्रिप्ट ('sha512क्रिप्ट')


  $2a$
  '''$2a$'''


मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई चरित्र को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स:
मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई वर्ण को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स:


* स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए
* स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए
* अशक्त टर्मिनेटर सम्मिलित होना चाहिए
* अशक्त टर्मिनेटर सम्मिलित होना चाहिए


इस परिवर्तन के साथ, संस्करण को बदल दिया गया था <code>$2a$</code><ref name="undeadly.org">{{Cite web|url=http://undeadly.org/cgi?action=article&sid=20140224132743|title=bcrypt पासवर्ड हैश बग फिक्स, संस्करण परिवर्तन और परिणाम|website=undeadly.org}}</ref>
इस परिवर्तन के साथ, संस्करण को <code>$2a$ में</code>बदल दिया गया था <ref name="undeadly.org">{{Cite web|url=http://undeadly.org/cgi?action=article&sid=20140224132743|title=bcrypt पासवर्ड हैश बग फिक्स, संस्करण परिवर्तन और परिणाम|website=undeadly.org}}</ref>
$2x$, $2y$ (जून 2011)


जून 2011 में, क्रिप्ट_ब्लोफिश में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले पात्रों को गलत तरीके से संभाल रहा था।<ref>{{cite web|url=http://seclists.org/oss-sec/2011/q2/632|title=oss-sec: CVE request: crypt_blowfish 8-bit character mishandling|first=Solar|last=Designer|website=seclists.org}}</ref> उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने मौजूदा पासवर्ड डेटाबेस को बदलकर अद्यतन करें <code>$2a$</code> साथ <code>$2x$</code>, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने crypt_blowfish एमिट होने का सुझाव भी दिया <code>$2y$</code> निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए।
'''$2x$, $2y$ (जून 2011)'''


कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को अपनाया नहीं। यह संस्करण मार्कर परिवर्तन crypt_blowfish तक सीमित था।
जून 2011 में, '''क्रिप्ट_ब्लोफिश''' में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले वर्णों को गलत तरीके से संभाल रहा था।<ref>{{cite web|url=http://seclists.org/oss-sec/2011/q2/632|title=oss-sec: CVE request: crypt_blowfish 8-bit character mishandling|first=Solar|last=Designer|website=seclists.org}}</ref> उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने वर्तमान पासवर्ड डेटाबेस को बदलकर अद्यतन करें <code>$2a$</code> को<code>$2x$,</code>के साथ बदलते हैं, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए '''क्रिप्ट_ब्लोफिश''' एमिट <code>$2y$</code>होने का सुझाव भी दिया।


$2b$ (फरवरी 2014)
कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को नहीं अपनाया। यह संस्करण मार्कर परिवर्तन '''क्रिप्ट_ब्लोफिश''' तक सीमित था।


बीक्रिप्ट के ओपनबीएसडी कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक अहस्ताक्षरित 8-बिट मान का उपयोग कर रहा था।<ref name="undeadly.org"/><ref>{{cite web|url=http://marc.info/?l=openbsd-misc&m=139320023202696|title='बीक्रिप्ट संस्करण परिवर्तन' - मार्क|website=marc.info}}</ref><ref>{{Cite web|date=17 February 2014|title=bcrypt.c code fix for 2014 bug|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|url-status=live|archive-url=https://web.archive.org/web/20220218062645/https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|archive-date=17 February 2022|access-date=17 February 2022}}</ref> 255 बाइट्स से अधिक के पासवर्ड के लिए, 72 बाइट्स पर छोटा होने के बजाय पासवर्ड को 72 से कम या लंबाई [[मॉड्यूलर अंकगणित]]ीय 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के बजाय 4 बाइट्स पर छोटा कर दिया जाएगा। .
'''$2b$ (फरवरी 2014)'''


बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके पुस्तकालय में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया।
बीक्रिप्ट के ओपनबीएसडी कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक असंकेतित 8-बिट मान का उपयोग कर रहा था।<ref name="undeadly.org" /><ref>{{cite web|url=http://marc.info/?l=openbsd-misc&m=139320023202696|title='बीक्रिप्ट संस्करण परिवर्तन' - मार्क|website=marc.info}}</ref><ref>{{Cite web|date=17 February 2014|title=bcrypt.c code fix for 2014 bug|url=https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|url-status=live|archive-url=https://web.archive.org/web/20220218062645/https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/bcrypt.c.diff?r1=1.26&r2=1.27&f=h|archive-date=17 February 2022|access-date=17 February 2022}}</ref> 255 बाइट्स से अधिक लंबे पासवर्ड के लिए, 72 बाइट्स पर छोटा किए जाने के अपेक्षाकृत पासवर्ड को 72 से कम या लंबाई [[मॉड्यूलर अंकगणित|माड्यूलो]] 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के अपेक्षाकृत 4 बाइट्स पर छोटा कर दिया जाएगा।
 
बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके लाइब्रेरी में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया।


== एल्गोरिथम ==
== एल्गोरिथम ==


नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश (सिफर) का उपयोग करके 64 बार OrpheanBeholderScryDoubt टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (EksBlowfishSetup) फंक्शन से बदल दिया जाता है:
नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश का उपयोग करके 64 बार <nowiki>''</nowiki>''ऑर्फीनबीहोल्डरस्क्रीडाउट<nowiki>''</nowiki>'' टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (ईकेएसब्लोफिशसेटअप) फंक्शन से बदल दिया जाता है:
 
  '''Function''' bcrypt
 
  '''Function''' bcrypt


<span style= color: #004DBB; >'फंक्शन'</span> बीक्रिप्ट
    '''Input:'''
    <span style= color: #004DBB; >'इनपुट:'</span>
       cost:     Number (4..31)                     log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations
       लागत: संख्या (4..31) <विस्तार शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ
       salt:     array of Bytes (16 bytes)           random salt
       साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट
       password: array of Bytes (1..72 bytes)       UTF-8 encoded password
       पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड
     '''Output:'''
     <span style= color: #004DBB; >आउटपुट:</span>
       hash:     array of Bytes (24 bytes)
       हैश: बाइट्स की सरणी (24 बाइट्स)
   
   
     <अवधि शैली = रंग: हरा; >//महंगी कुंजी सेटअप एल्गोरिद्म के साथ ब्लोफ़िश अवस्था को प्रारंभ करें
     //Initialize Blowfish state with expensive key setup algorithm
     <अवधि शैली = रंग: हरा; >//P: 18 उपकुंजियों की सरणी (UInt32[18])
     //P: array of 18 subkeys (UInt32[18])
     <अवधि शैली = रंग: हरा; >//एस: चार प्रतिस्थापन बॉक्स (एस-बॉक्स), एस<sub>0</sub>...एस<sub>3</sub>. प्रत्येक एस-बॉक्स 1,024 बाइट्स (UInt32[256]) है
     //S: Four substitution boxes (S-boxes), S<sub>0</sub>...S<sub>3</sub>. Each S-box is 1,024 bytes (UInt32[256])
     पी, एस ← EksBlowfishSetup(लागत, साल्ट, पासवर्ड)
     ''P'', ''S'' ← EksBlowfishSetup(''cost'', ''salt'', ''password'')  
   
   
     <अवधि शैली = रंग: हरा; >// बार-बार पाठ को एन्क्रिप्ट करें OrpheanBeholderScryDoubt 64 बार
     //Repeatedly encrypt the text "OrpheanBeholderScryDoubt" 64 times
     ctext ← <span style= color: maroon > OrpheanBeholderScryDoubt </span> <span style= color: green; >//24 बाइट्स ==> तीन 64-बिट ब्लॉक</span>
     ''ctext'' ''"OrpheanBeholderScryDoubt"''  //24 bytes ==> three 64-bit blocks
     <span style= color: #004DBB; >'दोहराना'</span> (64)
     '''repeat''' (64)
       ctext ← EncryptECB(P, S, ctext) <span style= color: green; >// ECB मोड</span> में मानक ब्लोफ़िश का उपयोग करके एन्क्रिप्ट करें
       ''ctext'' ← EncryptECB(''P'', ''S'', ''ctext'') //encrypt using standard Blowfish in ECB mode
   
   
     <अवधि शैली = रंग: हरा; >//24-बाइट ctext का परिणाम पासवर्ड हैश है
     //24-byte ''ctext'' is resulting password hash
     <span style= color: #004DBB; >'वापसी'</span> श्रृंखलाबद्ध (लागत, साल्ट, ctext)
     '''return''' Concatenate(''cost'', ''salt'', ''ctext'')


=== महंगा कुंजी सेटअप ===
=== महंगा कुंजी सेटअप ===


बीक्रिप्ट एल्गोरिथम अपने Eksblowfish कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है:
बीक्रिप्ट एल्गोरिथम अपने <nowiki>''</nowiki>ईकेएसब्लोफिश<nowiki>''</nowiki> कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है:


  <span style= color: #004DBB; >फंक्शन</span> EksBlowfishSetup
  '''Function''' EksBlowfishSetup
     <span style= color: #004DBB; > इनपुट:</span>
 
       पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड
     '''Input:'''
       साल्ट: बाइट्स की सरणी (16 बाइट्स) <अवधि शैली = रंग: हरा; >रैंडम सॉल्ट
       password: array of Bytes (1..72 bytes)   UTF-8 encoded password
       लागत: संख्या (4..31) <अवधि शैली = रंग: हरा; > लॉग<sub>2</sub>(पुनरावृत्ति)। उदा. 12 ==> 2<sup>12</sup> = 4,096 पुनरावृत्तियाँ
 
     <span style= color: #004DBB; >आउटपुट:</span>
       salt:     array of Bytes (16 bytes)     random salt
       पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सरणी
       cost:     Number (4..31)                 log<sub>2</sub>(Iterations). e.g. 12 ==> 2<sup>12</sup> = 4,096 iterations
       एस<sub>1</sub>..एस<sub>4</sub>: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > चार SBoxes की सरणी; प्रत्येक SBox 256 UInt32 है (यानी प्रत्येक SBox 1 KiB है)
     '''Output:'''
       P:       array of UInt32               array of 18 per-round subkeys
       S<sub>1</sub>..S<sub>4</sub>:   array of UInt32               array of four SBoxes; each SBox is 256 UInt32 (''i.e.'' each SBox is 1 KiB)
   
   
     <अवधि शैली = रंग: हरा; >//पी के हेक्स अंकों के साथ पी (उपकुंजी), और एस (प्रतिस्थापन बक्से) को प्रारंभ करें
     //Initialize P (Subkeys), and S (Substitution boxes) with the hex digits of pi
     पी, एस इनिशियलस्टेट ()
     ''P'', ''S'' InitialState()  
    
    
     <अवधि शैली = रंग: हरा; >//पासवर्ड और साल्ट के आधार पर P और S को परमिट करें
     //Permute P and S based on the password and salt   
     P, S ← ExpandKey(P, S, साल्ट, पासवर्ड)
     ''P'', ''S'' ← ExpandKey(''P'', ''S'', ''salt'', ''password'')
   
   
     <अवधि शैली = रंग: हरा; >//यह महंगी कुंजी सेटअप का महंगा हिस्सा है।
     //This is the "Expensive" part of the "Expensive Key Setup".
     <अवधि शैली = रंग: हरा; >//अन्यथा कुंजी सेटअप ब्लोफिश के समान है।
     //Otherwise the key setup is identical to Blowfish.
     <span style= color: #004DBB; >'दोहराना'</span> (2<sup>लागत</sup>)
     '''repeat''' (2<sup>''cost''</sup>)
       P, S ← ExpandKey(P, S, 0, पासवर्ड)
       ''P'', ''S'' ← ExpandKey(''P'', ''S'', 0, password)
       P, S ← ExpandKey(P, S, 0, साल्ट)
       ''P'', ''S'' ← ExpandKey(''P'', ''S'', 0, salt)
   
   
     <span style= color: #004DBB; >'रिटर्न'</span> पी, एस
     '''return''' ''P'', ''S''
इनिशियलस्टेट ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-ऐरे और एस-बॉक्स प्रविष्टियों को हेक्साडेसिमल हेक्साडेसिमल <math>\pi</math> के आंशिक भाग के साथ पॉप्युलेट करता है।


इनिशियलस्टेट मूल ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-एरे और एस-बॉक्स प्रविष्टियों को आंशिक भाग के साथ पॉप्युलेट करता है <math>\pi</math> हेक्साडेसिमल में।
=== एक्सपैंड कीय ===
एक्सपैंडकीय फ़ंक्शन निम्न कार्य करता है:


=== कुंजी का विस्तार करें ===
'''Function''' ExpandKey
ExpandKey फ़ंक्शन निम्न कार्य करता है:
    '''Input:'''
      password: array of Bytes (1..72 bytes)  UTF-8 encoded password
      salt:    Byte[16]                      random salt
      P:       array of UInt32              Array of 18 subkeys


<span style= color: #004DBB; >फ़ंक्शन</span> ExpandKey
       S<sub>1</sub>..S<sub>4</sub>:   UInt32[1024]                 Four 1 KB SBoxes
    <span style= color: #004DBB; > इनपुट:</span>
    '''Output:'''
      पासवर्ड: बाइट्स की सरणी (1..72 बाइट्स) <अवधि शैली = रंग: हरा; >UTF-8 एन्कोडेड पासवर्ड
 
      साल्ट: बाइट [16] <विस्तार शैली = रंग: हरा; >रैंडम सॉल्ट
       P:       array of UInt32               Array of 18 per-round subkeys
       पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; > 18 उपकुंजियों की सारणी
       S<sub>1</sub>..S<sub>4</sub>:   UInt32[1024]                 Four 1 KB SBoxes      
      एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes
    <span style= color: #004DBB; >आउटपुट:</span>
       पी: UInt32 की सरणी <विस्तार शैली = रंग: हरा; >18 प्रति-राउंड उपकुंजियों की सारणी
       एस<sub>1</sub>..एस<sub>4</sub>: UInt32 [1024] <विस्तार शैली = रंग: हरा; > चार 1 KB SBoxes
    
    
     <अवधि शैली = रंग: हरा; > // P उपकुंजियों की सरणी में पासवर्ड मिलाएं
     //Mix password into the P subkeys array
     <span style= color: #004DBB; >for</span> ''n'' ← 1 <span style= color: #004DBB; >से</span> 18 <span style= color: #004DBB; >करें</span>
     '''for''' ''n'' ← 1 '''to''' 18 '''do'''
       पी<sub>n</sub> ← पी<sub>n</sub> <span style= color: #004DBB; >xor</span> पासवर्ड[32(n-1)..32n-1] <अवधि शैली= रंग: हरा; >//पासवर्ड को चक्रीय मानें
       P<sub>n</sub> ← P<sub>n</sub> xor ''password''[32(n-1)..32n-1] //treat the password as cyclic
    
    
     <अवधि शैली = रंग: हरा; >//128-बिट साल्ट को 64-बिट के दो हिस्सों (ब्लोफ़िश ब्लॉक आकार) के रूप में लें।
     //Treat the 128-bit salt as two 64-bit halves (the Blowfish block size).
     साल्टहाफ[0] ← साल्ट[0..63] <अवधि शैली= रंग: हरा; >//64-बिट साल्ट कम करें
     saltHalf[0] ← ''salt''[0..63] //Lower 64-bits of salt
     साल्ट आधा [1] ← साल्ट [64..127] <अवधि शैली = रंग: हरा; >//ऊपरी 64-बिट साल्ट
     saltHalf[1] ← ''salt''[64..127] //Upper 64-bits of salt
   
   
     <अवधि शैली = रंग: हरा; >// सभी शून्यों के साथ 8-बाइट (64-बिट) बफर प्रारंभ करें।
     //Initialize an 8-byte (64-bit) buffer with all zeros.
     ब्लॉक ← 0
     block ← 0
   
   
     <अवधि शैली = रंग: हरा; >//आंतरिक स्थिति को पी-बॉक्स में मिलाएं
     //Mix internal state into P-boxes 
     <span style= color: #004DBB; >'for'</span> n ← 1 <span style= color: #004DBB; >'से'</span> 9 <span style= color: #004DBB; >'करें'</span>
     '''for''' ''n'' ← 1 '''to''' 9 '''do'''
       <अवधि शैली = रंग: हरा; >//xor 64-बिट ब्लॉक 64-बिट सॉल्ट हाफ के साथ
       //xor 64-bit ''block'' with a 64-bit salt half
       ब्लॉक ब्लॉक xor साल्ट आधा [(n-1) mod 2] <अवधि शैली = रंग: हरा; >//प्रत्येक पुनरावृत्ति साल्ट आधा [0], और साल्ट आधा [1] के बीच बारी-बारी से
       ''block'' ''block'' xor ''saltHalf''[(n-1) mod 2] //each iteration alternating between ''saltHalf''[0], and ''saltHalf''[1]
   
   
       <अवधि शैली = रंग: हरा; >//वर्तमान कुंजी शेड्यूल का उपयोग करके ब्लॉक एन्क्रिप्ट करें
       //encrypt block using current key schedule
       ब्लॉक एनक्रिप्ट (पी, 'एस', ब्लॉक)
       ''block'' Encrypt(''P'', '''S''', ''block'')  
       पी<sub>2n</sub> ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//ब्लॉक के 32-बिट कम करें
       P<sub>2n</sub> ← ''block''[0..31]     //lower 32-bits of ''block''
       पी<sub>2n+1</sub> ← ब्लॉक [32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट ब्लॉक
       P<sub>2n+1</sub> ← ''block''[32..63] //upper 32-bits ''block''
   
   
     <अवधि शैली = रंग: हरा; >// एन्क्रिप्टेड स्थिति को राज्य के आंतरिक एस-बॉक्स में मिलाएं
     //Mix encrypted state into the internal S-boxes of ''state''
     <span style= color: #004DBB; >'for'</span> i ← 1 <span style= color: #004DBB; >'to'</span> 4 <span style= color: #004DBB; >'करें'</span>
     '''for''' ''i'' ← 1 '''to''' 4 '''do'''
       <span style= color: #004DBB; >'for'</span> n ← 0 <span style= color: #004DBB; >'से'</span> 127 <span style= color: #004DBB; >'करें'</span>
       '''for''' ''n'' ← 0 '''to''' 127 '''do'''
           ब्लॉक एनक्रिप्ट (स्टेट, ब्लॉक <span style= color: #004DBB; >'xor'</span> Salt[64(n-1)..64n-1]) <span style= color: green; >//जैसा कि ऊपर</span>
           ''block'' Encrypt(''state'', ''block'' '''xor''' ''salt''[64(n-1)..64n-1]) //as above
           एस<sub>i</sub>[2एन] ← ब्लॉक [0..31] <अवधि शैली = रंग: हरा; >//32-बिट कम करें
           S<sub>i</sub>[2n]   ''block''[0..31] //lower 32-bits
           एस<sub>i</sub>[2n+1] ← ब्लॉक[32..63] <अवधि शैली = रंग: हरा; >//ऊपरी 32-बिट्स
           S<sub>i</sub>[2n+1] ← ''block''[32..63] //upper 32-bits
     <span style= color: #004DBB; >'वापसी'</span> स्थिति
     '''return''' ''state''
 
इस तरह,<code>एक्सपैंडकीय(''स्थिति'' , 0, ''कुंजी'')</code>नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं।  <code>एक्सपैंडकीय(''स्थिति'' , 0, ''साल्ट'')</code> समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है।
इस तरह, <code>ExpandKey(''state'', 0, ''key'')</code> नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं।  <code>ExpandKey(''state'', 0, ''salt'')</code> समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है।


== उपयोगकर्ता इनपुट ==
== उपयोगकर्ता इनपुट ==
ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक काट देते हैं।
'''ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक काट देते हैं।'''


गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के ASCII एन्कोडेड मान का उपयोग करने की संभावना: अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो 56 तक उपयोगकर्ता द्वारा चुना गया पासवर्ड हो सकता है बाइट्स (कुंजी के ASCII स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।<ref name=provos/>
गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के ASCII एन्कोडेड मान का उपयोग करने की संभावना: अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो 56 तक उपयोगकर्ता द्वारा चुना गया पासवर्ड हो सकता है बाइट्स (कुंजी के ASCII स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।<ref name=provos/>
Line 199: Line 205:
पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट pbkdf2, scrypt, और argon2 से ज्यादा मजबूत है।
पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट pbkdf2, scrypt, और argon2 से ज्यादा मजबूत है।


* 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। आमतौर पर इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।<ref>https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf {{Bare URL PDF|date=March 2022}}</ref> इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है<ref>{{Cite web|url=https://www.asicminervalue.com/miners/goldshell/kd6|title=Goldshell KD6 profitability &#124; ASIC Miner Value}}</ref>
* 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। प्रायः इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।<ref>https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf {{Bare URL PDF|date=March 2022}}</ref> इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है<ref>{{Cite web|url=https://www.asicminervalue.com/miners/goldshell/kd6|title=Goldshell KD6 profitability &#124; ASIC Miner Value}}</ref>
* स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।<ref>{{Cite web|url=https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html#Putting-It-In-Perspective|title=मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता|date=12 March 2014}}</ref> जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है।
* स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।<ref>{{Cite web|url=https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html#Putting-It-In-Perspective|title=मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता|date=12 March 2014}}</ref> जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है।
* आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की ताकत से मेल नहीं खाता या पार नहीं करता है।{{Citation needed|date=April 2022}}
* आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की ताकत से मेल नहीं खाता या पार नहीं करता है।{{Citation needed|date=April 2022}}

Revision as of 14:31, 25 May 2023

bcrypt
General
DesignersNiels Provos, David Mazières
First published1999
Derived fromBlowfish (cipher)
Detail
Digest sizes184 bit
Roundsvariable via cost parameter

बीक्रिप्ट एक पासवर्ड-हैशिंग फ़ंक्शन है, जिसे नील्स प्रोवोस और डेविड माज़िएरेस द्वारा डिज़ाइन किया गया है, जो ब्लोफिश सिफर पर आधारित है और 1999 में यू एस इ एन आई एक्स में प्रस्तुत किया गया था।[1] रेनबो टेबल हमलों से बचाने के लिए एक साल्ट को सम्मिलित करने के अलावा, बीक्रिप्ट एक अनुकूली फ़ंक्शन है: समय के साथ, पुनरावृत्ति की संख्या को इसे धीमा करने के लिए बढ़ाया जा सकता है, इसलिए यह संगणना शक्ति बढ़ने के साथ भी क्रूर-बल खोज हमलों के लिए प्रतिरोधी रहता है।

बीक्रिप्ट फ़ंक्शन ओपनबीएसडी के लिए डिफ़ॉल्ट पासवर्ड हैश एल्गोरिथ्म है[2] और कुछ लिनक्स वितरण जैसे एस यू एस इ लिनक्स के लिए डिफ़ॉल्ट था।[3]

C, C++, Cशार्प, एम्बरकाडेरो डेल्फी, एलिक्सिर, गो,[4] जावा,[5][6] जावास्क्रिप्ट,[7] पर्ल, पीएचपी, पायथन,[8] रूबी, और अन्य भाषाओं में बीक्रिप्ट के कार्यान्वयन हैं।[9]

पृष्ठभूमि

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

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

विवरण

बीक्रिप्ट फ़ंक्शन का इनपुट पासवर्ड स्ट्रिंग (72 बाइट्स तक), एक संख्यात्मक लागत और 16-बाइट (128-बिट) साल्ट मान है। साल्ट प्रायः एक यादृच्छिक मान है। 24-बाइट (192-बिट) हैश की गणना करने के लिए बीक्रिप्ट फ़ंक्शन इन इनपुट्स का उपयोग करता है। बीक्रिप्ट फ़ंक्शन का अंतिम आउटपुट फ़ॉर्म की एक स्ट्रिंग है:

$2<a/b/x/y>$[लागत]$[22 वर्ण साल्ट] [31 वर्ण हैश]

उदाहरण के लिए, इनपुट पासवर्ड के साथabc123xyz, लागत 12, और एक यादृच्छिक साल्ट, बीक्रिप्ट का आउटपुट स्ट्रिंग है

$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
\__/\/ \____________________/\________________________________________/
एल्ग कॉस्ट       सॉल्ट                            हैश

जहां:

  • $2a$: हैश एल्गोरिथम पहचानकर्ता (बीक्रिप्ट)
  • 12: इनपुट लागत (212 यानी 4096 राउंड)
  • R9h/cIPz0gi.URNNX3kh2O: इनपुट साल्ट का एक बेस-64 एनकोडिंग
  • PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW: परिकलित 24 बाइट हैश के पहले 23 बाइट्स का बेस-64 एन्कोडिंग

बीक्रिप्ट में बेस-64 एनकोडिंग तालिका का उपयोग करता है ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,[10] जो RFC 4648 बेस 64 एन्कोडिंग से अलग है।

संस्करण इतिहास

$2$ (1999)

मूल बीक्रिप्ट विनिर्देशन $2$ के एक उपसर्ग को परिभाषित करता है। यह ओपनबीएसडी पासवर्ड फ़ाइल में पासवर्ड संग्रहीत करते समय उपयोग किया जाने वाला मॉड्यूलर क्रिप्ट प्रारूप[11] का अनुसरण करता है:

  • $1$: MD5-आधारित क्रिप्ट ('md5क्रिप्ट ')
  • $2$: ब्लोफिश-आधारित क्रिप्ट ('बीक्रिप्ट')
  • $sha1$: SHA-1-आधारित क्रिप्ट ('sha1क्रिप्ट')
  • $5$: SHA-256-आधारित क्रिप्ट ('sha256क्रिप्ट')
  • $6$: SHA-512-आधारित क्रिप्ट ('sha512क्रिप्ट')
$2a$

मूल विनिर्देश परिभाषित नहीं करता था कि गैर-एएससीआईआई वर्ण को कैसे संभालना है, न ही एक अशक्त टर्मिनेटर को कैसे संभालना है। विनिर्देश को यह निर्दिष्ट करने के लिए संशोधित किया गया था कि हैशिंग स्ट्रिंग्स:

  • स्ट्रिंग UTF-8 एन्कोडेड होनी चाहिए
  • अशक्त टर्मिनेटर सम्मिलित होना चाहिए

इस परिवर्तन के साथ, संस्करण को $2a$ मेंबदल दिया गया था [12]

$2x$, $2y$ (जून 2011)

जून 2011 में, क्रिप्ट_ब्लोफिश में एक बग की खोज की गई थी, जो कि बीक्रिप्ट का एक PHP कार्यान्वयन है। यह 8 बिट सेट वाले वर्णों को गलत तरीके से संभाल रहा था।[13] उन्होंने सुझाव दिया कि सिस्टम प्रशासक अपने वर्तमान पासवर्ड डेटाबेस को बदलकर अद्यतन करें $2a$ को$2x$,के साथ बदलते हैं, यह इंगित करने के लिए कि वे हैश खराब हैं (और पुराने टूटे हुए एल्गोरिदम का उपयोग करने की आवश्यकता है)। उन्होंने निश्चित एल्गोरिथम द्वारा उत्पन्न हैश के लिए क्रिप्ट_ब्लोफिश एमिट $2y$होने का सुझाव भी दिया।

कैनोनिकल ओपनबीएसडी समेत किसी और ने 2x/2y के विचार को नहीं अपनाया। यह संस्करण मार्कर परिवर्तन क्रिप्ट_ब्लोफिश तक सीमित था।

$2b$ (फरवरी 2014)

बीक्रिप्ट के ओपनबीएसडी कार्यान्वयन में एक बग का पता चला था। यह पासवर्ड की लंबाई रखने के लिए एक असंकेतित 8-बिट मान का उपयोग कर रहा था।[12][14][15] 255 बाइट्स से अधिक लंबे पासवर्ड के लिए, 72 बाइट्स पर छोटा किए जाने के अपेक्षाकृत पासवर्ड को 72 से कम या लंबाई माड्यूलो 256 पर छोटा कर दिया जाएगा। उदाहरण के लिए, एक 260 बाइट पासवर्ड को 72 बाइट्स पर छोटा करने के अपेक्षाकृत 4 बाइट्स पर छोटा कर दिया जाएगा।

बीक्रिप्ट ओपनबीएसडी के लिए बनाया गया था। जब उनके लाइब्रेरी में एक बग था, तो उन्होंने संस्करण संख्या को टक्कर देने का फैसला किया।

एल्गोरिथम

नीचे दिया गया बीक्रिप्ट फ़ंक्शन ब्लोफ़िश का उपयोग करके 64 बार ''ऑर्फीनबीहोल्डरस्क्रीडाउट'' टेक्स्ट को एन्क्रिप्ट करता है। बीक्रिप्ट में सामान्य ब्लोफिश की सेटअप फंक्शन को एक महंगे की सेटअप (ईकेएसब्लोफिशसेटअप) फंक्शन से बदल दिया जाता है:

  Function bcrypt
 Function bcrypt
   Input:
      cost:     Number (4..31)                      log2(Iterations). e.g. 12 ==> 212 = 4,096 iterations
      salt:     array of Bytes (16 bytes)           random salt
      password: array of Bytes (1..72 bytes)        UTF-8 encoded password
   Output: 
      hash:     array of Bytes (24 bytes)

   //Initialize Blowfish state with expensive key setup algorithm
   //P: array of 18 subkeys (UInt32[18])
   //S: Four substitution boxes (S-boxes), S0...S3. Each S-box is 1,024 bytes (UInt32[256])
   P, S ← EksBlowfishSetup(cost, salt, password)   

   //Repeatedly encrypt the text "OrpheanBeholderScryDoubt" 64 times
   ctext"OrpheanBeholderScryDoubt"  //24 bytes ==> three 64-bit blocks
   repeat (64)
      ctext ← EncryptECB(P, S, ctext) //encrypt using standard Blowfish in ECB mode

   //24-byte ctext is resulting password hash
   return Concatenate(cost, salt, ctext)

महंगा कुंजी सेटअप

बीक्रिप्ट एल्गोरिथम अपने ''ईकेएसब्लोफिश'' कुंजी सेटअप एल्गोरिथम पर बहुत अधिक निर्भर करता है, जो निम्नानुसार चलता है:

Function EksBlowfishSetup
   Input:
      password: array of Bytes (1..72 bytes)   UTF-8 encoded password
      salt:     array of Bytes (16 bytes)      random salt
      cost:     Number (4..31)                 log2(Iterations). e.g. 12 ==> 212 = 4,096 iterations
   Output: 
      P:        array of UInt32                array of 18 per-round subkeys
      S1..S4:   array of UInt32                array of four SBoxes; each SBox is 256 UInt32 (i.e. each SBox is 1 KiB)

   //Initialize P (Subkeys), and S (Substitution boxes) with the hex digits of pi 
   P, S ← InitialState() 
 
   //Permute P and S based on the password and salt     
   P, S ← ExpandKey(P, S, salt, password)

   //This is the "Expensive" part of the "Expensive Key Setup".
   //Otherwise the key setup is identical to Blowfish.
   repeat (2cost)
      P, S ← ExpandKey(P, S, 0, password)
      P, S ← ExpandKey(P, S, 0, salt)

   return P, S

इनिशियलस्टेट ब्लोफिश एल्गोरिथम की तरह काम करता है, पी-ऐरे और एस-बॉक्स प्रविष्टियों को हेक्साडेसिमल हेक्साडेसिमल के आंशिक भाग के साथ पॉप्युलेट करता है।

एक्सपैंड कीय

एक्सपैंडकीय फ़ंक्शन निम्न कार्य करता है:

Function ExpandKey
   Input:
      password: array of Bytes (1..72 bytes)  UTF-8 encoded password
      salt:     Byte[16]                      random salt
      P:        array of UInt32               Array of 18 subkeys
      S1..S4:   UInt32[1024]                  Four 1 KB SBoxes
    Output: 
      P:        array of UInt32               Array of 18 per-round subkeys
      S1..S4:   UInt32[1024]                  Four 1 KB SBoxes       
 
   //Mix password into the P subkeys array
   for n ← 1 to 18 do
      Pn ← Pn xor password[32(n-1)..32n-1] //treat the password as cyclic
 
   //Treat the 128-bit salt as two 64-bit halves (the Blowfish block size).
   saltHalf[0] ← salt[0..63]  //Lower 64-bits of salt
   saltHalf[1] ← salt[64..127]  //Upper 64-bits of salt

   //Initialize an 8-byte (64-bit) buffer with all zeros.
   block ← 0

   //Mix internal state into P-boxes   
   for n ← 1 to 9 do
      //xor 64-bit block with a 64-bit salt half
      blockblock xor saltHalf[(n-1) mod 2] //each iteration alternating between saltHalf[0], and saltHalf[1]

      //encrypt block using current key schedule
      block ← Encrypt(P, S, block) 
      P2nblock[0..31]      //lower 32-bits of block
      P2n+1block[32..63]  //upper 32-bits block

   //Mix encrypted state into the internal S-boxes of state
   for i ← 1 to 4 do
      for n ← 0 to 127 do
         block ← Encrypt(state, block xor salt[64(n-1)..64n-1]) //as above
         Si[2n]   ← block[0..31]  //lower 32-bits
         Si[2n+1] ← block[32..63]  //upper 32-bits
    return state

इस तरह,एक्सपैंडकीय(स्थिति , 0, कुंजी)नियमित ब्लोफिश की अनुसूची के समान है क्योंकि सभी शून्य साल्ट मूल्य वाले सभी एक्सओआर अप्रभावी हैं। एक्सपैंडकीय(स्थिति , 0, साल्ट) समान है, लेकिन 128-बिट कुंजी के रूप में साल्ट का उपयोग करता है।

उपयोगकर्ता इनपुट

ओपनबीएसडी कार्यान्वयन के बाद, बीक्रिप्ट के कई कार्यान्वयन पासवर्ड को पहले 72 बाइट्स तक काट देते हैं।

गणितीय एल्गोरिथ्म को स्वयं 18 32-बिट उपकुंजियों (72 ऑक्टेट/बाइट्स के बराबर) के साथ आरंभीकरण की आवश्यकता होती है। बीक्रिप्ट का मूल विनिर्देश एल्गोरिदम के लिए उपयोगकर्ता स्थान से संख्यात्मक मानों में टेक्स्ट-आधारित पासवर्ड मैप करने के लिए किसी एक विशेष विधि को अनिवार्य नहीं करता है। पाठ में एक संक्षिप्त टिप्पणी का उल्लेख है, लेकिन यह अनिवार्य नहीं है, केवल एक वर्ण स्ट्रिंग के ASCII एन्कोडेड मान का उपयोग करने की संभावना: अंत में, मुख्य तर्क एक गुप्त एन्क्रिप्शन कुंजी है, जो 56 तक उपयोगकर्ता द्वारा चुना गया पासवर्ड हो सकता है बाइट्स (कुंजी के ASCII स्ट्रिंग होने पर समाप्ति शून्य बाइट सहित)।[1]

ध्यान दें कि उपरोक्त उद्धरण 56 बाइट्स तक के पासवर्ड का उल्लेख करता है, भले ही एल्गोरिथ्म स्वयं 72 बाइट प्रारंभिक मान का उपयोग करता हो। हालांकि प्रोवोस और माजिएरेस छोटे प्रतिबंध का कारण नहीं बताते हैं, वे ब्रूस श्नेयर के ब्लोफिश के मूल विनिर्देश से निम्नलिखित कथन से प्रेरित हो सकते हैं, कुंजी आकार पर 448 [बिट] सीमा यह सुनिश्चित करती है कि [sic] प्रत्येक उपकुंजी का प्रत्येक बिट कुंजी के प्रत्येक बिट पर निर्भर करता है।[16] कार्यान्वयन में पासवर्ड को प्रारंभिक संख्यात्मक मानों में परिवर्तित करने के उनके दृष्टिकोण में भिन्नता है, जिसमें कभी-कभी गैर-ASCII वर्णों वाले पासवर्ड की शक्ति को कम करना भी सम्मिलित है।[17]


अन्य पासवर्ड हैशिंग एल्गोरिदम की तुलना

यह नोट करना महत्वपूर्ण है कि बीक्रिप्ट एक Key_derivation_function|key deriation function (KDF) नहीं है। उदाहरण के लिए, पासवर्ड से 512-बिट कुंजी प्राप्त करने के लिए बीक्रिप्ट का उपयोग नहीं किया जा सकता है। उसी समय, pbkdf2, scrypt, और argon2 जैसे एल्गोरिदम पासवर्ड-आधारित कुंजी व्युत्पत्ति कार्य हैं - जहाँ आउटपुट का उपयोग केवल कुंजी व्युत्पत्ति के बजाय पासवर्ड हैशिंग के उद्देश्य से किया जाता है।

पासवर्ड हैशिंग को आम तौर पर <1000 एमएस पूरा करने की आवश्यकता होती है। इस परिदृश्य में, बीक्रिप्ट pbkdf2, scrypt, और argon2 से ज्यादा मजबूत है।

  • 'पीबीकेडीएफ2': पीबीकेडीएफ2 बीक्रिप्ट से कमजोर है। प्रायः इस्तेमाल किया जाने वाला SHA2 हैशिंग एल्गोरिथम मेमोरी-हार्ड नहीं है। SHA2 को अत्यधिक हल्के होने के लिए डिज़ाइन किया गया है ताकि यह हल्के उपकरणों (जैसे स्मार्ट कार्ड) पर चल सके।[18] इसका मतलब है कि PBKDF2 पासवर्ड स्टोरेज के लिए बहुत कमजोर है, क्योंकि कमोडिटी SHA-2 हैशिंग हार्डवेयर जो प्रति सेकंड खरबों हैश का प्रदर्शन कर सकता है, आसानी से खरीदा जाता है[19]
  • स्क्रीप्ट: 4 एमबी से कम मेमोरी आवश्यकताओं के लिए स्क्रीप्ट बीक्रिप्ट से कमजोर है।[20] जीपीयू आधारित हमलों (पासवर्ड भंडारण के लिए) के खिलाफ रक्षा के तुलनीय स्तर को प्राप्त करने के लिए स्क्रिप को लगभग 1000 गुना मेमोरी की आवश्यकता होती है।
  • आर्गन2: आर्गन2 1 सेकेंड से कम रन टाइम (यानी पासवर्ड ऑथेंटिकेशन के लिए) के लिए बीक्रिप्ट से कमजोर है। Argon2 > = ~ 1000ms रनटाइम (जो पासवर्ड हैशिंग के लिए अनुपयुक्त है, लेकिन कुंजी-व्युत्पत्ति के लिए पूरी तरह से स्वीकार्य है) तक बीक्रिप्ट की ताकत से मेल नहीं खाता या पार नहीं करता है।[citation needed]
  • पफरफिश2 बीक्रिप्ट का विकास है जो ट्यून करने योग्य मेमोरी फुटप्रिंट (जैसे स्क्रीप्ट और आर्गन2) का उपयोग करता है, न कि बीक्रिप्ट के फिक्स्ड 4 केबी मेमोरी फुटप्रिंट का। स्क्रीप्ट या आर्गन2 के समान, पफरफिश2 अधिक मेमोरी का उपयोग करके अपनी कठिनाई प्राप्त करता है। स्क्रीप्ट और आर्गन2 के विपरीत, पफरफिश2 केवल सीपीयू कोर के एल2 कैश में काम करता है। जबकि स्क्रीप्ट और आर्गन 2 अपनी मेमोरी कठोरता को बेतरतीब ढंग से बहुत सी रैम तक पहुंच कर प्राप्त करते हैं, पफरफिश 2 खुद को सीपीयू कोर के लिए उपलब्ध समर्पित एल 2 कैश तक ही सीमित करता है। यह स्क्रीप्ट और आर्गन2 की तुलना में कस्टम हार्डवेयर में लागू करना और भी कठिन बना देता है। पफरफिश 2 का आदर्श स्मृति पदचिह्न कोर के लिए उपलब्ध कैश का आकार है (उदाहरण के लिए इंटेल एल्डर लेक के लिए 1.25 एमबी[21]) यह पफरफिश2 को जीपीयू या एएसआईसी के प्रति अधिक प्रतिरोधी बनाता है।

आलोचना

अधिकतम पासवर्ड लंबाई

बीक्रिप्ट की अधिकतम पासवर्ड लंबाई 72 बाइट्स है। यह अधिकतम ExpandKey फ़ंक्शन के पहले ऑपरेशन से आता है xor's पासवर्ड के साथ 18 4-बाइट उपकुंजी (पी):

पी1..पी18 ← पी1..पी18 xor पासवर्डबाइट्स

पासवर्ड (जो UTF-8 एन्कोडेड है), 72-बाइट लंबा होने तक दोहराया जाता है। उदाहरण के लिए, का एक पासवर्ड:

correct horse battery staple␀ (29 बाइट्स)

तब तक दोहराया जाता है जब तक यह 18 पी प्रति-राउंड उपकुंजियों के 72-बाइट से मेल नहीं खाता:

correct horse battery staple␀correct horse battery staple␀correct horse (72 बाइट्स)

सबसे खराब स्थिति में एक पासवर्ड 18 वर्णों तक सीमित होता है, जब प्रत्येक वर्ण को UTF-8 एन्कोडिंग के 4 बाइट्स की आवश्यकता होती है। उदाहरण के लिए:

𐑜𐑝𐑟𐑥𐑷𐑻𐑽𐑾𐑿𐑿𐑰𐑩𐑛𐑙𐑘𐑙𐑒𐑔 (18 अक्षर, 72 बाइट्स)

पासवर्ड हैश ट्रंकेशन

बीक्रिप्ट एल्गोरिथम में 24-बाइट टेक्स्ट को बार-बार एन्क्रिप्ट करना सम्मिलित है:

OrpheanBeholderScryDoubt (24-बाइट्स)

यह सिफरटेक्स्ट के 24 बाइट्स उत्पन्न करता है, जैसे:

85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9 a4 (24-बाइट्स)

विहित ओपनबीएसडी कार्यान्वयन इसे 23 बाइट्स तक काट देता है:

85 20 af 9f 03 3d b3 8c 08 5f d2 5e 2d aa 5e 84 a2 b9 61 d2 f1 29 c9 (23-बाइट्स)

यह स्पष्ट नहीं है कि विहित कार्यान्वयन परिणामी पासवर्ड हैश से 8-बिट क्यों हटाता है।

रेडिक्स -64 एन्कोडेड होने पर ये 23 बाइट 31 वर्ण बन जाते हैं:

fQAtluK7q2uGV7HcJYncfII3WbJvIai (31-अक्षर)

बेस 64 एन्कोडिंग वर्णमाला

कैनोनिकल ओपनबीएसडी कार्यान्वयन द्वारा उपयोग की जाने वाली एन्कोडिंग क्रिप्ट (सी) के समान बेस 64 वर्णमाला का उपयोग करती है, जो है ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.[10]इसका अर्थ है कि एन्कोडिंग अधिक सामान्य बेस64#कार्यान्वयन और इतिहास के साथ संगत नहीं है।[citation needed]

यह भी देखें

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

संदर्भ

  1. 1.0 1.1 Provos, Niels; Mazières, David; Talan Jason Sutton 2012 (1999). "एक भविष्य-अनुकूलनीय पासवर्ड योजना". Proceedings of 1999 USENIX Annual Technical Conference: 81–92.
  2. "रेपो के लिए पहले काम की प्रतिबद्धता". 13 Feb 1997.
  3. "SUSE Security Announcement: (SUSE-SA:2011:035)". 23 August 2011. Archived from the original on 4 March 2016. Retrieved 20 August 2015. SUSE's crypt() implementation supports the blowfish password hashing function (id $2a) and system logins by default also use this method.
  4. "पैकेज बीक्रिप्ट". godoc.org.
  5. "jBCrypt - जावा के लिए मजबूत पासवर्ड हैशिंग". www.mindrot.org (in English). Retrieved 2017-03-11.
  6. "bcrypt - bcrypt पासवर्ड हैश फंक्शन का जावा स्टैंडअलोन कार्यान्वयन". github.com (in English). Retrieved 2018-07-19.
  7. "bcryptjs". npm.
  8. Stufft, Donald (14 October 2021). "bcrypt: Modern password hashing for your software and your servers" – via PyPI.
  9. Whitlock, David (21 September 2021). "Bcrypt Elixir: bcrypt password hashing algorithm for Elixir". GitHub. riverrun.
  10. 10.0 10.1 Provos, Niels (13 February 1997). "bcrypt.c स्रोत कोड, लाइन्स 57-58". Retrieved 29 January 2022.
  11. "Modular Crypt Format — Passlib v1.7.1 Documentation". passlib.readthedocs.io.
  12. 12.0 12.1 "bcrypt पासवर्ड हैश बग फिक्स, संस्करण परिवर्तन और परिणाम". undeadly.org.
  13. Designer, Solar. "oss-sec: CVE request: crypt_blowfish 8-bit character mishandling". seclists.org.
  14. "'बीक्रिप्ट संस्करण परिवर्तन' - मार्क". marc.info.
  15. "bcrypt.c code fix for 2014 bug". 17 February 2014. Archived from the original on 17 February 2022. Retrieved 17 February 2022. {{cite web}}: |archive-date= / |archive-url= timestamp mismatch (help)
  16. Schneier, Bruce (December 1993). "Fast Software Encryption, Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Cambridge Security Workshop Proceedings. Springer-Verlag: 191–204.
  17. "jBCrypt security advisory". 1 February 2010. And "Changes in CRYPT_BLOWFISH in PHP 5.3.7". php.net.
  18. https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf[bare URL PDF]
  19. "Goldshell KD6 profitability | ASIC Miner Value".
  20. "मैं स्क्रीप्ट की सिफारिश क्यों नहीं करता". 12 March 2014.
  21. "Product Specifications".
  22. http://bcrypt.sourceforge.net bcrypt file encryption program homepage
  23. "Android के लिए bcrypt APK - Droid मुखबिर पर निःशुल्क डाउनलोड". droidinformer.org.
  24. "T2 package - trunk - bcrypt - A utility to encrypt files". t2sde.org.
  25. "Oracle GoldenGateのライセンス". docs.oracle.com.


बाहरी संबंध