Python encode()
Из шестнадцатеричного кодека исключен из python 3.3? Когда я пишу код
>>> s="Hallo"
>>> s.encode('hex')
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
s.encode('hex')
LookupError: unknown encoding: hex
Что это значит? Я знаю о binascii.hexlify(), но метод .encode() хорош!
Любое предложение?
Ответы
Ответ 1
Нет, использование encode()
для hexlify не является приятным.
Как вы используете кодек hex
, который работал в Python 2, потому что вы можете вызывать encode()
для 8-битных строк в Python 2, то есть вы можете кодировать то, что уже закодировано. Это не имеет смысла. encode()
предназначен для кодирования строк Unicode в 8-битные строки, а не для кодирования 8-битных строк в виде 8-битовых строк.
В Python 3 вы больше не можете вызывать encode()
в 8-битных строках, поэтому кодек hex
стал бессмысленным и был удален.
Хотя теоретически вы можете иметь кодек hex
и использовать его так:
>>> import codecs
>>> hexlify = codecs.getencoder('hex')
>>> hexlify(b'Blaah')[0]
b'426c616168'
Использование binascii проще и приятнее:
>>> import binascii
>>> binascii.hexlify(b'Blaah')
b'426c616168'
Ответ 2
это тот же ответ для выше, но я его модифицировал, поэтому он работает с python 3.
import binascii
from Crypto.Cipher import AES
from Crypto import Random
def encrypt(passwrd, message):
msglist = []
key = bytes(passwrd, "utf-8")
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(bytes(message, "utf-8"))
msg = binascii.hexlify(msg)
for letter in str(msg):
msglist.append(letter)
msglist.remove("b")
msglist.remove("'")
msglist.remove("'")
for letter in msglist:
print(letter, end="")
print("")
def decrypt(passwrd, message):
msglist = []
key = bytes(passwrd, "utf-8")
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = cipher.decrypt(binascii.unhexlify(bytes(message, "utf-8")))[len(iv):]
for letter in str(msg):
msglist.append(letter)
msglist.remove("b")
msglist.remove("'")
msglist.remove("'")
for letter in msglist:
print(letter, end="")
print("")