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解密的使用
一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...
随机推荐
- linux中,常用的账号管理命令
创建新用户:adduser 用户名创建新用户并将其加入一个现有组中:adduser 用户名 -G 组名创建新用户并使其只属于该组:adduser 用户名 -g 组名创建用户密码:passwd 用户名创 ...
- asp.net自定义404页面
网上有很多方法,不过大体相同,这只是其中一个方法,亲测有效,记录后面可能会有用 1. 先写好一个404页面 404.aspx在项目根目录下 然后在配置文件中添加 <!-- 注意这个模式,redi ...
- HTML DOM insertBefore() 方法 使用的时候发现一个问题,记录下
在W3C中是这样定义的 第二个参数是可先的,但是在谷歌浏览器和火狐浏览器中测试是会有bug的,第二个参数是必填的,否则会报错 感兴趣的可以测试 以下是我测试的结果: 谷歌浏览器:Uncaught ...
- Lua修改文件名
local lfs = require "lfs"local curPath = "..\\new\\"local totalFile = 0 local s ...
- jquery_简单介绍
jquery是一个优秀的javascript的库. jquery对象是通过jquery包装DOM对象产生的对象 配置jquery 在<head> <script src=&quo ...
- bootstrap 不兼容ie8 的问题
官方推荐的脚手架中,其实已经包含着解决方案:html5shiv.min.js .Respond.min.js 但由于respond.js 使用 file:// 协议,IE8 是无法调起本地文件的 ...
- viewPager的基本使用
viewPager是android扩展包v4中的类,这个类可以使用户左右切换当前的view. 特性: 1.viewPager直接继承了viewGroup类,所以它是一个容器类,可以在其中添加其它的vi ...
- java swing 中的FileDialog
1.FileDialog使用方法: FileDialog fd=new FileDialog(new Frame(),"测试",FileDialog.LOAD); Filenam ...
- Linux下动态库(.so)和静态库(.a) 的区别
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.编译之后程序文件大,但加载快,隔离性也好.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还 ...
- DOM模型有三种
<!-- DOM模型有三种: DOM level 1:将HTML文档封装成对象. DOM level 2:在level 1基础加入新功能,比如解析名称空间. //<html xmlns=& ...