Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程
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(加密/解密) 简单示例教程相关推荐
- encrypt decrypt 加密解密完整实例(密文可用密钥解密)
<?php error_reporting(0); header("content-Type: text/html; charset=utf-8");//输出编码/**功能: ...
- android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。
Encrypt(加密工具) 字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案. 加密类型 摘要 相关方法 简单加密 换一种编码格式 Base64Util 单向加密 只能加密,不 ...
- php读取证书加密,PHP中使用OpenSSL来产生证书加密解密源代码- -
PHP中使用OpenSSL来产生证书加密解密源代码- - 我想这段代码足够简单,没必要写函数说明了吧. 该程序在linux+Apache 2.0 + PHP Version 4.2.2 中运行通过. ...
- Python crypto模块实现RSA和AES加密解密
Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...
- RSA算法与加密解密
RSA算法与加密解密 什么是RSA算法(RSA algorithm) 什么是非对称加密算法 RSA加密解密原理 算法攻击和蓝桥杯2018年省赛题目 RSA的小指数攻击 蓝桥杯2018年省赛题目 第一步 ...
- python rsa 公钥解密_python利用rsa库做公钥解密的方法教程
前言 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文.D 和 N 的组合就是私钥(private key). 算法的加密 ...
- java 文件 加解密_Java实现文件的加密解密功能示例
Java实现文件的加密解密功能示例 发布时间:2020-10-05 22:05:15 来源:脚本之家 阅读:86 作者:FC WORLD!!! 本文实例讲述了Java实现文件的加密解密功能分享给大家供 ...
- linux配置文件密码加密工具,Linux下利用openssl对文件进行加密和解密
转载地址:http://hi.baidu.com/edeed/item/99206a096b62d0e1ff240db8 --建立文件test.txt, 特意写入中英文# cd /tmp # echo ...
- linux C++ 使用openssl rsa算法实现对计算机物理地址进行签名和认证
首先需要使用openssl生成公钥和私钥,然后对字符串进行签名和认证. license.h #pragma once #include <iostream> #include <st ...
最新文章
- python 多线程和协程结合_一文讲透 “进程、线程、协程”
- 关于Linux发行版本RedHat9中文输入法使用问题的说明
- Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据
- php不能显示验证码
- 细数非对称加密与对称加密的区别
- Java面试之线程池详细
- 晨风机器人对接php_php封装实现钉钉机器人报警接口的示例代码
- C++合并两个有序数组成一个有序数组时间复杂度最小的解法
- python3.x编程模板总结
- 恢复svn服务器误删的文件,SVN删除文件及其恢复问题详解
- 多线程编程中条件变量和的spurious wakeup 虚假唤醒
- 淘宝自动下单软件//下单神器、、
- Neo4j 4.x 社区版数据导入及Spring-Data-Neo4j 5.x、6.x使用案例
- 苹果手机测试腿长软件,抖音测腿长特效功能在哪里 量长度app测距离软件推荐...
- 记一次Process finished with exit code 1 项目异常
- 文本分类入门(一)文本分类问题的定义
- st_atime、st_mtime和st_ctime
- 在linux4.15 移植设备树到JZ2440
- 病毒、蠕虫、木马区别
- 中国城市信息化50强发布 邯郸位居二十,排名不低呀,
热门文章
- 数据结构(5) -- 图
- 【详细注释】1051 Pop Sequence (25 分)
- nc 探测端口_防盗报警探测器的几种防拆接线方式,附接线图
- html弹出文本输入框,Windows API 弹出文本框输入的内容
- 数据库修改后Hibernate的配置更新
- Linux软件包组的选择
- DataInputStream与DataOutputStream类
- 无线路由器和计算机怎么连接网络连接,华为无线路由器怎么连接宽带上网
- linux war版本管理,linux(centos8):用systemctl管理war包形式的jenkins(java 14 / jenkins 2.257)...
- qt 最小化到托盘linux,Qt窗口最小化到托盘,托盘菜单控制