首页
社区
课程
招聘
[原创]openssl RSA加密
发表于: 2010-4-16 18:10 14616

[原创]openssl RSA加密

2010-4-16 18:10
14616

初学openssl,大牛飘过
程序运行过程
1.生成密钥对,保存密钥对

2.读取密钥对

3.用经过读取获得的密钥对对数据进行加解密(公钥加密私钥解密)

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include<openssl/evp.h>
#include <string.h>
EVP_PKEY* open();
EVP_PKEY* Popen();
void print(const char *promptStr,unsigned char * data,int len);
void generate_key();
void  main(){
        
  EVP_PKEY* pkey=NULL,*pkey1=NULL;
        generate_key();
        pkey1=Popen();
  if(pkey1==NULL)
  {  
            printf("p加密失败\n");
      exit(-1);
  }
      pkey=open();
  if(pkey==NULL)
  {  
  exit(-1);
  }
     int len=-1;
     char plainText[]="[For test to public/private key encryption/decryption]";
     char encData[512];
      char decData[512];
     OpenSSL_add_all_ciphers();
     len=EVP_PKEY_encrypt(
       (unsigned char *)encData,
             (const unsigned char *)plainText,
          sizeof(plainText),
          pkey1
      );
        if(len==-1)
  {
        printf("EVP_PKEY_encrypt加密失败\n");
      exit(-1);
  }
        print("加密后的数据",(unsigned char *)encData,len);
        len=EVP_PKEY_decrypt(
           (unsigned char *)decData,
                (const unsigned char *)encData,
             len,
          pkey
      );
      if(len==-1)
  {
      printf("EVP_PKEY_decrypt解密失败\n");
        exit(-1);
  }
      print("解密后的数据",(unsigned char *)decData,len);
     printf("\n明文是:[长度=%d字节]:%s\n",len,decData);
     EVP_PKEY_free(pkey);
}
void generate_key()
{
     RSA *rsa=NULL;
        printf("正在产生RSA密钥...\n");
        rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
        if(rsa==NULL)
        {
                printf("gen rsa error\n");
                 exit(-1);
        }
        // 公钥
        BIO *bp = BIO_new(BIO_s_file());
        if(BIO_write_filename(bp, "E:\\毕业设计\\加密成功2\\public.pem")<=0)
        {
                printf("write error\n");
                exit(-1);
        }
        if(PEM_write_bio_RSAPublicKey(bp, rsa)!=1)
        {
                printf("write public key error\n");
                exit(-1);
        }  
  printf("保存公钥成功\n");
        BIO_free_all(bp);
        
        char passwd[]="1234";
        // 私钥
        bp = BIO_new_file("E:\\毕业设计\\加密成功2\\private.pem", "w+");
        if(PEM_write_bio_RSAPrivateKey(bp, rsa, EVP_des_ede3(), (unsigned char*)passwd, 4, NULL, NULL)!=1)
        {
                printf("write public key error\n");
                exit(-1);
        }
  printf("保存私钥成功\n");
        BIO_free_all(bp);

}
EVP_PKEY* open()
{
  EVP_PKEY* pkey=NULL;
  RSA *rsaK;
  OpenSSL_add_all_algorithms();
  BIO *BP=BIO_new(BIO_s_file());;
  char FileName[]="E:\\毕业设计\\加密成功2\\private.pem";
  BIO_read_filename(BP,FileName);
  char PSW[]="1234";
  rsaK=PEM_read_bio_RSAPrivateKey(BP,NULL,NULL,PSW);
  if(rsaK==NULL)
  {
      printf("读取失败!\n");
      BIO_free(BP);
      RSA_free(rsaK);
      exit(-1);
  }
  printf("私钥获取成功\n");
  pkey=EVP_PKEY_new();
   if(NULL==pkey)
   {
    printf("EVP_PKEY_new failed\n");
    RSA_free(rsaK);
    return NULL;
   }
   EVP_PKEY_assign_RSA(pkey,rsaK);
   return pkey;
}

EVP_PKEY* Popen()
{
  EVP_PKEY* pkey=NULL;
  RSA *rsaK;
  OpenSSL_add_all_algorithms();
  BIO *BP=BIO_new(BIO_s_file());;
  char FileName[]="E:\\毕业设计\\加密成功2\\public.pem";
  BIO_read_filename(BP,FileName);
  rsaK=PEM_read_bio_RSAPublicKey(BP,NULL,NULL,NULL);
  if(rsaK==NULL)
  {
      printf("读取失败!\n");
      BIO_free(BP);
      RSA_free(rsaK);
      exit(-1);
  }
  printf("私钥获取成功\n");
  pkey=EVP_PKEY_new();
   if(NULL==pkey)
   {
    printf("EVP_PKEY_new failed\n");
    RSA_free(rsaK);
    return NULL;
   }
   EVP_PKEY_assign_RSA(pkey,rsaK);
   return pkey;
}

void print(const char *promptStr,unsigned char * data,int len)
{
int i;
printf("\n===%s[长度=%d字节]======\n",promptStr,len);
for(i=0;i<len;i++)printf("%02x",data[i]);
printf("\n======================================\n");
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 99
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自已顶自已个
2010-4-16 20:25
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不错,支持下~
2010-4-16 21:23
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看了就要顶...刚好也需要了...
2010-6-22 16:43
0
雪    币: 21
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
本人感兴趣啊,这个不错。不知道楼主研究进展如何,如要从事哪方面的研究呢》?
2010-6-22 19:27
0
雪    币: 420
活跃值: (77)
能力值: ( LV13,RANK:500 )
在线值:
发帖
回帖
粉丝
6
openssl 不错。。
2010-6-25 10:19
0
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
很好。
我写的RSA8192测试代码,注入目标进程,替换了N:
void makekey()
{
        RSA *key;
        key = RSA_generate_key(8192, RSA_F4,0,0);
       
        char* pb;
        pb = BN_bn2hex((const BIGNUM *)key->e);
       
        cout << "E:" << endl;
        cout << pb << endl;
       
        pb = BN_bn2hex((const BIGNUM *)key->n);
       
        cout << "N:" << endl;
        cout << pb << endl;
       
        pb = BN_bn2hex((const BIGNUM *)key->d);
       
        cout << "D:" << endl;
        cout << pb << endl;
       
        pb = BN_bn2hex((const BIGNUM *)key->p);
       
        cout << "P:" << endl;
        cout << pb << endl;
       
        pb = BN_bn2hex((const BIGNUM *)key->q);
       
        cout << "Q:" << endl;
        cout << pb << endl;
}
2010-8-2 11:20
0
雪    币: 315
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
貌似这个函数generate_key,在生成key时,有问题,
2010-12-10 16:41
0
游客
登录 | 注册 方可回帖
返回
//