资源简介
用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
- 上一篇:Effective Modern C++.mobi
- 下一篇:C++程序设计_打飞碟
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
评论
共有 条评论