You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节),而不是解码得到原始密钥字节。

解决步骤

  1. 修正密钥处理逻辑:取消代码中被注释的_key = base64.b64decode(self.key),替换掉原来的_key = self.key.encode('utf-8'),因为self.key是Base64编码格式,必须先解码才能得到符合AES要求的原始密钥字节。
  2. 校验密钥长度:解码后检查密钥字节长度是否为16/24/32字节,如果不符合,需要确认原始密钥的生成逻辑或Base64编码是否正确。
  3. 保持加解密逻辑一致:加密和解密函数都要使用相同的密钥处理方式,避免两端逻辑不一致导致的错误。

修改后的核心代码示例

加密函数修改后

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:15:38