Рейтинг:1

Существуют ли онлайн-способы использования блочного шифра для генерации уникальных $n$ битов, гарантирующих отсутствие коллизий в течение $2^n$ раз?

флаг in

$n$ — это переменная времени выполнения, выбираемая каждый раз, когда пользователь запускает реализацию.

Один из способов, который я могу придумать, - это использовать любой блочный шифр, скажем, AES, в качестве начального CSPRNG для случайного перемешивания списка чисел. $0, 1, \ldots, 2^n-1$. Таким образом, я гарантирую отсутствие столкновений до $2^n$ числа. Но этот подход слишком дорог, так как мне потребуется поменять местами $2^n$ числа.

Другой способ, который я могу придумать, - это использовать блочный шифр для генерации зашифрованного текста. $c = \mathrm{enc}(\mathrm{0x000}\ldots, \mathrm{key})$, куда $\mathrm{len}(c) \ge n$. Тогда возьмите 1-й $n$ много кусочков $с$; давайте назовем это $c_n$. Затем выполните: $c_n \oplus 0, c_n \oplus 1, \ldots, c_n \oplus 2^n-1$. Это эффективно, но проблема в том, что Я думаю, последовательность не случайна. Например. $c_n \oплюс 0$ обычно будет ближе к $c_n \oплюс 1$ чем, скажем, $c_n \oплюс 100$.

Вопрос: Есть ли более быстрый подход, при котором я могу использовать любой блочный шифр только один раз, чтобы сгенерировать следующее число, так что, когда я повторяю процесс, я получаю $2^n$ много уникальных номеров без коллизий?

В каком-то смысле я могу назвать это онлайн-версией перетасовки чисел. $0, 1, \ldots, 2^n-1$, без необходимости поддерживать список в памяти, который $2^n$ длинный.

В идеале, если найдена идеальная онлайн-тасовка, она должна иметь это распределение (где $я$ любое число в $\{0, 1, \ldots, 2^n-1\}$ и $N_j$ это случайная величина, которая будет принимать значение числа в этом наборе в $j^{th}$ вызов идеального онлайн тасовщика):

$$\начать{разделить} \Pr(N_0 = i) &= 1/2^n \ \Pr(N_1 = i) &= 1/(2^n - 1) \ \Pr(N_2 = i) &= 1/(2^n - 2) \ \vdots & \ \Pr(N_{2^n-1} = i) &= 1/(2^n - (2^n-1)) = 1\ \end{split}$$

fgrieu avatar
флаг ng
Есть ли какое-то требование, которое не удовлетворяет классический метод: шифрование $n$-битного счетчика $n$-битным блочным шифром? Если это так, пожалуйста, укажите это.
caveman avatar
флаг in
@fgrieu - Не уверен (думаю, это просто невежество). $n$ в моем случае является переменной (определяется пользователем во время выполнения). Я не думал об этом. Является ли ChaCha20 одним из таких алгоритмов, где я могу указать произвольный размер блока во время выполнения и получить эффект, описанный выше?
Maarten Bodewes avatar
флаг in
Да, я думаю, что ключевой поток, сгенерированный режимом счетчика, идеально подходит для этой задачи. Если у вас есть только шифрование, то оно определяется шифрованием в режиме CTR всех нулевых блоков.
caveman avatar
флаг in
@MaartenBodewes - Интересно. Поскольку ChaCha20 внутри имеет 512-байтовые блоки (по крайней мере, как это обычно реализовано, например.libsodium), можно ли оптимизировать реализацию для $n
fgrieu avatar
флаг ng
А, значит, отсутствующим требованием является переменная $n$ во время выполнения, что вынуждает использовать методы шифрования с резервированием формата. Пожалуйста, добавьте, что в вопросе указан диапазон для $n$ (слишком большое $n$ не имеет большого смысла, так как коллизии между независимыми равномерно случайными значениями $n\ge256$ бит все равно не наблюдаются); и, возможно, каким бы ни был предел количества $n$-битных значений, которые злоумышленник может получить для данной последовательности/ключа. Примечание. ChaCha20 не является блочным шифром, а тем более с переменной шириной блока по мере необходимости, но его можно использовать в качестве строительного блока для одного из них.
caveman avatar
флаг in
@fgrieu - Спасибо! Немного не по теме: если я выберу ChaCha20, можно ли будет сократить 512 без изменения результата (если $n
Рейтинг:3
флаг my

Существуют ли онлайн-способы использования блочного шифра для создания уникальных $n$ биты, которые гарантируют отсутствие коллизий для $2^n$ раз?

Очевидный способ сделать это — выбрать Формат, сохраняющий шифрование режим вашего блочного шифра, скажем, ФФ1. Это режим, который принимает блок произвольной длины (в вашем случае $n$ биты); вы бы вставили ключ и зашифровали счетчик. С фиксированным ключом (и одноразовым номером) шифрование обратимо и имеет выходную длину точно такой же, как и входная, что дает вам именно то, что вы просите.

Единственный недостаток, который я вижу, это то, что FF1 может иметь проблемы с безопасностью для действительно крошечных блоков (в вашем случае $n\le 6$). Конечно, если пользователь попросит это небольшое $n$, вы можете вернуться к «перестановке значений от 0 до $2^n-1$ стратегия...)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.