使用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
相关产品推荐
相关产品推荐

