2012-11-21 18 views
12

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

+2

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

+1

उच्च स्तरीय पैकेज का मतलब है? –

+1

कृपया अपना कोड पोस्ट करें। हम वहां से काम कर सकते हैं। – Frank

उत्तर

25

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

एक बढ़िया उदाहरण है, संभवतः अधिक है, तो आप के लिए पूर्ण 128 बाइट्स से बड़ा तार के साथ काम: http://coding.westreicher.org/?p=23

आप सामान्य रूप में RSA एन्क्रिप्शन के बारे में अधिक विवरण की जरूरत है:

निम्नलिखित कोड दर्शाता है कि कैसे करने के लिए

// Get an instance of the RSA key generator 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
// Generate the keys — might take sometime on slow computers 
KeyPair myPair = kpg.generateKeyPair(); 

यह आपको एक keypair वस्तु है, जो दो कुंजी रखती है दे देंगे: जावा में कोई RSA कुंजी युग्म उत्पन्न करने के लिए KeyPairGenerator का उपयोग एक निजी और एक publ I C। इन चाबियों का उपयोग करने के लिए, आपको एक सिफर ऑब्जेक्ट बनाना होगा, जिसे नेटवर्क पर समाप्त होने वाले डेटा को एन्क्रिप्ट करने के लिए SealedObject के संयोजन में उपयोग किया जाएगा। यहां बताया गया है कि आप यह कैसे करते हैं:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher c = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key 
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

साइफर शुरू करने के बाद, हम डेटा एन्क्रिप्ट करने के लिए तैयार हैं। चूंकि एन्क्रिप्शन के बाद से परिणामस्वरूप डेटा अधिक समझ नहीं पाएगा यदि आप उन्हें "नग्न" देखते हैं, तो हमें उन्हें किसी अन्य ऑब्जेक्ट में समाहित करना होगा। जावा इसे SealedObject कक्षा द्वारा प्रदान करता है। SealedObjects एन्क्रिप्टेड ऑब्जेक्ट्स के लिए कंटेनर हैं, जो एक सिफर ऑब्जेक्ट की मदद से अपनी सामग्री को एन्क्रिप्ट और डिक्रिप्ट करते हैं।

निम्न उदाहरण से पता चलता है कि कैसे बनाने के लिए और एक SealedObject की सामग्री को एन्क्रिप्ट:

// Create a secret message 
String myMessage = new String("Secret Message"); 
// Encrypt that message using a new SealedObject and the Cipher we created before 
SealedObject myEncryptedMessage= new SealedObject(myMessage, c); 

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

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher dec = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key 
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate()); 

अब हम आयोजित डेटा को डिक्रिप्ट करने SealedObject बताना होगा:

इस तरह आप जावा में ऐसा है। जब GetObject पद्धति का उपयोग करके

// Tell the SealedObject we created before to decrypt the data and return it 
String message = (String) myEncryptedMessage.getObject(dec); 
System.out.println("foo = "+message); 

सावधान रहें, क्योंकि यह एक वस्तु है, और नहीं है कि यह वर्ग एन्क्रिप्शन पहले था का एक उदाहरण है (भले ही यह वास्तव में स्ट्रिंग का एक उदाहरण है) का एक उदाहरण देता है, तो आप ' इसे अपने पूर्व रूप में डालना होगा। http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

आरएसए थोक डेटा एन्क्रिप्शन के लिए इरादा नहीं है:

ऊपर से है। इसके बजाय, अपनी "बड़ी स्ट्रिंग" एन्क्रिप्ट करने के लिए एईएस की तरह एक सममित सिफर का उपयोग करें। फिर, आरएसए कुंजी के साथ एईएस के लिए उपयोग की जाने वाली सममित कुंजी को एन्क्रिप्ट करें।

बाउंसीकास्टल ऐसा करने के लिए दो प्रोटोकॉल का समर्थन करता है: एस/एमआईएमई और पीजीपी। सभी समझदार गोपनीयता प्रोटोकॉल इस तरह से प्रमुख परिवहन या कुंजी विनिमय के लिए असममित एल्गोरिदम का उपयोग करते हैं।

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

+0

इस तरह हाइब्रिड एन्क्रिप्शन जाने का रास्ता है। – CodesInChaos

+14

प्रासंगिक एपीआई के लिए एक कोड उदाहरण या लिंक चोट नहीं पहुंचाएगा। – CodesInChaos

संबंधित मुद्दे