2025-2026-1 20231301 《信息安全设计》第六周学习总结
2025-2026-1 20231301 《信息安全设计》第六周学习总结
作业信息
| 作业 | 链接 |
|---|---|
| 作业课程 | <班级>(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;
}

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