Функция генерации маски ( MGF ) — это криптографический примитив, похожий на криптографическую хэш-функцию, за исключением того, что в то время как вывод хэш-функции имеет фиксированный размер, MGF поддерживает вывод переменной длины. В этом отношении MGF можно рассматривать как функцию расширяемого вывода (XOF): она может принимать ввод любой длины и обрабатывать его для получения вывода любой длины. Функции генерации маски полностью детерминированы: для любого заданного ввода и любой желаемой длины вывода вывод всегда один и тот же.
Функция генерации маски принимает строку октетов переменной длины и желаемую длину вывода в качестве входных данных и выводит строку октетов желаемой длины. Могут быть ограничения на длину входных и выходных строк октетов, но такие границы, как правило, очень велики. Функции генерации маски являются детерминированными; вывод строки октетов полностью определяется входной строкой октетов. Вывод функции генерации маски должен быть псевдослучайным, то есть если начальное число функции неизвестно, то должно быть невозможно отличить вывод от действительно случайной строки. [1]
Функции генерации масок, как обобщения хэш-функций, полезны везде, где есть хэш-функции. Однако использование MGF желательно в случаях, когда хэш фиксированного размера будет недостаточным. Примерами являются генерация заполнения , создание одноразовых закладок или потоков ключей в симметричном шифровании и получение выходов для генераторов псевдослучайных чисел .
Функции генерации масок были впервые предложены как часть спецификации для заполнения в алгоритме RSA-OAEP . Алгоритм OAEP требовал криптографической хэш-функции, которая могла бы генерировать выход, равный по размеру «блоку данных», длина которого была пропорциональна произвольному размеру входного сообщения. [1]
В специальной публикации NIST 800-90A [2] определяется класс криптографически безопасных генераторов случайных чисел, одним из которых является «Hash DRBG», который использует хеш-функцию со счетчиком для создания запрошенной последовательности случайных битов, равной по размеру запрошенному числу случайных битов.
Возможно, наиболее распространенным и простым механизмом построения MGF является итеративное применение хэш-функции вместе с увеличивающимся значением счетчика. Счетчик может увеличиваться бесконечно, чтобы выдавать новые выходные блоки, пока не будет собрано достаточное количество выходных данных. Этот подход используется в MGF1.
MGF1 — это функция генерации маски, определенная в Стандарте криптографии с открытым ключом № 1, опубликованном RSA Laboratories: [1]
Параметры
- хэш-функция ( обозначает длину выходных данных хэш-функции в октетах)
Вход
- семя, из которого генерируется маска, строка октетов
- предполагаемая длина маски в октетах, не более
Выход
- маска, строка октетов длиной ; или «маска слишком длинная»
Шаги
- Если , вывести «маска слишком длинная» и остановиться.
- Пусть будет пустой строкой октета.
- Для с по выполните следующие действия:
- Преобразуем в строку октетов длины с помощью примитива :
- Объедините хэш семени и строку октета :
- Вывести начальные октеты в качестве маски строки октетов.
Ниже представлен код Python, реализующий MGF1:
импорт хэшлибdef mgf1 ( seed : bytes , length : int , hash_func = hashlib . sha1 ) -> bytes : """Функция генерации маски.""" hLen = hash_func () . digest_size # https://www.ietf.org/rfc/rfc2437.txt # 1. Если l > 2^32(hLen), вывести "mask too long" и остановиться. if length > ( hLen << 32 ): raise ValueError ( "mask too long" ) # 2. Пусть T будет пустой строкой октетов. T = b "" # 3. Для счетчика от 0 до \lceil{l / hLen}\rceil-1 выполните следующее: # Примечание: \lceil{l / hLen}\rceil-1 — это количество необходимых итераций, # но проще проверить, достигли ли мы желаемой длины. counter = 0 while len ( T ) < length : # а. Преобразуем counter в строку октетов C длины 4 с помощью примитива I2OSP: C = I2OSP (counter, 4) C = int . to_bytes ( counter , 4 , "big" ) # б. Объединяем хэш начального числа Z и C в строку октетов T: T = T || Hash (Z || C) T += hash_func ( seed + C ) . digest () counter += 1 # 4. Вывод первых l октетов T в качестве маски строки октетов. return T [: length ]
Примеры выходных данных MGF1:
Python 3.10.4 (main, 16 апреля 2022 г., 16:28:41) [GCC 8.3.0] в Linux Введите "help", "copyright", "credits" или "license" для получения дополнительной информации. >>> 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'
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )