The Vigenère cipher was a simple polyalphabetic cipher that basically applied one of several Caesar ciphers, according to a key. Basically the letters in the key indicate which shifted alphabet to use. To that end there was a simple tool, called the Vigenère square:
Here each row is a separate alphabet, starting with the corresponding letter of the key. The columns then are used to determine the ciphered letter. Decryption works in very much the same fashion, only vice-versa.
Suppose we want to encrypt the string CODEGOLF
. We also need a key. In this case the key shall be FOOBAR
. When the key is shorter than the plaintext we extend it by repetition, therefore the actual key we use is FOOBARFO
. We now look up the first letter of the key, which is F
to find the alphabet. It starts, perhaps unsurprisingly, with F
. Now we find the column with the first letter of the plaintext and the resulting letter is H
. For the second letter we have O
as the key letter and the plain text letter, resulting in C
. Continuing that way we finally get HCRFGFQT
.
Task
Your task now is to decipher messages, given a key. However, since we have outgrown the 16th century and have computers we should at least support a slightly larger alphabet:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
The construction of the Vigenère square is still very much the same and the cipher still works in the same way. It's just a bit ... unwieldy to give here in full.
Input
Input is given on standard input as two separate lines of text, each terminated by a line break. The first line contains the key while the second contains the ciphertext.
Output
A single line, containing the deciphered message.
Winning condition
Since encryption is sometimes regarded as a weapon, the code should be short to facilitate easy smuggling. The shorter the better, as it reduces the likelihood of discovery.
Sample input 1
Key
miQ2eEO
Sample output 1
Message
Sample input 2
ThisIsAKey
CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu
Sample output 2
ThisWorksEquallyWellWithNumbers123894576
A week has passed. The currently shortest solution has been accepted. For those interested, in our contest we had the following submissions and lengths:
130 – Python
146 – Haskell
195 – C
197 – C
267 – VB.NET
And our own solutions that weren't ranked with the others:
108 – Ruby
139 – PowerShell