分享
 
 
 

The Cryptography API, or How to Keep a Secret(三)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

几个加密API函数

[编者注:下面缩进部分的文件引用自MSDN Library, Platform, SDK, 及 DDK 文档。]

初始化CSP:CryptAcquireContext, CryptReleaseContext

函数CryptAcquireContext用来获得CSP中一个特定密鈅容器的句柄。返回的句柄然后就可以对选择的CSP进行调用。

函数CryptReleaseContext用于释放函数CryptAcquireContext返回的句柄。 CryptReleaseContext 不会删除任何Cryptography API 对象,它仅仅释放对象的句柄。

函数CryptAcquireContext执行两个操作。 首先试着查找变量中指定的CSP, 如果找到,函数试着查找CSP中匹配指定密鈅容器名的密鈅容器。此函数也可以用于建立、删除密鈅容器,这取决于函数中的参数值。

取得默认CSP中默认密鈅容器的代码如下所示:(译注:原文章代码中注释为英文,此处译为中文,下面情况同)

#include <wincrypt.h> // 对CryptoAPI的定义

/*

对于非C/C++用户,此处用到的常量如下:

#define MS_DEF_PROV "Microsoft Base Cryptographic Provider v1.0"

#define PROV_RSA_FULL 1

*/

BOOL bResult;

HCRYPTPROC hProv;

// 试图取得转为密鈅容器的句柄

bResult = CryptAcquireContext(

&hProv, // 保存返回句柄的变量

NULL, // 默认密鈅容器

MS_DEF_PROV, // 默认CSP

PROV_RSA_FULL, // 要取得的CSP类型

0); // 未指定动作

.

.

.

// 在此处执行操作

.

.

.

// 释放容器句柄

CryptReleaseContext(hProv);

如果CryptAcquireContext调用成功,返回值非零,变量hProv 即为要取得的密鈅容器句柄。

要在默认CSP中添加或者创建一个密鈅容器,要写的代码如下:

#include <wincrypt.h> // 对CryptoAPI的定义

/*

对于非C/C++用户,此处用到的常量如下:

#define MS_DEF_PROV "Microsoft Base Cryptographic Provider v1.0"

#define PROV_RSA_FULL 1

#define CRYPT_NEWKEYSET 0x8

*/

BOOL bResult;

HCRYPTPROC hProv;

// 试图添加一个新的密鈅容器

BResult = CryptAcquireContext(

&hProv, // 保存返回句柄的变量

NULL, // 默认密鈅容器

MS_DEF_PROV, // 默认CSP

PROV_RSA_FULL, // 要取得的CSP类型

CRYPT_NEWKEYSET); // 创建一个新密鈅容器

.

.

.

// 在此处执行操作

.

.

.

// 释放容器句柄

CryptReleaseContext(hProv);

如果CryptAcquireContext调用成功,返回值非零,变量hProv 即为新的密鈅容器句柄。

要从默认CSP中删除一个存在的密鈅容器,要写的代码如下:

#include <wincrypt.h> // 对CryptoAPI的定义

/*

对于非C/C++用户,此处用到的常量如下:

#define MS_DEF_PROV "Microsoft Base Cryptographic Provider v1.0"

#define PROV_RSA_FULL 1

#define CRYPT_DELETEKEYSET 0x10

*/

BOOL bResult;

HCRYPTPROC hProv;

// 试图删除密鈅容器

BResult = CryptAcquireContext(

&hProv, // 保存返回句柄的变量

NULL, // 默认密鈅容器

MS_DEF_PROV, // 默认CSP

PROV_RSA_FULL, // 要取得的CSP类型

CRYPT_DELETEKEYSET); // 删除存在的密鈅容器

如果CryptAcquireContext调用成功,返回值非零,变量hProv 指向的密鈅容器已经删除,此密鈅容器不再有效。

散列数据:CryptCreateHash, CryptHashData, CryptGetHashParam, CryptDestroyHash

当我说“散列法”或“散列”("hashing" or "hash" )时,是指从一块数据中派生出一个数值的方法或算法。这可能是简单的将所有数据位相加,或复杂到要对数据进行傅立叶变换。(译注:散列也被称为哈希,杂凑)

上面列出的四个函数是用于创建或者维护从提供的数据生成的散列值的,一般一起使用:

函数 CryptCreateHash用于散列数据时初始化。它返回CSP散列对象的句柄,此句柄会在后续CryptHashData函数散列数据时使用。

下一步是调用CryptGetHashParam 函数取得散列值。

函数 CryptDestroyHash 释放函数 CryptCreateHash返回的句柄。CryptDestroyHash不会删除任何加密 API 对象,它仅仅释放散列对象的句柄。

CryptHashData 函数用来从提供的数据中计算密码散列。为计算一个大数据块或者数据块的几个部分时,此函数可被调用多次。例如,我们要对缓冲区pBuffer中dwBufferLen字节长的数据进行散列。在此例子中我仅使用CALG_MD5 散列算法来实现此目的。 加密 API SDK 文档中还提供对许多其它算法详细的描述。 本例子假定只散列一块数据。一旦调用CryptGetHashParam函数取得了散列值,此散列实例对象便不能再散列其它数据了。

#include <wincrypt.h> // 对CryptoAPI的定义

/*

对于非C/C++用户,此处用到的常量如下:

#define ALG_CLASS_HASH (4 << 13)

#define ALG_TYPE_ANY (0)

#define ALG_SID_MD5 3

#define CALG_MD5 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)

#define HP_HASHVAL 0x0002 // 散列值

#define HP_HASHSIZE 0x0004 // 散列值长度

*/

BOOL bResult;

HCRYPTHASH hHash;

DWORD dwBufferSize;

DWORD dwValue;

PBYTE pBuffer;

// 获得散列对象句柄

bResult = CryptCreateHash(

hProv, // 之前获得的CSP句柄

CALG_MD5, // 散列算法

0, // 非密鈅散列

0, // 置0

&hHash); // 保存散列对象句柄的变量

// 散列数据

bResult = CryptHashData(

hHash, // 散列对象句柄

pBuffer, // 数据缓冲区指针

dwBufferlen, // 数据长度

0); // 未指定值

// 得到散列值尺寸

dwBufferSize = sizeof(DWORD);

bResult = CryptGetHashParam(

hHash, // 散列对象句柄

HP_HASHSIZE, // 得到散列值尺寸

&dwValue, // 保存散列值长度缓冲区

&dwBufferSize, // 缓冲区长度

0); // 必须置0

// 创建保存散列值的缓冲区

pBuffer = new char [dwBufferSize];

// Get hash value.

bResult = CryptGetHashParam(

hHash, // 散列对象句柄

HP_HASHVAL, // 得到散列值

pBuffer, // 保存散列值长度缓冲区

&dwBufferSize, // 缓冲区长度

0); // 必须置0

// 释放散列对象

CryptDestroyHash(hHash);

上面例子为pBuffer 指向的数据生成一个散列值。如果还要散列其它数据,用这个数据调用 CryptHashData,产生的散列值仍会是原来的值。已警告过—使用HP_HASHVALUE参数调用 CryptGetHashParam 会阻止使用此对象继续进行散列。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有