Большинству продуктов нужно сразу несколько вещей: спрятать данные, искать по ним не раскрывая, убедиться, что их не подменили, безопасно хранить пароли. Обычно это пять разных инструментов, которые легко собрать с ошибкой. N2Q делает всё это одним движком — и по умолчанию прощает самую частую ошибку, из-за которой ломаются другие системы.
Most products need several things at once: hide data, search it without revealing it, make sure it wasn't tampered with, store passwords safely. That is usually five different tools that are easy to wire up wrong. N2Q does all of it in one engine — and by default forgives the most common mistake that breaks other systems.
Одно шифрует, другое считает контрольную сумму, третье хранит пароли, четвёртое ищет по зашифрованному. Пять разных библиотек — пять способов ошибиться. И большинство из них ломается наглухо, если программист случайно повторит один технический параметр.
One thing encrypts, another checksums, a third stores passwords, a fourth searches ciphertext. Five separate libraries — five ways to slip up. And most break completely if a developer accidentally repeats one technical parameter.
N2Q делает всё перечисленное сам. Главный режим устроен так, что та самая частая ошибка не приводит к катастрофе. А каждый зашифрованный кусок сам описывает, как его открыть, — поэтому «быстрый» и «надёжный» режимы полностью совместимы.
N2Q does all of the above itself. The default mode is built so that this common mistake is not a catastrophe. And every encrypted chunk describes how to open it — so the "fast" and "secure" modes are fully compatible.
Самая частая причина утечек — программист случайно повторяет один технический параметр. У большинства шифров это мгновенный провал. У N2Q основной режим устроен так, что последствия почти незаметны.
The most common cause of leaks is a developer accidentally repeating one technical parameter. In most ciphers that is an instant break. In N2Q the default mode is built so the impact is almost nil.
Нужную запись — например, по e-mail — можно найти прямо в зашифрованной базе, ничего не расшифровывая. Данные остаются закрытыми даже во время поиска.
You can find a record — say, by e-mail — right inside an encrypted database without decrypting anything. Data stays sealed even during search.
Шифрование, проверка подлинности, пароли и поиск — из одного механизма. Меньше сторонних библиотек — меньше мест, где что-то может сломаться.
Encryption, authenticity checks, passwords and search — from one mechanism. Fewer third-party libraries means fewer places to break.
Один переключатель: «быстро» — для больших файлов и видео, «максимальный запас прочности» — для самых чувствительных данных. Файлы обоих режимов остаются взаимно читаемыми.
One switch: "fast" for large files and video, "maximum margin" for the most sensitive data. Files from both modes stay mutually readable.
Готовые версии для шести языков программирования и для браузера. Все они дают побайтово одинаковый результат — файл из одного открывается в любом другом.
Ready versions for six programming languages and the browser. All produce byte-identical results — a file from one opens in any other.
Спецификация, весь код и тесты открыты. Стойкость держится на секретном ключе, а не на том, что алгоритм спрятан от чужих глаз.
The spec, all code and tests are open. Security rests on the secret key, not on hiding the algorithm from view.
Четыре преимущества над AES-GCM / ChaCha — и каждое подтверждено кодом, а не слайдом.Four edges over AES-GCM / ChaCha — each demonstrated by code, not a slide.
Ключ перематывается на каждый пакет и стирается. Захватили сервер или устройство — прежние звонки и сообщения расшифровать уже нельзя. Механика Signal, встроенная в наш поток.
The key ratchets forward every packet and the old one is erased. Seize a server or a device — earlier calls and messages can no longer be decrypted. Signal-style forward secrecy, built into our stream.
Иммунитет к partitioning-oracle атакам, которые ломают AES-GCM и ChaCha (подбор паролей/ключей, скандал franking у Facebook). Один шифротекст открывается ровно одним ключом.
Immune to the partitioning-oracle attacks that break AES-GCM and ChaCha (password/key guessing, the Facebook franking break). One ciphertext opens under exactly one key.
Данные шифруются один раз под data-key, а он обёрнут под мастер-ключ. Меняешь мастер-ключ за миллисекунды — хоть на терабайтах. Паттерн AWS KMS, встроенный.
Data is encrypted once under a data key that is wrapped under a master key. Rotate the master key in milliseconds — even across terabytes. The AWS-KMS pattern, built in.
N2Q-256 держит 128 бит стойкости против квантового компьютера (Grover), а структуры для алгоритма Шора у перестановки нет. Тот же класс, что AES-256.
N2Q-256 keeps a 128-bit margin against a quantum computer (Grover), and the permutation has no structure for Shor to exploit. The same class as AES-256.
Один движок — много задач. Вот что это даёт на практике:One engine, many jobs. Here’s what that means in practice:
Переписку не прочитать, даже украв телефон. Можно пожаловаться на угрозу, не раскрывая чужие сообщения. Не видно, кто кому и сколько пишет.
Chats stay unreadable even if the phone is stolen. You can report abuse without exposing anyone else’s messages. Nobody sees who writes whom, or how much.
Одинаковые файлы хранятся один раз — экономия места даже в зашифрованном виде. Смена главного ключа — мгновенно, без перешифровки терабайтов.
Identical files are stored once — saving space even when encrypted. Rotating the master key is instant, with no re-encryption of terabytes.
Перемотка зашифрованного видео — мгновенная. Звонки и трансляции защищены по пакетам: потеря одного не рвёт поток.
Scrubbing encrypted video is instant. Calls and live streams are protected packet by packet: one lost packet doesn’t break the stream.
Находите нужную запись (например, по e-mail) прямо в зашифрованной базе. Шифр нельзя обмануть перебором ключей.
Find a record (say, by e-mail) right inside an encrypted database. The ciphertext can’t be tricked by key-guessing.
Журнал, где любую правку задним числом сразу видно. И независимая проверка, что всё считает верно.
A log where any after-the-fact change is immediately visible. Plus independent proof it all computes correctly.
Скрыта даже длина сообщения. Прощает частые ошибки разработчиков. И устоит против будущих квантовых компьютеров.
Even the message length is hidden. It forgives common developer mistakes. And it holds up against future quantum computers.
Продукт готов к оценке и пилотным интеграциям: шесть реализаций, воспроизводимые константы, измеренный криптоанализ.
Ready for evaluation and integration pilots: six implementations, reproducible constants, measured cryptanalysis.
Мы не прячем алгоритм: и спецификация, и весь код открыты для проверки кем угодно. Следующий шаг — пригласить специалистов попробовать его взломать.
We don't hide the algorithm: the spec and all code are open for anyone to check. The next step is inviting experts to try to break it.
Всё считается локально в вашем браузере — ключи и текст никуда не уходят. Движок: ⏳…
Everything runs locally in your browser — keys and text never leave the page. Engine: ⏳…
nqc.-токен; для Stego включите «Это Stego» (суита и профиль берутся из настроек выше).One window for every mode: decryption auto-detects an nqc. token; for Stego tick “It’s Stego” (suite and profile come from the settings above).Полный цикл + сверка с эталонным вектором, прямо в браузере.Full round-trip + a reference-vector check, in the browser.
Каждое свойство проверяется прямо здесь, в браузере, на том же движке.Check each property right here in the browser, on the same engine.
Отправим 5 пакетов, затем «захватим» состояние получателя. Прошлый пакет открыть уже нельзя — ключ стёрт.Send 5 packets, then "seize" the receiver state. An earlier packet can no longer be opened — the key is erased.
Шифротекст привязан к ключу: чужой ключ не совпадёт с commitment. Это блокирует partitioning-oracle.The ciphertext is bound to its key: another key won't match the commitment. This blocks partitioning oracles.
Объект зашифрован под data-key, а он обёрнут под KEK. Ротация KEK1 → KEK2 не трогает данные.The object is encrypted under a data key wrapped under a KEK. Rotating KEK1 → KEK2 does not touch the data.
Grover квадратично ускоряет перебор ключа. Больше ключ — больше запас против кванта.Grover gives a quadratic key-search speedup. A bigger key keeps the quantum margin.
Получатель докажет модератору содержание сообщения без ключа; подставить чужое сообщение нельзя.The recipient proves the message content to a moderator without the key; framing with a different message fails.
Сообщения разной длины дают шифротекст одинаковой длины — настоящая длина скрыта.Messages of different lengths produce equal-length ciphertext — the real length is hidden.
По желанию: убрать заголовок — шифр становится неотличим от случайных байт. По умолчанию остаётся обычный токен.Optional: strip the header and the ciphertext becomes indistinguishable from random bytes. The normal token stays the default.
Номер карты шифруется в другой номер той же длины — формат базы менять не нужно.A card number is encrypted into another number of the same length — no database schema change needed.
Один раздел для тех, кто хочет заглянуть внутрь: конструкция ядра, замеренный криптоанализ, скорость, готовые реализации по языкам и полный комплект материалов для независимого аудита.
One section for those who want to look inside: the core construction, measured cryptanalysis, speed, ready per-language implementations, and a full package for an independent audit.
N2Q — губка на SPN-перестановке (семейство Keccak/Ascon). Безопасность всей библиотеки сводится к одному вопросу: насколько перестановка QP близка к случайной.
N2Q is a sponge over an SPN permutation (Keccak/Ascon lineage). The whole library's security reduces to one question: how close is the permutation QP to random.
| · | QP-320 | QP-640 |
|---|---|---|
| СостояниеState | 5×64 | 5×128 |
| КомплектSuite | N2Q-128 | N2Q-256 |
| rate / cap | 64 / 256 | 128 / 512 |
| Раунды S/FRounds S/F | 16 / 8 | 16 / 8 |
| СвойствоProperty | · | · |
|---|---|---|
| Дифф. равномерностьDiff. uniformity | 2 | APN |
| НелинейностьNonlinearity | 10 | ↑ |
| Алг. степеньAlgebraic degree | 4 | max |
| Неподв. точкиFixed points | 0 | ✓ |
| ТестTest | РезультатResult | ТипType |
|---|---|---|
| Полная диффузияFull diffusion | 4 rnd → 1.000 | emp. |
| Avalanche | flip 0.500 | emp. |
| Степень (zero-sum)Degree (zero-sum) | none after 3 rnd | emp. |
| Дифференциал (1 бит)Differential (1-bit) | < 2⁻¹⁶ by 3 rnd | emp. |
| dudect | |t| = 0.48 | emp. |
| S-box DP / corr. | 2⁻⁴ / 2⁻¹·⁴² | доказ.proven |
| Мин. активных S-boxMin active S-boxes | 2R=4, 3R=7 * | частичноpartial |
* верхняя оценка; строгая граница — задача полной MILP (открытый пункт).upper bound; a certified bound needs full MILP (open item).
| АлгоритмAlgorithm | MB/s | vs XChaCha |
|---|---|---|
| XChaCha20-Poly1305 (SIMD) | 712 | 1× |
| AES-256-GCM | 245 | 0.34× |
| N2Q-256 · Fast | 24.1 | ~30× |
| N2Q-128 · Fast | 16.0 | ~44× |
Всё это построено из той же перестановки QP — без нового примитива. Каждый режим несёт C-эталон со встроенным self-test (all pass).
All of these are built from the same QP permutation — no new primitive. Each ships a C reference with a built-in self-test (all pass).
| РежимMode | КонструкцияConstruction | СвойствоProperty | ОверхедOverhead | ФайлFile |
|---|---|---|---|---|
| Forward-secret ратчетForward-secret ratchet | mki=H(01∣ck), ck перематывается односторонне и стирается; окно 64mki=H(01∣ck), ck advances one-way and is erased; window 64 | forward secrecy: захват состояния не раскрывает прошлые пакетыforward secrecy: a seized state cannot reveal past packets | 24 B/pkt | n2q_ratchet.c |
| Key-committing AEADKey-committing AEAD | KC=H(07∣key∣tag) поверх SIV, проверяется первымKC=H(07∣key∣tag) over SIV, checked first | шифротекст фиксирует ключ → иммунитет к partitioning-oracleciphertext commits to the key → partitioning-oracle immune | +32 B | n2q_commit.c |
| Envelope / ротацияEnvelope / rotation | wrap=SIV(KEK,DEK); rewrap=wrap(new,unwrap(old)) | ротация KEK без перешифрования данныхrotate the KEK without re-encrypting data | +16 B | n2q_envelope.c |
| Streaming AEADStreaming AEAD | seq→nonce, скользящее окно анти-реплея 64seq→nonce, sliding replay window 64 | потери / переупорядочивание / реплей — по пакетуloss / reordering / replay handled per packet | 24 B/pkt | n2q_stream.c |
| Length-hidingLength-hiding | le32(len)∣pt∣0-pad → bucket | скрывает длину сообщения (анти-трафик-анализ)hides the message length (anti traffic-analysis) | bucket | n2q_pad.c |
| Convergent (dedup)Convergent (dedup) | dek=H(mk∣content), детерминированноdek=H(mk∣content), deterministic | одинаковые данные → одинаковый шифр (дедуп хранилища)identical data → identical ciphertext (storage dedup) | 0 | n2q_convergent.c |
| Audit-logAudit log | record; head=H(head∣record) | append-only: правка/реордер/удаление видныappend-only: edit/reorder/drop is detectable | +chain | n2q_log.c |
| Seekable N2QFSeekable N2QF | чанки N2QF, nonce=indexN2QF chunks, nonce=index | перемотка шифр-медиа без прогонки с началаscrub encrypted media without processing from the start | 0 | n2q_seek.c |
| FrankingFranking | C_F=H(09∣opening∣msg), bound as AD | отчёт о злоупотреблении: получатель докажет модератору без ключаverifiable abuse report: recipient proves it to a moderator, keyless | +32 | n2q_franking.c |
| Stego (опционально)Stego (opt-in) | nonce(16)|sealed, без заголовкаno header | неотличимо от случайных байт (обход DPI); суита вне каналаindistinguishable from random (DPI-evading); suite agreed out of band | 32 B | n2q_stego.c |
| FPE (опционально)FPE (opt-in) | FF1, 10-round Feistel, PRF=N2Q | формат сохранён (карта→карта); не трогает основной APIformat preserved (card→card); leaves the main API untouched | 0 | n2q_fpe.c |
| N2Q-FireLineN2Q-FireLine | wrap(trunk_i, DEK) × n + sealed payload | федерация узлов: мастер-ключи не покидают узловnode federation: master keys never leave their node | +40/rcpt | n2q_fireline.c |
| N2Q-CoNeN2Q-CoNe | WOTS+ / Merkle, PRF=N2Q hash | пост-квантовые сертификаты (анти-MITM); только хешpost-quantum certificates (anti-MITM); hash only | 2276 B | n2q_cone.c |
| Post-quantumPost-quantum | N2Q-256, 256-битный ключN2Q-256, 256-bit key | 128 бит против Grover; нет структуры для Shor128-bit vs Grover; no structure for Shor | — | docs/post-quantum.md |
Четыре реализации сверены побайтово между собой и с тест-векторами. PHP и Swift написаны по спецификации и несут встроенный self-test.
Four implementations are byte-exact cross-checked. PHP and Swift are written to spec and ship a self-test.
| ЯзыкLanguage | Что даётWhat you get | СтатусStatus |
|---|---|---|
| Rust | Ядро + все режимы, Core + all modes, forbid(unsafe), WASM | ✓ свереноverified |
| C | Однофайловый эталон + self-testSingle-file reference + self-test | ✓ свереноverified |
| Python | Полный порт + файловый хелперFull port + file helper | ✓ свереноverified |
| Go | N2Q-128 + N2Q-256 + токены+ tokens | ✓ свереноverified |
| JavaScript / TS | Через WASM-сборку ядраVia the WASM build | ✓ WASM |
| PHP | N2Q-128 + self-test | self-test |
| Swift | N2Q-128 + self-test | self-test |
один результат на разных языках:same result across languages:
Rust n128::blind_index(Secure,&key,b"[email protected]") → 15b058f9… Go BlindIndex(Secure, key, []byte("[email protected]")) → 15b058f9… Python n2qc.blind_index(128, SECURE, key, b"alice…") → 15b058f9… PHP n2q_blind_index(N2Q_SECURE, $key, "[email protected]")→ 15b058f9…
Сертифицированная дифф./лин. граница требует полной MILP/SAT-модели (нужен солвер). Solver-free B&B построен (2R→4, 3R→7 активных S-box), но строгое доказательство — задача аудита.
A certified differential/linear bound needs a full MILP/SAT model (a solver). A solver-free B&B is built (2R→4, 3R→7 active S-boxes), but the certified proof is an audit task.
Полные тексты — в репозитории и в архиве исходников.Full texts live in the repository and the source archive.
Ниже — целиком, не фрагменты. Выберите файл; в архиве выше — то же самое плюс инструменты и доки.Full files below, not excerpts. Pick a file; the archive above has the same plus tooling and docs.
Даже без опыта с криптобиблиотеками — просто повторяйте шаги.
Even without crypto-library experience — just follow the steps.
Скачайте архив и распакуйте. Внутри папка impl/ с реализациями на всех языках.
Download the archive and unzip. It contains impl/ with every language implementation.
У каждого языка есть встроенная самопроверка — она сверяет код с эталонными векторами. Запустите её для вашего языка:
Every language ships a self-test that compares the code to the reference vectors. Run it for your language:
cd impl/python && python3 test_kat.py # Python → ALL PASS cd impl/go && go run . # Go → ALL PASS cd impl/c && cc -O2 n2qc.c -o n2qc && ./n2qc # C cd impl/n2q-c-ref && cargo test # Rust cd impl/php && php n2qc.php # PHP swift impl/swift/n2qc.swift # Swift
ALL PASS означает: порт совпадает с эталоном бит-в-бит на вашей машине.
ALL PASS means the port matches the reference bit-for-bit on your machine.
Выберите язык. Схема одна: сгенерировать ключ и nonce → зашифровать в токен → расшифровать (профиль читается из токена).
Pick a language. Same shape everywhere: make a key and nonce → seal to a token → open (profile read from the token).
Тот же ключ и профили. Хэш — «отпечаток» данных для проверки целостности. Blind index — детерминированный ключевой хэш: кладёте его рядом с шифртекстом и ищете WHERE bi = ?, ничего не расшифровывая.
Same key and profiles. Hash — a data fingerprint for integrity. Blind index — a keyed deterministic hash: store it next to the ciphertext and search WHERE bi = ? without decrypting.
cd impl/n2q-c-wasm && wasm-pack build --target web --out-dir web/pkg cd web && python3 -m http.server 8790 # откройте http://localhost:8790# open http://localhost:8790
Готовый тестер: шифрование, поиск, переключатель профиля, самопроверка.
A ready tester: encryption, search, profile switch, self-test.
Каждый режим — самостоятельный C-файл со встроенным self-test. Соберите и запустите:
Each mode is a self-contained C file with a built-in self-test. Build and run:
# forward secrecy / committing / envelope / streaming / bench cc -O2 -Wno-unused-function -DN2Q_RATCHET_DEMO impl/c/n2q_ratchet.c -o r && ./r cc -O2 -Wno-unused-function -DN2Q_COMMIT_DEMO impl/c/n2q_commit.c -o c && ./c cc -O2 -Wno-unused-function -DN2Q_ENVELOPE_DEMO impl/c/n2q_envelope.c -o e && ./e cc -O2 -Wno-unused-function -DN2Q_STREAM_DEMO impl/c/n2q_stream.c -o s && ./s # length-hiding / dedup / audit-log / seekable / franking cc -O2 -Wno-unused-function -DN2Q_PAD_DEMO impl/c/n2q_pad.c -o p && ./p cc -O2 -Wno-unused-function -DN2Q_CONV_DEMO impl/c/n2q_convergent.c -o cv && ./cv cc -O2 -Wno-unused-function -DN2Q_LOG_DEMO impl/c/n2q_log.c -o lg && ./lg cc -O2 -Wno-unused-function -DN2Q_SEEK_DEMO impl/c/n2q_seek.c -o sk && ./sk cc -O2 -Wno-unused-function -DN2Q_FRANK_DEMO impl/c/n2q_franking.c -o fr && ./fr # federation: FireLine (узлы) / CoNe (сертификаты) cc -O2 -Wno-unused-function -DN2Q_FIRELINE_DEMO impl/c/n2q_fireline.c -o fl && ./fl cc -O2 -Wno-unused-function -DN2Q_CONE_DEMO impl/c/n2q_cone.c -o cn && ./cn
Все печатают ALL PASS. Подробности каждого режима — на странице «Технология».
All print ALL PASS. See the Technology page for what each mode does.
Все 11 режимов на Rust / Go / Python поверх нативного ядра — ни C-библиотеки, ни FFI. Блоб, сделанный одним языком, открывают все (проверено кросс-язык).
All 11 modes in Rust / Go / Python over the native core — no C library, no FFI. A blob made in one language opens in all the others (verified cross-language).
Путь нового шифра — от дизайна к публичному аудиту. Пять этапов пройдены; шестой — приглашение всех на взлом.
A new cipher's path — from design to public audit. Five milestones done; the sixth is inviting the world to break it.
Конструкция, критерии выбора, режимы и формат зафиксированы.
Construction, selection criteria, modes and format fixed.
S-box (APN), вращения, раунд-константы — детерминированно из публичного seed + KAT.
S-box (APN), rotations, round constants — deterministically from a public seed + KATs.
Rust · C · Python · Go · PHP · Swift + WASM-тестер, сверены по KAT.
Rust · C · Python · Go · PHP · Swift + WASM tester, cross-checked by KAT.
Измерения (лавина, степень, дифференциал, время); число раундов финализировано.
Measurements (avalanche, degree, differential, timing); round counts finalized.
Password-KDF (Balloon), формат-конверт, threat model, профили Secure/Fast.
Password KDF (Balloon), the frame format, threat model, Secure/Fast profiles.
Публикация спеки, инструментов и досье; приглашение на публичный криптоанализ и MILP-доказательство границ. Только после этого — продакшен.
Publish the spec, tooling and dossier; invite public cryptanalysis and the MILP proof of the bounds. Only then — production.
Для шифра любой файл — это байты: документ, WAV, MP3, MP4 обрабатываются одинаково. «Медиа-шифрование» — это потоковая обработка кусками, где каждый кусок — самостоятельный аутентифицированный токен.
To the cipher, any file is just bytes: a document, WAV, MP3, MP4 are the same. "Media encryption" is chunked streaming where each chunk is an independent authenticated token.
Один и тот же PNG, один демо-ключ — и так на каждом языке. Выберите порт:
The same PNG, the same demo key — in every language. Pick a port:
photo.n2q сквозным прогоном на Python, Rust, Go, C и Swift — везде identical: true и порча ловится. Контейнер N2QF байт-в-байт одинаков, поэтому файл от одного читают все (PHP — тот же формат; рантайма нет в этой среде).Cross-language verified (5 ports): the same photo.n2q run end-to-end in Python, Rust, Go, C and Swift — each gives identical: true and rejects tampering. The N2QF container is byte-identical, so a file made by one is read by all (PHP is the same format; no runtime in this environment).Текст, изображения, аудио, видео, архивы — всё это байты и шифруется одинаково:
Text, images, audio, video, archives — all bytes, all encrypted the same way:
.txt .json · .png .jpg · .wav .mp3 .flac · .mp4 .mov .mkv · .pdf .zip · …
Звонки, live-видео, игры: один сетевой пакет — один токен. Nonce = порядковый номер пакета; целостность проверяется на каждый пакет (битый отбрасывается, остальные идут дальше). Профиль Fast снижает задержку.
Calls, live video, games: one packet, one token. Nonce = packet sequence number; integrity is checked per packet (a bad packet is dropped, the rest keep flowing). The Fast profile lowers latency.
Отдельная библиотека на C для аудио/видео в реальном времени. Один медиа-пакет → один аутентифицированный датаграм; номер пакета несётся в заголовке, поэтому потери и переупорядочивание не ломают поток, а скользящее окно анти-реплея отбрасывает дубликаты и устаревшие пакеты. Битый пакет отбрасывается локально — поток идёт дальше.
A separate C library for real-time audio/video. One media packet → one authenticated datagram; the sequence number travels in the header, so loss and reordering don't break the stream, and a sliding replay window drops duplicates and stale packets. A bad packet is dropped locally — the stream keeps flowing.
$ cc -O2 -DN2Q_STREAM_DEMO n2q_stream.c -o n2q_stream && ./n2q_stream -- N2Q-128 Fast (overhead 24 B/pkt) -- [PASS] reorder + loss: all 15 delivered packets accepted [PASS] reorder + loss: every plaintext matches [PASS] duplicate rejected (replay window) [PASS] tampered packet rejected (auth) [PASS] wrong AAD rejected (auth) [PASS] forged sequence header rejected (auth) [PASS] late/lost packet later accepted -- N2Q-256 Fast · N2Q-128 Secure: the same 7 checks -- ALL PASS (0 failures)
| ПрофильProfile | seal MB/s | open MB/s | pkt/s |
|---|---|---|---|
| N2Q-128 · Fast | 6.5 | 6.5 | ~5k |
| N2Q-256 · Fast | 12.6 | 13.0 | ~10k |
| N2Q-128 · Secure | 3.3 | 3.3 | ~3k |
| N2Q-256 · Secure | 6.4 | 6.5 | ~5k |
Библиотека одна — на C; ниже как вызвать её из каждого языка (нативно или через FFI/WASM):
One C library; below is how to call it from each language (natively or via FFI/WASM):