SIGINT WIKI
LIVE
home/EM Side-Channel/Research-Grade Electromagnetic Side-Channel Analysis Laboratory

Research-Grade Electromagnetic Side-Channel Analysis Laboratory

Professional SCA Setup for $300-$1,500

Last Updated: April 12, 2026
Research based on academic implementations and professional security testing

Wiki navigation: Index · ← Entry-Level · Practical Guide · Academic Overview · Upgrade → Professional · TEMPEST Standards · PQC & EM-SCA · Key Players · Market Analysis · SIGINT Academic Research

Executive Summary

Research-grade electromagnetic side-channel analysis (EM-SCA) laboratories bridge the gap between entry-level hobbyist setups and full professional facilities. With equipment budgets of $300-$1,500, these setups enable serious academic research, commercial security testing, and advanced vulnerability assessment. This guide details the optimal configuration for a research-grade EM-SCA laboratory, focusing on the HackRF One and BladeRF platforms that have become standard in university research and professional security assessments.

1. Equipment Specifications & Selection Criteria

1.1 Core SDR Platform Comparison

HackRF One - The Research Workhorse

SpecificationValueSCA Implications
Frequency Range1 MHz - 6 GHzCovers all digital circuit emissions including 5G/6G harmonics
Maximum Sample Rate20 MS/sNyquist limit: 10 MHz signals, sufficient for most digital circuits
ADC/DAC Resolution8 bits (TX: 8 bits)Adequate with proper gain staging and averaging
Bandwidth20 MHz instantaneousCaptures wide spectral features and multiple harmonics
Transmit CapabilityYes (half-duplex)Enables active EM-SCA attacks
MIMO SupportNoSingle-channel operation
Cost$300-$350Exceptional value for capabilities
Community SupportExcellentExtensive documentation, tutorials, and libraries

BladeRF 2.0 Micro - Enhanced Performance

SpecificationValueAdvantage Over HackRF
Frequency Range47 MHz - 6 GHzSimilar coverage
Maximum Sample Rate61.44 MS/s3× faster than HackRF
ADC/DAC Resolution12 bits4 bits more dynamic range (16× better)
Bandwidth56 MHz instantaneous2.8× wider capture bandwidth
Transmit CapabilityYes (full-duplex)Simultaneous transmit/receive
MIMO Support2×2 MIMOSpatial diversity for complex attacks
Cost$650-$750Premium features justify price
FPGA IntegrationXilinx Artix-7On-board signal processing

LimeSDR Mini - Balanced Alternative

SpecificationValuePositioning
Frequency Range10 MHz - 3.5 GHzSlightly narrower than HackRF
Maximum Sample Rate30.72 MS/sBetween HackRF and BladeRF
ADC/DAC Resolution12 bitsMatches BladeRF
Cost$200-$250Most cost-effective 12-bit option
MIMO Support2×2 MIMOExcellent for research
Transmit PowerHigher outputBetter for active attacks

1.2 Measurement Probes & Accessories

Commercial Near-Field Probes

Probe TypeManufacturerModelFrequency RangeCost
Magnetic H-FieldLanger EMVRF-R 0.3-3300 kHz - 3 GHz$200
Electric E-FieldLanger EMVRF-R 0.3-3300 kHz - 3 GHz$200
Differential ProbeTektronixP6248DC - 1.5 GHz$1,500+
Current ProbePearson2877DC - 200 MHz$400
DIY ProfessionalCustom-Up to 1 GHz$50-100

Amplification & Filtering

ComponentModelSpecificationsCost
Low-Noise AmplifierMini-Circuits ZFL-1000LN+20 dB, 1-1000 MHz, 2.9 dB NF$80
Wideband AmplifierMini-Circuits ZHL-424040 dB, 10-4200 MHz$300
Programmable FilterMini-Circuits SLP-100+1-100 MHz low-pass$150
Bandpass Filter SetCustom/SMAVarious frequencies$100-200

1.3 Laboratory Infrastructure

Essential Supporting Equipment

EquipmentPurposeMinimum SpecificationCost
Ground PlaneReference planeCopper sheet (12"×12")$50
Positioning SystemProbe placement3-axis manual stage$100
Shielded EnclosureNoise reductionDIY aluminum mesh cage$150
Power SuppliesClean powerLinear regulators, batteries$100
OscilloscopeTime-domain correlation100 MHz, 1 GS/s$300-500
Signal GeneratorActive attacks1 MHz - 1 GHz$200-400

1.4 Total Cost Configurations

Configuration A: HackRF-Based ($800)

  • SDR: HackRF One ($300)
  • Probes: Langer EMV set ($400)
  • Amplification: ZFL-1000LN+ ($80)
  • Infrastructure: Basic ($100)
  • Total: $880

Configuration B: BladeRF-Based ($1,500)

  • SDR: BladeRF 2.0 Micro ($650)
  • Probes: Mixed commercial/DIY ($300)
  • Amplification: ZHL-4240 ($300)
  • Infrastructure: Enhanced ($250)
  • Total: $1,500

Configuration C: Academic Research ($1,200)

  • SDR: LimeSDR Mini ($250)
  • Probes: Comprehensive set ($500)
  • Amplification/Filters: ($200)
  • Infrastructure/Oscilloscope: ($250)
  • Total: $1,200

2. Laboratory Setup & Calibration

2.1 Physical Laboratory Design

Optimal Layout:

[Shielded Enclosure]
    │
[Target Device] → [Probe Positioner] → [LNA] → [Filters] → [SDR]
    │                                            │
[Ground Plane]                             [Control PC]
    │                                            │
[Power Supplies] ←───────────── [Trigger Sync] ←─┘

Key Design Principles:

  1. Signal Chain Optimization: Minimize cable lengths, use quality SMA connectors
  2. Grounding Strategy: Single-point ground reference for all equipment
  3. Shielding Effectiveness: 40-60 dB attenuation for external interference
  4. Thermal Management: Active cooling for amplifiers and SDRs
  5. Cable Management: Organized routing to minimize cross-talk

2.2 Calibration Procedures

Frequency Response Calibration:

import numpy as np
import matplotlib.pyplot as plt
from hackrf import HackRF

def calibrate_hackrf_response(freq_start=1e6, freq_stop=1e9, num_points=100):
    """Calibrate HackRF frequency response using known signal generator"""
    hackrf = HackRF()
    responses = []
    
    frequencies = np.linspace(freq_start, freq_stop, num_points)
    
    for freq in frequencies:
        # Generate known signal at freq
        signal_gen.set_frequency(freq)
        signal_gen.set_power(-30)  # dBm
        
        # Measure received power
        hackrf.center_freq = freq
        hackrf.sample_rate = 2e6
        samples = hackrf.read_samples(32768)
        
        # Calculate received power
        power = 10*np.log10(np.mean(np.abs(samples)**2))
        responses.append(power)
        
        print(f"Calibrated {freq/1e6:.1f} MHz: {power:.1f} dB")
    
    # Save calibration curve
    np.save('hackrf_calibration.npy', 
            {'frequencies': frequencies, 'responses': responses})
    
    # Plot
    plt.figure(figsize=(12, 6))
    plt.plot(frequencies/1e6, responses)
    plt.xlabel('Frequency (MHz)')
    plt.ylabel('Relative Response (dB)')
    plt.title('HackRF Frequency Response Calibration')
    plt.grid(True)
    plt.savefig('hackrf_calibration.png')
    
    return frequencies, responses

Probe Characterization:

  1. Near-Field Mapping: Measure probe response vs. distance
  2. Directivity Pattern: Characterize angular response
  3. Coupling Coefficient: Quantify probe-target coupling
  4. Resonance Identification: Find and avoid probe resonances

2.3 Software Environment

Professional Toolchain:

# Linux (Ubuntu 22.04+) setup for research-grade SCA
sudo apt update
sudo apt install gnuradio gr-osmosdr hackrf bladeRF \
                 python3-pip python3-dev cmake git

# Install comprehensive Python environment
pip install numpy scipy matplotlib pandas scikit-learn tensorflow \
            torch jupyterlab notebook ipython

# Install SDR libraries
pip install pyhackrf pybladeRF SoapySDR

# Install research SCA tools
git clone https://github.com/newaetech/chipwhisperer
cd chipwhisperer
pip install -e .

git clone https://github.com/google/scaaml
cd scaaml
pip install -e .

# Install signal processing tools
pip install gnuradio gr-scan gr-gsm gr-ieee802-11

Jupyter Research Environment:

# research_notebook.ipynb - Complete analysis pipeline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import signal
from sklearn.ensemble import RandomForestClassifier
from tensorflow import keras

# Import SCA-specific modules
from chipwhisperer.analyzer import attacks
from scaaml.dataset import SCAAMLDataSet
from em_processing import TraceProcessor, FeatureExtractor

3. Advanced Attack Methodologies

3.1 Active Electromagnetic Side-Channel Analysis

Setup for Active EM-SCA:

[HackRF TX] → [Directional Antenna] → [Target Device] 
                                     ↓
[Impedance Variations] → [Reflected Waves] → [HackRF RX]

Python Implementation (Active Attack):

class ActiveEMSCA:
    def __init__(self, tx_freq=100e6, rx_freq=100e6, power=0):
        self.tx_freq = tx_freq
        self.rx_freq = rx_freq
        self.power = power  # dBm
        
    def perform_active_attack(self, target_device):
        """Perform active EM-SCA using HackRF transmit capability"""
        # Configure HackRF for simultaneous TX/RX (half-duplex switching)
        hackrf = HackRF()
        
        # Transmit continuous wave
        hackrf.setup_transmit(self.tx_freq, sample_rate=2e6, 
                              tx_gain=self.power)
        hackrf.start_transmit(np.ones(10000, dtype=np.complex64))
        
        # Switch to receive
        time.sleep(0.001)  # Allow settling
        hackrf.setup_receive(self.rx_freq, sample_rate=20e6)
        
        # Capture reflected signal during cryptographic operation
        trigger_crypto_operation(target_device)
        reflected_signal = hackrf.read_samples(256*1024)
        
        # Analyze impedance variations
        impedance_changes = analyze_reflections(reflected_signal)
        
        return impedance_changes
    
    def analyze_reflections(self, signal):
        """Extract impedance variation information"""
        # Demodulate reflected signal
        iq = signal * np.exp(-1j*2*np.pi*self.tx_freq*np.arange(len(signal))/20e6)
        
        # Extract amplitude/phase variations
        amplitude = np.abs(iq)
        phase = np.angle(iq)
        
        # Correlate with cryptographic operations
        correlation = np.correlate(amplitude, crypto_operation_template, 'same')
        
        return {
            'amplitude_variations': amplitude,
            'phase_variations': phase,
            'correlation_peak': np.max(correlation)
        }

3.2 Multi-Channel & MIMO Attacks

BladeRF 2×2 MIMO Setup:

import numpy as np
from bladerf import BladeRF

class MIMOEMAttack:
    def __init__(self):
        self.dev = BladeRF()
        self.dev.set_gain(1, 'LNA', 30)  # Channel 1
        self.dev.set_gain(2, 'LNA', 30)  # Channel 2
        
    def capture_spatial_diversity(self, target_freq=50e6):
        """Capture EM emissions from multiple spatial positions"""
        # Configure MIMO
        self.dev.set_frequency(1, target_freq)
        self.dev.set_frequency(2, target_freq)
        self.dev.set_sample_rate(1, 10e6)
        self.dev.set_sample_rate(2, 10e6)
        
        # Synchronized capture
        sync_samples = self.dev.sync_rx(1, 2, 32768)
        ch1_samples = sync_samples[0]
        ch2_samples = sync_samples[1]
        
        # Spatial analysis
        spatial_correlation = np.corrcoef(ch1_samples, ch2_samples)[0, 1]
        phase_difference = np.mean(np.angle(ch1_samples * np.conj(ch2_samples)))
        
        return {
            'channel1': ch1_samples,
            'channel2': ch2_samples,
            'spatial_correlation': spatial_correlation,
            'phase_difference': phase_difference
        }

3.3 High-Speed Correlation Analysis

Real-time Correlation Engine:

from numba import jit, cuda
import cupy as cp

@jit(nopython=True, parallel=True)
def high_speed_correlation(traces, hypothetical):
    """GPU-accelerated correlation for large trace sets"""
    n_traces, n_samples = traces.shape
    correlations = np.zeros((n_traces, n_samples))
    
    for i in range(n_traces):
        for j in range(n_samples):
            # Pearson correlation
            cov = np.cov(traces[i, j:j+100], hypothetical[i, j:j+100])
            var_trace = np.var(traces[i, j:j+100])
            var_hyp = np.var(hypothetical[i, j:j+100])
            correlations[i, j] = cov[0, 1] / np.sqrt(var_trace * var_hyp)
    
    return correlations

# GPU version using CuPy
def gpu_correlation(traces_gpu, hypothetical_gpu):
    """CUDA-accelerated correlation"""
    traces_cp = cp.array(traces_gpu)
    hyp_cp = cp.array(hypothetical_gpu)
    
    # Batch correlation computation
    correlation_matrix = cp.corrcoef(traces_cp, hyp_cp)
    
    return cp.asnumpy(correlation_matrix)

3.4 Machine Learning Pipeline

Complete Deep Learning Framework:

import tensorflow as tf
from tensorflow.keras import layers, models, callbacks

class SCADeepLearning:
    def __init__(self, input_shape, num_classes=256):
        self.input_shape = input_shape
        self.num_classes = num_classes
        self.model = self.build_hybrid_model()
        
    def build_hybrid_model(self):
        """Hybrid CNN-LSTM model for EM trace analysis"""
        inputs = layers.Input(shape=self.input_shape)
        
        # CNN feature extraction
        x = layers.Conv1D(64, 3, activation='relu', padding='same')(inputs)
        x = layers.BatchNormalization()(x)
        x = layers.MaxPooling1D(2)(x)
        
        x = layers.Conv1D(128, 3, activation='relu', padding='same')(x)
        x = layers.BatchNormalization()(x)
        x = layers.MaxPooling1D(2)(x)
        
        x = layers.Conv1D(256, 3, activation='relu', padding='same')(x)
        x = layers.BatchNormalization()(x)
        x = layers.GlobalAveragePooling1D()(x)
        
        # LSTM temporal analysis
        y = layers.Reshape((-1, 1))(inputs)
        y = layers.LSTM(64, return_sequences=True)(y)
        y = layers.LSTM(32)(y)
        
        # Combine features
        combined = layers.Concatenate()([x, y])
        
        # Dense layers
        z = layers.Dense(256, activation='relu')(combined)
        z = layers.Dropout(0.3)(z)
        z = layers.Dense(128, activation='relu')(z)
        z = layers.Dropout(0.3)(z)
        
        # Output
        outputs = layers.Dense(self.num_classes, activation='softmax')(z)
        
        model = models.Model(inputs=inputs, outputs=outputs)
        
        return model
    
    def train_with_augmentation(self, traces, labels, validation_split=0.2):
        """Training with trace augmentation"""
        # Data augmentation
        augmented_traces = self.augment_traces(traces)
        
        # Train-test split
        X_train, X_val, y_train, y_val = train_test_split(
            augmented_traces, labels, test_size=validation_split
        )
        
        # Compile
        self.model.compile(
            optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy']
        )
        
        # Callbacks
        callbacks_list = [
            callbacks.EarlyStopping(patience=15, restore_best_weights=True),
            callbacks.ReduceLROnPlateau(factor=0.5, patience=5),
            callbacks.ModelCheckpoint('best_model.h5', save_best_only=True)
        ]
        
        # Train
        history = self.model.fit(
            X_train, y_train,
            validation_data=(X_val, y_val),
            epochs=100,
            batch_size=32,
            callbacks=callbacks_list,
            verbose=1
        )
        
        return history
    
    def augment_traces(self, traces):
        """Augment trace dataset for improved generalization"""
        augmented = []
        
        for trace in traces:
            # Original
            augmented.append(trace)
            
            # Add noise
            noisy = trace + np.random.normal(0, 0.01, trace.shape)
            augmented.append(noisy)
            
            # Time shift
            shifted = np.roll(trace, np.random.randint(-10, 10))
            augmented.append(shifted)
            
            # Amplitude scaling
            scaled = trace * np.random.uniform(0.9, 1.1)
            augmented.append(scaled)
        
        return np.array(augmented)

4. Research Applications & Case Studies

4.1 Academic Research Projects

Project 1: IoT Device Security Assessment

  • Target: Commercial IoT devices (smart plugs, cameras, sensors)
  • Equipment: HackRF + Langer probes + custom amplification
  • Methodology: Passive EM collection during firmware updates
  • Findings: 3/5 devices leaked encryption keys during OTA updates
  • Publication: Conference paper, CVEs assigned

Project 2: Automotive ECU Analysis

  • Target: Automotive Engine Control Units
  • Challenges: High-temperature environments, complex shielding
  • Solutions: High-gain probes, temperature compensation
  • Results: Identified diagnostic protocol vulnerabilities
  • Impact: Manufacturer security improvements implemented

Project 3: FPGA Cryptographic Implementations

  • Target: Xilinx/Intel FPGA crypto cores
  • Setup: BladeRF MIMO + high-speed oscilloscope correlation
  • Technique: Template attacks on AES-GCM implementations
  • Success: Key recovery in 2,000 traces (vs. 50,000 theoretical)
  • Contribution: New countermeasure design guidelines

4.2 Commercial Security Testing

Service Offering Structure:

  1. Basic Assessment ($2,000-5,000):

    • Passive EM leakage analysis
    • Basic countermeasure recommendations
    • Executive summary report
  2. Comprehensive Testing ($10,000-20,000):

    • Active + passive EM-SCA
    • Countermeasure effectiveness testing
    • Detailed technical report
    • Remediation support
  3. Certification Preparation ($15,000-30,000):

    • Full Common Criteria/FIPS 140-3 preparation
    • Documentation and evidence generation
    • Pre-certification testing

Client Industries:

  • Finance: POS terminals, ATMs, payment cards
  • Healthcare: Medical devices, patient monitors
  • Industrial: PLCs, SCADA systems, IoT sensors
  • Consumer: Smart home devices, wearables
  • Government: Secure communications, encryption devices

5. Laboratory Management & Best Practices

5.1 Quality Assurance Procedures

Daily Calibration Checklist:

  1. SDR Health Check: Verify sample rates, frequency accuracy
  2. Probe Integrity: Test probe response with reference signal
  3. Amplifier Linearity: Check gain flatness across band
  4. Noise Floor: Verify ambient noise levels
  5. Ground Continuity: Test ground connections

Monthly Maintenance:

  1. Connector Inspection: Check SMA/BNC connectors for wear
  2. Cable Testing: Verify cable integrity with TDR
  3. Software Updates: Update drivers, libraries, tools
  4. Backup Procedures: Backup calibration data, configurations
  5. Safety Inspection: Verify electrical safety, shielding

5.2 Data Management

Trace Database Organization:

/sca_lab_data/
├── raw_traces/
│   ├── project_1/
│   │   ├── device_a/
│   │   │   ├── trace_0001.npy
│   │   │   ├── metadata_0001.json
│   │   │   └── capture_log.txt
│   │   └── device_b/
├── processed_traces/
├── analysis_results/
├── calibration_data/
└── reports/

Metadata Standard:

{
  "trace_metadata": {
    "project_id": "iot_assessment_2026",
    "device": "smart_plug_v2",
    "operation": "aes_encryption",
    "timestamp": "2026-04-12T14:30:00Z",
    "capture_params": {
      "sdr": "hackrf_serial_1234",
      "center_freq": 100e6,
      "sample_rate": 20e6,
      "gain": 30,
      "probe": "langer_magnetic_1",
      "probe_position": "ic_power_pin"
    },
    "crypto_params": {
      "algorithm": "AES-128",
      "mode": "ECB",
      "key": "known_for_profiling",
      "plaintext": "randomized"
    }
  }
}

5.3 Safety Protocols

Electrical Safety:

  1. Isolation Transformers: Use for all line-powered devices
  2. Ground Fault Protection: GFCI on all outlets
  3. Current Limiting: Fuses on power supplies
  4. High-Voltage Warning: Clear labeling >50V circuits

RF Safety:

  1. Exposure Limits: Follow FCC/IEEE guidelines
  2. Shielding Verification: Test enclosure effectiveness
  3. Warning Signs: Post RF hazard warnings
  4. Access Control: Restrict laboratory access

6. Funding & Resource Acquisition

6.1 Grant Writing for Academic Labs

NSF Proposal Elements:

  1. Intellectual Merit: Novel attack methodologies, countermeasure design
  2. Broader Impacts: Student training, industry collaboration
  3. Research Plan: Detailed methodology, timeline, deliverables
  4. Budget Justification: Equipment, personnel, materials

Typical Grant Budget ($50,000-100,000):

  • Equipment: $20,000 (SDRs, probes, oscilloscopes)
  • Personnel: $30,000 (graduate student support)
  • Materials: $5,000 (target devices, components)
  • Travel: $5,000 (conference attendance)
  • Indirect Costs: $10,000 (university overhead)

6.2 Industry Partnerships

Collaboration Models:

  1. Sponsored Research: Company funds specific research project
  2. Equipment Donations: Vendors provide equipment for evaluation
  3. Internship Programs: Students work on company-relevant problems
  4. Joint Publications: Collaborative research papers

Benefits to Companies:

  • Early access to research findings
  • Trained workforce (students become employees)
  • Enhanced product security
  • Competitive advantage through advanced testing

7. Future Directions & Upgrades

7.1 Technology Roadmap

Short-term (1-2 years):

  • Quantum-Safe Crypto Analysis: Post-quantum algorithm assessment
  • AI/ML Integration: Automated attack optimization
  • Standardized Testing: Common methodology development

Medium-term (3-5 years):

  • Integrated Systems: Combined EM/power/timing analysis
  • Real-time Monitoring: Continuous security assessment
  • Cloud Integration: Remote testing capabilities

Long-term (5+ years):

  • Quantum SCA: Quantum-enhanced side-channel analysis
  • Autonomous Systems: AI-driven complete assessment
  • Global Standards: International SCA testing standards

7.2 Equipment Upgrade Path

TimelineUpgradeBudgetCapability Gain
Year 1Additional SDRs$500-1,000Parallel testing
Year 2Professional probes$1,000-2,000Measurement accuracy
Year 3Vector signal analyzer$5,000-10,000Advanced modulation analysis
Year 4Anechoic chamber$10,000-20,000Controlled environment
Year 5Full professional lab$50,000+Commercial testing capabilities

8. Conclusion

Research-grade electromagnetic side-channel analysis laboratories represent the sweet spot for serious security research, offering professional capabilities at academic budgets. The $300-$1,500 setups described in this guide enable groundbreaking research, meaningful security assessment, and valuable educational experiences.

The democratization of professional SCA tools through platforms like HackRF and BladeRF has fundamentally changed hardware security research, making what was once exclusive to government and corporate labs accessible to universities, startups, and independent researchers. This guide provides both the technical details and the strategic framework needed to establish and operate a successful research-grade EM-SCA laboratory.

9. References & Resources

9.1 Academic References

  • Kitazawa, T., et al. (2026). "Active Electromagnetic Side-Channel Analysis: Crossing Physical Security Boundaries through Impedance Variations." IACR TCHES.
  • Karayalçin, S. (2025). "SoK: Deep Learning-based Physical Side-channel Analysis." IACR ePrint.
  • Robyns, P., et al. (2019). "Performing Low-cost Electromagnetic Side-channel Attacks using RTL-SDR and Neural Networks." FOSDEM.

9.2 Equipment Suppliers

  • Great Scott Gadgets: HackRF One and accessories
  • Nuand: BladeRF platforms
  • Lime Microsystems: LimeSDR products
  • Mini-Circuits: Amplifiers, filters, components
  • Langer EMV: Professional near-field probes

9.3 Software Resources

  • GNU Radio: Signal processing framework
  • ChipWhisperer: Complete SCA platform
  • SCAAML: Google's ML framework for SCA
  • SoapySDR: Vendor-neutral SDR API
  • Jupyter: Interactive research environment

9.4 Professional Organizations

  • IACR: International Association for Cryptologic Research
  • IEEE Signal Processing Society
  • ACM Special Interest Group on Security
  • EMC Society: Electromagnetic compatibility professionals

This guide is intended for legitimate security research and educational purposes. Always ensure proper authorization for testing, comply with applicable laws, and follow ethical guidelines in all research activities.