openssl的RSA加密(base64编码)

2023-10-26

openssl的RSA加密(base64编码)

同AES加密,开头先给出openssl实现base64编码代码
【 base64编码/解码 】

/*************************************************
  Function:    		base64Encode
  Description:		base64 编码
  Input:
  	1.input			需编码的数据字符串
  	2.length		实际长度(不可使用strlen求取,字符串中可能含有结束符等)
  	3.newLine
  Output:			
  Return:			转化后的字符串指针
  Others:			
*************************************************/
char * base64Encode(const char *buffer, int length, bool newLine)
{
    BIO *bmem = NULL;
    BIO *b64 = NULL;
    BUF_MEM *bptr;

    b64 = BIO_new(BIO_f_base64());
    if (!newLine) {
        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    }
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, buffer, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);
    BIO_set_close(b64, BIO_NOCLOSE);

    char *buff = (char *)malloc(bptr->length + 1);
    memcpy(buff, bptr->data, bptr->length);
    buff[bptr->length] = 0;
    BIO_free_all(b64);

    return buff;
}

/*************************************************
  Function:    		base64Decode
  Description:		base64 解码
  Input:
  	1.input			需解码的数据字符串
  	2.length		实际长度(不可使用strlen求取,字符串中可能含有结束符等)
  	3.newLine
  Output:			
  Return:			转化后的字符串指针
  Others:			
*************************************************/
char * base64Decode(char *input, int length, bool newLine)
{
    BIO *b64 = NULL;
    BIO *bmem = NULL;
    char *buffer = (char *)malloc(length);
    memset(buffer, 0, length);
    b64 = BIO_new(BIO_f_base64());
    if (!newLine) {
        BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    }
    bmem = BIO_new_mem_buf(input, length);
    bmem = BIO_push(b64, bmem);
    BIO_read(bmem, buffer, length);
    BIO_free_all(bmem);

    return buffer;
}

【 RSA加密/解密 】

#include "openssl/rsa.h"
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>  
#include <openssl/bio.h>  
#include <openssl/buffer.h>    

/*************************************************
  Function:    		rsa_encrypt
  Description:		RSA加密
  Input:
  	1.str			需加密的数据字符串
  	2.path_key		公钥存储文件路径
  Output:			
  Return:			转化后的字符串指针
  Others:			
*************************************************/
char *rsa_encrypt(char *str,char *path_key){
    char *p_en;
    RSA *p_rsa;
    FILE *file;
    int flen,rsa_len;
	int in_len, gb_str_len;
    if((file=fopen(path_key,"r"))==NULL){
        perror("open key file error");
        return NULL;    
    }   
    if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
    //if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){   
        ERR_print_errors_fp(stdout);
        return NULL;
    }   
    flen=strlen(str);
    rsa_len=RSA_size(p_rsa);
    p_en=(unsigned char *)malloc(rsa_len+1);
    memset(p_en,0,rsa_len+1);

	in_len = strlen(str);
	
    if(RSA_public_encrypt(in_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_PKCS1_PADDING)<0){
		printf("RSA_public_encrypt error! \n");
        return NULL;
    }
    RSA_free(p_rsa);
    fclose(file);
    return p_en;
}


/*************************************************
  Function:    		rsa_decrypt
  Description:		RSA解密
  Input:
  	1.str			需解密的数据字符串
  	2.path_key		私钥存储文件路径
  Output:			
  Return:			转化后的字符串指针
  Others:			
*************************************************/
char *rsa_decrypt(char *str,char *path_key){
    char *p_de;
    RSA *p_rsa;
    FILE *file;
    int rsa_len;
	int in_len, gb_str_len;
    if((file=fopen(path_key,"r"))==NULL){
        perror("open key file error");
        return NULL;
    }
    if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
        ERR_print_errors_fp(stdout);
        return NULL;
    }
    rsa_len=RSA_size(p_rsa);
    p_de=(unsigned char *)malloc(rsa_len+1);
    memset(p_de,0,rsa_len+1);

	in_len = strlen(str);
	
    if(RSA_private_decrypt(in_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_PKCS1_PADDING)<0){
		printf("RSA_private_decrypt error! \n");
        return NULL;
    }
    RSA_free(p_rsa);
    fclose(file);
    return p_de;
}

【 实际调用 】

#define PUBKEY_PATH				"./rsa_public_key.pem"		
#define PRIKEY_PATH				"./rsa_private_key.pem"	
void main()
{
	int num = 0;
	bool newLine = false;
	char *source = "laodainiubi123456789";
	char *ptr_en, *ptr_de;
	char *decode_base64;
	printf("source is: %s\n", source);
	ptr_en = rsa_encrypt(source, PUBKEY_PATH);
	printf("after rsa_encrypt: %s\n", ptr_en);

	// daisy 实际长度(不可使用strlen求取,字符串中可能含有结束符等)
	// 简单粗暴的方法。判断从当前指针指向的字符开始,往后3位均为空,则判定当前到达字符串末尾
	while(!((*(ptr_en + num) == NULL) && (*(ptr_en + num + 1) == NULL) \
		&& (*(ptr_en + num + 2) == NULL) && (*(ptr_en + num + 3) == NULL)))
	{
		num++;
	}
	printf("num = %d \n", num);

	char * encode = base64Encode(ptr_en, num, newLine);
	printf("after base64Encode:%s\n", encode);
	
	char * decode = base64Decode(encode, strlen(encode), newLine);
	printf("after base64Decode:%s\n", decode);
	
	decode_base64 = rsa_decrypt(decode, PRIKEY_PATH);
	printf("after rsa_decrypt:%s\n", decode_base64);
	
	if(ptr_en!=NULL)
	{
		free(ptr_en);
	}
	
	if(ptr_de!=NULL)
	{
		free(ptr_de);
	}	
}

其他

【 使用openssl解析公钥私钥指数模数 】
公私钥解析出的指数模数相同,则为一对公私钥
openssl rsa -pubin -inform PEM -text < rsa_public_key.pem (rsa_public_key.pem 为公钥文件名)
使用openssl解析公钥指数模数

openssl rsa -inform PEM -text < rsa_private_key.pem
(rsa_private_key.pem 为公钥文件名)
使用openssl解析私钥指数模数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openssl的RSA加密(base64编码) 的相关文章

随机推荐

  • 网络编程13——epoll事件模型:ET和LT模、掌握实现epoll的ET模式(非阻塞模式

    epoll是linux下多路复用IO select poll 的增强版本 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 因为它会复用文件描述符集合来传递结果为不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文
  • shiro认证机制及认证原理

    转自 shiro认证机制 认证原理 下文笔者将讲述shiro的认证机制及认证原理 如下所示 Shiro认证 验证用户身份的过程 在认证过程中 用户需要提交实体信息 Principals 和凭据信息 Credentials 以检验用户是否合法
  • 【玩转PointPillars】Ubuntu18.04上部署nutonomy/second.pytorch

    系统环境 Ubuntu18 04 cuda10 2 GeForce GTX 1650 今天部署的项目虽然名称上叫做second pytorch 实际上是PointPillars的作者fork自SECOND项目 并作了改动之后形成的Point
  • 词法分析器构造工具Flex基础学习

    Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Pattern 模式一般用正规表达式进行精确描述 FLEX通过读取一个有规定格式的文本
  • SVN 服务器发送了意外的返回值(405 Method Not Allowed),在响应 “MKCOL” 的请求

    先转载一段网上说的解决方法 svn 405 Method Not Allowed 在响应 MKCOL 的请求 I managed to solve the problem Delete the parent s directory of t
  • jupyter lab的目录调整及默认浏览器设置为chrome

    Jupyter lab 的目录调整及默认浏览器设置为chrome 1 Jupyter 默认目录调整 首先要找到jupyter生成的配置文件 jupyter notebook config py 如果没有 在 anaconda prompt
  • 在Anaconda中快速安装OpenCV for Python

    一 下载和安装Anaconda Anaconda下载地址 Anaconda Individual EditionAnaconda s open source Individual Edition is the easiest way to
  • 【吐血整理】java程序员推荐轻薄笔记本

    正文 在写这个文章之前 我花了点时间 自己臆想了一个电商系统 基本上算是麻雀虽小五脏俱全 我今天就用它开刀 一步步剖析 我会讲一下我们可能会接触的技术栈可能不全 但是够用 最后给个学习路线 Tip 请多欣赏一会 每个点看一下 看看什么地方是
  • kali Linux自带firefox ESR设置代理

    1 打开kali的火狐浏览器 找到右上角的 三个杠 在点击 preferences 2 general gt network proxy gt setting 3 打开靶场和burp suite工具 注意火狐浏览器的代理是启动状态 靶场地址
  • 双写绕过的原理

    可以看到代码对key进行了过滤 那怎么办呢 可以构造kekeyy 当key被过滤掉时 剩下的字符自动拼接在一起 就形成了key 所以说 这样就可以拿下flag了
  • 梯度下降(学习笔记)

    应用 梯度下降法 Gradient Descent 又称最速下降法 是迭代法的一种 可用于求解机器学习算法的模型参数 即无约束优化问题 具体来讲可用来求解损失函数的最小值 也可求解最小二乘问题 分类 批量梯度下降 BGD 使用全部样本构建了
  • 职场大佬常用工具:Baklib,一款个人知识笔记管理神器

    又到了大家喜爱的好用工具推荐环节 今天我要给大家推荐一款个人知识笔记管理神器 不出你们所料 它就是Baklib 言归正传那Baklib究竟能干啥呢 引用官网的一句话来说 Baklib工具可以将大家日常工作学习中 存储到电脑 云盘上的文档 知
  • 06makefile学习之三个自动变量($@,$^,$<),模式规则和静态模式规则

    06makefile学习之三个自动变量 lt 和模式规则 以下为相关makefile的学习文章 01makefile学习之GCC编译的四个阶段 带编译阶段 汇编阶段 S c的区别 02makefile学习之makefile的基本原则 03m
  • Oracle存储过程处理大批量数据性能测试

    通过此次的大批量数据性能测试 还会间接的给大家分享一个知识点 Oracle存储过程如何处理List集合的问题 废话不多说了 老规矩直接上代码 首先要做的 想必大家应该猜到了 建表 create table tab 1 id varchar
  • linux内核中打印栈回溯信息 - dump_stack()函数分析

    简介 当内核出现比较严重的错误时 例如发生Oops错误或者内核认为系统运行状态异常 内核就会打印出当前进程的栈回溯信息 其中包含当前执行代码的位置以及相邻的指令 产生错误的原因 关键寄存器的值以及函数调用关系等信息 这些信息对于调试内核错误
  • 使用matlab修改单张或多张图像大小

    使用matlab修改单张或多张图像大小 版权声明 本文为CSDN博主 berlinpand 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net berlin
  • 黑马程序员 《ios零基础教程》--全局和局部变量、结构体、枚举 2014-4-2总结

    a href http edu csdn net target self ASP Net Unity开发 a a href http edu csdn net target self Net培训 a 期待与您交流 前几天出差有事儿没学习 今
  • ChatGPT-4.5:AI技术的最新进展

    文章目录 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专栏地址 AI大模型 OpenAI最新发布的GPT 4 在聊天机器人的功能上取得了显著的改进 虽然GPT 4仍处于早期阶段 但有传言
  • 在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务

    1 前言 此前rtsp转webRTC的本地服务运行的不错 但是使用的某个免费stun服务突然被关停了 造成一些rtspToWebRTC的服务受到影响 因此 目前打算在我闲置的阿里云服务器上搭建stun turn服务 我的域名xiaoyaoy
  • openssl的RSA加密(base64编码)

    openssl的RSA加密 base64编码 同AES加密 开头先给出openssl实现base64编码代码 base64编码 解码 Function base64Encode Description base64 编码 Input 1 i