openssl与cryptoAPI交互AES加密解密

继上次只有CryptoAPI的加密后,这次要实现openssl的了

动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互

先前有说openssl移植到android的过程,这里就不再提android如何调用openssl了,

        而那一篇第9条提到的openssl与cryptoAPI兼容的两种方式感觉实现都不太好用,这里再次提出一种AES加密的实现方式

写这边文章的最主要的原因,用过CryptoAPI的都知道,很多东西都封装了,如果要与其他加密组件交互,得用其他组件来实现CryptoAPI的思路

环境:windows visual studio 2010,openssl windows(x86)动态库

在CryptoAPI中进行AES加密解密,有一种实现方式是调用CryptDeriveKey通过提供的字节数组的hash值获取key

先来看下CryptoAPI实现AES,来个简单点的版本

void cryptoAPI_encrypt(string text,unsigned char* pwd,unsigned char** encryptText,int &out_len)
{
    HCRYPTPROV hCryptProv = NULL;  
    HCRYPTKEY hKey = 0;  
    HCRYPTHASH hHash = 0;  
    int dwLength = 0;  
  
    if(!CryptAcquireContext(&hCryptProv,  
        NULL,  
        CSP_NAME,//CSP_NAME  
        PROV_RSA_AES,  
        CRYPT_VERIFYCONTEXT))  
    {  
        DWORD dwLastErr = GetLastError();  
  
        if(NTE_BAD_KEYSET == dwLastErr)   
        {  
            return;  
        }  
        else{  
            if(!CryptAcquireContext(&hCryptProv,  
                NULL,  
                CSP_NAME,  
                PROV_RSA_AES,  
                CRYPT_NEWKEYSET))  
            {  
                return;  
            }  
        }  
    }  
    if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))  
    {  
        return;  
    }  
  
    BYTE *pPwd = pwd; 

    if(!CryptHashData(hHash, pPwd, 16, 0))  
    {  
        return;  
    }  

	if(!CryptDeriveKey(hCryptProv, CALG_AES_128, hHash, CRYPT_EXPORTABLE, &hKey))  
	{  
		return;  
	}  

    int len = text.length();  
    BYTE *pData ;  
    pData = (BYTE*)malloc(len*4);  
    memcpy(pData,text.c_str(),len);
    DWORD dwLen = len;  
  
    if(!CryptEncrypt(hKey, NULL, true, 0, pData, &dwLen, len*4))  
    {  
        return;  
    }  
  
	cout <<"--------------------------" << endl << "cryptoAPI encryp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值