• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

twilight0966

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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) 获得更高性能
  • 对频繁签名的场景使用签名服务器集群

思维导图

截屏2025-09-30 上午11.23

posted on 2025-09-30 21:07  20231301周子昂  阅读(14)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3