python - 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:参数必须是字符串或只读缓冲区,而不是字节数组
我已经为此工作了几个小时,但无法找到另一种存储变量的方法。
有任何想法吗?
解决方案
我认为这就是你想要的:
>>> 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
实例)。
推荐阅读
- c# - Equals 方法抛出 NullReferenceException
- hive - Hive - derby - java.lang.SecurityException:密封违规:包 org.apache.derby.impl.services.locks 已密封
- sql - 从 SQL 中的列打印数据
- python - 我正在尝试在 Numpy 数组中运行代码.. 但是属性错误不断出现
- java - 在 Class.getDeclaredMethods() 中返回内部 Lambda?
- python - 对象列表为 numpy 数组
- python - 是否有任何硒定位器可以抓取网页的任何内容?
- bash - df -h if freespace 等于 then | 重击
- javascript - 如何将登录页面的页面重定向到服务器端c#中的索引页面?
- google-sheets - 需要将小区绑定到它的邻居