在 python 中加密然后解密相同的字符串

问题是:

在密码学中,简单的替换密码是一种加密方法,其中短语的每个字母都被不同的字母或字母序列替换。然后,可以通过执行替换的反函数来解密该短语。

在这个问题中,我们将实现一个简单的替换密码,其中字符(字母,数字或特殊符号)被00和99(包括)之间的两位数字替换。例如,可以将字母“a”加密为数字“06”,或者特殊符号“!”可以设置为数字“57”。

我们将使用字典来存储每个字符与其相应的加密形式之间的映射。也就是说,字典的密钥将是常规字符(字母,数字和特殊符号),值将是字符的加密形式(和 之间的两位数数字)。0099

您的代码应针对此问题实现以下五个函数。

  • 名称:创建密码字典

    • 参数:无参数。

    • 返回值:一种字典,其中每个键都是一个常规字符,每个值都是介于 00 和 99 之间的随机两位数(包括 00 和 99)。

    • 它应该做什么:在提供给您的代码的顶部,定义了字符串。此字符串包含应成为字典中键的所有字母、数字和特殊符号。您必须遍历此字符串,并在每个字符之间和为每个字符生成一个两位数的随机数。两位数将是字典中的值;每个字符(键)将有一个两位数(值)。LETTERS0099

    • 请注意,数字 0, 1, 2, ..., 9 不应该是值;相反,它们应该是数字00,01,02,...,09。此外,请注意,每个字符都应具有唯一的随机数。也就是说,如果字符“a”映射到值“57”,则其他任何字符都不应映射到值“57”。(您需要使用某种循环来继续生成新的随机数,直到找到唯一的随机数。

  • 名称:加密

    • 参数:字符串 。s

    • 返回值:字符串 s 的加密版本。原始字符串 s 的每个字符都应替换为密码字典中相应的两位数字。

  • 名称: 解密

    • 参数:字符串 。返回值:字符串 s 的解密版本。加密字符串 s 的每个两位数应替换为密码字典中的相应字符。请注意,在这里,我们有加密的形式(字典中的值),并且正在寻找常规字符(字典中的密钥7)。为此,我们需要使用类中看到的反向查找函数。此功能已在随附的 encryption.py 文件中提供给您。s

我们将编写另外两个函数来增加加密的强度。一个函数将多次重复加密字符串。另一个函数将尝试解密字符串,而不知道它被加密的次数(从而破坏了更强的加密点)。

  • 名称:多次加密

    • 参数:一个字符串和整数值,表示加密字符串的次数。sn

    • 返回值:字符串加密时间。也就是说,字符串将首次加密,每个字符转换为其两位数表示形式。然后,加密的字符串将被重新加密,每个数字都变成其两位数的表示形式。(因此,每次加密后,字符串的长度将加倍。(提示:您必须多次调用加密函数。sn

  • 名称:多次解密

    • 参数:字符串 。s

    • 返回值:字符串 的解密版本 。由于我们不知道解密字符串的次数,因此我们将继续对字符串调用decrypt,直到字符串包含英语中的常用单词。encryption.py 文件中为您提供了常用词(常用词)的列表。如果在解密一次后,字符串包含此列表中的任何单词,则应立即返回解密的字符串。否则,请继续对字符串调用 decrypt,直到它包含其中一个常用词。(我们假设完全解密的字符串将始终包含至少一个常用词。s

最后,在文件 encryption.py 结束时,您会注意到已经为您编写的一些代码。此代码要求用户输入一个字符串,然后调用各种函数并打印它们返回的内容(以生成下面看到的示例)。您必须更改此代码,以便如果用户输入的字符串不包含“常用词”列表中的任何单词,则程序应输出“无效输入”,而不是执行其余代码。否则,程序应继续执行其余代码。(提示:回想一下作业 1 和 if/else 分支。


ibeautiful
浏览 177回答 2
2回答

潇潇雨雨

你可以试试这个:LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()`~-=_+[]{}|;\':",./<>? 'def create_cypher_dictionary():&nbsp; &nbsp; numbers = [ '%02d' % i for i in range(100) ]&nbsp; &nbsp; random.shuffle( numbers )&nbsp; &nbsp; return { a : b for a,b in zip( LETTERS, numbers ) }def encrypt( cypher, string ) :&nbsp; &nbsp; return ''.join( cypher[ch] for ch in string )def decrypt( cypher, string ) :&nbsp; &nbsp; inverse_cypher = { b : a for a,b in cypher.items() }&nbsp; &nbsp; return ''.join( inverse_cypher[a+b] for a,b in zip(*[iter(string)]*2) )检查:>>> cypher = create_cypher_dictionary()>>> encoded = encrypt( cypher, 'The quick brown fox jumps over the lazy dog' )>>> encoded'93684236886025540636378012826636001276363960074903361250428036306842367064856536261211'>>> decrypt( cypher, encoded )'The quick brown fox jumps over the lazy dog'>>>&nbsp;是的,你不能每次都创建密码,你必须做一个,然后重用它,否则你的结果会有点随机=)

达令说

您一次只采用一位数字来错误地转换 ASCII,而此时您应采用两位数字。只需在解密函数中更改 for 循环的步骤:def decrypt(s):&nbsp; &nbsp; cypher=create_cypher_dictionary()&nbsp; &nbsp; new_s=''&nbsp; &nbsp; for i in range(0,len(s)-1,2): # Make the for loop step 2 instead of 1 (default)&nbsp; &nbsp; &nbsp; &nbsp; c=s[i]+s[i+1]&nbsp; &nbsp; &nbsp; &nbsp; for cc in cypher:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if cypher[cc]==c:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new_s=new_s+cc&nbsp; &nbsp; return new_s
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python