165 lines
3.1 KiB
Markdown
165 lines
3.1 KiB
Markdown
# XNSignature 数字签名工具集
|
|
|
|
这是一个基于 OpenSSL 的数字签名工具集,包含三个主要组件:
|
|
|
|
## 项目结构
|
|
|
|
- **XNSignatureKeygen**: 密钥生成工具(可执行程序)
|
|
- **XNSignatureSign**: 文件签名工具(可执行程序)
|
|
- **XNSignatureVerify**: 签名验证库(动态库)
|
|
|
|
## 编译和安装
|
|
|
|
### 依赖要求
|
|
|
|
- CMake 3.16+
|
|
- OpenSSL 开发库
|
|
- C++17 编译器
|
|
|
|
### 编译步骤
|
|
|
|
```bash
|
|
mkdir build
|
|
cd build
|
|
cmake ..
|
|
make
|
|
```
|
|
|
|
### 安装
|
|
|
|
```bash
|
|
make install
|
|
```
|
|
|
|
## 使用方法
|
|
|
|
### 1. 生成密钥对
|
|
|
|
运行密钥生成工具,会在当前目录生成密钥文件:
|
|
|
|
```bash
|
|
./XNSignatureKeygen
|
|
```
|
|
|
|
这将生成:
|
|
|
|
- `private_key.pem` - 私钥文件
|
|
- `public_key.pem` - 公钥文件
|
|
|
|
### 2. 为文件创建数字签名
|
|
|
|
有两种使用方式:
|
|
|
|
#### 方式一:签名所有文件
|
|
|
|
```bash
|
|
./XNSignatureSign
|
|
```
|
|
|
|
这将自动签名当前目录下的所有文件(除了密钥文件和已有的签名文件),每个文件会生成对应的 `.sig` 签名文件。
|
|
|
|
#### 方式二:签名指定文件
|
|
|
|
```bash
|
|
./XNSignatureSign <文件路径>
|
|
```
|
|
|
|
示例:
|
|
|
|
```bash
|
|
./XNSignatureSign document.txt
|
|
./XNSignatureSign important_file.pdf
|
|
```
|
|
|
|
签名工具会使用当前目录下的 `private_key.pem` 私钥文件。
|
|
|
|
### 3. 验证数字签名
|
|
|
|
使用验证库验证文件签名:
|
|
|
|
#### C++ 程序中使用
|
|
|
|
```cpp
|
|
#include "XNSignatureVerify.h"
|
|
|
|
// 验证签名
|
|
int result = verifySignature("document.txt", "public_key.pem", "document.sig");
|
|
if (result == 0) {
|
|
std::cout << "签名验证成功!" << std::endl;
|
|
} else if (result == -1) {
|
|
std::cout << "签名验证失败!" << std::endl;
|
|
} else {
|
|
std::cout << "验证过程中发生错误!" << std::endl;
|
|
}
|
|
```
|
|
|
|
#### 测试验证库
|
|
|
|
```bash
|
|
./test_verify
|
|
```
|
|
|
|
## API 函数说明
|
|
|
|
### 验证库函数
|
|
|
|
#### `verifySignature`
|
|
|
|
```cpp
|
|
int verifySignature(const char* filePath, const char* publicKeyPath, const char* signaturePath);
|
|
```
|
|
|
|
- **功能**: 验证文件数字签名
|
|
- **返回值**: 0=成功, -1=验证失败, -2=其他错误
|
|
|
|
## 技术特点
|
|
|
|
- 使用 RSA-2048 算法进行数字签名
|
|
- 采用 SHA256 哈希算法
|
|
- 支持 PEM 格式的密钥文件
|
|
- 提供 C 语言接口,便于集成
|
|
- 完整的错误处理和资源管理
|
|
|
|
## 安全说明
|
|
|
|
- 私钥文件应妥善保管,不要泄露给他人
|
|
- 公钥文件可以公开分发
|
|
- 签名文件用于验证文件完整性,防止篡改
|
|
- 建议定期更换密钥对
|
|
|
|
## 示例工作流程
|
|
|
|
1. 生成密钥对:
|
|
|
|
```bash
|
|
./xn_keygen
|
|
```
|
|
|
|
2. 签名重要文件:
|
|
|
|
方式一:签名所有文件
|
|
|
|
```bash
|
|
./XNSignatureSign
|
|
```
|
|
|
|
方式二:签名指定文件
|
|
|
|
```bash
|
|
./XNSignatureSign important_document.pdf
|
|
```
|
|
|
|
3. 分发文件时包含:
|
|
|
|
- `important_document.pdf` (原始文件)
|
|
- `important_document.sig` (签名文件)
|
|
- `public_key.pem` (公钥文件)
|
|
|
|
4. 接收方验证文件完整性:
|
|
```cpp
|
|
int result = verifySignature("important_document.pdf", "public_key.pem", "important_document.sig");
|
|
if (result == 0) {
|
|
// 文件未被篡改,可以安全使用
|
|
}
|
|
```
|