当前位置: 首页 > news >正文

libopenssl 实现私钥加密公钥解密

在需要验证可信来源时,需要用到签名验签。因此,需要使用私钥加密,公钥解密,取得被加密的信息。这就会使用到私钥加密,公钥解密的场景了。

参考:
https://github.com/openssl/openssl/issues/20493
https://blog.csdn.net/wq897387/article/details/114129820

使用 openssl-1.1.1 版本,3.x版本API不一样。

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "openssl/ssl.h"
#include "openssl/pem.h"
#include "openssl/rsa.h"
#include "openssl/bio.h"#define ENC_PADDING_TYPE  RSA_PKCS1_PADDINGint encrypt(uint8_t *data, int len, uint8_t *out)
{int ret = 0;uint8_t buff[8192] = {0};RSA *rsa = NULL;BIO *bio = NULL;int len1 = 0;FILE *f = fopen("private.pem", "r");if (!f) {printf("Open private.pem error\n");return -1;}len1 = fread(buff, 1, sizeof(buff), f);fclose(f);bio = BIO_new_mem_buf(buff, len1);if (!bio) {printf("BIO_new_mem_buf error\n");return -1;}rsa = PEM_read_bio_RSAPrivateKey(bio, &rsa, NULL, NULL);if (!rsa) {printf("PEM_read_bio_PrivateKey error\n");return -1;}ret = RSA_private_encrypt(len, data, out, rsa, ENC_PADDING_TYPE);if (!ret) {printf("RSA_private_encrypt error\n");RSA_free(rsa);BIO_free_all(bio);return -1;}RSA_free(rsa);BIO_free_all(bio);return 0;
}int decrypt(uint8_t *data, uint8_t *out)
{int ret = 0;uint8_t buff[8192] = {0};RSA *rsa = NULL;BIO *bio = NULL;FILE *f = fopen("public.pem", "r");if (!f) {printf("Open public.pem error\n");return -1;}fread(buff, 1, sizeof(buff), f);fclose(f);bio = BIO_new_mem_buf(buff, -1);if (!bio) {printf("BIO_new_mem_buf error\n");return -1;}rsa = PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL);if (!rsa) {printf("PEM_read_bio_RSA_PUBKEY error\n");return -1;}ret = RSA_public_decrypt(256, data, out, rsa, ENC_PADDING_TYPE);if (!ret) {printf("RSA_public_decrypt error\n");RSA_free(rsa);BIO_free_all(bio);return -1;}RSA_free(rsa);BIO_free_all(bio);return 0;
}int main(int argc, char **argv)
{const char text[8192] = "Hello world11111111111111111";uint8_t enc[8192] = {0};uint8_t dec[8192] = {0};printf("Text: %s\n", text);encrypt(text, strlen(text), enc);decrypt(enc, dec);printf("Decrypt: %s\n", dec);return 0;
}

经测试,私钥加密,公钥解密,支持的 padding 方式只有 RSA_PKCS1_PADDINGRSA_X931_PADDING 。公钥加密,私钥解密,各 padding 方式都是支持的。

运行结果:
在这里插入图片描述

http://www.lryc.cn/news/177550.html

相关文章:

  • 代码随想录 Day - 51|#309 最佳买卖股票时机含冷冻期|#714 买卖股票的最佳时机含手续费
  • .net 使用IL生成代理类实现AOP对比Java Spring Boot的AOP
  • 美容店预约小程序搭建流程
  • ppt 作图 如何生成eps格式
  • 渗透测试中的前端调试(上)
  • 跨境电商引流之Reddit营销,入门保姆级攻略
  • Linux下虚拟网卡的基本命令
  • conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败
  • BFS专题7 多终点迷宫问题
  • ES6中对象新增了哪些扩展?
  • 蓝桥杯每日一题2023.9.22
  • vscode左键无法跳转到定义的文件
  • c、c++排序的相关知识(归并排序、计数排序、稳定性等)
  • oracle定时任务的使用
  • VSCode 配置 Lua 开发环境(清晰明了)
  • JS合并2个远程pdf
  • TikTok的伦理挑战:虚拟世界与现实世界的交汇
  • C# 获取磁盘空间大小的方法
  • JVM机制理解与调优方案
  • Django的设计模式及模板层
  • 写代码生成流程图
  • python reportlab生成pdf
  • 第一次作业题解
  • 美篇作文网教学资源源码-自带作文数据
  • 电脑软件:Duplicate Cleaner Pro 5.16 重复文件清理软件(附下载)
  • 支持笔记本电脑直插直充,TOWE 65W智能快充PDU超级插座
  • 部署Kafka
  • Open3D 进阶(11)使用GMM-Tree算法对点云配准
  • 算法刷题注意事项
  • 搭建自己的pypi服务器