微软官方提供的加密库相关学习

最近在看一个sample,很长时间没有看伪代码,突然感觉有些生疏了,但是这个样本用到了RSA-2048位密钥长度的算法,一下子就又想研究研究它了,之前没想过别人是如何知道这个sample是使用了什么算法,可能是通过比我用的高级的插件吧,我用PEID的附带插件扫描识别算法,但是具体多少位的加密密钥就识别不出来,所以为了搞清楚一些之前没有很明白的API,决定仔细查询下微软加密库相关的API。

该API用于获取特定加密服务提供程序(CSP)内特定密钥容器的句柄,保存在szContainer句柄中。

CryptAcquireContextW(LPCSTR  szContainer,LPCSTR  szProvider,DWORD  dwProvType,DWORD  dwFlags)

该API用于产生一个随机的交换密钥或者公/私钥对,这里需要特别声明下的是:参数。

Algid 参数表明产生私钥所使用的算法。

微软提供的基本算法

CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1,CALG_MAC,CALG_HMAC,CALG_SSL3_SHAMD5,CALG_MD2,CALG_MD2

CALG_RSA_SIGN,CALG_RSA_KEYX,CALG_RC2,CALG_RC4,CALG_DES

微软提供的增强型算法:

CALG_MD2,CALG_MD5,CALG_SHA,CALG_SHA1

CALG_MAC,CALG_HMAC ,CALG_SSL3_SHAMD5,CALG_RSA_SIGN,CALG_RSA_KEYX,CALG_RC2,CALG_RC4,CALG_DES,CALG_3DES_112,CALG_3DES

dwFlags 参数表示密钥使用的长度,参数可以为0,采用默认的密钥长度。这里又有重点了,因此,如果要生成2,048位RSA签名密钥,则值0x08000000与任何其他dwFlags预定义值一起使用按位或运算。(官方原话:Thus, if a 2,048-bit RSA signature key is to be generated, the value 0x08000000 is combined with any other dwFlags predefined value with a bitwise-OR operation。链接:https://docs.microsoft.com/en-us/windows/desktop/api/wincrypt/nf-wincrypt-cryptgenkey

扫描二维码关注公众号,回复: 2846847 查看本文章

CryptGenKey(HCRYPTPROV  hProv,ALG_ID  Algid,DWORD  dwFlags,HCRYPTKEY  *phKey);

我这个sample调用这个API时,传的参数是0x8000001,仔细看了官方文档后,我就觉得它用的是RSA-2048位加密算法了,真的是个细节,如果以后再碰到调用这个参数的话,那我肯定就直接一眼看出来了,还是多动手查阅资料的好,实践出真知。

部分内容有参考该博主的文章:https://blog.csdn.net/liuhuiyi/article/details/7788867

猜你喜欢

转载自blog.csdn.net/userpass_word/article/details/81670566