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") == bytes
en type("hello") == str
. En type(u"hello") == str
evalueert tot False
, terwijl type(u"hello") == unicode
True
.
Op Python 3 is type("hello") == bytes
False
en type("hello") == str
is True
. En type("hello") == unicode
genereert een NameError
-uitzondering omdat unicode
niet 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 text
als str
voor de eerste keer en als bytes
voor de tweede keer.
De oplossing is ervoor te zorgen dat de invoer text
van het type str
is.
Antwoord 3
Aangezien de eerste parameter van AES.new
bytes/bytearray/memoryview is, en ik neem aan dat text
al van het type bytes
is, dan hoeven we alleen het padgedeelte van unicode
naar bytes
te converteren.
text = text + (pad * chr(pad)).encode("utf-8")
Om extra veilig te zijn, kunt u text
voorwaardelijk coderen voordat u ze samenvoegt met pad.
if not isinstance(text, bytes):
text = text.encode('utf-8')