TypeError: аргумент должен быть строковым или доступным только для чтения буфером, а не bytearray - PullRequest
0 голосов
/ 08 октября 2019

Я строю декриптор, используя 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, в

code = ciphert.decrypt (code)

Файл "build / bdist.macosx-10.14-intel / egg / Crypto / Cipher / blockalgo.py", строка 295, в расшифровке

TypeError: аргумент должен быть строковым или доступным только для чтения буфером, а не bytearray

Я работаю над этим уже несколько часов и не могу найти другой способ хранения переменной.

Есть идеи?

1 Ответ

1 голос
/ 08 октября 2019

Я думаю, это то, что вам нужно:

>>> 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 3 code.decode('hex') не будет работать. Вместо этого используйте bytes.fromhex(code) (аналогично bytearray.fromhex, но просто возвращайте неизменный bytes экземпляр).

...