我正在尝试使用AES编写程序来加密文件,但是我得到了
ValueError:AES密钥长度必须为16,24或32字节
错误,无论密钥的大小。
我生成AES对象的代码是
def AESEncryptor(Seed, Block = 16): #Generate AES key and Cipher
iv = Random.new().read(Block)
cipher = AES.new(Seed.encode('utf8'), AES.MODE_CBC, iv)
return cipher, iv
我生成密钥的代码是
def genNewSeed(k=2048): #Generate seed for new AES key
return hashlib.sha256(os.urandom(32)).hexdigest()[:11]
根据sys.getsizeof()
,等于32位仍然会返回错误
答案 0 :(得分:1)
问题是你只从64个字符的十六进制编码“种子”切掉11个字节。请记住,键应该具有高熵,否则更容易暴力强制它们。
我建议您使用:
def AESEncryptor(Seed, Block = 16): #Generate AES key and Cipher
iv = Random.new().read(Block)
cipher = AES.new(Seed, AES.MODE_CBC, iv)
return cipher, iv
def genNewSeed(k=2048): #Generate seed for new AES key
return hashlib.sha256(os.urandom(32)).digest()
这将为您提供一个32字节的密钥,使其成为AES-256。如果你想要AES-128,那么你可以关闭最后16个字节:
hashlib.sha256(os.urandom(32)).digest()[:16]
您无法使用sys.getsizeof()
来确定密钥的大小,因为它包含所有类型的内部计数器和数据。例如,空字符串的大小为21个字节。这就是为什么当你只得到11(21 + 11 = 32)时你会认为你有32个字节。请改用内置的len(key)
。