2011-12-01 43 views
5

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?

+2

Để bắt đầu, '123456789' không giống với '0x01020304050607080900010203040506'. Cũng vậy với IV của bạn. – Polynomial

+0

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

+0

Có và 0x12 không giống với 0x0102. – Polynomial

Trả lời

9

Như @ Đa thức được đề cập ở trên, các khóa và iv không khớp giữa tập lệnh bash và mã Java. Thay đổi kịch bản bash để giải quyết vấn đề sau đây.

#!/bin/bash 

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

Nếu openssl được thực hiện theo cách sau, nó sẽ sử dụng mật khẩu và in khóa và iv được sử dụng. Khóa đó và iv có thể được thay thế trong chương trình Java ở trên.

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

Bài đăng tuyệt vời, cảm ơn. Tôi đã đấu tranh để có được mã hóa blowfish blowsl làm việc sau đó làm một giải mã trong Java, điều này thực sự giúp. – Will777

+0

Có lẽ tôi đã không có một cái gì đó đúng nhưng không phải là chìa khóa quá lớn cho aes phiên bản cụ thể? Khóa có bị cắt ngắn không? Tôi đã sử dụng các kích thước khóa khác nhau và tôi nhận được văn bản mật mã khác nhau. –

Các vấn đề liên quan