2015-08-22 7 views
6

तोड़ना तो जावा में RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING नामक एक मोड है। उस समतल का क्या मतलब है?आरएसए/ईसीबी/ओएईपीविथशाह -256ANDMGF1PADDING

RFC3447, सार्वजनिक कुंजी क्रिप्टोग्राफी मानक (PKCS) # 1: आरएसए क्रिप्टोग्राफी विनिर्देशों संस्करण 2.1, खंड 7.1.2 डिक्रिप्शन आपरेशन हैश कहते हैं और एमजीएफ RSAES-OAEP-डिक्रिप्ट के लिए दोनों विकल्प हैं। एमजीएफ यह अपना स्वयं का फ़ंक्शन है, जिसे अनुभाग बी.2.1 एमजीएफ 1 में परिभाषित किया गया है और इसका स्वयं का हैश "विकल्प" भी है।

शायद आरएसईईएस-ओएईपी-डेक्रिप्ट और एमजीएफ 1 में हैश "विकल्प" एक जैसा होना चाहिए या शायद वे नहीं हैं, यह मेरे लिए अस्पष्ट नहीं है। यदि वे तब हैं तो मुझे लगता है कि आपके पास RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING है जिसका अर्थ है कि sha256 दोनों के लिए उपयोग किया जाना चाहिए। लेकिन अगर उन्हें समान नहीं माना जाता है तो आप RSA256 RSAES-OAEP-DECRYPT के लिए उपयोग कर सकते हैं और, उदाहरण के लिए, sha1 एमजीएफ 1 के लिए उपयोग किया जाता है। और यदि ऐसा है तो sha256 का क्या उपयोग किया जाना चाहिए? और अन्य फ़ंक्शन के लिए क्या हैश एल्गोरिदम का उपयोग किया जाना चाहिए?

और इस संदर्भ में ईसीबी का क्या अर्थ है? ईसीबी एक सममित ब्लॉक सिफर मोड है। इलेक्ट्रॉनिक कोड बुक। हो सकता है कि इसका मतलब यह हो कि जावा सादे टेक्स्ट के साथ कैसे काम करता है जो मॉड्यूलो से बड़ा है? जैसा कि शायद सादे टेक्स्ट को उन हिस्सों में विभाजित करता है जो मॉड्यूलो के रूप में बड़े होते हैं और फिर प्रत्येक को आरएसए के साथ एन्क्रिप्ट करता है और उन्हें एक साथ जोड़ता है? मैं बस अनुमान लगा रहा हूं ..

उत्तर

17

ओएईपी के लिए डिफ़ॉल्ट एमजीएफ 1 के लिए SHA-1 का उपयोग करना है। ध्यान दें कि चुना गया हैश का ओएईपी की सुरक्षा पर इतना असर नहीं पड़ता है, इसलिए अधिकतर इसे इस डिफ़ॉल्ट पर छोड़ा जाएगा।

हम आसानी से "OAEPPadding" और OAEPParameterSpec के खिलाफ परीक्षण करके इसकी जांच कर सकते हैं:

// --- we need a key pair to test encryption/decryption 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024); // speedy generation, but not secure anymore 
KeyPair kp = kpg.generateKeyPair(); 
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic(); 
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate(); 

// --- encrypt given algorithm string 
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"); 
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey); 
byte[] ct = oaepFromAlgo.doFinal("owlstead".getBytes(StandardCharsets.UTF_8)); 

// --- decrypt given OAEPParameterSpec 
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding"); 
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT); 
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams); 
byte[] pt = oaepFromInit.doFinal(ct); 
System.out.println(new String(pt, StandardCharsets.UTF_8)); 

कोड एक गद्दी संबंधित अपवाद के साथ असफल हो जायेगी अगर आप पैरामीटर के रूप में MGF1 के लिए "SHA-256" स्थानापन्न।

विस्तारित एल्गोरिदम की आवश्यकता क्यों है अन्य Cipher एल्गोरिदम के साथ संगतता है। उदाहरण के लिए लिखित कोड "RSA/ECB/PKCS1Padding" किसी भी पैरामीटर का उपयोग नहीं करता है, अकेले ओएईपी पैरामीटर दें। तो लंबे स्ट्रिंग के बिना ओएईपी प्रतिस्थापन में ड्रॉप के रूप में काम नहीं कर सकता है।


आपरेशन "ECB" के मोड इस संदर्भ में कुछ भी मतलब नहीं है, यह "None" किया जाना चाहिए था या यह पूरी तरह से बाहर छोड़ दिया गया है चाहिए। आप SunRSA प्रदाता के आरएसए कार्यान्वयन का उपयोग करके केवल एक ब्लॉक को एन्क्रिप्ट कर सकते हैं।

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

+1

मैं बाउंसीकास्टल क्रिप्टो प्रदाता के साथ खेल रहा था और बाउंसीकास्टल 'आरएसए/ईसीबी/ओएईपीविथशा -256ANDMGF1PADDING' के संबंध में अलग-अलग काम करता प्रतीत होता है। अर्थात। जबकि जावा का डिफ़ॉल्ट क्रिप्टो प्रदाता sha1 का उपयोग करता है क्योंकि एमजीएफ हैश बाउंसीकैसल sha256 का उपयोग करता प्रतीत होता है। यह शायद स्वतंत्र रूप से सत्यापित किया जाना चाहिए, लेकिन इस तरह से मुझे ऐसा लगता है .. – neubert

+2

मैं सिर्फ यह सत्यापित है, sun.security.rsa.RSAPadding जब OAEP SHA256 के साथ प्रयोग किया, SHA1 MGF1 समारोह के लिए उपयोग करता है, उछाल वाले महल दोनों के लिए SHA256 का उपयोग करता है, कि वे संगत क्यों नहीं हैं। – peceps

+2

@peceps विज्ञापन की जानकारी के लिए धन्यवाद। कुछ कोने मामलों में जहां ईसा पूर्व डिफ़ॉल्ट सूर्य कार्यान्वयन के साथ संगत नहीं है कर रहे हैं। मैं जानबूझकर बीसी टीम से पूछूंगा। –