当前位置: 首页 > news >正文

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

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) {// 导出PRIVATEKEYBLOBif (!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 TBA[应用程序] --> 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 --> OM --> ON --> Osubgraph CSP实现层P[软件CSP] --> Q[算法实现]R[硬件CSP] --> S[智能卡/TPM]T[第三方CSP] --> U[自定义算法]endO --> PO --> RO --> 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