// ---------------------------------------------------------------------------
#pragma hdrstop
#include "dh.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall TDH::TDH(String algorithm)
{
hCryptProv = NULL;
hPrivateKey = NULL;
hSessionKey = NULL;
dwPublicKeyLen = 0;
P.cbData = DHKEYSIZE / 8;
P.pbData = (BYTE*)(g_rgbPrime);
G.cbData = DHKEYSIZE / 8;
G.pbData = (BYTE*)(g_rgbGenerator);
if (algorithm == "RC4")
Algid = CALG_RC4;
else if (algorithm == "DES")
Algid = CALG_DES;
else if (algorithm == "3DES")
Algid = CALG_3DES;
}
__fastcall TDH::~TDH()
{
if (pbKeyBlob)
delete[]pbKeyBlob;
if (hCryptProv)
{
CryptDestroyKey(hPrivateKey);
hPrivateKey = NULL;
}
if (hSessionKey)
{
CryptDestroyKey(hSessionKey);
hSessionKey = NULL;
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv, 0);
hCryptProv = NULL;
}
}
bool TDH::GenKey()
{
// 获取csp环境
if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENH_DSS_DH_PROV, PROV_DSS_DH, CRYPT_VERIFYCONTEXT))
{
strErrorMessage = "cryptAcquireContext error, getlasterror=" + String(GetLastError());
return false;
}
// 生成密钥对
if (!CryptGenKey(hCryptProv, CALG_DH_EPHEM, DHKEYSIZE << 16 | CRYPT_EXPORTABLE | CRYPT_PREGEN, &hPrivateKey))
{
strErrorMessage = "CryptGenKey error, getlasterror=" + String(GetLastError());
return false;
}
if (!CryptSetKeyParam(hPrivateKey, KP_P, (PBYTE) & P, 0))
{
strErrorMessage = "CryptSetKeyParam kp_p error, getlasterror=" + String(GetLastError());
return false;
}
if (!CryptSetKeyParam(hPrivateKey, KP_G, (PBYTE) & G, 0))
{
strErrorMessage = "CryptSetKeyParam kp_G error, getlasterror=" + String(GetLastError());
return false;
}
if (!CryptSetKeyParam(hPrivateKey, KP_X, NULL, 0))
{
strErrorMessage = "CryptSetKeyParam kp_X error, getlasterror=" + String(GetLastError());
return false;
}
// DWORD LX1;
// CryptGetKeyParam(hPrivateKey, KP_KEYVAL, pbData, & LX1, 0);
// 导出1的公钥
if (!CryptExportKey(hPrivateKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwPublicKeyLen))
{
strErrorMessage = "export key error ,getlasterror=" + String(GetLastError());
return false;
}
pbKeyBlob = new BYTE[dwPublicKeyLen];
if (!CryptExportKey(hPrivateKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwPublicKeyLen))
{
strErrorMessage = "export key error ,getlasterror=" + String(GetLastError());
return false;
}
return true;
}
BYTE *TDH::GetPublicKey()
{
return pbKeyBlob;
}
int TDH::GetPublicKeyLen()
{
return dwPublicKeyLen;
}
bool TDH::ImportOtherPublicKey(BYTE *pubkey, int pubkeylen)
{
// 导入对方密钥,计算出会话Session
// party 2 导入1的公钥得到 会话密钥1
if (!CryptImportKey(hCryptProv, pubkey, pubkeylen, hPrivateKey, 0, &hSessionKey))
{
strErrorMessage = "CryptImportKey error ,getlasterror=" + String(GetLastError());
return false;
}
// 将会话密钥1转化为对称密钥
if (!CryptSetKeyParam(hSessionKey, KP_ALGID, (PBYTE) & Algid, 0))
{
strErrorMessage = "CryptSetKeyParam error ,getlasterror=" + String(GetLastError());
return false;
}
return true;
}
DWORD TDH::GetCryptedLen(DWORD srclen)
{
// 获取加密后的长度
DWORD dwLength = srclen;
if (!CryptEncrypt(hSessionKey, 0, TRUE, 0, NULL, &dwLength, srclen))
{
strErrorMessage = "CryptEncrypt get length error ,getlasterror=" + String(GetLastError());
return 0;
}
return dwLength;
}
bool TDH::CryptedData(BYTE *data, DWORD datalen, DWORD databufferlen)
{
// 加密数据,加密后的数据还是放在data缓冲区中,可能加密后的数据要大
// 所以dababufferlen可能要比datalen大,免得缓冲区溢出
// 可在调用前先调用getcryptedlen来获得加密后的长度
if (!CryptEncrypt(hSessionKey, 0, TRUE, 0, data, &datalen, databufferlen))
{
strErrorMessage = "CryptEncrypt error ,getlasterror=" + String(GetLastError());
return false;
}
return true;
}
bool TDH::DecryptData(BYTE *data, DWORD &datalen)
{
// datalen进来的是加密数据的大小,执行结束后,是解密后的数据的大小
if (!CryptDecrypt(hSessionKey, 0, TRUE, 0, data, &datalen))
{
strErrorMessage = "CryptDecrypt error ,getlasterror=" + String(GetLastError());
return false;
}
return true;
}
String TDH::GetLastErrorMessage()
{
return strErrorMessage;
}
没有合适的资源?快使用搜索试试~ 我知道了~
Diffie-Hellman 应用,利用CryptAPI实现DH算法的应用
共11个文件
h:3个
cpp:3个
exe:1个
4星 · 超过85%的资源 需积分: 14 38 下载量 158 浏览量
2015-02-11
15:07:27
上传
评论 3
收藏 106KB RAR 举报
温馨提示
初学了一下CryptAPI,主要是需要使用DH算法,经过几天的摸索,把CryptAPI中关于dh算法的东西简单封装了一下,程序主要通过DH算法来获取密钥,然后使用密钥来加密,加密算法可选择des,3des,rc4,加密10M的数据,循环10次,des用时4秒左右,3des用时9秒左右,rc4用时1秒左右 使用c++Builder xe7编译 程序中有中文注释,如有错误的地方,也请留言指出
资源推荐
资源详情
资源评论
收起资源包目录
cryptoapi.rar (11个子文件)
Main.dfm 1KB
Win32
Debug
cryptoapi.exe 117KB
cryptoapiPCH1.h 40B
cryptoapi.res 52KB
cryptoapi.cpp 873B
dh.h 2KB
Main.cpp 4KB
Main.h 1KB
cryptoapi.cbproj.local 2KB
dh.cpp 4KB
cryptoapi.cbproj 29KB
共 11 条
- 1
资源评论
- 英雄无敌0022015-06-29不错,对我有帮助,研究下先
- HONGSEDAIMA12017-05-03好像还不错。先看看。
LinuxCard
- 粉丝: 29
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功