English

Логотип Проект ЗАС

Современная жизнь немыслима без приватности и конфиденциальности.

Концепция безопасности ZAS

(Рев. 0.3, 9 Мая 2014)

Назначение документа

Этот документ описывает общие идеи и составные блоки крипто библиотеки DH, используемой в программе ZAS Communicator. См. также исходный код. В случае несоответствия исходного кода и данного документа считать правильным, как сделано в исходном коде.

Концепция безопасной криптографии

  1. Криптография должна базироваться по крайней мере на трех разных алгоритмах. Критическая слабость любого одного из алгоритмов не должна приводить к потере безопасности. Внутреннее устройство алгоритмов должно быть основано на разных принципах и структурах.
  2. Неприемлемы алгоритмы, разработанные правительственными учереждениями, или принятые, предложенные или рекомендованные в качестве государственных стандартов, или скомпрометированные из-за какого-либо отношения к гос. структурам. Также неприемлемы алгоритмы, разработанные сторонниками контроля над коммуникациями, и/или защищенные копирайтом.
  3. Из трех используемых алгоритмов, два должны быть давно известными и хорошо изученными, c внесенными поправками в случае необходимости. Третий алгоритм должен быть домашней разработкой, возможно, на основе известных алгоритмов.
  4. Для того, чтобы обеспечить долговременную безопасность, необходим размер ключа не менее 256 бит для симметричных шифров и хеш функций, и не менее 4096 бит для ассиметричной криптографии и электронной подписи на основе дискретных логарифмов больших чисел. Опыт показывает, что размер ключа 4096 бит обеспечивает безопасность. Работа с числами более 4096 бит будет слишком медленной на современном ПК.
  5. Криптография на эллиптических кривых не применяется по следующим причинам:
    1. Развитие квантовых компьютеров требует применения эллиптических кривых в больших полях (>1000 битов). Что практически сводит на нет преимущества эллиптической криптографии в скорости работы и в размере ключа.
    2. Возможность выбора слабой эллиптической кривой (преднамеренно или непреднамеренно). Слабость кривой трудно определить.
    3. Изобилие патентов и копирайтов на методы на эллиптических кривых.
  6. Требования к скорости работы и к размеру памяти, используемой криптоалгоритмами, несущественны в данном применении. Возможно каскадировать алгоритмы и увеличивать число итераций для увеличения криптостойкости.
  7. Алгоритмы должны иметь ясную понятную структуру и простую реализацию.
  8. Широкораспространенные криптографические библиотеки, такие как OpenSSL, Crypto++, GPG и пр. не используются по ряду технических причин, из-за сомнений в безопасности примененных в них процедур, а также по соображениям копирайта.

На основе вышеизложенных соображений, мы взяли за основу алгоритмы IDEA, XTEA, XXTEA и протокол обмена ключами и электронную подпись по методу Диффи Хеллмана на больших числах. Также используется самодельный блочный шифр нелинейной подстановки.

Количество циклов в алгоритмах увеличено, чтобы обеспечить по крайней мере трехкратный запас стойкости относительно известных опубликованных атак.

Обмен ключами по методу Диффи Хеллмана

В качестве алгоритма асимметричной криптографии используется обмен по методу Диффи Хеллмана (в варианте Эль-Гамаля). В каждой коммуникационной сессии простое число, используемое в качестве модуля, выбирается cлучайным образом из таблицы из 360 заранее рассчитаных безопасных простых чисел размером 4096 бит.

Таблица простых чисел сгенерена c помощью главного генератора случайных чисел. Таким образом, простые числа не имеют какой-либо внутренней структуры.

Коммуникационный протокол допускает возможность изменения и/или добавления простых чисел в таблицу.

В начале работы вырабатывается случайное число для использования в качестве генератора по модулю выбранного простого числа. Проверяется, чтобы генератор был примитивным корнем по выбранному модулю; т.е. образовывал полноразмерную группу.

Числа, используемые в обмене Диффи Хеллмана, защищены от атак типа "человек в середине" c помощью электронной подписи. Подпись использует 256-битный хеш от параметров Диффи Хеллмана.

В результате успешного обмена, обе стороны коммуникационного линка получают одно и то же 4096-битное число. Это число cжимается с помощью хеш функции СOLLAPSE в 1152-битный хеш. Из 1152 битов, 576 бит используется для инициализации ключей в направлении на прием, и оставшиеся 576 бит - для инициализации ключей в направлении на передачу. Из 576 битов в каждом направлении, 192 бита используются как ключ для аутентификации пакетов данных, и 384 бита используются в качестве ключа для шифрования. Таким образом, получаются сильные и несвязанные ключи для всех процедур.

Электронная подпись

Аутентичность пользователей системы проверяется с помощью электронной подписи. Алгоритм подписи основан на дискретных логарифмах и использует ту же таблицу заранее рассчитаных безопасных 4096-битных простых модулей, что и процедура обмена Диффи - Хеллмана.

Единственным секретным элементом системы является закрытый ключ электронной подписи. Закрытый ключ хранится в зашифрованном файле. Для шифрования используется комбинация алгоритмов IDEA и XTEA в режиме XEX, что обеспечивает потенциальную стойкость не хуже 256 бит. Ключ для шифрования получается из вводимого пользователем пароля и криптографической "соли" - случайного числа размером 256 бит. Используется специальная функция для генерации ключа из пароля (PKF).

Открытый ключ для проверки электронной подписи называется сертификатом. Число - 256-битный хеш сертификата также служит уникальным User ID в системе ZAS. Сертификат всегда передается вместе с подписанными данными, чтобы пользователи могли его проверифицировать и использовать.

ZAS не использует PKI, так как концепция PKI небезопасна и вредна, так как создает ложное впечатление стойкости. Защита от атак типа "человек в середине" - задача самих пользователей системы. Пользователь должен убедиться, что он общается с правильным корреспондентом, и проверифицировать отпечатки (fingerprint) сертификатов.

Функция преобразования пароля в ключ (PKF)

PKF - необратимая функция, которая вырабатывает ключ произвольного размера из комбинации из пароля и криптографической соли произвольного размера. Функция специально сделана сложной, медленной и потребляющей много памяти, чтобы затруднить взлом подбором пароля грубой силой или с помощью словаря. Вычисление PKF занимает примерно 0.1 сек на PC, и требует 1 мегабайт памяти. Внутренняя структура PKF сделана с учетом того, чтобы усложнить аппаратную реализацию на FPGA.

Главная хеш функция (COLLAPSE)

Главная хеш функция вырабатывает криптографически стойкий хеш произвольного размера (кратного 128 бит) из входных данных произвольного размера. Хеш вычисляется с использованием блочного шифра с переменным размером блока, используемого в режиме UBI.

Шифр использует N-битные блоки и 2xN битные ключи. В режиме UBI первые N бит ключа инициализируются хешем от предыдущего блока, и оставшиеся N бит инициализируются от 64-битного линейно-конгруэнтного генератора псевдослучайных чисел.

Блочный шифр с N-битными блоками делает N/64 циклов. То есть, для 256-битного блока делается четыре цикла. Ключи для каждого цикла вырабатываются с помощью своего алгоритма.

Каждый цикл состоит из 4-х шагов:

  1. Вычислить ключи, используемые в этом цикле, с помощью своего алгоритма.
  2. Применить самодельный блочный шифр.
  3. Применить IDEA блоки во всю ширину данных.
  4. Применить XXTEA с 66 раундами.

Вычисление 256-битного хеша от параметров Диффи - Хеллмана занимает менее одной миллисекунды на PC; таким образом, вычислительные затраты на вычисление хеш функций несущественны.

Поточный шифр (KEYSTREAM)

Все данные защищаются поточным шифром. Функция генерации поточного шифра является необратимой. То есть если неприятель сумеет завладеть текущим состоянием функции, он не сможет расшифровать данные, переданные до текущего момента времени.

Поточный шифр использует 384 бита состояния, полученных в результате обмена Диффи Хеллмана. Все коммуникационные сессии используют разные и никак не несвязанные ключи. Также, различные и несвязанные ключи используются в направлении на передачу и на прием.

Поточный шифр использует алгоритм IDEA для генерации псевдослучайных чисел, и XXTEA для модификации ключа IDEA. Нелинейно-конгруэнтный генератор со 128-битным состоянием используется как источник для IDEA в режиме счетчика и как ключ для xеш функции модификации ключа на основе алгоритма XXTEA.

Скорость генерации поточного шифра - более 10 MB/sec на современном PC. Период генерируемой последовательности не менее 2131 байт; эффективная стойкость не хуже 256 бит.

Структура пакетов данных и код идентификации сообщений (MIC)

Каждый пакет данных содержит 64-битный порядковый номер, 32-битную длину, поле данных произвольной длины, и 32-битный код (MIC) для проверки целостности пакета и защиты от атак путем изменения пакета, подсовывания пакетов или повтора переданных пакетов. Данные зашифрованы потоковым шифром.

MIC вычисляется следующим образом:

  1. Функция вычисления хеша инициализируется секретным 64-битным начальным значением (IV).
  2. Хеш размером 64 бит вычисляется из данных c помощью алгоритма XTEA в режиме UBI.
  3. Вычисленный хеш зашифровывается алгоритмом IDEA со 128-битным секретным ключом.
  4. Из 64-битного зашифрованного слова делается 32-битный MIC путем сложения младшего и старшего полуслов.

Cекретный ключ и начальное значение (всего 192 бита информации) инициализируются при обмене Диффи Хеллмана. Все коммуникационные сессии используют разные несвязанные ключи; также разные ключи используются в направлении на прием и на передачу.

Основной генератор случайных чисел

Основной генератор случайных чисел используется для инициализации ключей для обмена Диффи Хеллмана, и других важных данных коммуникационной сессии. Генератор построен на основе структуры с нелинейными обратными связями. Размер вектора состояния генератора - 1 килобайт. Изменение любого бита в состоянии вызовет лавинообразное изменение выхода генератора; то есть генерируемая последовательность будет совершенно другой.

Вектор состояния генератора обрабатывается необратимой функцией до и после генерации каждой псевдослучайной последовательности. То есть невозможно восстановить предыдущие сгенерированные последовательности зная текущее состояние генератора. Также, состояние генератора непрерывно обновляется от процедуры сбора энтропии.

Процедура сбора энтропии

Энтропия непрерывно накапливается от различных истинно случайных источников, и применяется к состоянию главного генератора случайных чисел (seed). Seed имеет размер 1 килобайт. Файл seed.bin создается автоматически при первом старте программы, и далее обновляется при каждом запуске программы. Состояние самого seed обновляется непрерывно при работе программы. Обновление seed производится с помощью необратимой функции; таким образом, невозможно получить предыдущее состояние seed из текущего состояния.

Источники энтропии:

  1. Стандартный системный источник (/dev/random(), CryptGenRandom())
  2. Передаваемые и принимаемые данные. Так как открытый текст передаваемых и принимаемых данных по крайней мере частично неизвестен противнику, то открытый текст может быть использован как источник энтропии. Энтропия собирается от каждого переданного или принятого пакета данных.
  3. При генерации ключа, энтропия дополнительно собирается от нажатий клавиатуры и движений мышки.

Шифрование файлов истории в ЗАС

Начиная с версии программы 1.6, файлы истории чата и даунлоадов ЗАС хранятся в зашифрованном виде. Невозможно прочесть содержимое файлов вне программы ЗАС, не имея секретного ключа пользователя. Шифрование делается в режиме XEX с использованием алгоритмов IDEA и XTEA. Ключ XEX размером 256 бит и 64-битное начальное значение счетчика вычисляются как хеш функция от секретного ключа подписи пользователя (размером 4096 бит). Вычисление хеша инициализируется случайной “солью” размером 256 бит. Соль запоминается в начале файла, в момент создания файла. Таким образом, каждый файл зашифрован уникальным образом, c разным начальным значением и ключом. Если файл был удален, новый файл создастся с другим значением соли, то есть шифрование будет другим. Если пользователь сгенерирует новый секретный ключ, расшифровать старые файлы будет невозможно.

Обфускация протокола

Начиная с ZAS версии 1.7, ко всему обмену по сети применяется процедура обфускации. Передаются пакеты, которые выглядят как случайные данные cо случайной длиной. В траффике ZAS нет характерных сигнатур, легко узнаваемых полей данных и/или длин пакетов. Обфускация не дает дополнительной стойкости системе. Эта мера cлужит для маскировки траффика и преодоления блокировок в интернете.