Бастион V16 - Шифрование текста

Механизм защиты от создания дампов памяти был заменен на штатную, документированную технологию Windows (WerSetFlags).
Теперь, в случае непредвиденного сбоя, операционная система не будет автоматически создавать копию (дамп) памяти процесса, что предотвращает утечку чувствительных данных.

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Принято решение выпустить версию программы без встроенных средств защиты от отладки и принудительной очистки оперативной памяти.

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

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Теперь вы можете не только искать текст (Ctrl + F), но и вносить изменения.

Функция "Заменить" позволяет постепенно заменять найденные символы.
"Заменить всё" заменяет все найденные символы одновременно.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Генерация QR-кодов (Alt + Q)

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

Максимальный объем текста для кодирования в QR-код составляет 2331 байт

Важно понимать, что количество символов, которое можно закодировать, зависит от языка.
Например, латинские буквы и цифры занимают по 1 байту, в то время как кириллические символы в кодировке UTF-8 — по 2 байта.
Таким образом, в QR-код поместится примерно в два раза меньше кириллического текста, чем латинского.

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

В последующих версиях рассматривается возможность добавления сжатия (архивирования) данных перед шифрованием.
Это позволит помещать в QR-код больше информации и уменьшит итоговый размер зашифрованных сообщений.

Вы можете сохранить сгенерированный QR-код как BMP-файл, сделав двойной щелчок левой кнопкой мыши по его изображению.

Скачать можно в облаке, лежит в папке Bastion V16 + QR
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Создана единая функция DecryptAndVerify для расшифровки данных и проверки их целостности (HMAC).

Ранее схожий код для расшифровки находился в двух местах:
в функции для расшифровки текста в окне (OnDecryptClick) и в функции для проверки сохраненного файла (VerifySavedFile).
Теперь обе функции обращаются к DecryptAndVerify.

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

Скачать можно в облаке
 
Интегрирован архиватор miniz для сжатия данных перед шифрованием

Это значительно уменьшает итоговый размер зашифрованного текста, что особенно полезно при работе с большими объёмами информации и при создании QR-кодов.
Уменьшенный размер шифротекста особенно полезен при генерации QR-кодов, поскольку теперь в один QR-код можно уместить гораздо больше полезной информации.

Сжатие включено постоянно и по умолчанию работает на уровне 6 (Z_DEFAULT_COMPRESSION), что обеспечивает оптимальный баланс между скоростью и степенью сжатия.
Вы можете изменить этот параметр вручную в исходном коде, в функции compress_data, изменив последний аргумент в вызове функции compress2.

Доступные варианты:

MZ_NO_COMPRESSION (0): Без сжатия.
MZ_BEST_SPEED (1): Максимальная скорость, минимальное сжатие.
MZ_DEFAULT_COMPRESSION (6): Оптимальный баланс (используется по умолчанию).
MZ_BEST_COMPRESSION (9): Максимальное сжатие, минимальная скорость.

Сохранена обратная совместимость с предыдущими версиями.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Устранена проблема в темной теме.
При изменении размера шрифта с помощью Ctrl + колесо мыши приводило к сбросу цвета текста со светлого на черный.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Устранено дублирование кода при проверке пароля

Ранее, логика для считывания паролей из полей ввода, проверки их на пустоту и сверки на совпадение была скопирована в двух функциях:
OnEncryptClick (при шифровании) и OnDecryptClick (при расшифровке).

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

Улучшение удобства использования

В дополнение к стандартному переходу вперед по клавише Tab, была реализована возможность перемещаться назад, на предыдущий элемент, с помощью сочетания Shift + Tab.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
SpongeV16 (SV16)

SpongeV16.h - Главный заголовочный файл
SpongeV16.cpp - Файл реализации
miniz.h, miniz.c - Библиотека для сжатия данных
example.cpp - Пример использования
example 2.cpp - Пример использования (раунды KDF и губки)

Интеграция в проект

Скопируйте исходные файлы (SpongeV16.h, SpongeV16.cpp, miniz.h, miniz.c) в папку с вашим проектом.

Подключите заголовочный файл: #include "SpongeV16.h"

При компиляции добавьте SpongeV16.cpp и miniz.c к списку исходных файлов вашего проекта.

Для успешной сборки необходимо подключить следующие системные библиотеки:
bcrypt.lib (для криптографического генератора случайных чисел)
psapi.lib (для сбора дополнительной энтропии)

Пример команды (clang++):
clang++ -o my_app.exe my_app.cpp SpongeV16.cpp miniz.c -lbcrypt -lpsapi
 
Убрана обязательная ручная инициализация


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

Теперь библиотека использует механизм "ленивой (автоматической) инициализации".
Внутренняя подготовка (например, запуск потока для сбора энтропии) выполняется автоматически и потокобезопасно при первом вызове "Encrypt()" или "Decrypt()".
Это реализовано с помощью стандартного механизма C++ "std::call_once".

Преимущества

Исключена возможность забыть инициализировать библиотеку, что предотвращает целый класс потенциальных ошибок.
Больше не нужно добавлять в код лишнюю строку для инициализации. API стал чище и интуитивно понятнее.
Инициализация гарантированно выполняется корректно и всего один раз, даже в многопоточных приложениях.
Библиотека теперь следует современным практикам проектирования, скрывая внутренние детали реализации от пользователя.

Что нужно сделать

Удалите все вызовы "SpongeV16::Initialize()" из вашего кода.
 
Улучшена логика кнопки "Расшифровать"

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

Улучшена навигация с помощью клавиши Tab между полями ввода пароля

Ранее при переключении на поле с уже введенным паролем курсор устанавливался в начало текста, что было неудобно для редактирования.
Теперь при переключении фокуса с помощью клавиш Tab и Shift+Tab курсор автоматически перемещается в самый конец текста в поле пароля.
Это позволяет сразу же продолжить ввод или начать удаление символов с помощью Backspace без лишних действий.

Внутренние улучшения

Из списка определений был удален макрос IDC_ROUNDS_ENTRY, который присваивал идентификатор элементу управления "Раунды".
Этот идентификатор был определен, но фактически не использовался ни в одном из обработчиков событий, что делало его "мертвым кодом".

В главный модуль программы (wWinMain) добавлена дополнительная проверка для корректного освобождения системных ресурсов в случае редкой ошибки.
В гипотетической ситуации, когда программа не могла создать таблицу горячих клавиш (акселераторов), она завершала работу, но не освобождала ранее загруженную библиотеку для текстового поля (Msftedit.dll).

Вместо одной глобальной переменной для хранения WNDPROC теперь используется SetPropW/GetPropW для каждого окна индивидуально.
Это устраняет потенциальную ошибку и повышает стабильность кода.

Скачать можно в облаке
 
Минимальная требуемая версия Windows была понижена с Windows 8 (_WIN32_WINNT 0x0602) до Windows Vista (_WIN32_WINNT 0x0600).
Анализ кода показал, что все используемые функции Windows API (включая криптографические функции bcrypt.dll и функции отчётов об ошибках wer.dll) доступны начиная с Windows Vista.

Поскольку тестирование на реальном оборудовании с Windows Vista не проводилось, данная совместимость является теоретической.

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Добавлена настройка параметра Rate (Рэйт)

Представьте криптографическую губку как большую миску для смешивания объемом 64 байта.
Rate — это размер порции данных, которую мы засыпаем в миску за один раз.

Оставшееся место, capacity (ёмкость), — это секретная, защитная часть, которая обеспечивает криптостойкость.
Существует прямая зависимость: чем меньше rate, тем выше безопасность, но ниже скорость обработки данных.

По умолчанию используется значение 32 — это золотой стандарт, обеспечивающий отличный уровень безопасности (~128 бит) и высокую скорость.
Для большинства задач этого более чем достаточно.
Однако для защиты особо важных данных вы можете уменьшить это значение, чтобы значительно повысить криптостойкость.

Рекомендуемые значения и их влияние:

32 байта.
Золотой стандарт (рекомендуется). Стандартная скорость (1x).
Уровень безопасности ~128 бит.
Отличный баланс скорости и надёжности.

16 байт.
Высокая безопасность. Примерно в 2 раза медленнее.
Уровень безопасности ~192 бита.
Для очень чувствительных данных.

8 байт.
Максимальная безопасность. Примерно в 4 раза медленнее.
Уровень безопасности ~224 бита.

4 байта.
Экстремальная безопасность. Примерно в 8 раз медленнее.
Уровень безопасности ~240 бит.

Новая версия программы может корректно расшифровывать файлы, созданные в любых предыдущих версиях "Бастиона".

Оптимизация и упрощение логики сжатия

Ранее код сначала проверял успешность сжатия, а затем отдельной проверкой — его эффективность (не стал ли сжатый файл больше исходного).
Теперь эти два условия объединены в одно.

Это небольшой рефакторинг, который делает код более лаконичным и читаемым (принцип Don't Repeat Yourself — DRY).
Устранение дублирования кода уменьшает вероятность ошибок при будущих изменениях и упрощает его понимание.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 

Вложения

  • Безымянный.webp
    Безымянный.webp
    95,7 КБ · Просмотры: 7
Масштабируемый QR-код

Теперь окно с QR кодом можно развернуть на весь экран с помощью стандартной кнопки "Развернуть".

Размер окна можно плавно менять как мышью, так и с помощью горячих клавиш (Alt + ↑ для увеличения, Alt + ↓ для уменьшения).

Это нововведение будет полезно, если камера вашего смартфона не может сфокусироваться или отсканировать QR-код.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Теперь QR коды сохраняются в разрешении 2115x2115 пикселей

Сохранить QR-код в виде BMP-файла можно, как и раньше, сделав двойной клик левой кнопкой мыши по его изображению.

Вы можете легко изменить целевое разрешение, отредактировав значение константы targetSize в функции SaveQrCodeAsBBmp:
const int targetSize = 2160;

Вы могли заметить, что итоговое разрешение (например, 2115x2115) немного меньше целевого значения 2160, указанного в коде.
Это не ошибка, а намеренное поведение для сохранения идеальной четкости QR-кода.

QR-код состоит из сетки маленьких квадратов (модулей).
Чтобы изображение было максимально четким и легко читалось сканерами, каждый такой модуль должен быть увеличен до идеального квадрата из пикселей (например, 15x15 пикселей, а не 15.3x15.3).
Программа берёт целевой размер 2160 и вычисляет самый большой возможный размер изображения, который позволяет сохранить эту идеальную квадратную структуру.
В результате получается разрешение, максимально близкое к целевому, но с гарантированно четкой геометрией.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab