Как уменьшить размер ключа, установленного с помощью Диффи-Хеллмана?


4

Когда я сгенерирую ключ с помощью метода Diffie Hellman (DH), установленный общий ключ будет иметь тот же размер, что и используемый премьер. Насколько я понял, это должно быть не менее 2000 бит для классического DH, некоторые говорят еще больше.

Но обычно для симметричной схемы требуется 256 или 512 бит.

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

Теперь я спрашиваю себя, каков стандартный способ сделать это? Также более безопасно использовать функцию деривации ключей?

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

  0

Функция получения ключа - это нечто большее, чем хэш. Основным преимуществом HKDF является то, что он производит именованные, произвольные размеры, а не единичный выходной сигнал постоянного размера. HKDF очень просто реализовать поверх HMAC-SHA-2. 12 авг. 132013-08-12 12:18:54

7

Diffie-Hellman позволяет двум сторонам создавать секретное значение, которое невозможно восстановить из наблюдения за их сообщениями. Размер секретного значения в результате обмена ключами (гAB мод р) действительно такой же размер, как в расцвете, однако ее энтропия может быть меньше, если и б выбраны в меньшем пространстве. Выбор a и b будет 256-битным случайным числом gives you 128-bit security для полученного секретного значения.

В принципе, полученное секретное значение имеет некоторую математическую структуру, и вы не должны использовать его как есть. Вместо этого вы должны использовать его и использовать результат в качестве симметричного ключа. Точнее, вы должны использовать общий секрет в качестве входа в key derivation function. Не является основанной на пароле ключевой функцией деривации: секретное значение имеет достаточную энтропию и не нуждается в усилении, только растянуто.

RFC 2631 указывает способ получения основного материала из общего секрета: SHA-1 (ZZ || type || ctr), где ZZ является байтовой кодировкой общего секрета, тип указывает, какой материал производится, и ctr - байтовое кодирование счетчика. Очевидно, что можно использовать другую функцию хеширования, такую ​​как SHA-256 или SHA-512 вместо SHA-1.

Точный способ получения основного материала на самом деле не важен, если обе стороны согласны. Например, если вам нужны только 256 бит, тогда SHA-256 (ZZ) будет в порядке. Точка привязки на счетчике - это когда вам нужно больше, чем может обеспечить один из функций хеш-функции. В интересах будущей проверки вашего протокола было бы целесообразно следовать RFC. Если вам нужно всего лишь вывести один ключ сейчас, вы можете жестко закодировать соответствующую кодировку ASN.1 типа и счетчика в виде строкового литерала в своем приложении.

На самом деле, оказывается, что using the DH shared secret directly является “not too bad”. Тем не менее, вы должны выталкивать его через KDF (по крайней мере, хэш): он прост, быстр, более безопасен, более стандартен и более надежен в будущем.

+1

В моем дальнейшем поиске по этому вопросу я нашел эту статью http://instantlogic.net/publications/DiffieHellman.pdf, которая дает похожие аргументы, и я просто хотел поделиться ею. 13 авг. 132013-08-13 09:21:57