2013-03-24 43 views
14

Tôi đã tìm kiếm một ví dụ mã Java để làm như sau nhưng đã không thành công. Tôi đang tìm một giải pháp cho tình huống cụ thể của tôi.Sử dụng Java để giải mã openssl aes-256-cbc bằng cách sử dụng khóa được cung cấp và iv

Một khóa và IV đã được tạo ra sử dụng "testtest" cho một mật khẩu:

openssl enc -aes-256-cbc -P 
salt=2855243412E30BD7 
key=E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 
iv=629E2E1500B6BA687A385D410D5B08E3 

Một tập tin (tên văn bản) đã được mã hóa trên Linux sử dụng lệnh openssl:

openssl enc -aes-256-cbc -K 
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv 
629E2E1500B6BA687A385D410D5B08E3 -e -in text -out text_ENCRYPTED 

Nó có thể được giải mã thành công bằng cách sử dụng:

openssl enc -aes-256-cbc -K 
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv 
629E2E1500B6BA687A385D410D5B08E3 -d -in text_ENCRYPTED -out text_DECRYPTED 

Tôi có quyền truy cập vào tệp được mã hóa, muối, khóa d iv. Tôi không tin tôi sẽ nhận được mật khẩu. Ngoài ra, tôi đã cài đặt chính sách JCE sức mạnh không giới hạn. Cho đến nay tôi chỉ tìm thấy các ví dụ trong đó một chương trình java khác thực hiện mã hóa và tạo ra các tham số này. Đối với trường hợp của tôi, tôi phải sử dụng các giá trị muối, khóa và iv cho tôi để giải mã một tập tin. Điều này có thể thực hiện được với Java không? Hãy nhớ rằng tôi bị ràng buộc bởi cấu hình này, cảm ơn bạn rất nhiều vì đã dành thời gian và giúp đỡ.

Trả lời

19

Bạn nên sử dụng một cái gì đó như thế này:

InputStream cipherInputStream = null; 
try { 
    final StringBuilder output = new StringBuilder(); 
    final byte[] secretKey = javax.xml.bind.DatatypeConverter.parseHexBinary("E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5"); 
    final byte[] initVector = javax.xml.bind.DatatypeConverter.parseHexBinary("629E2E1500B6BA687A385D410D5B08E3"); 
    final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "AES"), new IvParameterSpec(initVector, 0, cipher.getBlockSize())); 
    cipherInputStream = new CipherInputStream(new FileInputStream("text_ENCRYPTED"), cipher); 

    final String charsetName = "UTF-8"; 

    final byte[] buffer = new byte[8192]; 
    int read = cipherInputStream.read(buffer); 

    while (read > -1) { 
     output.append(new String(buffer, 0, read, charsetName)); 
     read = cipherInputStream.read(buffer); 
    } 

    System.out.println(output); 
} finally { 
    if (cipherInputStream != null) { 
     cipherInputStream.close(); 
    } 
} 
+0

trình! Cảm ơn nhiều. – user2203629

+12

Bạn được chào đón, đó là tin tuyệt vời. Bạn nên đánh dấu câu trả lời này là được chấp nhận sau đó để cho biết rằng nó đã giải quyết được vấn đề. – laz

+2

Có một lỗi nhỏ trong decodeHex() trong câu trả lời. Khi giá trị được mã hóa bắt đầu bằng '00', các byte tương ứng sẽ biến mất. Hãy nghĩ đến việc sử dụng thư viện nổi tiếng như Apache Commons để giải mã hex. (Tôi đã tìm thấy một ví dụ tại http://stackoverflow.com/questions/13990941/how-to-convert-hex-string-to-java-string) – ways

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