在这篇文章中简单介绍一下如何编译安装和使用第三方库 OpenSSL ,并在 OpenSSL 提供的 API 的基础上生成存放 RSA 类型的公密钥对的文件。
RSA非对称密钥的一种,如果您不太熟悉密钥的定义和使用场景,可以看看前一篇文章的介绍。
1. 下载 openssl 库到本地
[命令_下载] git clone git@github.com:openssl/openssl.git
ps : 系统中安装 openssl , 即输入 openssl 有对应的命令提示符显示,并不能够说明在编程的时引入
函数库的时候能够编译成功,二者一个是可执行的程序,一个是用于程序编译链接阶段需要连接的模块,
是不同的,类似于 windows 中的 .exe 和 .lib/.dll {静态,动态链接库}
2. 将路径切换到刚刚下载的 openssl 路径下,执行如下命令
[命令_预处理] ./config --prefix=/usr/local --openssldir=/usr/local/openssl
# 上述的命令用来设定编译源码所生成的可执行二进制对象所在的目录
[命令_编译&&安装] make && make install
3. 更新系统库搜索索引文件
[命令_更新搜索索引] ldconfig
4. 编写简单的测试文件
[命令_编译 g++ ] g++ test.cpp -lcrypto -lssl
test.cpp
-
#include <stdio.h>
-
#include <stdio.h>
-
#include <string.h>
-
#include <openssl/pem.h>
-
#include <openssl/rsa.h>
-
-
int main ( int argc , char **argv )
-
{
-
return 0 ;
-
}
-
~
如果没有任何提示信息输出的话, 说明 ssl 这个动态链接库已经可以正常工作了
用于生成存放 RSA 公密钥对文件程序代码如下
Makefile
-
default :
-
g++ -g -w -o test rsa_pair.cpp rsa_pair.h Main.cpp \
-
-I/unixC/openssl/openssl/include -L/unixC/openssl/openssl -lssl -lcrypto -ldl
// rsa_pair.h
-
#ifndef RSA_PAIR_H_
-
#define RSA_PAIR_H_
-
-
#include <iostream>
-
#include <string>
-
#include <sstream>
-
#include <openssl/rsa.h>
-
#include <openssl/pem.h>
-
#include <openssl/err.h>
-
#include <openssl/bn.h> // this is for the BN_new
-
-
-
class rsaPair
-
{
-
public :
-
rsaPair ()
-
{
-
pub_key = NULL ;
-
pri_key = NULL ;
-
}
-
rsaPair ( std::string pub_k_path , std::string pri_key_path, std::string psword ) ;
-
~rsaPair () ;
-
-
int create_key_pair () ;
-
-
private :
-
std::string pub_key_path ;
-
std::string pri_key_path ;
-
std::string password ;
-
RSA *pub_key ;
-
RSA *pri_key ;
-
} ;
-
-
#endif
// rsa_pair.cpp
-
#include <stdio.h>
-
-
#include "rsa_pair.h"
-
-
using namespace std ;
-
-
rsaPair::rsaPair( string pub_k_path , string pri_k_path , string psword)
-
{
-
pub_key = NULL ;
-
pri_key = NULL ;
-
-
-
if ( pub_k_path.empty () || pri_k_path.empty() )
-
{
-
perror ("file stores key values empty") ;
-
return ;
-
}
-
-
if ( psword.empty ())
-
{
-
perror ("password empty , use default") ;
-
password = "inuyasha" ;
-
return ;
-
}
-
-
printf ("here ") ;
-
-
pub_key_path = pub_k_path ;
-
pri_key_path = pri_k_path ;
-
-
password = psword ;
-
-
}
-
-
rsaPair::~rsaPair ()
-
{
-
if ( pub_key )
-
RSA_free ( pub_key ) ;
-
-
if ( pri_key )
-
RSA_free ( pri_key ) ;
-
}
-
-
-
int rsaPair::create_key_pair ()
-
{
-
RSA *rsa ;
-
int modulelen = 1024 ;
-
int ret ;
-
unsigned int len ;
-
unsigned long e = RSA_3 ;
-
-
BIGNUM *bn ;
-
-
bn = BN_new () ;
-
ret = BN_set_word ( bn , e ) ;
-
-
if ( ret != 1 )
-
{
-
perror ("BN_set_word method goes wrong ") ;
-
return -1 ;
-
}
-
-
rsa = RSA_new () ;
-
-
if ( RSA_generate_key_ex ( rsa , modulelen , bn , NULL ) != 1 )
-
{
-
perror ("RSA_generate_key_ex method goes wrong") ;
-
return -1 ;
-
}
-
-
//---------------------------------------------------------------
-
-
// public key
-
BIO *bioPtr = BIO_new ( BIO_s_file () ) ;
-
-
//----- open public key store file ------
-
if ( BIO_write_filename ( bioPtr , (void*)pub_key_path.c_str ()) <= 0 )
-
{
-
perror ("failed to open public key file ") ;
-
return -1 ;
-
}
-
-
//----- write public key into file -----
-
-
if ( PEM_write_bio_RSAPublicKey( bioPtr , rsa ) != 1 )
-
{
-
perror ("failed to write RSA public key into file") ;
-
return -1 ;
-
}
-
-
//----- if we get here , everything goes well -----
-
printf ("generated RSA public key already written into file %s \n" , pub_key_path.c_str()) ;
-
-
BIO_free_all( bioPtr ) ; // don't forget release and free the allocated space
-
-
-
//-----------------------------------------------------------------------------------------
-
//----- private key -----
-
-
bioPtr = BIO_new_file ( pri_key_path.c_str() , "w+") ;
-
-
if ( bioPtr == NULL )
-
{
-
perror ("failed to open file stores RSA private key ") ;
-
return -1 ;
-
}
-
-
if ( PEM_write_bio_RSAPrivateKey ( bioPtr , rsa ,EVP_des_ede3_ofb() ,
-
(unsigned char *)password.c_str() , password.size() , NULL , NULL ) != 1 )
-
{
-
perror ("failed write RSA private key into file") ;
-
return -1 ;
-
}
-
-
BIO_free_all ( bioPtr ) ; // do not forget this
-
-
printf ("genertated RSA private key already written into file %s \n" , pri_key_path.c_str () ) ;
-
-
return 0 ;
-
}
// Main.cpp
-
#include <cstdio>
-
#include <cstring>
-
#include <iostream>
-
-
#include "rsa_pair.h"
-
-
using namespace std ;
-
-
int main ( int argc , char **argv )
-
{
-
-
string pub_key_path , pri_key_path ;
-
string password ;
-
-
cout << "public key path " << endl;
-
cin >> pub_key_path ;
-
cout << pub_key_path << endl ;
-
-
-
cout << "private key path " << endl ;
-
cin >> pri_key_path ;
-
cout << pri_key_path <<endl ;
-
-
-
cout << "password " << endl ;
-
cin >> password ;
-
cout << password <<endl;
-
-
-
// rsaPair key_pair ;
-
rsaPair key_pair ( pub_key_path , pri_key_path , password) ;
-
-
key_pair.create_key_pair () ;
-
-
-
return 0 ;
-
}
to be continued
阅读(6585) | 评论(0) | 转发(0) |