2012-05-31 4 views
12

टॉमकैट का उपयोग करके, मेरे पास दो वेब-एप्लिकेशन हैं I.e app1 और app2। मैंने एप 2 से एन्क्रिप्टेड फॉर्म (नीचे कोड का उपयोग करके) में एपी 2 से यूआरएल भेजा। फिर app2 पर मैंने इस एन्क्रिप्टेड यूआरएल को डिक्रिप्ट किया। लेकिन decryp विधि के लाइन 50 पर अपवाद नीचे आ रहा है।javax.crypto.IllegalBlockSizeException प्राप्त करना: पैड किए गए सिफर के साथ डिक्रिप्ट करते समय इनपुट लंबाई 16 में से एक होनी चाहिए?

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

हालांकि जब मैं डिक्रिप्ट करने की कोशिश करता हूं (उसी कोड का उपयोग करके) एप 1 पर एन्क्रिप्टेड यूआरएल, यह ठीक काम करता है। लेकिन यह पता लगाने में सक्षम नहीं है कि ऐप 2 पर इस अपवाद का कारण क्या है?

यहाँ कोड मेरी मशीन पर

import java.security.Key; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 

public class AESEncryptionDecryptionTest { 

    private static final String ALGORITHM  = "AES"; 
    private static final String myEncryptionKey = "ThisIsFoundation"; 
    private static final String UNICODE_FORMAT = "UTF8"; 

    public static String encrypt(String valueToEnc) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGORITHM); 
     c.init(Cipher.ENCRYPT_MODE, key); 
     byte[] encValue = c.doFinal(valueToEnc.getBytes()); 
     String encryptedValue = new BASE64Encoder().encode(encValue); 
     return encryptedValue; 
    } 

public static String decrypt(String encryptedValue) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue); 
    byte[] decValue = c.doFinal(decordedValue);//////////LINE 50 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 

private static Key generateKey() throws Exception { 
    byte[] keyAsBytes; 
    keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT); 
    Key key = new SecretKeySpec(keyAsBytes, ALGORITHM); 
    return key; 
} 

public static void main(String[] args) throws Exception { 

    String value = "password1"; 
    String valueEnc = AESEncryptionDecryptionTest.encrypt(value); 
    String valueDec = AESEncryptionDecryptionTest.decrypt(valueEnc); 

    System.out.println("Plain Text : " + value); 
    System.out.println("Encrypted : " + valueEnc); 
    System.out.println("Decrypted : " + valueDec); 
} 

} 
+0

मेरी ans देखें और कुछ जानकारी प्राप्त करें [यहाँ एक ही सवाल] [1] [1]:। Http://stackoverflow.com/questions/17234359/javax-crypto-illegalblocksizeexception -इनपुट-लम्बाई-होना-be-multiple-of-16-whe/21378212 # 21378212 आशा है कि इससे मदद मिलेगी। – Krishna

उत्तर

10

वर्क्स है। यदि आप प्रत्येक उदाहरण में 'UNICODE_FORMAT' का उपयोग करते हैं तो यह मदद करता है जहां आप बाइट्स को स्ट्रिंग्स में बदलते हैं और इसके विपरीत? यह पंक्ति एक समस्या हो सकती है:

byte[] encValue = c.doFinal(valueToEnc.getBytes()); 

byte[] encValue = c.doFinal(valueToEnc.getBytes(UNICODE_FORMAT)); 

वैसे भी होना चाहिए, यदि आप "एईएस एल्गोरिथ्म" के रूप में इस्तेमाल करते हैं और आप JCE, एल्गोरिथ्म वास्तव में इस्तेमाल किया जा रहा हो जाएगा "एईएस/का उपयोग ईसीबी/PKCS5Padding "। जब तक आप 100% सुनिश्चित नहीं कर रहे हैं कि आप क्या कर रहे हैं, ईसीबी का उपयोग किसी भी चीज़ के लिए नहीं किया जाना चाहिए। मैं इस तरह के भ्रम से बचने के लिए हमेशा एल्गोरिदम को स्पष्ट रूप से निर्दिष्ट करने की अनुशंसा करता हूं। "एईएस/सीबीसी/पीकेसीएस 5 पैडिंग" एक अच्छा विकल्प होगा। लेकिन किसी भी उचित एल्गोरिदम के साथ देखें, आपको एक IV प्रदान करना और प्रबंधित करना होगा।

एक ईसीबी सिफर का उपयोग करना पासवर्ड एन्क्रिप्ट करने के संदर्भ में भी कम वांछनीय है, जो कि आप अपने एन्क्रिप्शन के साथ ऐसा कर रहे हैं यदि मैं आपके उदाहरण को सही तरीके से समझता हूं। आपको उस उद्देश्य के लिए पीकेसीएस # 5 में निर्दिष्ट पासवर्ड-आधारित एन्क्रिप्शन का उपयोग करना चाहिए, जावा में यह आपके लिए SecretKeyFactory में प्रदान किया गया है। एक उच्च पर्याप्त पुनरावृत्ति गणना (~ 5-20 000 से लेकर कुछ भी, आपकी लक्षित मशीन पर निर्भर करता है) के साथ "PBKDF2WithHmacSHA1" का उपयोग करना सुनिश्चित करें, उनसे सममित कुंजी प्राप्त करने के लिए पासवर्ड का उपयोग करने के लिए।

उसी तकनीक का उपयोग किया जा सकता है यदि यह वास्तव में पासवर्ड एन्क्रिप्शन के बजाय पासवर्ड संग्रहण है जिसे आप प्राप्त करने का प्रयास कर रहे हैं।

+0

हाय एम्बॉस।ऐसा लगता है कि यह हो रहा है becoz respond.sendRedirect एप 2 में प्राप्त होने पर एन्क्रिप्टेड यूआरएल में कुछ अक्षरों को प्रतिस्थापित करता है? यदि आप http://stackoverflow.com/questions/10836902/response-sendredirect-replace-some-characters-in-encrypted- यूआरएल-कब-प्राप्त करने में, यह बहुत मददगार होगा। मैं वास्तव में कल से इसमें फंस गया हूं :( –

+0

उत्तर सही हैं। बेस 64 वेब-सुरक्षित नहीं है, इसलिए आम तौर पर इसे पहले से बचने के बिना यूआरएल में इस्तेमाल नहीं किया जा सकता है। दूसरा, आपके प्राप्त करने के लिए विधि का उपयोग करना आसान है लक्ष्य हेक्स एन्कोडिंग का उपयोग करना है, यह बॉक्स से बाहर वेब-सुरक्षित है। – emboss

+0

लेकिन फिर, चेतावनी दी जानी चाहिए: यदि यह वास्तव में एक पासवर्ड है जिसे आप यूआरएल के हिस्से के रूप में भेज रहे हैं, तो यह बिल्कुल सुरक्षित नहीं है। ब्रूट पासवर्ड डिक्शनरी की मदद से अपना रास्ता मजबूर करना सबसे अधिक घंटों का मामला है ... – emboss

-3

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

+4

नहीं, यह इंगित नहीं करता है कि आप केवल अधिकतम 16 वर्णों का उपयोग कर सकते हैं! उत्तर स्पष्ट रूप से गलत है। –

-1

मुझे यह त्रुटि दिखाई दे रही थी (पासवर्ड को ठीक तरह से ठीक करने के साथ) जैसा कि आप मान को डबल-डिक्रिप्ट करते हैं। यह देखने के लिए जांचें कि क्या आप एक से अधिक बार डिक्रिप्टिंग कर रहे हैं। (मेरा त्रुटि में 8 में से कई था, लेकिन मैं वहां एक अलग योजना का उपयोग कर रहा था ...) मेरे मामले में मैं एक फ़ाइल पढ़ने के दौरान डिक्रिप्ट कर रहा था और फिर फ़ील्ड भरते समय फिर से डिक्रिप्ट कर रहा था। (डेस्कटॉप अनुप्रयोग)

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

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