zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于C++实现(控制台)微软 CryptoAPI 的密码系统【100010238】

C++密码密码系统微软 实现 基于 控制台
2023-09-11 14:17:50 时间

基于微软 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