Алгоритм простого шифрования Python - PullRequest
0 голосов
/ 12 марта 2020

Я хочу построить очень простой алгоритм шифрования, который преобразует символ в другой в зависимости от значения ключа. например, 'ab c' со значением ключа 2 будет -> 'cde'. Мой код в основном работает, но проблема в том, что он не перебирает алфавит в нижнем регистре («z» с ключевым значением 1 снова должно быть «a»). Я также хочу, чтобы результаты были строкой. Надеюсь, кто-нибудь может помочь мне с этим! :)

def encrypt(message, key):
    message = message.lower().replace(" ", "")
    print("lower case message: " + message)



    for i in message:
         print(chr(ord(i) + key))

encrypt('abc', 1)

Ответы [ 3 ]

0 голосов
/ 12 марта 2020

Вы можете просто добавить условие if следующим образом:

for i in message:
    val=ord(i) + key
    if val>122:
        print(chr(val-26),end='')
    else:
        print(chr(val),end='')
0 голосов
/ 12 марта 2020

Вы должны убедиться, что обрабатываете только ожидаемые символы. translate можно использовать здесь:

collate = ''.join([chr(x) for x in range(ord('a'), ord('z')+1)])

def encrypt(message, key):
    key = key % len(collate)
    mapped = collate[key:] + collate[:key]
    trans = str.maketrans(collate, mapped)
    return message.lower().translate(trans)

Демонстрация:

>>> encrypt('Abc,d ef', 2)
'cde,f gh'

Приятные моменты: не нужно помнить коды ASCII, устойчивые к вводу без альфа-канала ...

0 голосов
/ 12 марта 2020

Вы можете использовать оператор по модулю ('%'), чтобы получить остаток после деления, т. Е. 10%3 будет равно 1. Вы можете использовать это, чтобы сделать ваши значения "развернутыми" в указанной точке c.

Я переместил ваши вычисления в два отдельных утверждения, чтобы прояснить, что происходит - сначала мы находим значение для фактического символа (a => 0, b => 1, c => 2, et c) путем вычитания 97 из значения char. Затем мы добавляем ключ и проверяем, что он оборачивается на 26 (поскольку в алфавите engli sh только 26 строчных букв). Затем мы снова добавляем 97, чтобы снова получить правильное значение ascii для этой буквы.

'z' сначала будет 122, вычитание 97 дает нам 25, добавление 1 дает нам 26. Используя оператор по модулю, это говорит нам остальное было бы 0 - фактически снова обернулось бы до a. Мы возвращаем символ, добавляя 97 к 0 - получая 97 - что является значением ascii a.

Чтобы вернуть полную строку, мы добавляем каждый символ к результату, используя +=. Таким образом, мы можем добавить каждую букву к предыдущей последовательности букв перед их возвратом.

def encrypt(message, key):
    message = message.lower().replace(" ", "")
    print("lower case message: " + message)
    result = ""

    for i in message:
        offset_from_a = (ord(i) - 97) + key
        chr_value = 97 + (offset_from_a % 26)
        result += chr(chr_value)

    return result

encrypt('abc', 1) => 'bcd'
encrypt('zbc', 1) => 'acd'
...