rsa加密的密钥格式常见的有两种:
一种是PKCS#1,密钥头为

-----BEGIN RSA PUBLIC KEY-----

一种是PKCS#8,密钥头为

-----BEGIN PUBLIC KEY-----

以字符串公钥为例,对PKCS#1格式的密钥加载使用的函数是PEM_read_bio_RSAPublicKey(),而对PKCS#8格式公钥的加载使用的是函数PEM_read_bio_RSA_PUBKEY()。

1、生成密钥对

#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <stdio.h>
#include <iostream>
using namespace std;#ifndef _WIN64
#pragma comment(lib, "libcrypto.lib")
#else
#pragma comment(lib, "libcrypto-x64.lib")
#endif // WIN32#define KEY_LENGTH  1024             // 密钥长度
#define PUB_KEY_FILE "pubkey.pem"    // 公钥路径
#define PRI_KEY_FILE "prikey.pem"    // 私钥路径  // 随机生成密钥字符串
BOOL generateRSAKey()
{// 公私密钥对    size_t pri_len;size_t pub_len;char *ucPriKey = NULL;char *ucPubKey = NULL;// 生成密钥对    RSA *keypair = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);BIO *pri = BIO_new(BIO_s_mem());BIO *pub = BIO_new(BIO_s_mem());PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);PEM_write_bio_RSAPublicKey(pub, keypair);// 获取长度    pri_len = BIO_pending(pri);pub_len = BIO_pending(pub);// 密钥对读取到字符串ucPriKey = (char *)malloc(pri_len + 1);ucPubKey = (char *)malloc(pub_len + 1);BIO_read(pri, ucPriKey, pri_len);BIO_read(pub, ucPubKey, pub_len);ucPriKey[pri_len] = '\0';ucPubKey[pub_len] = '\0';// 存储密钥对    FILE *pubFile = fopen(PUB_KEY_FILE, "w");if (pubFile == NULL)return FALSE;fputs(ucPubKey, pubFile);fclose(pubFile);FILE *priFile = fopen(PRI_KEY_FILE, "w");if (priFile == NULL)return FALSE;fputs(ucPriKey , priFile);fclose(priFile);// 内存释放  RSA_free(keypair);BIO_free_all(pub);BIO_free_all(pri);free(ucPriKey);free(ucPubKey);return TRUE;
}// 根据密钥字符串生成密钥对
RSA * createRSA(unsigned char * ucKey, bool IsPubkey)
{RSA *rsa = NULL;BIO *keybio;keybio = BIO_new_mem_buf(ucKey, -1);if (keybio == NULL){printf("Failed to create key BIO");return 0;}if (IsPubkey){rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);}else{rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);}if (rsa == NULL){printf("Failed to create RSA");}return rsa;
}

2、公钥加密 -> 私钥解密

int public_encrypt(unsigned char * ucKey, int nKeyLen, unsigned char * ucPubKey, unsigned char *outData)
{RSA * rsa = createRSA(ucPubKey, 1);int  result = RSA_public_encrypt(nKeyLen, ucKey, outData, rsa, RSA_PKCS1_PADDING);if (rsa != NULL){RSA_free(rsa);rsa = NULL;}return result;
}int private_decrypt(unsigned char * ucKey, int nKeyLen, unsigned char * ucPriKey, unsigned char *outData)
{RSA * rsa = createRSA(ucPriKey, 0);int  result = RSA_private_decrypt(nKeyLen, ucKey, outData, rsa, RSA_PKCS1_PADDING);if (rsa != NULL){RSA_free(rsa);rsa = NULL;}return result;
}

3、私钥加密 -> 公钥解密

int private_encrypt(unsigned char * ucKey, int nKeyLen, unsigned char * ucPriKey, unsigned char *outData)
{RSA * rsa = createRSA(ucPriKey, 0);int result = RSA_private_encrypt(nKeyLen, ucKey, outData, rsa, RSA_PKCS1_PADDING);if (rsa != NULL){RSA_free(rsa);rsa = NULL;}return result;
}int public_decrypt(unsigned char * ucKey, int ulKeyLen, unsigned char * ucPubKey, unsigned char *outData)
{RSA * rsa = createRSA(ucPubKey, 1);int  result = RSA_public_decrypt(ulKeyLen, ucKey, outData, rsa, RSA_PKCS1_PADDING);if (rsa != NULL){RSA_free(rsa);rsa = NULL;}return result;
}

OpenSSL RSA加密和解密相关推荐

  1. 使用OpenSSL进行RSA加密和解密(非对称)

    1. RSA加密和解密基础概念 RSA是一种非对称加密. RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密. 加密 ...

  2. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...

    前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...

  3. GO语言实现RSA 加密和解密的实现

    RSA 加密和解密的实现 openssl生成私钥 openssl genrsa -out rsa_private_key.pem 1024 openssl生成公钥 openssl rsa -in rs ...

  4. 数字签名、证书,RSA加密、解密

    文章目录 一.相关知识扫盲篇 数字签名.数字证书 防止证书伪造 之 证书链-Digital Certificates 二.公私钥格式.协议规范 三.golang RSA加密.解密具体实现 `RSA`加 ...

  5. 使用OpenSSL1.1.1中的libcrypto库进行RSA加密与解密数据

    废话不多说, 直接说怎么写代码 编译的时候如何包含库文件这种事情就不说了. 第一步, 包含头文件. #include <openssl/rsa.h> // 既然是RSA加密该头文件肯定是需 ...

  6. javascript rsa java,用javascript与java执行 RSA加密与解密

    用javascript与java执行 RSA加密与解密 2009-12-12 14:58:30   出处:https://www.yqdown.com 这几天一直做安全登录,网上查了好多资料,不尽如意 ...

  7. 跨语言平台的RSA加密、解密、签名、验证算法的实现

      在网上可以找到各种各样的RSA实现代码,原理都是RSA算法的基本原理,但是在处理数据块划分.填充等问题上都是形形色色的,本文旨在探讨.实现遵循RFC 2313 PKCS#1 v1.5标准的一种跨语 ...

  8. C#实现RSA加密和解密详解

    C#实现RSA加密和解密详解 原文:C#实现RSA加密和解密详解 RSA加密解密源码: using System; using System.Collections.Generic; using Sy ...

  9. C# -- RSA加密与解密

    1.  RSA加密与解密  --  使用公钥加密.私钥解密 public class RSATool{public string Encrypt(string strText, string strP ...

最新文章

  1. 多视图几何三维重建实战系列之R-MVSNet
  2. 使用OpenMP实现多线程,不仅是用在循环处理上
  3. 数据结构与算法JavaScript描述——使用队列
  4. Spring IOC快速入门
  5. java中四种默认的权限修饰符,Java中四种访问权限资料整理
  6. VMware下Centos7快速搭建vsftpd
  7. 爬虫.之登陆及动态网页的抓取
  8. NSString、NSMutableString基本用法
  9. 顺序表之元素位置互换(改进版)
  10. win10怎么把c盘锁住_win10怎样锁住c盘 win10删除c盘无用文件
  11. 灵敏度和特异度计算方法
  12. 组件分享之后端组件——用Go编写的IMAP4rev1库go-imap
  13. win10安装vs2015出现“安装包丢失或损坏”解决办法
  14. 当女生成为软件测试员,我才发现年薪30W+其实并不难…
  15. EAX、ESP、EBP等寄存器的作用
  16. Mysql数据库快速插入亿级数据
  17. 起源计划丨四大战队集结 向最后的荣耀冲刺
  18. 调功器PA400X系列选型+个人理解
  19. 爆料:曹旭东创立自动驾驶公司Momenta 首次公开项目细节
  20. 香港1997年是怎样被索罗斯击败的

热门文章

  1. leetcode解题方案--015--3 sum
  2. 四季靓汤—瘦肉鸡骨草煲蜜枣汤
  3. uni-app 父组件调用子组件方法
  4. 解析:Web3.0→Web6.0!又将创造什么机遇?
  5. css常见效果——信封效果
  6. Redis 的部署模式
  7. 主键和唯一索引区别?
  8. jsp+sql制作简单的购物车
  9. MySQL--内连接查询(inner join)
  10. top命令参数详解(linux top命令的用法详细详解)