Python中替换代码的输出错误 [英] Wrong output for substitution code in Python

查看:78
本文介绍了Python中替换代码的输出错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  def OnButtonClick(self):
self.labelVariable.set(正在加密...)
字符串= self.entryVariable.get()
encryption_text =
crypt =
表示字符串中的c:
crypt = crypt + c.replace('A','F5K')
crypt = crypt + c.replace('B','O7C')
地穴=地穴+ c.replace('C','E1S')
地穴=地穴+ c.replace('D',' K1M')
地穴=地穴+ c.replace('E','U5E')
地穴=地穴+ c.replace('F','Q2D')
地穴=地穴+ c.replace('G','J0J')
地穴=地穴+ c.replace('H','I3L')
地穴=地穴+ c.replace('I',' T2T')
地穴=地穴+ c.replace('J','F7D')
地穴=地穴+ c.replace('K','R9Q')
地穴=地穴+ c.replace('L','L2Y')
地穴=地穴+ c.replace('M','G9C')
地穴=地穴+ c.replace('N',' S3C')
crypt = crypt + c.replace('O','F2E')
crypt = crypt + c.replace('P','E3G')
crypt = crypt + c.replace('Q ','I0G')
地穴=地穴+ c.replace('R','O1W')
地穴=地穴+ c.replace('S','Q3G')
地穴=地穴+ c.replace('T','D0N')
地穴=地穴+ c.replace('U','S8I')
地穴=地穴+ c.replace('V ','U8Y')
地穴=地穴+ c.replace('W','L4D')
地穴=地穴+ c.replace('X','B2K')
crypt = crypt + c.replace('Y','L7K')​​
crypt = crypt + c.replace('Z','W6L')
crypt = crypt + c.replace('a ','P8Q')
地穴=地穴+ c.replace('b','I5E')
地穴=地穴+ c.replace('c','C6D')
crypt = crypt + c.replace('d','Q2L')
crypt = crypt + c.replace('e','N4Y')
crypt = crypt + c.replace('f ','J8S')
地穴=地穴+ c.replace(' g','D9I')
地穴=地穴+ c.replace('h','P2N')
地穴=地穴+ c.replace('i','A8D')
地穴=地穴+ c.replace('j','I2I')
地穴=地穴+ c.replace('k','W4Y')
地穴=地穴+ c.replace(' l','V1B')
地穴=地穴+ c.replace('m','F4R')
地穴=地穴+ c.replace('n','Y7K')
地穴=地穴+ c.replace('o','L2K')
地穴=地穴+ c.replace('p','J3J')
地穴=地穴+ c.replace(' q','R2W')
地穴=地穴+ c.replace('r','A7S')
地穴=地穴+ c.replace('s','C9C')
地穴=地穴+ c.replace('t','S2M')
地穴=地穴+ c.replace('u','F4W')
地穴=地穴+ c.replace(' v','V7F')
地穴=地穴+ c.replace('w','D6V')
地穴=地穴+ c.replace('x','A7L')
地穴=地穴+ c.replace('y','O5R')
c rypt = crypt + c.replace('z','Q3L')
crypt = crypt + c.replace('1','Z3W')
crypt = crypt + c.replace('2 ','B51')
地穴=地穴+ c.replace('3','G1N')
地穴=地穴+ c.replace('4','A8T')
crypt = crypt + c.replace('5','N7T')
crypt = crypt + c.replace('6','O7N')
crypt = crypt + c.replace('7 ','J0L')
地穴=地穴+ c.replace('8','C7Q')
地穴=地穴+ c.replace('9','M7V')
crypt = crypt + c.replace('0','N3B')
crypt = crypt + c.replace(',','M5Z')
crypt = crypt + c.replace('。 ','O2O')
地穴=地穴+ c.replace('!','E7L')
地穴=地穴+ c.replace('?','Z1N')
crypt = crypt + c.replace(','G7M')
crypt = crypt + c.replace('','P6B')
crypt = crypt + c.replace('' ,'S31')
crypt = crypt + c.replace('(' ,'O4F')
crypt = crypt + c.replace(')','H6F')
crypt = crypt + c.replace('@','W9C')
crypt =地穴+ c.replace('#','B7Q')
地穴=地穴+ c.replace('&','G1Y')
地穴=地穴+ c.replace('* ','Y2Z')
地穴=地穴+ c.replace('-','Z1X')
地穴=地穴+ c.replace('_','C9G')
crypt = crypt + c.replace('+','O2Q')
crypt = crypt + c.replace('=','C7A')
crypt = crypt + c.replace( $ ,'D4E')
地穴=地穴+ c.replace('/','Q61')
地穴=地穴+ c.replace('<','M3T')
地穴=地穴+ c.replace('>','H6X')
地穴=地穴+ c.replace(';','E8I')
地穴=地穴+ c.replace( ':','Y1U')
crypt = crypt + c.replace('%','J3N')
crypt = crypt + c.replace('^','P0Q')
Divid4count = 0
对于crypt中的c:
如果divid4count%3.0 == 0,那么diviv4count = Divor4count + 1

c2 = c + random.choice('1234567890')
cryptod_text =加密文本+ c2
否则:
加密文本=加密文本+ c
self.entryVariable.set(encrypted_text [::-1])$ ​​b $ b self.labelVariable.set( Encrypted)
self.entry.selection_range(0 ,Tkinter。END)

该程序的目标是为隐私目的创建一个简单的密码。输出应采用以下格式:X1X1X1X1X1X1X1X1X1X1X1X1
字母,数字,字母,随机垃圾编号



但是,在输入小写字母a作为输入后,它将$ a的s代入$ a到$ a上$ a到$ a ,数字模式。



有人可以向我解释为什么我得到的输出不同于我打算得到的输出吗?还可以请我帮忙解决这个问题吗?



最后,有人可以告诉我此代码是否安全,如果不能,那么如何破解它,以便我进行改进?

解决方案

哇。好吧,让我们想象一下输入文本(应该与GUI紧密耦合)是 C

  crypt = 
用于字符串中的c:#c =='C'看看我在那做什么?
地穴=地穴+ c.replace('A','F5K')#地穴= C等待...
地穴=地穴+ c.replace('B','O7C') #crypt = CC是什么?
crypt = crypt + c.replace('C','E1S')#crypt = CCE1S没关系
crypt = crypt + c.replace('D','K1M')# crypt = CCE1SC哦,但现在...

这又持续了60多条令人痛苦的行。然后为每个字符重复。然后,由于某种原因,您返回插入随机数;



您应该使用字典映射,例如,为什么不这样做呢? {'A':'F5K',...} ,则加密变得更加简单:

 导入字符串

...

crypt = []#不要不断添加字符串,它们是不可变的
$ b代表c中的b $ b:#不要称它为字符串
crypt.append(mapping.get(c,c))
crypt.append(random.choice(string.digits))#为什么最后要全部?!

注意:


  1. 我正在使用 字符串模块,因此不要将名称 string 用作我要遍历的字符串。相反,我可以从字符串导入数字中 ,但是 string 是一个经常使用的模块,我倾向于避免使用该名称

  2. 字符串是不可变的,因此加法实际上创建了一个新对象,效率相对较低。参见例如此处此处 str.join 是首选,尤其是在要添加很多字符串的情况下(就像是长消息一样)。

然后可以只分配 encrypted_text = .join(crypt)



所有这些都应该包装在既不知道也不在乎GUI是什么的函数中(即使有)。

  I3L1N4Y2V1B9V1B4L2K2M5Z7S315D6V2L2K6A7S9V1B4Q2L1E7L4 


    def OnButtonClick(self):
        self.labelVariable.set("Encrypting...")
        string = self.entryVariable.get()
        encrypted_text = ""
        crypt = ""
        for c in string:
            crypt = crypt + c.replace('A','F5K')
            crypt = crypt + c.replace('B','O7C')
            crypt = crypt + c.replace('C','E1S')
            crypt = crypt + c.replace('D','K1M')
            crypt = crypt + c.replace('E','U5E')
            crypt = crypt + c.replace('F','Q2D')
            crypt = crypt + c.replace('G','J0J')
            crypt = crypt + c.replace('H','I3L')
            crypt = crypt + c.replace('I','T2T')
            crypt = crypt + c.replace('J','F7D')
            crypt = crypt + c.replace('K','R9Q')
            crypt = crypt + c.replace('L','L2Y')
            crypt = crypt + c.replace('M','G9C')
            crypt = crypt + c.replace('N','S3C')
            crypt = crypt + c.replace('O','F2E')
            crypt = crypt + c.replace('P','E3G')
            crypt = crypt + c.replace('Q','I0G')
            crypt = crypt + c.replace('R','O1W')
            crypt = crypt + c.replace('S','Q3G')
            crypt = crypt + c.replace('T','D0N')
            crypt = crypt + c.replace('U','S8I')
            crypt = crypt + c.replace('V','U8Y')
            crypt = crypt + c.replace('W','L4D')
            crypt = crypt + c.replace('X','B2K')
            crypt = crypt + c.replace('Y','L7K')
            crypt = crypt + c.replace('Z','W6L')
            crypt = crypt + c.replace('a','P8Q')
            crypt = crypt + c.replace('b','I5E')
            crypt = crypt + c.replace('c','C6D')
            crypt = crypt + c.replace('d','Q2L')
            crypt = crypt + c.replace('e','N4Y')
            crypt = crypt + c.replace('f','J8S')
            crypt = crypt + c.replace('g','D9I')
            crypt = crypt + c.replace('h','P2N')
            crypt = crypt + c.replace('i','A8D')
            crypt = crypt + c.replace('j','I2I')
            crypt = crypt + c.replace('k','W4Y')
            crypt = crypt + c.replace('l','V1B')
            crypt = crypt + c.replace('m','F4R')
            crypt = crypt + c.replace('n','Y7K')
            crypt = crypt + c.replace('o','L2K')
            crypt = crypt + c.replace('p','J3J')
            crypt = crypt + c.replace('q','R2W')
            crypt = crypt + c.replace('r','A7S')
            crypt = crypt + c.replace('s','C9C')
            crypt = crypt + c.replace('t','S2M')
            crypt = crypt + c.replace('u','F4W')
            crypt = crypt + c.replace('v','V7F')
            crypt = crypt + c.replace('w','D6V')
            crypt = crypt + c.replace('x','A7L')
            crypt = crypt + c.replace('y','O5R')
            crypt = crypt + c.replace('z','Q3L')
            crypt = crypt + c.replace('1','Z3W')
            crypt = crypt + c.replace('2','B51')
            crypt = crypt + c.replace('3','G1N')
            crypt = crypt + c.replace('4','A8T')
            crypt = crypt + c.replace('5','N7T')
            crypt = crypt + c.replace('6','O7N')
            crypt = crypt + c.replace('7','J0L')
            crypt = crypt + c.replace('8','C7Q')
            crypt = crypt + c.replace('9','M7V')
            crypt = crypt + c.replace('0','N3B')
            crypt = crypt + c.replace(',','M5Z')
            crypt = crypt + c.replace('.','O2O')
            crypt = crypt + c.replace('!','E7L')
            crypt = crypt + c.replace('?','Z1N')
            crypt = crypt + c.replace("'",'G7M')
            crypt = crypt + c.replace('"','P6B')
            crypt = crypt + c.replace(' ','S31')
            crypt = crypt + c.replace('(','O4F')
            crypt = crypt + c.replace(')','H6F')
            crypt = crypt + c.replace('@','W9C')
            crypt = crypt + c.replace('#','B7Q')
            crypt = crypt + c.replace('&','G1Y')
            crypt = crypt + c.replace('*','Y2Z')
            crypt = crypt + c.replace('-','Z1X')
            crypt = crypt + c.replace('_','C9G')
            crypt = crypt + c.replace('+','O2Q')
            crypt = crypt + c.replace('=','C7A')
            crypt = crypt + c.replace("$",'D4E')
            crypt = crypt + c.replace('/','Q61')
            crypt = crypt + c.replace('<','M3T')
            crypt = crypt + c.replace('>','H6X')
            crypt = crypt + c.replace(';','E8I')
            crypt = crypt + c.replace(':','Y1U')
            crypt = crypt + c.replace('%','J3N')
            crypt = crypt + c.replace('^','P0Q')
        divide4count = 0
        for c in crypt:
            divide4count = divide4count + 1
            if divide4count%3.0 == 0:
                c2 = c + random.choice('1234567890')
                encrypted_text = encrypted_text + c2
            else:
                encrypted_text = encrypted_text + c
        self.entryVariable.set(encrypted_text[::-1])
        self.labelVariable.set("Encrypted")
        self.entry.selection_range(0, Tkinter.END)

The goal of this program is to make a simple secret code for privacy purposes. The output is supposed to be in this format: X1X1X1X1X1X1X1X1X1X1X1 Letter, Number, Letter, Random junk number

However, after entering a lowercase a as input, it encrypted it to aa9aaa1aaa6aaa0aaa5aaa8aaa9aaa8aaa6aaa6aaa3aaa9aaa4aaa9aaa4aaa3aaa3aaa6aaa4aaa7aQ85Paa3aaa2aaa6aaa5aaa7aaa9aaa0aaa5aaa

The code converts symbols (the alphabet and punctuation.) to alphanumeric strings of the format X1X, the adds a random number after those to make it a letter, number pattern.

Can anyone explain to me why I am getting a different output than the one I intended to get?Also could you please help me in fixing it?

Lastly, could anyone tell me whether this code is secure, and if not, how it could be broken, so I can improve it?

解决方案

Wow. Well, let's imagine the input text (which should not be so closely coupled to the GUI) is "C":

crypt = ""
for c in string: # c == 'C'                                 see what I did there?
    crypt = crypt + c.replace('A','F5K') # crypt = "C"      wait...
    crypt = crypt + c.replace('B','O7C') # crypt = "CC"     what?
    crypt = crypt + c.replace('C','E1S') # crypt = "CCE1S"  well that's ok
    crypt = crypt + c.replace('D','K1M') # crypt = "CCE1SC" oh but now...

That continues for another 60-odd harrowing lines. Then repeats for each character. Then, for some reason, you go back through inserting random numbers; why didn't you do that as each character was encoded?!

You should use a dictionary mapping e.g. {'A': 'F5K', ...}, then the encryption becomes much simpler:

import string 

...

crypt = [] # don't keep adding strings, they're immutable

for c in s: # don't call it string
    crypt.append(mapping.get(c, c))
    crypt.append(random.choice(string.digits)) # why do that all at the end?!

Notes:

  1. I am using the string module, so am not using the name string for the string I'm iterating over. I could instead from string import digits, but string is such a frequently-used module that I tend to avoid that name anyway.
  2. Strings are immutable, so "addition" really creates a new object, which is relatively inefficient. See e.g. here and here; str.join is preferred, particularly where you are adding a lot of strings (as you would be for a long message).

You can then just assign encrypted_text = "".join(crypt).

This should all be wrapped in a function that neither knows nor cares what the GUI is (or even if there is one).

I3L1N4Y2V1B9V1B4L2K2M5Z7S315D6V2L2K6A7S9V1B4Q2L1E7L4

这篇关于Python中替换代码的输出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆