头文件:
/*
* CAesCbc.h
*
* Created on: Oct 8, 2023
* Author: root
*/
#ifndef CAESCBC_H_
#define CAESCBC_H_
#include <string>
using namespace std;
class CAesCbc {
public:
CAesCbc();
virtual ~CAesCbc();
public:
void Pkcs7Padding(std::string& strInPut);
void Pkcs7UnPadding(std::string& strInPut);
string SetEncryptKey(std::string strKey);
string SetEncryptIv(std::string strIv);
bool EncryptString(std::string strInPut, std::string& strOutPut);
bool DecryptString(std::string strInPut, std::string& strOutPut);
private:
std::string m_strKey;
std::string m_strIv;
};
#endif /* CAESCBC_H_ */
源文件:
/*
* CAesCbc.cpp
*
* Created on: Oct 8, 2023
* Author: root
*/
#include <CAesCbc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/md5.h>
#include "base64.h"
CAesCbc::CAesCbc()
{
}
CAesCbc::~CAesCbc()
{
}
void CAesCbc::Pkcs7Padding(std::string& strInPut)
{
char cPadding = 16 - strInPut.length() % 16;
int iPaddingNum = cPadding;
for (int i = 0; i < iPaddingNum; i++)
{
strInPut += cPadding;
}
}
void CAesCbc::Pkcs7UnPadding(std::string& strInPut)
{
int iInputLen = strInPut.length();
int iRemovedByte = strInPut[iInputLen - 1];
strInPut = std::string(strInPut.c_str(), iInputLen - iRemovedByte);
}
string CAesCbc::SetEncryptKey(std::string strKey)
{
int iKeyLen = strKey.length();
char szBuf[100]="\0";
if(iKeyLen < 32)
{
sprintf(szBuf,"%s",strKey.c_str());
int i = 0;
for(i=iKeyLen;i<32;i++)
{
szBuf[i]=' ';
}
m_strKey = szBuf;
}
m_strKey = szBuf;
return m_strKey;
}
string CAesCbc::SetEncryptIv(std::string strIv)
{
int iVLen = strIv.length();
char szVBuf[100]="\0";
if(iVLen < 16)
{
sprintf(szVBuf,"%s",strIv.c_str());
int i = 0;
for(i=iVLen;i<16;i++)
{
szVBuf[i]=' ';
}
}
m_strIv = szVBuf;
return m_strIv;
}
bool CAesCbc::EncryptString(std::string strInPut, std::string& strOutPut)
{
Pkcs7Padding(strInPut);
unsigned char iv[17] = { 0 };
memcpy(iv, m_strIv.c_str(), 16);
int iInputLen = strInPut.length();
unsigned char *temp = new unsigned char[iInputLen + 1];
memset(temp, 0, iInputLen + 1);
AES_KEY aes;
AES_set_encrypt_key((const unsigned char *)m_strKey.c_str(), 256, &aes);
const unsigned char* pInput = (const unsigned char*)strInPut.c_str();
iInputLen = strInPut.length();
for (int i = 0; i < iInputLen / 16; i++)
{
AES_cbc_encrypt(pInput + i * 16, temp + i * 16, 16, &aes, iv, AES_ENCRYPT);
}
char *pOutput = new char[iInputLen * 4 / 3 + 3];
strOutPut = base64_encode(temp,iInputLen);
delete[] temp;
delete[] pOutput;
return true;
}
bool CAesCbc::DecryptString(std::string strInPut, std::string& strOutPut)
{
unsigned char iv[17] = { 0 };
memcpy(iv, m_strIv.c_str(), 16);
// char *pOutStr = new char[strInPut.length()];
std::string strOutput = base64_decode(strInPut.c_str(), strInPut.length());
AES_KEY aes;
AES_set_decrypt_key((const unsigned char *)m_strKey.c_str(), 256, &aes);
unsigned char *pDescrypt = new unsigned char[strOutput.length() + 1];
memset(pDescrypt, 0, strOutput.length() + 1);
for (int i = 0; i < strOutput.length() / 16; i++)
{
AES_cbc_encrypt((const unsigned char *)strOutput.c_str() + i * 16, pDescrypt + i * 16, 16, &aes, iv, AES_DECRYPT);
}
strOutPut = std::string((const char *)pDescrypt);
Pkcs7UnPadding(strOutPut);
return true;
}