2012-05-03 10 views
14

मुझे मेरे सर्वर पर एक फ्रेम को डिक्रिप्ट करना है। एन्क्रिप्टेड फ्रेम सॉकेट पर जीपीआरएस के माध्यम से क्लाइंट डिवाइस से आता है। एन्क्रिप्शनट्रिपलडे और किसी दिए गए कुंजी के साथ किया जाता है। मैं सर्वर एल्गोरिदम और सर्वर पक्ष पर कुंजी का उपयोग करता हूं। फ़्रेम हेक्स और असीसी स्ट्रिंग का संयोजन है। अब समस्या यह है: जब मैं शून्य के साथ अपने बाइट सरणी को पैड करता हूं तो मुझे निम्न अपवाद मिलता है।javax.crypto.BadPaddingException: अंतिम ब्लॉक को सही ढंग से पैड नहीं किया गया

public String stringToHex(String base) { 
      StringBuffer buffer = new StringBuffer(); 
      int intValue = 0; 
      for (int x = 0; x < base.length(); x++) { 
       intValue = base.charAt(x); 
       String hex = Integer.toHexString(intValue); 
       if (hex.length() == 1) { 
        buffer.append("0" + hex + ""); 
       } else { 
        buffer.append(hex + ""); 
       } 
      } 
      return buffer.toString(); 
     } 
    public String byteToAscii(byte[] b, int length) { 
      String returnString = ""; 
      for (int i = 0; i < length; i++) { 
       returnString += (char) (b[i] & 0xff); 
      } 
      return returnString; 
     } 

इस ग्राहक के पक्ष में एन्क्रिप्शन के लिए इस्तेमाल ग में कोड है:

byte[] key = new byte[]{31, 30, 31, 36, 32, 11, 11, 11, 22, 26, 
       30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; 
myKeySpec = new DESedeKeySpec(key); 
mySecretKeyFactory = SecretKeyFactory.getInstance("TripleDES"); 
de = mySecretKeyFactory.generateSecret(myKeySpec); 

    Cipher c = Cipher.getInstance("TripleDES"); 
c.init(Cipher.DECRYPT_MODE, key); 

    int l = completeHexStr.length(); 

    if (l%8==1){ 
     completeHexStr = completeHexStr + "0000000"; 
    }else if (l%8==7){ 
     completeHexStr = completeHexStr + "0"; 
    } 
byte decordedValue[] =completeHexString.getBytes(); 
byte[] decValue = c.doFinal(decordedValue); 
String decryptedValue = new String(decValue); 
System.out.println("decryptedValue= " + decryptedValue); 

यहाँ कार्य करता है जो मैं कोड के अंदर उपयोग कर रहा हूँ कर रहे हैं:

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

के बाद मेरी कोड है ।

#include <svc_sec.h> 
const unsigned char fixed_key[] = { 0x31, 0x30, 0x31, 0x36, 0x32, 0x11, 0x11, 0x11, 0x22, 0x26, 0x30, 
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30}; 
int Comm_Encrypt_Data(unsigned char *Test_Input_Data, int Len_Input_Data) 
{ 
int Count_Input_Data, Counter_Input_Data; 
unsigned long Timer_1; 
unsigned char Init_Vector[8]; 
int Counter_Init_Vector, Temp_Byte_Count; 
unsigned char *Temp_Dst_Ptr, *Temp_Src_Ptr; 
unsigned char Temp_Input_Frame[9], Temp_Output_Frame[9]; 
unsigned char Test_Output_Data[500]; 
unsigned char Test_Key_Arr[9]; 

memset(&Init_Vector[0], '\0', sizeof(Init_Vector)); 
memset(Test_Key_Arr, '0', sizeof(Test_Key_Arr)); 
memcpy(Test_Key_Arr, &fixed_key[0], 8); 
Test_Key_Arr[sizeof(Test_Key_Arr)-1] = '\0'; 

Display_Data("KEY: ", Test_Key_Arr, sizeof(Test_Key_Arr)-1); 

memset(Test_Output_Data, '\0', sizeof(Test_Output_Data)); 
memcpy(Test_Output_Data, Test_Input_Data, 48); 

Count_Input_Data = Len_Input_Data -48 -3; //minus Data before payload, 3 bytes of '|' and CRC 
Counter_Input_Data = 0; 
while(Counter_Input_Data < Count_Input_Data) 
{ 
Temp_Byte_Count = Count_Input_Data- Counter_Input_Data; 
if(Temp_Byte_Count > 8) 
Temp_Byte_Count = 8; 

memcpy(Temp_Input_Frame, &Test_Input_Data[48+Counter_Input_Data], Temp_Byte_Count); 
//succeeding bytes to be 0 
if(Temp_Byte_Count < 8) 
{ 
memset(&Temp_Input_Frame[Temp_Byte_Count], '0', (8-Temp_Byte_Count)); 

} 

Display_Data("InPut Data Before Init",Temp_Input_Frame, Temp_Byte_Count); 

//============Initialize the data 
Temp_Dst_Ptr = (unsigned char *)Temp_Input_Frame; 
Temp_Src_Ptr = (unsigned char *)&Init_Vector[0]; 
for(Counter_Init_Vector =0;Counter_Init_Vector < 8; Counter_Init_Vector++) 
*Temp_Dst_Ptr++ ^= *Temp_Src_Ptr++; 
//============Initializing data ends 

DES(DESE, (unsigned char *)&Test_Key_Arr[0], 
(unsigned char *)&Temp_Input_Frame[0], (unsigned char *)&Temp_Output_Frame[0]); 
//DES(TDES3KE, (unsigned char *)&Test_Key_Arr[0], 
// (unsigned char *)&Temp_Input_Frame[0], (unsigned char *)&Temp_Output_Frame[0]); 
Display_Data("AFTER DES::::", Temp_Output_Frame, Temp_Byte_Count); 

memcpy(&Test_Output_Data[48+Counter_Input_Data], Temp_Output_Frame, Temp_Byte_Count); 
Counter_Input_Data += Temp_Byte_Count; 

if(Counter_Input_Data < Count_Input_Data) 
{ 
memcpy(Init_Vector, Temp_Output_Frame, 8); 

} 
} 

{ 
memset(Test_Input_Data, '\0', Len_Input_Data); 
memcpy(&Test_Input_Data[0], &Test_Output_Data[48], Counter_Input_Data); //1 Separator + 2 CRCs 
} 
Display_Data("Final Output Frame", Test_Input_Data, Counter_Input_Data); 
return Counter_Input_Data; 
} 

मैं जावा Cryptography में नया हूं। कृपया मुझे बताएं कि यह कैसे करें? क्या कोई भी कोड पोस्ट कर सकता है जो मेरे फ्रेम को डिक्रिप्ट करने के लिए ठीक से काम कर सकता है। अग्रिम में धन्यवाद।

उत्तर

6

(3) डीईएस 8 बाइट्स के ब्लॉक को एन्क्रिप्ट/डिक्रिप्ट करता है। चूंकि सभी ग्रंथ ठीक 8 बाइट्स नहीं हैं, अंतिम ब्लॉक में बाइट्स होना चाहिए जो सादे पाठ से मूल नहीं हैं।

चाल यह पता लगाने के लिए है कि सादा पाठ का आखिरी चरित्र कौन सा है। कभी-कभी सादा पाठ की लंबाई पहले से जानी जाती है - तो पैडिंग वर्ण वास्तव में कुछ भी हो सकते हैं।

यदि सादे पाठ की लंबाई ज्ञात नहीं है तो एक निर्धारक पैडिंग एल्गोरिदम का उपयोग किया जाना चाहिए, उदा। PKCS5Padding। पीकेसीएस 5 पैडिंग हमेशा पैडिंग करता है, भले ही सादे टेक्स्ट एन * बाइट्स में अवरुद्ध हो। इसका कारण सरल है: अन्यथा यह नहीं पता कि आखिरी बाइट सादे पाठ या पैडिंग है या नहीं।

मैं बाद में एक कामकाजी कोड के साथ आने की कोशिश करूंगा ... इसका परीक्षण करना होगा। इस बीच पैडिंग एल्गोरिदम का उपयोग करने का प्रयास करें।

+0

धन्यवाद। मैंने पहले ही पीकेसीएस 5 पैडिंग के साथ काम किया है लेकिन मेरे मामले में मैंने कोई फर्क नहीं देखा। – java2485

3

मैंने आपकी stringToHex विधि पर एक नज़र डाली है और यह गलत लगता है। बजाय इस एक का प्रयास करें:

 StringBuilder rep = new StringBuilder(); 
     for (byte b : base.getBytes) { 
      rep.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); 
     } 
     System.out.println(rep); 

इसके अलावा, मैं इस TripleDes with Padding उदाहरण पाया; आप एल्गोरिदम के साथ प्रयास कर सकते हैं और उदाहरण का उपयोग कर सकते हैं।

4

यदि दस्तावेज़ीकरण आपको नहीं बताता है कि आने वाले साइफरटेक्स्ट पर किस पैडिंग का उपयोग किया जा रहा है, तो "नोपैडिंग" के साथ डिक्रिप्ट करें, जो अंतिम ब्लॉक पर किसी भी प्रकार की पैडिंग स्वीकार करेगा। फिर अपने अंतिम ब्लॉक के हेक्स पर एक नज़र डालें। यह आपको बताएगा कि एन्क्रिप्टिंग अंत में किस पैडिंग का उपयोग किया जा रहा है। सही प्रकार के पैडिंग की अपेक्षा करने के लिए अपना कोड संशोधित करें। विभिन्न प्रकार के पैडिंग here शामिल हैं।

10

आपके कोड के साथ मुख्य समस्या यह है कि आप PKCS5Padding के डिफ़ॉल्ट का उपयोग करके डिक्रिप्ट कर रहे हैं। "TripleDES" परिणामस्वरूप "TripleDES/ECB/PKCS5Padding" आंतरिक रूप से होगा। ऐसा इसलिए है क्योंकि इसे सूर्य जेसीई प्रदाता में लागू किया गया है; अधिकांश अन्य प्रदाता इस डिफ़ॉल्ट की प्रतिलिपि बनाते हैं।

ऐसा लगता है कि आप शून्य पैडिंग की अपेक्षा कर रहे हैं, जिसका अर्थ है कि आपको इसके बजाय "DESede/ECB/NoPadding" का उपयोग करना चाहिए। इसके बाद आप सादा पाठ आकार की गणना करने के लिए बाहरी फ़ंक्शन का उपयोग कर सकते हैं (यदि आप सावधान नहीं हैं तो शून्य पैडिंग को हटाकर शून्य मूल्य वाले सादे पाठ को हटा सकते हैं)।

अन्य मुद्दों:

  • डिक्रिप्शन से पहले पैड डेटा की कोशिश कर (आपको चाहिए Unpad डेटा डिक्रिप्शन के बाद) इस तरह के चरित्र मूल्य के साथ पैड करने की कोशिश कर के रूप में
  • एन्कोडिंग और वर्ण एन्कोडिंग मुद्दों, "0", जो शायद गलत है

मैंने "ECB" संकेत दिया है क्योंकि मुझे वास्तविक पता नहीं है मोड इस्तेमाल किया। यदि आप पता लगा सकते हैं तो आप सही प्रश्न और पैडिंग एल्गोरिदम के साथ अपना प्रश्न संशोधित कर सकते हैं। यदि आप ईसीबी काम नहीं करते हैं तो आप सीबीसी मोड भी कोशिश कर सकते हैं।

ध्यान दें कि ईसीबी मोड बहुत विशिष्ट परिस्थितियों को छोड़कर उपयोग करने के लिए सुरक्षित नहीं है। यादृच्छिक चतुर्थ के साथ सीबीसी का उपयोग करना एक न्यूनतम आवश्यकता है।

+1

बहुत बहुत धन्यवाद। यह काम किया। अब मैंने क्लाइंट लड़के को पैडिंग के साथ एन्क्रिप्टेड फ्रेम भेजने के लिए कहा। और मैंने डीईएस/सीबीसी/नोपैडिंग का इस्तेमाल किया और यह ठीक से डिक्रिप्ट किया गया। – java2485

+0

खुशी हुई यह काम किया, उम्मीद है कि मैंने इस मुद्दे को हल करने में मदद की ... –

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