Шифрование AES-256: сгенерируйте ключ 256 бит (32 байта) из моей фиксированной строки

Вопрос:

Я хотел бы использовать AES256 для шифрования text, я бы хотел использовать свой email [email protected] в качестве key для его шифрования.

Вот что я пробовал:

String key = "[email protected]";
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

byte iv[] = SOME_RANDOM_32_BYTES;
IvParameterSpec ivSpec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

byte[] encryptedResult = cipher.doFinal(text.getBytes("UTF-8"));

Когда я запускаю код выше, я получил InvalidKeyException:

java.security.InvalidKeyException: Key length not 128/192/256 bits.

Я проверил в Интернете, причина в том, что мой ключ не 128/192/256 бит. Мой вопрос: как я могу сгенерировать 256-битный (32 байта) ключ из моей электронной почты [email protected]?

Ответ №1

Вы можете хэш-строку вашего ключа ([email protected]) до 256-битного значения с помощью SHA256.

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(yourEmail.getBytes());
byte[] encryptionKey = md.digest();

Ответ №2

Для этого может быть несколько причин. Один из них ниже. Обычно эта ошибка возникает, когда в вашей JRE отсутствует политика обновления. Java по умолчанию предоставляет AES с 128, для 256 мы должны вводить новые политики, предоставляемые Java.

Ответ №3

Вы не должны испечь свой крипто! (Если вы не очень хорошо разбираетесь в этом, то есть.)

Вы должны использовать существующую (и проверенную) библиотеку шифрования.

Кроме того, вы не должны использовать допустимую строку, такую как ваш адрес электронной почты, в качестве пароля. Пожалуйста, найдите советы по выбору хорошего пароля.

Теперь, когда я сказал это, вот подробности.

Правильный способ внедрения шифрования на основе пароля – использовать KDF (Key Derivation Function) для генерации ключа шифрования из вашего пароля. Вот несколько KDFs, которые можно использовать для решения этой задачи: Argon 2, Scrypt, Bcrypt и PBKDF2.

К ключевым функциям деривации относятся механизмы защиты от известных атак, таких как радужные таблицы и словарные атаки, в частности “соль” и коэффициент работы. Современные KDF, такие как Argon2, также пытаются помешать злоумышленникам получить преимущество, используя оборудование, более подходящее для задачи.

Вообще говоря, здесь, как это используется:

  1. Выберите коэффициент работы (самый большой, который вы можете себе позволить)
  2. Сформировать соль с помощью CSPRNG
  3. Создайте ключ шифрования и секрет MAC, используя выбранный KDF с паролем, солью и коэффициентом работы.
  4. Генерировать IV (вектор инициализации) с использованием CSPRNG
  5. Шифруйте защищенные данные с помощью сгенерированного ключа шифрования.
  6. Вычислить MAC зашифрованного сообщения, используя сгенерированный секрет.
  7. Сериализуйте соль, коэффициент работы, вычисленный MAC и зашифрованные данные. (Опционально, идентификаторы, указывающие, какие выбранные KDF, схема шифрования и MAC также должны быть включены, если они не исправлены.)

Ваше зашифрованное сообщение – это сериализованные данные, созданные на шаге 7. Избегайте каких-либо шагов (и это легко), и ваш код шифрования, вероятно, будет разрушен ужасно.

Возможно, теперь вы понимаете, зачем использовать существующую библиотеку?

Примечание. Лучшей практикой является использование AEAD (аутентифицированное шифрование с ассоциированными данными) вместо шифрования-затем-MAC, как описано выше. Посмотрите, если вы заинтересованы: я не собираюсь обсуждать это здесь.

Оцените статью
TechArks.Ru
Добавить комментарий