Подтвердить что ты не робот

Смутно, как использовать AES и HMAC

Я немного смущен, как правильно использовать AES и HMAC (на основе SHA-256) при передаче зашифрованного сообщения от сервера к клиенту или наоборот

Исправьте меня, пожалуйста, если следующий метод неверен:

  • Возьмите защищенный ключ из файла ключей (например, мы предлагаем использовать AES-256, и у нас уже есть действительный ключ длиной в 256 бит)
  • Генерируйте случайный IV для AES-256, чтобы быть уверенным, что один и тот же обычный текст будет иметь разный вывод шифрования.
  • Вычислить HMAC-SHA-256, используя простой текст и защищенный ключ. (Первый вопрос: следует ли использовать IV для вычисления HMAC? Например, присоединить к защищенному ключу?)
  • Зашифруйте простой текст с помощью AES-256.
  • Составьте сообщение для клиента следующим образом: HMAC + IV + ENCRYPTED_MESSAGE

Самый большой вопрос: возможно ли каким-то образом не отправлять IV клиенту, а генерировать его таким же образом и по-прежнему быть криптобезопасным? Или это нормально, чтобы отправить IV тоже?

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

4b9b3361

Ответ 1

Не отправлять hmac (сообщение), aes (message). Если вы отправляете одно и то же сообщение дважды, каждый может сказать. Кроме того, для предотвращения атак, таких как отступы оракула, вам нужно выполнить mac encrypt-text.

IV: В общем, простой способ борьбы с iv - это добавить его, поскольку он фиксировал длину, в текст шифрования. Затем вы можете просто прочитать эти байты перед расшифровкой. IV могут быть общедоступными, но они должны быть случайными.

HMAC: Самый простой способ, если ваша библиотека поддерживает его, - использовать AES в режиме GCM (или, что менее желательно, EAX). На самом деле это не HMAC, но он обеспечивает аутентифицированное шифрование, которое так же хорошо. Если они не поддерживаются:

Вам нужно вычислить hmac как для iv, так и для шифрованного текста. если || является конкатенацией (которую вы могли бы сделать с помощью копии массива при работе с байтовыми массивами), тогда вы хотите

CipherText = iv|| aes(key1,iv,message)  
tag = hmac(key2,ciphertext)

И затем отправьте (tag, CipherText). С другой стороны, вы запускаете один и тот же вызов hmac для регенерации тега и сравнения полученного тега с вычисленным. Сравните хэши sha1 или sha256, а не напрямую, чтобы вы не просачивались там, где сравнение не удается.

Вы должны использовать другой ключ для hmac. На практике хватка суммы sha1 вашего ключа шифрования достаточно хороша.