Путают, как использовать AES и HMAC

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

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

  1. возьмите безопасный ключ из файла ключей (например, мы предлагаем использовать AES-256, и у нас уже есть действительный ключ длиной 256 бит)
  2. Generate random IV для AES-256, чтобы убедиться, что тот же простой текст будет иметь другой выход шифрования.
  3. вычислить HMAC-SHA-256, используя простой текст и безопасный ключ. (Первый вопрос: Должен ли я использовать IV для расчета HMAC? Например, добавить для защиты ключа?)
  4. шифрование обычного текста с помощью AES-256.
  5. составить сообщение для клиента следующим образом: HMAC + IV+ ENCRYPTED_MESSAGE

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

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

1 ответов


Не отправлять hmac (сообщение), aes(сообщение). Если вы посылаете одно и то же сообщение дважды, любой может сказать. Кроме того, вам нужно mac шифр-текст, чтобы предотвратить атаки, такие как дополнение oracle attack.

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

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

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

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

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

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