
Код и результаты для статьи QAI 2026 о переносимости атаки FGSM из симуляции на квантовое оборудование IBM.
Код, обученные параметры и результаты для статьи FGSM Attack Transferability from Simulation to Quantum Hardware in Network Intrusion Detection, IEEE International Conference on Quantum Artificial Intelligence (QAI) 2026.
Числа в статье получены из JSON-файлов в results/. Скрипты
здесь создали эти файлы.
src/ experiment scripts, numbered in run order
data/ preprocessed splits (the raw CICIDS2017 CSVs are not included)
models/ trained circuit parameters
results/ one JSON per experiment
figures/ the two figures in the paper
python >= 3.10
pennylane == 0.44.1
qiskit-ibm-runtime
numpy, scipy, scikit-learn, pandas, matplotlib
Установите с помощью pip install -r requirements.txt.
Скрипты 08 и 09 работают на реальном оборудовании, поэтому им нужен аккаунт IBM Quantum. Скопируйте .env.example и впишите в него свой токен и instance. Затем задайте их как переменные окружения. Скрипты читают учётные данные только из окружения.
Исходный дамп здесь отсутствует. Скачайте CICIDS2017 с сайта
Канадского института кибербезопасности
и поместите Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv в data/.
Это единственный используемый файл.
01_preprocess.py создаёт четыре разбиения .npy. В обучающей выборке должно получиться 1134 атаки и 866 доброкачественных образцов. В тестовой — 284 атаки и 216 доброкачественных. Другие значения означают другой файл дампа или другую версию scikit-learn.
Запускайте скрипты в порядке номеров. Скриптам с 04 по 07 нужно, чтобы сначала выполнились 01, 02 и 03.
| Скрипт | Создаёт | Время выполнения |
|---|---|---|
01_preprocess.py | четыре разбиения в data/ | секунды |
02_train_narrow_margin.py | models/clean_params.npy | секунды |
03_retrain_poisoning_and_noise.py | отравленные и зашумлённые модели, два файла результатов | несколько часов |
04_epsilon_sweep.py | results/epsilon_sweep.json | меньше минуты |
05_compare_attack_guidance.py | results/gradient_vs_untargeted.json | меньше минуты |
06_finish_rq3.py | безшумовой базовый уровень и развёртка FGSM по шуму | около часа |
07_margin_control.py | results/margin_control.json | несколько минут |
08_run_hardware_models.py | results/hardware_clean_vs_poisoned.json | время в очереди |
09_run_hardware_fgsm.py | results/hardware_fgsm_adam.json | время в очереди |
10_convert_hardware_results.py | results/hardware_fgsm_cobyla.json | секунды |
make_figures.py | два рисунка | секунды |
Скрипт 03 — самый медленный. Он симулирует матрицы плотности, что занимает около шестнадцати минут на одну инициализацию. Он обучает три инициализации на каждом из трёх уровней шума.
Скрипты для оборудования отправляют все свои схемы одной задачей. Тогда все схемы в задаче используют одно и то же состояние калибровки. Оба скрипта принимают --dry-run, который транспилирует всё и выводит статистику схем, ничего не отправляя.
| Статья | Файл результата | Скрипт |
|---|---|---|
| Таблица I, отравление | poisoning_retrained.json | 03 |
| Таблица II, FGSM против ненаправленной атаки | gradient_vs_untargeted.json | 05 |
| Таблица III, симуляция против оборудования | hardware_clean_vs_poisoned.json, hardware_fgsm_adam.json | 08, 09 |
| Таблица IV, деполяризующий шум | noise_retrained.json, noise_fgsm_sweep.json, noiseless_400_baseline.json | 03, 06 |
| Рисунок 1, перенос на оборудование | hardware_fgsm_adam.json, hardware_fgsm_cobyla.json | 09, 10 |
| Рисунок 2, точность и запас при шуме | то же, что в Таблице IV | 03, 06 |
| Раздел IV-A, чистый базовый уровень | clean_history.json, noise_retrained.json | 02, 03 |
| Раздел IV-C, запасы решений | epsilon_sweep.json | 04 |
| Раздел VI, контроль запаса | margin_control.json | 07 |
| Файл | Что это |
|---|---|
clean_params.npy | классификатор с узким запасом, COBYLA, точность 86.8% при запасе 0.07 |
noisy_0.0_params.npy | классификатор с широким запасом, Adam, точность 92.2% при запасе 0.54 |
noisy_0.0_params_400.npy | безшумовая модель, обученная на подвыборке из 400 образцов, для сравнения между уровнями шума |
noisy_0.001_params.npy, noisy_0.01_params.npy, noisy_0.05_params.npy | по одной на каждый уровень деполяризующего шума |
poisoned_5pct_params.npy, poisoned_10pct_params.npy, poisoned_15pct_params.npy | по одной на каждую долю перевёрнутых меток |
Все запуски использовали IBM Fez — 156-кубитный процессор Heron r2. 1024 выстрела на схему через Qiskit Runtime SamplerV2. Транспиляция выполнялась на уровне оптимизации 1.
Каждый запуск отправлял одну и ту же логическую схему: глубина 20 с 12 двухкубитными вентилями. Транспиляция отображает её на физические кубиты, что меняет оба числа при каждой отправке.
| Результат | Скрипт | Схемы | Глубина после транспиляции | Двухкубитные вентили |
|---|---|---|---|---|
| Точность чистой и отравленной модели | 08 | 100 | 100 | 27 |
| Перенос FGSM, модель с широким запасом | 09 | 150 | 87 | 42 |
| Перенос FGSM, модель с узким запасом | более ранний код, заменён скриптом 09 | 400 | не записано | не записано |
Прогон переноса с узким запасом предшествует скриптам в этом репозитории.
Его вывод — results/transferability_hw_50_expA.json, который скрипт 10
преобразует в формат, читаемый графиками. В прогоне использовались та же схема
и тот же уровень оптимизации, что и в скрипте 09.
Две записанные глубины различаются. Транспилятор выбирает физические кубиты эвристически, поэтому одна и та же схема отображается по-разному при каждой отправке. Оба прогона всё же совпали с симуляцией.
Результаты на оборудовании зависят от состояния калибровки устройства в тот день. Отправьте те же схемы снова — и получите другие счётчики. JSON-файлы являются записью того, что делало устройство.
models/clean_params.npy невозможно сгенерировать заново. Его начальные параметры
были получены из глобального состояния генератора случайных чисел NumPy, а не из инициализированного генератора.
02_train_narrow_margin.py теперь инициализирует свой генератор, поэтому новые прогоны
воспроизводимы между собой. Однако они попадают в другое место, и
разброс широк. Оптимизатор без градиента на стохастической цели может
скатиться к предсказанию мажоритарного класса. Скрипт сообщает об этом, когда
это происходит.
Остальное инициализировано. Точность всё ещё варьируется между инициализациями, поэтому скрипты сообщают среднее и стандартное отклонение вместо одного прогона. Раздел VI статьи объясняет почему.
@inproceedings{ajmal2026fgsm,
author = {Ajmal, Zeeshan and Halunen, Kimmo and Mau{\ss}ner, Marc
and Reers, Volker and Khan, Arif Ali},
title = {{FGSM} Attack Transferability from Simulation to Quantum
Hardware in Network Intrusion Detection},
booktitle = {IEEE International Conference on Quantum Artificial
Intelligence (QAI)},
year = {2026},
note = {To appear},
}
Код распространяется под лицензией MIT. См. LICENSE.
CICIDS2017 предоставлен Канадским институтом кибербезопасности на его собственных условиях. Здесь он не распространяется.
Эта работа была поддержана проектом Business Finland (24304955) SeQuSoS. Мы признательны за использование сервисов IBM Quantum. Изложенные взгляды принадлежат авторам и не отражают официальную политику или позицию IBM или команды IBM Quantum.