c5ln/ASMR

GitHub: c5ln/ASMR

基于MaxViT-S的键盘声学侧信道攻击复现,通过手机录音识别按键音频实现36键分类。

Stars: 0 | Forks: 0

# 基于 MaxViT 的键盘声学侧信道攻击 复现 **"A Practical Deep Learning-Based Acoustic Side Channel Attack on Keyboards"** (Harrison 等人, 2023),并将 **CoAtNet 替换为 MaxViT-S** (Tu 等人, 2022)。 给定一段手机录制的 MacBook Pro 按键音频,该模型可以分类出按下的 36 个键(0–9,A–Z)中的哪一个——在无需直视键盘的情况下实现这一目标。 ## 概述 ### 原始论文 vs. 本实现 | | Harrison 等人 (2023) | 本仓库 | |---|---|---| | 模型 | CoAtNet | **MaxViT-S** | | 输入 | 2 通道 Mel-spectrogram 64×64 | 相同,调整为 224×224 | | 类别 | 36 (0–9, A–Z) | 相同 | | 数据集 | MacBook Pro(手机录制) | 相同 (`MBPWavs/`) | | 数据增强 | 时间偏移 + SpecAugment | 相同 | ### 流程 ``` WAV files → Keystroke Isolation (adaptive threshold) → Time Shift Augmentation (±40%) → 2-Channel Mel-Spectrogram (64×64) → SpecAugment (frequency + time masking) → Resize 224×224 → MaxViT-S (36 classes) ``` ## MaxViT-S 架构 MaxViT (Multi-Axis Vision Transformer) 在每个阶段将 MBConv 模块与**局部块注意力**和**全局网格注意力**交替结合,从而以非二次方的代价实现局部和全局特征提取。 | 阶段 | 输出 | 通道数 | 头数 | 模块 | |-------|--------|----------|-------|--------| | Stem | 112×112 | 64 | — | Conv ×2 | | S1 | 56×56 | 96 | 3 | ×2 | | S2 | 28×28 | 192 | 6 | ×2 | | S3 | 14×14 | 384 | 12 | ×5 | | S4 | 7×7 | 768 | 24 | ×2 | | Head | — | — | — | GlobalAvgPool → FC(36) | - 分区大小 P = 网格大小 G = 7 → 需要 224×224 的输入 - 约 69M 可训练参数 - 从头开始训练(无预训练权重) ## 数据集 `MBPWavs/` 包含 36 个立体声 `.wav` 文件 (44100 Hz),每个文件对应一个键。 每个文件包含通过手机麦克风录制的 25 次按键记录。 ``` MBPWavs/ ├── 0.wav ← 25 presses of key '0' ├── 1.wav ├── ... ├── A.wav ├── ... └── Z.wav ``` 总计:**900 个样本** —— 按 80 / 10 / 10 的比例划分(训练集 / 验证集 / 测试集)。 ## 预处理 ### 1. 按键隔离 基于能量的峰值检测,带有自适应阈值循环: ``` # 来自论文的 Algorithm 1 prom = 0.06 while len(strokes) != 25: strokes = isolator(signal, threshold=prom, before=2400, after=12000) if len(strokes) < 25: prom -= step else: prom += step ``` 每个隔离出的按键:`(2 个通道, 14400 个采样点)` ≈ 0.33 秒 ### 2. Mel-Spectrogram ``` librosa.feature.melspectrogram(y, sr=44100, n_mels=64, n_fft=1024, hop_length=225) # → 每个通道 (64, 64) → 堆叠 → (2, 64, 64) → 调整大小 → (2, 224, 224) ``` ### 3. 数据增强 (仅限训练集) - **时间偏移**:随机滚动 ±40% 的按键长度 - **SpecAugment**:2 个频率掩码 + 2 个时间掩码,每个掩码最大覆盖 10% 的轴宽 ## 安装 ``` pip install -r requirements.txt ``` 需要 Python 3.9+ 和 PyTorch 2.0+。建议使用 GPU。 ## 使用说明 ### 训练 ``` python train.py ``` 关键参数: | 参数 | 默认值 | 描述 | |---|---|---| | `--wav_dir` | `MBPWavs` | 按键 WAV 文件的路径 | | `--epochs` | `100` | 训练 epoch 数 | | `--batch_size` | `16` | 批量大小 | | `--lr` | `5e-4` | 初始学习率(线性衰减至 ×0.01) | | `--val_every` | `5` | 验证间隔 (epoch) | | `--checkpoint_dir` | `checkpoints` | 输出目录 | 示例 —— 复现论文设置 (1100 个 epoch): ``` python train.py --epochs 1100 --lr 5e-4 ``` ### 输出 ``` checkpoints/ ├── best.pt # Best checkpoint (by val accuracy) ├── training_log.csv # Per-epoch loss and accuracy ├── training_curves.png # Loss / accuracy plot └── confusion_matrix.png # 36×36 confusion matrix (test set) ``` ### 验证模型 ``` python model.py # MaxViT-S 可训练参数:69.0M # Input: torch.Size([2, 2, 224, 224]) → Output: torch.Size([2, 36]) ``` ## 文件结构 ``` . ├── MBPWavs/ # Raw keystroke recordings (36 × .wav) ├── dataset.py # Keystroke isolation, mel-spectrogram, Dataset/DataLoader ├── model.py # MaxViT-S wrapper (timm) ├── train.py # Training loop, evaluation, plots ├── requirements.txt └── checkpoints/ # Auto-created during training ``` ## 参考文献 - Harrison, J., Toreini, E., & Mehrnezhad, M. (2023). *A Practical Deep Learning-Based Acoustic Side Channel Attack on Keyboards*. IEEE EuroS&P. - Tu, Z., Talebi, H., Zhang, H., Yang, F., Milanfar, P., Bovik, A., & Li, Y. (2022). *MaxViT: Multi-Axis Vision Transformer*. ECCV 2022.
标签:Apex, CoAtNet, MaxViT, MBConv, Mel频谱图, Vision Transformer, 侧信道攻击, 信息泄露, 凭据扫描, 击键识别, 声学攻击, 密码窃取, 数据增强, 机器学习, 模型改进, 注意力机制, 深度学习, 网络安全, 计算机视觉, 逆向工具, 键盘监听, 隐私保护, 音频分类