密钥(Cryptographic key)是一个基于RSA公匙加密体系的邮件加密软件。它能对你的邮件加上数字签名从而使收信人可以确信邮件是你发来的。它让你可以安全地和你从未见过的人们通讯,事先并不需要任何保密的渠道用来传递密匙。它采用了:审慎的密匙管理,一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等,还有一个良好的人机工程设计。它的功能强大,有很快的速度。密钥(Cryptographic key)是用在加密和解密过程的会话(均衡)密钥和用在认证过程中公共密钥和私有密钥。在这三种密钥中,会话密钥和私有密钥必须一直保密。(

PGP加密系统是采用公开密钥加密与传统密钥加密相结合的一种加密技术。它使用一对数学上相关的钥匙,其中一个(公钥)用来加密信息,另一个(私钥)用来解密信息。   PGP采用的传统加密技术部分所使用的密钥称为“会话密钥”(sek)。每次使用时,PGP都随机产生一个128位的IDEA会话密钥,用来加密报文。公开密钥加密技术中的公钥和私钥则用来加密会话密钥,并通过它间接地保护报文内容。   PGP中的每个公钥和私钥都伴随着一个密钥证书。它一般包含以下内容: 密钥内容(用长达百位的大数字表示的密钥) 密钥类型(表示该密钥为公钥还是私钥) 密钥长度(密钥的长度,以二进制位表示) 密钥编号(用以唯一标识该密钥) 创建时间 用户标识 (密钥创建人的信息,如姓名、电子邮件等) 密钥指纹(为128位的数字,是密钥内容的提要表示密钥唯一的特征) 中介人签名(中介人的数字签名,声明该密钥及其所有者的真实性,包括中介人的密钥编号和标识信息)   PGP把公钥和私钥存放在密钥环(KEYR)文件中。PGP提供有效的算法查找用户需要的密钥。   PGP在多处需要用到口令,它主要起到保护私钥的作用。由于私钥太长且无规律,所以难以记忆。PGP把它用口令加密后存入密钥环,这样用户可以用易记的口令间接使用私钥。   PGP的每个私钥都由一个相应的口令加密。PGP主要在3处需要用户输入口令: 需要解开受到的加密信息时,PGP需要用户输入口令,取出私钥解密信息 当用户需要为文件或信息签字时,用户输入口令,取出私钥加密 对磁盘上的文件进行传统加密时,需要用户输入口令

我们来用VC++实现导出会话密钥例子程序,请见代码实现与注释讲解

#include <stdio.h> #include <windows.h> #include <wincrypt.h> #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) HCRYPTPROV GetCryptProv(); void HandleError(char *s); void main(void) { //-------------------------------------------------------------------- // 变量申明与初始化 HCRYPTPROV hProv; // CSP句柄 HCRYPTKEY hXchgKey; // 交换密钥对句柄 HCRYPTKEY hKey; // 会话密钥句柄 BYTE *pbKeyBlob; // 简单密钥块指针 DWORD dwBlobLen; // 密钥块长度 //-------------------------------------------------------------------- //获取加密服务者句柄 hProv = GetCryptProv(); //-------------------------------------------------------------------- // 创建交换密钥 if(CryptGenKey( hProv, AT_KEYEXCHANGE, 0, &hXchgKey)) { printf("交换密钥已被创建.\n"); } else { HandleError("在试图创建交换密钥时发生错误.\n"); } //-------------------------------------------------------------------- // 创建会话密钥. if (CryptGenKey( hProv, CALG_RC4, CRYPT_EXPORTABLE, &hKey)) { printf("原会话密钥被创建. \n"); } else { HandleError("ERROR -- CryptGenKey."); } // 确定密钥数据块的长度. if(CryptExportKey( hKey, //待导出的密钥 hXchgKey, //密钥数据块用此密钥加密 SIMPLEBLOB, 0, NULL, //密钥块,为空时用于返回密钥块的长度 &dwBlobLen)) //密钥块数据长度 { printf("此会话密钥数据块长度已确定. \n"); } else { HandleError("计算密钥数据块长度出错."); } if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) { printf("已经为此数据块分配了内存空间. \n"); } else { HandleError("所需内存不够. \n"); } //-------------------------------------------------------------------- // 导出密钥到简单密钥数据块 if(CryptExportKey( hKey, //待导出的密钥 hXchgKey, //密钥数据块用此密钥加密 SIMPLEBLOB, //导出的密钥块类型 0, pbKeyBlob, //密钥块 &dwBlobLen)) //密钥块数据长度 { printf("待导出密钥的内容已经被写入此数据块. \n"); } else { HandleError("Error during CryptExportKey."); } //-------------------------------------------------------------------- // 从CSP导出密钥到密钥数据块后,可以通过一些其他处理来保存密钥块, // 比如把密钥数据块写到文件中. //-------------------------------------------------------------------- // 释放密钥数据块内存. free(pbKeyBlob); // 销毁会话密钥. if(hKey) CryptDestroyKey(hKey); // 销毁交换密钥对 if(hXchgKey) CryptDestroyKey(hXchgKey); // 释放CSP句柄 if(hProv) CryptReleaseContext(hProv, 0); printf("此程序运行完成无错. \n"); }// End of main //获取加密提供者句柄 HCRYPTPROV GetCryptProv() { HCRYPTPROV hCryptProv; // 加密服务提供者句柄 //获取加密提供者句柄 if(CryptAcquireContext( &hCryptProv, // 加密服务提供者句柄 NULL, // 密钥容器名,这里使用登陆用户名 MS_ENHANCED_PROV, // 加密服务提供者 PROV_RSA_FULL, // 加密服务提供者类型,可以提供加密和签名等功能 0)) // 标志 { printf("加密服务提供者句柄获取成功!\n"); } else { //重新建立一个新的密钥集 if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { HandleError("重新建立一个新的密钥集出错!"); } } return hCryptProv; } // HandleError:错误处理函数,打印错误信息,并退出程序 void HandleError(char *s) { printf("程序执行发生错误!\n"); printf("%s\n",s); printf("错误代码为: %x.\n",GetLastError()); printf("程序终止执行!\n"); exit(1); }

转载于:https://www.cnblogs.com/yincheng01/archive/2011/12/17/2311152.html

vc++网络安全编程范例(15)-导出会话密钥相关推荐

  1. vc++网络安全编程范例(14)-openssl bio编程

    OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的. 作为一个基于密码学的安全开发包,OpenS ...

  2. VC++网络安全编程范例(2)-创建自签名证书

    数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密.解密.每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名:同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享, ...

  3. vc++网络安全编程范例(19)实现数字信封打包与拆解

    数字信封是将对称密钥通过非对称加密(即:有公钥和私钥两个)的结果分发对称密钥的方法. PKCS#7中将数字信封作为术语进行定义,而在正文中对进行了如下解释:数字信封包含被加密的内容和被加密的用于加密该 ...

  4. VC++网络安全编程范例(1)--数字证书有效期验证

    数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证.它是由一个由权威机构-----CA机构,又称为 ...

  5. VC++动态链接库编程(转载)

    注:以下为转载:2005-10  作者:宋宝华  出处:天极网  http://soft.yesky.com/lesson/318/2166818.shtml VC++动态链接库编程之非MFC DLL ...

  6. vc 动态链接库编程2

    4.非MFC DLL 4.1一个简单的DLL 第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数. 如图6,在VC++中new一个Win ...

  7. VC数据库编程总结(二)

    一.访问数据库技术方法......................................................................................... ...

  8. VC++ 常用编程技巧总结

    VC++6.0的使用以及编程技巧整理 1.MDI子窗口一启动就最大化      BOOL   CChildFrame::PreCreateWindow(CREATESTRUCT&   cs) ...

  9. matlab编程范例_编程范例到底是什么?

    matlab编程范例 Any fool can write code that a computer can understand. Good programmers write code that ...

  10. 利用Python和win32编程范例——按需定制一个按键精灵

    转自:作者 橘子一方 http://www.orangecube.net/articles/python-win32-example.html 利用Python和win32编程范例--按需定制一个按键 ...

最新文章

  1. [caffe] 数据制作和训练
  2. C/C++中.和-的用法区别
  3. 开源软件 商业软件_如何撰写开源软件
  4. 诺基亚挥别Qt,转手给Digia
  5. 关于Object[]数组强转成Integer[]类型的数组.
  6. TortoiseGit客户端安装及使用(上传代码到git@osc
  7. android gradle 离线安装,Android Studio离线配置gradle(附gradle下载地址)
  8. [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
  9. 蓝桥杯试题 基础练习 圆的面积
  10. 从头开始阅读PyTorch代码 -- Operators篇
  11. 坐落尘世的繁华,幽眉清黛任花开花谢
  12. 给我疯狂内卷!GitHub再现星标86K面试手册,37K!妥妥的
  13. 萌新首发,C/C++(通讯录管理系统)希望大家多多关注、点赞
  14. CAD软件中怎么管理设备CAD图层?
  15. TIA博途V17中如何创建和使用VoT应用程序_Web功能
  16. 【管理心得之八】通过现象看本质,小王和小张谁更胜任?
  17. 我所热衷的编程生涯 连载(11)
  18. 轻松获得最新的网通、电信、铁通IP地址分配段
  19. 思考未来--马云说:30年后的世界不属于互联网公司
  20. Centos查看端口占用

热门文章

  1. 微信小程序云开发教程-WXML入门-基本语法
  2. 遍历数组的两种for循环方式以及一种Arrays方式
  3. android 串口调试数据手机收不到,记录一次安卓串口一次接收全部数据时,发生的错误...
  4. android sd卡 格式化 rom,Android 系统获取内存,ROM,SD卡大小
  5. MyBatis学习(二)使用注解开发、Mybatis 执行流程、一对多多对一的结果集映射
  6. java map原理_Java中的HashMap的工作原理是什么?
  7. d1800芯片_基于D1800的收音/对讲机设计制作
  8. python3语法学习第五天--函数(1)
  9. 1047 糖果 01背包扩展
  10. MongoDB 数据库_集合_文档 操作