Tengo un script bash que utiliza la herramienta openssl para encriptar.cifrar AES con la herramienta de línea de comandos de openssl y descifrar en Java
#!/bin/bash
key128="123456789"
iv="123456789"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
Y el código de Java que intenta descifrar el archivo producido por el script.
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%
Cuando ejecuto el código de Java, no imprime nada. ¿Hay una falta de coincidencia entre el script y el código de Java?
Una segunda pregunta es si puedo volver a escribir esto para usar la contraseña en lugar de key/iv. Para hacer eso, ¿hay alguna manera de saber el iv que openssl usa para una contraseña dada?
Para empezar, '123456789' no es lo mismo que' 0x01020304050607080900010203040506'. Lo mismo ocurre con su IV. – Polynomial
openssl trata a cada carácter como un valor hexadecimal, mientras que el código de Java está viendo un par de caracteres. – Ravi
Sí, y 0x12 no es lo mismo que 0x0102. – Polynomial