前言:項(xiàng)目需要根據(jù)秘鑰加密, 客戶端根據(jù)公鑰解密, 這里使用RSA加解密
在項(xiàng)目中導(dǎo)入openssl的動(dòng)態(tài)鏈接庫(kù), libeay32.dll, libeay32.lib, 配置好工程環(huán)境, 代碼:
/**
* @author: HanshuaiWu
* @methodsName: encrypt
* @description: 簽名
* @param1: orgData:原數(shù)據(jù)
* @param2: publicKey:公鑰
* @return: AnsiString
* @createTime: 2018/11/9
*/
extern "C" {
AnsiString TIDCard::encrypt(AnsiString orgData)
{ //C:\Users\Administrator\Desktop\移動(dòng)服務(wù)器v1.0網(wǎng)絡(luò)請(qǐng)求\CardServerV2\Output\key.pem
char *p_en = NULL;
RSA *p_rsa = NULL;
FILE *file = NULL;
AnsiString pathStr = "key.pem";
char *path_key = (char *)pathStr.c_str();
int rsa_len = 0; //flen為源文件長(zhǎng)度, rsa_len為秘鑰長(zhǎng)度
//1.打開秘鑰文件
if((file = fopen(path_key, "r")) == NULL)
{
return-1;
}
BIO *in = NULL;
in = BIO_new(BIO_s_file());
if( BIO_read_filename(in, path_key) != 1)
{
return -1;
}
if(in == NULL){
return -1;
}
p_rsa = PEM_read_bio_RSAPrivateKey(in , NULL, NULL, NULL);
//3.獲取秘鑰的長(zhǎng)度
rsa_len = RSA_size(p_rsa);
//4.為加密后的內(nèi)容 申請(qǐng)空間(根據(jù)秘鑰的長(zhǎng)度)
p_en = (char *)malloc(rsa_len);
if(!p_en)
{
return -1;
}
memset(p_en, 0, rsa_len);
int length = orgData.Length();
char *orgBuffer = (char *) malloc(length);;
orgBuffer = (char *)AnsiToUtf8(orgData).c_str();
int len = RSA_private_encrypt(strlen(orgBuffer), orgBuffer, p_en, p_rsa, RSA_PKCS1_PADDING);
AnsiString result = Encode(p_en, len);
// free
free_all:
fclose(file);
BIO_free_all(in);
RSA_free(p_rsa);
free(p_en);
free(orgBuffer);
return result;
}
}
// base64編碼
AnsiString TIDCard::Encode(const unsigned char* Data,int DataByte)
{
//編碼表
const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//返回值
AnsiString strEncode;
unsigned char Tmp[4]={0};
int LineLength=0;
for(int i=0;i<(int)(DataByte / 3);i++)
{
Tmp[1] = *Data++;
Tmp[2] = *Data++;
Tmp[3] = *Data++;
strEncode+= EncodeTable[Tmp[1] >> 2];
strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
strEncode+= EncodeTable[Tmp[3] & 0x3F];
if(LineLength+=4,LineLength==76) {
//strEncode+="\r\n";
LineLength=0;
}
}
//對(duì)剩余數(shù)據(jù)進(jìn)行編碼
int Mod=DataByte % 3;
if(Mod==1)
{
Tmp[1] = *Data++;
strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];
strEncode+= "==";
}
else if(Mod==2)
{
Tmp[1] = *Data++;
Tmp[2] = *Data++;
strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];
strEncode+= "=";
}
return strEncode;
}
喜歡的小伙伴點(diǎn)個(gè)喜歡或關(guān)注吧, 你們的鼓勵(lì)是我前進(jìn)的動(dòng)力!