Jump to content

Функция генерации маски

Функция генерации маски ( MGF ) — это криптографический примитив, аналогичный криптографической хэш-функции, за исключением того, что, хотя выходные данные хеш-функции имеют фиксированный размер, MGF поддерживает выходные данные переменной длины. В этом отношении MGF можно рассматривать как функцию расширяемого вывода (XOF): она может принимать входные данные любой длины и обрабатывать их для получения выходных данных любой длины. Функции генерации маски полностью детерминированы: для любого заданного входа и любой желаемой длины вывода результат всегда один и тот же.

Определение

[ редактировать ]

Функция генерации маски принимает на вход строку октетов переменной длины и желаемой выходной длины и выводит строку октетов желаемой длины. Могут быть ограничения на длину строк входных и выходных октетов, но такие границы обычно очень велики. Функции генерации маски детерминированы; вывод строки октетов полностью определяется входной строкой октетов. Выходные данные функции генерации маски должны быть псевдослучайными, то есть, если начальное значение функции неизвестно, должно быть невозможно отличить выходные данные от действительно случайной строки. [1]

Приложения

[ редактировать ]

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

Схемы заполнения

[ редактировать ]

Функции генерации маски были впервые предложены как часть спецификации заполнения в алгоритме RSA-OAEP . Алгоритму OAEP требовалась криптографическая хэш-функция, которая могла бы генерировать выходные данные, равные по размеру «блоку данных», длина которого была пропорциональна входному сообщению произвольного размера. [1]

Генераторы случайных чисел

[ редактировать ]

Специальная публикация NIST 800-90A [2] определяет класс криптографически безопасных генераторов случайных чисел, одним из которых является «Hash DRBG», который использует хеш-функцию со счетчиком для создания запрошенной последовательности случайных битов, равного по размеру запрошенному количеству случайных битов.

Возможно, наиболее распространенным и простым механизмом построения MGF является итеративное применение хэш-функции вместе с увеличивающимся значением счетчика. Счетчик может увеличиваться бесконечно для получения новых выходных блоков, пока не будет собран достаточный объем выходных данных. Именно этот подход используется в MGF1.

MGF1 — это функция генерации маски, определенная в Стандарте криптографии с открытым ключом № 1, опубликованном RSA Laboratories: [1]

Параметры

[ редактировать ]

хеш-функция ( обозначает длину в октетах вывода хеш-функции)

начальное значение, из которого генерируется маска, строка октетов

предполагаемая длина маски в октетах, не более

маска, строка октетов длины ; или «маска слишком длинная»
  1. Если , выведите «маска слишком длинная» и остановитесь.
  2. Позволять быть пустой строкой октетов.
  3. Для от к , сделайте следующее:
    1. Конвертировать в строку октетов длины с примитивом :
    2. Объединить хэш начального числа и к строке октетов :
  4. Выведите ведущие октеты как маска строки октетов.

Пример кода

[ редактировать ]

Ниже приведен код Python, реализующий MGF1:

import hashlib

def mgf1(seed: bytes, length: int, hash_func=hashlib.sha1) -> bytes:
    """Mask generation function."""
    hLen = hash_func().digest_size
    # https://www.ietf.org/rfc/rfc2437.txt
    # 1. If l > 2^32(hLen), output "mask too long" and stop.
    if length > (hLen << 32):
        raise ValueError("mask too long")
    # 2. Let T be the empty octet string.
    T = b""
    # 3. For counter from 0 to \lceil{l / hLen}\rceil-1, do the following:
    # Note: \lceil{l / hLen}\rceil-1 is the number of iterations needed,
    #       but it's easier to check if we have reached the desired length.
    counter = 0
    while len(T) < length:
        # a. Convert counter to an octet string C of length 4 with the primitive I2OSP: C = I2OSP (counter, 4)
        C = int.to_bytes(counter, 4, "big")
        # b. Concatenate the hash of the seed Z and C to the octet string T: T = T || Hash (Z || C)
        T += hash_func(seed + C).digest()
        counter += 1
    # 4. Output the leading l octets of T as the octet string mask.
    return T[:length]

Пример выходных данных MGF1:

Python 3.10.4 (main, Apr 16 2022, 16:28:41) [GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mgf1 import mgf1
>>> from hashlib import sha256
>>> mgf1(b"foo", 3).hex()
'1ac907'
>>> mgf1(b"foo", 5).hex()
'1ac9075cd4'
>>> mgf1(b"bar", 5).hex()
'bc0c655e01'
>>> mgf1(b"bar", 50).hex()
'bc0c655e016bc2931d85a2e675181adcef7f581f76df2739da74faac41627be2f7f415c89e983fd0ce80ced9878641cb4876'
>>> mgf1(b"bar", 50, sha256).hex()
'382576a7841021cc28fc4c0948753fb8312090cea942ea4c4e735d10dc724b155f9f6069f289d61daca0cb814502ef04eae1'
  1. ^ Перейти обратно: а б с Лаборатории РСА. «RFC 2437 PKCS #1» .
  2. ^ Национальный институт стандартов и технологий (2012 г.). «Рекомендации по генерации случайных чисел с использованием детерминированных генераторов случайных битов» (PDF) . doi : 10.6028/NIST.SP.800-90A . {{cite journal}}: Для цитирования журнала требуется |journal= ( помощь )
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 87eabd27f961ed8200381724d88bd535__1712595780
URL1:https://arc.ask3.ru/arc/aa/87/35/87eabd27f961ed8200381724d88bd535.html
Заголовок, (Title) документа по адресу, URL1:
Mask generation function - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)