Посмотрите на Перемешивание Фишера-Йейтса , чтобы найти способ перестановки строки на основе ключа.Вставьте ключ в качестве начального числа в PRNG, используйте его для генерации случайных чисел, используемых в случайном порядке.
Теперь, как отменить процесс?Фишер-Йейтс работает, обменивая определенные пары элементов.Таким образом, чтобы полностью изменить процесс, вы можете ввести тот же ключ в тот же PRNG, а затем выполнить алгоритм Фишера-Йейтса , как если бы вы перетасовывали массив размером с вашу строку.Но на самом деле вы ничего не перемещаете, просто запишите индексы элементов, которые будут поменяться местами на каждом этапе.
Как только вы это сделаете, просмотрите список свопов в обратном порядке , применяя их к вашей перетасованной строке.В результате получается исходная строка.
Так, например, предположим, что мы перетасовали строку «привет», используя следующие перестановки (здесь я не использовал PRNG, я бросил игральные кости, но вопрос оPRNG - это дает вам одинаковую последовательность чисел с одинаковым начальным числом):
(4,0): "hello" -> "oellh"
(3,3): "oellh" -> "oellh"
(2,1): "oellh" -> "olelh"
(1,0): "olelh" -> "loelh"
Итак, перетасованная строка - "loelh".
Для перестановки я генерирую ту же серию«случайные» числа, 0, 3, 1, 0. Затем примените свопы в обратном порядке:
(1,0): "loelh" -> "olelh"
(2,1): "olelh" -> "oellh"
(3,3): "oellh" -> "oellh"
(4,0): "oellh" -> "hello"
Успех!
Недостатком этого является то, что он использует многопамяти для перетасовки: массив индексов до тех пор, пока ваш исходный массив символов.Поэтому для действительно огромных массивов вы можете выбрать PRNG (или, в любом случае, функцию генерации последовательности), которую можно перемещать вперед или назад без необходимости сохранять все выходные данные.Это исключает криптографически защищенные PRNG на основе хеш-функции, но LFSR обратимы.
Кстати, почему вы хотите это сделать?