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 2

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).