gr-PHYSEC : Module GNU Radio pour la sécurité de la couche physique
Ce module GNU Radio fournit des capacités d'empreinte de canal pour les applications de sécurité de la couche physique à l'aide de modèles d'apprentissage profond.
Fonctionnalités
- Empreinte de canal : Extraire les caractéristiques uniques du canal à partir d'échantillons IQ
- Intégration d'apprentissage profond : Utilise des modèles entraînés (QExtractor.h5) pour l'extraction de caractéristiques
- Quantification des caractéristiques : Convertir les caractéristiques extraites en valeurs binaires
- Amplification de confidentialité : Appliquer un hachage cryptographique (SHA3-512) pour la génération de clés
- Traitement en temps réel : Traiter les échantillons IQ en temps réel à partir de périphériques SDR
- Prise en charge de plusieurs modèles : Prise en charge des architectures TripletNet et QuadrupletNet
Prérequis
- GNU Radio 3.10+
- Python 3.8+
- TensorFlow 2.x
- NumPy
- Hashlib (intégré)
Installation
1. Cloner le dépôt
git clone <your-repo-url>/gr-PHYSEC.git
cd gr-PHYSEC
2. Créer le répertoire de compilation
4. Installer
sudo make install
sudo ldconfig
5. Vérifier l'installation
Vous devriez voir une nouvelle catégorie [PHYSEC] avec le bloc PHYSEC Fingerprint Block.
Utilisation
GNU Radio Companion (GRC)
- Ouvrir GNU Radio Companion
- Rechercher la catégorie
[PHYSEC]
- Glisser-déposer le bloc
PHYSEC Fingerprint Block
- Configurer les paramètres :
- Model Path : Chemin vers votre fichier QExtractor.h5
- Model Type : Choisir entre "quadruplet" ou "triplet"
- Spectrogram Size : Taille FFT (par défaut : 512)
- Sample Rate : Fréquence d'échantillonnage SDR en Hz
- Center Frequency : Fréquence centrale SDR en Hz
- Key Length : Longueur de clé souhaitée en bits
Script Python
from gnuradio import gr
from gnuradio import PHYSEC
# Create decoupled PHYSEC blocks
spectrogram = PHYSEC.spectrogram_block(
vector_size=512,
sample_rate=1e6,
center_freq=2.4e9
)
feature_extractor = PHYSEC.feature_extraction_block(
model_path="/path/to/QExtractor.onnx"
)
feature_quantizer = PHYSEC.feature_quantization_block(
threshold_type="mean"
)
parity_generator = PHYSEC.parity_generation_block(
key_length=512
)
reconciler = PHYSEC.reconciliation_block(
key_length=512
)
privacy_amplifier = PHYSEC.privacy_amplification_block()
Exemple de flowgraph
Voir examples/decoupled_physic_example.grc pour un exemple complet de flowgraph utilisant les blocs PHYSEC découplés.
Paramètres des blocs
Bloc Spectrogram
| Paramètre | Type | Défaut | Description |
|---|
model_path | string | - | Chemin vers le fichier de modèle ONNX |
Bloc Feature Quantization
| Paramètre | Type | Défaut | Description |
|---|
threshold_type | string | "mean" | Méthode de seuil : "mean", "median" ou "zero" |
Bloc Parity Generation
| Paramètre | Type | Défaut | Description |
|---|
key_length | int | 512 | Longueur de la clé binaire pour la génération de parité |
Bloc Reconciliation
| Paramètre | Type | Défaut | Description |
|---|
key_length | int | 512 | Longueur de la clé binaire pour la réconciliation |
Bloc Privacy Amplification
| Paramètre | Type | Défaut | Description |
|---|
| Aucun paramètre requis | - | - | Applique le hachage SHA3-512 |
Entrées/Sorties
Bloc Spectrogram
- Entrée : Échantillons IQ complexes provenant du SDR
- Sortie : Données de spectrogramme (204×31 valeurs float)
- Entrée : Données de spectrogramme (204×31 valeurs float)
- Sortie : Vecteur de caractéristiques (512 valeurs float)
Bloc Feature Quantization
- Entrée : Vecteur de caractéristiques (512 valeurs float)
- Sortie : Caractéristiques binaires (512 valeurs uint8)
Bloc Parity Generation
- Entrée : Caractéristiques binaires (512 valeurs uint8)
- Sortie : Bits de parité (string)
Bloc Reconciliation
- Entrée : Caractéristiques binaires + Bits de parité
- Sortie : Clé binaire réconciliée (string)
Bloc Privacy Amplification
- Entrée : Caractéristiques binaires (512 valeurs uint8)
- Sortie : Clé cryptographique finale (128 octets)
Le message de sortie d'empreinte contient :
{
"fingerprint": "generated_hash_string",
"block_count": 123,
"sample_rate": 1000000.0,
"center_freq": 2400000000.0,
"spectrogram_size": 512
}
Pipeline de traitement
- Collecte d'échantillons IQ : Mettre en mémoire tampon les échantillons IQ entrants à l'aide de Stream to Vector
- Création du spectrogramme : Convertir les échantillons IQ en spectrogramme à l'aide de STFT, normalisation RMS et recadrage fréquentiel
- Extraction de caractéristiques : Utiliser le modèle ONNX pour extraire les caractéristiques du canal
- Quantification des caractéristiques : Convertir les caractéristiques en valeurs binaires à l'aide de seuils configurables
- Génération de parité : Générer des bits de parité Reed-Solomon pour la correction d'erreurs
- Réconciliation de clé : Corriger les erreurs à l'aide des bits de parité
- Amplification de confidentialité : Appliquer le hachage SHA3-512 pour la génération finale de clé
- Sortie : Communication basée sur les flux entre les blocs
Exigences relatives au modèle
Votre modèle ONNX doit :
- Accepter une forme d'entrée :
(batch, 204, 31) pour les données de spectrogramme
- Produire des vecteurs de caractéristiques de longueur 512
- Être compatible avec ONNX Runtime
- Prendre en charge les entrées/sorties float32
Dépannage
Problèmes courants
- Modèle introuvable : Vérifiez que le chemin vers QExtractor.h5 est correct
- Erreurs TensorFlow : Vérifiez l'installation et la compatibilité de TensorFlow
- Problèmes de mémoire : Réduisez spectrogram_size pour une utilisation mémoire moindre
- Performance : Utilisez l'accélération GPU si disponible
Sortie de débogage
Le bloc fournit des informations de débogage étendues :
- Sortie console pour l'état du traitement
- Ports de messages pour les résultats intermédiaires
- Gestion des erreurs avec des messages informatifs
Développement
Ajout de nouvelles fonctionnalités
- Modifier le bloc spécialisé approprié (par exemple,
spectrogram_block.py)
- Mettre à jour la définition du bloc GRC correspondant dans
grc/
- Recompiler le module
- Tester avec les exemples
Tests
Exécuter le script d'exemple :
cd examples
python3 fingerprint_example.py
Licence
Ce projet est sous licence GPL-3.0-or-later.
Contribution
- Forker le dépôt
- Créer une branche de fonctionnalité
- Effectuer vos modifications
- Ajouter des tests si applicable
- Soumettre une pull request
Support
Pour les problèmes et questions :
- Consulter la section de dépannage
- Examiner les fichiers d'exemple
- Ouvrir un ticket sur le dépôt
- Contacter l'équipe de développement
Remerciements
- Basé sur la recherche sur l'empreinte de canal PHYSEC
- Utilise TensorFlow pour l'inférence d'apprentissage profond
- S'intègre à GNU Radio pour le traitement SDR