PyCrypto returns AES 的密钥大小错误
PyCrypto returns a keysize error for AES
我正在尝试编写一个程序来使用 AES 加密文件,但是我得到了
ValueError: AES key must be either 16, 24, or 32 bytes long
不管密钥大小都会出错。
我生成 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 位,但它仍然 returns 错误
问题是您仅从 64 个字符的十六进制编码 "seed" 中切掉 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)
。
我正在尝试编写一个程序来使用 AES 加密文件,但是我得到了
ValueError: AES key must be either 16, 24, or 32 bytes long
不管密钥大小都会出错。
我生成 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 位,但它仍然 returns 错误
问题是您仅从 64 个字符的十六进制编码 "seed" 中切掉 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)
。