openssl 도구를 사용하여 암호화하는 bash 스크립트가 있습니다.AES가 openssl 명령 줄 도구로 암호화하고 Java에서 암호 해독
#!/bin/bash
key128="123456789"
iv="123456789"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
그리고 스크립트로 생성 된 파일의 암호를 해독하려고 시도하는 Java 코드.
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%
Java 코드를 실행할 때 아무 것도 인쇄하지 않습니다. 스크립트와 Java 코드가 일치하지 않습니까?
두 번째 질문은 key/iv 대신 암호를 사용하도록 다시 쓸 수 있는지 여부입니다. 이를 위해서, 주어진 암호에 대해 openssl이 사용하는 iv를 알 수있는 방법이 있습니까?
처음에는 '123456789'이 (가) '0x01020304050607080900010203040506'과 다릅니다. 네 IV에 대해서도 마찬가지다. – Polynomial
openssl은 각 문자를 16 진수 값으로 처리하지만 Java 코드는 한 쌍의 문자를 찾습니다. – Ravi
예, 0x12는 0x0102와 다릅니다. – Polynomial