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

    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)
    Ответ написан
    1 комментарий