Я перевернул следующий алгоритм из переходящего двоичном Я расследую:реверсивного алгоритм шифрования, операция XOR каждого символа с другим в строке, используя соотношение для контроля смещения
def encrypt(plain):
l = len(plain)
a = 10
cipher = ""
for i in range(0, l):
if i + a < l - 1:
cipher += chr(xor(plain[i], plain[i+a]))
else:
cipher += chr(xor(plain[i], plain[a]))
if ord(plain[i]) % 2 == 0: a += 1 # even
else: a -= 1 # odd
return cipher
from binascii import hexlify
print hexlify(encrypt("this is a test string"))
По сути, это операция XOR каждый символа с другим символом в строке, смещенным на a
. a
начальное значение равно 10
, поскольку функция выполняет итерацию над символами в строке, a +=1
, если значение символа равно или a -= 1
, если оно нечетное.
Я разработал в своей голове, как отменить этот шифр и получить простой текст, для этого потребуется использовать рекурсивную функцию, чтобы выяснить, какие смещения символов четные/нечетные в исходной строке. IE: Учитывая свойства XOR% 2, мы теперь считаем, что если cipher[0]
нечетно, то либо plain[0]
, либо plain[10]
является нечетным, но не тем и другим. Аналогично, если cipher[0]
равно, то оба значения plain[0]
и plain[10]
являются четными или оба являются нечетными. Оттуда рекурсивный алгоритм должен уметь работать остальным.
Как только мы узнаем, какие символы в открытом тексте четные/нечетные, обратное остальное тривиально. Я потратил несколько часов на это, но теперь я теряю его реализацию.
Я использовал базовые рекурсивные алгоритмы в прошлом, но никогда ничего, что «отделяется» от решения чего-то подобного.
EDIT: Извините, только чтобы быть ясным и в ответ на комментарий, после того, как я почесываю голову на это в течение нескольких часов, я думал, что стратегия рекурсии, изложенная выше, будет единственным способом решить эту проблему. Если нет, я открыт для любых подсказок/помощи для решения титульного вопроса.
Вам, вероятно, нужно попробовать что-то самостоятельно и разместить этот код здесь. –
@JamesKPolk Хотел бы я, но мои попытки на этом действительно ни к чему не привели, и я боюсь, что мои попытки просто заставят этот уже длинный вопрос выглядеть беспощадным. Я пытаюсь пробить немного выше моего веса, хотя я надеюсь научиться любым возможным ответам или подсказкам. – Juicy
Ну, нужен ли вам ответ на рекурсию, или вы просто подозреваете, что это лучший способ продолжить? –