为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2022-08-02 16:53:11
问题是:在密码学中,简单的替换密码是一种加密方法,其中短语的每个字母都被不同的字母或字母序列替换。然后,可以通过执行替换的反函数来解密该短语。在这个问题中,我们将实现一个简单的替换密码,其中字符(字母,数字或特殊符号)被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 分支。
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

你可以试试这个:


LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()`~-=_+[]{}|;\':",./<>? '


def create_cypher_dictionary():

    numbers = [ '%02d' % i for i in range(100) ]

    random.shuffle( numbers )

    return { a : b for a,b in zip( LETTERS, numbers ) }


def encrypt( cypher, string ) :

    return ''.join( cypher[ch] for ch in string )


def decrypt( cypher, string ) :

    inverse_cypher = { b : a for a,b in cypher.items() }

    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'

>>> 

是的,你不能每次都创建密码,你必须做一个,然后重用它,否则你的结果会有点随机=)


查看完整回答
反对 回复 2022-08-02
?
达令说

TA贡献1821条经验 获得超6个赞

您一次只采用一位数字来错误地转换 ASCII,而此时您应采用两位数字。只需在解密函数中更改 for 循环的步骤:


def decrypt(s):

    cypher=create_cypher_dictionary()


    new_s=''

    for i in range(0,len(s)-1,2): # Make the for loop step 2 instead of 1 (default)

        c=s[i]+s[i+1]

        for cc in cypher:

            if cypher[cc]==c:

                new_s=new_s+cc


    return new_s


查看完整回答
反对 回复 2022-08-02
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信