CryptEncrypt 和CryptDecrypt 的使用
来源:互联网 发布:淘宝能卖药品吗 编辑:程序博客网 时间:2024/05/16 17:39
/********************************************************************created:2014/08/25created:25:8:2014 15:24file ext:cppauthor:Benpurpose:简单的演示下windows API 的加解密函数的使用Remarks:*********************************************************************/#include "stdafx.h"#include<windows.h>#include <wincrypt.h>#include<iostream>using namespace std;HCRYPTPROVm_hCryptProv; HCRYPTKEYm_hKey; HCRYPTHASHm_hHash; #define KEYCONTAINER _T("BenTestKeyContainer")#define KEYLENGTH 0x00800000BOOL CreateCryptSession(LPTSTR tszPassword){//---------------------------------------------------------------// Get the handle to the default provider. if (m_hCryptProv == NULL){if(!CryptAcquireContext(&m_hCryptProv, KEYCONTAINER, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)){if (GetLastError() == NTE_BAD_KEYSET){if(!CryptAcquireContext(&m_hCryptProv, KEYCONTAINER, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)){return FALSE;}}else{return FALSE;}}}//-----------------------------------------------------------// Create a hash object. if (m_hHash == NULL){if(!CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &m_hHash)){return FALSE;}}//-----------------------------------------------------------// Hash in the password data. if(m_hKey) {CryptDestroyKey(m_hKey); m_hKey = NULL;}if(!CryptHashData(m_hHash, (BYTE *)tszPassword, _tcslen(tszPassword) * sizeof(TCHAR), 0)) {return FALSE;}//-----------------------------------------------------------// Derive a session key from the hash object. if(!CryptDeriveKey(m_hCryptProv, CALG_RC4, m_hHash, KEYLENGTH, &m_hKey)){ return FALSE;}return TRUE;}BOOL DestroyCryptSession(){//--------------------------------------------------------------------// Destroy session key. if(m_hKey) {CryptDestroyKey(m_hKey); m_hKey = NULL;}//--------------------------------------------------------------------// Destroy hash object. if(m_hHash) {CryptDestroyHash(m_hHash); m_hHash = NULL;}//--------------------------------------------------------------------// Release provider handle. if(m_hCryptProv) {CryptReleaseContext(m_hCryptProv, 0); m_hCryptProv = NULL;}return TRUE;}BOOL EncryptData(PBYTE pbBuffer, DWORD dwBufferLen, LPDWORD lpdwCount, BOOL bFinal=FALSE){if (m_hKey == NULL || pbBuffer == NULL || dwBufferLen == 0 || lpdwCount == NULL){return FALSE;}//-----------------------------------------------------------// Encrypt data. return CryptEncrypt(m_hKey, NULL, bFinal,0, pbBuffer, lpdwCount, dwBufferLen);}// 解密数据BOOL DecryptData(PBYTE pbBuffer, LPDWORD lpdwCount, BOOL bFinal=FALSE){if (m_hKey == NULL || pbBuffer == NULL || lpdwCount == NULL){return FALSE;}//-----------------------------------------------------------// Decrypt the block of data. if(!CryptDecrypt(m_hKey, 0, bFinal, 0, pbBuffer, lpdwCount)){return FALSE;}return TRUE;}int _tmain(int argc, _TCHAR* argv[]){int a = 1222;//-----------------------------------------------------------// 加密 数据 if (!CreateCryptSession(TEXT("c10509"))){cout << "CreateCryptSession Failed.. " << endl;return FALSE;}DWORD dwCount = sizeof(int);if (!EncryptData((PBYTE)&a, sizeof(int), &dwCount)){cout << "Encrypt Data Failed... " << endl;return FALSE;}else{cout << "Encrypt Data Successed... " << endl;}DestroyCryptSession(); // 注意这句的调用与前面 CreateCryptSession 成对//-----------------------------------------------------------{// =======================================================// ==== 解密部分 =============if (CreateCryptSession(TEXT("c10509")) == FALSE){return FALSE;}// 解密//DWORD dwDecryptCount = sizeof(decryptText);if (DecryptData((PBYTE)&a, &dwCount)){cout << "Decrypt Data Successed..." << endl;}else{cout << "DeCrypt Data Failed... " << endl;}DestroyCryptSession(); // =======================================================}return 0;}
可以参考的链接: http://blog.csdn.net/cnbragon/article/details/715058
MSDN: http://msdn.microsoft.com/zh-cn/aa382044
0 0
- CryptEncrypt 和CryptDecrypt 的使用
- 对CryptEncrypt/CryptDecrypt中的几个参数的解释
- 对CryptEncrypt/CryptDecrypt中的几个参数的解释
- 文件加密CryptEncrypt和导出密钥CryptExportKey学习笔记
- 文件解密CryptDecrypt和导入密钥CryptImportKey学习笔记
- int?和??的使用
- ”##“ 和 "#" 的使用
- “$this->”和”::”的使用
- &和&&的使用区别
- Swift -- !和?的使用
- UIPickView的使用和
- Mybatis - # 和 $ 的使用
- C# ?和??的使用
- .和:的使用情况
- ExpandableListActivity的使用和SimpleExpandableListAdapter的使用
- Collector的使用和MultiReader的使用
- 使用简单的DepthBuffer 和使用Lights
- 使用velocity :$velocityCount和Tool的使用
- shell文本过滤编程(四):awk内置变量及一般变量
- 小计64位win7上R读取excel过程
- Notification Centers
- 编写opensips自定义模块
- 【经典名言】
- CryptEncrypt 和CryptDecrypt 的使用
- c语言日志
- 汉字十六进制编码转换\xe4\xb8\xad\xe5\x9b\xbd
- Java学习之为什么说LinkedList的插入和删除性能比ArrayList好,而ArrayList的查询更好?
- 旋转打印
- 【POJ】1724 ROADS 二维最短路
- javascript 面向对象
- 最小树形图(poj3164)
- 壁挂炉技术成熟要素