Из 4.1 Представление строк символов проект спецификации NIST SP 800 38G Rev 1 что упоминалось в комментариях:
Входные и выходные данные для функций шифрования 286 и дешифрования FF1 и FF3-1 должны быть конечными последовательностями цифр, т.е. строками цифр. Если данные, подлежащие шифрованию, отформатированы в алфавите, который еще не является набором базовых цифр системы счисления, то каждый символ должен быть представлен отдельной цифрой, чтобы применить FF1 или FF3-1.
...
Выбор и реализация взаимно-однозначного соответствия между данным алфавитом и набором базовых цифр счисления, который представляет алфавит, выходит за рамки этой публикации.
Это еще не так ясно, но в основном вам нужно канонически сопоставить ваши входные данные с диапазоном [0, N) и обратно во время шифрования и расшифровка. Это сопоставление выходит за рамки, поскольку оно, конечно, специфично для спецификации ввода данных.
Если ваши данные состоят из нескольких диапазонов, все становится немного сложнее. По сути, вы сначала упорядочиваете данные (обычно слева направо), затем определяете базу для каждого отдельного набора входных диапазонов. Затем значение в диапазоне создается путем умножения входного диапазона на нижние конечные базы.
Сначала я покажу вам, как эти $\текст{кодировать}$ и $\текст{декодировать}$ функции будут работать:
Предположим, что входные диапазоны предназначены для цифры, исключая ноль, за которой следует символ в верхнем регистре ABC, т.е. [1-9][А-Я]
. Основание цифр, исключая ноль, равно $9$, основа алфавита конечно $26$.
Теперь попробуем вычислить значение для 7Z
. Если вы будете следовать этим правилам, то значение, которое вы получите, равно 6$ \cdot 26 + 25 = 181$, куда $6$ индекс 7
в $[1, 9]$, $26$ это основа (количество символов) в ABC и $25$ индекс Z
в этой азбуке.
Чтобы отобразить его обратно, вы сначала выполняете $181\bmod 26$, что должно дать вам $25$ снова, что дает вам Z
после деиндексации. Затем вы делите: $\big\lceil 181 / 26 \big\rceil$, и вернуться $6$ который является индексом 7
В диапазоне $[1, 9]$.
Теперь нам нужно включить шифрование и дешифрование:
Теперь вы можете выполнить FF1 или FF3 для результата, $181$ и получить другое значение. Вы можете просто использовать правила, чтобы закодировать это в требуемое представление.
Так скажи, что у тебя есть $\текст{кодировать}(\текст{"7Z"}) = 181$ и $\text{enc}_k(181) = 26$, то это даст вам
$\текст{декодировать}(26) = "1А"$ которые вы можете хранить. Затем вы переворачиваете так: $\text{decode}(\text{dec}_k(\text{encode}(\text{"1A"}))) = "7Z"$. Параметры кодирования и декодирования специфичны для [1-9][А-Я]
.
Приведенные выше приемы могут быть легко распространены на любой формат, для которого диапазоны ясны, и - при правильном кодировании - для кодирования требуются только умножение и сложение, а для декодирования требуется только деление с остатком.Кодирование/декодирование должно занимать менее микросекунды при правильной реализации (для относительно небольших размеров входных данных, для которых обычно используется FPE).