标签:
std::string EncodeRSAKeyFile( const std::string& strPemFileName, const std::string& strData ) { if (strPemFileName.empty() || strData.empty()) { assert(false); return ""; } FILE* hPubKeyFile = NULL; if(fopen_s(&hPubKeyFile, strPemFileName.c_str(), "rb") || hPubKeyFile == NULL) { assert(false); return ""; } std::string strRet; RSA* pRSAPublicKey = RSA_new(); if(PEM_read_RSA_PUBKEY(hPubKeyFile, &pRSAPublicKey, 0, 0) == NULL) { assert(false); return ""; } int nLen = RSA_size(pRSAPublicKey); char* pEncode = new char[nLen + 1]; int ret = RSA_public_encrypt(strData.length(), (const unsigned char*)strData.c_str(), (unsigned char*)pEncode, pRSAPublicKey, RSA_PKCS1_PADDING); if (ret >= 0) { strRet = std::string(pEncode, ret); }
delete[] pEncode; RSA_free(pRSAPublicKey); fclose(hPubKeyFile); CRYPTO_cleanup_all_ex_data(); return strRet; }
std::string DecodeRSAKeyFile( const std::string& strPemFileName, const std::string& strData ) { if (strPemFileName.empty() || strData.empty()) { assert(false); return ""; } FILE* hPriKeyFile = NULL; if(fopen_s(&hPriKeyFile, strPemFileName.c_str(),"rb") || hPriKeyFile == NULL) { assert(false); return ""; } std::string strRet; RSA* pRSAPriKey = RSA_new(); if(PEM_read_RSAPrivateKey(hPriKeyFile, &pRSAPriKey, 0, 0) == NULL) { assert(false); return ""; } int nLen = RSA_size(pRSAPriKey); char* pDecode = new char[nLen+1]; int ret = RSA_private_decrypt(strData.length(), (const unsigned char*)strData.c_str(), (unsigned char*)pDecode, pRSAPriKey, RSA_PKCS1_PADDING); if(ret >= 0) { strRet = std::string((char*)pDecode, ret); }
delete [] pDecode; RSA_free(pRSAPriKey); fclose(hPriKeyFile); CRYPTO_cleanup_all_ex_data(); return strRet; }
std::string EncodeAES( const std::string& password, const std::string& data ) { AES_KEY aes_key; if(AES_set_encrypt_key((const unsigned char*)password.c_str(), password.length() * 8, &aes_key) < 0) { assert(false); return ""; } std::string strRet; std::string data_bak = data; unsigned int data_length = data_bak.length(); int padding = 0; if (data_bak.length() % AES_BLOCK_SIZE > 0) { padding = AES_BLOCK_SIZE - data_bak.length() % AES_BLOCK_SIZE; } data_length += padding; while (padding > 0) { data_bak += ‘\0‘; padding--; } for(unsigned int i = 0; i < data_length/AES_BLOCK_SIZE; i++) { std::string str16 = data_bak.substr(i*AES_BLOCK_SIZE, AES_BLOCK_SIZE); unsigned char out[AES_BLOCK_SIZE]; ::memset(out, 0, AES_BLOCK_SIZE); AES_encrypt((const unsigned char*)str16.c_str(), out, &aes_key); strRet += std::string((const char*)out, AES_BLOCK_SIZE); } return strRet; }
std::string DecodeAES( const std::string& strPassword, const std::string& strData ) { AES_KEY aes_key; if(AES_set_decrypt_key((const unsigned char*)strPassword.c_str(), strPassword.length() * 8, &aes_key) < 0) { assert(false); return ""; } std::string strRet; for(unsigned int i = 0; i < strData.length()/AES_BLOCK_SIZE; i++) { std::string str16 = strData.substr(i*AES_BLOCK_SIZE, AES_BLOCK_SIZE); unsigned char out[AES_BLOCK_SIZE]; ::memset(out, 0, AES_BLOCK_SIZE); AES_decrypt((const unsigned char*)str16.c_str(), out, &aes_key); strRet += std::string((const char*)out, AES_BLOCK_SIZE); } return strRet; }
标签:
原文地址:http://www.cnblogs.com/ytjjyy/p/4420068.html