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



以下是问题:

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

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

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

对于这个问题,您的代码应该实现以下五个函数。

  • 名称:创建密码字典

    • 参数:无参数
    • 返回值:字典,其中每个键都是一个正则字符,每个值都是介于00和99之间的随机两位数,包括00和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次。也就是说,字符串将进行第一次加密,每个字符都将变成其两位数的表示。然后,加密后的字符串将被重新加密,每个数字都变成其两位数的表示。(因此,每次加密后,字符串的长度都会翻倍。)(提示:您必须多次调用加密函数。)
  • 名称:多次解密

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

最后,在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.

我真的没有主意,如果有人能帮忙,我将不胜感激。

你可以试试这个:

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'
>>> 

是的,你不能每次都创建密码,你必须制作一个并重复使用,否则你的结果将是随机的=)

一次只取一位,而应该取两位,这是在错误地转换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

最新更新