Как использовать OpenSSL для расшифровки данных, зашифрованных Java AES? - PullRequest
1 голос
/ 28 февраля 2011

Я взаимодействую с унаследованным 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 ]

3 голосов
/ 28 февраля 2011

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

"По умолчанию 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".

1 голос
/ 28 февраля 2011

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

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

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

0 голосов
/ 15 сентября 2013

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

...