CSP学习之导出密钥BLOB 解析
通过CryptExportKey( hKey, NULL, PUBLICKEYBLOB,0, NULL, &dwBlobLen)

- #include <Windows.h>
- #include <WinCrypt.h>
- #include <stdio.h>
- #include <tchar.h>
- #pragma comment(lib, "crypt32.lib")
- #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING|X509_ASN_ENCODING)
- void HandleError(char * str)
- {
- printf("%s[%x]\n",str,GetLastError());
- system("pause");
- exit();
- }
- int main(int argc, char* argv[])
- {
- HCRYPTPROV hCryptProv = NULL; //CSP句柄
- LPCTSTR pszContainerName = TEXT("MyKeyContainer"); //CSP密钥容器句柄
- HCRYPTKEY hKey = NULL;
- BYTE* pbKeyBlob;
- DWORD dwBlobLen;
- if(CryptAcquireContext(
- &hCryptProv,
- NULL,
- NULL,
- PROV_RSA_FULL,
- ))
- {
- printf("获取到");
- _tprintf(TEXT("[%s]"), pszContainerName);
- printf("的密钥容器\n");
- }
- else
- {
- //发生错误,如果是密钥容器不存在,则创建新的密钥容器
- if (GetLastError() == NTE_BAD_KEYSET)
- {
- if (CryptAcquireContext(
- &hCryptProv,
- NULL,
- NULL,
- PROV_RSA_FULL,
- CRYPT_NEWKEYSET))
- {
- printf("新的密钥容器已创建\n");
- }
- else
- {
- HandleError("无法创建密钥容器");
- }
- }
- else
- {
- HandleError("无法获取CSP句柄");
- }
- }
- //获取一个加解密key句柄
- if (CryptGetUserKey(hCryptProv, AT_KEYEXCHANGE, &hKey))
- {
- printf("获取到加解密key句柄\n");
- }
- else
- {
- if (GetLastError() == NTE_NO_KEY)
- {
- //因为没有密钥对, 创建一个
- printf("密钥对不存在,创建一个密钥对\n");
- if (CryptGenKey(hCryptProv, AT_KEYEXCHANGE,CRYPT_EXPORTABLE,&hKey))
- {
- printf("创建签名验签密钥对成功\n");
- }
- else
- {
- HandleError("创建密钥对失败");
- }
- }
- else
- {
- HandleError("获取密钥对错误,签名验签密钥对不可用");
- }
- }
- //PUBLICKEYBLOB
- //PRIVATEKEYBLOB
- if(!(CryptExportKey( hKey, NULL, PUBLICKEYBLOB,, NULL, &dwBlobLen)))
- {
- HandleError("导出公钥信息失败");
- }
- pbKeyBlob = (BYTE*)malloc(dwBlobLen);
- if(!(CryptExportKey( hKey, NULL, PUBLICKEYBLOB,, pbKeyBlob, &dwBlobLen)))
- {
- HandleError("导出公钥信息失败2;");
- }
- printf("公钥BLOB信息如下:\n");
- for(int i=;i<dwBlobLen;i++)
- {
- if (i % == )
- {
- printf("\n");
- }
- printf("%02X ", pbKeyBlob[i]);
- }
- printf("\n");
- BLOBHEADER blobHeader;
- RSAPUBKEY rsaPubkey;
- PBYTE p = NULL;
- p = pbKeyBlob;
- //分析得到的BLOB
- memcpy(&blobHeader.bType, p, );
- p += ;
- memcpy(&blobHeader.bVersion, p, );
- p += ;
- memcpy(&blobHeader.reserved, p, );
- p += ;
- memcpy(&blobHeader.aiKeyAlg, p, );
- p += ;
- memcpy(&rsaPubkey.magic, p, );
- p += ;
- memcpy(&rsaPubkey.bitlen, p, );
- p += ;
- memcpy(&rsaPubkey.pubexp, p, );
- p += ;
- PBYTE reaMod = (PBYTE)LocalAlloc(LPTR, rsaPubkey.bitlen/);
- memcpy(reaMod, p, rsaPubkey.bitlen/);
- //需要转换一下
- BYTE bTemp;
- for (int i=;i< rsaPubkey.bitlen//; i++)
- {
- bTemp = reaMod[i];
- reaMod[i] = reaMod[rsaPubkey.bitlen/ - i - ];
- reaMod[rsaPubkey.bitlen/- i - ] = bTemp;
- }
- printf("BLOBHEADER.bType=[%02x]\n", blobHeader.bType);
- printf("BLOBHEADER.bVersion=[%02x]\n", blobHeader.bVersion);
- printf("BLOBHEADER.reserved=[%d]\n", blobHeader.reserved);
- printf("BLOBHEADER.aiKeyAlg=[%d]\n\n", blobHeader.aiKeyAlg);
- printf("rsaPubkey.magic=[");
- char* q = (char *)&rsaPubkey.magic;
- for (int i = ;i<;i++)
- {
- printf("%c",*q++);
- }
- printf("]\nrsaPubkey.bitlen=[%d]\n", rsaPubkey.bitlen);
- printf("rsaPubkey.pubexp=[%d]\n", rsaPubkey.pubexp);
- printf("RSA MOD:\n");
- for(int i=;i<rsaPubkey.bitlen/;i++)
- {
- if (i % == )
- {
- printf("\n");
- }
- printf("%02X ", reaMod[i]);
- }
- printf("\n");
- //释放
- LocalFree(reaMod);
- free(pbKeyBlob);
- if (hKey)
- {
- CryptDestroyKey(hKey);
- }
- if(hCryptProv)
- {
- CryptReleaseContext(hCryptProv, );
- }
- if(CryptAcquireContext(
- &hCryptProv,
- NULL,
- NULL,
- PROV_RSA_FULL,
- CRYPT_DELETEKEYSET))
- {
- printf("删除容器成功\n");
- }
- else
- {
- HandleError("删除容器失败");
- }
- system("pause");
- return ;
- }
结果如下:
导出私钥的代码跟导出公钥类似,修改CryptExportKey函数的第3个参数为PRIVATEKEYBLOB 即可。
CSP学习之导出密钥BLOB 解析的更多相关文章
- CSP学习之CryptoAPI初识
Crypto API目的就是提供开发者在windows下使用PKI的编程接口. Crypto 提供了很多的加解密相关函数,如编码.解码.加密解密,哈希,数字证书.证书管理证书存储等. 有关 ...
- Batik - 将svg转换成其他格式图片或PDF - [导出服务器配置] 导出服务器原理解析
导出服务器原理解析 Highcharts图表导出(或下载)本质上是将SVG代码转换为不同文件格式的过程,用到的工具是batik,所以所谓导出服务器,只不过是调用batik,将SVG代码转换并下载.下图 ...
- Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition
Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...
- Android Animation学习(四) ApiDemos解析:多属性动画
Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- Android Animation学习(二) ApiDemos解析:基本Animatiors使用
Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...
- Mybatis源码学习之parsing包(解析器)(二)
简述 大家都知道mybatis中,无论是配置文件mybatis-config.xml,还是SQL语句,都是写在XML文件中的,那么mybatis是如何解析这些XML文件呢?这就是本文将要学习的就是,m ...
- 简单学习一下ibd数据文件解析
来源:原创投稿 作者:花家舍 简介:数据库技术爱好者. GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简单学习一下数据文件解析 这是尝试使用Golang语言简单解析My ...
随机推荐
- 跟我一起读postgresql源码(三)——Rewrite(查询重写模块)
上一篇博文我们阅读了postgresql中查询分析模块的源码.查询分析模块对前台送来的命令进行词法分析.语法分析和语义分析后获得对应的查询树(Query).在获得查询树之后,程序开始对查询树进行查询重 ...
- 11、C内存四区模型
转载于:https://blog.csdn.net/wu5215080/article/details/38899259 内存四区模型 图1.内存四区模型流程说明1.操作系统把物理硬盘代码load到内 ...
- iframe里面的元素触发父窗口元素事件的jquery代码 转
例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...
- /bin/bash: sshpass: command not found
按照如下命令进行安装即可: apt-get install sshpass
- ionic3 IPX留海适配
解决:使用 safe-area-inset-top 等 ios 安全区域变量 + meta 标签中设置 viewport-fit=cover https://github.com/pengkobe/r ...
- php 页面压缩---
网站优化中,页面压缩是很有效的一种方法,可以明显提升页面访问速度. 页面压缩也有很多的方法,有PHP自带的zlib的gzip压缩,还有清除html页面中不必要的字符,空格,注释,换行符等. 第一种打开 ...
- liunx php 安装 redis 扩展
切换到安装目录: cd /usr/local/ 下载php redis扩展:wget http://pecl.php.net/get/redis-2.2.8.tgz 更改名称压缩包名称: mv re ...
- abp架构添加实体并使用迁移功能生成表
参考: https://aspnetboilerplate.com/Pages/Articles/Introduction-With-AspNet-Core-And-Entity-Framework- ...
- QQ链接病毒分析
QQ链接病毒分析 特征 点击病毒链接后,自动会在每一时刻范围内通过所有途径群发新的病毒链接(途径包括Qzone,群聊等) 分析 首先看一下病毒链接的一个样例 http://news.soso.com/ ...
- 执行npm install 时会报 operation not permitted,unlink......错
问题现象:在我这项目目录中执行这命令就会报这个错. 问题原因: 后来查了查,说是 npm 5.4.0版本确实会有这个问题. https://github.com/npm/npm/issues/1828 ...