基于C++实现(控制台)微软 CryptoAPI 的密码系统【100010238】
基于微软 CryptoAPI 的密码系统设计与实现
1、系统需求分析
Cryptographic API (CryptoAPI) 是微软在 Windows 操作系统中添加的密 码编译机能,作为数据加密与解密功能的重要基础,CryptoAPI 支持同步,异步 的密钥加密处理,以及操作系统中的数字证书的管理工作。
本系统是基于 CryptoAPI 开发,使用 CryptoAPI 中提供的函数实现了生成公-私钥对并存储与加密解密信息与数据的功能。
2、系统功能说明
本系统实现基于 CryptoAPI 了如下功能:
生成公钥-私钥对
基于公钥私钥对进行文件对称加密
3、软硬件环境
开发环境:Microsoft VisuaStudio Community 2019 开发语言:C++
操作系统:Window 7 Pro 硬件环境: ThinkPad X1 (2020)
4、相关 API 介绍
4.1 CryptAcquireContext function
用于获取句柄到一个特定的密钥容器的特定内加密服务提供商。
BOOCryptAcquireContext(
HCRYPTPROV *phProv, //指向 CSP 句柄的指针
LPCSTR szContainer, //密钥容器名称
LPCSTR szProvider, //以空值结尾的字符串,其中包含要使用的 CSP 的名称
DWORD dwProvType, //指定要获取的提供程序的类型 DWORD dwFlags //标志值
);
4.2 CryptGenKey function
生成一个随机加密会话密钥或公共/私有密钥对。
BOOCryptGenKey(
HCRYPTPROV hProv, //指向 CSP 句柄的指针 ALG_ID Algid, //标识要为其生成密钥的算法 DWORD dwFlags, //指定生成的密钥的类型
HCRYPTKEY *phKey //新生成的 KEY 的句柄复制到的地址
);
4.3 CryptImportKey function
从 Key Blob 中提取密钥。
BOOCryptImportKey(
HCRYPTPROV hProv, //通过 CryptAcquireContext 函数获得的 CSP 的句柄
const BYTE *pbData, //Key Blob
DWORD dwDataLen, //密钥 BLOB 的长度(以字节为单位)
HCRYPTKEY hPubKey, //密钥 BLOB 的长度(以字节为单位)
DWORD dwFlags,//仅在将 PRIVATEKEYBLOB 形式的公钥/私钥对导入 CSP 时使用
HCRYPTKEY *phKey //指向 HCRYPTKEY 值的指针,该值接收导入的 KEY 的句柄
);
4.4 CryptExportKey function
导出密钥到 Key Blob。
BOOCryptExportKey(
HCRYPTKEY hKey, //要导出的密钥的句柄
HCRYPTKEY hExpKey, //加密密钥的句柄(交换密钥)
DWORD dwBlobType, //设定要在 pbData 中导出的 KEY BLOB 的类型
DWORD dwFlags, //设定其他选项
BYTE *pbData, //指向接收 KEY BLOB 数据的缓冲区的指针
DWORD *pdwDataLen
//指向 DWORD 值的指针,该值在输入时包含 pbData 参数指向的缓冲区的大小(以字节为 单位)。函数返回时,此值包含缓冲区中存储的字节数。
);
4.5 CryptEncrypt function
用于加密数据。
BOOCryptEncrypt(
HCRYPTKEY hKey, //加密密钥的句柄。 HCRYPTHASH hHash, //哈希对象句柄。
BOOFinal, //一个布尔值,指定这是否是要解密的系列中的最后一个部分。 DWORD dwFlags, //标志值。
BYTE *pbData, //指向包含要加密的数据的缓冲区的指针。
DWORD *pdwDataLen, //指向 DWORD 值的指针,该值在输入时包含 pbData 缓冲区 中纯文本的长度(以字节为单位)。
DWORD dwBufLen //指定输入 pbData 缓冲区的总大小(以字节为单位)。
);
4.6 CryptDecrypt function
解密先前通过使用 CryptEncrypt 加密的数据。
BOOCryptDecrypt(
HCRYPTKEY hKey, //用于解密的密钥的句柄。 HCRYPTHASH hHash, //哈希对象句柄。
BOOFinal, //一个布尔值,指定这是否是要解密的系列中的最后一个部分。 DWORD dwFlags, //标志值。
BYTE *pbData, //指向包含要解密的数据的缓冲区的指针。
DWORD *pdwDataLen //指向 DWORD 值的指针,该值指示 pbData 缓冲区的长度。
);
5、系统设计的步骤
5.1 使用 CryptApi 进行公私钥生成的步骤
使用 CryptAcquireContext()连接 CSP 容器,获得指定连接 CSP,获得指定。
使用 CryptGenKey()创建随机的公钥私钥对
使用 CryptExportKey()获取公、私钥长度,然后使用 CryptExportKey()进行公、私钥的导出
使用 Createfile()打开文件,使用 Writefile()写入文件,完成公私钥生成
5.2 使用 CryptApi 进行文件加密
使用 CryptAcquireContext()连接 CSP 容器,获得指定连接 CSP,获得指定。
使用 Createfile(),Writefile()读取公钥文件。
使用 CryptImportKey()装载公钥。
使用 CryptGenKey()生成会话密钥。
调用 Crypt Encrypt()使用会话密钥进行文件加密。
使用 Createfile(),Writefile()存储被加密文件。
使用 CryptExportKey()导出会话密钥。
使用 Createfile(),Writefile()存储密钥文件。
5.3 使用 CryptApi 进行文件解密
使用 CryptAcquireContext()连接 CSP 容器,获得指定连接 CSP,获得指定。
使用 Createfile(),Writefile()读取私钥文件。
使用 CryptImportKey()装载私钥。
使用 Createfile(),Writefile()读取会话密钥文件。
使用 CryptImportKey()装载会话密钥。
使用 Createfile(),Writefile()读取被加密文件。
调用 CryptDecrypt()使用会话密钥进行文件解密。
使用 Createfile(),Writefile()存储解密文件。
6、系统功能验证
6.1 使用 CryptApi 进行公私钥生成
密钥已经生成:
6.2 使用 CryptApi 进行文件加密
被加密文件:
生成的会话密钥文件 :
6.3 使用 CryptApi 进行文件解密
文件解密成功:
♻️ 资源
大小: 927KB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87354189
相关文章
- qt实现web服务器加载vue应用进行C++和html混合编程-连载【6】-企业级系统开发实战连载系列 -技术栈(vue、element-ui、qt、c++、sqlite)
- C/C++——程序的内存分配
- C++程序设计-第七周上机实践项目
- C#调用C++函数来与串口通信
- QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解
- c++中默认32位int类型转换截取高位部分
- [C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
- 《C++覆辙录》——2.6:声明饰词次序的小聪明
- 基于C++实现的(控制台)密码算法设计【100010672】
- 基于C++实现(控制台)考试系统【100010312】
- 基于QT(C++)实现(图形界面)校园导览系统【100010183】
- [第七届蓝桥杯省赛C++B组]煤球数目
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- 自己用纯C++实现简单的QT中信号与槽机制
- C/C++ 字符串分割: strtok 与 strsep 函数说明
- linux下使用C++ Json库
- 87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)
- 详解C++ STL set 容器
- c++继承总结
- C/C++ 网络库 boost asio 使用详解
- 编程参考 - C++ virtual base class