2012-09-20 7 views
9

में काम करता है मेरा एप्लिकेशन विंडोज़ में काम करता है, लेकिन लिनक्स में Given final block not properly padded अपवाद के साथ विफल रहता है।अपवाद: "लिनक्स में अंतिम ब्लॉक को सही ढंग से पैड नहीं किया गया है", लेकिन यह विंडोज

विन्यास:

  • JDK संस्करण: 1.6
  • विंडोज: संस्करण 7
  • लिनक्स: CentOS 5.8 64 बिट

मेरे कोड के नीचे है:

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.InvalidKeyException; 
import java.security.Key; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.KeyGenerator; 
import javax.crypto.NoSuchPaddingException; 

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

public class SecurityKey { 
    private static Key key = null; 
    private static String encode = "UTF-8"; 
    private static String cipherKey = "DES/ECB/PKCS5Padding"; 

    static { 
     try { 
      KeyGenerator generator = KeyGenerator.getInstance("DES"); 
      String seedStr = "test"; 
      generator.init(new SecureRandom(seedStr.getBytes())); 
      key = generator.generateKey(); 
     } catch(Exception e) { 
     } 
    } 

    // SecurityKey.decodeKey("password") 
    public static String decodeKey(String str) throws Exception { 
     if(str == null) 
      return str; 

     Cipher cipher = null; 
     byte[] raw = null; 
     BASE64Decoder decoder = new BASE64Decoder(); 
     String result = null; 
     cipher = Cipher.getInstance(cipherKey); 
     cipher.init(Cipher.DECRYPT_MODE, key); 
     raw = decoder.decodeBuffer(str); 
     byte[] stringBytes = null; 
     stringBytes = cipher.doFinal(raw); // Exception!!!! 
     result = new String(stringBytes, encode); 

     return result; 
    } 
} 

पर रेखा:

ciper.doFilnal(raw); 

निम्न अपवाद फेंक दिया जाता है:

javax.crypto.BadPaddingException: Given final block not properly padded 

मैं कैसे इस समस्या को हल कर सकते हैं?

+1

मुझे आशा है कि आपको सुरक्षा की परवाह नहीं है। डीईएस और ईसीबी दोनों एक संदिग्ध विकल्प हैं। – CodesInChaos

+0

आप मान रहे हैं कि 'SecureRandom' सभी प्लेटफ़ॉर्म पर समान तरीके से व्यवहार करता है। क्या जावा गारंटी देता है? एक कुंजी प्राप्त करने के लिए एक केडीएफ का प्रयोग करें, न कि पीआरएनजी। – CodesInChaos

+0

क्या आप सुनिश्चित हैं कि 'कच्चे' में दोनों प्लेटफॉर्म पर एक ही डेटा है? डेटा को डीकोडके() 'में पास करने से पहले मुझे कुछ गलत एन्कोडिंग कवरेज पर संदेह होगा, हालांकि यदि आप बेस 64 का उपयोग करते हैं तो यह असंभव है। – axtavt

उत्तर

2

उत्तर इस तथ्य में निहित है कि SecureRandom बीजिंग विशिष्ट रनटाइम के लिए अलग हो सकती है। अधिकांश समय आपको "SHA1PRNG" मिलेगा, जो तुरंत बीज नहीं मिलेगा। इसके बजाए, आप किसी भी यादृच्छिक अनुरोध के पहले setSeed() पर कॉल कर सकते हैं, और उस स्थिति में बीज को एन्ट्रॉपी के केवल स्रोत के रूप में उपयोग किया जाता है। इस मामले में आपकी कुंजी हमेशा एक ही होगी।

समस्या यह है कि यह परिभाषित नहीं किया गया है कि SecureRandom वापस आ गया है। आप एक पूरी तरह से अलग, मंच विशिष्ट कार्यान्वयन प्राप्त कर सकते हैं जिसके लिए उपर्युक्त सत्य नहीं है। यदि किसी अन्य प्रदाता को प्राथमिकता मिलती है तो आपको सूर्य प्रदाता में से एक नहीं मिल सकता है।

तब बीज के साथ समस्या है। getBytes() पर कॉल के दौरान बीज ने seedStr चर के लिए प्लेटफ़ॉर्म डिफ़ॉल्ट एन्कोडिंग का उपयोग किया। चूंकि एन्कोडिंग भिन्न हो सकती है, इसलिए बीज भिन्न हो सकते हैं और इस प्रकार परिणाम भी अलग-अलग होंगे।

कुंजी व्युत्पन्न के लिए पीबीकेडीएफ 2 जैसे फ़ंक्शन का उपयोग करने का प्रयास करें; प्रक्रिया करने के तरीके पर stackoverflow पर पर्याप्त है।

+1

कोई भी वहां है? क्या यह मदद मिली? क्या आपने अपनी समस्या हल की? कृपया रिपोर्ट करें! –

+0

यह काम करता है !! धन्यवाद!! – user1685364

+0

बढ़िया है कि इससे आपकी समस्या हल हो गई है, अगर आप जवाब स्वीकार करेंगे तो यह अच्छा होगा। –

0

त्रुटि यह क्योंकि एन्कोडेड डेटा का लगता है, BASE64Decoder 4 के गुणकों वापस आ जाएगी और सिफर 8.

0

के गुणकों उम्मीद कर इस प्रकार है: मैं सामग्री को संशोधित करने के लिए किया था।

static{ 
    try { 
    KeyGenerator generator = KeyGenerator.getInstance("DES"); 
    String seedStr = "test"; 
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 
    random.setSeed(seedStr.getBytes()); 
    generator.init(random); 
    key = generator.generateKey(); 
} catch(Exception e) { 
} 

}

यह काम की !! धन्यवाद!!!

+0

शानदार, लेकिन यादृच्छिक संख्या जेनरेटर वास्तव में यादृच्छिक संख्या उत्पन्न करता है जब शिकायत नहीं आती है। –

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