持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
字典加解密
字典理解类似于列表理解。一般形式是
主要区别(除了使用集合大括号而不是方括号之外)是它使用两个值来创建字典的每个元素,并允许(但不要求)可迭代对象一次返回两个值。考虑一个字典,将一些十进制数字映射到英语单词:
我们可以轻松地使用字典理解来生成一个字典,该字典将单词映射到数字
果我们决定只想要单词 to_number 中的一位数数字,我们可以使用理解
如果现在,让我们尝试一些更雄心勃勃的方法。密码是一种将纯文本(人类可以轻松阅读的文本)映射到加密文本的算法。最简单的密码是用唯一字符串替换纯文本中的每个字符的替换密码。从原始字符到替换它们的字符串的映射称为密钥(通过类比用于打开锁的密钥类型,而不是Python字典中使用的密钥类型)。在Python中,字典提供了一种方便的方法来实现可用于编码和解码文本的映射。
书籍密码是密钥派生自书籍的密码。例如,它可能会将纯文本中的每个字符映射到该字符在书中(或书的某一页上)首次出现的数字索引。假设编码消息的发送者和接收者之前已经就该书达成了一致,但是拦截编码消息的对手不知道是用哪本书来编码的。
以下函数定义使用字典理解来创建可用于使用书籍密码对纯文本进行编码的字典。
如果plain_text是“不就是不”,书的开头是“从前,在遥远的土地上的房子里”,那么gen_code_keys(书,plain_text)的电话就会回来。
顺便说一句,请注意,o映射到七而不是零,因为o和O是不同的字符。如果书是唐的文字堂吉诃德,3] 呼叫gen_code_keys(书,plain_text)将返回
现在我们有了编码字典,我们可以使用列表理解来定义一个函数,该函数使用它来加密纯文本
由于纯文本中的字符可能会被密码文本中的多个字符替换,因此我们使用 * 来分隔密文中的字符。这。join 运算符用于将字符串列表转换为单个字符串。
加密功能使用gen_code_keys和编码器来加密纯文本
编码器 (gen_code_keys(书, plain_text), plain_text)) 调用加密 (Don_Quixote, “不就是不”) 返回
在解码密文之前,我们需要构建一个解码字典。最简单的做法是反转编码字典,但那将是作弊。书籍密码的全部意义在于发件人发送加密消息,但不发送有关密钥的任何信息。接收方解码消息的唯一需要做的就是访问编码器使用的书籍。以下函数定义使用字典理解从书籍和编码消息构建解码密钥。
{s: cipher_text中的书[国际])呼叫gen_decode_keys (Don_Quixote,
1 * 13 * 2 * 6 * 57 * 2 * 1 * 13'将产生解密密钥
如果一个角色出现在纯文本中,但不出现在书中,那么就会发生不好的事情。code_keys字典会将每个这样的字符映射到 -1,decode_keys将映射为 -1 到书中最后一个字符。