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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923264.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!