Бастион 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
 
Мы в соцсетях:

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