Виженера Шифр был простым полиалфавитным шифром , который в основном применяется один из нескольких шифров Цезаря, в соответствии с ключом. В основном буквы в ключе указывают, какой сдвинутый алфавит использовать. Для этого был простой инструмент, называемый квадратом Вигенера:
Здесь каждая строка представляет собой отдельный алфавит, начинающийся с соответствующей буквы ключа. Затем столбцы используются для определения зашифрованной буквы. Расшифровка работает почти так же, только наоборот.
Предположим, мы хотим зашифровать строку CODEGOLF
. Нам также нужен ключ. В этом случае ключ должен быть FOOBAR
. Когда ключ короче открытого текста, мы расширяем его повторением, поэтому фактический ключ мы используем FOOBARFO
. Теперь посмотрим на первую букву ключа, который F
должен найти алфавит. Это начинается, возможно неудивительно, с F
. Теперь мы находим столбец с первой буквой открытого текста и получающейся буквой H
. Для второй буквы мы имеем O
в качестве ключевой буквы и буквы в виде простого текста, в результате чего C
. Продолжая в том же духе, мы наконец получаем HCRFGFQT
.
задача
Ваша задача сейчас - расшифровать сообщения, заданные ключом. Однако, поскольку мы переросли 16-й век и имеем компьютеры, мы должны по крайней мере поддерживать алфавит чуть большего размера:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Построение квадрата Вигенера по-прежнему очень похоже, и шифр работает по-прежнему. Просто немного ... громоздко давать здесь в полном объеме.
вход
Ввод вводится при стандартном вводе в виде двух отдельных строк текста, каждая из которых заканчивается разрывом строки. Первая строка содержит ключ, а вторая содержит зашифрованный текст.
Выход
Одна строка, содержащая расшифрованное сообщение.
Выигрышное условие
Поскольку шифрование иногда рассматривается как оружие, код должен быть коротким, чтобы облегчить контрабанду. Чем короче, тем лучше, так как это снижает вероятность открытия.
Пример ввода 1
Key
miQ2eEO
Пример вывода 1
Message
Пример ввода 2
ThisIsAKey
CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu
Пример вывода 2
ThisWorksEquallyWellWithNumbers123894576
Прошла неделя На данный момент самое короткое решение принято. Для тех, кто заинтересован, в нашем конкурсе были представлены следующие материалы и продолжительность:
130 - Python
146 - Haskell
195 - C
197 - C
267 - VB.NET
И наши собственные решения, которые не были ранжированы с другими:
108 - Ruby
139 - PowerShell