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, 侧信道攻击, 信息泄露, 凭据扫描, 击键识别, 声学攻击, 密码窃取, 数据增强, 机器学习, 模型改进, 注意力机制, 深度学习, 网络安全, 计算机视觉, 逆向工具, 键盘监听, 隐私保护, 音频分类