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

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

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

Это позволило получить еще 10-12% производительности сверх уже достигнутого ускорения

На первый взгляд, 10-12% — это скромный результат, но получить его поверх уже достигнутого 2.5-кратного ускорения — это признак предельной оптимизации.
Это та самая "финальная полировка", которая выжимает из кода максимум возможного, не жертвуя ни совместимостью, ни надежностью.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Переход на аутентифицированное шифрование (AEAD)

AEAD (Authenticated Encryption with Associated Data) — это режим шифрования, который одновременно обеспечивает три столпа криптографической защиты:

1. Данные невозможно прочитать без ключа
2. Данные невозможно незаметно изменить
3. Данные были созданы именно владельцем ключа

Раньше эти задачи решались в два этапа:
сначала данные шифровались, а затем для шифротекста отдельно создавалась цифровая "пломба" (HMAC) для проверки целостности.

AEAD можно сравнить с современным сейф-контейнером.
Один поворот ключа одновременно и запирает его (шифрование), и активирует встроенную, несъемную пломбу (аутентификацию).

Ключевые преимущества

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

Как это реализовано в Бастионе V16

Ключ, получаемый из вашего пароля и соли с помощью KDF, теперь делится на две независимые части:

1. Ключ шифрования
Используется для обеспечения конфиденциальности данных.

2. Ключ аутентификации
Используется для создания тега аутентификации, гарантирующего целостность.

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

Все новые данные, которые вы шифруете, будут создаваться с использованием AEAD.
Сохранена обратная совместимость.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Полное устранение криптографических отпечатков

После перехода на современный режим шифрования AEAD (Authenticated Encryption) была обнаружена особенность:
присутствовали статические блоки данных (криптографические "отпечатки").

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

В этом обновлении данная особенность полностью устранена

NT+/ztRmUTPVvB1LmqJjiE2KaCh/9Pj+hegoo7o53+RnEtLiEuMKZJKanQ/7RjM9HtsfaUZqvbZ59mzR
pZcRBfnuyF9xsT9Gc+Y2/JFE+TpUSpu7LaMSfVEJfAi5F0nbxk/0cSkTRcWHgfqTo5gY8l4Dvpy/9MTf
eWapB3PFi8DijXH9Mh3uaXFmSR/z5PmphtPFAEAM4WkQuTipkqdWPxi+MwMunnRsBw+Kp2B/BuaAHjGo

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

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

Роль режима "Маска"

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

Режим "Маска" (двойное кодирование Base64) маскирует сам факт того, что перед вами зашифрованное сообщение, представляя его как обычный текстовый блок, который может быть чем угодно — например, частью токена, ключа API или технического лога.

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

Версия "без аллокаций", имеющая простую и понятную структуру циклов, показала значительный прирост производительности с флагом -march=native.

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

Тестирование кода ("без аллокаций") на 1 000 000 итераций:

Без -march=native: ~3643 мс
С -march=native: ~3005 мс


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

Этот вариант, будучи скомпилированным с флагом -march=native, является абсолютным чемпионом по производительности, оставаясь при этом 100% совместимым и надежным.

Рекомендуемые команды для сборки с помощью Clang

32-битная версия (x86):

clang++ -Wall -Wextra -O3 -march=native -std=c++20 -s -o "$(NAME_PART).exe" "$(FILE_NAME)" "qrcodegen.cpp" "miniz.c" -static -mwindows -municode -lcomctl32 -lgdi32 -luser32 -lbcrypt -lmapi32 -lshlwapi -lwer -lpsapi

64-битная версия (x64):

clang++ -m64 -Wall -Wextra -O3 -march=native -std=c++20 -s -o "$(NAME_PART)_x64.exe" "$(FILE_NAME)" "qrcodegen.cpp" "miniz.c" -static -mwindows -municode -lcomctl32 -lgdi32 -luser32 -lbcrypt -lmapi32 -lshlwapi -lwer -lpsapi

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Принято решение отказаться от флага компиляции -march=native

Для компенсации потенциального снижения производительности после отказа от -march=native, ядро криптографического алгоритма (_permute_state) было переписано с использованием техники "разворачивания циклов".
Это позволяет снизить накладные расходы и даёт компилятору больше возможностей для оптимизации, сохраняя высокую скорость работы.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Оптимизация криптографического ядра SpongeV16

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

Предыдущий оптимизированный вариант, условно названный "Финальная версия (совместимая, быстрая)", уже содержал значительные улучшения, такие как:

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

Новая версия, "Финальная (без SIMD)", развивает эту идею и применяет полное разворачивание последнего оставшегося короткого цикла (этап «diagonal mix») внутри основной функции пермутации.

Что это даёт

Вместо того, чтобы вычислять адреса элементов массива (v[(i + 1) % 4 + 4]) на каждой итерации, код теперь использует заранее известные, константные индексы (v[5], v[15] и т.д.).

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

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

Сравнительные результаты тестов производительности

Тестирование проводилось на выполнении 1,000,000 итераций основной криптографической функции.

Предыдущая версия "Финальная версия (совместимая, быстрая)": ~3355 мс
Новая версия "Финальная (без SIMD)": ~2595 мс


Новая реализация криптографического ядра работает в среднем на ~760 мс быстрее в рамках теста, что соответствует приросту производительности примерно на 22-23%.

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Степень сжатия текста перед шифрованием увеличена до максимального уровня (с Z_DEFAULT_COMPRESSION до Z_BEST_COMPRESSION).
Это позволяет поместить больше информации в QR-код при минимальном влиянии на скорость выполнения операции.

Снято ограничение на размер текста для шифрования.
Ранее, из-за стандартных настроек текстового поля Windows, максимальный объем вводимого текста был ограничен ~65 536 символами.

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

Использование "магического числа" 32 при разделении эффективного ключа на ключ шифрования и ключ аутентификации заменено на соответствующую именованную константу CRYPTO_KEY_PART_LEN.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
При нажатии кнопки "Расшифровать" с текстом, который уже был расшифрован (или не был зашифрован изначально), программа выводила непонятное для пользователя техническое сообщение:
"Ошибка Base64: некорректная длина входной строки..."

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

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Добавлена функция шифрования файлов

Изначально "Бастион" предназначен для шифрования текстовых (.txt) сообщений.
В этой версии была добавлена второстепенная функция — шифрование и расшифровка файлов прямо из интерфейса программы.

Как это работает

Механизм максимально упрощен и построен на интуитивном перетаскивании файлов (Drag-and-Drop).

1. Запустите "Бастион" и сгенерируйте или введите надежный пароль в соответствующие поля.

2. При необходимости укажите желаемые значения раундов KDF, губки и рэйта.

3. Перетащите необходимый файл (например, photo.jpg или document.docx) с рабочего стола в окно программы.

Файл будет зашифрован с расширением .v16 (например, photo.jpg.v16).

1. Для расшифровки запустите "Бастион" и введите пароль, который использовался при шифровании.

2. Перетащите зашифрованный файл (с расширением .v16) в окно программы.

Файл будет расшифрован с оригинальным названием (например, photo.jpg или document.docx).
Если файл с таким названием существует, вы сможете перезаписать его или сохранить с новым названием.

Важно

Не удаляйте из названия зашифрованного файла оригинальное расширение (например, .jpg из photo.jpg.v16).
Оно необходимо программе, чтобы при расшифровке восстановить файл в исходном формате.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Последнее редактирование:
Общая логика шифрования вынесена из функций OnEncryptClick (текст) и DoEncryptFile (файлы) в единую централизованную функцию CreateEncryptedPayloadV16.
Это устраняет дублирование кода, упрощает дальнейшую поддержку и повышает надежность криптографического ядра за счет внесения изменений только в одном месте.

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

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

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

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

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

1. Генерация криптографически стойкого "шума"

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

2. Усиление и смешивание с помощью губки "SpongeV16"

Это работа по принципу "защиты в глубину" и не доверия на 100% ни одному компоненту, даже системному.
Поэтому "Бастион" берет уже качественные случайные данные от системы и дополнительно перемешивает их с помощью собственного криптографического алгоритма SpongeV16, добавляя в этот "коктейль" энтропию, собранную самой программой (данные о системных процессах, таймерах и т.д.).

3. Полная перезапись

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

4. Финальное удаление

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

Простая аналогия

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

Уничтожение в "Бастионе" — это как пропустить тот же документ через промышленный шредер с перекрестной резкой, затем смешать полученное конфетти с конфетти от сотен других документов и, наконец, сжечь эту мешанину дотла.

Еще один частый вопрос, который логично вытекает из предыдущего:
почему шифрование в "Бастионе" занимает больше времени, чем в некоторых других программах?


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

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

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

Вот из каких медленных, но критически важных этапов состоит шифрование в "Бастионе":

1. Превращение пароля в несокрушимый ключ (KDF)

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

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

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

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

2. Сложная внутренняя работа Губки (Пермутации)

Сердце SpongeV16 — это сложная внутренняя функция перемешивания, называемая пермутацией.
Когда губка шифрует ваши данные, она не просто выполняет одно математическое действие.
Для каждого блока данных она выполняет десятки раундов (значение "Губки" в интерфейсе) внутренних преобразований.

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

Сложным образом тасует эту колоду (раунд 1).
Снова тасует уже перетасованную колоду (раунд 2).
И так десятки раз...

Почему это медленно?
Каждый раунд — это серия сложных математических операций.
Множество раундов гарантируют так называемый "эффект лавины":
малейшее изменение во входных данных (например, один бит в вашем файле или пароле) приводит к полному, хаотичному и непредсказуемому изменению всего результата шифрования.
Простые и быстрые алгоритмы не всегда могут обеспечить такую глубину преобразования.

3. Создание "цифровой пломбы" (AEAD)

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

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

Аналогия: Фастфуд против ресторанного блюда

Быстрое шифрование — это как повар в фастфуде.
У него есть стандартный рецепт, готовые ингредиенты, и он выдает результат за 30 секунд.
Это съедобно и быстро.

Шифрование в "Бастионе" — это как шеф-повар в ресторане высокой кухни.
Тщательно и долго готовит уникальный соус (растягивает ключ через KDF).
Использует сложную, многоэтапную технику приготовления основного блюда (многораундовые пермутации губки).

В конце украшает блюдо и ставит свою личную печать, гарантирующую качество (создает аутентификационную метку).

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

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Реализовано групповое уничтожение файлов

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

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Улучшена функция уничтожения файлов

Внедрен 3-проходный алгоритм для уничтожения содержимого файла.
проход нулями, проход единицами и финальный проход криптографически стойкими случайными данными, генерируемыми через BCryptGenRandom.

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

Добавлена логика, которая использует FindFirstStreamW/FindNextStreamW для перечисления всех потоков, связанных с файлом в NTFS.
Каждый найденный поток проходит ту же процедуру 3-проходной перезаписи, что и основной файл.
Это закрывает возможность восстановления данных из скрытых потоков.

Напоминание

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Шифрование файлов с зажатой клавишей Alt

1. Запустите "Бастион", сгенерируйте или введите надежный пароль в соответствующие поля.
2. При необходимости укажите желаемые значения раундов KDF, губки и рэйта.

3. Зажмите клавишу Alt и не отпуская, перетащите необходимый файл (например, photo.jpg) в окно программы.

Вместо автоматического создания файла с расширением .v16, откроется стандартное диалоговое окно "Сохранить как...".
Задайте файлу любое название и расширение (например, config.dat, render.dll или оставить photo.jpg), чтобы он не привлекал внимания.

Сценарии сохранения

Если не меняете название (сохраняете файл поверх самого себя), программа перезапишет исходный файл его зашифрованной копией.

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

Как расшифровать

1. Для расшифровки запустите "Бастион" и введите пароль, который использовался при шифровании.

2. Перетащите зашифрованный файл (например, photo.jpg или config.dat) в окно программы.

Программа автоматически определит, что файл зашифрован, и откроет стандартное диалоговое окно "Сохранить как...".

Если хотите заменить зашифрованный файл (photo.jpg) его расшифрованной версией, оставьте предложенное название и нажмите "Сохранить".

Можно сохранить расшифрованный файл под любым другим названием или в другую папку.

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Работа с файлами через Drag-and-Drop

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

Перетащите файл на значок "Бастиона" или в открытое окно программы.
Программа автоматически проанализирует файл и предложит нужное действие.

Упрощена логика расшифровки

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

Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg
 
Исправлена логика шифрования файлов при перетаскивании с зажатой клавишей Alt

Если поля для пароля в главном окне были пусты, при перетаскивании файла с зажатым Alt появлялось окно для ввода пароля.
После его закрытия программа "забывала", что Alt был нажат, и сохраняла файл с именем по умолчанию (имя_файла.v16), вместо того чтобы открыть диалог "Сохранить как...".

Теперь состояние зажатой клавиши Alt корректно сохраняется и используется после ввода пароля в модальном диалоговом окне.
Это гарантирует, что режим "Сохранить как..." будет активирован в любом случае.

Важное уточнение

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

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

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