实现一个维吉尼亚密码。 维吉尼亚密码是一种简单的替换密码。
密码是一种用于加密(也就是编码)字符串的算法。 未加密的字符串称为_明文_,加密后的字符串称为_密文_。 把明文转换为密文称为_编码_,反过来则称为_解码_。
在_替换密码_中,明文的每个字母都会被替换成一个密文字母,而替换的依据是一个_密钥_。 (注意,替换后的字母有可能和原来的字母相同。)
在这种密码中,密钥是一串小写字母,比如"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 个随机的小写拉丁字母组成。
从 Python 3.6 开始,有两个不同的模块可以用来生成“随机”数:
名为random的模块是伪随机的,也就是说它不会生成真正的随机性,而是遵循某种模拟随机性的算法。
由于这些“随机数”是通过一个已知算法生成的,它们并不是真正随机的。因此,random 模块不适合用于密码学,也不应该使用,正是因为它只是伪随机的。
名为secrets的模块可以生成密码学安全的“随机”数,提供密码学所需的更高安全性。
严格来说,它们仍然是伪随机的,但它们能保证所生成的数字绝对不可预测。
由于这只是一个练习,使用random模块是没问题的,但要注意,如果真的用于密码学,那会非常不安全。