Как уже упоминал Алекс, шифрование на основе пароля - это то, что вам нужно.Ключи AES должны иметь длину 128, 192 или 256 бит.Таким образом, пароли произвольной длины не будут работать в вашей ситуации сразу, но использование «нормального» пароля правильного размера также неверно, потому что пароли такого типа не содержат достаточной энтропии и позволят злоумышленникам перебирать их больше.легко, потому что они не достаточно случайны.
С учетом вышесказанного, давайте посмотрим на вашу реализацию.Вместо того, чтобы принимать строку в качестве пароля в PHP, вам, вероятно, следует сгенерировать 16 байтов (128 бит) с классом Java «SecureRandom» или что-нибудь эквивалентное в PHP (не знаю, доступна ли такая вещь, помните, что это нужнобыть криптографически безопасным случайным числом).Закодируйте его с помощью Base64, чтобы получить строковое представление ключа, который будет использоваться как в Java, так и в PHP.
Сделайте то же самое для IV, длина которого равна 16 байтам (всегда соответствует размеру блока AES), снова закодируйте его в Base64.Вы делаете это не по той причине, что это должно быть секретно или сложно, а из-за проблем с кодированием, которые ваш подход почти наверняка вызовет.Насколько я знаю, кодировка PHP по умолчанию , а не UTF-8, поэтому ваш подход обречен на провал.
Используя эти два значения (Base64-декодировать их перед использованием!), Выготов перейти на сторону PHP.В Java получите ваш Cipher, используя
Cipher c = Cipher.getInstance("AES/CBC/PKCS5PAdding");
и инициализируйте его тем же IV и ключом, которые использовались в PHP (снова не забудьте сначала декодировать Base64).
Заключительное примечание: Я не рекомендую то, что я только что описал, потому что это означает, что ваши ключи будут жестко закодированы в ваши исходные файлы.Это на самом деле не совсем безопасно и обычно осуждается.Если вы хотите сделать симметричное шифрование с паролями, то вам следует использовать PBE и нигде не хранить пароли, по крайней мере, не в коде клиента.Другая возможность заключается в использовании асимметричной криптографии с открытым / закрытым ключом, например, с использованием обмена ключами Диффи-Хеллмана.