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

1

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

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

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

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

  • 0
    Это хорошо показывает, почему никогда не следует использовать значения по умолчанию, но всегда явно указывать режим работы и режим заполнения.
Теги:
encryption
aes
openssl

3 ответа

3
Лучший ответ

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

"По умолчанию Java Ciphers (по крайней мере, в реализациях 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-padding). "Hello World" → зашифрованный Java → расшифрованный с использованием OpenSSL будет выглядеть как "Hello World\5\5\5\5\5".

  • 0
    Все получилось. Спасибо за многочисленные подсказки. Я могу подтвердить, что Java использует ECB по умолчанию. Все байты заполнения установлены на количество добавленных байтов. «Hello World» -> зашифрованный с помощью Java -> расшифрованный с помощью OpenSSL будет выглядеть как «Hello World \ 5 \ 5 \ 5 \ 5 \ 5».
  • 0
    Этот режим заполнения известен как PKCS # 5-Padding, и OpenSSL также должен иметь способ указать этот режим заполнения. (Я отредактировал ваше сообщение, чтобы добавить информацию из ваших комментариев, поэтому ответ завершен. Не стесняйтесь отменить или отредактировать его снова.)
Показать ещё 1 комментарий
1

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

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

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

0

Используйте библиотеку замка Баунтри в java. он поддерживает эквивалент c/С++ для библиотеки openssl в java. работал у меня

Ещё вопросы

Сообщество Overcoder
Наверх
Меню