AES-шифрование с помощью инструмента командной строки openssl и расшифровка в Java - PullRequest
10 голосов
/ 01 декабря 2011

У меня есть скрипт bash, который использует инструмент openssl для шифрования.

#!/bin/bash

key128="1234567890123456"
iv="1234567890123456"
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. Чтобы сделать это, есть ли способ узнать iv, который openssl использует для данного пароля?

1 Ответ

14 голосов
/ 02 декабря 2011

Как упоминалось выше @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
...