首页 > 解决方案 > TypeError:参数必须是字符串或只读缓冲区,而不是字节数组

问题描述

我正在使用 DES ECB 构建解密器

from Crypto.Cipher import DES

code = 'cb9108614c943d96bedd2bae934c5aa3d5c4318f81cc81f255127292f2935bbc0a8990f36c1ffa20a0639ed8a6989bacc36bd11f6b2ecdab'
key = b'5199D19B'
code= bytearray.fromhex(code)

print(code)

ciphert = DES.new(key, DES.MODE_ECB)
code = ciphert.decrypt(code)
code = code.decode('ISO-8859-1')

print(code)

但我不断收到此错误

文件“test.py”,第 17 行,在

代码 = ciphert.decrypt(代码)

文件“build/bdist.macosx-10.14-intel/egg/Crypto/Cipher/blockalgo.py”,第 295 行,解密

TypeError:参数必须是字符串或只读缓冲区,而不是字节数组

我已经为此工作了几个小时,但无法找到另一种存储变量的方法。

有任何想法吗?

标签: pythonpycrypto

解决方案


我认为这就是你想要的:

>>> from Crypto.Cipher import DES
>>> code = 'cb9108614c943d96bedd2bae934c5aa3d5c4318f81cc81f255127292f2935bbc0a8990f36c1ffa20a0639ed8a6989bacc36bd11f6b2ecdab'
>>> key = b'5199D19B'
>>> ciphert = DES.new(key, DES.MODE_ECB)
>>> ciphert.decrypt(code.decode('hex'))
'Well done, you have been able to decode the message. \x00\x00\x00'

通常,当将密文传递给加密库中的“解码”函数时,它应该作为bytes对象传递(因为密文通常可以包含任意字节)。无论出于何种原因,它只是不接受一个bytearray必须单独实现的对象。

code.decode('hex')做你想做的同样的事情——它将一串十六进制数字转换为它们的实际字节值。

Python 3 的更新:

在 Python 3code.decode('hex')上不起作用。而是使用bytes.fromhex(code)(类似于bytearray.fromhex但只返回一个不可变bytes实例)。


推荐阅读