2011-12-01 30 views
5

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?

+2

Para empezar, '123456789' no es lo mismo que' 0x01020304050607080900010203040506'. Lo mismo ocurre con su IV. – Polynomial

+0

openssl trata a cada carácter como un valor hexadecimal, mientras que el código de Java está viendo un par de caracteres. – Ravi

+0

Sí, y 0x12 no es lo mismo que 0x0102. – Polynomial

Respuesta

9

Como @Polynomial mencionado anteriormente, las claves y iv no coinciden entre el script bash y el código Java. Cambiar el script bash a lo siguiente resuelve el problema.

#!/bin/bash 

key128="01020304050607080900010203040506" 
iv="01020304050607080900010203040506" 
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv 

Si openssl se ejecuta de la siguiente manera, utilizará una contraseña e imprimirá la clave y iv utilizados. Esa clave y iv pueden ser sustituidas en el programa Java anterior.

openssl enc -nosalt -aes-128-cbc -in test -out test.enc -p 
+0

Excelente publicación, gracias. Estaba luchando para obtener el cifrado de blowfish de openssl y luego descifrarlo en Java, esto realmente ayuda. – Will777

+0

Tal vez no tengo algo correcto pero no es la clave demasiado grande para la versión específica aes? ¿La clave se trunca? Utilicé diferentes tamaños de clave y recibí un texto de cifrado diferente. –

Cuestiones relacionadas