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

问题描述 投票:-1回答:2

这里是问题:

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

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

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

您的代码应为此问题实现以下五个功能。

  • [Name:

    创建密码字典
    • 参数:没有参数。
    • 返回值:
    • 字典,其中每个键是一个常规字符,每个值是一个介于00到99之间(含0和99)的随机两位数字。
    • 它应该做什么:
    • 在提供给您的代码的顶部,定义了字符串LETTERS。该字符串包含所有字母,数字和特殊符号,它们应该是字典中的键。您将必须遍历此字符串,并为每个字符在0099之间生成一个两位数的随机数。两位数字将是字典中的值;每个字符(键)将具有一个两位数的数字(值)。
    • 请注意,数字0、1、2,...,9不应为值;而是应使用数字00、01、02,...,09。此外,请注意,每个字符都应具有唯一的随机数。也就是说,如果字符“ a”映射到值“ 57”,则其他任何字符都不应映射到值“ 57”。 (您将需要使用某种循环来不断生成新的随机数,直到找到唯一的数字为止。)
  • [名称:

  • 加密
    • 参数:字符串s
    • 返回值:字符串s的加密版本。原始字符串s的每个字符都应由密码词典中的相应两位数代替。
  • [名称:

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

    我们将编写另外两个函数来增强我们的加密强度。一个功能将多次重复加密该字符串。另一个函数将尝试解密该字符串,而不知道它被加密的次数(因此无法达到更强加密的目的)。

    • [名称:

      多次加密
      • 参数:字符串s和整数值n,表示加密字符串的次数。
      • 返回值:字符串s加密n次。即,该字符串将首次加密,每个字符都将转换为两位数。然后,将对加密的字符串进行重新加密,并将每个数字转换为其两位数字表示形式。 (因此,每次加密后,字符串的长度将增加一倍。)(提示:您必须多次调用您的加密函数。)
  • [Name:

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

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

    这是我尝试输入的内容:

    def reverse_lookup(d,v):
        for key in d:
            if d[key]==v:
                return key
        return None
    
    LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()`~-=_+[]{}|;\':",./<>? '
    def create_cypher_dictionary():
        random.seed(1337)
        cypher={}
    
        ar=[0]*100
        for c in LETTERS:
            n=random.randrange(0, 100, 1)
            while ar[n]!=0:
                n=random.randrange(0, 100, 1)
            ar[n]=1
            if n<10:
                cypher[c]=str('0')+str(n)
            else:
                cypher[c]=str(n)
    
        return cypher
    
    def encrypt(s):
        cypher=create_cypher_dictionary()
    
        new_s=''
        for c in s:
            new_s=new_s+cypher[c]
    
        return new_s
    
    def decrypt(s):
        cypher=create_cypher_dictionary()
    
        new_s=''
        for i in range(len(s)-1):
            c=s[i]+s[i+1]
            for cc in cypher:
                if cypher[cc]==c:
                    new_s=new_s+cc
    
        return new_s
    
    def encrypt_multiple_times(s,n):
    
        for i in range(n):
            s=encrypt(s)
        return s
    
    
    COMMON_WORDS= ['the','be','to','of','and','a','in','that','have','I','it','for','not','on','with','he','as','you','do','at']
    
    def check_common_words(s):
        for word in COMMON_WORDS:
            if word in s:
                return False
        return True
    
    def decrypt_multiple_times(s):
    
        cypher=create_cypher_dictionary()
        while check_common_words(s):
            s=decrypt(s)
    
        return s
    
    
    s=input('Enter text to encrypt:')
    
    if check_common_words(s)==False:
    
        print("Encrypted string:", encrypt(s))
        print("Decrypted string:", decrypt(encrypt(s)))
    
        salted_s = encrypt_multiple_times(s, 2)
    
        print("Encrypted x2 string:", salted_s)
        print("Decrypted x2 string:", decrypt_multiple_times(salted_s))
    
    else:
        print('Invalid input.')
    

    这是它产生的输出:

    Enter text to encrypt:The quick brown fox jumps over the lazy dog
    Encrypted string:   36217337975199904937688489645037748985374251392613378908738437542173378179944437468993
    Decrypted string: T0h-eK aq?u(iic,kg CbIr~o@wBn8 Jf~o>x[ fjLusm3p=sK Yocv<e/r" ?tjh-eK Yl-aizyy" fdboig
    Encrypted x2 string: 9223712963929263666327296666666282669263230303820366238227629263638203660327926382712729926671232992926303666203639203829263278271296392926303296366668282829263822303666692
    Decrypted x2 string: 36 21@7m313p7T997#5W1@9999990+4p9!3p7#6'8'8/4_8T906/45C013p7T7/4_8T9]8#5a3p7/4525W1i3p9N26#1i313p7'8T990_8T7m3_8/413p7#5Y4521@7m313p7'8#1@7T999b4+4+413p7/46'8T999!3
    

    但是,应该输出:

    Enter text to encrypt: The quick brown fox jumps over the lazy dog.
    Encrypted string: 0766546138001892056159999714256163973761640073940161973354996169665461919809956156975155
    Decrypted string: The quick brown fox jumps over the lazy dog.
    Encrypted x2 string: 3417626247536227487834342778713634476227477171717117275336 4762276248711748176227625334341748715334276227711748484753717162276271626247536227712771783471714762274762711747274747
    Decrypted x2 string: The quick brown fox jumps over the lazy dog.
    

    我真的没有主意,如果有人可以提供帮助,将不胜感激。

    这里是问题:在密码学中,简单的替换密码是一种加密方法,其中用不同的字母或字母序列替换短语的每个字母。该短语可以...

    python string dictionary encryption
    2个回答
    0
    投票

    您应该只取两位数字,一次只能输入一位数字,从而错误地转换了ASCII码。只需在您的解密函数中更改for循环的步骤即可:


    0
    投票

    您可以尝试以下方法:

    © www.soinside.com 2019 - 2024. All rights reserved.