Python实现AES-256加解密时报LookupError: unknown encoding如何解决
错误根因
codecs.decode方法的第二个参数为编码格式标识位,仅支持传入合法编码名称(如示例中的hex_codec),你错误将IV值填入该参数位,导致Python无法识别对应编码,抛出LookupError。- 你定义的
encrypt、decrypt方法本身要求将IV作为第二个独立入参传入,你没有遵循该调用逻辑,反而将IV错误嵌入到codecs.decode的参数列表中。 - 输入的明文是普通文本,不需要做hex解码;解密输入的是base64格式密文,也无需调用
codecs.decode处理,二者的入参逻辑均存在错误。
修复步骤
- 单独将IV的十六进制字符串解码为bytes类型,作为独立参数传入加解密方法
- 明文仅需按utf-8编码转为bytes即可,无需hex解码
- 解密时直接传入base64格式的密文字符串,不需要额外做编码转换
- 统一pad/unpad方法的输入输出为bytes类型,避免编码冲突
修复后完整代码
import base64 from Crypto.Cipher import AES import codecs BS = 16 # 调整pad/unpad适配bytes类型输入 pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode('utf-8') unpad = lambda s : s[:-ord(s[len(s)-1:])] class AESCipher: def __init__( self, key ): self.key = key def encrypt( self, raw, iv ): raw = pad(raw) cipher = AES.new( self.key, AES.MODE_CBC, iv ) return base64.b64encode( cipher.encrypt( raw ) ) def decrypt( self, enc, iv ): enc = base64.b64decode(enc) cipher = AES.new(self.key, AES.MODE_CBC, iv ) return unpad(cipher.decrypt( enc )) # 解码密钥 key = codecs.decode('fce4aa4dcf0d2b27fe4ffdafa602c81d1930c410f48ada5c763d4c4052a939eb', 'hex_codec') # 单独解码IV iv = codecs.decode('c75271d593ca86ca785e3bb25e8d02cb', 'hex_codec') a = AESCipher(key) # 明文转utf-8 bytes后传入,第二个参数传IV encrypt_result = a.encrypt("This bloody encryption engine won't work !".encode('utf-8'), iv) print(encrypt_result.decode('utf-8')) b = AESCipher(key) # 密文直接传入,第二个参数传IV decrypt_result = b.decrypt('44FsQIcqM412+YXZBwwoQSCz2uB9QPQMXJ410Xpw1f/M5RTRS7N6yfziAGq/Fd/E', iv) print(decrypt_result.decode('utf-8'))
注意事项
- 原PyCrypto库已停止维护,运行报错可替换为兼容的pycryptodome库,安装命令:
pip install pycryptodome - 加解密过程中所有字符串转bytes的编码要保持统一,避免出现乱码或解密失败问题
内容的提问来源于stack exchange,提问作者Pwners
相关产品推荐
相关产品推荐

