2011-12-01 358 views
5

我有一个使用openssl工具加密的bash脚本。使用openssl命令行工具进行AES加密,并使用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代码之间是否存在不匹配?

第二个问题是我是否可以重写此密码而不是键/ iv。为了做到这一点,有没有办法知道openssl使用给定密码的iv?

+2

首先,“123456789”与“0x01020304050607080900010203040506”不一样。你的IV也一样。 – Polynomial

+0

openssl将每个字符视为十六进制值,而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

也许我没有找到正确的东西,但是对于特定版本的aes来说不是太大的关键?密钥是否被截断?我使用了不同的密钥大小,并收到不同的密文。 –

相关问题