2011-12-01 55 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コードの間に不一致がありますか?

2番目の質問は、これを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 blowfishを暗号化してJavaで復号化することに苦労していましたが、これは本当に役立ちます。 – Will777

+0

おそらく、私は何か正しいことを持っていないのですが、特定のバージョンのエースにとっては大きすぎるキーではありませんか?キーは切り捨てられますか?私は異なるキーサイズを使用し、私は異なる暗号テキストを受け取ります。 –

関連する問題