fsegatz/kybesp32
GitHub: fsegatz/kybesp32
该项目在 ESP32 微控制器上高效实现了 CRYSTALS-KYBER 后量子密钥封装机制,并提供了单核、双核及硬件加速器三种优化方案的性能基准。
Stars: 16 | Forks: 4
# Kybesp32 “CRYSTALS-KYBER 密钥封装机制在 ESP32 上的高效实现”
**作者:** Fabian Segatz & Muhammad Ihsan Al Hafiz
本研究项目是作为斯德哥尔摩 KTH 的 [II2202,研究方法与科技写作](https://www.kth.se/student/kurser/kurs/II2202?l=en) 课程的一部分进行的,旨在获取在信息与通信技术相关领域进行科学研究的知识。我们选择了“CRYSTALS-KYBER 密钥封装机制在 ESP32 上的高效实现”这一主题,因为它不仅具有相关性,而且具有足够的开放性,使得在 8 周的时间内、每人每周投入 20 小时的工作量后,能够展示有意义的研究成果。
在项目进行过程中,两位作者学到了大量关于密码学的知识,包括密码学在快速发展的量子计算机技术中所面临的挑战,以及使用 FreeRTOS 和 ESP-IDF 在 ESP32 平台上实现和优化算法的过程。随着项目的深入,我们遇到了许多悬而未决的问题,希望在将来能进一步研究。
最后,我们要感谢 [Masoumeh (Azin) Ebrahimi 副教授](https://orcid.org/0000-0001-7877-6712) 给予我们的惊人支持、指导
和建议,特别是她为我们和其他小组投入的大量时间。
## 构建说明
我们推荐使用 [ESP-IDF 的 VSCode 插件](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/vscode-setup.html)。它允许轻松设置 ESP-IDF 框架,从而可以为任何 ESP32 开发板配置项目。
或者,您也可以按照[官方文档](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html#get-started-windows-first-steps)来设置 ESP-IDF。
## 文件夹内容
以下是项目文件夹中文件的简短概述。
```
├── components
│ ├── indcpa
│ ├── kem
│ ├── ...
├── main
│ ├── CMakeLists.txt
│ └── main.c
├── .gitignore
├── CMakeLists.txt
└── README.md This is the file you are currently reading
```
**kybesp32** 项目包含一个 C 语言源文件 [main.c](main/main.c)。该文件位于 [main](main) 文件夹中。此文件包含程序入口点 `app_main()`。
components 文件夹包含了 Kyber 算法所需的所有原语。我们要重点介绍 `indcpa` 组件,它包含了公钥加密 (PKE) 的所有功能;以及 `kem` 组件,它定义了密钥封装机制 (KEM)。
ESP-IDF 项目使用 CMake 构建。项目的构建配置包含在 `CMakeLists.txt`
文件中,这些文件提供了一组指令和说明,用于描述项目的源文件和目标
(可执行文件、库或两者兼有)。
## 测试结果
我们使用了 5.0 版本的 ESP-IDF 开发框架。编译由框架的默认编译器完成,即 8.4.0 版本的 GCC。我们没有激活任何编译器优化。测试在 [ESP32-S3-DevKitC-1 开发板](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html) 上执行,时钟频率为 160 MHz。编译器设置保持为使用 ESP-IDF 设置项目时的默认配置。
在 `CMakeLists.txt` 文件中有许多预处理器定义,可用于激活双核优化或 SHA 和 ACC 加速器。
在构建固件并将其刷入设备后,Kyber KEM 密钥对生成、封装和解封装的时钟周期计数测量结果将通过开发板的串行接口进行报告。
我们测量了 3 种场景:
1. 场景 1:单核
```
add_compile_definitions("KYBER_90S")
add_compile_definitions("KYBER_K=2")
add_compile_definitions("SHA_ACC=0")
add_compile_definitions("AES_ACC=0")
add_compile_definitions("INDCPA_KEYPAIR_DUAL=0")
add_compile_definitions("INDCPA_ENC_DUAL=0")
add_compile_definitions("INDCPA_DEC_DUAL=0")
```
2. 场景 2:双核
```
add_compile_definitions("KYBER_90S")
add_compile_definitions("KYBER_K=2")
add_compile_definitions("SHA_ACC=0")
add_compile_definitions("AES_ACC=0")
add_compile_definitions("INDCPA_KEYPAIR_DUAL=1")
add_compile_definitions("INDCPA_ENC_DUAL=1")
add_compile_definitions("INDCPA_DEC_DUAL=0")
```
3. 场景 3:双核与加速器
```
add_compile_definitions("KYBER_90S")
add_compile_definitions("KYBER_K=2")
add_compile_definitions("SHA_ACC=1")
add_compile_definitions("AES_ACC=1")
add_compile_definitions("INDCPA_KEYPAIR_DUAL=1")
add_compile_definitions("INDCPA_ENC_DUAL=1")
add_compile_definitions("INDCPA_DEC_DUAL=0")
```
下表显示了我们在 90s 变体下针对 Kyber512 的测试结果:
| 实现 | 算法 | 周期计数 | 加速比 |
| ----------- | ----------- | ----------- | ----------- |
| 场景 1 | 密钥生成 | 2.439.083 | 1x |
| | 封装 | 2.736.256 | 1x |
| | 解封装 | 2.736.256 | 1x |
| 场景 2 | 密钥生成 | 2.007.689 | 1.21x |
| | 封装 | 2.243.652 | 1.22x |
| | 解封装 | 2.471.286 | 1.20x |
| 场景 3 | 密钥生成 | 1.414.389 | 1.72x |
| | 封装 | 1.490.784 | 1.84x |
| | 解封装 | 1.756.638 | 1.69x |
标签:Bash脚本, ESP32, ESP-IDF, 后量子密码学, 客户端加密, 密码学实现, 密钥封装机制, 嵌入式系统, 物联网