win api 实现 AES加密、解密
WCHAR szPasswod[] = {L"goodpasswod" };
HCRYPTHASH hHash;
HCRYPTPROV hCryptProv;
HCRYPTKEY hKey; DWORD dwHashLen = ;
DWORD dwhash = ;
BYTE byHash[] ={""};
BYTE bySrc[] = {""};
BYTE byDest[] = {};
memcpy(byDest,bySrc,);
int iret = - ;
int idx = ;
WCHAR* wszProvider[] = {MS_ENH_RSA_AES_PROV,L"Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"}; while(!(iret = CryptAcquireContext(&hCryptProv,NULL,wszProvider[idx],PROV_RSA_AES,CRYPT_SILENT)))
{
idx ++ ;
idx %= ;
} // passwd to hash
CryptCreateHash(hCryptProv,CALG_MD5,,,&hHash);
// use passwd to create hash
//CryptHashData(hHash,(BYTE*)szPasswod,wcslen(szPasswod)*2,0);
// set hash
CryptGetHashParam(hHash,HP_HASHSIZE,(BYTE*)&dwHashLen,&dwhash,); // hashlen = 16
CryptSetHashParam(hHash,HP_HASHVAL ,byHash,dwHashLen); CryptDeriveKey(hCryptProv,CALG_AES_128,hHash,CRYPT_EXPORTABLE,&hKey); // CRYPT_EXPORTABLE DWORD dwLen =;
DWORD dwLen1 = ;
DWORD dwBufferLen = ;
//get crypt need buffer-len
CryptEncrypt(hKey,,TRUE,,byDest,&dwLen,);
// alloc buffer that`s len should be dwlen
CryptEncrypt(hKey,,TRUE,,byDest,&dwLen1,dwLen);
MessageBoxA(NULL,(LPSTR)byDest,(LPSTR)byDest,);
CryptDecrypt(hKey,,TRUE,,byDest,&dwLen);
MessageBoxA(NULL,(LPSTR)byDest,(LPSTR)byDest,); CryptDestroyHash(hHash);
CryptDestroyKey(hKey);
CryptReleaseContext(hCryptProv,);
测试发现兼容 xp,win7(x64)
LPBYTE GetHash(LPBYTE lpData, DWORD dwDataLen,LPDWORD lpdwOutLen)
{
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
LPBYTE lpRetBuffer = NULL ; //--------------------------------------------------------------------
// Get a handle to a cryptography provider context. if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
// printf("CryptAcquireContext complete. \n"); //--------------------------------------------------------------------
// Acquire a hash object handle. if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
if(CryptHashData(hHash,lpData,dwDataLen,0))
{
//CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, 0);
CryptSetHashParam(hHash,HP_HASHSIZE,(BYTE*)lpdwOutLen,sizeof(DWORD)); lpRetBuffer =(LPBYTE) BPP_ReAlloc(NULL,0,*lpdwOutLen);
CryptGetHashParam(hHash, HP_HASHVAL, lpRetBuffer, lpdwOutLen, 0);
} }
} if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv,0); return lpRetBuffer ;
}
LPBYTE Encrypt(LPBYTE lpData,LPDWORD lpdwInOutLen)
{
HCRYPTPROV hCryptProv =NULL ;
HCRYPTKEY hKey = NULL ;
HCRYPTHASH hHash = NULL ; char* szId =NULL ;
LPBYTE lpRetBuf = NULL ;
DWORD dwLen ;
dwLen = *lpdwInOutLen ; if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0))
{
if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET))
{
goto EncryptEnd ;
}
} if (!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
{
goto EncryptEnd ;
} szId = GetIdStr(); // pswd if (!CryptHashData(hHash,(BYTE*)szId,strlen(szId),0))
{ goto EncryptEnd ;
} if (!CryptDeriveKey(hCryptProv,CALG_RC4,hHash,0x00800000,&hKey))
{
dwLen = GetLastError();
goto EncryptEnd ;
} // qu jia mi suo xu chang du // dwLen = ((dwLen%8 ?1:0) + dwLen/8)*8 ; lpRetBuf = (LPBYTE)malloc(dwLen);
memcpy(lpRetBuf,lpData,*lpdwInOutLen); if (!CryptEncrypt(hKey,0,TRUE,0,lpRetBuf,lpdwInOutLen,dwLen))
{
goto EncryptEnd ;
} EncryptEnd: if (szId)
{
Free((LPVOID&)szId);
}
if (hHash)
{
CryptDestroyHash(hHash); }
if (hKey)
{
CryptDestroyKey(hKey);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv,0);
} return lpRetBuf ;
} LPBYTE Decrypt(LPBYTE lpData,LPDWORD lpdwInOutLen)
{
HCRYPTPROV hCryptProv =NULL ;
HCRYPTKEY hKey = NULL ;
HCRYPTHASH hHash = NULL ; char* szId =NULL ;
LPBYTE lpRetBuf = NULL ;
DWORD dwLen ;
dwLen = *lpdwInOutLen ; if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0))
{
if (!CryptAcquireContextW(&hCryptProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET))
{
goto DecryptEnd ;
}
} if (!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
{
goto DecryptEnd ;
} szId = GetIdStr(); if (!CryptHashData(hHash,(BYTE*)szId,strlen(szId),0))
{ goto DecryptEnd ;
} if (!CryptDeriveKey(hCryptProv,CALG_RC4,hHash,CRYPT_EXPORTABLE,&hKey))
{
dwLen = GetLastError();
goto DecryptEnd ;
} // qu jia mi suo xu chang du //dwLen = ((dwLen%8 ?1:0) + dwLen/8)*8 ; lpRetBuf = (LPBYTE)malloc(dwLen);
memcpy(lpRetBuf,lpData,*lpdwInOutLen);
//*lpdwInOutLen = dwLen ;
if (!CryptDecrypt(hKey,0,TRUE,0,lpRetBuf,lpdwInOutLen))
{
goto DecryptEnd ;
} DecryptEnd: if (szId)
{
BPP_Free((LPVOID&)szId);
}
if (hHash)
{
CryptDestroyHash(hHash); }
if (hKey)
{
CryptDestroyKey(hKey);
}
if (hCryptProv)
{
CryptReleaseContext(hCryptProv,0);
} return lpRetBuf ;
}
win api 实现 AES加密、解密的更多相关文章
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- Aes 加密解密 java加密解密
使用AES加密解密代码详解 首先,如果是使用nodejs + vue 写的前端, 那么你需要npm 加载一个js文件 npm i crypto-js --save --save-exact npm i ...
- 非对称技术栈实现AES加密解密
非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...
- C#中使用DES和AES加密解密
C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- ruby AES加密解密
最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
- java使用AES加密解密 AES-128-ECB加密
java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...
- AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用
一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...
随机推荐
- hdu1251 字典树or map
一道字典树的题,不过看起来用map更为简单 传送门 题意: 给出一堆字符串构成一个字典,求字典里以某字符串为前缀的字符串有几个 思路: 输入字符串时把字符串的前缀全部存进map并标记次数 查询时直接输 ...
- [LintCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- 【hihoCoder】1041. 国庆出游
问题:详见http://hihocoder.com/problemset/problem/1041 有n个城市,城市编号为1-n,城市间有n-1条路(所以,城市路网是一棵树).给定一个序列S,要求判断 ...
- PHP filesystem attack vectors - Take Two
http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/ Did you enjoyed our previous &q ...
- HTTP Error 500 - Server Error.
Error Details: The FastCGI process exited unexpectedly Error Number: -1073741819 (0xc0000005). Error ...
- dedecms 使用
初看dedecms的后台界面就是一头雾水.不懂的词语多,什么模型,什么栏目,什么频道,不懂.相比于wordpress的分类category,标签tag,文章post,页面page而言,织梦后台难懂. ...
- You and Your Research(Chinese)
转自:http://lyxh-2003.iteye.com/blog/434014 这是大科学家Richard Hamming的著名讲演,于1986年在贝尔通讯研究中心给200多名Bellcore的科 ...
- yii框架分页
- linux下C++ 插件(plugin)实现技术
应用程序中使用插件技术,有利于日后的版本更新.维护(比如打补丁)和功能扩展,是一种很实用的技术.其最大的特点是更新插件时无需重新编译主程序,对于一个设计良好的应用系统而言,甚至可以做到业务功能的在线升 ...
- jQuery的$.get和$.ajax函数对比
$.get较为简便,但在精细控制上乏力$.get( url, // 请求的地址 {url:url,remark:remark},// 请求参数 function(data,textS ...