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++

时间: 2024-11-06 03:49:37

Linux 编写c++程序之openssl的相关文章

linux中VI编写C程序。。。

在linux中编写C程序时不像编写shell那样开头要#!/bin/bash,但是在C程序中要指定头文件(头文件是只输入输出,宏等,而且要首先声明,也是必须要开始就声明的) 写好C代码后要给C文件赋予可执行权限(chmod  755  xx.c) 然后用gcc编译(方法和shell类似,shell是bash xx.sh   ,    而C是gcc xx.c ,C的程序文件名都是以 .c 结尾 , shell是都是以 .sh 结尾) 以下上实例: [[email protected] ~]# vi

在Linux使用mingw32来编写win32程序

MinGW - Minimalist GNU For Windows Mingw32 是 GNU 計畫工具的集合,包含了大量的標頭檔(header files).函式庫與指 令程式.目的在提供免費的工具以生產製作可於 Winodws 上直接執行而無須依賴輔助函式 庫的原生程式(Native Windows programs). 在 Debian 系統中,您可以安裝 DebianPackages:mingw32 .DebianPackages:mingw32-binutils 與 DebianPa

Linux Kernel(Android) 加密算法总结(四)-应用程序调用OpenSSL加密算法

Linux Kernel(Android) 加密算法总结(三)-应用程序调用内核加密算法接口 讲到了如何调用内核中的接口的方法. 本节主要是介绍如何Android C/C++应用程序调用Openssl的AES加密算法. crypt_ssl.c #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <aes.h> #include

linux下对qt编写的程序进行部署

当我们完成程序设计之后,需要将可执行程序交付客户,而运行环境里面可能是没有相关支持库的,这个时候就涉及到部署的相关问题.对于我们在Linux下基于QT编写的图像处理程序,我们采用linuxdeployqt 进行部署,以下是相关注意步骤.我成功的实现了GOQTTemplate在ubuntu16.04上编译,并且在ubuntu18.04上的运行: 1.linuxdeployqt 安装 最简单的方法直接下载编译好的 linuxdeployqt-x86_64.AppImage文件(https://git

Linux C程序设计系列之 练习系统调用文件IO、内存映射程序 编写ls程序

点击连接进入文章 1.1Linux系统调用练习 1.2模拟Linux系统ls程序显示树形目录 1.3内存共享实现简单的数据共享 Linux C开发掌握不是两三天的事情,需从基础开始 由浅入深,写博客 只为记录自己学习的点点滴滴,并鼓励他人. 下面是 1.2程序截图 下面是1.3程序截图

Linux环境下编写C程序

一:gcc编译链接用法:gcc [选项] 文件...选项:-pass-exit-codes 在某一阶段退出时返回最高的错误码--help 显示此帮助说明--target-help 显示目标机器特定的命令行选项--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]显示特定类型的命令行选项(使用'-v --help'显示子进程的命令行参数)--version 显示编译器版本信息

用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

写在前面 前文:用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 为了方便,这篇文章里的例子均为伪分布式运行,一般来说只要集群配置得当,在伪分布式下能够运行的程序,在真实集群上也不会有什么问题. 为了更好地模拟集群环境,我们可以在mapred-site.xml中增设reducer和mapper的最大数目(默认为2,实际可用数目大约是CPU核数-1). 假设你为Hadoop安装路径添加的环境变量叫$HADOOP_HOME(如果是$HAD

002 - 在安卓手机上学习C语言-Linux入门 通往程序世界之门-操作系统

Linux入门  通往程序世界之门--操作系统 在上一章中 , 我们讨论了为何要搭建编译环境, 那么多的上仙出场, 我相信大家还能记住的搭建编译环境的原因的. 在讨论的时候, 不知不觉地把Linux操作系统给提出来了, 其实, 使用Windows去教学可能会更方便一点. 毕竟大家都用熟了嘛 , 不过我们是在手机上编程, 手机上使用不了Windows上的工具, 所以Windows暂时是用不上了, 只好转入Linux系统的怀抱了. 在这一章中, 我会简单地介绍一下在Linux的下使用到的命令. 最后

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟