Я разрабатываю протокол шифрования, в котором мне нужно создать ключ AES в режиме CTR. Я решил сохранить длину ключа 128 бит, так как более короткий размер ключа будет означать меньшую вычислительную мощность для мобильных устройств.
Теперь, чтобы создать этот ключ, я использую PBKDF2, который позволяет мне устанавливать его определенные параметры, такие как хеш-функция и номер итерации, поскольку он создает ключ, используя исходную информацию, такую как пароль, который у меня есть. Поскольку SHA-1 сломан, я хотел использовать SHA-256 для хэширования ключа функции деривации ключа, но я не понимаю, возможно ли это. Поскольку я хочу, чтобы ключ был 128-битным, а SHA-256 выдает 256-битный, способен ли PBKDF2 на это?
Во-первых, AES-256 не такой медленный по сравнению с AES-128. См. от Криптография
CPU overhead (+20% for a 192-bit key, +40% for a 256-bit key:
Выходной размер PBKDF2 равен используемой функции PRF, в вашем случае это хэш-функция SHA-256. Поэтому вывод будет иметь размер 256 бит.
Для функции PBKDF2 требуется параметр dkLen
— желаемая длина ключа.
PBKDF2(PRF, Password, Salt, c, dkLen)
Когда вы поместите 128 в этот параметр, вы получите 128-битный. Результатом является подстрока полного 256-битного вывода. Вы получите первый 128-битный.
Вы можете увидеть это из реализации как здесь
Короткий ответ: нет. Дизайн хеш-функций позволяет это. Вы можете видеть, что есть SHA-224 с другими начальными параметрами, но результат усечен до 224 бит.
AES-256 ненамного медленнее, чем AES-128, установка ключей немного медленнее, и для каждого блока требуется всего 4 дополнительных раунда (от 11 до 15). Таким образом, это максимум примерно на 40% медленнее, а с современными телефонами, имеющими специальные наборы инструкций AES, вероятно, даже меньше.
PBKDF2 может выводить ключ практически любого размера, и в основном HMAC-SHA1 или HMAC-SHA256 (не SHA1 или SHA256 напрямую, но большинство API принимают только хеш-функцию в качестве параметра и неявно выполняют HMAC) используется в качестве строительного блока «случайная функция» . Но любой из них может создавать ключи размером 256, 128 или 10000 байт (в любом случае вам не нужен такой большой ключ). С HMAC-SHA256 одинаково дешево или дорого получить 256- или 128-битный ключ (последний является усеченной версией первого, но это не проблема); это же работа. С HMAC-SHA1 (который так же безопасен, как HMAC-SHA256 для PBKDF2) немного сложнее получить 256-битный ключ, так как 256 больше, чем размер дайджеста.
Поэтому используйте AES-256 и PBKDF2-(HMAC)-SHA256, проблем с производительностью быть не должно.
Большое спасибо за ответ, так что, если эти 256 бит обрезаны и взяты первые 128 бит, означает ли это менее безопасный ключ?