openssl не использует пароль «секретно» напрямую, но использует его для получения ключа, поэтому вам нужно повторить вывод ключа в Java . Если вы используете параметр -p
с openssl:
$ openssl enc -blowfish -a -salt -in original.txt -pass pass:secret -p
salt=FB92391C90CF0EA5
key=C8B918619B0736F95704AD3BD53849EC
iv =6F92FB39C5795434
U2FsdGVkX1/7kjkckM8OpYRWgmNmYzHi8JWYOYpDK5w=
вы увидите, как она выводит соль (закодированную в шестнадцатеричном формате), а также вектор инициализации. Соль обычно передается на PBEKeySpec
при генерации ключа, например
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1, 128);
Вектор инициализации предоставляется при инициализации шифра:
blowfishCipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
который является отсутствующим параметром, на который вы ссылаетесь.
К сожалению, я не знаю, какую функцию вывода ключей openssl использует в этом случае или же тот же алгоритм поддерживается непосредственно в Java. Надеюсь, кто-то еще может предоставить эту информацию. Хороший эквивалентный пример использования AES можно найти в ответе на этот вопрос .
При более внимательном рассмотрении зашифрованной строки в вышеприведенном выводе, а именно: "U2FsdGVkX1 / 7kjkckM8OpYRWgmNmYzHi8JWYOYpDK5w =", если вы декодируете это base64, а затем шифруете его, вы получите:
Encrypted bytes:
0000: 53 61 6C 74 65 64 5F 5F FB 92 39 1C 90 CF 0E A5 Salted__..9.....
0010: 84 56 82 63 66 63 31 E2 F0 95 98 39 8A 43 2B 9C .V.cfc1....9.C+.
Итак, строка "Salted__" плюс соль добавлены. Другими словами, вам также необходимо выяснить, как openssl форматирует закодированную строку, чтобы вы могли успешно извлечь соль и правильный шифротекст.