MuhammadTaha305/ascon-128-side-channel-analysis
GitHub: MuhammadTaha305/ascon-128-side-channel-analysis
针对 ASCON-128 轻量级密码的 ARM Cortex-M3 实现进行端到端的模板化深度学习侧信道攻击与密钥恢复研究项目。
Stars: 1 | Forks: 0
# ASCON-128 的侧信道分析
针对 **ASCON-128**(NIST 轻量级密码标准)从头编写的 C 语言实现的完整**模板化深度学习侧信道攻击**。该流水线将密码算法编译为 ARM Cortex-M3 目标代码,在模拟器中生成合成功耗轨迹,并训练神经网络从泄漏信息中恢复密钥信息。
## 演示内容
在真实标准化密码算法上的端到端模板化 SCA 工作流:**C 语言实现 → ARM 构建 → 模拟轨迹生成 → 深度学习密钥恢复 → 安全性分析。**
目标中间值是初始化阶段的第一个 ASCON S-box 输出,此时密钥首次被混合到 320 位状态中。其 Hamming weight 调制了模拟的动态功耗,从而产生了深度学习模型可以利用的泄漏。
## 结果
两种场景,每种均包含 5,000 条分析轨迹 + 1,000 条攻击轨迹(基于 9 个 Hamming weight 分类的 MLP,训练 50 个 epoch):
| 场景 | 攻击准确率 | 平均密钥排名 | 解释 |
|---|:---:|:---:|---|
| **固定密钥** | **93.90%** | 1.90 | 正确的密钥假设始终位于前 2 名 —— 仅需少量轨迹即可实现恢复 |
| **随机密钥** | **87.30%** | **1.00** | 完美的平均排名 —— 模型学习到了*独立于密钥*的 HW 泄漏,可泛化至未知密钥 |
| 固定密钥模型应用于随机密钥数据(交叉评估) | 37.20% | — | 固定密钥模型**无法**泛化 —— 典型的模板化 SCA 过拟合 |
**核心发现:** 尽管原始准确率较低,但随机密钥模型取得了比固定密钥模型*更好*的平均密钥排名(1.00 对比 1.90)。通过在多个随机密钥上进行训练,它被迫学习可泛化的 Hamming weight 泄漏关系,而不是记忆单一密钥的功耗模板 —— 并且 37.20% 的交叉评估结果证实了固定密钥模型对其特定密钥发生了过拟合。
### 模拟功耗轨迹(Rainbow Cortex-M3,Hamming weight 模型)
| 固定密钥 | 随机密钥 |
|---|---|
|  |  |
指令 ~10 和 ~250 附近的尖峰对应于初始化和 S-box 置换阶段。随机密钥轨迹在指令 ~50 之后分歧更大,反映了每次执行时使用的密钥材料不同。
### 训练曲线
| 固定密钥 | 随机密钥 |
|---|---|
|  |  |
固定密钥模型平滑收敛;由于密钥的多样性,随机密钥的验证曲线波动较大,但最终趋于稳定 —— 证明了模型实现了真正的泛化,而不仅仅是记忆。
## 流水线
```
ascon128.c ──arm-none-eabi-gcc──► ascon128.elf
│
LIEF locates key/nonce/main symbols
│
Rainbow (Unicorn) Cortex-M3 emulator + HW leakage
│
fixed_key_traces.h5 / variable_key_traces.h5
│
MLP (TensorFlow/Keras)
│
key-rank analysis ──► recovered key-byte ranking
```
### 1. 密码实现 — `src/ascon128.c`
根据规范编写的 ASCON-128:320 位状态由五个 `uint64_t` 字组成,p¹²(初始化/终结化)和 p⁶(数据)共享参数化的轮置换函数,位切片 S-box(无查找表,恒定时间),以及线性扩散层。`key`/`nonce` 是全局符号,以便模拟器可以在运行时注入值。为 ARM Cortex-M3 构建:
```
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -g -o ascon128.elf ascon128.c --specs=nosys.specs
```
### 2. 轨迹生成 — `src/generate_traces.py`
使用 LIEF 解析 ELF 文件,将其加载到 Rainbow STM32F2 (Cortex-M3) 模拟器中,并在每次加密时注入 key/nonce,运行 `main`,并将每条指令的寄存器 Hamming weight(+ 高斯噪声,σ=0.5)记录为 400 个采样点的轨迹。生成固定密钥集(一个恒定密钥)和随机密钥集(每条轨迹使用唯一的随机密钥),每个集合包含 5,000 条分析轨迹 + 1,000 条攻击轨迹,以 HDF5 格式存储。
### 3. 深度学习攻击 — `src/attack_fixed_key.py`, `src/attack_variable_key.py`
基于 9 个 Hamming weight 分类的 MLP 分类器(Dense + BatchNorm + Dropout),在分析轨迹上进行训练,并在攻击集上进行评估。每个脚本都会报告攻击准确率并运行密钥排名分析(对随机子集的模型预测求平均值,并在排名输出中定位真实类别)。随机密钥脚本还额外将保存的固定密钥模型在随机密钥数据上进行交叉评估。训练好的模型位于 `models/` 中。
## 仓库结构
```
.
├── src/
│ ├── ascon128.c # ASCON-128 in C (ARM Cortex-M3 target)
│ ├── generate_traces.py # Rainbow/Unicorn emulated trace generation
│ ├── attack_fixed_key.py # fixed-key profiled attack + key rank
│ └── attack_variable_key.py # variable-key attack + cross-evaluation
├── models/
│ ├── model_fixed_key.h5 # trained fixed-key MLP
│ └── model_variable_key.h5 # trained variable-key MLP
├── assets/ # result figures
└── docs/
├── Lab11_ASCON_SCA_report.pdf # full ASCON report (this project)
└── Lab08_XOR_SCA_report.pdf # precursor: end-to-end SCA on a 128-bit XOR cipher
```
## 背景 — XOR 密码前身(实验 08)
本项目建立在之前的端到端 SCA 练习(`docs/Lab08_XOR_SCA_report.pdf`)基础之上,该练习针对更简单的 128 位 XOR 密码建立了相同的流水线:C 语言实现 → 模拟 → 生成 HW 泄漏轨迹 → MLP 密钥恢复。之前的工作攻击了单个密钥字节,在固定密钥情况下达到了 100% 的恢复率(排名 0),而在更严格的每条轨迹使用唯一密钥的随机密钥设置下达到了约 1.7%。ASCON-128 将相同的方法论扩展到了非线性的、NIST 标准化的密码算法上。
## 运行方式
```
pip install numpy h5py tensorflow matplotlib lief donjon-rainbow unicorn
# 1. 构建 ELF(需要 ARM GCC 工具链)
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -g -o ascon128.elf src/ascon128.c --specs=nosys.specs
# 2. 生成 traces(写入 fixed_key_traces.h5 / variable_key_traces.h5)
python src/generate_traces.py
# 3. 运行 attacks
python src/attack_fixed_key.py
python src/attack_variable_key.py
```
## 安全启示
ASCON-128 的理论安全性**并不**代表实现上的安全性。未受保护的软件实现会通过(模拟的)功耗泄漏可利用的 Hamming weight 信息,而模板化模型仅需少量轨迹即可恢复密钥信息。在嵌入式硬件上的实际部署需要采取防御措施:**掩码**(随机化中间值以使功耗与秘密数据去相关化),**隐藏**(随机化时间 / 插入伪操作),以及**算法噪声注入**以降低轨迹信噪比(SNR)。
## 技术栈
C (ARM Cortex-M3) · arm-none-eabi-gcc · Rainbow / Unicorn 模拟器 · LIEF · TensorFlow/Keras · NumPy · h5py · matplotlib
## 作者
Muhammad Taha (467244), BSCS-13A — NUST SEECS, CS-360 网络安全。
标签:侧信道攻击, 密码学, 嵌入式安全, 手动系统调用, 深度学习, 逆向工具