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

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