2011-12-01 9 views
5

में डिक्रिप्ट करता है मेरे पास एक बैश स्क्रिप्ट है जो एन्क्रिप्ट करने के लिए openssl टूल का उपयोग करती है।एईएस openssl कमांड लाइन उपकरण के साथ एन्क्रिप्ट करता है, और जावा

#!/bin/bash 

key128="123456789" 
iv="123456789" 
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv 

और जावा कोड जो स्क्रिप्ट द्वारा उत्पादित फ़ाइल को डिक्रिप्ट करने का प्रयास करता है।

public class crypto { 

    public static void main(String[] args) 
    { 
     try { 
      File f = new File("test.enc"); 
      Cipher c; 
      Key k; 
      String secretString = "01020304050607080900010203040506"; 
      String ivString = "01020304050607080900010203040506"; 
      byte[] secret = hexStringToByteArray(secretString); 
      byte[] iv = hexStringToByteArray(ivString); 

      c = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      k = new SecretKeySpec(secret, "AES"); 
      c.init(Cipher.DECRYPT_MODE, k, new IvParameterSpec(iv)); 

      CipherInputStream cis = new CipherInputStream(new FileInputStream(f), c); 
      BufferedReader br = new BufferedReader(new InputStreamReader(cis)); 

      String line; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 
      br.close(); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } catch (NoSuchAlgorithmException e) { 
      System.out.println(e.getMessage()); 
     } catch (NoSuchPaddingException e) { 
      System.out.println(e.getMessage()); 
     } catch (InvalidKeyException e) { 
      System.out.println(e.getMessage()); 
     } catch (InvalidAlgorithmParameterException e) { 
      System.out.println(e.getMessage()); 
     } 

    } 

    public static byte[] hexStringToByteArray(String s) { 
     int len = s.length(); 
     byte[] data = new byte[len/2]; 
     for (int i = 0; i < len; i += 2) { 
      data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
           + Character.digit(s.charAt(i+1), 16)); 
     } 
     return data; 
    } 
} 
                  33,1   71% 

जब मैं जावा कोड चलाता हूं, तो यह कुछ भी प्रिंट नहीं करता है। क्या स्क्रिप्ट और जावा कोड के बीच कोई मेल नहीं है?

एक माध्यमिक प्रश्न यह है कि क्या मैं कुंजी/iv के बजाय पासवर्ड का उपयोग करने के लिए इसे फिर से लिख सकता हूं। ऐसा करने के लिए, क्या iv को यह जानने का कोई तरीका है कि किसी दिए गए पासवर्ड के लिए openssl उपयोग करता है?

+2

शुरुआत के लिए, '123456789'' 0x01020304050607080900010203040506' जैसा नहीं है। आपके चतुर्थ के लिए भी चला जाता है। – Polynomial

+0

openssl प्रत्येक चरित्र को हेक्स मान के रूप में मानता है, जबकि जावा कोड वर्णों की एक जोड़ी को देख रहा है। – Ravi

+0

हां, और 0x12 0x0102 जैसा नहीं है। – Polynomial

उत्तर

9

उपरोक्त वर्णित @ पॉलिनोमियल के रूप में, कुंजी और iv का बैश स्क्रिप्ट और जावा कोड के बीच मेल नहीं खाता है। निम्नलिखित में बैश स्क्रिप्ट को बदलने से समस्या हल हो जाती है।

#!/bin/bash 

key128="01020304050607080900010203040506" 
iv="01020304050607080900010203040506" 
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv 

openssl निम्नलिखित तरीके से क्रियान्वित किया जाता है, यह एक पासवर्ड का उपयोग, और महत्वपूर्ण और iv इस्तेमाल किया प्रिंट होगा। उस कुंजी और iv को उपरोक्त जावा प्रोग्राम में प्रतिस्थापित किया जा सकता है।

openssl enc -nosalt -aes-128-cbc -in test -out test.enc -p 
+0

ग्रेट पोस्ट, धन्यवाद। मैं जावास्क्रिप्ट को एन्क्रिप्ट करने के लिए काम कर रहा था, फिर जावा में डिक्रिप्ट कर रहा था, यह वास्तव में मदद करता है। – Will777

+0

शायद मुझे कुछ सही नहीं मिला है लेकिन विशिष्ट संस्करण एईएस के लिए कुंजी बहुत बड़ी नहीं है? क्या कुंजी छोटा हो जाती है? मैंने विभिन्न महत्वपूर्ण आकारों का उपयोग किया और मुझे अलग सिफर टेक्स्ट प्राप्त हुआ। –

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