实现一个维吉尼亚密码。 维吉尼亚密码是一种简单的替换密码。
密码是一种用于加密(也就是编码)字符串的算法。 未加密的字符串称为_明文_,加密后的字符串称为_密文_。 把明文转换为密文称为_编码_,反过来则称为_解码_。
在_替换密码_中,明文的每个字母都会被替换成一个密文字母,而替换的依据是一个_密钥_。 (注意,替换后的字母有可能和原来的字母相同。)
在这种密码中,密钥是一串小写字母,比如"abcd"。
明文的每个字母都会根据密钥中对应的字母_平移_或_旋转_一定的距离。
密钥中的"a"表示平移 0 位(也就是不平移)。
密钥中的"b"表示平移 1 位。
密钥中的"c"表示平移 2 位,依此类推。
明文的第一个字母使用密钥的第一个字母,明文的第二个字母使用密钥的第二个字母,依此类推。 如果在明文用完之前密钥先用完了,就回到密钥的开头重新开始。
如果密钥只包含一个字母,比如"dddddd",那么明文的所有字母都平移相同的位数(在这个例子里是 3 位),这就和旋转密码或移位密码(有时也叫凯撒密码)一样了。
例如,明文"iamapandabear"会变成"ldpdsdqgdehdu"。
如果密钥只包含字母"a"(一个或多个),平移距离就是零,密文与明文相同。
不过,密钥通常比这更复杂!
如果密钥是"abcd",那么明文的字母会分别平移 0、1、2、3 位。
如果明文是"hello",我们需要 5 次平移,所以密钥会循环使用,平移距离依次是 0、1、2、3、0。
把这些平移作用到"hello"的字母上,就得到"hfnoo"。
如果没有提供密钥,就生成一个密钥,由至少 100 个随机的小写拉丁字母组成。