Linux 编写c++程序之openssl

在使用openssl 库前,需检测是否安装openssl , shell 窗口输入:openssl version  , 在openssl 安装完成之后, 可通过vi 编写测试代码 。

本例中附上加密,解密代码,方法分别是: EncodeRSAKeyFile(...) , DecodeRSAKeyFile(...)
这些示例代码在网上可以找到。

 

代码:

#include<openssl/bio.h>
#include<openssl/ssl.h>
#include<openssl/err.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<stdio.h>
#include<string>
#include<cassert>
#include<iostream>
using namespace std;

int EncodeRSAKeyFile(const char * _strPemFileName , const char * _strData , unsigned char * buffer , int length){
	std::string strPemFileName = _strPemFileName;
	std::string strData = _strData ;
	if(strPemFileName.empty() || strData.empty()){
		assert(false);
		return 0 ;
	}
	
	FILE * hPubKeyFile = fopen(strPemFileName.c_str() , "rb");
	if(hPubKeyFile == NULL){
		assert(false);
		return 0;
	}

	std::string strRet;
	RSA * pRSAPublicKey = RSA_new();
	if(PEM_read_RSA_PUBKEY(hPubKeyFile , &pRSAPublicKey , 0 , 0) == NULL){
		assert(false);
		return 0;
	}

	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();
	
	if(strRet.length() + 1 > length){
		return 0;
	}

	memset(buffer , 0 , strRet.length() + 1) ;
	memcpy(buffer , &strRet[0] ,strRet.length());

	return strRet.length() + 1;
}

int DecodeRSAKeyFile(const char * _strPemfileName , const char * _strData , unsigned char * buffer ,  int length){
	std::string strPemFileName = _strPemfileName;
	std::string strData = _strData ;
	if(strPemFileName.empty() || strData.empty()){
		assert(false);
		return 0;
	}

	FILE* hPriKeyFile = NULL;
	hPriKeyFile =  fopen(strPemFileName.c_str() , "rb");
	if(hPriKeyFile == NULL){
		assert(false);
		return 0;
	}

	std::string strRet;
	RSA* pRSAPriKey = RSA_new();
	if(PEM_read_RSAPrivateKey(hPriKeyFile , &pRSAPriKey , 0 , 0) == NULL ){
		assert(false);
		return 0;
	}

	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();

	if(strRet.length() + 1 > length){
		return 0 ;
	} else {
		memset(buffer , 0 , strRet.length() + 1);
		memcpy(buffer , &strRet[0] , strRet.length());
	}

	return strRet.length() + 1 ;

}

int main(){
	//jia mi
	const std::string one = "abcdeF";
	std::string strPubKey = "/root/test_2018_pub.key";
	const char * char1 = strPubKey.c_str();
	const char * char2 = one.c_str();
	unsigned char buffer[512] , buffer1[512];
	int length = EncodeRSAKeyFile(char1 , char2 , buffer , 512);
	std::string strResult = std::string((char *)buffer , length);
	//cout << "pwdtxt:" << strResult << endl;
 	//cout << length << endl;
	//return 0;

	//jiemi
	std::string strPriKey = "/root/test_2018.key";
	length = DecodeRSAKeyFile(strPriKey.c_str() , strResult.c_str() , buffer1 , 512 );
	std::string strOrgTxt = std::string((char *)buffer1 , length);
	cout << "orgTxtLength:" << length << endl <<  "orgTxt:" << strOrgTxt << endl ;

	return 0;
}

 

生成公私钥步骤:
openssl genrsa -out test_2048.key 2048 //私钥
openssl rsa -in test_2048.key -pubout -out test_2048_pub.key //公钥

gcc 编译指令:
gcc testzs.cpp -o testzsexe  -lcrypto -ldl -lstdc++

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。