Wednesday 15 January 2014

java - javax.crypto.IllegalBlockSizeException : Input length must be multiple of 16 when decrypting with padded cipher -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 3 जवाब

    मुझे एक डिक्रिप्टिंग मिल रही है जावा क्लास में त्रुटि:

      javax.crypto.IllegalBlockSizeException: गद्देदार साइफर के साथ डिक्रिप्ट होने पर इनपुट लंबाई 16 के कई होने चाहिए।  

    अद्यतन करें:

    मैं यह एक बार काम कर रहा है और दूसरी बार जब यह उल्लेख करना भूल गया इसे उपरोक्त त्रुटि को फेंकने की कोशिश कर रहा है।

      पैकेज com.tb.module.service; आयात java.security.Key; आयात java.security.spec.InvalidKeySpecException; आयात javax.crypto.Cipher; आयात javax.crypto.spec.SecretKeySpec; Import sun.misc। *; / ** * इस वर्ग को एन्क्रिप्ट करने और पासवर्ड फ़ील्ड डिक्रिप्ट करने के लिए उपयोग किया जाता है। * * / सार्वजनिक वर्ग pswdEnc {निजी स्थिर अंतिम स्ट्रिंग एल्गोज़ = "एईएस"; निजी स्थिर फाइनल बाइट [] की वैल्यू = नए बाइट [] {'टी', 'एच', 'ई', 'बी', 'ई', 'एस', 'टी', 'एस', 'ई', ' सी ',' आर ',' ई ',' टी ',' के ',' ई ',' वाई '}; सार्वजनिक स्थैतिक स्ट्रिंग एन्क्रिप्ट (स्ट्रिंग डेटा) अपवाद फेंकता {मुख्य कुंजी = उत्पन्नकी ()); साइफर सी = सिफर। गेट इंस्टेंस (एलजीओ); C.init (साइफर। एनसीआरवाईपी_एमओडीईई, कुंजी); बाइट [] encVal = c.doFinal (डेटा .getBytes ()); स्ट्रिंग एन्क्रिप्टेड वैल्यू = नया बेस 64 एन्कोडर ()। सांकेतिक शब्दों में बदलना (एन्कवीएल); वापसी एन्क्रिप्टेड वेल्यू; } सार्वजनिक स्थिर स्ट्रिंग डिक्रिप्ट (स्ट्रिंग एन्क्रिप्टेडडेटा) अपवाद फेंकता {मुख्य कुंजी = जनरेट करें (); साइफर सी = सिफर। गेट इंस्टेंस (एलजीओ); C.init (साइफर। DECRYPT_MODE, कुंजी); बाइट [] decordedValue = नया BASE64Decoder ()। डीकोडबफर (एन्क्रिप्टेडडेटा); बाइट [] decValue = c.doFinal (decordedValue); स्ट्रिंग decryptedValue = नया स्ट्रिंग (decValue); वापसी decryptedValue; } निजी स्थिर कुंजी उत्पन्नकी () अपवाद फेंकता {मुख्य कुंजी = नया गुप्तकी स्पीक (कुंजी वैल्यू, ALGO); वापसी कुंजी; "एईएस" एल्गोरिथ्म का उपयोग कर रहे एल्गोरिथ्म, "एईएस" के लिए एक लघुकथा है " एईएस / ईसीबी / NoPadding "। इसका अर्थ यह है कि आप 128-बिट कुंजी आकार के साथ और, के साथ और।  

    का उपयोग कर रहे हैं: आप केवल 128 बिट या 16 बाइट्स के ब्लॉक में डेटा को एन्क्रिप्ट करने में सक्षम हैं। यही कारण है कि आप अवैध ब्लॉकस्कीप अपवाद अपवाद प्राप्त कर रहे हैं।

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

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


    अपडेट: प्रश्न पर आपकी टिप्पणियों के आधार पर, कभी भी पासवर्ड को एन्क्रिप्ट नहीं करते हैं एक डेटाबेस पर !!!!! आपको कभी ऐसा नहीं करना चाहिए। आपको पासवर्ड को हैश चाहिए, ठीक से नमकीन, जो एन्क्रिप्ट करने से पूरी तरह अलग है। वास्तव में, कृपया ऐसा मत करो जो आप करने की कोशिश कर रहे हैं ... पासवर्ड एन्क्रिप्ट करके, उन्हें डिक्रिप्ट किया जा सकता है। इसका क्या मतलब यह है कि आप, डेटाबेस मैनेजर के रूप में और गुप्त कुंजी को कौन जानता है, आप अपने डेटाबेस में संग्रहीत हर पासवर्ड को पढ़ सकेंगे। या तो आप यह जानते थे और कुछ बहुत, बहुत बुरा कर रहे हैं, या आपको यह नहीं पता था, और उसे चौंका और रोकना चाहिए।

No comments:

Post a Comment