2013-01-23 6 views
9

का उपयोग कर ओपन एएसपी एन्क्रिप्ट करता है मुझे openssl कमांड लाइन या सी एपीआई का उपयोग करके एक एक्सएमएल फ़ाइल एन्क्रिप्ट करना होगा। आउटपुट बेस 64 होगा।जावा

डिक्रिप्टिंग के लिए एक जावा प्रोग्राम का उपयोग किया जाएगा। यह प्रोग्राम ग्राहक द्वारा प्रदान किया जाता है और बदला नहीं जा सकता है (वे विरासत अनुप्रयोगों के लिए इस कोड का उपयोग कर रहे हैं)। जैसा कि आप नीचे दिए गए कोड में देख सकते हैं, ग्राहक एक पासफ्रेज प्रदान करता है ताकि कुंजी SecretKeySpec विधि का उपयोग करके उत्पन्न की जाएगी।

जावा कोड: सफलतापूर्वक जावा का उपयोग कर decrypted है

openssl enc -aes-128-ecb -a -salt -in file.xml -out file_enc.xml -pass pass:123456789
    openssl enc -aes-128-ecb -a -nosalt -in file.xml -out file_enc.xml -pass pass:123456789

लेकिन दिया निर्गम की गैर:

// Passphrase 
private static final byte[] pass = new byte[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0','1', '2', '3', '4', '5' }; 


public static String encrypt(String Data) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encVal = c.doFinal(Data.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encVal); 
    return encryptedValue; 
} 

public static String decrypt(String encryptedData) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
    byte[] decValue = c.doFinal(decordedValue); 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 

private static Key generateKey() throws Exception { 
    Key key = new SecretKeySpec(pass, "AES"); 
    return key; 
} 

मैं जैसे कई आदेशों का परीक्षण किया है। परीक्षण उद्देश्यों के लिए मैंने एन्क्रिप्टिंग के लिए दिए गए जावा कोड का उपयोग किया और परिणाम ओपनस्ल से एक से अलग है।

क्या डेटा एन्क्रिप्ट करने के लिए openssl सी api या कमांड लाइन का उपयोग करने का कोई तरीका है, तो दिए गए जावा कोड का उपयोग करके यह सफल डिक्रिप्ट किया जा सकता है?

उत्तर

7

जावा के SecretKeySpec, कुंजी बाइट के रूप में सीधे पासवर्ड ASCII बाइट्स का उपयोग करता है, जबकि OpenSSL के -pass pass:... विधि एक सुरक्षित फैशन में एक प्रमुख में पासवर्ड को बदलने के लिए एक key derivation function का उपयोग कर पासवर्ड से एक महत्वपूर्ण योगदान दिया। आप या तो जावा में एक ही कुंजी व्युत्पन्न करने की कोशिश कर सकते हैं (जो संभवतया मैं आपके प्रश्न को सही तरीके से समझ नहीं सकता), या पासवर्ड के बजाए एक कुंजी (हेक्स बाइट्स!) के रूप में पास करने के लिए ओपनएसएसएल के -K विकल्प का उपयोग करें।

+0

बहुत बहुत धन्यवाद, उसने ऐसा किया! –