Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581061
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-05-28 23:21:55

在这篇文章中简单介绍一下如何编译安装和使用第三方库 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

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <openssl/pem.h>
  5. #include <openssl/rsa.h>

  6. int main ( int argc , char **argv )
  7. {
  8.    return 0 ;
  9. }
  10. ~
如果没有任何提示信息输出的话, 说明 ssl  这个动态链接库已经可以正常工作了



用于生成存放 RSA 公密钥对文件程序代码如下
Makefile

点击(此处)折叠或打开

  1. default :
  2. g++ -g -w -o test rsa_pair.cpp rsa_pair.h Main.cpp \
  3. -I/unixC/openssl/openssl/include -L/unixC/openssl/openssl -lssl -lcrypto -ldl

// rsa_pair.h

点击(此处)折叠或打开

  1. #ifndef RSA_PAIR_H_
  2. #define RSA_PAIR_H_

  3. #include <iostream>
  4. #include <string>
  5. #include <sstream>
  6. #include <openssl/rsa.h>
  7. #include <openssl/pem.h>
  8. #include <openssl/err.h>
  9. #include <openssl/bn.h> // this is for the BN_new


  10. class rsaPair
  11. {
  12.   public :
  13.         rsaPair ()
  14.         {
  15.            pub_key = NULL ;
  16.            pri_key = NULL ;
  17.     }
  18.     rsaPair ( std::string pub_k_path , std::string pri_key_path, std::string psword ) ;
  19.     ~rsaPair () ;
  20.     
  21.     int create_key_pair () ;

  22.   private :
  23.     std::string pub_key_path ;
  24.     std::string pri_key_path ;
  25.     std::string password ;
  26.     RSA *pub_key ;
  27.     RSA *pri_key ;
  28. } ;

  29. #endif

// rsa_pair.cpp

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. #include "rsa_pair.h"

  3. using namespace std ;

  4. rsaPair::rsaPair( string pub_k_path , string pri_k_path , string psword)
  5. {
  6.    pub_key = NULL ;
  7.    pri_key = NULL ;


  8.    if ( pub_k_path.empty () || pri_k_path.empty() )
  9.    {
  10.     perror ("file stores key values empty") ;
  11.         return ;
  12.    }
  13.    
  14.    if ( psword.empty ())
  15.    {
  16.     perror ("password empty , use default") ;
  17.     password = "inuyasha" ;
  18.       return ;
  19.   }

  20.    printf ("here ") ;
  21.   
  22.    pub_key_path = pub_k_path ;
  23.    pri_key_path = pri_k_path ;
  24.     
  25.    password = psword ;

  26. }

  27. rsaPair::~rsaPair ()
  28. {
  29.     if ( pub_key )
  30.        RSA_free ( pub_key ) ;
  31.   
  32.     if ( pri_key )
  33.     RSA_free ( pri_key ) ;
  34. }


  35. int rsaPair::create_key_pair ()
  36. {
  37.   RSA *rsa ;
  38.   int modulelen = 1024 ;
  39.   int ret ;
  40.   unsigned int len ;
  41.   unsigned long e = RSA_3 ;
  42.  
  43.   BIGNUM *bn ;
  44.   
  45.   bn = BN_new () ;
  46.   ret = BN_set_word ( bn , e ) ;
  47.    
  48.   if ( ret != 1 )
  49.   {
  50.     perror ("BN_set_word method goes wrong ") ;
  51.     return -1 ;
  52.   }
  53.   
  54.   rsa = RSA_new () ;

  55.   if ( RSA_generate_key_ex ( rsa , modulelen , bn , NULL ) != 1 )
  56.   {
  57.     perror ("RSA_generate_key_ex method goes wrong") ;
  58.     return -1 ;
  59.   }

  60. //---------------------------------------------------------------
  61.   
  62.   // public key
  63.   BIO *bioPtr = BIO_new ( BIO_s_file () ) ;
  64.   
  65.   //----- open public key store file ------
  66.   if ( BIO_write_filename ( bioPtr , (void*)pub_key_path.c_str ()) <= 0 )
  67.   {
  68.     perror ("failed to open public key file ") ;
  69.     return -1 ;
  70.   }
  71.     
  72.   //----- write public key into file -----
  73.  
  74.   if ( PEM_write_bio_RSAPublicKey( bioPtr , rsa ) != 1 )
  75.   {
  76.      perror ("failed to write RSA public key into file") ;
  77.     return -1 ;
  78.   }

  79.   //----- if we get here , everything goes well -----
  80.   printf ("generated RSA public key already written into file %s \n" , pub_key_path.c_str()) ;
  81.   
  82.   BIO_free_all( bioPtr ) ; // don't forget release and free the allocated space


  83. //-----------------------------------------------------------------------------------------
  84.    //----- private key -----
  85.     
  86.    bioPtr = BIO_new_file ( pri_key_path.c_str() , "w+") ;
  87.    
  88.    if ( bioPtr == NULL )
  89.    {
  90.     perror ("failed to open file stores RSA private key ") ;
  91.        return -1 ;
  92.    }

  93.    if ( PEM_write_bio_RSAPrivateKey ( bioPtr , rsa ,EVP_des_ede3_ofb() ,
  94.             (unsigned char *)password.c_str() , password.size() , NULL , NULL ) != 1 )
  95.    {
  96.     perror ("failed write RSA private key into file") ;
  97.     return -1 ;
  98.    }
  99.     
  100.    BIO_free_all ( bioPtr ) ; // do not forget this
  101.    
  102.    printf ("genertated RSA private key already written into file %s \n" , pri_key_path.c_str () ) ;

  103.   return 0 ;
  104. }

// Main.cpp

点击(此处)折叠或打开

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>

  4. #include "rsa_pair.h"

  5. using namespace std ;

  6. int main ( int argc , char **argv )
  7. {

  8.   string pub_key_path , pri_key_path ;
  9.   string password ;
  10.   
  11.   cout << "public key path " << endl;
  12.   cin >> pub_key_path ;
  13.   cout << pub_key_path << endl ;


  14.   cout << "private key path " << endl ;
  15.   cin >> pri_key_path ;
  16.   cout << pri_key_path <<endl ;
  17.   

  18.   cout << "password " << endl ;
  19.   cin >> password ;
  20.   cout << password <<endl;

  21.   
  22.  // rsaPair key_pair ;
  23.   rsaPair key_pair ( pub_key_path , pri_key_path , password) ;
  24.   
  25.    key_pair.create_key_pair () ;
  26.   
  27.   
  28.   return 0 ;
  29. }

to be continued
阅读(6585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~