Как использовать OpenSSL для расшифровки данных, зашифрованных Java AES?

Я взаимодействую с устаревшим приложением Java (приложение не может быть изменено), которое шифрует данные с помощью AES. Вот как исходный код Java создает экземпляр шифра AES:

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec );

Я разработчик на C/C++, а не Java, но из того, что я могу сказать, этот унаследованный код Java не определяет ни режим, ни вектор инициализации. Кто-нибудь знает, что Java будет использовать по умолчанию, так как он не указан?

Нам нужно новое приложение C/C++ для расшифровки зашифрованных данных Java. Но я в растерянности относительно того, что использовать для вектора инициализации OpenSSL и режима цепочки, так как я не знаю, что делает Java.

3 ответа

Решение

Возможный ответ найден:

"По умолчанию Java-шифры (по крайней мере, в реализациях Sun) создаются в так называемом режиме электронной кодовой книги (ECB)". (Источник: http://www.javamex.com/tutorials/cryptography/block_modes.shtml)

Поэтому, если ECB используется по умолчанию, я думаю, это означает, что вектор инициализации отсутствует, и я могу использовать следующий метод из OpenSSL:

void AES_ecb_encrypt(*in, *out, *key, enc);

С помощью AES_decrypt() Я могу расшифровать 1000+ байтовых сообщений, которые возникли на стороне Java. Таким образом, похоже, что Java действительно использует режим ECB по умолчанию без вектора инициализации. Однако я все еще не могу зашифровать и отправить новое сообщение в приложение Java. Расследование продолжается.


Все получилось. Спасибо за многочисленные подсказки. Я могу подтвердить использование Java ECB по умолчанию. Все байты заполнения устанавливаются на количество добавленных байтов (которое известно как заполнение PKCS5). "Hello World" -> зашифрованный Java -> расшифрованный с помощью OpenSSL будет выглядеть "Hello World\5\5\5\5\5",

Некоторые криптографические алгоритмы требуют дополнительных параметров инициализации; они могут быть переданы init() как объект java.security.AlgorithmParameters или как объект java.security.spec.AlgorithmParameterSpec. При шифровании вы можете пропустить эти параметры, и реализация Cipher использует значения по умолчанию или генерирует подходящие случайные параметры для вас. В этом случае вы должны вызвать getParameters() после выполнения шифрования, чтобы получить AlgorithmParameters, используемый для шифрования. Эти параметры необходимы для расшифровки, и поэтому должны быть сохранены или переданы вместе с зашифрованными данными.

http://docstore.mik.ua/orelly/java-ent/jnut/ch26_01.htm

Можете ли вы изменить код Java, чтобы получить доступ к этим параметрам?

Используйте библиотеку Bountry Castle в Яве. он поддерживает c/ C++, эквивалентный библиотеке openssl в java . работал на меня

Другие вопросы по тегам