Как реализованы функции key_derivation и key_verification в механизме шифрования 7-zip архива?

Мне любопытно, как работает восстановление пароля для файлов, защищенных паролем. And I want to know the exact flow of the 7-zip encryption mechanism.

7-zip использует алгоритм шифрования AES-256 в режиме CBC для шифрования файлов или папок. Ключ генерируется из введенной пользователем парольной фразы на основе хэш-функции SHA-256. SHA-256 выполняется 2 19 (524 288) раз, чтобы увеличить стоимость исчерпывающего поиска. Кроме того, чтобы снизить риск атак по словарю, соль добавляется к исходной парольной фразе перед генерацией хэша.

Мой первый вопрос how does key_derivation function work to generate a 256-bit key? Какое значение имеет IV для режима AES CBC и как он создается?

Мой второй и most important question - это как проверяется ключ для расшифровки 7-zip архива? Я имею в виду, как работает его функция key_verification?


person Gopal    schedule 18.09.2012    source источник
comment
Вы пробовали связаться с одним из авторов? Документация по 7zip очень (очень) скудна, а исходный код - за неимением лучшего слова - дерьмо.   -  person Maarten Bodewes    schedule 18.09.2012
comment
@ owlstead, сэр, я не пробовал связываться с авторами. Всего несколько дней назад я начал гуглить, но я не нашел никаких технических документов, относящихся к шифрованию 7-zip.   -  person Gopal    schedule 18.09.2012


Ответы (1)


Функция вывода ключа находится в источнике файла 7zAes.cpp, она называется:

void CKeyInfo::CalculateDigest()

и он создает ключ, используя собственный (довольно унылый) механизм.

Мне пока не удалось найти метод key_verification, если он существует. Я дам тебе знать, если найду.

person Maarten Bodewes    schedule 18.09.2012
comment
Документация, включая спецификации формата контейнера 7zip, похоже, отсутствует в действии. Я даже не имел удовольствия найти ни одного комментария к исходному коду в крипто-библиотеках. - person Maarten Bodewes; 18.09.2012
comment
Я согласен с вами, я прошел через тот же код, чтобы узнать, как генерируется ключ. Но двух вещей я на самом деле не понял. Во-первых, поскольку numRounds вычисляется с использованием NumCyclesPower, которое устанавливается равным нулю. Тогда как этот цикл for (UInt64 round = 0; round ‹numRounds; round ++) должен выполняться 2 ^ 19 раз? - person Gopal; 18.09.2012
comment
Во-вторых, фраза-пароль добавляется без какого-либо механизма кодирования (например, UTF-16). Означает ли это, что 7-zip не использует какой-либо механизм кодирования для создания сообщения ввода длинной строки для SHA-256? - person Gopal; 18.09.2012
comment
Входные данные для Sha256_Update - это все байты, Password кажется CByteArray, но я не могу напрямую видеть, где он установлен, и с этой базой кода я бы тоже не знал, где это искать. - person Maarten Bodewes; 18.09.2012