Это не должно работать. Командная строка openssl enc
не поддерживает шифры / режимы AEAD, хотя ранние версии 1.0.1 (ниже патча h, в 2012-2014 гг.) Не могли перехватить, если вы неправильно указали такой шифр и молча выдавали неверный вывод. Если вы на самом деле используете LibreSSL, а не OpenSSL, он, похоже, унаследовал эту проблему и не устранил ее, хотя весь смысл проекта LibreSSL заключался в том, что они собирались исправить все ошибки, вызванные некомпетентными людьми из OpenSSL.
Если бы это был шифр, который корректно работал в OpenSSL (а также Java), например, aes-256-ctr, то ваша единственная проблема состояла бы в том, что openssl enc -K -iv
принимает свои аргументы в шестнадцатеричном виде (что подходит для контекста оболочки) ), тогда как Java crypto вызывается из кода, который может обрабатывать двоичные данные и ожидает свои аргументы в этой форме. В результате значения, которые вы предоставляете OpenSSL, на самом деле составляют 16 байтов (128 бит) и 8 байтов (64 бит), а не 256 бит и 128 бит, как они должны быть (для CTR; для GCM IV IV 96 битов будут правильными, но, как отмечалось, GCM здесь не будет работать). openssl enc
автоматически дополняет -K -iv
с (двоичными) нулями, но Java нет. Таким образом, вам нужно что-то более похожее на
byte[] key = Arrays.copyOf( javax.xml.bind.DatatypeConverter.parseHexBinary("61616161616161616161616161616161"), 32);
// Arrays.copyOf zero-pads when expanding an array
// then use SecretKeySpec (key, "AES")
// and IVParameterSpec (iv) instead of GCMParameterSpec
// but after Java8 most of javax.xml is removed, so unless you
// are using a library that contains this (e.g. Apache)
// or have already written your own, you need something like
byte[] fromHex(String h){
byte[] v = new byte[h.length()/2];
for( int i = 0; i < h.length(); i += 2 ) v[i] = Integer.parseInt(h.substring(i,i+2),16);
return v;
}
Сравнить Шифрование AES с помощью инструмента командной строки openssl и расшифровать в Java и Blowfi sh шифрование в Java / Scala и расшифровывать в bash (последнее - обратное направление, но необходимость совпадения одинакова)