Не возвращает символы ASCII при шифровании - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь написать код шифрования с использованием Python. Он шифрует, но не использует символы ASCII, и я не уверен, почему. Я очень плохо знаком с Python и хотел бы получить некоторую помощь

def encrypt(text, shift):

    cipher=""
    for char in range(len(text)):
        char = text[char]

        if (char.isupper()):
            cipher += chr((ord(char) + shift - 65) % 26 + 65)
        else:
            cipher += chr((ord(char) + shift - 97) % 26 + 97)

    return cipher

Он шифрует, но не возвращает символы ASCII

1 Ответ

1 голос
/ 09 ноября 2019

Формула

enc = (char + shift - offset) % m + offset

неявно определяет алфавит, в пределах которого происходит шифрование, т. Е. Символ в этом алфавите отображается на другой символ этого алфавит. Например, заглавные буквы имеют смещение 65 и модуль 26 (количество символов в алфавите). Это определяет алфавит как диапазон между 65 (A) и 65 + 26 - 1 = 90 (Z). Символ между вкл. A и Z всегда сопоставлены символу между вкл. А и Z и никогда для символа вне алфавита. То же самое относится и к строчным буквам. По этой причине:

print("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
print(encrypt("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 5));

приводит к выводу:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
FGHIJKLMNOPQRSTUVWXYZABCDEfghijklmnopqrstuvwxyzabcde

Если специальные символы также должны быть включены, диапазон должен быть выбран соответственно, например, как непрерывный диапазон между вкл. 32 (пробел) и вкл. 126 (~). Это соответствует смещению 32 и модулю 126 - 32 + 1 = 95 (количество символов в алфавите). Оператор if больше не нужен из-за непрерывного диапазона, поэтому он просто применяется:

cipher += chr((ord(char) + shift - 32) % 95 + 32)

Следующий код:

print(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
print(encrypt(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", 5));

затем выдает результат:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !"#$ 

, который теперь также содержит специальные символы.

...