Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的解密函数有什么问题?_Python_Python 2.7_Encryption - Fatal编程技术网

Python 我的解密函数有什么问题?

Python 我的解密函数有什么问题?,python,python-2.7,encryption,Python,Python 2.7,Encryption,当我加密bob然后使用解密函数时,它返回bob。但是,对于较长的内容,如加密后的段落,密文包含\斜杠,则无法工作。我没有返回ascii字符或base64字符,而是返回奇怪的汉字或方形字符。请告诉我任何能为我指明正确方向的见解都会有帮助 正如jasonharper所说,您在Base64数据上调用re.escape,这是在破坏它。一旦你摆脱了它,你的代码应该是好的。我还没有对它进行过广泛的测试,但它可以正确地处理多行文本 您还应该从decrypt函数中消除此问题: import base64 imp

当我加密bob然后使用解密函数时,它返回bob。但是,对于较长的内容,如加密后的段落,密文包含\斜杠,则无法工作。我没有返回ascii字符或base64字符,而是返回奇怪的汉字或方形字符。请告诉我任何能为我指明正确方向的见解都会有帮助

正如jasonharper所说,您在Base64数据上调用
re.escape
,这是在破坏它。一旦你摆脱了它,你的代码应该是好的。我还没有对它进行过广泛的测试,但它可以正确地处理多行文本

您还应该从
decrypt
函数中消除此问题:

import base64
import re

def encrypt(cleartext, key):
    to_return = bytearray(len(cleartext)) 
    for i in xrange(len(cleartext)):     
        to_return[i] = ord(cleartext[i]) ^ ord(key)
    return base64.encodestring(str(to_return))

def decrypt(ciphertxt,key):
    x = base64.decodestring(re.escape(ciphertxt))
    to_return = bytearray(len(x))
    for i in xrange(len(x)): 
        to_return[i] = ord(x[i]) ^ ord(key)

        while to_return[i]>127:
              to_return[i]-=127

    return to_return
如果原始明文是有效的ASCII码,它不会做任何事情,但是如果明文包含大于127的字节,它会扰乱解码

但是,这些功能可能会更有效率

FWIW,这里有一个在Python2和Python3上都能正常工作的版本。由于在处理Python3中文本和字节处理的变化时做了一些折衷,因此这段代码没有Python3上的效率高

while to_return[i]>127: 
    to_return[i]-=127
Python 3输出

import base64

def encrypt(cleartext, key):
    buff = bytearray(cleartext.encode())
    key = ord(key)
    buff = bytearray(c ^ key for c in buff)
    return base64.b64encode(bytes(buff))

def decrypt(ciphertext, key):
    buff = bytearray(base64.b64decode(ciphertext))
    key = ord(key)
    buff = bytearray(c ^ key for c in buff)
    return buff.decode()

# Test

s = 'This is a test\nof XOR encryption'
key = b'\x53'
coded = encrypt(s, key)
print(coded)
plain = decrypt(coded, key)
print(plain)

你到底为什么在这里使用
re.escape()
?这是用于准备正则表达式搜索模式的。在对字符串进行任何更改的情况下,它会从该点开始完全破坏Base64编码。顺便说一句,这不是凯撒密码的一种形式。您不必担心字符串中有反斜杠,除非它们是您在脚本中键入的文字字符串。请不要破坏您的问题或试图破坏他人提交的答案!当您将材质发布到Stack Overflow时,您已经同意允许Stack Overflow使用该材质,它不再是您的唯一财产。请看,我不能重现那个问题。你能给我一个产生奇怪输出的字符串示例吗?如果要给
encrypt
一个带有反斜杠的文本字符串,则需要正确转义,但不能使用
re.escape
。@citrusake为什么不能发布文本?不要试图把它放在注释中,而是放在问题末尾的代码块中。你不需要发布准确的文本,只需发布一些重现你所说问题的内容。你应该在to_return[i]>127:to_return[i]=127时去掉那些
。对不起,我应该在前面提到。@citrusake您应该在问题中提到您正在尝试查找未知密钥。我以为你只是在编码和解码你可以控制的东西。如果您知道消息应该是有效的ASCII,那么您可以简单地拒绝任何包含chars>=chr(127)的结果。顺便问一下,您必须在Python 2中这样做吗?
b'Bzs6IHM6IHMycyc2ICdZPDVzCxwBczY9MCEqIyc6PD0='
This is a test
of XOR encryption