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

使用pyaes库加解密遇TypeError: NoneType无len()问题求助

问题原因分析

这个TypeError的根源其实很直白:你的aes_encrypt函数没有返回加密后的数据,导致传递给解密函数的参数是None!

  • 当你执行encrypted_text = aes_encrypt(key_256, "Hi World!")时,因为aes_encrypt里只有print(encrypted_text),没有return语句,Python会默认让函数返回None。所以encrypted_text变量实际上是None。
  • 接着调用aes_decrypt(key_256, encrypted_text)时,相当于把None传给了解密函数的encrypted_text参数。而pyaes的CTR模式解密逻辑需要获取输入数据的长度,对None调用len()自然就抛出了这个错误。

另外还有个小细节:你传入的明文是字符串,但pyaes处理的是字节数据,直接传入字符串虽然能运行,但解密后得到的也是字节,转成字符串会更友好。


修正后的代码

给两个函数加上返回值,同时处理字符串和字节的转换:

import pyaes
import os

def aes_encrypt(key, plaintext):
    # 将字符串明文编码为字节(pyaes仅处理字节数据)
    plaintext_bytes = plaintext.encode('utf-8')
    aes = pyaes.AESModeOfOperationCTR(key)
    encrypted_text = aes.encrypt(plaintext_bytes)
    print(f"加密结果(字节): {encrypted_text}")
    # 必须返回加密后的字节串,供解密使用
    return encrypted_text

def aes_decrypt(key, encrypted_text):
    aes = pyaes.AESModeOfOperationCTR(key)
    decrypted_bytes = aes.decrypt(encrypted_text)
    # 将解密后的字节解码回字符串
    decrypted_text = decrypted_bytes.decode('utf-8')
    print(f"解密结果(字符串): {decrypted_text}")
    return decrypted_text

# 测试代码
if __name__ == "__main__":
    key_256 = os.urandom(32)
    encrypted_data = aes_encrypt(key_256, "Hi World!")
    decrypted_data = aes_decrypt(key_256, encrypted_data)

额外说明

pyaes的AESModeOfOperationCTR默认会自动生成随机的nonce(计数器初始值),并把它附加在加密后的字节串开头。解密时会自动读取这个nonce,所以你不需要手动管理nonce,这一点是安全且方便的。

内容的提问来源于stack exchange,提问作者MarioML

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:04