16進コーデックは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()メソッドは素晴らしいです!なにか提案を?
いいえ、encode()
を使用してhexlifyすることは良いことではありません。
hex
コーデックの使用方法はPython 2で機能しました。これはPython 2の8ビット文字列でencode()
を呼び出すことができるためです。すでにエンコードされています。それは意味がありません。 encode()
は、8ビット文字列を8ビット文字列としてエンコードするためではなく、Unicode文字列を8ビット文字列にエンコードするためのものです。
Python 3では、8ビット文字列に対してencode()
を呼び出せなくなったため、hex
コーデックは無意味になり、削除されました。
理論的にはhex
コーデックを使用して、次のように使用できます。
>>> import codecs
>>> hexlify = codecs.getencoder('hex')
>>> hexlify(b'Blaah')[0]
b'426c616168'
Binasciiを使用する方が簡単で便利です。
>>> import binascii
>>> binascii.hexlify(b'Blaah')
b'426c616168'
これは上記と同じ答えですが、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("")