2025-2026-1 20231301 《信息安全设计》第五周学习总结
2025-2026-1 20231301 《信息安全设计》第五周学习总结
作业信息
| 作业 | 链接 |
|---|---|
| 作业课程 | <班级>(2025-2026-1 信息安全设计) |
| 作业要求 | <作业>(2025-2026-1 信息安全设计 预习作业要求) |
| 作业目标 | 《Windows C/C++ 加密解密实战》> 预习第七章 |
| 作业正文 | <博客>(第五周学习总结) |
学习内容总结
第七章:数字签名技术
一、核心原理深度解析
1. 数字签名的密码学基础
- 基于非对称密码体制和哈希函数的双重保障
- 核心特性:
- 不可伪造性:只有私钥持有者能生成有效签名
- 不可否认性:签名者无法事后否认自己的签名
- 完整性:任何对原始数据的修改都会导致验证失败
2. 数字签名的数学模型
签名过程:S = Sig(H(M), d)
验证过程:Ver(H(M), S, e) = true/false
其中:H=哈希函数,M=消息,d=私钥,e=公钥,S=签名
3. RSA数字签名算法详解
- 密钥生成:选择大素数p,q,计算n=pq,φ(n)=(p-1)(q-1)
- 选择e满足1<e<φ(n)且gcd(e,φ(n))=1
- 计算d≡e⁻¹ mod φ(n)
- 签名生成:
S = M^d mod n - 签名验证:
M' = S^e mod n,比较M'与原始M
// OpenSSL RSA签名示例代码
RSA *rsa = RSA_new();
RSA_generate_key_ex(rsa, 2048, e, NULL);
unsigned char sig[256];
unsigned int siglen;
RSA_sign(NID_sha256, msg, msglen, sig, &siglen, rsa);
int ret = RSA_verify(NID_sha256, msg, msglen, sig, siglen, rsa);
二、实战代码深度剖析
1. 使用OpenSSL EVP高层接口实现签名验签
#include <openssl/evp.h>
#include <openssl/pem.h>
// 数字签名生成函数
int generate_signature(const char* message, EVP_PKEY* private_key,
unsigned char** signature, size_t* sig_len) {
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
const EVP_MD* md = EVP_sha256(); // 使用SHA-256哈希算法
// 初始化签名上下文
if (EVP_DigestSignInit(ctx, NULL, md, NULL, private_key) != 1) {
EVP_MD_CTX_free(ctx);
return -1;
}
// 更新消息数据
if (EVP_DigestSignUpdate(ctx, message, strlen(message)) != 1) {
EVP_MD_CTX_free(ctx);
return -1;
}
// 获取签名长度
size_t req_len = 0;
if (EVP_DigestSignFinal(ctx, NULL, &req_len) != 1) {
EVP_MD_CTX_free(ctx);
return -1;
}
// 分配内存并生成签名
*signature = (unsigned char*)malloc(req_len);
if (EVP_DigestSignFinal(ctx, *signature, sig_len) != 1) {
free(*signature);
EVP_MD_CTX_free(ctx);
return -1;
}
EVP_MD_CTX_free(ctx);
return 0;
}
// 数字签名验证函数
int verify_signature(const char* message, const unsigned char* signature,
size_t sig_len, EVP_PKEY* public_key) {
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
const EVP_MD* md = EVP_sha256();
if (EVP_DigestVerifyInit(ctx, NULL, md, NULL, public_key) != 1) {
EVP_MD_CTX_free(ctx);
return -1;
}
if (EVP_DigestVerifyUpdate(ctx, message, strlen(message)) != 1) {
EVP_MD_CTX_free(ctx);
return -1;
}
int result = EVP_DigestVerifyFinal(ctx, signature, sig_len);
EVP_MD_CTX_free(ctx);
return result == 1 ? 0 : -1;
}
2. OpenSSL命令行实战
# 生成RSA密钥对
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
# 对文件进行数字签名
openssl dgst -sha256 -sign private_key.pem -out signature.bin document.txt
# 验证数字签名
openssl dgst -sha256 -verify public_key.pem -signature signature.bin document.txt
# 查看签名详细信息
openssl rsautl -verify -in signature.bin -inkey public_key.pem -pubin -raw | xxd
三、数字签名完整流程图示
graph TD
A[原始消息] --> B[哈希函数 SHA256/MD5]
B --> C[消息摘要]
C --> D[私钥加密]
D --> E[数字签名]
E --> F{传输通道}
F --> G[接收方验证]
G --> H[公钥解密签名]
H --> I[得到摘要1]
G --> J[对原始消息哈希]
J --> K[得到摘要2]
I --> L{比较摘要1和摘要2}
L --> M[验证成功]
L --> N[验证失败]
四、安全性考虑与最佳实践
1. 常见攻击与防护
- 重放攻击:添加时间戳和序列号
- 中间人攻击:使用数字证书验证公钥真实性
- 哈希碰撞攻击:使用抗碰撞性强的哈希算法(SHA-256、SM3)
2. 性能优化建议
- 对大文件签名时使用分段处理
- 考虑使用椭圆曲线数字签名(ECDSA) 获得更高性能
- 对频繁签名的场景使用签名服务器集群
思维导图

posted on 2025-09-30 21:07 20231301周子昂 阅读(14) 评论(0) 收藏 举报
浙公网安备 33010602011771号