Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Concryptor — Многопоточный движок шифрования файлов со скоростью гигабайт в секунду. Достигает экстремальной пропускной способности за счет конвейера io_uring без блокировок с тройной буферизацией, параллельной фрагментации Rayon и аппаратно-ускоренных AEAD (AES-256-GCM / ChaCha20). | Kitploit
Инструменты/GitHubGitHub/frogsnot/concryptor
Утилиты общего назначенияИнструменты шифрования/дешифрованияВосстановление ДанныхКриптографияУтилиты и фреймворки
GitHubfrogsnot/concryptor

Concryptor

Многопоточный движок шифрования файлов со скоростью гигабайт в секунду. Достигает экстремальной пропускной способности за счет конвейера io_uring без блокировок с тройной буферизацией, параллельной фрагментации Rayon и аппаратно-ускоренных AEAD (AES-256-GCM / ChaCha20).

Репозиторий
74361 месяц назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Concryptor

Crates.io License: AGPL v3

Многопоточный движок AEAD-шифрования, написанный на Rust. Шифрует и расшифровывает файлы с пропускной способностью гигабайты в секунду, используя трёхбуферный конвейер на io_uring, параллельную обработку чанков через Rayon и оптимизированные на ассемблере шифры через ring.

⚠️ ПРЕДУПРЕЖДЕНИЕ: ЭКСПЕРИМЕНТАЛЬНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ⚠️

Этот проект чрезвычайно новый и в настоящее время НЕ рекомендуется для производственного или критически важного использования. Хотя криптографические примитивы (AES-256-GCM, ChaCha20-Poly1305 через ring) и дизайн формата являются обоснованными, кодовая база не прошла формальных аудитов безопасности или обширного реального тестирования. Используйте на свой страх и риск. Для защиты конфиденциальных данных рассмотрите использование проверенных инструментов, таких как GnuPG, age или OpenSSL, пока этот проект не станет зрелым.

Возможности

  • Поддержка двух шифров: AES-256-GCM (аппаратный AES-NI) и ChaCha20-Poly1305 через ring (оптимизированный на ассемблере)
  • Параллельное шифрование: Многопоточная обработка чанков на основе Rayon, использующая все ядра ЦП
  • Трёхбуферный конвейер io_uring: Перекрывает операции ввода-вывода ядра и криптографию на ЦП с использованием трёх чередующихся пулов буферов — пока выполняются записи одного набора в ядре, следующий набор шифруется Rayon на ЦП, а операции чтения третьего набора отправляются в ядро. Отсутствие накладных расходов на системный вызов на чанк, отсутствие ограничений mmap (нет SIGBUS, нет истощения адресного пространства)
  • Вывод ключа через Argon2id: Промышленное растяжение пароля (по умолчанию 256 МиБ памяти, 3 итерации, настраивается через --memory)
  • Самодокументируемые параметры KDF: Стоимость памяти, итерации и параллелизм хранятся в заголовке зашифрованного файла, так что расшифровка использует именно те параметры, которые были выбраны при шифровании. Устаревшие файлы (все нулевые sentinel) обрабатываются прозрачно со старыми значениями по умолчанию 64 МиБ
  • Индексированные чанком одноразовые номера: Вывод одноразовых номеров через XOR в стиле TLS 1.3 предотвращает атаки переупорядочивания чанков
  • Аутентифицированный AAD заголовка: Весь выровненный на 4 КиБ заголовок включается в AAD каждого чанка, аутентифицируя все поля заголовка (основные, параметры KDF и зарезервированные байты) и предотвращая атаки усечения, манипуляции полями заголовка и скрытой записи в зарезервированные байты
  • Финальный чанк в стиле STREAM: Флаг финального чанка в AAD предотвращает атаки усечения и добавления (вдохновлено конструкцией STREAM)
  • Свежая случайность для каждого файла: Криптографически случайная 16-байтовая соль и 12-байтовый базовый одноразовый номер генерируются для каждого шифрования и сохраняются в заголовке
  • Шифрование на месте: seal_in_place_separate_tag / open_in_place через ring минимизирует выделение памяти в горячем цикле
  • Обнуление пароля: Ключи и пароли безопасно стираются из памяти после использования
  • O_DIRECT + секторно-выровненный формат: Заголовок и слоты чанков выровнены на 4 КиБ, что позволяет использовать O_DIRECT ввод-вывод, минуя кэш страниц ядра для чтения/записи на скорости DMA на NVMe. Пулы буферов используют std::alloc с выравниванием в 4096 байт
  • Шифрование каталогов: Шифрование целых каталогов в виде единого зашифрованного архива. Упаковка на основе tar сохраняет имена файлов, права доступа, временные метки и структуру каталогов внутри шифротекста. Извлечение проверяет на обход пути и атаки через символические ссылки
  • Самодокументируемый формат файла: Заголовок хранит шифр, размер чанка, исходный размер файла, соль, базовый одноразовый номер и параметры KDF для Argon2id
  • Производительность

    Результаты бенчмарков с cargo bench (Criterion, 10 выборок на измерение). Вывод ключа исключён — числа отражают только чистую криптографическую пропускную способность.

    Оборудование:

    • ЦП: AMD Ryzen 5 5600X (6c/12t @ 3.7 ГГц базовая)
    • ОЗУ: 2x 8 ГиБ DDR4-2666 (двухканальный, 16 ГиБ всего)
    • ОС: Linux

    Примечание о вводе-выводе: 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 ГиБ/с. Разрыв объясняют три фактора:

    1. Накладные расходы на SQE io_uring: Каждый чанк требует один SQE на чтение и один SQE на запись. Для 256 чанков в файле размером 256 МиБ это 512 отправленных SQE и 512 обработанных CQE. Хотя io_uring избегает затрат на переключение контекста на системный вызов, характерных для pread/pwrite, он всё же имеет накладные расходы на кольцевой буфер и барьеры памяти для каждого SQE.
    2. Глубина конвейера: При PIPELINE_DEPTH=3 в любой момент времени через конвейер проходят только три набора. Для настоящего установившегося перекрытия требуется как минимум три набора; файлы, умещающиеся в один или два набора, не получают выгоды от конвейеризации.
    3. Влияние иерархии кэша: 5600X имеет 512 КиБ L2 на ядро и 32 МиБ общего L3. Чанк по умолчанию 4 МиБ превышает L2, а набор из ~21 чанка (активный рабочий набор 84 МиБ) значительно превышает L3. Чанки меньшего размера (64–256 КиБ) показывают лучшую пропускную способность в развёртке, потому что большая часть рабочего набора остаётся в кэше.

    Жизненный цикл буфера и безопасность: Пулы буферов выделяются один раз через std::alloc::alloc_zeroed с Layout::from_size_align(size, 4096) до создания кольца io_uring и повторно используются во всех итерациях конвейера без перевыделения. Каждый зашифрованный чанк дополняется нулями для выравнивания на сектор перед записью O_DIRECT. Кольцо явно удаляется перед пулами буферов, что гарантирует, что ядро никогда не ссылается на освобождённую память (никаких UAF).

    Установка

    root@kitploit:~
    git clone https://github.com/frogsnot/concryptor.git
    cd concryptor
    cargo build --release
    

    Бинарный файл будет находиться по пути target/release/concryptor.

    Использование

    Шифрование

    root@kitploit:~
    # AES-256-GCM (по умолчанию), вывод в myfile.dat.enc
    concryptor encrypt myfile.dat
    
    # ChaCha20-Poly1305, собственный путь вывода
    concryptor encrypt myfile.dat --cipher chacha -o encrypted.enc
    
    # Собственный размер чанка (в МиБ)
    concryptor encrypt largefile.iso --chunk-size 8
    
    # Более сильный KDF (стоимость памяти 512 МиБ)
    concryptor encrypt secrets.tar --memory 512
    
    # Неинтерактивный режим (пропускает запрос пароля)
    concryptor encrypt myfile.dat -p "password"
    

    Замечание по безопасности: --password / -p передаёт пароль как аргумент командной строки, который виден в выводе ps и истории оболочки. Для интерактивного использования опустите его, чтобы получить защищённый скрытый запрос. Для скриптов предпочтительно очищать историю после использования или использовать обёртку, читающую из файлового дескриптора.

    Шифрование каталога

    root@kitploit:~
    # Шифрование каталога (автоопределение, создаёт mydir.tar.enc)
    concryptor encrypt mydir/
    
    # С собственным шифром и выводом
    concryptor encrypt mydir/ --cipher chacha -o secrets.enc
    

    Шифрование каталога создаёт временный tar-архив (.concryptor-*.tar, права 0600, имя от CSPRNG), шифрует его, затем автоматически удаляет временный файл. Имена файлов, структура каталогов, права доступа и временные метки находятся внутри зашифрованного полезного груза.

    Расшифровка

    root@kitploit:~
    # Автоматическое удаление расширения .enc
    concryptor decrypt myfile.dat.enc
    
    # Собственный путь вывода
    concryptor decrypt encrypted.enc -o restored.dat
    
    # Неинтерактивный режим
    concryptor decrypt myfile.dat.enc -p "password"
    

    Расшифровка и извлечение каталога

    root@kitploit:~
    # Расшифровка и извлечение за один шаг (автоудаление .tar.enc -> имя каталога)
    concryptor decrypt mydir.tar.enc --extract
    
    # Короткий флаг, собственный выходной каталог
    concryptor decrypt mydir.tar.enc -x -o restored_dir/
    

    Без --extract расшифровка архива каталога создаёт промежуточный .tar-файл, который можно изучить или извлечь вручную.

    Справка

    root@kitploit:~
    concryptor --help
    concryptor encrypt --help
    concryptor decrypt --help
    

    Формат файла

    Все значения в little-endian. Заголовок занимает полный сектор 4 КиБ; каждый слот зашифрованного чанка дополняется до следующей границы 4 КиБ. Это гарантирует, что каждое смещение и размер ввода-вывода выровнены по секторам для O_DIRECT.

    root@kitploit:~
    Смещение  Размер  Поле
    -------  ------  ---------------------
    0        10      Магические байты "CONCRYPTOR"
    10        1      Версия формата (4)
    11        1      Тип шифра (0 = AES-256-GCM, 1 = ChaCha20-Poly1305)
    12        4      Размер чанка (байты, LE)
    16        8      Исходный размер файла (байты, LE)
    24       16      Соль Argon2 (криптографически случайная, уникальная для каждого файла)
    40       12      Базовый одноразовый номер (криптографически случайный, уникальный для каждого файла)
    52        4      Argon2 m_cost в КиБ (LE, 0 = устаревшие 64 МиБ)
    56        4      Argon2 t_cost / итерации (LE, 0 = устаревшие 3)
    60        4      Argon2 p_cost / параллелизм (LE, 0 = устаревший 4)
    64     4032      Зарезервировано (заполнено нулями до 4096 байт)
    4096     ...     [Чанк 0: шифротекст + 16-байтовый тег + нулевое выравнивание до границы сектора]
                     [Чанк 1: шифротекст + 16-байтовый тег + нулевое выравнивание до границы сектора]
                     ...
    

    Для чанков по 4 МиБ: каждый дисковой слот занимает ceil((4194304 + 16) / 4096) * 4096 = 4198400 байт (4080 байт заполнения на чанк). 4032 зарезервированных байта в заголовке доступны для будущих функций (слоты асимметричных ключей, метаданные и т.д.).

    Соль и базовый одноразовый номер генерируются заново из rand::rng() (использующего CSPRNG ОС) при каждом шифровании. Повторное использование пароля для разных файлов безопасно, потому что разные соли дают разные ключи Argon2id, а разные базовые одноразовые номера дают разные одноразовые номера для чанков.

    Проектирование безопасности

    • Вывод одноразового номера: chunk_nonce = base_nonce XOR chunk_index (стиль TLS 1.3). Перестановка чанков вызывает ошибку расшифровки, потому что одноразовый номер на позиции N не совпадает с одноразовым номером, использованным для шифрования чанка, изначально находившегося на позиции M. Примечание: основанный на XOR вывод одноразовых номеров имеет теоретическую уязвимость, когда один и тот же ключ используется в нескольких потоках (разные базовые одноразовые номера могут давать пересекающиеся пространства одноразовых номеров). Это не относится к Concryptor, потому что каждое шифрование генерирует новую 128-битную случайную соль, создавая уникальный ключ Argon2id для каждого файла. Уникальность одноразовых номеров важна только при одном и том же ключе, а вероятность повторного использования ключа составляет ~2^-128 для каждой пары файлов.
    • Аутентифицированный AAD заголовка: Каждый вызов AEAD для чанка использует AAD = full_aligned_header (4096) || chunk_index (8 LE) || is_final (1) (всего 4105 байт). Весь 4-КиБ сектор заголовка (основные поля, параметры KDF и зарезервированное заполнение) привязывается к тегу аутентификации каждого чанка. Изменение любого байта заголовка (тип шифра, размер чанка, исходный размер, соль, одноразовый номер, параметры KDF или зарезервированное заполнение) делает все чанки недействительными. Это предотвращает атаки усечения, когда злоумышленник изменяет original_size и удаляет последние чанки, а также предотвращает скрытую запись данных в область зарезервированного заполнения. Устаревшие файлы v3 расшифровываются с AAD длиной 52 байта для обратной совместимости; понижение версии с v4 до v3 невозможно, потому что сам байт версии находится внутри аутентифицированного AAD.
    • Индикатор финального чанка в стиле STREAM: Последний байт AAD равен 0x01 для финального чанка и 0x00 для всех остальных. Это предотвращает две атаки:
      • Усечение: Удаление финального чанка и продвижение нефинального чанка на конец не удаётся, потому что нефинальный чанк был зашифрован с is_final = 0x00, а расшифровка ожидает 0x01.
      • Расширение: Добавление поддельных чанков не удаётся, потому что злоумышленник не может создать корректный тег для is_final = 0x01 без ключа.
    • Свежая случайность для каждого файла: 16-байтовая соль и 12-байтовый базовый одноразовый номер берутся из CSPRNG ОС (rand::rng()) для каждого шифрования. Два шифрования одного и того же файла с одним и тем же паролем дают полностью разные шифротексты. Повторное использование одноразового номера (катастрофическое для AES-GCM) исключено конструкцией.
    • Вывод ключа: Argon2id с настраиваемой стоимостью памяти (по умолчанию 256 МиБ, настраивается через --memory), 3 временные итерации, параллелизм 4. Значение по умолчанию 256 МиБ в 4 раза превышает минимальный стандарт OWASP и является дорогим для атакующих с GPU/FPGA/ASIC. Параметры KDF хранятся в заголовке файла (байты 52–63), что делает файлы самодокументируемыми — расшифровка всегда использует корректные параметры независимо от текущих значений по умолчанию. Если байты 52–63 все нулевые (устаревшие файлы до параметров KDF), применяются старые значения по умолчанию 64 МиБ / 3 / 4.
    • Обнуление: Ключи шифрования обнуляются сразу после создания шифра. Пароли обнуляются после использования.

    Тестирование

    root@kitploit:~
    # Запуск полного набора тестов (67 тестов)
    cargo test
    
    # Запуск бенчмарков (HTML-отчёты в target/criterion/)
    cargo bench
    
    # Фильтрация бенчмарков
    cargo bench -- "encrypt/AES"
    cargo bench -- "chunk_sweep"
    

    Набор тестов покрывает:

    • Проверка сериализации/десериализации заголовка
    • Детерминированность и чувствительность вывода ключа
    • Уникальность одноразовых номеров и свойства идентичности
    • Шифрование/расшифровка для обоих шифров на файлах разных размеров (пустой, 1 байт, граничные случаи, несколько чанков)
    • Отклонение неверного пароля
    • Обнаружение подделки (перевёрнутый шифротекст, повреждённые теги, повреждённая соль, усечённые файлы)
    • Обнаружение атаки переупорядочивания чанков
    • Обнаружение несоответствия типа шифра
    • Обнаружение атаки усечения (изменённый original_size + удалённые чанки)
    • Обнаружение манипуляции полями заголовка (изменённый chunk_size)
    • Обнаружение подделки зарезервированных байтов заголовка (изменённая область заполнения)
    • Проверка недетерминированного шифрования
    • Стресс-тест с 256 маленькими чанками
    • Циклы упаковки/распаковки архива каталога (оба шифра)
    • Циклы для пустого каталога, глубоко вложенного каталога, множества файлов и бинарного содержимого
    • Сохранение символических ссылок для корректных внутренних ссылок
    • Отклонение символических ссылок, выходящих за корень извлечения (абсолютные и относительные обходы)
    • Автоматическая очистка временного файла при Drop
    • Отклонение неверного пароля для зашифрованных архивов

    Зависимости

    ПакетНазначение
    ringОптимизированные на ассемблере AES-256-GCM и ChaCha20-Poly1305 AEAD
    io-uringИнтерфейс Linux io_uring для асинхронного чтения/записи
    libcФлаг O_DIRECT и выровненные pread/pwrite для ввода-вывода заголовка
    argon2Вывод ключа Argon2id
    rayonРаспараллеливание обработки чанков
    clapРазбор аргументов командной строки
    indicatifИндикатор прогресса в терминале
    randГенерация криптографических случайных чисел
    zeroizeБезопасное стирание памяти
    anyhowОбработка ошибок
    rpasswordСкрытый ввод пароля
    tarАрхивирование и извлечение каталогов

    Установка

    root@kitploit:~
    # Из crates.io (рекомендуется)
    cargo install concryptor
    
    # Из исходников
    git clone https://github.com/FrogSnot/Concryptor
    cd Concryptor
    cargo build --release
    # Бинарный файл находится в target/release/concryptor
    

    Лицензия

    Этот проект лицензирован под GNU Affero General Public License v3.0.

    Скачать инструмент