QT openssl RSA非对称加密解密示例(PEM_read_RSAPublicKey AndPEM_read_RSA_PUBKEY)

1:在加密的时候往往由于不同的语言调用openssl库生成的秘钥格式不同 PEM公钥格式文件

(1)-----BEGIN PUBLIC KEY----- 
     -----END PUBLIC KEY----- 
  PEM RSAPublicKey公钥格式文件

(2)-----BEGIN RSA PUBLIC KEY----- 
     -----END RSA PUBLIC KEY----- 

2:针对这两种不同格式的公钥:选择不同的方法进行加密:

(1)PEM_read_RSA_PUBKEY      针对第一种格式
(2)PEM_read_RSAPublicKey    针对第二种格式

3:进行加密:

由于:公钥是begin public key 格式,所以调用 PEM_read_RSA_PUBKEY 方法;
参数:str 为加密的数据   ,publick_key 为公钥的路径
QByteArray http::encode_c(char*str,char*pubkey_path)
{
          RSA * rsa = NULL;
          FILE* fp = NULL;
          char* en = NULL;
          if((fp = fopen(pubkey_path,"rb")) == NULL)
          {
               return NULL;
          }
          /* 读取公钥PEM,PUBKEY格式PEM使用PEM_read_RSA_PUBKEY函数 */
          if((rsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL)
          {
              return NULL;
          }
          int rsa_len = RSA_size(rsa);
          en = (char*)malloc(rsa_len);
          int reasult = RSA_public_encrypt(strlen(str), (unsigned char*)str, (unsigned char*)en, rsa, RSA_PKCS1_PADDING);
          if(reasult == -1)
          {
              return NULL;
          }
          RSA_free(rsa);
          return QByteArray(reinterpret_cast<char*>(en),reasult).toBase64();
}

4:进行解密:

QByteArray http::decode_c(char*str,char*prikey_path)
{
       RSA *rsa = NULL;
       FILE*fp = NULL;
       char*de = NULL;
       int rsa_len = 0;
       if((fp = fopen(prikey_path,"rb")) == NULL)
       {
           return "read fail";
       }
       if((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)) == NULL) 
       {
           return NULL;
       }
       rsa_len = RSA_size(rsa);
       de = (char*)malloc(rsa_len);
       int reasult=RSA_private_decrypt(strlen(str), (unsigned char*)str, (unsigned char*)de, rsa, RSA_PKCS1_PADDING);
       if( reasult==-1)
       {
           return "";
       }
       RSA_free(rsa);
       fclose(fp);
       return QByteArray(reinterpret_cast<char*>(de),reasult);
}

注意:


1:分段加密:

		  在采用加密的时候,会有512 1024 2028 bit 的 时候, 这个其实是限制加密的数据长度.
		  基本的判断是;  bit 数 /8  - 11  
	      512   bit  			512 / 8 -11     一次性加密 53个字符
          1024 bit 								 一次性加密 117个字符
          2048 bit 								 一次性加密 245 个字符
          这个时候 加密的数据超过了 一次性加密字符数.那就要采用分段加密.
          比如 一次性加密数 为50 , 你有110 个.那就要采用三次加密. 加密后将密文拼接.
2:中文加密:

 			还有一种就是 有中文, 中文是两个字节, 还是以50个加密数为例子.
	 	 	恰巧这回中文 刚好停留在50 和51 的时候,这就有问题了.
  		    简单的方法就是,将数据 先base64 转换 在加密.

代码地址: https://github.com/heisai/RsaEncipherMent/tree/master

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
PEM_read_bio_RSA_PUBKEY 函数的用法如下: ```c #include <openssl/rsa.h> #include <openssl/pem.h> RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x, pem_password_cb *cb, void *u); ``` 这个函数的四个参数含义如下: - `bp`:一个BIO指针,用于读取PEM格式的RSA公钥内容。 - `x`:指向RSA结构体指针的指针,用于返回读取的RSA公钥。 - `cb`:密码回调函数指针,用于解密加密的PEM格式的RSA公钥文件(如果有)。 - `u`:传递给密码回调函数的上下文指针。 使用 PEM_read_bio_RSA_PUBKEY 函数读取PEM格式的RSA公钥文件的示例代码如下: ```c #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { // 打开PEM格式的RSA公钥文件 FILE *fp = fopen("public_key.pem", "r"); if (!fp) { printf("Error: Failed to open public_key.pem file.\n"); return 1; } // 创建BIO对象并将PEM格式的公钥内容写入BIO对象中 BIO *bio = BIO_new_fp(fp, BIO_NOCLOSE); // 读取PEM格式的RSA公钥并转换为RSA结构体 RSA *rsa = NULL; rsa = PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL); if (!rsa) { printf("Error: Failed to read RSA public key.\n"); return 1; } // 打印RSA公钥信息 printf("RSA public key information:\n"); printf("Modulus size: %d bits\n", RSA_size(rsa) * 8); printf("Exponent: %lu\n", rsa->e); // 释放资源 RSA_free(rsa); BIO_free(bio); fclose(fp); return 0; } ``` 在使用这个函数之前,需要先安装 OpenSSL 库并包含头文件 `#include <openssl/rsa.h>` 和 `#include <openssl/pem.h>`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值