В криптографии разделение доменов — это конструкция , используемая для эффективной реализации нескольких различных функций с использованием только одного базового шаблона. [1] Разделение доменов можно определить как разбиение домена функции для назначения отдельных поддоменов различным приложениям одной и той же функции. [2]
Например, криптографические протоколы обычно полагаются на случайные оракулы (RO, функции, которые возвращают значение, полностью определенное их входными данными, но в остальном случайное). Доказательства безопасности для этих протоколов основаны на предположении, что случайный оракул уникален для протокола: если два протокола совместно используют один и тот же RO, предположения доказательства больше не выполняются. Поскольку создание нового криптографического примитива с нуля каждый раз, когда требуется RO, нецелесообразно, несколько RO (например, RO1 и RO2) создаются путем добавления уникальных тегов разделения доменов (DST, также известных как разделители доменов ) к входным данным базового оракула RO:
где «RO1» и «RO2» — это строки, представляющие уникальные DST, а || — оператор конкатенации . [3] Если базовая функция RO безопасна (например, это криптографический хэш ), RO1 и RO2 статистически независимы . [1] Первоначально этот метод был предложен [4] Белларом и Рогауэем в 1993 году. [5]
Конструкцию разделения доменов можно использовать для различных целей:
В практическом смысле разделение доменов может обеспечить «настройку», эквивалент строгой типизации в программировании: оно обеспечивает использование независимых вычислений для разных задач, поэтому злоумышленник, узнавший результат одного вычисления, не получит никакой информации о другом. [9]
Разделение доменов может использоваться с функциями, реализующими различные криптографические примитивы .
Разделение доменов чаще всего используется с хэш-функциями. Входной домен хэш-функции практически не ограничен, его легко разделить между любым количеством производных функций, например, путем добавления DST к сообщению. [10] [1]
Разделение доменов используется в реализации некоторых хэш-функций для создания нескольких различных функций из одной и той же конструкции. [11] Например, в SHA-3 разделение доменов гарантирует, что функции с разными именами (например, SHA3-512 или SHAKE128 ) являются независимыми. [9]
Безопасность симметричных шифров и MAC критически зависит от того, чтобы ключ не использовался для других целей. Если приложению требуется несколько ключей, но у него есть только один источник материала для ключа, оно обычно использует функцию деривации ключа для создания ключей. KDF обычно могут создавать выходные данные произвольной длины, поэтому их можно использовать для создания любого количества ключей. [12]
Кроме того, как и хэш-функции, некоторые симметричные шифры и MAC используют внутреннее разделение доменов. [13]
Во многих случаях желательно использовать один ключ подписи для создания цифровых подписей для разных целей. Если это сделано, важно убедиться, что подписанные сообщения, предназначенные для одной цели, не могут быть использованы для другой. Простой способ добиться этого — добавить к каждому сообщению идентификатор, указывающий цель, и отклонить сообщение, если идентификатор не совпадает. [14]