PyCrypto возвращает ошибку размера ключа для AES
Я пытаюсь написать программу для шифрования файлов с помощью 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 ответ:
Проблема в том, что вы отсекаете только 11 байт от шестнадцатеричного "семени" из 64 символов. Имейте в виду, что ключи должны иметь высокую энтропию, в противном случае их легче перебрать силой.
Я предлагаю вам использовать:
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 байт. Вот почему вы думаете, что вы получили 32 байта, когда вы получили только 11 (21 + 11 = 32). Вместо этого используйте встроенныйlen(key)
.