如何: 用加密API获得纯文本的会话密钥

原创 2002年01月04日 10:39:00
 

如何:        用加密API获得纯文本的会话密钥<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

运行环境: VC6 SP5, 2000 SP1,NT4 SP3

在通常的编程中获得会话密钥匙非常重要的。然而,微软的加密操作API(无论是基础的还是增强的)都不能提供这项功能。CryptExportKey() CryptImportKey() 各自要求一个有效的密钥句柄来对会话密钥进行加密和解密。MSDN 展示了一种使用私钥的方法。但是微软的这个在MSDN中例子相当的长。下面的这个方法不仅更快而且更有效。

在运行这个例子前,需要在Project -> Settings (Visual Studio 6.0 ) 中对以下参数进行设置:

1.添加C++预处理定义:

   _WIN32_WINNT=0x0500, _CRYPT32_(WIN2K)

 或者 _WIN32_WINNT=0x0400, _CRYPT32_(NT4)

2. 加入库连接

{0>  crypt32.lib <}0{>?  crypt32.lib

 

例子代码如下:?<0}

#include <windows.h>

#include <wincrypt.h>

#include <stdio.h>

 

#define KEY_PAIR_SIZE     dwSize - 12

#define SESSION_KEY_SIZE  dwKeyMaterial

 

void main()

{

  

   HCRYPTPROV hProv = 0;

   HCRYPTKEY hExchangeKeyPair = 0;

   HCRYPTKEY hSessionKey = 0;

   BYTE *pbKeyMaterial  = NULL;

   DWORD dwKeyMaterial ;   

   BYTE *pbExportedKeyBlob = NULL;

   BYTE *pbEncryptedKey    = NULL;

   DWORD dwSize;

   unsigned int c;

      

   __try

   {

                 

    if (!CryptAcquireContext( &hProv, 

                              "Container Name", 

                              MS_ENHANCED_PROV , 

                              PROV_RSA_FULL, 

                              CRYPT_MACHINE_KEYSET ))

    {

      __leave;

    }

  

    //---------------------------------------------------

//创建一个会话密钥。在这个例子中我们将使用一个168位的3DES key

 

    if (!CryptGenKey( hProv, CALG_3DES, 

                      CRYPT_EXPORTABLE, &hSessionKey ))

    {

      __leave;

    }

 

    //---------------------------------------------------

//得到交换密钥对的句柄

                                       

    if (!CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hExchangeKeyPair))

    {

      __leave;

    }

 

    //--------------------------------------------------------

//用密钥对中公钥部分对会话密钥进行加密

//第一次先获得已加密的会话密钥的必要字节大小

//然后将其输出。

                               

    if (!CryptExportKey( hSessionKey, 

                         hExchangeKeyPair, 

                         SIMPLEBLOB, 

                         0, 

                         NULL, 

                         &dwSize))

    {

      __leave;

    }

 

    pbExportedKeyBlob = new BYTE[dwSize];

 

    if (!CryptExportKey( hSessionKey, 

                         hExchangeKeyPair, 

                         SIMPLEBLOB, 

                         0, 

                         pbExportedKeyBlob,  

                         &dwSize))

    {

      __leave;

    }

  

    //--------------------------------------------------------

//我们删除第一个12字节大小的Blob 信息 

                               

    pbEncryptedKey  =  new BYTE [KEY_PAIR_SIZE];  

                               

    for ( c = 0 ; c < KEY_PAIR_SIZE ; c++ )

    {

      pbEncryptedKey[c] =  pbExportedKeyBlob[c+12]; 

    }

                               

    //--------------------------------------------------------

//此时我们用密钥对中的私钥部分就可以得到会话密钥的值。

 

                               

    if (!CryptDecrypt( hExchangeKeyPair, 0, 

                       TRUE, 0,  

                       pbEncryptedKey, &dwKeyMaterial))

    {

      __leave;

    }

                               

    //-------------------------------------------------------

// pbKeyMaterial中存放着密钥的值

                               

    pbKeyMaterial = new BYTE[ SESSION_KEY_SIZE ];

                               

    for        ( c = 0; c <  SESSION_KEY_SIZE ; c++ )

    {

      pbKeyMaterial[c] = pbEncryptedKey[c];

    }

   

   }

   __finally

   {

      if (pbKeyMaterial ) LocalFree(pbKeyMaterial );

      if (hSessionKey) CryptDestroyKey(hSessionKey);

      if (hExchangeKeyPair) CryptDestroyKey(hExchangeKeyPair);

      if (hProv) 

      {  

         CryptReleaseContext(hProv, 0);

      }

   

   }

 

} // 结束

 

C#编程使用Managed Wifi API连接无线SSID

如何用C#去操作无线网卡连接无线网络一直是个人学习过程中的一大困惑。好在最近成功解决了这个问题。最近在写一个中国电信ChinaNet无线热点自动连接工具,期间用到了Managed Wifi API,使...
  • m593192219
  • m593192219
  • 2013年07月18日 09:41
  • 11331

C#编程使用Managed Wifi API连接wifi整理(一)

一、Managed Wifi API简介 1.这是一个.Net类库允许控制无线网络适配器(802.11)安装在你的Windows机器编程。 2.这个类库使用本地WiFi的API,不支持旧版本的Wi...
  • u011127019
  • u011127019
  • 2017年02月26日 23:51
  • 2780

C#使用managedwif连接wifi(支持WPA2_PSK、WPA2_PSK、WEP)

http://pan.baidu.com/s/1c0Iqsve       managedwif及代码 public partial class Form1 : Form { ...
  • dingguidong
  • dingguidong
  • 2015年03月09日 15:53
  • 1596

利用系统API实现AES加解密功能

AES(高级加密算法)本身是一个比较复杂的加密算法,就算法本身而言,我曾经看过加密原理,但是能力有限,实在是看不懂。这里只是贴出使用iOS自带的API实现的加解密功能代码。作为标记,以免下次用到时,找...
  • jimi_yuan
  • jimi_yuan
  • 2016年03月21日 17:09
  • 535

关于openssl加解密文件的几个API

今天心血来潮突然想搞搞openssl了,趁着端午小假,刚好有空可以鼓捣孤岛自己喜欢的东西,出去东奔西跑的实在太造孽了,还是宅起来给自己充充电吧。下载openssl最新代码1.0.1g,修复了“心血漏洞...
  • jiangheng0535
  • jiangheng0535
  • 2014年12月04日 08:34
  • 1651

C#的DES加密解密算法

des是常用的对称加密解密方法,下面是C#下的核心代码 ///          /// 进行DES加密。         ///          /// 要加密的字符串。      ...
  • henren555
  • henren555
  • 2014年11月29日 08:59
  • 913

利用Base64编码加密解密文本

开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了。实际上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容,花几分钟时间就...
  • simplebam
  • simplebam
  • 2017年05月04日 16:36
  • 586

DEC 加密和解密

DEC 加密和解密通用帮助类: using System; using System.Data; using System.Configuration; using System.Web; using...
  • fuyifang
  • fuyifang
  • 2015年07月19日 22:28
  • 2564

api接口数据加密和身份验证

一、加密方式 对称加密和非对称加密。 对称加密:加解密是同一个密钥,速度快,数据接收方需要公布其私钥给数据传输方,安全性完全依赖于该密钥。如AES,3DES,DES等,适合做大量数据或数据文件的加解密...
  • hi_robert
  • hi_robert
  • 2017年07月04日 10:24
  • 1243

C#实现AES(Rijndael算法)加密解密

AES(Rijndael算法) Rijndael(读作rain-dahl)是由美国国家标准与技术协会(NIST)所选的高级加密标准(AES)的候选算法。 Rijndael算法首先是一个密钥分组加...
  • qq563129582
  • qq563129582
  • 2017年05月16日 11:20
  • 2334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何: 用加密API获得纯文本的会话密钥
举报原因:
原因补充:

(最多只允许输入30个字)