基于后量子密码的轻量级通信协议项目
总结
主要目的
- 遍历并理解基于后量子密码的轻量级通信协议项目的整体结构和功能
关键决策和解决方案
- 该项目实现了基于Kyber-768算法的后量子密钥交换
- 使用Rainbow签名算法进行身份验证
- 采用简化版CoAP协议进行通信
- 实现了三种优化策略:报文压缩、会话密钥复用、协议头压缩
使用的技术栈
- C语言核心实现
- Kyber-768后量子密码系统(密钥封装机制)
- Rainbow后量子签名算法
- 简化版CoAP通信协议
- OpenSSL库用于辅助加密功能
- 可选的SDL2库用于GUI界面
- Make构建系统
- Python用于性能数据可视化
Windows 11 系统安装与运行指南
环境准备
在Windows 11上运行此项目,需要准备以下环境:
- MSYS2环境:提供类Unix编译环境
- MinGW-w64工具链:提供GCC编译器和相关工具
- OpenSSL库:提供加密功能支持
- 可选:SDL2库(用于GUI界面)
详细安装步骤
1. 安装MSYS2
- 访问MSYS2官网下载安装程序
- 运行安装程序,按照提示完成安装(建议安装到
C:\msys64
) - 安装完成后,启动"MSYS2 MINGW64"终端
2. 安装必要依赖
在MSYS2 MINGW64终端中运行以下命令:
# 更新包数据库
pacman -Syu
# 安装基本开发工具
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make git
# 安装OpenSSL
pacman -S mingw-w64-x86_64-openssl
# 安装SDL2(可选,用于GUI模式)
pacman -S mingw-w64-x86_64-SDL2 mingw-w64-x86_64-SDL2_ttf
# 安装Python和相关库(用于性能可视化)
pacman -S mingw-w64-x86_64-python mingw-w64-x86_64-python-pip
pip install pandas matplotlib numpy
4. 检查现有编译文件
如果您的源码目录中已包含编译好的可执行文件(如coap_server.exe
、coap_client.exe
等),可以直接运行它们。检查方法:
cd 1
ls -l *.exe
如果没有这些文件,或者需要重新编译,请继续下一步。
5. 编译项目
在MSYS2 MINGW64终端中导航到项目的主要代码目录:
cd /path/to/your/project/1
创建Windows专用的Makefile.win文件:
# 使用记事本或其他编辑器创建Makefile.win文件
touch Makefile.win
编辑Makefile.win文件,添加以下内容:
CC = gcc
CFLAGS = -I../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768 -Wall -g
LDFLAGS = -L../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768 -lssl -lcrypto -lm -lws2_32
# 检查是否定义了GUI模式
ifdef GUI
CFLAGS += -DUSE_GUI
LDFLAGS += -lSDL2 -lSDL2_ttf
endif
# Kyber768 源文件
KYBER_SRC = ../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/kem.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/aes256ctr.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/cbd.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/fips202.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/indcpa.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/ntt.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/poly.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/polyvec.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/reduce.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/rng.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/sha256.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/sha512.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/symmetric-shake.c \
../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/verify.c
# Kyber768 的目标文件放在 kyber_obj 目录下
KYBER_OBJ_DIR = kyber_obj
KYBER_OBJ = $(patsubst ../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/%.c,$(KYBER_OBJ_DIR)/%.o,$(KYBER_SRC))
all: coap_server.exe coap_client.exe protocol_test.exe performance_analyzer.exe
gui:
$(MAKE) -f Makefile.win GUI=1 all
$(KYBER_OBJ_DIR):
mkdir -p $(KYBER_OBJ_DIR)
coap_server.exe: coap_server.o coap.o rainbow.o protocol_optimize.o $(KYBER_OBJ)
$(CC) -o coap_server.exe coap_server.o coap.o rainbow.o protocol_optimize.o $(KYBER_OBJ) $(LDFLAGS)
coap_client.exe: coap_client.o coap.o rainbow.o protocol_optimize.o $(KYBER_OBJ)
$(CC) -o coap_client.exe coap_client.o coap.o rainbow.o protocol_optimize.o $(KYBER_OBJ) $(LDFLAGS)
protocol_test.exe: protocol_test.o protocol_optimize.o rainbow.o $(KYBER_OBJ)
$(CC) -o protocol_test.exe protocol_test.o protocol_optimize.o rainbow.o $(KYBER_OBJ) $(LDFLAGS)
performance_analyzer.exe: performance_analyzer.o protocol_optimize.o
$(CC) -o performance_analyzer.exe performance_analyzer.o protocol_optimize.o $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(KYBER_OBJ_DIR)/%.o: ../NIST-PQ-Submission-Kyber-20201001/Optimized_Implementation/crypto_kem/kyber768/%.c | $(KYBER_OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o *.exe
rm -rf $(KYBER_OBJ_DIR)
.PHONY: all clean gui
执行编译:
# 创建目标目录
mkdir -p kyber_obj
# 编译项目
mingw32-make -f Makefile.win
如果需要GUI界面:
mingw32-make -f Makefile.win gui
6. 网络配置
在Windows系统上,可能需要配置防火墙以允许程序通信:
- 打开Windows安全中心
- 进入"防火墙和网络保护" > “允许应用通过防火墙”
- 点击"更改设置" > “允许其他应用”
- 添加编译好的coap_server.exe和coap_client.exe
- 确保勾选"专用"和"公用"网络类型
7. 运行项目
在MSYS2 MINGW64终端中运行程序:
服务端:
./coap_server.exe
客户端(新开一个MSYS2 MINGW64终端):
./coap_client.exe
使用优化选项:
./coap_server.exe -c # 报文压缩
./coap_client.exe -c # 客户端也需要使用相同的优化选项
8. 可能遇到的问题与解决方案
-
Winsock错误:
- 错误信息:
Error initializing Winsock
- 解决方案:确保Windows网络组件工作正常,可以尝试重启网络服务
- 错误信息:
-
DLL缺失错误:
- 错误信息:
The program can't start because XXX.dll is missing
- 解决方案:将MSYS2的bin目录添加到PATH环境变量中(
C:\msys64\mingw64\bin
)
- 错误信息:
-
防火墙阻止:
- 症状:客户端无法连接到服务端
- 解决方案:检查Windows防火墙设置,确保允许应用通过
-
编译错误:
- 症状:编译过程中出现错误
- 解决方案:检查是否安装了所有必要的依赖,并确保使用的是最新版本
-
网络绑定错误:
- 错误信息:
Error binding socket
或Address already in use
- 解决方案:确保端口(5683)未被其他应用占用,可以使用
-p
参数指定不同端口
- 错误信息:
9. 性能测试
运行性能测试:
./protocol_test.exe
可视化性能数据:
python visualize_performance.py performance_comparison.csv
使用已编译的二进制文件
如果源码目录中已包含编译好的可执行文件,您可以:
-
确保安装了必要的运行时库:
pacman -S mingw-w64-x86_64-openssl
-
直接运行可执行文件:
./coap_server.exe ./coap_client.exe
-
如果运行时出现DLL缺失错误,复制所需DLL到可执行文件所在目录,或设置PATH环境变量。