Бастион 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
 
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 КБ · Просмотры: 21
Масштабируемый 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
 
Двухуровневая маскировка

Ранее зашифрованные сообщения имели постоянное и узнаваемое начало (например, AABOIBgg...).
Эта особенность создавала уникальную "цифровую сигнатуру", которая позволяла системам анализа трафика (DPI) мгновенно и с высокой точностью определить, что текст зашифрован именно программой "Бастион".

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

Уровень 1: Рандомизация заголовка (включено всегда)

Служебные параметры (раунды, губка, рейт) были убраны из начала сообщения.
Теперь каждое сообщение начинается с криптографически случайных байт (соль и nonce).

Устранен самый очевидный "отпечаток", префикс AABOIBgg... исчез навсегда.

Однако, хотя "цвет конверта" теперь всегда разный, у него все еще оставалась узнаваемая структура:
[длинный блок Base64].[короткий блок HEX-символов].

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

Уровень 2: Полная структурная маскировка (опция "Маска")

Это продвинутый уровень, который активируется чекбоксом "Маска" и обеспечивает максимальную скрытность.
Когда опция "Маска" включена, программа берет весь итоговый шифротекст (включая точку-разделитель и HMAC-подпись) и применяет к нему вторичное кодирование в Base64.

Структура сообщения полностью скрывается

Без маски: +e2pA...iaOdYAAE4gGCAdQg==.2c5124...7537
С маской: K2UycEEuLi5pYU9kWUFB...jVTM0Y3NTM3==

На выходе получается единый, монолитный блок Base64-символов без каких-либо разделителей, ассоциирующихся с программой "Бастион".

Такой текст становится неотличим от огромного количества других легитимных данных в интернете:
API-ключей, токенов авторизации, встроенных медиа-данных и т.д.

Ключевые преимущества двухуровневой системы

1. Базовая рандомизация усложняет простую блокировку, а режим "Маска" делает ее практически невозможной.
2. Сообщение не просто шифруется, но и скрывает сам факт использования конкретной программы шифрования.
3. Пользователь сам выбирает необходимый уровень скрытности.

Безопасность vs. Скрытность

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

Полная обратная совместимость

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

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

Логика для команд "Вырезать", "Копировать", "Вставить", "Удалить" и "Выделить всё" была вынесена в единую вспомогательную функцию, что улучшило чистоту и читаемость кода.

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

Вложения

  • Снимок.webp
    Снимок.webp
    18,3 КБ · Просмотры: 10
Внедрена более строгая и эффективная проверка целостности зашифрованных сообщений.
 
Внесены изменения в расположение элементов интерфейса, а также обновлен дизайн чекбоксов.

Устранена проблема, из-за которой при вставке отформатированного текста (например, из LibreOffice) в темной теме он оставался темным и был нечитаем.
Теперь цвет вставленного текста автоматически приводится в соответствие с выбранной темой оформления.

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

Вложения

  • Безымянный.webp
    Безымянный.webp
    98,1 КБ · Просмотры: 6
Мы в соцсетях:

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