Я взаимодействую с устаревшим 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.
Возможный ответ:
"По умолчанию 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"
.
Некоторые криптографические алгоритмы требуют дополнительных параметров инициализации; они могут быть переданы init() как объект java.security.AlgorithmParameters или как объект java.security.spec.AlgorithmParameterSpec. При шифровании вы можете опустить эти параметры, а реализация Cipher использует значения по умолчанию или генерирует для вас соответствующие случайные параметры. В этом случае вы должны вызвать getParameters() после выполнения шифрования, чтобы получить АлгоритмПараметры, используемые для шифрования. Эти параметры необходимы для дешифрования и поэтому должны быть сохранены или переданы вместе с зашифрованными данными.
http://docstore.mik.ua/orelly/java-ent/jnut/ch26_01.htm
Можете ли вы изменить код Java, чтобы получить эти параметры?
Используйте библиотеку замка Баунтри в java. он поддерживает эквивалент c/С++ для библиотеки openssl в java. работал у меня