AttributeError: ‘bytes’ object heeft geen attribuut ‘CODE’

Probeer een code van Python2 naar Python 3 te importeren en dit probleem gebeurt

   <ipython-input-53-e9f33b00348a> in aesEncrypt(text, secKey)
     43 def aesEncrypt(text, secKey):
     44     pad = 16 - len(text) % 16
---> 45     text = text.encode("utf-8") + (pad * chr(pad)).encode("utf-8")
     46     encryptor = AES.new(secKey, 2, '0102030405060708')
     47     ciphertext = encryptor.encrypt(text)

AttributeError: ‘bytes’ object heeft geen attribuut ‘CODE’

Als ik het verwijderen .encode("utf-8")De fout is “Can not Concat Str To Bytes”. Blijkbaar pad*chr(pad)lijkt een byte-string te zijn. Het kan niet gebruiken encode()

   <ipython-input-65-9e84e1f3dd26> in aesEncrypt(text, secKey)
     43 def aesEncrypt(text, secKey):
     44     pad = 16 - len(text) % 16
---> 45     text = text.encode("utf-8") + (pad * chr(pad))
     46     encryptor = AES.new(secKey, 2, '0102030405060708')
     47     ciphertext = encryptor.encrypt(text)

TypeError: Can not Concat Str To bytes

Het rare ding is echter dat als ik me gewoon het deel probeer. CODE () werkt prima.

text = { 'username': '', 'password': '', 'rememberLogin': 'true' }
text=json.dumps(text)
print(text)
pad = 16 - len(text) % 16 
print(type(text))
text = text + pad * chr(pad) 
print(type(pad * chr(pad)))
print(type(text))
text = text.encode("utf-8") + (pad * chr(pad)).encode("utf-8") 
print(type(text))
{"username": "", "password": "", "rememberLogin": "true"}
<class 'str'>
<class 'str'>
<class 'str'>
<class 'bytes'>

Antwoord 1, autoriteit 100%

Als u niet weet of een stringachtig object een Python 2-string (bytes) of Python 3-string (unicode) is. Je zou een generieke converter kunnen hebben.

Python3-shell:

>>> def to_bytes(s):
...     if type(s) is bytes:
...         return s
...     elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode):
...         return codecs.encode(s, 'utf-8')
...     else:
...         raise TypeError("Expected bytes or string, but got %s." % type(s))
...         
>>> to_bytes("hello")
b'hello'
>>> to_bytes("hello".encode('utf-8'))
b'hello'

Op Python 2 evalueren beide expressies True: type("hello") == bytesen type("hello") == str. En type(u"hello") == strevalueert tot False, terwijl type(u"hello") == unicodeTrue.

Op Python 3 is type("hello") == bytesFalseen type("hello") == stris True. En type("hello") == unicodegenereert een NameError-uitzondering omdat unicodeniet is gedefinieerd op 3.

Python 2-schaal:

>>> to_bytes(u"hello")
'hello'
>>> to_bytes("hello")
'hello'

Antwoord 2, autoriteit 25%

Dankzij @Todd heeft hij het probleem opgelost.
(pad * chr(pad))is bytes terwijl het probleem ligt bij aesEncrypt(text, secKey). Het is twee keer aangeroepen met textals strvoor de eerste keer en als bytesvoor de tweede keer.

De oplossing is ervoor te zorgen dat de invoer textvan het type stris.


Antwoord 3

Aangezien de eerste parameter van AES.newbytes/bytearray/memoryview is, en ik neem aan dat textal van het type bytesis, dan hoeven we alleen het padgedeelte van unicodenaar byteste converteren.

text = text + (pad * chr(pad)).encode("utf-8")

Om extra veilig te zijn, kunt u textvoorwaardelijk coderen voordat u ze samenvoegt met pad.

if not isinstance(text, bytes):
    text = text.encode('utf-8')

Other episodes