У меня есть скрипт bash, который использует openssl для шифрования данных, и код Java, который расшифровывает результат. Основываясь на моем предыдущем посте , я теперь могу ввести пароль в openssl и скопировать полученный ключ / iv в Java. Это зависит от использования опции -nosalt в openssl. Я хотел бы удалить эту опцию, взять пароль / salt / iv из openssl и передать его в функцию получения ключа JDK.
Вот скрипт openssl, который я использую:
#!/bin/bash
openssl enc -aes-128-cbc -in test -out test.enc -p
Когда я запускаю это и ввожу пароль, он выводит, например, следующее.
salt=820E005048F1DF74
key=16023FBEB58DF4EB36229286419F4589
iv=DE46F8904224A0E86E8F8F08F03BCC1A
Когда я пытаюсь использовать тот же пароль / соль / iv в Java, я не могу расшифровать test.enc. Я попробовал Java-код на основе ответа @erickson в этом посте . Вот фрагмент кода.
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 1024, 128);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
Если я распечатаю сгенерированный «секрет», он не совпадает с «ключом», который печатает openssl. Мне нужно изменить один из параметров Java, чтобы он соответствовал тому, как openssl получает свой ключ?