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

twilight0966

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

公告

View Post

2025-2026-1 20231301 《信息安全设计》第六周学习总结

2025-2026-1 20231301 《信息安全设计》第六周学习总结

目录
  • 作业信息
  • 学习内容总结
    • 一、Windows密码体系架构深度解析
    • 二、CryptoAPI核心编程实战
    • 三、CSP服务架构详细图示
    • 四、高级特性与性能优化

作业信息

作业 链接
作业课程 <班级>(2025-2026-1 信息安全设计)
作业要求 <作业>(2025-2026-1 信息安全设计 预习作业要求)
作业目标 《Windows C/C++ 加密解密实战》> 预习第九章
作业正文 <博客>(第六周学习总结)

学习内容总结

第九章:CSP和CryptoAPI

一、Windows密码体系架构深度解析

1. CSP体系结构层次

应用程序层
    ↓
CryptoAPI接口层
    ↓
CSP服务提供层
    ↓
硬件/软件实现层

2. CSP分类与特性

  • Microsoft Base Cryptographic Provider:基础软件CSP
  • Microsoft Enhanced Cryptographic Provider:增强软件CSP
  • 硬件CSP:智能卡、USB Key、TPM等
  • 第三方CSP:厂商自定义实现

二、CryptoAPI核心编程实战

1. 完整的加密示例代码

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

#pragma comment(lib, "advapi32.lib")

// 使用CSP进行数据加密
BOOL EncryptDataWithCSP(const BYTE* plaintext, DWORD plaintext_len, 
                       BYTE** ciphertext, DWORD* ciphertext_len) {
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    BOOL success = FALSE;
    
    // 获取CSP上下文
    if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 
                           CRYPT_VERIFYCONTEXT)) {
        printf("CryptAcquireContext failed: %d\n", GetLastError());
        return FALSE;
    }
    
    // 生成会话密钥
    if (!CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE, &hKey)) {
        printf("CryptGenKey failed: %d\n", GetLastError());
        CryptReleaseContext(hProv, 0);
        return FALSE;
    }
    
    // 计算密文缓冲区大小
    DWORD buf_len = plaintext_len;
    if (!CryptEncrypt(hKey, 0, TRUE, 0, NULL, &buf_len, 0)) {
        printf("CryptEncrypt size calc failed: %d\n", GetLastError());
        goto cleanup;
    }
    
    // 分配密文缓冲区
    *ciphertext = (BYTE*)malloc(buf_len);
    memcpy(*ciphertext, plaintext, plaintext_len);
    *ciphertext_len = plaintext_len;
    
    // 执行加密
    if (!CryptEncrypt(hKey, 0, TRUE, 0, *ciphertext, ciphertext_len, buf_len)) {
        printf("CryptEncrypt failed: %d\n", GetLastError());
        free(*ciphertext);
        success = FALSE;
    } else {
        success = TRUE;
    }

cleanup:
    if (hKey) CryptDestroyKey(hKey);
    if (hProv) CryptReleaseContext(hProv, 0);
    return success;
}

// 使用CSP创建数字证书并签名
BOOL CreateDigitalSignature(const BYTE* data, DWORD data_len, 
                           BYTE** signature, DWORD* signature_len) {
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    HCRYPTHASH hHash = 0;
    BOOL success = FALSE;
    
    // 获取CSP并创建密钥容器
    if (!CryptAcquireContext(&hProv, "MyKeyContainer", NULL, 
                           PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
        printf("CryptAcquireContext failed: %d\n", GetLastError());
        return FALSE;
    }
    
    // 生成签名密钥对
    if (!CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey)) {
        printf("CryptGenKey failed: %d\n", GetLastError());
        goto cleanup;
    }
    
    // 创建哈希对象
    if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {
        printf("CryptCreateHash failed: %d\n", GetLastError());
        goto cleanup;
    }
    
    // 哈希数据
    if (!CryptHashData(hHash, data, data_len, 0)) {
        printf("CryptHashData failed: %d\n", GetLastError());
        goto cleanup;
    }
    
    // 获取签名长度
    if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, signature_len)) {
        printf("CryptSignHash size failed: %d\n", GetLastError());
        goto cleanup;
    }
    
    // 分配签名缓冲区并签名
    *signature = (BYTE*)malloc(*signature_len);
    if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, *signature, signature_len)) {
        printf("CryptSignHash failed: %d\n", GetLastError());
        free(*signature);
        success = FALSE;
    } else {
        success = TRUE;
    }

cleanup:
    if (hHash) CryptDestroyHash(hHash);
    if (hKey) CryptDestroyKey(hKey);
    if (hProv) CryptReleaseContext(hProv, 0);
    return success;
}

2. CryptoAPI密钥管理实战

// 导出和导入RSA密钥对
BOOL ExportRSAPrivateKey(HCRYPTPROV hProv, HCRYPTKEY hKey, 
                        BYTE** key_blob, DWORD* blob_len) {
    // 导出PRIVATEKEYBLOB
    if (!CryptExportKey(hKey, 0, PRIVATEKEYBLOB, 0, NULL, blob_len)) {
        printf("CryptExportKey size failed: %d\n", GetLastError());
        return FALSE;
    }
    
    *key_blob = (BYTE*)malloc(*blob_len);
    if (!CryptExportKey(hKey, 0, PRIVATEKEYBLOB, 0, *key_blob, blob_len)) {
        printf("CryptExportKey failed: %d\n", GetLastError());
        free(*key_blob);
        return FALSE;
    }
    
    return TRUE;
}

// 从密钥BLOB导入密钥
HCRYPTKEY ImportRSAPrivateKey(HCRYPTPROV hProv, const BYTE* key_blob, 
                             DWORD blob_len) {
    HCRYPTKEY hKey = 0;
    if (!CryptImportKey(hProv, key_blob, blob_len, 0, 0, &hKey)) {
        printf("CryptImportKey failed: %d\n", GetLastError());
        return 0;
    }
    return hKey;
}

三、CSP服务架构详细图示

graph TB A[应用程序] --> B[CryptAcquireContext] B --> C[获取CSP句柄] C --> D[CryptGenKey/ImportKey] D --> E[获取密钥句柄] E --> F{操作类型} F --> G[加密/解密] F --> H[哈希运算] F --> I[数字签名] F --> J[密钥交换] G --> K[CryptEncrypt/Decrypt] H --> L[CryptCreateHash/HashData] I --> M[CryptSignHash/VerifySignature] J --> N[CryptDeriveKey/ExportKey] K --> O[处理结果] L --> O M --> O N --> O subgraph CSP实现层 P[软件CSP] --> Q[算法实现] R[硬件CSP] --> S[智能卡/TPM] T[第三方CSP] --> U[自定义算法] end O --> P O --> R O --> T

四、高级特性与性能优化

1. 会话密钥与持久密钥

  • 会话密钥:临时使用,不持久化存储
  • 持久密钥:保存在密钥容器中,可重复使用

2. 密钥派生函数使用

// 使用密码派生密钥
BOOL DeriveKeyFromPassword(HCRYPTPROV hProv, LPCWSTR password, 
                          HCRYPTKEY* phKey) {
    HCRYPTHASH hHash = 0;
    
    // 创建哈希对象
    if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {
        return FALSE;
    }
    
    // 哈希密码
    if (!CryptHashData(hHash, (BYTE*)password, wcslen(password)*2, 0)) {
        CryptDestroyHash(hHash);
        return FALSE;
    }
    
    // 从哈希派生密钥
    if (!CryptDeriveKey(hProv, CALG_3DES, hHash, 0, phKey)) {
        CryptDestroyHash(hHash);
        return FALSE;
    }
    
    CryptDestroyHash(hHash);
    return TRUE;
}

截屏2025-09-30 下午9.18

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

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