CryptoLink 是一个基于 WebSocket 的安全网络通信库,实现了端到端加密通信。项目使用 RSA 非对称加密进行密钥交换,使用 AES 对称加密进行数据传输,确保通信的安全性和效率。
- 双重加密保护: RSA + AES 混合加密方案
- 认证型对称加密 (AEAD): AES-256-GCM,每条消息独立随机 nonce,自带完整性校验,抵御篡改/翻转攻击
- 握手身份认证: 会话密钥交换使用 RSA 签名/验签,抵御中间人替换会话密钥
- WebSocket 通信: 基于 WebSocket 协议的实时通信
- 线程安全: 服务端会话状态由单一
ClientSession结构统一管理并加锁保护 - 多客户端支持: 服务端支持多个客户端同时连接
- 可选协程集成: 可选接入 flowcoro(C++20 协程),把 RSA/AES 计算卸载到线程池
- 跨平台: 基于 CMake 构建,支持多平台编译
-
非对称加密 (RSA-2048):
- 用于安全的密钥交换
- 数字签名验证
- 公钥长度: 2048位
-
对称加密 (AES-256-GCM):
- 认证加密 (AEAD),用于高效且防篡改的数据传输
- 密钥长度: 256位
- 每条消息使用独立随机 12 字节 nonce,密文封装为
nonce || ciphertext || tag - 内置 128 位认证标签,解密时自动校验完整性,失败抛出
CryptoError
- 建立 WebSocket 连接
- 客户端请求服务端公钥
- 服务端发送公钥并请求客户端公钥
- 客户端发送公钥
- 客户端用服务端公钥加密并发送 AES 会话密钥
- 开始使用 AES 会话密钥进行加密通信
- 连接结束时销毁所有密钥
CryptoLink/
├── include/ # 头文件目录
│ ├── AsymmetricalEncryptionInterface.h # 非对称加密接口
│ ├── SymmetricalEncryptionInterface.h # 对称加密接口
│ ├── RSAKey.h # RSA 实现类
│ ├── AESKey.h # AES 实现类
│ ├── CryptoWebSocketClient.h # WebSocket 客户端
│ └── CryptoWebSocketServer.h # WebSocket 服务端
├── src/ # 源文件目录
│ ├── RSAKey.cpp
│ ├── AESKey.cpp
│ ├── CryptoWebSocketClient.cpp
│ └── CryptoWebSocketServer.cpp
├── examples/ # 示例程序
│ ├── client.cpp # 客户端示例
│ └── server.cpp # 服务端示例
├── CMakeLists.txt # CMake 配置文件
├── README.md # 项目说明
└── 技术方案.md # 详细技术方案
- Crypto++: 密码学库,提供 RSA 和 AES 算法实现
- WebSocket++: C++ WebSocket 库
- Boost: C++ 库集合,WebSocket++ 的依赖
- JsonCpp: JSON 解析库,用于消息序列化
Ubuntu/Debian:
sudo apt-get update
sudo apt-get install build-essential cmake
sudo apt-get install libcrypto++-dev libboost-all-dev libjsoncpp-devCentOS/RHEL:
sudo yum install gcc-c++ cmake
sudo yum install cryptopp-devel boost-devel jsoncpp-devel# 克隆项目
git clone <repository-url>
cd CryptoLink
# 配置和编译(默认 Release,构建示例与单元测试)
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
# 运行示例
./build/server # 启动服务端
./build/client # 启动客户端(新终端)| 选项 | 默认 | 说明 |
|---|---|---|
BUILD_EXAMPLES |
ON | 构建 client/server 及演示程序 |
BUILD_TESTS |
ON | 构建 GoogleTest 单元测试 |
WITH_FLOWCORO |
OFF | 构建可选的 flowcoro 协程集成(需 C++20,通过 FetchContent 拉取 flowcoro) |
ctest --test-dir build --output-on-failure单元测试覆盖 AES-GCM 往返/篡改检测、RSA 加解密、签名验签(含篡改拒绝)以及 完整的认证型会话密钥交换。
flowcoro 是一个 C++20 协程运行时。由于系统 websocketpp 0.8.x 无法在 C++20 下编译,本集成只把与 websocketpp 无关的 RSA/AES 计算卸载到 flowcoro 线程池(加密核心类在 C++17/C++20 下均可编译):
cmake -S . -B build -DWITH_FLOWCORO=ON
cmake --build build -j
./build/integration/flowcoro/flowcoro_async_crypto集成层提供 flowcoro::Task<T> 封装(见
integration/flowcoro/include/cryptolink/async_crypto.h),可用顺序的 co_await
表达"生成密钥 → 加密会话密钥 → 收发"等异步加密流程,而不阻塞调用线程。
#include "CryptoWebSocketServer.h"
CryptoWebSocketServer server;
// 设置消息回调
server.setMessageCallback([&](websocketpp::connection_hdl hdl, const std::string& message) {
std::cout << "收到消息: " << message << std::endl;
server.sendEncryptedMessage(hdl, "回复: " + message);
});
// 启动服务器
server.start(9002);
server.run();#include "CryptoWebSocketClient.h"
CryptoWebSocketClient client;
// 设置消息回调
client.setMessageCallback([](const std::string& message) {
std::cout << "收到消息: " << message << std::endl;
});
// 连接并发送消息
client.connect("ws://localhost:9002");
client.run();
client.sendEncryptedMessage("Hello, encrypted world!");generateKeyPair(): 生成 RSA 密钥对getLocalPublicKey(): 获取本地公钥 (Base64)setRemotePublicKey(): 设置远程公钥encryptWithRemotePublic(): 使用远程公钥加密decryptWithLocalPrivate(): 使用本地私钥解密signWithLocalPrivate(): 使用本地私钥签名verifyWithRemotePublic(): 使用远程公钥验证签名
generateRawKey(): 生成 AES 密钥和 IVencryptWithLocal(): 使用本地密钥加密decryptWithLocal(): 使用本地密钥解密encryptWithRemote(): 使用远程密钥加密decryptWithRemote(): 使用远程密钥解密setRemotePublicKey(): 设置远程会话密钥getLocalKey(): 获取本地密钥
- 密钥长度: RSA-2048, AES-256 提供足够的安全强度
- 认证加密: AES-256-GCM 提供机密性与完整性(AEAD),每条消息独立随机 nonce
- 握手认证: 会话密钥经 RSA-OAEP 加密传输,并由客户端私钥签名、服务端用客户端公钥验签
- 密钥管理: 密钥仅在内存中存储,连接结束后自动销毁
- 随机性: 使用 Crypto++ 的安全随机数生成器
- 失败可区分: 解密/验签失败抛出
CryptoError,不再静默返回空串 - Forward Secrecy: 每次连接使用独立的会话密钥
说明:当前握手认证依赖对端公钥的真实性。若要完全抵御中间人攻击,仍建议在
wss://(TLS)之上运行,或引入证书/公钥指纹预置(pinning)。
- AES-256-GCM 认证加密(替换固定 IV 的 CBC)
- 握手会话密钥签名认证
- 服务端会话状态线程安全
- GoogleTest 单元测试覆盖
- GitHub Actions 持续集成
- 可选 flowcoro 协程集成
- 完整的 TLS(
wss://) 支持 - 证书/公钥指纹预置(pinning)
- 添加更多加密算法支持 (ECC, ChaCha20)
- 高效传输: AES 对称加密确保数据传输效率
- 最小握手: 优化的密钥交换流程
- 多线程: 支持并发连接处理
- 内存管理: 智能指针管理,防止内存泄漏
本项目采用 MIT 许可证,详见 LICENSE 文件。
欢迎提交 Issue 和 Pull Request!
如有问题,请通过 GitHub Issues 联系。