2013-01-23 135 views
9

Tôi phải mã hóa tệp xml bằng cách sử dụng dòng lệnh openssl hoặc C api. Đầu ra phải là Base64.Mã hóa AES với giải mã mở bằng java

Một chương trình java sẽ được sử dụng để giải mã. Chương trình này được cung cấp bởi khách hàng và không thể thay đổi (họ đang sử dụng mã này cho các ứng dụng cũ). Như bạn có thể thấy trong mã bên dưới, khách hàng cung cấp cụm mật khẩu để khóa sẽ được tạo bằng phương thức SecretKeySpec.

mã Java:

// 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; 
} 

Tôi đã thử nghiệm một số lệnh như:

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

Nhưng không trong những kết quả nhất định được successfuly giải mã bằng java. Đối với mục đích thử nghiệm, tôi đã sử dụng mã java đã cho để mã hóa và kết quả dĩ nhiên khác với mã mở từ openssl.

Có cách nào để sử dụng lệnh openssl C api hoặc dòng lệnh để mã hóa dữ liệu để có thể giải mã thành công bằng mã java đã cho không?

Trả lời

7

Java SecretKeySpec sử dụng các byte mật khẩu ASCII trực tiếp như byte quan trọng, trong khi OpenSSL của -pass pass:... phương pháp xuất phát một chìa khóa từ mật khẩu sử dụng một key derivation function để chuyển đổi mật khẩu vào một phím một cách an toàn. Bạn có thể cố gắng thực hiện cùng một dẫn xuất quan trọng trong Java (mà bạn có thể không nếu tôi giải thích câu hỏi của bạn một cách chính xác), hoặc sử dụng tùy chọn -K của OpenSSL để chuyển vào một khóa (như byte hex!) Thay vì mật khẩu.

+0

Cảm ơn rất nhiều, điều đó đã làm được! –

Các vấn đề liên quan