Ключевой файл VeraCrypt – это файл, содержимое которого объединено с паролем. В качестве ключевого файла можно
использовать любой файл. Пользователь также может сгенерировать ключевой файл с помощью встроенного генератора
ключевых файлов, который использует VeraCrypt RNG для создания файла со случайным содержимым (см. подробности
в разделе Генератор случайных чисел).
Максимальный размер ключевого файла не ограничен, однако обрабатываются только его первые 1 048 576 байт (1 МиБ)
(все остальные байты игнорируются, чтобы не жертвовать производительностью из-за обработки очень больших файлов).
Можно указывать один или несколько ключевых файлов (количество не ограничено).
Ключевые файлы могут храниться на токенах безопасности и смарт-картах, совместимых с PKCS-11 [23], защищённых
несколькими пин-кодами (которые можно ввести с помощью аппаратной пин-панели или через графический интерфейс VeraCrypt).
Ключевые файлы обрабатываются и применяются к паролю следующим способом:
- Пусть P это пароль тома VeraCrypt, указанный пользователем (может быть пустым)
- Пусть KP это пул ключевых файлов
- Пусть kpl это размер пула ключевых файлов KP, в байтах (64, то есть 512 бит);
kpl должен быть кратен выходному размеру хеш-функции H
- Пусть pl это длина пароля P, в байтах (в текущей версии: 0 ≤ pl ≤ 64)
- Если kpl > pl, добавляем (kpl – pl) нулевых байт к паролю P (таким образом,
pl = kpl)
- Заполняем пул ключевых файлов KP нулевыми байтами в количестве kpl.
- Для каждого ключевого файла выполняем следующие шаги:
- Устанавливаем положение указателя пула ключевых файлов в начало пула
- Инициализируем хеш-функцию H
- Загружаем все байты ключевого файла один за другим, и для каждого загруженного байта выполняем следующие шаги:
- Хешируем загруженный байт с помощью хеш-функции H без инициализации хеша, чтобы получить
промежуточный хеш (состояние) M. Не финализируем хеш (состояние сохраняется для следующего раунда).
- Делим состояние M на отдельные байты.
Например, если выходной размер хеша составляет 4 байта, (T0 || T1 ||
T2 || T3) = M
- Записываем эти байты (полученные на шаге 7.c.ii) по отдельности в пул ключевых файлов с помощью операции
сложения по модулю 28 (не заменяя старые значения в пуле) в позиции указателя пула. После записи
байта позиция указателя пула увеличивается на один байт. Когда указатель достигает конца пула, его положение
устанавливается в начало пула.
- Применяем содержимое пула ключевых файлов к паролю P, используя следующий метод:
- Делим пароль P на отдельные байты B0...Bpl-1.
Обратите внимание, что если пароль был короче пула ключевых файлов, то пароль дополнялся нулевыми байтами
до длины пула на шаге 5 (следовательно, в этот момент длина пароля всегда больше или равна длине пула ключевых файлов).
- Делим пул ключевых файлов KP на отдельные байты G0...Gkpl-1
- Для 0 ≤ i < kpl выполняем: Bi = Bi ⊕ Gi
- P = B0 || B1 || ... || Bpl-2 ||
Bpl-1
- Пароль P (после применения к нему содержимого пула ключевых файлов) теперь передаётся в функцию
формирования ключа заголовка PBKDF2 (PKCS #5 v2), которая его обрабатывает (вместе с солью и другими данными)
используя выбранный пользователем криптографически безопасный алгоритм хеширования (например SHA-512).
См. подробности в разделе
Формирование ключа заголовка, соль и количество итераций.
Роль хеш-функции H заключается просто в выполнении диффузии [2]. В качестве хеш-функции
H применяется CRC-32. Обратите внимание, что вывод CRC-32 впоследствии обрабатывается с использованием
криптографически безопасного хеш-алгоритма: содержимое пула ключевых файлов (в дополнение к хешированию с помощью CRC-32)
применяется к паролю, который затем передаётся в функцию формирования ключа заголовка PBKDF2 (PKCS #5 v2), которая
его обрабатывает (вместе с солью и другими данными), используя выбранный пользователем криптографически безопасный
алгоритм хеширования (например SHA-512). Результирующие значения используются для формирования ключа заголовка
и вторичного ключа заголовка (режим XTS).
Следующий раздел >>