
Code und Ergebnisse für das QAI-2026-Paper zur Übertragbarkeit des FGSM-Angriffs von der Simulation auf IBM-Quantenhardware.
Code, trainierte Parameter und Ergebnisse für das Paper FGSM Attack Transferability from Simulation to Quantum Hardware in Network Intrusion Detection, IEEE International Conference on Quantum Artificial Intelligence (QAI) 2026.
Die Zahlen im Paper stammen aus den JSON-Dateien in results/. Die
Skripte hier haben diese Dateien erzeugt.
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
Installiere mit pip install -r requirements.txt.
Die Skripte 08 und 09 laufen auf echter Hardware und benötigen daher ein IBM-Quantum-Konto. Kopiere .env.example und trage deinen eigenen Token und deine Instanz dort ein. Setze sie anschließend als Umgebungsvariablen. Die Skripte lesen Anmeldedaten ausschließlich aus der Umgebung.
Der Rohdatensatz ist hier nicht enthalten. Lade CICIDS2017 vom
Canadian Institute for Cybersecurity
herunter und lege Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv in data/ ab.
Das ist die einzige verwendete Datei.
01_preprocess.py erzeugt die vier .npy-Splits. Im Training solltest du 1134
Attack- und 866 Benign-Samples erhalten. Im Test 284 Attack- und 216
Benign-Samples. Andere Anzahlen bedeuten eine andere Capture-Datei oder eine andere
scikit-learn-Version.
Führe die Skripte in numerischer Reihenfolge aus. Die Skripte 04 bis 07 setzen voraus, dass 01, 02 und 03 zuvor ausgeführt wurden.
| Skript | Erzeugt | Laufzeit |
|---|---|---|
01_preprocess.py | die vier Splits in data/ | Sekunden |
02_train_narrow_margin.py | models/clean_params.npy | Sekunden |
03_retrain_poisoning_and_noise.py | vergiftete und verrauschte Modelle, zwei Ergebnisdateien | mehrere Stunden |
04_epsilon_sweep.py | results/epsilon_sweep.json | unter einer Minute |
05_compare_attack_guidance.py | results/gradient_vs_untargeted.json | unter einer Minute |
06_finish_rq3.py | rauschfreie Baseline und der Rausch-FGSM-Sweep | etwa eine Stunde |
07_margin_control.py | results/margin_control.json | einige Minuten |
08_run_hardware_models.py | results/hardware_clean_vs_poisoned.json | Wartezeit in der Queue |
09_run_hardware_fgsm.py | results/hardware_fgsm_adam.json | Wartezeit in der Queue |
10_convert_hardware_results.py | results/hardware_fgsm_cobyla.json | Sekunden |
make_figures.py | die beiden Abbildungen | Sekunden |
Skript 03 ist das langsame. Es simuliert Dichtematrizen, was etwa sechzehn Minuten pro Initialisierung kostet. Es trainiert drei Initialisierungen bei jeweils drei Rauschpegern.
Die Hardware-Skripte senden alle ihre Schaltkreise in einem einzigen Job. Jeder Schaltkreis in einem Job teilt sich dann denselben Kalibrierungszustand. Beide Skripte akzeptieren --dry-run, was alles transpiliert und die Schaltkreisstatistiken ausgibt, ohne etwas zu senden.
| Paper | Ergebnisdatei | Skript |
|---|---|---|
| Tabelle I, Poisoning | poisoning_retrained.json | 03 |
| Tabelle II, FGSM gegen untargeted | gradient_vs_untargeted.json | 05 |
| Tabelle III, Simulation gegen Hardware | hardware_clean_vs_poisoned.json, hardware_fgsm_adam.json | 08, 09 |
| Tabelle IV, Depolarisierendes Rauschen | noise_retrained.json, noise_fgsm_sweep.json, noiseless_400_baseline.json | 03, 06 |
| Abbildung 1, Transfer auf Hardware | hardware_fgsm_adam.json, hardware_fgsm_cobyla.json | 09, 10 |
| Abbildung 2, Genauigkeit und Margin unter Rauschen | wie Tabelle IV | 03, 06 |
| Abschnitt IV-A, saubere Baseline | clean_history.json, noise_retrained.json | 02, 03 |
| Abschnitt IV-C, Entscheidungs-Margins | epsilon_sweep.json | 04 |
| Abschnitt VI, Margin-Kontrolle | margin_control.json | 07 |
| Datei | Beschreibung |
|---|---|
clean_params.npy | Narrow-Margin-Klassifikator, COBYLA, 86,8 % Genauigkeit bei Margin 0,07 |
noisy_0.0_params.npy | Wide-Margin-Klassifikator, Adam, 92,2 % Genauigkeit bei Margin 0,54 |
noisy_0.0_params_400.npy | rauschfreies Modell, trainiert auf dem 400-Sample-Subset, zum Vergleich über Rauschpegel hinweg |
noisy_0.001_params.npy, noisy_0.01_params.npy, noisy_0.05_params.npy | je eines pro Pegel depolarisierenden Rauschens |
poisoned_5pct_params.npy, poisoned_10pct_params.npy, poisoned_15pct_params.npy | je eines pro Label-Flipping-Rate |
Alle Läufe verwendeten IBM Fez, einen 156-Qubit-Heron-r2-Prozessor. 1024 Shots pro Schaltkreis, über Qiskit Runtime SamplerV2. Die Transpilierung erfolgte mit Optimierungsstufe 1.
Jeder Lauf übermittelte denselben logischen Schaltkreis: Tiefe 20 mit 12 Zwei-Qubit-Gattern. Die Transpilierung bildet ihn auf physikalische Qubits ab, wodurch sich bei jeder Übermittlung beide Zahlen ändern.
| Ergebnis | Skript | Schaltkreise | Transpilierte Tiefe | Zwei-Qubit-Gatter |
|---|---|---|---|---|
| Genauigkeit des sauberen und vergifteten Modells | 08 | 100 | 100 | 27 |
| FGSM-Transfer, Modell mit großer Marge | 09 | 150 | 87 | 42 |
| FGSM-Transfer, Modell mit kleiner Marge | früherer Code, ersetzt durch 09 | 400 | nicht aufgezeichnet | nicht aufgezeichnet |
Der Transfer-Lauf mit kleiner Marge stammt aus der Zeit vor den Skripten in diesem Repository.
Seine Ausgabe ist results/transferability_hw_50_expA.json, die Skript 10
in das Format umwandelt, das die Abbildungen einlesen. Der Lauf verwendete denselben Schaltkreis
und dasselbe Optimierungslevel wie Skript 09.
Die beiden aufgezeichneten Tiefen unterscheiden sich. Der Transpiler wählt physikalische Qubits nach Heuristik aus, sodass derselbe Schaltkreis bei jeder Einreichung anders abgebildet wird. Beide Läufe stimmten dennoch mit der Simulation überein.
Hardware-Ergebnisse hängen vom Kalibrierungszustand des Geräts an jenem Tag ab. Senden Sie dieselben Schaltkreise erneut, erhalten Sie andere Zählwerte. Die JSON-Dateien sind die Aufzeichnung dessen, was das Gerät getan hat.
models/clean_params.npy kann nicht neu erzeugt werden. Seine Anfangsparameter
stammten aus dem globalen NumPy-Zufallszustand statt aus einem mit Seed versehenen Generator.
02_train_narrow_margin.py setzt nun einen Seed für seine Initialisierung, sodass neue Läufe
untereinander reproduzierbar sind. Sie landen jedoch woanders, und die
Streuung ist groß. Ein gradientenfreier Optimierer auf einem stochastischen Ziel kann
darauf kollabieren, die Mehrheitsklasse vorherzusagen. Das Skript weist darauf hin, wenn das
geschieht.
Der Rest ist mit Seed versehen. Die Genauigkeit variiert weiterhin zwischen Initialisierungen, daher geben die Skripte Mittelwert und Standardabweichung statt eines einzelnen Laufs an. Abschnitt VI des Papers erklärt, warum.
@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},
}
Der Code steht unter MIT. Siehe LICENSE.
CICIDS2017 stammt vom Canadian Institute for Cybersecurity und unterliegt dessen eigenen Bedingungen. Es wird hier nicht weiterverbreitet.