Можно, если сделать допущение, что текст кодируется посимвольно, а не группами из N символов.
open_text = 'текст' # открытый текст
# letters - именно строка, одна позиция - один символ
letters = ''.join(['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'])
key = 5 # ключ к шифру - величина сдвига. Может быть >0 или <0
# генерируем таблицы подстановки
encrypt_table = str.maketrans(letters, letters[key:]+letters[:key]) # для шифрования
decrypt_table = str.maketrans(letters, letters[-key:]+letters[:-key]) # для дешифрования
cypher_text = open_text.translate(encrypt_table)
restored_text = cypher_text.translate(decrypt_table)
print(open_text)
print(cypher_text)
print(restored_text)