PEM文件有以下格式

1.PEM私钥文件格式

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

生成该密钥的Linux命令 : OpenSSL> genrsa -out privateKey.pem 1024

读取该密钥的Linux Openssl API函数文件读取:

RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

读取该密钥的Linux Openssl API函数内存读取:

RSA *PEM_read_bio_RSAPrivateKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)

2.PEM私钥文件格式(经过口令加密)

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,FCD22C6C17CF034C
-----END RSA PRIVATE KEY-----

3.PEM公钥文件格式

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

生成该密钥的Linux命令: OpenSSL>rsa -in privateKey.pem -pubout -out publicKey.pem

读取该密钥的Linux Openssl API函数文件读取:

RSA *PEM_read_RSA_PUBKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

读取该密钥的Linux Openssl API函数内存读取:

RSA *PEM_read_bio_PublicKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)

4.PEM RSAPublicKey公钥文件格式

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

-----END RSA PUBLIC KEY-----

生成该密钥的Linux命令: OpenSSL>rsa -in privateKey.pem -RSAPublicKey_out -out publicKey.pem

读取该密钥的Linux Openssl API函数文件读取:

RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **rsa, pem_password_cb *cb, void *u)

读取该密钥的Linux Openssl API函数内存读取:

RSA *PEM_read_bio_RSAPublicKey(BIO *bio, RSA **rsa, pem_password_cb *cb, void *u)

5.RSA加密API

int RSA_public_encrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding)

参数说明:

flen: 填充方式加密长度

from: 要加密信息

to: 加密后的信息

padding: 填充方式(RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_SSLV23_PADDING, RSA_NO_PADDING)

注:flen会根据不同的填充方式大小会有变化参考

6.RSA解密API

int RSA_private_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding)

flen: 解密密钥长度

from: 要解密信息

to: 解密后的信息

padding: 填充方式(RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_SSLV23_PADDING, RSA_NO_PADDING)

注: flen填写的是密钥长度可用RSA_size(rsa)函数得到的

7.RSA编程示例(PEM文件方式)

#include <openssl/rsa.h>
#include <openssl/pem.h>#define PUBLICKEY "publicKey.pem"
#define PRIVATEKEY "privateKey.pem"#define PASS "8888"   //口令int main(int argc, char *argv[])
{FILE *fp = NULL;RSA *publicRsa = NULL;RSA *privateRsa = NULL;if ((fp = fopen(PUBLICKEY, "r")) == NULL) {printf("public key path error\n");return -1;}if ((publicRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL) {printf("PEM_read_RSA_PUBKEY error \n");return -1;}fclose(fp);if ((fp = fopen(PRIVATEKEY, "r")) == NULL) {printf("private key path error\n");return -1;}OpenSSL_add_all_algorithms();   //密钥有经过口令加密需要这个函数if ((privateRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, (char *)PASS)) == NULL) {printf("PEM_read_RSAPrivateKey error\n");return NULL;}fclose(fp);unsigned char *source = (unsigned char *)"123456789";int rsa_len = RSA_size(publicRsa);unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);memset(encryptMsg, 0, rsa_len);int len = rsa_len - 11;if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0) printf("RSA_public_encrypt error\n");else {rsa_len = RSA_size(privateRsa);unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);memset(decryptMsg, 0, rsa_len);int mun = RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);if (mun < 0) printf("RSA_private_decrypt error\n");else printf("RSA_private_decrypt %s\n", decryptMsg);}RSA_free(publicRsa);RSA_free(privateRsa);return 0;
}

8.RSA编程示例(PEM内存方式)

#include <cstdio>
#include <cstring>
#include <openssl/rsa.h>
#include <openssl/pem.h>const char *publicKey = "-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnal1HozHfmZ3B1TITmbjCNKOs\n\
49S+urgJ2P0/T36qN5w+r1jGhZKr54QDI5oXEk+9arlKxDW8kufwGjaTV3i3hyGS\n\
jYv4wNXhPeZAyAQ1vlloLMT6oA0PKe9/l8+mAr1QPEW9fMixAc/0UzPVospjkpfr\n\
YULcrKcH2Oaou5DZ0QIDAQAB\n\
-----END PUBLIC KEY-----";const char *privateKey = "-----BEGIN RSA PRIVATE KEY-----\n\
Proc-Type: 4,ENCRYPTED\n\
DEK-Info: DES-EDE3-CBC,DF3BD9835CA1186D\n\
\n\
pomWi9/hjscwDDzH5CEpcj8nCumOQpl/2Gk2YynA47qfhxt12glNjgWl5Eaevk2L\n\
bG1t85sPqEvYxAe+ZxZdP6fot+sAg4SUUwSvBMwa7s3XjVhHjf/+hOIjb0skHvp/\n\
p0eOoUgytX7FrNNYEpUFI+eiPob79fgQMq/rypGJ//G6GXLMYixWw2+PyPa1x2PQ\n\
WdBaTpZK3gmDqmu6jR3ieKOahVVO4fEGB5etvB5i1aAh0mT4Wu+ejv2LgIRr2xor\n\
r8LkQZvI/TryZ0sNLe7LlC1bz/Hw8hLBDPprhWaUcSEk6MMgh3LKA2y/pGpFdIYN\n\
Ncj/c+YqEsO+I0KOtPQ1fXlXd1hH1H1rkJxuaNanF0UInUuupV3fP+7cvmfyHM4m\n\
aix8ROt1/Ghau41JDZGYmwk2qgKjUw4zz3eYOMQKl6row3pzhDxbvoMp0Qvfje1J\n\
RYpKMy8skG9pY1l4i1CC98aESC2a7FzjUNcY3f5Jt+QznO15xXxxuJZ8+xNqtIh2\n\
U348rlrQ8OxS1YBJCr+wjesdBdQAiY6X1YB9tljPs7AhlTLo78pHtQac521xOA8j\n\
IcbfkuTIrMIwYBOtM6SJHkB1TgPdPWx+haEy79Ct2yDnvpPqOiFz8i8TG8AQY53l\n\
5xKxxJ9CmPqw+Ua3DAWPaxAMaJFteRbl5Lv/2MvxV9Mu3T0W4B3ij+Gg5aw81v5Y\n\
KTH2KxruYAF5Q70QG8CAR8Vkvdczw940y8nb9pvcixmqYcaaeM9DLaTbycn/AeCt\n\
3UM0R0vvu039Ix5uhXUtVMjhTeUnvNObwEcKM8Grv1oPV3zmTJ5hJg==\n\
-----END RSA PRIVATE KEY-----";
--------------------- #define PASS "8888"    //口令int main(int argc, char *argv[])
{BIO *bio = NULL;RSA *publicRsa = NULL;RSA *privateRsa = NULL;if ((bio = BIO_new_mem_buf((void *)publicKey, -1)) == NULL) {printf("BIO_new_mem_buf publicKey error\n");return -1;}if ((publicRsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL)) == NULL) {printf("PEM_read_bio_RSA_PUBKEY error\n");return -1;}BIO_free_all(bio);if ((bio = BIO_new_mem_buf((void *)privateKey, -1)) == NULL) {printf("BIO_new_mem_buf privateKey error\n");return -1;}OpenSSL_add_all_algorithms();//密钥有经过口令加密需要这个函数if ((privateRsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, (char *)PASS)) == NULL) {printf("PEM_read_RSAPrivateKey error\n");return NULL;}BIO_free_all(bio);unsigned char *source = (unsigned char *)"123456789";int rsa_len = RSA_size(publicRsa);unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);memset(encryptMsg, 0, rsa_len);int len = rsa_len - 11;if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0) printf("RSA_public_encrypt error\n");else {rsa_len = RSA_size(privateRsa);unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);memset(decryptMsg, 0, rsa_len);int mun = RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);if (mun < 0) printf("RSA_private_decrypt error\n");else printf("RSA_private_decrypt %s\n", decryptMsg);   }RSA_free(publicRsa);RSA_free(privateRsa);return 0;
}

9.RSA编程示例(PEM文件方式多线程测试样例)

#include <cstdio>
#include <cstring>
#include <pthread.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#define PRIKEY "prikey.pem"
#define PUBKEY "pubkey.pem"RSA *publicRsa = NULL;
RSA *privateRsa = NULL;void* rsaThreadOne(void* param)
{   unsigned char *source = (unsigned char *)param;int rsa_len = RSA_size(publicRsa);unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);memset(encryptMsg, 0, rsa_len);int len = rsa_len - 11;if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0){printf("rsaThreadOne RSA_public_encrypt error\n");return 0;}rsa_len = RSA_size(privateRsa);unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);memset(decryptMsg, 0, rsa_len);int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);if ( mun < 0){printf("rsaThreadOne RSA_private_decrypt error\n");return 0;}else {printf("rsaThreadOne %s\n", decryptMsg);}return 0;
}void* rsaThreadTwo(void* param)
{   unsigned char *source = (unsigned char *)param;int rsa_len = RSA_size(publicRsa);unsigned char *encryptMsg = (unsigned char *)malloc(rsa_len);memset(encryptMsg, 0, rsa_len);int len = rsa_len - 11;if (RSA_public_encrypt(len, source, encryptMsg, publicRsa, RSA_PKCS1_PADDING) < 0){printf("rsaThreadTwo RSA_public_encrypt error\n");return 0;}rsa_len = RSA_size(privateRsa);unsigned char *decryptMsg = (unsigned char *)malloc(rsa_len);memset(decryptMsg, 0, rsa_len);int mun =  RSA_private_decrypt(rsa_len, encryptMsg, decryptMsg, privateRsa, RSA_PKCS1_PADDING);if ( mun < 0){printf("rsaThreadTwo RSA_private_decrypt error\n");return 0;}else {printf("rsaThreadTwo %s\n", decryptMsg);}  return 0;
}int main(int argc, char *argv[])
{FILE *fp = NULL;if ((fp = fopen(PUBKEY, "r")) == NULL) {printf("pubkey_path error\n");return -1;}  if ((publicRsa = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL)) == NULL) {printf("PEM_read_RSA_PUBKEY error\n");return -1;}fclose(fp);if ((fp = fopen(PRIKEY, "r")) == NULL) {printf("prikey_path error\n");return -1;}OpenSSL_add_all_algorithms();//密钥有经过口令加密需要这个函数if ((privateRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, (char *)"8888")) == NULL) {printf("PEM_read_RSAPrivateKey error\n");return NULL;}fclose(fp);pthread_t tid1 ;pthread_t tid2 ;pthread_create(&tid1, NULL, rsaThreadOne, (void *)"123456789");pthread_create(&tid2, NULL, rsaThreadTwo, (void *)"987654321");pthread_join(tid1,NULL); pthread_join(tid2,NULL);return 0;
}

10.相应参考文章、文档

嗨!大佟!博客
               wjlkoorey的博客
               需要翻墙才能访问的openssl github

转载地址:https://blog.csdn.net/aqlick12/article/details/78480505

在实际的编译过程中,出现了如下的错误:

参考了https://bugs.php.net/bug.php?id=15780链接中的第一条回复,发现我的系统中有两个openssl版本,所以需要确保include的东西和link的东西版本保持一致。故加了-I/usr/local/openssl/include之后,问题消失,如下:

Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程相关推荐

  1. encrypt decrypt 加密解密完整实例(密文可用密钥解密)

    <?php error_reporting(0); header("content-Type: text/html; charset=utf-8");//输出编码/**功能: ...

  2. android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。

    Encrypt(加密工具) 字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案. 加密类型 摘要 相关方法 简单加密 换一种编码格式 Base64Util 单向加密 只能加密,不 ...

  3. php读取证书加密,PHP中使用OpenSSL来产生证书加密解密源代码- -

    PHP中使用OpenSSL来产生证书加密解密源代码- - 我想这段代码足够简单,没必要写函数说明了吧. 该程序在linux+Apache 2.0 + PHP Version 4.2.2 中运行通过. ...

  4. Python crypto模块实现RSA和AES加密解密

    Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...

  5. RSA算法与加密解密

    RSA算法与加密解密 什么是RSA算法(RSA algorithm) 什么是非对称加密算法 RSA加密解密原理 算法攻击和蓝桥杯2018年省赛题目 RSA的小指数攻击 蓝桥杯2018年省赛题目 第一步 ...

  6. python rsa 公钥解密_python利用rsa库做公钥解密的方法教程

    前言 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文.D 和 N 的组合就是私钥(private key). 算法的加密 ...

  7. java 文件 加解密_Java实现文件的加密解密功能示例

    Java实现文件的加密解密功能示例 发布时间:2020-10-05 22:05:15 来源:脚本之家 阅读:86 作者:FC WORLD!!! 本文实例讲述了Java实现文件的加密解密功能分享给大家供 ...

  8. linux配置文件密码加密工具,Linux下利用openssl对文件进行加密和解密

    转载地址:http://hi.baidu.com/edeed/item/99206a096b62d0e1ff240db8 --建立文件test.txt, 特意写入中英文# cd /tmp # echo ...

  9. linux C++ 使用openssl rsa算法实现对计算机物理地址进行签名和认证

    首先需要使用openssl生成公钥和私钥,然后对字符串进行签名和认证. license.h #pragma once #include <iostream> #include <st ...

最新文章

  1. python 多线程和协程结合_一文讲透 “进程、线程、协程”
  2. 关于Linux发行版本RedHat9中文输入法使用问题的说明
  3. Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据
  4. php不能显示验证码
  5. 细数非对称加密与对称加密的区别
  6. Java面试之线程池详细
  7. 晨风机器人对接php_php封装实现钉钉机器人报警接口的示例代码
  8. C++合并两个有序数组成一个有序数组时间复杂度最小的解法
  9. python3.x编程模板总结
  10. 恢复svn服务器误删的文件,SVN删除文件及其恢复问题详解
  11. 多线程编程中条件变量和的spurious wakeup 虚假唤醒
  12. 淘宝自动下单软件//下单神器、、
  13. Neo4j 4.x 社区版数据导入及Spring-Data-Neo4j 5.x、6.x使用案例
  14. 苹果手机测试腿长软件,抖音测腿长特效功能在哪里 量长度app测距离软件推荐...
  15. 记一次Process finished with exit code 1 项目异常
  16. 文本分类入门(一)文本分类问题的定义
  17. st_atime、st_mtime和st_ctime
  18. 在linux4.15 移植设备树到JZ2440
  19. 病毒、蠕虫、木马区别
  20. 中国城市信息化50强发布 邯郸位居二十,排名不低呀,

热门文章

  1. 数据结构(5) -- 图
  2. 【详细注释】1051 Pop Sequence (25 分)
  3. nc 探测端口_防盗报警探测器的几种防拆接线方式,附接线图
  4. html弹出文本输入框,Windows API 弹出文本框输入的内容
  5. 数据库修改后Hibernate的配置更新
  6. Linux软件包组的选择
  7. DataInputStream与DataOutputStream类
  8. 无线路由器和计算机怎么连接网络连接,华为无线路由器怎么连接宽带上网
  9. linux war版本管理,linux(centos8):用systemctl管理war包形式的jenkins(java 14 / jenkins 2.257)...
  10. qt 最小化到托盘linux,Qt窗口最小化到托盘,托盘菜单控制