swansen/kyber-esp32-benchmark
GitHub: swansen/kyber-esp32-benchmark
该项目在ESP32微控制器上实现了高效的CRYSTALS-Kyber后量子密钥封装机制,并提供了详细的性能基准测试数据。
Stars: 0 | Forks: 0
# 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 上的高效实现" 这一主题,因为它既具有相关性,又足够开放,使得在每人每周 20 小时、为期 8 周的工作后能够呈现出有意义的结果。
在项目过程中,两位作者都学到了很多关于密码学的知识,包括密码学在快速发展的量子计算机技术面前所面临的挑战,以及使用 FreeRTOS 和 ESP-IDF 在 ESP32 平台上实现和优化算法的过程。在推进项目的过程中,我们遇到了许多开放性问题,希望将来能进一步研究。
最后,我们要感谢 [副教授 Masoumeh (Azin) Ebrahimi](https://people.kth.se/~mebr/) 给予的惊人支持、指导和建议,特别是她为其他小组和我们投入了大量宝贵的时间。
我们要感谢 Bos 等人提供的 [Kyber](https://www.pq-crystals.org/kyber/) 密钥封装机制的 [官方参考实现](https://github.com/pq-crystals/kyber/blob/master/README.md),这是我们实现工作的基准。所有组件基本上都是他们的代码,我们只是对其进行了修改,以适应我们在 ESP32 上创建高效实现的目标。
## 构建说明
我们推荐使用 [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。我们没有启用任何编译器优化。执行是在时钟频率为 160 MHz 的 [ESP32-S3-DevKitC-1 开发板](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html) 上进行的。编译器设置保持默认,即使用 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")
```
下表显示了我们在 Kyber512 的 90s 变体中的结果:
| 实现 | 算法 | 周期计数 | 加速比 |
| ----------- | ----------- | ----------- | ----------- |
| 场景 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 |
标签:CRYSTALS-Kyber, C语言实现, ESP32, ESP-IDF, FreeRTOS, KEM, NIST标准, PQC, 后量子密码, 客户端加密, 密钥封装机制, 嵌入式安全, 微控制器, 性能评估, 抗量子计算, 物联网安全, 算法优化, 统计评估