Длина дайджеста Python hashlib.sha256()

У меня есть код Python,

 hash_object = hashlib.sha256(b'Hello World')
 hex_dig = hash_object.hexdigest()

 cipher = AES.new(hex_dig, AES.MODE_CBC, iv)
 plain = cipher.decrypt( cipher )

но у меня ошибка - ValueError: ключ AES должен быть длиной 16, 24 или 32 байта

Но мне нужен ключ 32 байта, а не ключ 16 байт. Я не знаю, почему hash_val=hashfct.digest() не 32 байта. Кроме того, я пробовал "hash_val=hashfct.digest()[0:32]", но это тоже не работает.

Как я могу получить ключ длиной 32 байта?

Спасибо.


person khi0227    schedule 30.06.2016    source источник


Ответы (2)


Вам действительно следует подумать о правильном алгоритме вывода ключей, а не создавать свой собственный. PBKDF2 — один из наиболее распространенных алгоритмов, который должен защитить вас от некоторых типичных ошибок. Например, в вашем случае очень легко взломать пароль, потому что у вас есть только один раунд хеширования.

Вот модифицированный пример кода из hashlib:

>>> import hashlib
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> dk[:32]
b'\x03\x94\xa2\xed\xe32\xc9\xa1>\xb8.\x9b$c\x16\x04\xc3\x1d\xf9x\xb4\xe2\xf0\xfb\xd2\xc5I\x94O\x9dy\xa5'

Вы также должны убедиться, что b'salt' является случайным и отличается каждый раз, когда вы создаете новый ключ. Для криптографически безопасной случайной функции в Python см. Как я могу создать случайное число, которое криптографически безопасно в python?

Это для Python 3, но должно быть достаточно просто, чтобы настроить его для Python 2.

person kichik    schedule 25.10.2016

вам нужно использовать метод digest

hash_object = hashlib.sha256(b'Hello World')
hex_dig = hash_object.digest()

cipher = AES.new(hex_dig, AES.MODE_CBC, iv)
plain = cipher.decrypt( cipher )

Я действительно не знаю причину, но это работает, потому что у меня была такая же проблема.

person eneski    schedule 24.10.2016
comment
Разница в том, что hexdigest() возвращает строку, а digest() возвращает необработанные байты. Но все же вместо этого используйте pbkdf2_hmac. - person florisla; 29.05.2018
comment
Спасибо за ваш вклад - person eneski; 29.05.2018