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加密、解密的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. Aes 加密解密 java加密解密

    使用AES加密解密代码详解 首先,如果是使用nodejs + vue 写的前端, 那么你需要npm 加载一个js文件 npm i crypto-js --save --save-exact npm i ...

  3. 非对称技术栈实现AES加密解密

    非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...

  4. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  5. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  6. ruby AES加密解密

    最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...

  7. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  8. java使用AES加密解密 AES-128-ECB加密

    java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...

  9. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

随机推荐

  1. 理解insert all/insert first的使用

    在常用的SQL写法中我们会经常遇到把一个表的数据插入另外一张表的情况,这是一个insert into 表名 select .... from 表名   就可以解决了.但是如果是把一张表的数据同时插入两 ...

  2. 安装repcached,并且测试其双向复制是否成功

    备注:本实验不仅包括了repcached,还包括了memcache的配置安装 1.1实验环境. 1.2环境准备. 1.3配置一个memcache. 1.3.1安装memcache. 1.3.2启动me ...

  3. js console 一些拓展技巧

    console.time 方法 / console.timeEnd() 方法 统计一段代码的执行时间, 形参必须一致 console.time("string"); for(var ...

  4. CacheManagerUtils.java

    package com.vcredit.framework.utils; import net.sf.ehcache.Cache;import net.sf.ehcache.CacheManager; ...

  5. Mysql权限

    连接Oracle/Mysql数据库的配置 1.Oracle <context:property-placeholder location="jdbc.properties"/ ...

  6. BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记

    使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...

  7. Unity学习疑问记录之新GUI

    学习Unity 4.6新GUI系统 http://segmentfault.com/a/1190000000642686

  8. 面向系统管理员的10款Linux GUI工具 (转自51cto)

    如果你是名系统管理员,现已到了Linux非知道不可的地步.如果你在更庞大的环境下工作,更是如此.许多企业组织已迁离了一切都借助点击式GUI来管理的Windows.幸好,Linux也有许多GUI工具可以 ...

  9. ExtJS笔记 Grids

    参考:http://blog.csdn.net/zhangxin09/article/details/6885175 The Grid Panel is one of the centerpieces ...

  10. linux PPTP VPN客户端安装

    转载于http://www.2cto.com/os/201209/157462.html 下载pptp-1.7.2.tar.gz http://pptpclient.sourceforge.net/ ...