Использование Java для расшифровки openssl aes-256-cbc с использованием предоставленного ключа и iv
Я искал пример кода Java, чтобы сделать следующее, но не был успешным. Я ищу решение для моей конкретной ситуации.
Ключ и IV были сгенерированы с использованием "testtest" для пароля:
openssl enc -aes-256-cbc -P
salt=2855243412E30BD7
key=E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5
iv=629E2E1500B6BA687A385D410D5B08E3
Файл (named text) был зашифрован в Linux с помощью команды openssl:
openssl enc -aes-256-cbc -K
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv
629E2E1500B6BA687A385D410D5B08E3 -e -in text -out text_ENCRYPTED
Он может быть дешифрован успешно, используя:
openssl enc -aes-256-cbc -K
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv
629E2E1500B6BA687A385D410D5B08E3 -d -in text_ENCRYPTED -out text_DECRYPTED
У меня есть доступ к зашифрованному файлу, солью, ключу и iv. Я не верю, что получаю пароль. Кроме того, я установил политику неограниченного размера JCE. До сих пор я нашел примеры, когда другая java-программа выполняет шифрование и генерирует эти параметры. Для моего случая я должен использовать значения соли, ключа и iv, предоставленные мне для дешифрования файла. Возможно ли это с Java? Пожалуйста, помните, что я связан этой конфигурацией, большое спасибо за ваше время и помощь.
Ответы
Ответ 1
Вы должны использовать что-то вроде этого:
InputStream cipherInputStream = null;
try {
final StringBuilder output = new StringBuilder();
final byte[] secretKey = javax.xml.bind.DatatypeConverter.parseHexBinary("E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5");
final byte[] initVector = javax.xml.bind.DatatypeConverter.parseHexBinary("629E2E1500B6BA687A385D410D5B08E3");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "AES"), new IvParameterSpec(initVector, 0, cipher.getBlockSize()));
cipherInputStream = new CipherInputStream(new FileInputStream("text_ENCRYPTED"), cipher);
final String charsetName = "UTF-8";
final byte[] buffer = new byte[8192];
int read = cipherInputStream.read(buffer);
while (read > -1) {
output.append(new String(buffer, 0, read, charsetName));
read = cipherInputStream.read(buffer);
}
System.out.println(output);
} finally {
if (cipherInputStream != null) {
cipherInputStream.close();
}
}