@ArmBoy28

Как выполнить шифровку при помощи шифра Вижинера?

Я студент информационной безопасности АмГУ и совсем недавно дали лабораторные работы, в которых нужно расшифровать слова и так же наоборот зашифровать.

Конечно же ничему нас за 3 года не научили.
Сказали, что можно использовать Excel либо, если кто-то разбирается, то какой-то ЯП.
Я решил сделать задание на Python и вот возник вопрос такой.

С расшифровкой всё окей, но как мне зашифровать текст?

Вот код расшифровки:
import alfavit
from alfavit import alfa

slovo = [21, 1, 3, 1, 20, 24, 29]
g=0
gg=0
N=33
for i in alfa:
    print(f"Начало. Ключ {gg}", end="\n")
    for i in slovo:
        a=(slovo[g] - (0+gg))%N
        print(alfa[a], end="")
        g=g+1
    print(" ", end="\n")
    print("конец")
    g=0
    gg=gg+1


import alfavit – отдельный файл alfavit.py где просто расписан алфавит в списке alfa=["а", "б", "в", ...]

Всё вроде бы легко, но вот с зашифровкой я затупил.

Вот что-то похожее на код:
import alfavit
from alfavit import alfa

slovo=input("Введите текст слитно ")
S=int(input("Введите длину ключа (до 32) "))
N=32
g=0
 
for i in slovo:
    c=(slovo[g]+S)%N
    print(c)
    g=g+1


Здесь нужно сделать так, чтобы текст, который вводит пользователь делился по буквам, потом сравнивался с алфавитом alfa, а потом буквы превращались в цифры, нумерующие порядок этих букв в alfa. А потом уже просто зашифровать.

Кто знает, как можно это реализовать?

Я поискал в интернете и там чисто всё с функциями, да и объяснений маловато.
Ничего не понятно, поэтому, я решил сделать чисто с помощью FOR и (возможно) IF, ELSE.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Делишь задачу на под-задачи. Допустим, у тебя есть строка-исходный текст text и строка-ключ key, а также список строк, содержащий алфавит языка alpha.
Определяешь функцию, заменяющую символ по шифру:
# принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ шифротекста
def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
  if text_char not in alpha:  # незнакомый символ?
    return text_char  # оставляем его как есть
  text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
  key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
  key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
  cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
  return alpha[cypher_char_code]  # возвращаем символ шифротекста

А дальше применяем эту функцию к строке:
cipher_text = ''
for i in range(len(text)):
  cipher_text += viginere_encode(text[i], i, key, alpha)

Вот и всё. Да, тут много чего можно оптимизировать, но я старался писать как можно проще.

Полный пример
alpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
text = 'A SMOKE OF MOTHERLAND IS SWEET FOR US AND PLEASANT'
key = 'SECRET'

# принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ шифротекста
def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
  if text_char not in alpha:  # незнакомый символ?
    return text_char  # оставляем его как есть
  text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
  key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
  key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
  cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
  return alpha[cypher_char_code]  # возвращаем символ шифротекста

# принимает символ шифротекста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ открытого текста
def viginere_decode(cipher_char: str, i: int, key: str, alpha: list[str]) -> str:
  if cipher_char not in alpha:  # незнакомый символ?
    return cipher_char  # оставляем его как есть
  cipher_char_code = alpha.index(cipher_char)  # номер символа шифротекста в алфавите
  key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу шифротекста 
  key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
  text_char_code = (text_char_code + len(alpha) - key_char_code) % len(alpha)  # номер символа открытого текста
  return alpha[cypher_char_code]  # возвращаем символ открытого текста


cipher_text = ''
for i in range(len(text)):
  cipher_text += viginere_encode(text[i], i, key, alpha)

decoded_text = ''
for i in range(len(cipher_text)):
  decoded_text += viginere_decode(cipher_text[i], i, key, alpha)

print(text)
print(cipher_text)
print(decoded_text)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы