मेरी टीम को जावा में लिखे गए एंड्रॉइड एप्लिकेशन के संदर्भ में द्विआधारी डेटा (byte[]
के रूप में संग्रहीत) को एन्क्रिप्ट करने के लिए एक समाधान विकसित करने की आवश्यकता है। एन्क्रिप्टेड डेटा प्रसारित और विभिन्न तरीकों से संग्रहीत किया जाएगा, जिसके दौरान डेटा भ्रष्टाचार से इनकार नहीं किया जा सकता है। आखिर में एक और एंड्रॉइड एप्लिकेशन (जावा में फिर से लिखा गया) को डेटा को डिक्रिप्ट करना होगा।एंड्रॉइड, एईएस-जीसीएम या सादे एईएस पर डेटा एन्क्रिप्शन?
यह पहले से ही तय किया गया है कि एन्क्रिप्शन एल्गोरिदम को 256 बिट्स की कुंजी के साथ एईएस होना चाहिए। हालांकि मैं एक एईएस कार्यान्वयन और/या "मोड" के बारे में एक सूचित निर्णय लेना चाहता हूं जिसका हमें उपयोग करना चाहिए। मैंने जीसीएम मोड नामक कुछ के बारे में पढ़ा है, और हमने इसके साथ कुछ परीक्षण किए हैं (बाउंसीकास्टल/स्पॉन्गी कैसल का उपयोग करके), लेकिन यह बिल्कुल स्पष्ट नहीं है कि वास्तव में एईएस-जीसीएम क्या है और यह सादे की तुलना में हमें "खरीदता है" एईएस - और क्या कोई ट्रेड-ऑफ खाता है।
यहाँ चिंताओं/आवश्यकताओं/प्रश्नों की एक सूची है हमने:
पैडिंग: डेटा हम एन्क्रिप्ट करने के लिए हमेशा 128 बिट्स की एक बहु नहीं होगा की जरूरत है, तो एईएस कार्यान्वयन/मोड पैडिंग जोड़ना चाहिए, फिर भी जब आवश्यक हो। मैं इस धारणा के तहत था कि एक सादा एईएस कार्यान्वयन, जैसे
javax.crypto.Cipher
द्वारा प्रदान किया गया, ऐसा नहीं करेगा, लेकिन प्रारंभिक परीक्षणों से संकेत मिलता है कि यह करता है। तो मैं अपने आप में पैडिंग आवश्यकता का अनुमान लगा रहा हूं कि "सादा" एईएस की बजाय जीसीएम जैसे कुछ का सहारा लेने का कोई कारण नहीं है। क्या वो सही है?प्रमाणीकरण: हमें डेटा भ्रष्टाचार होने पर पता लगाने का मूर्ख तरीका चाहिए। हालांकि, आदर्श रूप से हम यह भी जानना चाहते हैं कि गलत कुंजी के साथ डिक्रिप्शन का प्रयास कब किया जाता है। इसलिए, हम इन दोनों मामलों के बीच अंतर करने में सक्षम होना चाहते हैं। पहली बार जीसीएम पर विचार करने के कारण मैं इस Stackoverflow question के कारण था, जहां उत्तरदाताओं में से एक यह इंगित करता है कि एईएस-जीसीएम का उपयोग करके यह भेद संभव है, हालांकि वह एक विस्तृत स्पष्टीकरण (अकेले कोड दें) प्रदान नहीं करता है।
ओवरहेड को कम करें: हमें एन्क्रिप्टेड डेटा के संग्रहण और संचरण पर ओवरहेड सीमित करने की आवश्यकता है। इसलिए हम जानना चाहते हैं कि, और किस हद तक, एक विशिष्ट एईएस कार्यान्वयन/मोड के लिए विकल्प ओवरहेड की मात्रा को प्रभावित करता है।
एन्क्रिप्शन/डिक्रिप्शन प्रदर्शन: यद्यपि यह एक प्राथमिक चिंता का विषय है कि हम करने के लिए सोच रहे हैं नहीं है किस हद तक एक विशिष्ट एईएस कार्यान्वयन/मोड को प्रभावित करती है एन्क्रिप्शन और डिक्रिप्शन प्रदर्शन की पसंद, दोनों CPU समय और स्मृति पदचिह्न के संदर्भ में।
किसी भी सलाह, स्पष्टीकरण और/या कोड उदाहरणों के लिए अग्रिम धन्यवाद।
संपादित करें: डेलन ने मदद से बताया कि "सादे एईएस" जैसी कोई चीज़ नहीं है। तो स्पष्टीकरण के लिए, इसका मतलब जावा के अंतर्निहित एईएस समर्थन का उपयोग कर रहा है।
इस तरह: Cipher localCipher = Cipher.getInstance("AES");
"सादा" एईएस क्या है? जब तक आप केवल 256 बिट डेटा का संचालन नहीं कर लेते। यदि आपके पास उससे अधिक डेटा है, तो आप जरूरी * कुछ * मोड का उपयोग कर रहे हैं। शायद आपकी लाइब्रेरी डिफ़ॉल्ट रूप से एक मोड चुनती है (जो मैंने सुना है, कई पुस्तकालय यहां एक असुरक्षित पसंद करते हैं)। इसलिए जब आप "सादा" एईएस का उपयोग करते हैं तो आपको यह जांचना चाहिए कि वास्तव में किस मोड का उपयोग किया जाता है। – delnan
आपके लिए धन्यवाद @ डेलनान, मैंने जो कुछ मतलब बताया उसे स्पष्ट करने के लिए एक संपादन किया। – Matthias