轨道
/
Python
Python
/
练习
/
简单密码
简单密码

简单密码

简单

说明

实现一个维吉尼亚密码。 维吉尼亚密码是一种简单的替换密码。

密码术语

密码是一种用于加密(也就是编码)字符串的算法。 未加密的字符串称为_明文_,加密后的字符串称为_密文_。 把明文转换为密文称为_编码_,反过来则称为_解码_。

在_替换密码_中,明文的每个字母都会被替换成一个密文字母,而替换的依据是一个_密钥_。 (注意,替换后的字母有可能和原来的字母相同。)

编码细节

在这种密码中,密钥是一串小写字母,比如"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 个随机的小写拉丁字母组成。

这里该用 random 还是 secrets?

从 Python 3.6 开始,有两个不同的模块可以用来生成“随机”数:

名为random的模块是伪随机的,也就是说它不会生成真正的随机性,而是遵循某种模拟随机性的算法。 由于这些“随机数”是通过一个已知算法生成的,它们并不是真正随机的。因此,random 模块不适合用于密码学,也不应该使用,正是因为它只是伪随机的。

名为secrets的模块可以生成密码学安全的“随机”数,提供密码学所需的更高安全性。 严格来说,它们仍然是伪随机的,但它们能保证所生成的数字绝对不可预测。

由于这只是一个练习,使用random模块是没问题的,但要注意,如果真的用于密码学,那会非常不安全。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Python Exercism

准备好开始 简单密码 了吗?

注册 Exercism,借助 17 个概念146 个练习 和真人导师指导,学习并掌握 Python,全部免费。