encryption एईएस एन्क्रिप्शन मोड(सीबीसी ईसीबी सीटीआर ओसीबी सीएफबी) कैसे चुनें?




aes (6)

उनमें से कौन सा परिस्थितियों में प्राथमिकता दी जाती है?

मैं विभिन्न तरीकों के लिए मूल्यांकन क्रेटिएरिया की सूची देखना चाहता हूं, और शायद प्रत्येक मानदंड की प्रयोज्यता की चर्चा।

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

देखें कि "मूल्यांकन मानदंडों की सूची और प्रत्येक मानदंड की प्रयोज्यता" से मेरा क्या मतलब है ??

यह वास्तव में प्रोग्रामिंग से संबंधित नहीं है लेकिन यह एल्गोरिदम संबंधित है।



परिचय का एक शब्द: यह उत्तर आंशिक रूप से [encryption] टैग के तहत देखे गए कई प्रश्नों का उत्तर था जो लोगों को पूरी तरह से असुरक्षित कोड तैनात करते हुए दिखाते थे। इन प्रोग्रामर को संबोधित करते हुए मैंने निम्नलिखित उद्घाटन वाक्य को क्रिप्टोग्राफ़ी के दृष्टिकोण पर पुनर्विचार करने के लिए पर्याप्त रूप से हिलाकर रखने के इरादे से लिखा, इससे पहले कि उनके आवेदन पर हमला किया जाए। यदि आप यहां सीखने की प्रक्रिया में हैं, तो यह बहुत अच्छा है! हमें क्रिप्टोग्राफी में पृष्ठभूमि ज्ञान के साथ और प्रोग्रामर की आवश्यकता है। पूछना जारी रखें और एक मूक जोड़ें "अभी तक!" मेरे खोलने के लिए:

अगर आपको यह प्रश्न पूछने की ज़रूरत है, तो शायद आपको एक सुरक्षित प्रणाली को लागू करने के लिए क्रिप्टोग्राफी के बारे में पर्याप्त जानकारी नहीं है।

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

सालों बाद आपकी सेवा वास्तव में महत्वपूर्ण आकार में बढ़ी है, एक आईटी सुरक्षा विशेषज्ञ आपको जिम्मेदार प्रकटीकरण में संपर्क करता है। वह आपको बता रही है कि वह पैडिंग ऑरैकल हमले का उपयोग करके आपकी सभी कुकीज़ को डिक्रिप्ट कर सकती है, क्योंकि यदि आपका कोड किसी भी तरह टूटा हुआ है तो आपका कोड एक त्रुटि पृष्ठ उत्पन्न करता है।

यह एक काल्पनिक परिदृश्य नहीं है: माइक्रोसॉफ्ट के पास कुछ साल पहले तक एएसपी.नेट में यह सही दोष था।

समस्या यह है कि क्रिप्टोग्राफी के संबंध में बहुत सारे नुकसान हैं और यह एक ऐसी प्रणाली का निर्माण करना बेहद आसान है जो आम आदमी के लिए सुरक्षित दिखता है लेकिन जानकार हमलावर के लिए तोड़ने के लिए तुच्छ है।

यदि आपको डेटा एन्क्रिप्ट करने की आवश्यकता है तो क्या करें

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

यदि कोई उच्च स्तरीय अमूर्तता उपलब्ध नहीं है तो उच्च स्तरीय क्रिप्टो लाइब्रेरी का उपयोग करें। एक प्रमुख उदाहरण NaCl और कई भाषा बाइंडिंग के साथ एक पोर्टेबल कार्यान्वयन Sodium । ऐसी लाइब्रेरी का उपयोग करने के लिए आपको एन्क्रिप्शन मोड इत्यादि की परवाह नहीं है, लेकिन आपको उच्च स्तर के अबास्ट्रक्शन के मुकाबले उपयोग विवरणों के बारे में और भी सावधान रहना होगा, जैसे कभी दो बार उपयोग न करें।

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

शैक्षणिक उद्देश्यों के लिए मोड की तुलना

केवल एन्क्रिप्शन:

  • मोड जिन्हें पैडिंग की आवश्यकता होती है : उदाहरण की तरह, पैडिंग आम तौर पर खतरनाक हो सकती है क्योंकि यह पैडिंग ऑरैकल हमलों की संभावना को खोलती है। सबसे आसान बचाव डिक्रिप्शन से पहले प्रत्येक संदेश को प्रमाणीकृत करना है। निचे देखो।
    • ईसीबी स्वतंत्र रूप से डेटा के प्रत्येक ब्लॉक को एन्क्रिप्ट करता है और उसी सादे टेक्स्ट ब्लॉक के परिणामस्वरूप एक ही सिफरटेक्स्ट ब्लॉक होगा। ईसीबी विकिपीडिया पेज पर ईसीबी एन्क्रिप्टेड टक्स छवि पर एक नज़र डालें, यह देखने के लिए कि यह एक गंभीर समस्या क्यों है। मुझे किसी भी उपयोग के मामले की जानकारी नहीं है जहां ईसीबी स्वीकार्य होगा।
    • सीबीसी में एक चतुर्थ होता है और इस प्रकार संदेश को एन्क्रिप्ट करने पर हर बार यादृच्छिकता की आवश्यकता होती है, संदेश के एक हिस्से को बदलने के बाद परिवर्तन के बाद सबकुछ फिर से एन्क्रिप्ट करना आवश्यक होता है, एक सिफरटेक्स्ट ब्लॉक में ट्रांसमिशन त्रुटियों को सादे टेक्स्ट को पूरी तरह से नष्ट कर देता है और अगले ब्लॉक, डिक्रिप्शन के डिक्रिप्शन को बदल देता है समांतर / एन्क्रिप्शन नहीं किया जा सकता है, सादा पाठ एक निश्चित डिग्री के लिए लचीला है - यह एक समस्या हो सकती है
  • स्ट्रीम सिफर मोड : ये मोड डेटा की एक छद्म यादृच्छिक स्ट्रीम उत्पन्न करते हैं जो सादे पाठ पर निर्भर हो सकता है या नहीं। इसी तरह सिफर को आम तौर पर स्ट्रीम करने के लिए, उत्पन्न छद्म यादृच्छिक धारा को सिफरटेक्स्ट उत्पन्न करने के लिए सादे टेक्स्ट के साथ एक्सओआरड किया जाता है। जैसा कि आप याद करते हैं कि आप यादृच्छिक धारा के कई बिट्स का उपयोग कर सकते हैं, आपको पैडिंग की आवश्यकता नहीं है। इस सादगी का नुकसान यह है कि एन्क्रिप्शन पूरी तरह से malleable , जिसका अर्थ यह है कि डिक्रिप्शन किसी हमलावर द्वारा किसी सादे टेक्स्ट पी 1, एक सिफरटेक्स्ट सी 1 और छद्म यादृच्छिक स्ट्रीम आर के रूप में पसंद किया जा सकता है और हमलावर एक अंतर डी चुन सकता है कि एक ciphertext c2 = c1⊕d का डिक्रिप्शन p2 = p1⊕d है, p2 = c2⊕r = (c1 ⊕ d) ⊕ r = d ⊕ (c1 ⊕ r)। इसके अलावा एक ही छद्म यादृच्छिक स्ट्रीम को दो सिफरेट्स c1 = p1⊕r और c2 = p2⊕r के लिए कभी भी दो बार उपयोग नहीं किया जाना चाहिए, एक हमलावर दो सादे टेक्स्ट के xor की गणना कर सकता है c1⊕c2 = p1⊕r⊕p2⊕r = p1⊕p2। इसका मतलब यह भी है कि संदेश को बदलने के लिए पूर्ण पुन: कटाव की आवश्यकता होती है, अगर मूल संदेश किसी हमलावर द्वारा प्राप्त किया जा सकता था। निम्नलिखित सभी भाप सिफर मोडों को केवल ब्लॉक सिफर के एन्क्रिप्शन ऑपरेशन की आवश्यकता होती है, इसलिए सिफर के आधार पर यह अत्यधिक संकुचित वातावरण में कुछ (सिलिकॉन या मशीन कोड) स्थान बचा सकता है।
    • सीटीआर सरल है, यह एक छद्म यादृच्छिक धारा बनाता है जो सादे पाठ से स्वतंत्र है, अलग-अलग छद्म यादृच्छिक धाराएं विभिन्न नॉनिस / चतुर्थों से गिनती करके प्राप्त की जाती हैं जो अधिकतम संदेश लंबाई से गुणा होती हैं ताकि ओवरलैप रोका जा सके, nonces संदेश एन्क्रिप्शन का उपयोग कर रहा है प्रति संदेश यादृच्छिकता के बिना संभव, डिक्रिप्शन और एन्क्रिप्शन समानांतर पूर्ण हो जाते हैं, ट्रांसमिशन त्रुटियां केवल गलत बिट्स को प्रभावित करती हैं और कुछ भी नहीं
    • ओएफबी सादे टेक्स्ट से स्वतंत्र छद्म यादृच्छिक धारा भी बनाता है, अलग-अलग छद्म यादृच्छिक धाराओं को प्रत्येक संदेश के लिए एक अलग गैर या यादृच्छिक चतुर्थ से शुरू करके प्राप्त किया जाता है, न तो एन्क्रिप्शन और न ही डिक्रिप्शन समानांतर होता है, क्योंकि प्रति संदेश के बिना nonces संदेश एन्क्रिप्शन का उपयोग कर सीटीआर संभव है यादृच्छिकता, सीटीआर संचरण त्रुटियों के साथ ही गलत बिट्स को प्रभावित करता है और कुछ भी नहीं
    • सीएफबी की छद्म यादृच्छिक धारा सादा पाठ पर निर्भर करती है, प्रत्येक संदेश के लिए एक अलग नॉन या यादृच्छिक IV की आवश्यकता होती है, जैसे सीटीआर और ओएफबी गैर संदेश संदेश एन्क्रिप्शन का उपयोग प्रति संदेश यादृच्छिकता के बिना संभव है, डिक्रिप्शन समानांतर / एन्क्रिप्शन नहीं है, ट्रांसमिशन त्रुटियों को पूरी तरह से निम्नलिखित ब्लॉक को नष्ट करें, लेकिन केवल मौजूदा ब्लॉक में गलत बिट्स को प्रभावित करें
  • डिस्क एन्क्रिप्शन मोड : ये मोड फ़ाइल सिस्टम अबास्ट्रक्शन के नीचे डेटा एन्क्रिप्ट करने के लिए विशिष्ट हैं। दक्षता के कारण डिस्क पर कुछ डेटा बदलने के लिए केवल एक डिस्क ब्लॉक (512 बाइट्स या 4 किब) पर पुनः लिखना आवश्यक है। वे इस जवाब के दायरे से बाहर हैं क्योंकि उनके पास दूसरे की तुलना में काफी अलग उपयोग परिदृश्य हैं। ब्लॉक स्तर डिस्क एन्क्रिप्शन को छोड़कर उन्हें किसी भी चीज़ के लिए उपयोग न करें । कुछ सदस्य: एक्सएक्स, एक्सटीएस, एलआरडब्ल्यू।

प्रमाणीकृत एन्क्रिप्शन:

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

  • सीसीएम सीटीआर मोड और सीबीसी-मैक का एक साधारण संयोजन है। प्रति ब्लॉक दो ब्लॉक सिफर एन्क्रिप्शन का उपयोग करना बहुत धीमा है।
  • ओसीबी तेजी से है लेकिन पेटेंट से घिरा हुआ है। मुफ्त में (आजादी के रूप में) या गैर-सैन्य सॉफ्टवेयर पेटेंट धारक ने एक मुफ्त लाइसेंस दिया है , हालांकि।
  • जीसीएम सीटीआर मोड और जीएचएएसएच का एक बहुत तेज लेकिन तर्कसंगत जटिल संयोजन है, जो गैलोइस क्षेत्र पर एक मैक 2 ^ 128 तत्वों के साथ है। महत्वपूर्ण नेटवर्क मानकों जैसे टीएलएस 1.2 में इसका व्यापक उपयोग एक विशेष निर्देश द्वारा दर्शाया गया है इंटेल ने जीएचएएसएच की गणना तेज करने के लिए पेश किया है।

सिफ़ारिश करना:

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


  1. ईसीबी के अलावा कुछ भी।
  2. यदि सीटीआर का उपयोग करना है, तो यह आवश्यक है कि आप प्रत्येक संदेश के लिए एक अलग चतुर्थ का उपयोग करें, अन्यथा आप हमलावर के साथ दो सिफरटेक्स लेने और संयुक्त अनएन्क्रिप्टेड सादे टेक्स्ट प्राप्त करने में सक्षम होने के साथ समाप्त होते हैं। इसका कारण यह है कि सीटीआर मोड अनिवार्य रूप से एक ब्लॉक सिफर को स्ट्रीम सिफर में बदल देता है, और स्ट्रीम सिफर का पहला नियम कभी भी एक ही कुंजी + IV का दो बार उपयोग नहीं करना है।
  3. वास्तव में इसमें कोई फर्क नहीं पड़ता कि मोड को कार्यान्वित करना कितना मुश्किल है। कुछ मोडों को केवल एन्क्रिप्टिंग दिशा में काम करने के लिए ब्लॉक सिफर की आवश्यकता होती है। हालांकि, एईएस समेत अधिकांश ब्लॉक सिफर, डिक्रिप्शन को लागू करने के लिए अधिक कोड नहीं लेते हैं।
  4. सभी सिफर मोड के लिए, प्रत्येक संदेश के लिए अलग-अलग IVs का उपयोग करना महत्वपूर्ण है यदि आपके संदेश पहले कई बाइट्स में समान हो सकते हैं, और आप नहीं चाहते कि हमलावर इसे जान सके।

आप व्यापक रूप से उपलब्ध होने के आधार पर चुनना चाहेंगे। मेरे पास एक ही सवाल था और यहां मेरे सीमित शोध के परिणाम हैं।

हार्डवेयर सीमाएं

STM32L (low energy ARM cores) from ST Micro support ECB, CBC,CTR GCM
CC2541 (Bluetooth Low Energy) from TI supports ECB, CBC, CFB, OFB, CTR, and CBC-MAC

ओपन सोर्स सीमाएं

Original rijndael-api source  - ECB, CBC, CFB1
OpenSSL - command line CBC, CFB, CFB1, CFB8, ECB, OFB
OpenSSL - C/C++ API    CBC, CFB, CFB1, CFB8, ECB, OFB and CTR
EFAES lib [1] - ECB, CBC, PCBC, OFB, CFB, CRT ([sic] CTR mispelled)  
OpenAES [2] - ECB, CBC 

[1] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library

[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip


मुझे एक पहलू पता है: हालांकि सीबीसी प्रत्येक ब्लॉक के लिए IV को बदलकर बेहतर सुरक्षा प्रदान करता है, लेकिन यह यादृच्छिक रूप से एक्सेस की गई एन्क्रिप्टेड सामग्री (जैसे एन्क्रिप्टेड हार्ड डिस्क) पर लागू नहीं होता है।

तो, यादृच्छिक पहुंच के लिए अनुक्रमिक धाराओं और ईसीबी के लिए सीबीसी (और अन्य अनुक्रमिक मोड) का उपयोग करें।


  • यदि एक ही कुंजी के साथ डेटा के एक से अधिक ब्लॉक एन्क्रिप्ट करते हैं तो ईसीबी का उपयोग नहीं किया जाना चाहिए।

  • सीबीसी, ओएफबी और सीएफबी समान हैं, हालांकि ओएफबी / सीएफबी बेहतर है क्योंकि आपको केवल एन्क्रिप्शन की आवश्यकता है और डिक्रिप्शन नहीं है, जो कोड स्पेस को बचा सकता है।

  • यदि आप सीबीसी / ओएफबी / सीएफबी के बजाय अच्छा समांतरता (यानी गति) चाहते हैं तो सीटीआर का उपयोग किया जाता है।

  • यदि आप एक यादृच्छिक सुलभ डेटा (हार्ड डिस्क या रैम की तरह) एन्कोड कर रहे हैं तो एक्सटीएस मोड सबसे आम है।

  • ओसीबी अब तक का सबसे अच्छा तरीका है, क्योंकि यह एक ही पास में एन्क्रिप्शन और प्रमाणीकरण की अनुमति देता है। हालांकि संयुक्त राज्य अमेरिका में पेटेंट हैं।

केवल एक चीज जिसे आपको वास्तव में जानना है कि ईसीबी का उपयोग तब तक नहीं किया जाना चाहिए जब तक आप केवल 1 ब्लॉक एन्क्रिप्ट नहीं कर रहे हों। यदि आप यादृच्छिक रूप से एक्सेस किए गए डेटा को एन्क्रिप्ट कर रहे हैं, न कि स्ट्रीम के लिए एक्सटीएस का उपयोग किया जाना चाहिए।

  • जब भी आप एन्क्रिप्ट करते हैं, आपको हमेशा अद्वितीय IV उपयोग करना चाहिए, और उन्हें random होना चाहिए। यदि आप गारंटी नहीं दे सकते कि वे random , तो ओसीबी का उपयोग करें क्योंकि इसे केवल एक IV आवश्यकता है, IV नहीं, और इसमें एक अलग अंतर है। अगर कोई व्यक्ति अगले अनुमान लगा सकता है तो एक nonce सुरक्षा सुरक्षा नहीं छोड़ता है, एक IV इस समस्या का कारण बन सकता है।