Формула
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{|}~ !"#$
, который теперь также содержит специальные символы.