Как бы я изменить это? Python 3,8 - PullRequest
0 голосов
/ 03 мая 2020

Итак, я создал очень ... странный маленький Цезарь, используя python. Очень просто. За исключением того, что я не очень хорош в математике, и мне интересно, как бы я изменил это?

def encrypt(text,s): 
    result = "" 
    for i in range(len(text)): 
        char = text[i] 
        if (char.isupper()): 
            result += chr((ord(char) + s - 23+213**3) % 26 + 713) 
        else: 
            result += chr((ord(char) + s - 23+213**3) % 26 + 715) 
    return result 

text = input("Message: ")
s = 964

print ("Text: " + text) 
print ("Shift: " + str(s)) 
print ("Cipher: " + encrypt(text,s))

Буду признателен за любую помощь.

Редактировать:

Я ТАК ЗАКРЫТА! Я подсчитал, как работает сдвиг:

, если буква заглавная: 1. 964 - 23+213^3, which ends up as -9662656 2. Get the remainder of that divided by 26 (modulo operator) -9662656 % 26 = 10 3. 10 + 714 = 724 4. 724-63 Я получил 63 только через проб и ошибок ...

ТОЛЬКО ПРОБЛЕМА! Все это работает до буквы М, и в этом случае последние 13 букв сдвигаются назад на 26 символов. Как бы я решил это?

def decrypt(text,s): 
    result = "" 
    for i in range(len(text)): 
        char = text[i] 
        result += chr((ord(char) - s))
    return result 

text = input("Message: ")
s = 724-63

print ("Text: " + text) 
print ("Shift: " + str(s)) 
print ("Cipher: " + decrypt(text,s))
Text: ˖˗˘˙˚˛˜˝˞˟ˠˡˢˉˊˋˌˍˎˏːˑ˒˓˔˕
Shift: 661
Cipher: ABCDEFGHIJKLM456789:;<=>?@

1 Ответ

0 голосов
/ 04 мая 2020

Я переписал вашу функцию шифрования, чтобы показать отдельные части расчета. Затем я написал функцию расшифровки, чтобы показать, как «отменить» их.

Обратите внимание, что -23 + 213 3 эквивалентно 24 при работе мода 26.

def encrypt(text, s):
    cipher = ""
    for pt_char in text:
        val = ord(pt_char)          # 65 <= val < 91
        t0 = val % 26               # 0 <= t0 < 26, with A=>13, B=>14, ... N=>0 etc.
        t1 = (t0 + s + 24) % 26     # 0 <= t1 < 26
        t2 = t1 + 715               # 715 <= t2 < 741
        cipher += chr(t2)
    return cipher


def decrypt(ct, s):
    plain = ""
    for ct_char in ct:
        t2 = ord(ct_char)           # 715 <= t2 < 741
        t1 = t2 - 715               # 0 <= t1 < 26
        t0 = (t1 - s - 24 + 13) % 26     # 0 <= t0 < 26
        val = t0 + 65               # 65 <= val < 91
        plain += chr(val)
    return plain

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

Вот более короткие однострочные, чтобы показать вам, как генераторы могут создавать компактный код.

def encrypt_one_liner(text, s):
    return ''.join(chr((ord(x) + s + 24) % 26 + 715) for x in text)


def decrypt_one_liner(text, s):
    return ''.join(chr((ord(x) + 2 - s) % 26 + 65) for x in text)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...