Python中AES密钥长度错误(44字节)问题求助
AES加解密报错:
ValueError: Incorrect AES key length (44 bytes) 解决方法 问题场景
使用Crypto.Cipher的AES实现加解密功能时,触发以下错误:
ValueError: Incorrect AES key length (44 bytes)
相关核心代码片段:
from base64 import b64decode, b64encode def encrypt(self, text): if not text: return None if not text.strip(): return None _key = self.key.encode('utf-8') _iv = self.iv.encode('utf-8') text = self.pad(text) encryptor= AES.new(_key, AES.MODE_CBC, _iv) try: return b64encode(encryptor.encrypt(text)).decode('utf-8') except Exception: raise ValueError("Error al encriptar el siguiente texto => {}".format(text)) def decrypt(self, text): if not text: return None if not text.strip(): return None _key = self.key.encode('utf-8') _iv = self.iv.encode('utf-8') text = str(text) decryptor = AES.new(_key,AES.MODE_CBC,_iv) try: result = decryptor.decrypt(b64decode(text)).decode('utf-8') return self.clean_text(result) except Exception: raise ValueError("Error al desencriptar el siguiente texto => {}".format(text))
完整类代码:
class symmetric_custom_tokeniza: def clean_text(self, text): #Elimina caracteres especiales generados por el padding return re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', text.strip()) def pad(self,text): try: block_size= self.block_size text = text.encode('utf-8') text = text +(block_size-len(text)%block_size)*chr(block_size-len(text)%block_size).encode('utf-8') return text except Exception: raise ValueError("Error al generar el padding => {}; tamaño caracteres en utf-8 {}".format(text, len(text))) #[ Encrypt - Decrypt BUs ] def encrypt(self, text): from base64 import b64decode, b64encode import base64 if not text: return None if not text.strip(): return None _key = self.key.encode('utf-8') _iv = self.iv.encode('utf-8') text = self.pad(text) #_key = base64.b64decode(self.key) encryptor= AES.new(_key, AES.MODE_CBC, _iv) try: return b64encode(encryptor.encrypt(text)).decode('utf-8') except Exception: raise ValueError("Error al encriptar el siguiente texto => {}".format(text)) def decrypt(self, text): import base64 from base64 import b64decode, b64encode if not text: return None if not text.strip(): return None _key = self.key.encode('utf-8') _iv = self.iv.encode('utf-8') text = str(text) #_key = base64.b64decode(self.key) decryptor = AES.new(_key,AES.MODE_CBC,_iv) try: result = decryptor.decrypt(b64decode(text)).decode('utf-8') return self.clean_text(result) except Exception: raise ValueError("Error al desencriptar el siguiente texto => {}".format(text))
问题原因
AES密钥长度必须严格符合标准:只能是16字节(AES-128)、24字节(AES-192)或32字节(AES-256)。错误提示密钥为44字节,说明当前self.key是一段Base64编码字符串,直接调用encode('utf-8')会把Base64字符串本身转成字节(比如Base64的44字符转成utf-8就是44字节),而不是解码得到原始密钥字节。
解决步骤
- 修正密钥处理逻辑:取消代码中被注释的
_key = base64.b64decode(self.key),替换掉原来的_key = self.key.encode('utf-8'),因为self.key是Base64编码格式,必须先解码才能得到符合AES要求的原始密钥字节。 - 校验密钥长度:解码后检查密钥字节长度是否为16/24/32字节,如果不符合,需要确认原始密钥的生成逻辑或Base64编码是否正确。
- 保持加解密逻辑一致:加密和解密函数都要使用相同的密钥处理方式,避免两端逻辑不一致导致的错误。
修改后的核心代码示例
加密函数修改后
def encrypt(self, text): from base64 import b64decode, b64encode import base64 if not text: return None if not text.strip(): return None _key = base64.b64decode(self.key) # 替换原encode逻辑 _iv = self.iv.encode('utf-8') text = self.pad(text) encryptor= AES.new(_key, AES.MODE_CBC, _iv) try: return b64encode(encryptor.encrypt(text)).decode('utf-8') except Exception: raise ValueError("Error al encriptar el siguiente texto => {}".format(text))
解密函数修改后
def decrypt(self, text): import base64 from base64 import b64decode, b64encode if not text: return None if not text.strip(): return None _key = base64.b64decode(self.key) # 替换原encode逻辑 _iv = self.iv.encode('utf-8') text = str(text) decryptor = AES.new(_key,AES.MODE_CBC,_iv) try: result = decryptor.decrypt(b64decode(text)).decode('utf-8') return self.clean_text(result) except Exception: raise ValueError("Error al desencriptar el siguiente texto => {}".format(text))
内容的提问来源于stack exchange,提问作者Andres Barrera
相关产品推荐
相关产品推荐

