пятница, 28 декабря 2018 г.

От ESCK-5 к ESCK-6: основные отличия нового алгоритма шифрования

Трунов Д.Н.
ОТ ESCK-5 К ESCK-6: ОСНОВНЫЕ ОТЛИЧИЯ НОВОГО
АЛГОРИТМА ШИФРОВАНИЯ

Введение
В алгоритме шифрования ESCK-5 [1] реализован некоторый способ приближения к так называемому одноразовому блокноту (он же шифр Вернама) — криптографической системе с доказанной абсолютной стойкостью [2, 3]. В классическом виде ключ такого шифра должен обладать следующими критически важными свойствами:
1) быть истинно случайным;
2) совпадать по размеру с шифруемым текстом (или превосходить его);
3) применяться только один раз;
4) после использования ключ должен быть уничтожен.
В ESCK-5 вместо истинно случайного ключа применяется псевдослучайный ключ, вычисленный на основе заданного основного ключа и самих шифруемых данных. Для усложнения определения возможным злоумышленником «неслучайности» ключа шифрования (то есть выявления закономерностей в нём), применяется основной ключ достаточно большой длины (8192 бита), а вычисления производятся на протяжении большого количества циклов.
Поскольку ключ вычисляемый, его длина легко подстраивается под длину сообщения (шифруемых данных), а благодаря влиянию самого сообщения на ключ достигается «одноразовость» — для разных сообщений получаются и разные ключи. Причём нет необходимости ручного удаления этих ключей после использования, потому что они всё равно нигде не сохраняются и удаляются автоматически после завершения шифрования или расшифровки.
Такая схема шифрования может быть довольно надёжной при большом количестве циклов шифрования и достаточной длине шифруемого сообщения. Тем не менее, алгоритм ESCK-5 допускает минимум один цикл шифрования и сообщения длиной от 32 бит (если фактическая длина ещё меньше, сообщение будет дополнено до 32 бит). При таких минимальных параметрах алгоритм может оказаться весьма уязвимым перед возможными атаками, что в некоторых случаях делает недопустимым его применение. Новая версия алгоритма — ESCK-6 — призвана устранить эти недостатки и обеспечить приемлемую безопасность даже при небольшой длине сообщения и малом количестве циклов шифрования.

Безопасность алгоритмов шифрования
Алгоритм шифрования считается вычислительно безопасным, если он не может быть взломан с использованием доступных ресурсов сейчас или в будущем [4]. Сложность вскрытия можно измерить различными способами:
1) сложность данных — объём данных, используемых на входе операции вскрытия;
2) сложность обработки — время, нужное для проведения вскрытия;
3) требования к памяти — объём памяти, необходимый для вскрытия.
Ряд операций вскрытия предполагает взаимосвязь коэффициентов: более быстрое вскрытие возможно за счёт увеличения требований к памяти.
Для противодействия взлому алгоритма нужно учитывать, что у возможного криптоаналитика (взломщика) кроме единственного взламываемого зашифрованного сообщения могут быть:
1) другие сообщения, зашифрованные тем же алгоритмом и ключом;
2) несколько пар открытых и зашифрованных одним и тем же ключом сообщений;
3) некоторые сведения об открытом сообщении в виде стандартного начала, ключевых слов и т.д.

Уязвимости в ESCK-5
Оценка безопасности алгоритма ESCK-5 не столь однозначна: многое зависит от длины шифруемых данных, режима и циклов шифрования. Но очевидно, что чем меньше циклов, тем менее безопасен алгоритм. Самым ненадёжным будет шифрование при единственном цикле.
В одном проходе (цикле) шифрования каждый шифруемый элемент M[I] размером 32 бита по несложной функции изменяется с помощью вспомогательной величины F, зависящей преимущественно от части ключа, размером 64 бита. В полном шифруемом блоке величина F имеет дополнительные зависимости от других шифруемых элементов, которые доступны взломщику. В неполном блоке F может зависеть и от других частей ключа, взломщику неизвестных.
Одна из уязвимостей заключается в том, что для двух мало различающихся сообщений величины F для некоторых (или даже многих) 32-битных элементов будут одинаковыми. Знание этих величин может позволить раскрыть часть третьего зашифрованного сообщения даже без знания ключа. Ещё хуже то, что знание величин F позволяет раскрывать части ключа, от которых эти величины зависят. А при достаточном количестве информации и вычислительных ресурсов есть возможность раскрыть ключ целиком, что недопустимо. Правда, уже при 2-3 циклах шифрования возможность такого вскрытия усложняется на несколько порядков.
Другая существенная уязвимость может проявиться при шифровании неполного блока, состоящего из одного-двух 32-битных элементов. Для первого такого элемента может сложиться так, что величина F будет зависеть только от некоторой части ключа и не меняться от цикла к циклу. Если так, то независимо от длины и значения ключа злоумышленнику нужно проверить лишь 232 варианта величины F, чтобы найти нужную и научиться раскрывать первый элемент любого сообщения, зашифрованного тем же ключом. В некоторых случаях вскрытие даже одного первого элемента может стать критическим. В новой версии алгоритма требовалось закрыть эти уязвимости.

Увеличение разрядности
В алгоритме ESCK-6 было решено повысить разрядность элементарных вычисляемых элементов с 32 до 64 бит, что обусловлено несколькими причинами. Во-первых, современные компьютеры хорошо справляются с 64-разрядными вычислениями, потому эффективнее обрабатывать за раз одно 64-битное число, чем два 32-битных. Во-вторых, увеличение разрядности положительно скажется и на надёжности алгоритма за счёт увеличения длины промежуточных ключей на каждом элементарном этапе шифрования. Также в два раза будут увеличены общий размер ключа шифрования и блока данных для обработки.
То есть алгоритм будет по-прежнему оперировать массивом ключа K и текущим массивом M для блока данных, состоящих из 256 элементов каждый. Только теперь эти элементы будут представлять собой 64-разрядный целые числа без знака. В языке программирования C# такие числа определяются типом ulong или структурой UInt64 [5].
Соответствующим образом увеличится разрядность всех промежуточных расчётных величин, в том числе переменной Adr, содержащей динамические адреса элементов массивов K и M, участвующих в каждой элементарной операции шифрования или расшифровки. Теперь эта переменная может хранить не 4, а 8 таких адресов.

Вычисление динамических адресов
Величина Adr, содержащая динамические адреса вспомогательных элементов в ESCK-6 рассчитывается немного по-другому. Она вычисляется по функции, аргументами которой является текущий элемент ключа, а также предыдущий и следующий элемент шифруемого массива M. Для нулевого элемента вместо предыдущего берётся последний элемент массива ключа — K[255]. Для последнего шифруемого элемента следующий берётся не из массива M, а из массива K (либо из уже обработанных элементов в начале массива M). Ниже приведён фрагмент алгоритма на языке C#.

    // получение текущего элемента ключа
    A = K[I];

    // получение предыдущего элемента рабочего массива
    if (I > 0)
        B = M[I - 1];
    else
        B = K[255];

    // получение следующего элемента рабочего массива
    Adr = (uint)((I + 1) & 0xFF);
    if (Adr <= Size)
        C = M[Adr];
    else
        C = K[Adr];

    // вычисление основного адреса
    Adr = A & B;
    F = ~(A | C);
    Adr = ROL64((Adr ^ F), 7);
    F = (~B) & C;
    Adr = ROL64((Adr ^ F), 7);

Здесь A, B, C и F – вспомогательные 64-битные переменные типа ulong, а функция ROL64 выполняет циклический сдвиг влево на заданное число бит для 64-разрядных целых чисел.
Подобный подход позволяет получать разные значения переменной Adr для одного и того же элемента в разных циклах шифрования, если шифруется не менее двух элементов: величина Adr для первого элемента будет зависеть от второго (а она меняется от цикла к циклу), а для второго — от первого (тоже меняется от цикла к циклу). В зависимости от адресов, шифрование отдельных элементов будет в каждом цикле выполняться с разными ячейками массивов K и M. Так устраняется уязвимость, связанная с потенциальной возможностью применения одних и тех же ячеек из цикла в цикл.

Замена схемы шифрования
В алгоритме ESCK-5 текущий элемент M[I] шифровался при помощи величины F, которая вычислялась в течение нескольких последовательных операций с участием части ключа и четырёх вспомогательных величин A, B, C и D, взятых из шифруемого массива или массива ключа по динамическим адресам. С помощью вычисленной величины F менялся уже текущий элемент M[I]. Как уже упоминалось, такая схема могла стать весьма уязвимой при малом количестве циклов шифрования.
В ESCK-6 было решено выполнять операции не над промежуточной величиной F, а сразу над шифруемым элементом M[I]. Кроме того предполагалось увеличить количество частей ключа, участвующих в шифровании элемента M[I]. Поскольку 64-битная переменная Adr может хранить теперь 8 динамических адресов, вместо четырёх вспомогательных величин также было решено применять восемь: четыре (A, B, C, D) брать из массива ключа K, а ещё четыре (E, F, G, H) – из шифруемого массива M. Как всегда, если нельзя брать элемент из массива M (совпадение адреса с текущим номером I или выход за пределы шифруемого размера), величина берётся из массива K с тем же адресом.
В процессе шифрования над ячейкой M[I] последовательно выполняется шесть операций с участием упомянутых восьми величин в разных комбинациях, текущего элемента ключа K[I] и даже переменной Adr. При расшифровке выполняются обратные операции и в обратном же порядке. Ниже приведён фрагмент функции шифрования элемента M[I].

    // последовательная зашифровка текущего элемента
    M[I] = ROL64(M[I] ^ (~((A + B + C + D) ^ K[I])), 7);
    M[I] = ROL64(M[I] ^ (A | E), 7);
    M[I] = ROL64(M[I] ^ (B & (~F)), 7);
    M[I] = ROL64(M[I] ^ (~(C & G)), 7);
    M[I] = ROL64(M[I] ^ ((~D) | H), 7);
    M[I] = ROL64(M[I] ^ ((E + F + G + H) | (~Adr)), 7);

Режимы шифрования
Как упоминалось выше, уязвимость алгоритма при шифровании блока малого размера устраняется при условии, что блок будет состоять минимум из двух 64-битных элементов. Поэтому в ESCK-6 не допускается шифрование менее двух таких элементов: если шифруемых данных меньше 16 байт (128 бит), они обязательно дополняются недостающими байтами, чтобы сформировать необходимые два элемента по 64 бита.
В алгоритме ESCK-5 для такого дополнения недостающими байтами применялся режим mdMin16, который по умолчанию был отключен, мог быть включен по требованию. В ESCK-6 любое шифруемое сообщение обязательно дополняется до минимум 16 байт, если оно короче. Потому включение или выключение режима mdMin16 становится бесполезным, из-за чего было решено исключить этот режим из алгоритма.
Остальные режимы шифрования в ESCK-6 (как и принцип их работы) остались без изменений. Только несколько поменялись константы этих режимов. Ниже приведены актуальные значения констант режимов шифрования, объявленные в алгоритме.

    // режимы шифрования
    public const byte mdChng = 1; // смена ключа при переходе между блоками
    public const byte mdStr = 2; // удлинение неполного блока
    public const byte mdRndm = 4; // заполнение свободных ячеек случайными числами
    public const byte mdChain = 8;// смена ключа по цепочке

Заключение
Алгоритм шифрования ESCK-6 является доработанной и исправленной версией алгоритма ESCK-5. Все изменения, отличающие новый алгоритм от прежнего, призваны повысить общую безопасность шифрования и устранить некоторые конкретные уязвимости. Так улучшенная схема вычисления динамических адресов позволяет обеспечить надёжную связь шифруемых элементов и их зависимость от меняющихся от цикла в цикл элементов ключа. Изменённая схема шифрования затрудняет вскрытие шифра без знания ключа и/или получение части ключа даже при шифровании по одному циклу. Увеличение разрядности повышает общую безопасность алгоритма и позволяет применять больше элементов с динамическими адресами. Исключается режим шифрования mdMin16, который теперь всегда включен. Всё остальное вошло из ESCK-5 в ESCK-6 без изменений, не считая исправлений, связанных с повышением разрядности.

Источники информации
1. Трунов Д.Н. Алгоритм шифрования ESCK-5: описание, принцип работы, исходные тексты [Электронный ресурс] – URL: http://d-raft5.blogspot.com/2018/04/esck-5.html
2. Гатченко Н.А., Исаев А.С., Яковлев А.Д. «Криптографическая защита информации» - СПб: НИУ ИТМО, 2012. — 142 с.
3. Википедия. Шифр Вернама. [Электронный ресурс] — URL: https://ru.wikipedia.org/wiki/Шифр_Вернама
4. Шнайер Брюс. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. – М.: Триумф, 2002. – 816 с.
5. Шилдт, Герберт. Полный справочник по C#. Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 752 с.: ил.

пятница, 28 сентября 2018 г.

Примечания к статье "О некоторых изменениях в криптографических алгоритмах ESCK-5 и CSA-2"

Трунов Д.Н.
Примечания к статье «О некоторых изменениях в криптографических алгоритмах ESCK-5 и CSA-2»

В статье «О некоторых изменениях в криптографических алгоритмах ESCK-5 и CSA-2» были рассмотрены изменения упомянутых алгоритмов, которые практически не затрагивали результатов их работы. Для алгоритма криптографической подписи CSA-2 этого было достаточно, однако в алгоритме шифрования ESCK-5 из-за особенностей режимов шифрования и работы с неполными блоками были выявлены недостатки, устранение которых кардинально влияет на результаты вычисления.
Главный недостаток обнаружен в функциях одного раунда шифрования и расшифровки (Enc и Dec) в части определения величин A, B и C (в самом начале основного цикла). В прежнем варианте допускались ситуации, когда величины B и C оказывались достоверно одинаковыми, что ослабляло надёжность шифрования. Ниже приведён фрагмент прежнего кода на языке C#:

    // получение текущего и следующего элементов ключа или массива
    A = K[I];

    Adr = (uint)(I + 1);
    if (Adr > 255)
        Adr = Adr & 0xFF;
    B = K[Adr];

    if (Adr > Size)
        C = K[Adr];
    else
   C = M[Adr];

Алгоритм был изменён так, чтобы величина C во всех случаях бралась из источника, отличного от источника величины B. Ниже приведён фрагмент исправленного кода:

    // получение текущего элемента ключа
    A = K[I];

    // получение следующего элемента ключа
    Adr = (uint)(I + 1);
    if (Adr > 255)
        Adr = Adr & 0xFF;
    B = K[Adr];

    // следующий элемент из рабочего массива, если не выходит за пределы
    if (Adr > Size)
    {
        // если выходит за пределы, взять следующий элемент ключа
        Adr++;
        if (Adr > 255)
            Adr = Adr & 0xFF;
        C = K[Adr];
    }
    else
        C = M[Adr];

Кроме того, была исправлена функция шифрования файла EncryptFile в части определения размера для записи. За счёт возможного добавления дополнительных ячеек размер записываемых данных может превышать размер шифруемых. Очень важно правильно вычислить этот размер, иначе могут возникнуть ошибки при расшифровке некорректно записанных в файл данных.
В прежней версии ошибочно дописывались лишние 16 байт, если включен режим mdMin16 и одновременно последний блок является полным (или включен режим mdStr, дополняющий неполный блок до полного). Ниже приведён фрагмент упомянутого кода:

    // определение размера для записи
    J = (uint)BufSz;
    if ((J & 3) != 0)
        J = ((J >> 2) + 1) << 2;
    if (((J % 1024) != 0) && ((Mode & mdStr) != 0))
        J = ((J >> 10) + 1) << 10;
    if (((J % 1024) < 16) && ((Mode & mdMin16) != 0))
        J = ((J >> 4) + 1) << 4;

В новой версии такая ситуация исключалась с помощью проверки (J % 1024) != 0 не только в режиме mdStr, но и mdMin16. Если размер неполного блока равен нулю, значит, все блоки полные и никакое удлинение не требуется. Ниже приведён фрагмент исправленного кода:

    // определение размера для записи
    J = (uint)BufSz;
    if ((J & 3) != 0)
        J = ((J >> 2) + 1) << 2;
    if (((J % 1024) != 0) && ((Mode & mdStr) != 0))
        J = ((J >> 10) + 1) << 10;
    if (((J % 1024) != 0) &&((J % 1024) < 16) && ((Mode & mdMin16) != 0))
        J = ((J >> 4) + 1) << 4;

В заключение следует отметить, что все изменения касаются только алгоритма шифрования ESCK-5 и никак не влияют на алгоритм криптографической подписи CSA-2, оставшийся без изменений.

четверг, 23 августа 2018 г.

Компьютерная программа PasswordKeeper для безопасного хранения паролей и заметок к ним

Трунов Д.Н.
Компьютерная программа PasswordKeeper для безопасного хранения паролей и заметок к ним

Введение
По оценкам специалистов, средний пользователь имеет около 26 защищаемых паролем аккаунтов [1]. Заучить на память такое количество паролей практически невозможно, поэтому многие пользователи прибегают к различным ухищрениям, используя один и тот же пароль на нескольких сайтах или используя слишком лёгкие комбинации. Эксперты, анализируя выложенные в сети данные с сайтов, взломанных хакерами, замечают, что около 20% пользователей выбирают очень простые и схожие пароли, например «123456» или «Password» [2]. Все подобные ухищрения не являются безопасными по тем или иным причинам.
Наилучшим способом хранения паролей по совокупности надёжности и удобства является использование специальных программ – менеджеров паролей. Однако, наряду со своими преимуществами, у каждого менеджера паролей есть и свои недостатки, в том числе отсутствие бесплатной версии (например, 1Password) или её ограничения. Так, в бесплатной версии Kaspersky Password Manager можно сохранять до 15 паролей, а менеджер паролей от компании Avast устанавливается на ПК только вместе с антивирусом Avast.
Самый известный из полностью бесплатных менеджеров KeePass Password Safe обладает устаревшим дизайном и потенциальными уязвимостями в применении подключаемых плагинов, написанных независимыми авторами [3]. Потенциально уязвимым является и LastPass, который предоставляет возобновление доступа к паролям даже без знания мастер-пароля. И хотя для этого принимаются меры безопасности, нет полной уверенности в отсутствии способов обойти эти меры злоумышленниками.

Общая характеристика программы PasswordKeeper
Программа PasswordKeeper представляет собой альтернативное решение для хранения личных паролей пользователя, простое и безопасное. Программа не требует установки, может легко переноситься и запускается на любом компьютере с установленной платформой .NET Framework или Mono [4]. Как и в случае с другими менеджерами, для защиты сохраняемых паролей применяется мастер-пароль, единственный требующий запоминания.
В программе реализован только самый необходимый функционал: возможность добавлять, просматривать, редактировать и удалять пароли, перемещать их и производить по ним поиск. Есть возможность заменять мастер-пароль, а также создавать и работать с резервными копиями хранилища паролей. Также имеются несколько дополнительных инструментов, таких как генератор случайных паролей и виртуальная клавиатура.
Программа написана на языке программирования C# (среда разработки Microsoft Visual C# 2008), предназначена для работы в GUI-среде (graphics user interface – графический интерфейс пользователя) и для взаимодействия с пользователем предлагает главное (рисунок 1) и ряд вспомогательных окон. Для простоты реализации в интерфейсе программы применяются только стандартные элементы управления языка C# и библиотеки System.Windows.Forms [5].

Концепция хранения паролей
Для хранения паролей PasswordKeeper использует специальный файл-хранилище, который располагается в одном каталоге вместе программой. При каждом запуске программа открывает этот файл автоматически (или создаёт, если его нет). Пароли добавляются и хранятся в этом файле в виде записей (рисунок 2), включающих в себя заголовок (название) записи, непосредственно пароль и заметку к нему. Заметка предназначена для дополнительных сведений и не является обязательной.

Рисунок 1 – Главное окно с открытым опытным хранилищем

Рисунок 2 – Пример открытой парольной записи

Для упрощения структуры хранилища пароль с заметкой объединяются в единое поле при сохранении, а при открытии записи они снова разделяются. Заголовок и пароль могут иметь допустимую длину от 1 до 255 символов каждый, а объединённый пароль с заметкой может содержать до 4095 символов. Поскольку в программе применяется кодировка текста Unicode, то символом считается его двухбайтный код. Если какой-то символ занимает 4 байта, они считаются как два символа.
При добавлении записи в хранилище она обязательно шифруется по алгоритму ESCK-5 [6]. Для этого на основе мастер-пароля создаются два ключа шифрования: лёгкий и тяжёлый. Основное их различие заключается в применяемых циклах шифрования. Лёгким ключом с небольшим количеством циклов шифруются заголовки записей, чтобы их быстрее расшифровывать при открытии хранилища и построении списка. Тяжёлым ключом с большим количеством циклов шифруются пароли (с заметками), которые будут расшифровываться только в момент открытия записи.
Ключи вычисляются таким образом, чтобы даже вскрытие лёгкого ключа не позволило злоумышленникам узнать мастер-пароль и/или получить тяжёлый ключ. Схема вычисления выглядит следующим образом:
1. На основе мастер-пароля генерируется тяжёлый ключ с циклами шифрования, заданными пользователем.
2. По заранее установленному шаблону генерируется лёгкий ключ с установкой режима, при котором ключ меняется при участии блока шифруемых данных (блок данных добавляется к ключу по специальному алгоритму). Временно применяется большое количество циклов шифрования.
3. Создаётся временный массив, заполняемый по установленному шаблону, и шифруется тяжёлым ключом.
4. Тот же массив шифруется лёгким ключом, причём сам ключ меняется при участии содержимого массива.
5. В лёгком ключе устанавливается простой режим шифрования (когда ключ больше не меняется при участии шифруемых данных) и устанавливается небольшое количество циклов шифрования. Ключи готовы.
Для контроля отсутствия искажений созданных ключей во время работы программы в начале работы ими зашифровываются две контрольные строки: одна лёгким ключом, вторая – тяжёлым. При добавлении или изменении записи, когда она уже зашифрована и готова к сохранению, выполняется расшифровка контрольных строк. При обнаружении ошибки сохранение отменяется и пользователю выдаётся предупреждающее сообщение.

Создание и открытие хранилища
При каждом запуске программа пытается открыть существующее хранилище паролей и, если его нет, инициирует создание нового. В этом случае пользователю необходимо в специальном окне (рисунок 3) указать имя профиля для создаваемого хранилища, ввести мастер-пароль и количество циклов шифрования (применяются для создания тяжёлого ключа). Циклы шифрования указаны по умолчанию, поэтому их можно не менять.

Рисунок 3 – Окно установки пароля и параметров нового профиля

Имя профиля необходимо, чтобы различать создаваемые хранилища. Для каждого экземпляра программы может быть создан единственный файл-хранилище. Но, поскольку экземпляров программы может быть несколько (в разных каталогах), то столько же может быть и файлов-хранилищ. Чтобы в них не путаться, их можно различать по имени профиля.
Для корректной работы при создании хранилища в него изначально записывается некоторая техническая информация: идентификатор программы, количество циклов шифрования, имя профиля и зашифрованное имя профиля. Шифрование имени профиля необходимо для проверки мастер-пароля при открытии хранилища и выполняется лёгким ключом.
Хотя лёгкий ключ шифрует быстрее тяжёлого (обычно), на его создание нужно больше времени, что должно затруднить возможность взлома мастер пароля методом «грубой силы» (полным перебором возможных вариантов) [7], поскольку для каждого варианта придётся вычислять и тяжёлый, и лёгкий ключи, а это затратно по времени.
При открытии существующего хранилища программа требует только ввести мастер-пароль, а имя профиля и количество циклов шифрования считывает из файла. На основе введённого мастер-пароля создаются тяжёлый и лёгкий ключи, расшифровывается имя профиля. Если расшифровка выполнилась успешно, хранилище загружается в память программы, расшифровываются названия записей и выводятся в список в главном окне. Программа готова к работе.

Контроль PIN-кода
Если шифрование призвано защитить сохранённые пароли от взлома, то PIN-код защищает пароли в открытой программе на оставленном без присмотра компьютере. При каждом вводе мастер-пароля программа требует установить 4-значный PIN-код сессии (рисунок 4 слева), который будет действовать до закрытия программы или выполнения сброса (если PIN-код не установить, хранилище не будет загружено). Далее при каждой ключевой операции с паролями (открытие, изменение или удаление), понадобится опять ввести тот же PIN-код (рисунок 4 справа). Если код будет введён неверно, операция не выполнится.
               
Рисунок 4 – Окна установки (слева) и проверки (справа) PIN-кода сессии

После трёх неверных попыток ввода PIN-кода хранилище закрывается, а ключи шифрования удаляются. Возобновить доступ к хранилищу можно после его повторного открытия (меню «Файл-Переподключиться»), ввода мастер-пароля и установки нового PIN-кода сессии.
При частом обращении к паролям проверку PIN-кода можно временно отключить. Для этого при очередной его проверке нужно установить флажок «Не спрашивать ближайшие 10 минут». Тогда на протяжении этого времени PIN-код не будет запрашиваться, но по истечении 10 минут проверка возобновится.

Работа с резервными копиями хранилища
Перед каждым изменением хранилища (например, при добавлении или удалении записи) программа автоматически создаёт копию хранилища в виде bak-файла. В случае ошибки или необходимости отменить последнее изменение, хранилище можно восстановить из этого файла в окне работы с резервными файлами (рисунок 5). Поскольку каждый новый bak-файл заменяет собой предыдущий такой файл (если он есть), возможность отмены доступна только на одно изменение назад.

Рисунок 5 – Окно работы с резервными файлами

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

Замена и восстановление мастер-пароля
Замена мастер-пароля хранилища производится в соответствующем окне (рисунок 6), в котором нужно ввести текущий и новый мастер-пароль. При необходимости можно также поменять имя профиля и/или количество циклов шифрования. Если текущий мастер-пароль введён правильно, программа расшифрует все записи прежними ключами, вычислит новые ключи на основе нового мастер-пароля, зашифрует обратно все записи и сохранит в хранилище.

Рисунок 6 – Окно замены мастер-пароля

Исходя из соображений безопасности, программа нигде не сохраняет мастер-пароль в открытом виде, а применение шифрования с большим количеством циклов делают практически невозможным вскрытие мастер-пароля или открытие хранилища без знания его. Но это же значит, что если пользователь забудет свой мастер-пароль, то он никак не сможет открыть своё хранилище.
Возможно, пользователь захочет где-то сохранить свой мастер-пароль. Чтобы не сохранять его в открытом виде, программа предлагает сгенерировать код восстановления. Для этого нужно в специальном окне (рисунок 7) ввести пароль восстановления и свой мастер-пароль. Фактически, программа тщательно зашифровывает мастер-пароль ключом, созданным на основе пароля восстановления. Для восстановления мастер-пароля в том же окне нужно ввести пароль и код восстановления. Рекомендуется хранить пароль и код восстановления в надёжном месте отдельно друг от друга.
  
Рисунок 7 – Окно восстановления пароля

Вспомогательные инструменты
Одним из вспомогательных инструментов является встроенная виртуальная клавиатура, которая представляет собой базовую защиту от шпионских программ и может быть использована во всех случаях ввода пароля или мастер-пароля (по нажатию кнопки «Клавиатура» возле соответствующего поля). Для ввода предлагаются только цифры, латиница нижнего и верхнего регистров и некоторые специальные знаки.
Другим вспомогательным инструментом является генератор паролей (рисунок 8), предназначенный для создания случайных и надёжных паролей. Генератор может запускаться как из главного меню, так и из окон добавления или редактирования записи. Во втором случае сгенерированный пароль можно «применить» – вставить прямо в поле ввода в соответствующем окне. Генерация происходит с участием алгоритма DeepRand [8], случайные данные для которого накапливаются в процессе работы программы.

Рисунок 8 – Встроенный генератор паролей

Заключение
Как и в других менеджерах паролей, в PasswordKeeper работает принцип: вместо запоминания многих паролей достаточно запомнить всего один, а остальные сохранить в программе. Тщательное шифрование сохраняемых данных защищают их от взлома, а контроль PIN-кода защищает работающую программу от любопытных родственников (дома) или коллег (на работе) на оставленном без присмотра компьютере.
Возможность создания резервных копий хранилища паролей и восстановления из них позволяет снизить риски потери данных, а возможность генерации кода восстановления – не забыть мастер пароль. Встроенный генератор паролей позволяет создавать случайные и надёжные пароли, а виртуальная клавиатура обеспечивает более безопасный их ввод в программе.
Среди дополнительных преимуществ программы можно выделить её портативность и возможность запуска (без установки) на многих современных компьютерах с установленной платформой .NET Framework или Mono. Полезной также является возможность работы с несколькими профилями на одном компьютере.

Источники информации
1. Alex Hernandez. [Infographic] Password protection: Why it’s easy for hackers to hack [Электронный ресурс] – URL: https://techaeris.com/2018/05/25/password-protection-easy-hackers-hack
2. Геннадий Печёнкин. Самые популярные и самые опасные пароли в интернете. – «Московский комсомолец» (mk.ru) [Электронный ресурс] – URL: https://www.mk.ru/science/article/2010/01/26/418065-samyie-populyarnyie-i-samyie-opasnyie-paroli-v-internete.html
3.Википедия. KeePass. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/KeePass
4 Википедия. Mono. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/Mono
5. Шилдт, Герберт. Полный справочник по C#.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 752 с.: ил.
6. Трунов Д.Н. Алгоритм шифрования ESCK-5: описание, принцип работы, исходные тексты [Электронный ресурс] – URL: http://d-raft5.blogspot.com/2018/04/esck-5.html
7. Википедия. Полный перебор. [Электронный ресурс] – URL: https://ru.wikipedia.org/wiki/Полный_перебор
8. Трунов Д.Н. Генератор случайных чисел с механизмом глубокого накопления случайных данных DeepRand [Электронный ресурс] – URL: http://d-raft5.blogspot.com/2018/04/deeprand.html