2011-12-01 2 views
5

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를 알 수있는 방법이 있습니까?

+2

처음에는 '123456789'이 (가) '0x01020304050607080900010203040506'과 다릅니다. 네 IV에 대해서도 마찬가지다. – Polynomial

+0

openssl은 각 문자를 16 진수 값으로 처리하지만 Java 코드는 한 쌍의 문자를 찾습니다. – Ravi

+0

예, 0x12는 0x0102와 다릅니다. – Polynomial

답변

9

위에서 언급 한 @Polynomial과 마찬가지로, 키와 iv는 bash 스크립트와 Java 코드간에 일치하지 않습니다. bash 스크립트를 다음과 같이 변경하면 문제가 해결됩니다.

#!/bin/bash 

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

openssl이 다음과 같은 방식으로 실행되면 암호를 사용하여 키를 인쇄하고 iv가 사용됩니다. 이 키와 iv는 위의 Java 프로그램에서 대체 될 수 있습니다.

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

위대한 게시물, 감사합니다. 나는 openssl 복어가 Java에서 암호 해독 작업을 암호화하도록하는데 어려움을 겪었습니다. 이것이 정말로 도움이됩니다. – Will777

+0

아마도 내가 옳은 것을 얻지는 못했지만 특정한 버전의 에이스에 비해 너무 큰 열쇠가 아닌가? 키가 잘 렸는가? 다른 키 크기를 사용하고 다른 암호문을받습니다. –

관련 문제