Цифровая подпись против HMAC с ключом через DH

Я пишу приложение, которое интенсивно использует криптологию. Как и большинство сетевых приложений, моя разделяет данные на различные типы сообщений (мгновенные сообщения, файловый блок, видеокадр и т. Д.), И каждое из них должно быть проверено на подлинность как на предмет защиты от подделки, так и на правильное происхождение. Пока что я могу использовать ECDH для согласования общего секрета, который я уже использую для AES. Конечно, тот же секрет может быть использован позже.

У меня такой вопрос: есть ли в этом случае какое-либо дополнительное преимущество использования ECDSA для подписи каждого сообщения вместо простого использования общего секрета, установленного ECDH с HMAC?

Ниже, когда я говорю "М", я имею в виду либо зашифрованное сообщение, либо открытый текст; это не должно иметь значения. Пожалуйста, исправьте все ошибки ниже.

Я понимаю, что в ECDSA (или DSA) обычно хэширует сообщение (M) с алгоритмом безопасного хеширования (в настоящее время я использую один из SHA-2), чтобы сделать H(M), а затем шифрует H(M) используя закрытый ключ подписавшего. Это производит R а также S целые числа (подпись). Затем M, R и S отправляются получателю, который уже владеет открытым ключом отправителя. H'(M) рассчитывается, и подпись проверяется с помощью R а также S, BouncyCastle обеспечивает ECDSASigner который реализует это.

В HMAC требуется общий секрет, который у меня есть. Затем:
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )(Спасибо за исправление, Paŭlo Ebermann. Подробности смотрите в его ответе.)

Итак, учитывая, что DH/ECDH безопасно согласовывают общий секрет, есть ли причина, по которой я не должен использовать HMAC?

Связанный: почему NSA определяет стандартный алгоритм для DSA, а не MAC? Только потому, что это может быть SHA-2 + AES?

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

Спасибо за вашу помощь!

1 ответ

Решение

Один из недостатков DSA заключается в том, что для подписи вам нужны довольно хорошие случайные байты. Это даже тот случай, когда с помощью неверного случайного источника ваш личный ключ может быть восстановлен по подписи. Для MAC вы должны подписать много сообщений, поэтому вам нужно много случайных чисел. Если у вас нет аппаратного обеспечения для их производства, у вас закончится энтропия.

HMAC не нуждается ни в каких случайных числах (это является детерминированным).

Кроме того, я думаю, что HMAC будет более эффективным, чем использование DSA, но вы можете (и должны) это измерить.


О "правильных ошибках": Ваше описание HMAC не совсем верно - "расшифровки" нет. Это больше похоже на это:

У вас есть сообщение Mхеш-функция Hи общий секрет K, Добавьте две публичные функции f1 а также f2 (это простое заполнение XOR+). затем

HMAC(K, M) := H( f2(K) || H(f1(K) || M) )

с || быть простой конкатенацией. Отправитель и получатель выполняют одинаковые вычисления, отправитель отправляет свой с сообщением, а затем получатель сравнивает свой результат с отправленным. (Удостоверьтесь, что вы проводите сравнение таким образом, чтобы не допустить временных атак, т.е. сравнивайте все, даже если вы уже обнаружили, что оно не соответствует.)

Точное определение HMAC содержится в RFC 2104, который также содержит некоторые поясняющие цифры.


По этому вопросу:

Связанный: почему NSA определяет стандартный алгоритм для DSA, а не MAC?

Я не совсем уверен, но вот одна идея:

Список ссылок там упоминает " Режим счетчика Галуа" для TLS (RFC 5288) и SSH (RFC 5647), и это, как говорят, защищает как конфиденциальность, так и целостность в одном. Таким образом, отдельный MAC больше не нужен. (Я впервые это читаю, поэтому не могу судить об этом прямо сейчас.)

Другие вопросы по тегам