Tôi có tập lệnh bash sử dụng công cụ openssl để mã hóa.AES mã hóa bằng công cụ dòng lệnh openssl và giải mã trong Java
#!/bin/bash
key128="123456789"
iv="123456789"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
Và mã Java cố gắng giải mã tệp được tạo bởi tập lệnh.
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%
Khi tôi chạy mã Java, nó không in bất cứ thứ gì. Có sự không khớp giữa tập lệnh và mã Java không?
Câu hỏi thứ hai là liệu tôi có thể viết lại điều này để sử dụng mật khẩu thay vì khóa/iv hay không. Để làm điều đó, có cách nào để biết iv mà openssl sử dụng cho một mật khẩu đã cho không?
Để bắt đầu, '123456789' không giống với '0x01020304050607080900010203040506'. Cũng vậy với IV của bạn. – Polynomial
openssl xử lý từng ký tự dưới dạng giá trị hex, trong khi mã Java đang xem xét một cặp ký tự. – Ravi
Có và 0x12 không giống với 0x0102. – Polynomial