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