Шифр же не обязан по всем числам пройтись при повторном применении?
Шифр - это взаимно однозначное отображение блоков соответствующей длины. Если у вас значение вашего
-битного счётчика на входе не повторяется, то и результат его шифрования всегда будет разный. Иначе, вы не смогли бы этот результат на выходе расшифровать, получив обратно значение вашего счетчика.
Другое дело, что блочный шифр для такого длинного блока нужно конструировать из более коротких блочных шифров, и это тоже требует аккуратности, чтобы, во-первых, сохранилась обратимость шифра, гарантирующая отсутствие повторов, и во-вторых, чтобы обеспечить перемешивание, чтобы каждый входной бит влиял на каждый выходной. Например, шифровать ваш длинный блок коротким блочным шифром в режиме
CBC за два прохода, перевернув между проходами битовый вектор. И c заранее фиксированными начальными векторами (можно нулевыми).
Сколько времени вы будете перебирать все значения вашего
-битного счётчика, это отдельный вопрос. Не в этом мире. Но отсутствие повторов гарантируется.
Имел в виду циклическую перестановку чисел от 0 до
, где
.
Переставлять циклически можно только
последовательность чисел, но не их множество. Какая ваша исходная последовательность, которую вы хотите переставлять циклически? Все числа от 1 до
в порядке возрастания? Тогда у вас всё гораздо проще. Начинайте считать числа со случайной позиции в порядке возрастания, и считайте по модулю
. Или же ваша начальная последовательность, переставляемая циклически, сама есть некоторая фиксированная псевдослучайная перестановка последовательности чисел 1 до
в порядке возрастания? Тогда делайте как я подсказываю.