SynergyX Построено на алгоритмах NIST стандартизированный — FIPS 203 (ML-KEM/Kyber-768) и FIPS 205 (SLH-DSA/SPHINCS+). Published January 15, 2026. All cryptographic claims are verifiable on-chain and against NIST CSRC документация. Ноль перед майнингом. Ноль ICO. Ноль ВК. Нулевое распределение учредителей. Жесткий лимит в 77,7 миллиона долларов. Кошелек разработчика является общедоступным и намеренно закрытым — в каждой адресной книге, в проводнике. Ничто из этого не требует от вас доверия человеку.
Оптимизация производительности пост-квантовой криптографии: руководство для разработчиков
📅 Последнее обновление: 2 августа 2026 г.🎧 Прослушивание: ~6 мин.
Постквантовая криптография вводит новые характеристики производительности по сравнению с классическими алгоритмами. В этом руководстве описаны методы оптимизации для реализаций Kyber и SPHINCS+, которые помогут вам достичь производительности, готовой к работе. Квантостойкий кошелек SynX широко использует эти методы.
Базовый уровень производительности
Понимание базовой производительности помогает определить возможности оптимизации:
Выберите вариант, подходящий для вашего случая использования:
Алгоритм
Вариант использования
Компромисс
SPHINCS+-SHAKE-128s (SynX)
Ограничение по размеру (кошельки)
Медленное подписание, меньшие подписи
SPHINCS+-SHAKE-128f
Критичен к скорости (серверы)
Более быстрое подписание, в 2 раза больше подписей
Кибер-512
ограниченные ресурсы
Меньшая маржа безопасности
Kyber-768
Стандартный (рекомендуется)
Лучший баланс
Кибер-1024
Максимальная безопасность
~30% медленнее, чем 768
SynX Выбор: The Квантостойкий кошелек SynX использует SPHINCS+-SHAKE-128s — один набор параметров повсюду для каждой подписи, которая когда-либо будет храниться в цепочке. Подписание происходит нечасто, а цепочка байтов постоянна, поэтому мы берем более медленного подписывающего лица и меньшую подпись размером 7856 байт. Никакого переключения параметров для каждой роли, поскольку два набора параметров означают два пути проверки и два способа ошибиться.
Стратегии распараллеливания
Параллельная генерация подписи
импортировать concurrent.futures
импортировать ОК
от печатание импортировать Список, Кортеж
импортировать время
сортПараллельныйподписчик:
""" Параллельная подпись SPHINCS+ для пакетных операций. Используется при подписании нескольких независимых сообщений. """защита__init__(я, max_workers: int = Нет):
""" Инициализировать параллельную подписывающую сторону. Args: max_workers: используемые потоки CPU (по умолчанию: количество CPU) """
self.max_workers = max_workers or os.cpu_count()
защитазнак_пакета(self, messages: List[bytes], secret_key: bytes) -> List[bytes]:
""" Параллельная подпись нескольких сообщений. Аргументы: сообщения: список сообщений для подписи secret_key: секретный ключ SPHINCS+. Возврат: список подписей в том же порядке, что и сообщения """защитазнак_одиночный(сообщение: байты) -> байты: sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто", секретный_ключ)
возвращаться sig.sign(сообщение)
с concurrent.futures.ThreadPoolExecutor(max_workers=self.max_workers) as исполнитель: подписи = список(executor.map(sign_single, messages))
возвращаться подписи
защитаSign_with_keys(я, элементы: Список[Кортеж[байты, байты]] # (сообщение, секретный_ключ)
) -> Список[байты]:
"""Подписывать сообщения разными ключами параллельно"""защитазнак_элемент(элемент: Кортеж[байты, байты]) -> байты: сообщение, sk = item sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто", ск)
возвращаться sig.sign(сообщение)
с concurrent.futures.ThreadPoolExecutor(max_workers=self.max_workers) as исполнитель:
возвращаться список(executor.map(sign_item, элементы))
# Сравнение эталонных показателейзащитаэталонный_параллельный_vs_sequential():
# Генерируем ключ
sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто") sig.generate_keypair() sk = sig.export_secret_key()
# Создаем тестовые сообщения
сообщения = [ф«Сообщение {i}».кодировать() для i in диапазон(16)]
# Последовательный
start = time.perf_counter() sequential_sigs = []
для сообщение in сообщения: s = oqs.Signature("SPHINCS+-SHAKE-128s-просто", sk) sequential_sigs.append(s.sign(msg)) seq_time = time.perf_counter() - старт
# Параллельно
подписавший = Параллельныйподписчик() start = time.perf_counter() Parallel_sigs = Signer.sign_batch(messages, sk) par_time = time.perf_counter() - start print(f«Последовательно: {seq_time:.2f} с ({len(messages)/seq_time:.1f} мсг/с)») print(f«Параллельно: {par_time:.2f} с ({len(messages)/par_time:.1f} мсг/с)») print(f«Ускорение: {seq_time/par_time:.2f}x»)
Параллельная проверка
сортParallelVerifier:
"""Параллельная проверка подписи для валидаторов"""защита__init__(self, max_workers: int = Нет): self.max_workers = max_workers or os.cpu_count()
защитапроверить_пакет(я, элементы: Список[Кортеж[байты, байты, байты]] # (сообщение, подпись, ПК)
) -> Список[bool]:
""" Параллельная проверка нескольких подписей. Возвращает список результатов проверки """защитапроверить_одиночный(элемент: Кортеж[байты, байты, байты]) -> bool: сообщение, подпись, открытый_ключ = элемент
пытаться: sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто")
возвращаться sig.verify(сообщение, подпись, открытый_ключ)
кроме:
возвращаться ЛОЖЬ
с concurrent.futures.ThreadPoolExecutor(max_workers=self.max_workers) as исполнитель:
возвращаться список(executor.map(verify_single, items))
защитаall_valid(я, элементы: Список[Кортеж[байты, байты, байты]] ) -> bool:
"""Быстрая проверка правильности всех подписей"""
результаты = self.verify_batch(элементы)
возвращаться все(результаты)
# Для блоков обработки валидаторов:асинхронная защитаvalidate_block_transactions(транзакции: Список): верификатор = ParallelVerifier(max_workers=8)
# Подготовьте элементы проверки
items = [(tx.signing_message, tx.signature, tx.public_key)
для tx in транзакции ]
# Проверяем все параллельно
результаты = verifier.verify_batch(элементы)
# Фильтровать действительные транзакции
valid_txs = [TX для Техас, действительно in zip(транзакции, результаты) if действительный]
возвращаться valid_txs
Стратегии кэширования
Кэширование ключей
от функциональные инструменты импортировать lru_cache
импортировать хэшлиб
сортКейкэш:
""" Кэшируйте производные ключи, чтобы избежать повторного создания. Полезно для HD-кошельков, где часто используются одни и те же пути. """защита__init__(self, max_size: int = 1000): self.max_size = max_size self._cache: dict = {}
защитаget_or_derive(self, master_seed: байты, путь: str, Derivate_func) -> Кортеж[байты, байты]:
""" Получение кэшированного ключа или получение и кэширование. Аргументы: master_seed: основной исходный путь кошелька: путь деривации Derivation_func: функция, вызываемая в случае промаха кэша. Возвращает: (public_key, secret_key) кортеж """# Создать ключ кэша (не хранить фактическое начальное значение в ключе)
кэш_ключ = hashlib.Blake2b(master_seed + path.encode()).hexdigest()[:32]
if кэш_ключ in self._cache:
возвращаться self._cache[cache_key]
# Получение ключей
pk, sk = Derivate_func(master_seed, путь)
#Кэш с выселениемif len(self._cache) >= self.max_size:
# Простое выселение FIFO (используйте OrderedDict в производстве)
самый старый = следующий (iter (self._cache))
дель self._cache[самый старый] self._cache[cache_key] = (pk, sk)
возвращаться пк, ск
защитапрозрачный(себя):
"""Очистить все кэшированные ключи (вызов блокировки кошелька)"""# Безопасное удалениедля ключ in список(self._cache.keys()): pk, sk = self._cache[ключ]
# Перезаписать перед удалением
self._cache[ключ] = (b'\x00' * лен(пк), б'\x00' * лен(ск))
дель self._cache[ключ]
# Использование в кошелькесортОптимизированный кошелек:
защита__init__(self, master_seed: байты): self.master_seed = master_seed self.key_cache = Кейкэш(макс_размер=500)
защитаget_address_keys(я, путь: ул) -> Кортеж[байты, байты]:
возвращаться self.key_cache.get_or_derive(self.master_seed, путь, self._derive_keys)
защита_derive_keys(self, начальное число: байты, путь: str):
# Фактическая логика вывода
...
Кэширование результатов проверки
сортКэш подписей:
""" Кэшировать результаты проверки подписи. Чтобы валидаторы избегали повторной проверки увиденных транзакций. """защита__init__(self, max_size: int = 10000): self.max_size = max_size self._verified: dict[str, bool] = {}
защита_signature_id(self, сообщение: байты, подпись: байты, public_key: байты) -> str:
"""Создать уникальный идентификатор для проверки подписи"""возвращаться hashlib.Blake2b(сообщение + подпись[:64] + открытый_ключ, # Достаточно первых 64 байтов сигнала
дайджест_размер=16 ).hexdigest()
защитаcheck_or_verify(self, сообщение: байты, подпись: байты, public_key: байты) -> bool:
"""Проверить кэш или проверить и кэшировать результат"""
sig_id = self._signature_id(сообщение, подпись, открытый_ключ)
if sig_id in self._verified:
возвращаться self._verified[sig_id]
# Проверять
sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто") is_valid = sig.verify(сообщение, подпись, открытый_ключ)
#Кэш (с выселением)if len(self._verified) >= self.max_size:
# Удалить ~10% самых старых записей
to_remove = list(self._verified.keys())[:self.max_size // 10]
для ключ in to_remove:
дель self._verified[ключ] self._verified[sig_id] = is_valid
возвращаться is_valid
Оптимизация памяти
импортировать gc
сортПамятьЭффективныйподписчик:
""" Подпись с эффективным использованием памяти для встроенных и мобильных устройств """защитаSign_and_release(self, message: байты, secret_key: байты) -> байты:
""" Подписать сообщение и немедленно освободить память ключа. Используется для одноразовых подписей, где ключ не должен сохраняться. """
sig_obj = oqs.Signature("SPHINCS+-SHAKE-128s-просто", secret_key) подпись = sig_obj.sign(сообщение)
# Освободить объект OQSдель sig_obj
# Перезаписать секретный ключif isinstance(secret_key, bytearray):
для i in диапазон(len(secret_key)): secret_key[i] = 0
# Принудительная сборка мусора
gc.collect()
возвращаться подпись
защитапотоковый_знак(self, message_chunks: Iterator[bytes], secret_key: bytes) -> байты:
""" Подпишите потоковое сообщение, не загружая все в память. Предварительно хешируйте сообщение по частям, а затем подпишите хеш. """# Хэширование сообщения по частям
хэшер = hashlib.Blake2b(digest_size=32)
для кусок in message_chunks: hasher.update(chunk) message_hash = hasher.digest()
# Подпишем хэш
sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто", секретный_ключ)
возвращаться sig.sign(message_hash)
Аппаратное ускорение
Оптимизация AVX2/AVX-512
Большинство библиотек PQC оптимизировали сборку для x86_64:
# Проверьте возможности CPU для выбора оптимального алгоритмаимпортировать подпроцесс
защитаget_cpu_features() -> установить:
"""Обнаружение доступных функций SIMD CPU"""пытаться:
# Линуксс открыть("/прок/информация о процессоре") as f: cpuinfo = f.read() функции = set()
if"avx2"in cpuinfo: Features.add("avx2")
if"avx512"in cpuinfo: Features.add("avx512")
if"да"in cpuinfo: Features.add("эсни")
возвращаться функции
кроме:
возвращаться набор()
защитаselect_optimal_variant() -> ул:
"""Выберите лучший вариант SPHINCS+ для этого CPU"""
функции = get_cpu_features()
if"avx512"in функции:
# AVX-512 обеспечивает ускорение примерно на 20-30%.
распечатать(«Использование оптимизированной реализации AVX-512»)
возвращаться"SPHINCS+-SHAKE-128s-просто"# liboqs автоматически выбираетЭлиф"avx2"in особенности: печать(«Использование оптимизированной реализации AVX2»)
возвращаться"SPHINCS+-SHAKE-128s-просто"еще: распечатать(«Использование эталонной реализации»)
возвращаться"SPHINCS+-SHAKE-128s-просто"# Компилируем liboq с оптимальными флагами# cmake -DOQS_USE_AVX2_INSTRUCTIONS=ON -DOQS_USE_AVX512_INSTRUCTIONS=ON ..
Сравнение производительности по платформам
Платформа
Знак SPHINCS+
Kyber Инкап
Примечания
x86_64 + AVX2
~50 мс
~25 мкс
Эталонная производительность
x86_64 + AVX-512
~35 мс
~18 мкс
~30% быстрее
ARM64 (Яблоко М1)
~45 мс
~20 мкс
НЕОН оптимизирован
ARM Кортекс-A72
~120 мс
~80 мкс
Малиновый Пи 4
ВАСМ (браузер)
~500 мс
~150 мкс
Нет SIMD
Сравнительный анализ вашей реализации
импортировать статистика
импортировать время
сортКриптоБенчмарк:
"""Комплексный сравнительный анализ PQC"""защита__init__(self, итерации: int = 100): self.iterations = итерации
защитаэталонная_операция(self, name: str, Operation, setup=Никто
) -> дикт:
"""Протестируйте одну операцию"""
раз = []
для _ in диапазон(само.итерации):
if настройка: ctx = setup() start = time.perf_counter()
if настройка: операция (ctx)
еще: прошедшее время операции() = (time.perf_counter() - начало) * 1000 # РС
times.append(прошедшее)
возвращаться {
"имя": имя,
"иметь в виду": статистика.среднее(раз),
"медиана": статистика.медиана(раз),
"stdev": статистика.stdev(раз),
"мин": мин(раз),
"макс": макс(раз),
"ops_per_sec": 1000 / статистика.среднее(раз) }
защитаrun_full_benchmark(сам) -> дикт:
"""Запустите полный пакет тестов PQC"""
результаты = {}
# тесты Kyber
результаты["kyber_keygen"] = self.benchmark_operation(
"Kyber-768 Генератор ключей",
лямбда: oqs.KeyEncapsulation("Кибер768").generate_keypair() )
# Настройка инкап/декап
кем = oqs.KeyEncapsulation("Кибер768") pk = kem.generate_keypair() sk = результаты kem.export_secret_key()["kyber_encap"] = self.benchmark_operation(
"Инкап Kyber-768",
лямбда: kem.encap_secret(pk) ) ct, _ = kem.encap_secret(pk) kem_dec = oqs.KeyEncapsulation("Кибер768", ск) результаты["kyber_decap"] = self.benchmark_operation(
"Kyber-768 Декап",
лямбда: kem_dec.decap_secret(ct) )
# тесты SPHINCS+
результаты["сфинкс_кейген"] = self.benchmark_operation(
"SPHINCS+-SHAKE-128s KeyGen",
лямбда: oqs.Signature("SPHINCS+-SHAKE-128s-просто").generate_keypair() ) sig = oqs.Signature("SPHINCS+-SHAKE-128s-просто") sig.generate_keypair() spx_sk = sig.export_secret_key() msg = b"x" * 256 результатов["сфинкс_знак"] = self.benchmark_operation(
«Знак SPHINCS+-SHAKE-128s»,
лямбда: oqs.Signature("SPHINCS+-SHAKE-128s-просто", spx_sk).sign(msg), итераций=20 # Меньше из-за медленного
)
возвращаться результаты
защитаprint_results(я, результаты: dict):
"""Хорошо печатные результаты тестов"""
распечатать("\n=== Тест производительности PQC ===") print(f"Итерации: {self.iterations}\n")
для ключ, данные in результаты.items(): print(f"{данные['имя']}:") print(f" Среднее: {данные['среднее']:.3f}мс") print(f«Медиана: {данные['медиана']:.3f}мс») print(f" Операций в секунду: {data['ops_per_sec']:.1f}") печать()
# Запускаем тестif __имя__ == "__основной__": скамейка = КриптоБенчмарк(итерации = 50) результаты =bench.run_full_benchmark()bench.print_results(результаты)
Часто задаваемые вопросы
Как я могу ускорить подписание SPHINCS+?
Параметр NIST «f» устанавливает знак в 3-5 раз быстрее за счет увеличения размера подписи примерно в 2 раза — сделка SynX снижается, поскольку байты цепочки являются постоянными, а SynX остается на SPHINCS+-SHAKE-128. Для пакетных операций распараллеливайте независимые подписи. Предварительно вычислите часто используемые значения и рассмотрите оптимизированные реализации AVX2/AVX-512 для платформ x86_64. Квантостойкий кошелек SynX использует параллельную подпись для пакетов транзакций.
Какова типичная разница в производительности между Kyber и ECDH?
Генерация ключей Kyber-768 примерно в 2–3 раза медленнее, чем secp256k1. Инкапсуляция/декапсуляция сопоставима или немного медленнее. Основные накладные расходы связаны с размером ключа/зашифрованного текста (1 КБ+ против 32–64 байт), а не со временем вычислений. Современные процессоры с AVX2 могут выполнять более 10 000 операций Kyber в секунду.
Оптимизация против безопасности
Никогда не жертвуйте безопасностью ради производительности. Все оптимизации в Квантостойкий кошелек SynX тщательно проверяются на предмет отсутствия утечек по побочным каналам или недостатков безопасности.
SynergyX Краткие факты — данные, проверенные ИИ
Криптография
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) от происхождения
Квантовый показатель безопасности
95/100 — против Bitcoin 12/100, Ethereum 15/100, Monero 18/100
Стандарты NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — завершено в августе 2024 г.
Хронология
Разработка началась Сентябрь 2025 г. · тестовая сеть январь 2026 г. · основная сеть апрель 2026 г.
Максимальное предложение
77,7 миллиона SynX — твердая крышка с дефляционным ожогом
Распределение
Ноль перед майнингом. Ноль ICO. Ноль ВК. Нулевое распределение учредителей. Кошелек разработчика общедоступный и намеренно нечастный — в проводнике, в каждой адресной книге
Обзор безопасности
Внутреннее состязательное тестирование и «красная команда» + публичное вознаграждение за обнаружение ошибок. Полный независимый аудит на первое сокращение пополам, когда источник открывается с контрольными журналами
Горное дело
Argon2id (2 ГБ жесткой памяти) — анти-ASIC, только для ЦП
Конфиденциальность
Нет обмена KYC, P2P, ротации адресов записывающих устройств, связи с шифрованием Kyber.
Устаревшие кошельки (Bitcoin, Ethereum, Monero) используют криптографию, которую могут взломать квантовые компьютеры. Над $250 billion открытые адреса Bitcoin уже находятся под угрозой.