这里是问题:
在密码学中,简单的替换密码是一种加密方法,其中短语的每个字母都用不同的字母或字母序列代替。然后可以通过执行替换的逆运算来解密该短语。
在此问题中,我们将实现一个简单的替换密码,其中一个字符(字母,数字或特殊符号)由00到99(含)之间的两位数字替换。例如,可以将字母“ a”加密为数字“ 06”,或将特殊符号“!”加密为数字“ 57”。
我们将使用字典来存储每个字符及其对应的加密形式之间的映射。也就是说,字典的键将是常规字符(字母,数字和特殊符号),而值将是字符的加密形式(00
和99
之间的两位数字)。 >
您的代码应为此问题实现以下五个功能。
[Name:
创建密码字典LETTERS
。该字符串包含所有字母,数字和特殊符号,它们应该是字典中的键。您将必须遍历此字符串,并为每个字符在00
和99
之间生成一个两位数的随机数。两位数字将是字典中的值;每个字符(键)将具有一个两位数的数字(值)。[名称:
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.
我真的没有主意,如果有人可以提供帮助,将不胜感激。
这里是问题:在密码学中,简单的替换密码是一种加密方法,其中用不同的字母或字母序列替换短语的每个字母。该短语可以...
您应该只取两位数字,一次只能输入一位数字,从而错误地转换了ASCII码。只需在您的解密函数中更改for循环的步骤即可:
您可以尝试以下方法: