?? keyoperation.cpp
字號(hào):
// KeyOperation.cpp: implementation of the CKeyOperation class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CSPtest.h"
#include "KeyOperation.h"
#include "wincrypt.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CKeyOperation::CKeyOperation()
{
m_hProv = 0; //加密提供商句柄
m_hKey = 0; //密鑰對(duì)句柄
}
CKeyOperation::~CKeyOperation()
{
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_GenRsaKey(int nFlag)
+輸入?yún)?shù): nFlag 密鑰對(duì)類型 1.簽名密鑰對(duì) 2. 加密密鑰對(duì)
+輸出參數(shù): 無
+返回值:
+其他說明:通過函數(shù)產(chǎn)生RSA密鑰對(duì)
***********************************************************************/
int CKeyOperation::CRYPTAPI_GenRsaKey(int nFlag)
{
//刪除CSP中存在的容器
CryptAcquireContext(&m_hProv, "RSA", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(!CryptAcquireContext(&m_hProv, "RSA", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return -1;
//產(chǎn)生非對(duì)稱密鑰對(duì)
if(nFlag == 1)
{
if(!CryptGenKey(m_hProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &m_hKey))
{
//刪除容器 釋放上下文
CryptAcquireContext(&m_hProv, "RSA", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -3;
}
}
else if(nFlag == 2)
{
if(!CryptGenKey(m_hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &m_hKey))
{
//刪除容器 釋放上下文
CryptAcquireContext(&m_hProv, "RSA", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -4;
}
}
else
{
CryptAcquireContext(&m_hProv, "RSA", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -5;
}
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_ExportPubKey(int nFlag, unsigned char *pbPubKeyData, int &nDataLen)
+輸入?yún)?shù): nFlag 密鑰對(duì)類型 1.簽名密鑰對(duì) 2. 加密密鑰對(duì)
+ pbPubKeyData 公鑰數(shù)據(jù)
+ nDataLen 公鑰數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): nDataLen 公鑰數(shù)據(jù)長(zhǎng)度
+ pbPubKeyData 公鑰數(shù)據(jù)
+返回值:
+其他說明:將產(chǎn)生的RSA密鑰對(duì)的公鑰導(dǎo)出
***********************************************************************/
int CKeyOperation::CRYPTAPI_ExportPubKey(int nFlag, unsigned char *pbPubKeyData, int &nDataLen)
{
int r;
unsigned char *szPubBlob;
int nPubBlobLen;
r = CRYPTAPI_GenRsaKey(nFlag);
if(r != 0)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -1;
}
r = CryptExportKey(m_hKey, NULL, PUBLICKEYBLOB, NULL, NULL, (unsigned long *)&nPubBlobLen);
if(!r)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
szPubBlob = (unsigned char *)malloc(nPubBlobLen+1); //分配緩沖區(qū)
r = CryptExportKey(m_hKey, NULL, PUBLICKEYBLOB, NULL, szPubBlob, (unsigned long *)&nPubBlobLen);
int b = GetLastError();
if(!r)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
free(szPubBlob);
}
nDataLen = nPubBlobLen;
memcpy(pbPubKeyData, szPubBlob, nPubBlobLen);
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_RSAEncrypt(unsigned char *pbSrcData, int nSrcLen,
+ unsigned char *pbDestData, int &nDestLen)
+輸入?yún)?shù): pbSrcData 待加密數(shù)據(jù)
+ nSrcLen 待加密數(shù)據(jù)長(zhǎng)度
+ pbDestData 加密后數(shù)據(jù)
+ nDestLen 加密后數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 加密后數(shù)據(jù)
+ nDestLen 加密后數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明:使用加密私鑰來加密數(shù)據(jù)(注意CSP默認(rèn)的非對(duì)稱加密數(shù)據(jù)長(zhǎng)度不能超過 117個(gè)字節(jié))
***********************************************************************/
int CKeyOperation::CRYPTAPI_RSAEncrypt(unsigned char *pbSrcData, int nSrcLen, unsigned char *pbDestData, int &nDestLen)
{
int r;
CryptAcquireContext(&m_hProv, "ASYENCRYPT", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(!CryptAcquireContext(&m_hProv, "ASYENCRYPT", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return -1;
//產(chǎn)生密鑰對(duì)
if(!CryptGenKey(m_hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &m_hKey))
//刪除容器
CryptAcquireContext(&m_hProv, "ASYENCRYPT", MS_ENHANCED_PROV,
PROV_RSA_FULL, CRYPT_DELETEKEYSET);
CryptReleaseContext(m_hProv, 0);
return -2;
}
r = CryptEncrypt(m_hKey, 0, TRUE, 0, pbSrcData, (unsigned long *)&nSrcLen, 128);
if(!r)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(m_hKey)
CryptDestroyKey(m_hKey);
return -2;
}
nDestLen = nSrcLen;
memcpy(pbDestData, pbSrcData, nDestLen);
if(m_hKey)
CryptDestroyKey(m_hKey);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_RSADecrypt(unsigned char *pbSrcData, int nSrcLen,
+ unsigned char *pbDestData, int &nDestLen)
+輸入?yún)?shù): pbSrcData 待解密數(shù)據(jù)
+ nSrcLen 待解密數(shù)據(jù)長(zhǎng)度
+ pbDestData 解密后數(shù)據(jù)
+ nDestLen 解密后數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 解密后數(shù)據(jù)
+ nDestLen 解密后數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明:使用加密公鑰來解密數(shù)據(jù)(由于定義是成員變量m_hProv, m_hKey所以必須解密前要先執(zhí)行加密,這樣才能保證私鑰不被覆蓋)
***********************************************************************/
int CKeyOperation::CRYPTAPI_RSADecrypt(unsigned char *pbSrcData, int nSrcLen, unsigned char *pbDestData, int &nDestLen)
{
if(!CryptAcquireContext(&m_hProv, "ASYENCRYPT", MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
return -1;
//獲得用戶加密私鑰句柄
if(!CryptGetUserKey(m_hProv, AT_KEYEXCHANGE, &m_hKey))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
//開始解密數(shù)據(jù)
int r = CryptDecrypt(m_hKey, 0, TRUE, 0, pbSrcData, (unsigned long *)&nSrcLen);
if(!r)
{
return -3;
}
nDestLen = nSrcLen;
memcpy(pbDestData, pbSrcData, nDestLen);
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_Encrypt()
+輸入?yún)?shù): pbPWD 對(duì)稱加密的口令
+ nPWDLen 口令長(zhǎng)度
+ pbSrcData 待加密數(shù)據(jù)
+ nSrcLen 待加密數(shù)據(jù)長(zhǎng)度
+ pbDestData 加密后數(shù)據(jù)
+ nDestLen 加密后數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 加密后數(shù)據(jù)
+ nDestLen 加密后數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明:使用本地的對(duì)稱算法來加密數(shù)據(jù)(采用口令方式,如果要換對(duì)稱加密算法只需要換個(gè)宏定義就可以拉 默認(rèn)DES算法)
***********************************************************************/
int CKeyOperation::CRYPTAPI_Encrypt(unsigned char *pbPWD, int nPWDLen,
unsigned char *pbSrcData, int nSrcLen,
unsigned char *pbDestData, int &nDestLen)
{
//刪除CSP中存在的容器
CryptAcquireContext(&m_hProv, "DES", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(!CryptAcquireContext(&m_hProv, "DES", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return -1;
HCRYPTHASH hHash;
HCRYPTKEY hEncryptKey;
//創(chuàng)建HASH對(duì)象
if(!CryptCreateHash(m_hProv, CALG_SHA, 0, 0, &hHash))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
//HASH 口令
if(!CryptHashData(hHash, pbPWD, nPWDLen, 0))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if (hHash)
CryptDestroyKey(hHash);
return -3;
}
//導(dǎo)出對(duì)稱加密密鑰
if(!CryptDeriveKey(m_hProv, CALG_DES, hHash, CRYPT_CREATE_SALT, &hEncryptKey))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if (hHash)
CryptDestroyKey(hHash);
return -4;
}
CryptDestroyKey(hHash);
hHash = 0;
//對(duì)稱加密
int r = CryptEncrypt(hEncryptKey, NULL, TRUE, NULL, pbSrcData, (unsigned long *)&nSrcLen, (unsigned long)nSrcLen+256);
if(!r)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if (hEncryptKey)
CryptDestroyKey(hEncryptKey);
return -5;
}
nDestLen = nSrcLen;
memcpy(pbDestData, pbSrcData, nDestLen);
if(hEncryptKey)
CryptDestroyKey(hEncryptKey);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return 0 ;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_Decrypt()
+輸入?yún)?shù): pbPWD 對(duì)稱加密的口令
+ nPWDLen 口令長(zhǎng)度
+ pbSrcData 待解密數(shù)據(jù)
+ nSrcLen 待解密數(shù)據(jù)長(zhǎng)度
+ pbDestData 解密后數(shù)據(jù)
+ nDestLen 解密后數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 解密后數(shù)據(jù)
+ nDestLen 解密后數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明:使用本地的對(duì)稱算法來解密數(shù)據(jù)(采用口令方式,如果要換對(duì)稱解密算法只需要換個(gè)宏定義就可以拉 默認(rèn)DES算法)
***********************************************************************/
int CKeyOperation::CRYPTAPI_Decrypt(unsigned char *pbPWD, int nPWDLen, unsigned char *pbSrcData, int nSrcLen, unsigned char *pbDestData, int &nDestLen)
{
int r;
if(!CryptAcquireContext(&m_hProv, "DES", MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
return -1;
HCRYPTHASH hHash;
HCRYPTKEY hDecryptKey;
//創(chuàng)建HASH對(duì)象
if(!CryptCreateHash(m_hProv, CALG_SHA, 0, 0, &hHash))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
//HASH 口令
if(!CryptHashData(hHash, pbPWD, nPWDLen, 0))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if (hHash)
CryptDestroyKey(hHash);
return -3;
}
//導(dǎo)出對(duì)稱加密密鑰
if(!CryptDeriveKey(m_hProv, CALG_DES, hHash, CRYPT_CREATE_SALT, &hDecryptKey))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if (hHash)
CryptDestroyKey(hHash);
return -4;
}
CryptDestroyKey(hHash);
hHash = 0;
//解密數(shù)據(jù)
r = CryptDecrypt(hDecryptKey, NULL, TRUE, NULL, pbSrcData, (unsigned long *)&nSrcLen);
if(!r)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hDecryptKey)
CryptDestroyKey(hDecryptKey);
return -5;
}
nDestLen = nSrcLen;
memcpy(pbDestData, pbSrcData, nDestLen);
if(hDecryptKey)
CryptDestroyKey(hDecryptKey);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_RSASign()
+輸入?yún)?shù): pbSrcData 待簽名數(shù)據(jù)
+ nSrcLen 待簽名數(shù)據(jù)長(zhǎng)度
+ pbDestData 簽名后數(shù)據(jù)
+ nDestLen 簽名后數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 簽名后數(shù)據(jù)
+ nDestLen 簽名后數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明: 簽名HASH后的數(shù)據(jù)
***********************************************************************/
int CKeyOperation::CRYPTAPI_RSASign(unsigned char *pbSrcData, int nSrcLen,
unsigned char *pbDestData, int *pnDestLen)
{
CryptAcquireContext(&m_hProv, "ASYSIGN", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(!CryptAcquireContext(&m_hProv, "ASYSIGN", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
return -1;
int r = CryptGenKey(m_hProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &m_hKey);
if(!r)
{
CryptAcquireContext(&m_hProv, "ASYSIGN", MS_ENHANCED_PROV,
PROV_RSA_FULL, CRYPT_DELETEKEYSET);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
HCRYPTHASH hHash;
if(!CryptCreateHash(m_hProv, CALG_SHA, 0, 0, &hHash)) //創(chuàng)建HASH對(duì)象
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -3;
}
if(!CryptHashData(hHash, pbSrcData, (unsigned long)nSrcLen, 0))//hash數(shù)據(jù)
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hHash)
CryptDestroyHash(hHash);
return -3;
}
//獲得簽名數(shù)據(jù)長(zhǎng)度
if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, (unsigned long *)pnDestLen))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hHash)
CryptDestroyHash(hHash);
return -4;
}
//簽名HASH數(shù)據(jù)
if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbDestData, (unsigned long *)pnDestLen))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hHash)
CryptDestroyHash(hHash);
return -5;
}
if(hHash)
CryptDestroyHash(hHash);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return 0;
}
/**********************************************************************
+函數(shù)名稱: CRYPTAPI_RSAVerify()
+輸入?yún)?shù): pbSrcData 待驗(yàn)證數(shù)據(jù)
+ nSrcLen 待驗(yàn)證數(shù)據(jù)長(zhǎng)度
+ pbDestData 簽名數(shù)據(jù)
+ nDestLen 簽名數(shù)據(jù)長(zhǎng)度
+輸出參數(shù): pbDestData 簽名后數(shù)據(jù)
+ nDestLen 簽名數(shù)據(jù)長(zhǎng)度
+返回值:
+其他說明: 驗(yàn)證經(jīng)過簽名HASH數(shù)據(jù)
***********************************************************************/
int CKeyOperation::CRYPTAPI_RSAVerify(unsigned char *pbSrcData, int nSrcLen,
unsigned char *pbDestData, int nDestLen)
{
if(!CryptAcquireContext(&m_hProv, "ASYSIGN", MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
return -1;
if(!CryptGetUserKey(m_hProv, AT_SIGNATURE, &m_hKey))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
HCRYPTHASH hHash;
//創(chuàng)建HASH對(duì)象
if(!CryptCreateHash(m_hProv, CALG_SHA, 0, 0, &hHash))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return -2;
}
//HASH待驗(yàn)證數(shù)據(jù)
if(!CryptHashData(hHash, pbSrcData, nSrcLen, 0))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hHash)
CryptDestroyHash(hHash);
return -3;
}
//驗(yàn)證簽名數(shù)據(jù)
if(!CryptVerifySignature(hHash, pbDestData, nDestLen, m_hKey, NULL, 0))
{
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
if(hHash)
CryptDestroyHash(hHash);
return -4;
}
if(hHash)
CryptDestroyHash(hHash);
if(m_hProv)
CryptReleaseContext(m_hProv, 0);
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -