• 大小: 1.52MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-19
  • 语言: C/C++
  • 标签: C++  CryptAPI  

资源简介

用C++编写的调用CryptAPI库函数实现DH交换协议的演示程序,供学习参考

资源截图

代码片段和文件信息

#pragma   comment(lib“Crypt32.lib“)
#include 
#include 
#include 
#include “eboy_wincrypt.h“
//#include 

//#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
//#define KEYLENGTH  0x00800000
//#define ENCRYPT_ALGORITHM CALG_RC2 
//#define ENCRYPT_BLOCK_SIZE 8 
#define DHKEYSIZE 512


void HandleError(char *s);

static const BYTE g_rgbPrime[] = 
{
0x91 0x02 0xc8 0x31 0xee 0x36 0x07 0xec 
0xc2 0x24 0x37 0xf8 0xfb 0x3d 0x69 0x49 
0xac 0x7a 0xab 0x32 0xac 0xad 0xe9 0xc2 
0xaf 0x0e 0x21 0xb7 0xc5 0x2f 0x76 0xd0 
0xe5 0x82 0x78 0x0d 0x4f 0x32 0xb8 0xcb
0xf7 0x0c 0x8d 0xfb 0x3a 0xd8 0xc0 0xea 
0xcb 0x69 0x68 0xb0 0x9b 0x75 0x25 0x3d
0xaa 0x76 0x22 0x49 0x94 0xa4 0xf2 0x8d 
};

// Generator in little-endian format.
static BYTE g_rgbGenerator[] = 
{
0x02 0x88 0xd7 0xe6 0x53 0xaf 0x72 0xc5
0x8c 0x08 0x4b 0x46 0x6f 0x9f 0x2e 0xc4
0x9c 0x5c 0x92 0x21 0x95 0xb7 0xe5 0x58 
0xbf 0xba 0x24 0xfa 0xe5 0x9d 0xcb 0x71 
0x2e 0x2c 0xce 0x99 0xf3 0x10 0xff 0x3b
0xcb 0xef 0x6c 0x95 0x22 0x55 0x9d 0x29
0x00 0xb5 0x4c 0x5b 0xa5 0x63 0x31 0x41
0x13 0x0a 0xea 0x39 0x78 0x02 0x6d 0x62
};



//基于DH密钥交换协议的例子
void DH()
{
// PCHAR szSource; 
//   PCHAR szDestination; 
//   PCHAR szPassword; 
//   char  response;
BOOL fReturn;
HCRYPTPROV hCryptProv1 ; //密钥1的CSP
HCRYPTPROV hCryptProv2 ; //密钥2的CSP
HCRYPTKEY hPrivateKey1 = NULL;
    HCRYPTKEY hPrivateKey2 = NULL;
HCRYPTKEY hSessionKey1 = NULL;
    HCRYPTKEY hSessionKey2 = NULL;
DWORD dwDataLen1;
DWORD dwDataLen2;
DATA_BLOB P;
    DATA_BLOB G;
PBYTE pbKeyBlob1 = NULL;
PBYTE pbKeyBlob2 = NULL;
ALG_ID Algid = CALG_DES;
BYTE *pbData;
int i = 0;

P.cbData = DHKEYSIZE/8;
    P.pbData = (BYTE*)(g_rgbPrime);

    G.cbData = DHKEYSIZE/8;
    G.pbData = (BYTE*)(g_rgbGenerator);


BYTE g_rgbData[1000] = “Hello World“;//要加密的数据 会碰到缓冲区不足问题
DWORD dwLength = sizeof(g_rgbData);


printf(“连接CSP1(DH)...\n“);

if(CryptAcquireContext(
&hCryptProv1 
NULL 
MS_ENH_DSS_DH_PROV//MS_ENHANCED_PROV
PROV_DSS_DH //PROV_RSA_FULL
CRYPT_VERIFYCONTEXT)) //0
{
printf(“打开CSP1成功 \n“);
}
else
{
HandleError(“调用 CryptAcquireContext 出错!“); 
}


printf(“生成密钥对1...\n“);

if(CryptGenKey(
        hCryptProv1 
        CALG_DH_EPHEM 
DHKEYSIZE << 16 | CRYPT_EXPORTABLE | CRYPT_PREGEN
        &hPrivateKey1))
{
printf(“创建会话密钥1成功. \n“);

else
{
HandleError(“调用 CryptGenKey 出错!“); 
}

    // Set the prime for party 1‘s private key.
    fReturn = CryptSetKeyParam(
        hPrivateKey1
        KP_P
        (PBYTE)&P
        0);
    if(!fReturn)
    {
        goto ErrorExit;
    }

    // Set the generator for party 1‘s private key.
    fReturn = CryptSetKeyParam(
        hPrivateK

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-03-19 02:08  dh\
     目录           0  2012-04-05 21:40  dh\Debug\
     文件      155715  2012-03-19 02:07  dh\Debug\dh.exe
     文件      193996  2012-03-19 02:07  dh\Debug\dh.ilk
     文件     3561764  2012-03-19 00:11  dh\Debug\dh.pch
     文件      418816  2012-03-19 02:07  dh\Debug\dh.pdb
     文件       25506  2012-03-19 02:07  dh\Debug\dh_alice.obj
     文件           9  2012-04-05 21:40  dh\Debug\run.bat
     文件      164864  2012-03-19 02:07  dh\Debug\vc60.idb
     文件       77824  2012-03-19 02:07  dh\Debug\vc60.pdb
     文件        4236  2012-03-18 18:30  dh\dh.dsp
     文件         529  2012-03-18 18:09  dh\dh.dsw
     文件       66560  2012-03-19 02:08  dh\dh.ncb
     文件       54784  2012-03-19 02:08  dh\dh.opt
     文件        1389  2012-03-19 02:07  dh\dh.plg
     文件        8871  2012-03-19 02:08  dh\dh_alice.cpp
     文件      656247  2012-03-18 23:27  dh\eboy_wincrypt.h
     目录           0  2012-03-19 00:04  dh\lib\
     文件      264106  1999-02-13 11:03  dh\lib\Crypt32.Lib

评论

共有 条评论