PyCrypto返回AES的密钥大小错误

时间:2015-10-30 00:37:33

标签: python hash aes pycrypto

我正在尝试使用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位仍然会返回错误

1 个答案:

答案 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)