Реверс-инженер Цезарь Шифр - PullRequest
3 голосов
/ 22 марта 2020

Я реверс-инжиниринг для расшифровки, но не получаю ожидаемого результата.

Например, ввод

Lipps${svph%

со смещением 4 должен привести к

Hello World!

но я получаю

ello´world³

Что я сделал не так?

code = input("Enter text to decrypt: ")
distance = int(input("Enter number of offset: "))
plainText = ''
for ch in code:
    ordValue = ord(ch)
    cipherValue = ordValue - distance
    if cipherValue < ord('a'):
        cipherValue = ord('z') - \
            (distance - (ord('a') - ordValue + 1))
    plainText += chr(cipherValue)
print(plainText)

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Вот реализация для шифрования и дешифрования при вводе символов в определенном диапазоне (в данном случае a-z). Вы можете адаптировать это для других диапазонов в зависимости от того, что вам нужно.

def caesar(text, offset, decrypt=False):
    lower_bound, upper_bound = ord('a'), ord('z')
    if decrypt:
        offset = (upper_bound - lower_bound + 1) - offset
    result = ''
    for t in text:
        o = ord(t)
        if lower_bound <= o <= upper_bound:
            new_t = o + offset
            if new_t > upper_bound:
                new_t = (new_t % upper_bound) + lower_bound - 1
            result += chr(new_t)
        else:
           result += t
    return result

Тогда вы можете позвонить:

caesar(caesar('hello world!', 2,), 2, True)
# => 'hello world!'
1 голос
/ 22 марта 2020

ОК, я настроил его на az и дал вам небольшой тестовый фреймворк для автоматического ввода / проверки вместо того, чтобы вводить его каждый раз.

def dowork(code, distance, lower, upper):


    bounddown, boundup = ord(lower), ord(upper)

    plaintext = ""
    for ch in code:
        ordValue = ord(ch)
        cipherValue = ordValue - distance
        if cipherValue < bounddown:
            cipherValue = boundup - bounddown - ordValue +1

        plaintext += chr(cipherValue)


    return plaintext

dataexp = [
    (("jgnnq",2, 'a', 'z'),"hello"),
    ]

for input_, exp in dataexp:
    got = dowork(*input_)
    msg = "exp:%s:%s:got for %s" % (exp, got, inp)
    if exp == got:
        print("good! %s" % msg)
    else:
        print("bad ! %s" % msg)

Это печатает

good! exp:hello:hello:got for ('jgnnq', 2, 'a', 'z')

Теперь все, что вам нужно сделать, это добавить дополнительный элемент в список dataexp, что-то вроде

(("Lipps${svph%", 4, <lowerbound>, <upperbound char>), "Hello World!")

, как только вы определите верхнюю и нижнюю границу, это должно работать. Обратите внимание, что я не знал код цезаря, я просто скопировал ваш код, но немного его реструктурировал.

Что *_input делает, чтобы взять эти 4 значения в этом кортеже (более или менее в списке) и назначить их до code, distance, lower, upper в функции dowork.

lower - это то, что соответствует a в вашем коде, а upper - это z.

exp - это то, что вы ожидаете, и exp == got просто проверяет, вернула ли функция правильно или нет. как только вы получите правильную функцию, она будет работать для и моего упрощенного c a-z, 2-го расстояния, hello теста и более сложного 4-го расстояния, но включая пунктуацию

ниже и верхние границы

ваших двух строк, входных и выходных, равны Lipps${svph% и Hello World!. Это означает, что все эти символы должны попадать в верхние и нижние значения ord, верно? Таким образом, минимальная позиция ордера для всех них - lower, а максимальная - upper. Теперь я не парень из Cryptonomicon, и я не могу вспомнить, если ord (a)

окончательная версия

Это не требует, чтобы вы выяснили, какой символ ставить на нижней границе, а какой на верхней. Мы берем нижний = 32 (начало печатных символов), верхний = 255. Таким образом, знаки препинания, верхний и нижний регистр, цифры, их значения ord больше не имеют значения.

#full ASCII range, you can go to town on entering whatever you want
bounddown, boundup = 32, 255

plaintext = ""
for ch in code:
    ordValue = ord(ch)
    cipherValue = ordValue - distance
    if cipherValue < bounddown:
        cipherValue = boundup - bounddown - ordValue +1

    plaintext += chr(cipherValue)
...