
Многопоточный движок шифрования файлов со скоростью гигабайт в секунду. Достигает экстремальной пропускной способности за счет конвейера io_uring без блокировок с тройной буферизацией, параллельной фрагментации Rayon и аппаратно-ускоренных AEAD (AES-256-GCM / ChaCha20).
Многопоточный движок AEAD-шифрования, написанный на Rust. Шифрует и расшифровывает файлы с пропускной способностью гигабайты в секунду, используя трёхбуферный конвейер на io_uring, параллельную обработку чанков через Rayon и оптимизированные на ассемблере шифры через ring.
⚠️ ПРЕДУПРЕЖДЕНИЕ: ЭКСПЕРИМЕНТАЛЬНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ⚠️
Этот проект чрезвычайно новый и в настоящее время НЕ рекомендуется для производственного или критически важного использования. Хотя криптографические примитивы (AES-256-GCM, ChaCha20-Poly1305 через ring) и дизайн формата являются обоснованными, кодовая база не прошла формальных аудитов безопасности или обширного реального тестирования. Используйте на свой страх и риск. Для защиты конфиденциальных данных рассмотрите использование проверенных инструментов, таких как GnuPG, age или OpenSSL, пока этот проект не станет зрелым.
ring (оптимизированный на ассемблере)--memory)seal_in_place_separate_tag / open_in_place через ring минимизирует выделение памяти в горячем циклеO_DIRECT ввод-вывод, минуя кэш страниц ядра для чтения/записи на скорости DMA на NVMe. Пулы буферов используют std::alloc с выравниванием в 4096 байтРезультаты бенчмарков с cargo bench (Criterion, 10 выборок на измерение). Вывод ключа исключён — числа отражают только чистую криптографическую пропускную способность.
Оборудование:
Примечание о вводе-выводе: Criterion записывает временные файлы в /tmp, который в этой системе является tmpfs (на базе ОЗУ). При использовании O_DIRECT ядро не может выполнять настоящий асинхронный DMA на tmpfs, поэтому эти числа отражают пропускную способность шифрования + накладные расходы io_uring без преимущества DMA bypass. На реальном Gen4 NVMe-диске O_DIRECT устраняет двойную буферизацию кэша страниц и включает прямой DMA в выровненные пулы буферов, что должно дать значительно более высокую пропускную способность.
| Размер файла | Шифрование AES-256-GCM | Шифрование ChaCha20 | Расшифровка AES-256-GCM | Расшифровка ChaCha20 |
|---|---|---|---|---|
| 64 КиБ | 244 МиБ/с | 233 МиБ/с | 233 МиБ/с | 234 МиБ/с |
| 1 МиБ | 1.08 ГиБ/с | 882 МиБ/с | 1010 МиБ/с | 876 МиБ/с |
| 16 МиБ | 1.10 ГиБ/с | 923 МиБ/с | 1.06 ГиБ/с | 988 МиБ/с |
| 64 МиБ | 984 МиБ/с | 935 МиБ/с | 988 МиБ/с | 973 МиБ/с |
| 256 МиБ | 1.00 ГиБ/с | 1015 МиБ/с | 1.01 ГиБ/с | 1.02 ГиБ/с |
Развёртка размера чанка (AES-256-GCM, файл 64 МиБ):
| Размер чанка | Пропускная способность |
|---|---|
| 64 КиБ | 1.01 ГиБ/с |
| 256 КиБ | 1.05 ГиБ/с |
| 1 МиБ | 1.07 ГиБ/с |
| 4 МиБ | 988 МиБ/с |
| 8 МиБ | 988 МиБ/с |
| 16 МиБ | 1.00 ГиБ/с |
Движок использует ring (оптимизированные на ассемблере AES-NI / NEON / ARMv8-CE) для криптографических операций и трёхбуферный конвейер io_uring для ввода-вывода. Три предварительно выделенных пула буферов циклически проходят через конвейер: пока завершаются записи пула A в ядре, пул B шифруется Rayon на ЦП, а операции чтения пула C отправляются в ядро. Это перекрывает задержку ввода-вывода с криптографическими вычислениями.
Почему AES-256-GCM быстрее ChaCha20-Poly1305 на маленьких файлах:
Бэкенд AES-GCM в ring использует аппаратные инструкции AES-NI + CLMUL, доступные на x86-64, что даёт аппаратное преимущество перед ChaCha20 (который является программным шифром). При больших размерах оба шифра сходятся к ~1.0 ГиБ/с, что указывает на то, что узкое место смещается с пропускной способности шифрования на накладные расходы отправки ввода-вывода.
Почему пиковая пропускная способность приходится на 1–16 МиБ, а не на 256 МиБ: Маленькие файлы (1–16 МиБ) имеют мало чанков, поэтому параллелизм Rayon эффективен, и рабочий набор помещается в кэш. При 64–256 МиБ конвейер io_uring полностью активен (в работе находятся три набора), но накладные расходы на отправку SQE и завершение CQE растут с количеством чанков. Конструкция с тройным буфером обеспечивает перекрытие ввода-вывода и криптографии, частично скрывая эту стоимость.
Почему ~1.0 ГиБ/с, а не 10+ ГиБ/с: Современный AES-NI может выдавать 2–4 ГиБ/с на ядро. С 12 потоками сырая пропускная способность шифрования могла бы превысить 10 ГиБ/с. Разрыв объясняют три фактора: