gpt4 book ai didi

python - 如何用字节文件中的 '\\' 替换 '\'?

转载 作者:太空宇宙 更新时间:2023-11-04 09:41:10 25 4
gpt4 key购买 nike

这是我的问题:我有一个这样的加密字节文件:

[w\x84\x7f@\xc6\xab\xc8

我想用 PyCrypto 解密它,但我发现了一个像下面这样的困惑错误:

代码在这里:

from Crypto.Cipher import DES
key = 'jsfghutp'
cipher = DES.new(key, DES.MODE_ECB)
s = open('d:/Thu-Aug-2018.bin','rb').read()

cipher.decrypt(s)

如果我运行它,它会抛出一个错误:

ValueError                                Traceback (most recent call last)
<ipython-input-3-4fcf0e8076ca> in <module>()
----> 1 cipher.decrypt(s)

D:\Python\anaconda\lib\site-packages\Crypto\Cipher\blockalgo.py in
decrypt(self, ciphertext)
293 return res
294
--> 295 return self._cipher.decrypt(ciphertext)
296

ValueError: Input strings must be a multiple of 8 in length

我打印 s 的值:

s =  b'[w\\x84\\x7f@\\xc6\\xab\\xc8'

然而这是不对的,我需要的是如下结果:

>>> cipher.decrypt(b'[w\x84\x7f@\xc6\xab\xc8')
b'test aaa'

也就是说,我认为我必须将字节文件中的\\\\替换为\,但我没有以正确的方式做到这一点。有谁知道如何解决这个问题?

最佳答案

您的文件中没有双反斜杠。当您查看 bytes 对象的 repr 时,它显示所有反斜杠都已转义,以避免混淆,例如 \n(换行符) 和 \\n(一个反斜杠后跟一个 n)。

例如:

>>> s = rb'\x84'
>>> s
b'\\x84'
>>> s[0]
92
>>> chr(s[0])
'\\'

所以,你问的问题不存在。您的文件中只有一个反斜杠。


实际问题是您不需要四个字节的反斜杠 x、8 和 4,您需要单字节 b'\x84',又名 chr(0x84 )。但这四个字节是您文件中的内容。

因此,您的错误存在于您用于创建此文件的任何代码中。不知何故,您没有将字节转储到文件中,而是转储了这些字节的反斜杠转义字符串表示形式。修复它的正确位置是在创建文件的代码中。不写入损坏的数据总是比写入损坏的数据,然后试图弄清楚如何恢复它要好。

但如果为时已晚——例如,如果您使用那段损坏的代码加密了一堆您无法再访问的明文,而现在您需要尝试恢复它——那么这种转换恰好发生在是可逆的。您只需分两步完成。


首先,您使用反斜杠转义或更通用的 unicode 转义编解码器对字节进行解码:

>>> s=rb'[w\x84\x7f@\xc6\xab\xc8'
>>> s
b'[w\\x84\\x7f@\\xc6\\xab\\xc8'
>>> s.decode('unicode-escape')
'[w\x84\x7f@Æ«È'

然后将每个 Unicode 字符转换为与相同数字匹配的字节,或者显式:

>>> bytes(map(ord, s.decode('unicode-escape')))
b'[w\x84\x7f@\xc6\xab\xc8'

... 或者,有些 hackily,依靠 Python 对 Latin-1 的解释:1

>>> s.decode('unicode-escape').encode('latin-1')
b'[w\x84\x7f@\xc6\xab\xc8'

同样,那些反斜杠实际上并不在字符串中,这正是 Python 表示 bytes 的方式。例如,如果你把它放在 b 中,hex(b[2])0x84 for byte \x84,而不是反斜杠字符的 0x5c


您的创建代码才是真正的问题:

with open(file,'a') as f:

f.write(str(encrypt_text).split("b'")[1].split("'")[0])
f.close()

您正在将字节转换为它们的字符串表示形式——使用 b 前缀、它周围的引号以及为每个不可打印的 ASCII 字节转义的反斜杠,然后剥离 b 和引号,然后通过将其写入文本模式文件将整个内容编码为 UTF-8。

您要做的只是以二进制模式打开文件并将字节写入其中:

with open(file, 'ab') as f:
f.write(encrypt_text)

(另外,您不想调用 f.close()with 语句已经处理了这个问题。)

然后您可以以二进制模式读取文件并按原样解密字节。

(或者,如果您真的希望文件是可人工编辑的或类似的东西,您想要选择一种设计为可人工编辑且易于逆向的格式,例如 hexlify base64,而不是“无论 Python 做什么来表示用于调试的 bytes 对象”。)


1。对于 Latin-1 中的所有字符,Unicode 保证与 Latin-1 一致。 Python 将其解释为意味着 Latin-1 应该将 0-255 中的每个字节编码为代码点 0-255,而不仅仅是 ISO-8859-1 中实际定义的那些。这是有效的,因为 ISO-8859-1 没有说明如何处理它没有定义的字节,但并不是每个工具都与 Python 一致。

关于python - 如何用字节文件中的 '\\' 替换 '\'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51646673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com