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

基于微软 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 进行文件解密

文件解密成功:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值