Openssl -aes-256-cbc в Java с только предоставленным ключом - PullRequest
0 голосов
/ 14 декабря 2018

когда я расшифровываю файл с помощью инструмента командной строки openssl, все в порядке с помощью следующей рекомендации.Я не имею никакой информации о шифровании, клиент предоставляет только следующую команду и ключ.

openssl enc -d -aes-256-cbc -in 8MP_2018_12_12.gz.enc -out 8MP_2018_12_12.gz.enc.gz -pass file:pass.txt

Я уже проверял много вопросов в stackoverflow, тестировал и запускал для большого количества программ.Поскольку я только предоставил ключ, я не могу использовать ivparameterspec.

В файле pass.txt есть предоставленный ключ

xxxxxxx12354125222sdsf <- example

Моя программа

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.apache.commons.ssl.OpenSSL;

public class OpenSSLTest {
    public static void main(String[] args) throws Exception {
        File inputFile = new File("D:\\temp\\8MP_2018_12_12.gz.enc");
        File outputFile = new File("D:\\temp\\8MP_2018_12_12.gz");
        FileInputStream inputStream = new FileInputStream(inputFile);

        InputStream in = OpenSSL.decrypt("aes-256-cbc", "xxxxxxx12354125222sdsf".toCharArray(), inputStream);
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        IOUtils.copy(in, outputStream);
        outputStream.flush();
        outputStream.close();
        in.close();
    }
}

Когда я запускаю вышеуказанную программу, я получаю следующее сообщение

Exception in thread "main" java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
    at javax.crypto.Cipher.implInit(Cipher.java:805)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1396)
    at javax.crypto.Cipher.init(Cipher.java:1327)
    at org.apache.commons.ssl.PKCS8Key.generateCipher(PKCS8Key.java:420)
    at org.apache.commons.ssl.OpenSSL.decrypt(OpenSSL.java:165)
    at OpenSSLTest.main(OpenSSLTest.java:15)

Я уже пытаюсь исправить эту проблему в соответствии с Безопасность Java: недопустимый размер ключа или параметры по умолчанию?

Я уже скачал jce_policy-8.zip.Я уже положил local_policy.jar и US_export_policy.jar в мой каталог ....\jre1.8.0_66\lib\security.

Я все еще получаю сообщение об ошибке выше.Моя версия JDK - jdk1.8.0_66.

1 Ответ

0 голосов
/ 15 декабря 2018

Строка "key", которую вы получаете из pass.txt, состоит из 22 символов.Когда OpenSSL использует «пароль» для получения ключа, он использует алгоритм EVP_BytesToKey для определения фактического (в данном случае AES) ключа, который следует использовать.Этот ключ должен быть 16, 24 или 32 байта (128, 192 или 256 бит соответственно).

Я не знаю, как используемая вами библиотека извлекает ключ из предоставленного пароля, но, похоже, она делает это неправильно, или, если это так, 256-битные ключи не включены вэтот экземпляр JVM.Необходимо проверить, что если вы не переименовали каталог jre, путь к каталогу должен выглядеть как jdk_1.8.0_66\jre\lib\security.Вы можете использовать этот фрагмент кода для проверки длины ключей, доступных вам:

if (Cipher.getMaxAllowedKeyLength("AES") > 128) {
    System.out.println("All key lengths supported");
} else {
    System.out.println("Only 128 bit keys supported");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...