KelvinWCH/keyboard-acoustic-side-channel-attack
GitHub: KelvinWCH/keyboard-acoustic-side-channel-attack
一个基于 CoAtNet 和梅尔频谱图的键盘声学侧信道攻击端到端项目,通过麦克风实时捕获击键声并识别按键内容。
Stars: 0 | Forks: 0
# 键盘声学侧信道攻击
一个小型的端到端项目,通过训练 CoAtNet 图像分类器来识别按下按键时产生的声音,然后对麦克风输入运行实时推理。可选的本地 LLM(Ollama + Gemma)可以将原始字符流清理为可读文本。
该流程遵循 Harrison 等人 (2023) 的方案——录制击键声,将每次按键转化为梅尔频谱图图像,微调预训练的 CoAtNet-0,并将该模型用作实时声学键盘记录器。
## 流程
```
1_collect/ record.py raw audio, 25 presses per key
2_preprocess/ isolate.py split each recording into per-keystroke clips
spectrogram.py convert clips to 224x224 mel-spectrogram PNGs
3_train/ train.py fine-tune CoAtNet-0 on the spectrograms
4_infer/ infer.py live mic inference + LLM text correction
```
数据依次流经 `data/raw/`、`data/isolated/`、`data/spectrograms/`,训练好的模型保存在 `models/coatnet_keystrokes.pth` 中。
## 环境设置
```
pip install -r requirements.txt
```
在配备 CUDA 12 (RTX 4070) 的环境下基于 Python 3.11 进行了测试。CPU 也可运行,但训练速度要慢得多。
实时推理还需要:
- 一个靠近键盘的麦克风
- 可选:在本地运行带有 `gemma4:e2b` 模型的 [Ollama](https://ollama.com/),用于进行 LLM 文本纠错
## 用法
为 36 个按键 (a-z, 0-9) 各录制 25 次按键声音:
```
python 1_collect/record.py
```
分割为单次击键的音频片段并生成频谱图:
```
python 2_preprocess/isolate.py
python 2_preprocess/spectrogram.py
```
训练:
```
python 3_train/train.py
```
运行实时推理:
```
python 4_infer/infer.py
```
### 独立验证集会话
对单次录制会话进行随机划分验证会严重高估准确率,因为训练集/验证集的音频片段来自相同的麦克风位置、打字节奏和环境噪音。为了获得符合实际的指标,请录制第二次会话并将其用于验证:
```
python 1_collect/record.py --output-dir data/raw_holdout
python 2_preprocess/isolate.py --raw-dir data/raw_holdout --output-dir data/isolated_holdout
python 2_preprocess/spectrogram.py --input-dir data/isolated_holdout --output-dir data/spectrograms_holdout
python 3_train/train.py --val-dir data/spectrograms_holdout
```
## 方法
- **音频**:44.1 kHz 单声道,100 ms 的音频片段经过居中处理,使击键声位于窗口的约 25% 处。
- **特征**:128 频带的梅尔频谱图 (对数功率,n_fft=2048,hop=512),渲染为 224x224 的 PNG 图像,以匹配 CoAtNet 的输入尺寸。
- **模型**:CoAtNet-0(来自 `timm` 的 `coatnet_0_rw_224`),在 ImageNet 上预训练,分两个阶段进行微调——先冻结主干网络训练 10 个 epoch,然后以 0.1 倍的学习率进行端到端训练 54 个 epoch。
- **数据增强**:微小的水平平移 + 两次 RandomErasing 传递(一次为块状,一次为细长垂直状——近似于在渲染的频谱图上应用 SpecAugment)。
- **损失**:带有标签平滑 (0.1) 的交叉熵,AdamW 优化器,余弦学习率调度。
- **音频隔离**:隔离程序对每次录音进行能量阈值的二分查找,使其无论按键间的音量差异如何,都能准确找到约 25 次按键动作。
- **实时对齐**:推理回调会延迟提取音频片段,直到累积了约 75 ms 的峰值后音频,从而使击键声落在窗口 25% 的位置——与训练期间的对齐方式相匹配。
## 结果
在使用单次录制会话并进行 80/20 随机划分的情况下,验证准确率最高可达约 81%。这一数值过于乐观:来自同一次会话的片段高度相关,因此这种划分方式衡量的更多是记忆能力而非泛化能力。在单独录制的会话上,准确率会大幅降低——这才是实际攻击中真正重要的指标,也是 `--val-dir` 标志存在的原因。
## 相关工作
- **Dai, Liu, Le, and Tan (2021).** *CoAtNet: Marrying Convolution and Attention for All Data Sizes.* NeurIPS。本项目使用的主干架构——深度卷积与相对自注意力机制的混合体。arXiv:2106.04803。
- **Park, Ayati, and Cai (2025).** *Improving Acoustic Side-Channel Attacks on Keyboards Using Transformers and Large Language Models.* arXiv preprint。使用视觉 Transformer 进行击键分类,并使用 LLM 对预测的字符流进行纠错——与本文采用的相同的两阶段设置(分类器 + LLM 清理)。arXiv:2502.09782。
## 注意事项与说明
- 本仓库是一个学习项目,而非正式的研究成果。数据集非常小(每次按键 25 次录音,仅一个会话),除非您使用 `--val-dir` 引入单独的会话,否则评估方法是偏于乐观的。
- LLM 纠错步骤(通过 Ollama 运行的 Gemma)是可选的,有助于弥补在长文本打字序列中的识别错误。它不包含在模型的准确率指标中。
- 请仅在您自己的键盘和录音上使用本项目。
标签:AI风险缓解, Apex, CoAtNet, CUDA, DLL 劫持, DOS头擦除, Gemma, LLM评估, Ollama, Python, Vectored Exception Handling, 侧信道攻击, 信息窃取, 凭据扫描, 击键声学, 击键识别, 命令控制, 图像分类, 声学攻击, 声音分类, 大语言模型, 实时推理, 密码破解, 数据采集, 无后门, 机器学习, 梅尔频谱图, 深度学习, 端到端项目, 网络安全, 逆向工具, 键盘录音, 隐私保护, 隐私泄露, 音频处理