объяснение
Я создаю простой скремблер/кодировщик для удовольствия. Учитывая семя и текст для преобразования, алгоритм, чтобы превратить исходную строку неразборчивым, заключается в следующем:
[az]
были символами, которые можно было скремблировать, а цикл был на индексе 0 для текста семпла и преобразования, я бы получил l = index 11
и h = index 7
11 + 7 = 18
. Если индекс превышает длину принятого списка, уменьшите эту длину от нового индекса (например, 33 - 26
).s is at index 18
В итоге мы получаем "сумасшедший".
Алгоритм декодирования текста (должен быть с одним и тем же семенем) - это просто сделать все наоборот. Начните в конце строки, начните цикл через семя назад по индексу, который он остановит на (seed.length % text.length
), seed.length % text.length
индексы вместо добавления, а затем seed.length % text.length
результирующую строку. Поэтому, если мы будем вводить "lkj" в качестве семени и "сумо" в качестве текста преобразования, мы получим "привет" обратно при декодировании.
проблема
Похоже, что декодирование работает только иногда. С некоторой комбинацией семян и текста преобразования алгоритм терпит неудачу - но я понятия не имею, что это может быть. Например, используя следующую информацию:
Семя: lkj
Вход: Эй, ребята! Моя электронная почта [email protected], но не посылайте мне ничего U_U
Декодирование не выполняется. Однако, если к концу ввода добавляется "x", он работает. Что может пойти не так?
Похоже, у вас есть одна ошибка, когда длина вашего сообщения кратная длине вашего семени.
Проблемная линия:
var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : 0
следует изменить на:
var is_currSeed = (numLastWords > 0) ? (numLastWords - 1) : seed.length - 1;
Вот рабочая версия.