根据一位密钥,Vigenère密码是一种简单的多字母密码,基本上使用了几种Caesar密码之一。通常,键中的字母表示要使用的移位字母。为此,有一个简单的工具称为维格涅尔广场:
这里的每一行都是一个单独的字母,从键的相应字母开始。然后,这些列用于确定密文字母。解密的工作方式几乎相同,反之亦然。
假设我们要加密字符串CODEGOLF
。我们还需要一个钥匙。在这种情况下,密钥应为FOOBAR
。当密钥短于明文时,我们通过重复对其进行扩展,因此我们使用的实际密钥为FOOBARFO
。现在,我们查找键的第一个字母,即F
找到字母。它始于,也许不足为奇F
。现在,我们找到带有纯文本首字母的列,结果字母为H
。对于第二个字母,我们将其O
作为关键字母和纯文本字母,结果为C
。继续这样下去,我们终于得到了HCRFGFQT
。
任务
现在,您的任务是解密给定密钥的消息。但是,由于我们已经不适合16世纪,并且拥有计算机,因此我们至少应该支持稍大一些的字母:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Vigenère广场的结构仍然非常相似,并且密码仍然以相同的方式工作。只是有点...笨拙地在这里给出。
输入值
输入在标准输入上以两条单独的文本行给出,每行以换行符终止。第一行包含密钥,第二行包含密文。
输出量
一行,包含已解密的消息。
获奖条件
由于有时将加密视为一种武器,因此代码应简短易行。越短越好,因为它减少了发现的可能性。
样品输入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