利用Base64加密算法将数据加密解密

1. Base64加密算法

Base64准确来说并不像是一种加密算法,而更像是一种编码标准。

我们知道现在最为流行的编码标准就是ASCLL,它用八个二进制位(一个char的大小)表示了127个字符,任何二进制序列都可以用这127个字符表示出来。

而Base64则是用6个二进制位表示了64个字符,也就是说,任何的二进制序列也都可以用这64个字符表示出来,这也是其名称的来源。

我们加密的方法,就是将原来的信息以ACSLL的标准转化为二进制序列(如果不是6的倍数,就用0补齐),然后按照Base64的标准,将其转化为该标准下的字符。

例如:

ASCLL(含换行符):

hello world
hello world
hello world

Base64:

aGVsbG8gd29ybGQKaGVsbG8gd29ybGQKaGVsbG8gd29ybGQA

如此加密之后的信息具有不可读性,广泛运用通信领域。

但是,这样加密过后的信息并不安全,只要你有心,就可以对照Basd64对照表和ASCLL码表解密出原来的内容。

对于Base64算法,我们仅做这么多介绍,感兴趣的小伙伴可以自己去深入了解一下。

2. 加密解密函数函数

2.1 加密函数Into_Base64

函数原型如下方代码所示。

在使用时,要求用户传入目标文件和原文件的文件名,函数就可以将原文件的信息加密存储到目标文件中。

void Into_Base64(const char dest[], const char src[])//加密函数//目标文件,源文件
{FILE* srcx = fopen(src, "r");if(srcx == NULL){perror("source:");return;}FILE* destx = fopen(dest, "w");if(destx == NULL){perror("destination:");return;}int flag = 1;while(flag){char secret[5] = {0};//存储加密后数据int binary[25] = {0};//6和8的最小公倍数为24char ch = 0;for(int i = 0; i < 3; i++){ch = getc(srcx);if(ch == -1){flag = 0;goto interruption;}Into_Binary(binary + i * 8, ch, 0);}interruption:for(int i = 0; i < 4; i++){Into_Char(secret + i, binary + i * 6, 1);}fprintf(destx, "%s", secret);}fclose(srcx);fclose(destx);
}

在while循环中,我们每次读取24个字节的数据,这是因为6(Base64中一个字符的二进制长度)和8(ASCLL中一个字符的二进制长度)的最小公倍数为24,便于实现两种编码之间的转换。

2.2 解密函数Out_Base64

函数原型如下方代码所示。

在使用时,要求用户传入目标文件和原文件的文件名,函数就可以将原文件的信息解密存储到目标文件中。

void Out_Base64(const char dest[], const char src[])//解密函数//目标文件,源文件
{FILE* srcx = fopen(src, "r");if(srcx == NULL){perror("source:");return;}FILE* destx = fopen(dest, "w");if(destx == NULL){perror("destination:");return;}int flag = 1;while(flag){char secret[4] = {0};//存储解密后数据//int binary[25] = {0};//6和8的最小公倍数为24char ch = 0;for(int i = 0; i < 4; i++){ch = getc(srcx);if(ch == -1){flag = 0;goto interruption;}Into_Binary(binary + i * 6, ch, 1);}interruption:for(int i = 0; i < 3; i++){Into_Char(secret + i, binary + i * 8, 0);}fprintf(destx, "%s", secret);}fclose(srcx);fclose(destx);
}

该函数与加密函数基本相同,只是在调用Into_Binary函数和Into_Char函数时的传参时有所差别,并且每24个字节解密得到的字符的仅有三个,所以secret数组的容量也相应减少了。

2.3 字符转二进制序列函数Into_Binary

函数原型如下方代码所示。

在使用时,要求用户传入存储二进制序列的数组的起始地址,要转换的字符,以及flag。

其中,flag==1时,将字符按照Base64编码转换为二进制;flag==0时,将字符按照ASCLL编码转换为二进制。

在加密函数中,flag==0;在解密函数中flag==1。

//将src转换为二进制存到dest中
//flag==1将Base64编码转换为二进制,flag==0将ascll转换为二进制
void Into_Binary(int* dest, char src, int flag)
{int n = 2;int num = 0;if(flag){num = 5;//六位,最高位下标5src = Base64_Int(src);}else{num = 7;//八位,最高位下标7}for(int i = num; i >= 0; i--){*(dest + i) = src % n;src /= 2;}
}

由于计算机是以ASCLL编码标准识别字符的,所以我们直接将其当作整形处理即可。

但是计算机并不懂得Base64的编码标准是怎样的,所以我写了一个函数,将字符按照Base64标准转换为整形。

char Base64_Int(char tem)//字符转Base64编码
{if(tem >= 'A'&&tem <= 'Z')return tem - 'A';else if(tem >= 'a'&&tem <= 'z')return tem + 26 - 'a';else if(tem >= '0'&&tem <= '9')return tem + 52 - '0';else if(tem == '+')return 62;else if(tem == '/')return 63;
}

2.4 二进制序列转字符函数

函数原型如下方代码所示。

在使用时,要求用户传入存储要转换的二进制序列的数组的起始地址,存储转换后字符的地址,以及flag。

其中,flag==1时,将二进制序列按Base64编码转换为字符;flag==0时,将二进制序列按ASCLL编码转换为字符。

在加密函数中,flag==1;在解密函数中flag==0。

//将二进制数转换为char类型
//flag==1转换为Base64,flag==0转换为ascll
void Into_Char(char* dest, int* src, int flag)
{int tem = 0;int n = 1;int num = 0;if(flag)num = 5;elsenum = 7;for(int i = num; i >= 0; i--){tem += *(src + i) * n;n *= 2;}if(flag)*dest = Base64_Char(tem);else*dest = tem;
}

与刚才同理,Base64_Char用于将整形按照Base64标准转换为字符。

char Base64_Char(int tem)//Base64编码转字符
{if(tem >= 0&&tem <= 25)return tem + 'A';else if(tem >= 26&&tem <= 51)return tem + 'a' - 26;else if(tem >= 52&&tem <= 61)return tem + '0' - 52;else if(tem == 62)return '+';else if(tem == 63)return '/';
}

3. 测试

写好之后,我们就可以写个main函数来进行一下测试啦!

int main()
{Into_Base64("test2.txt", "test1.txt");//把test1.txt加密后存到test2.txtOut_Base64("test3.txt", "test2.txt");//把test2.txt解密后存到test3.txtreturn 0;
}

注意要先创建好“test1.txt”文件,以免打开文件时失败。

运行之后得到两个文件

 

也是包成功的啊。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/283997.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 文件上传(二)

上一节讲解了如何利用MultipartFile接收浏览器端上传的文件&#xff0c;这节讲解服务器端如何将文件保存到本地目录下&#xff0c;下节讲解服务端如何将文件保存在阿里云上。 本节需要解决两个难点&#xff1a; 文件重名问题文件大小限制问题 存储文件 首先解决如何存储文件…

Matlab|基于条件风险价值CVaR的微网动态定价与调度策略

目录 1 主要内容 模型示意图 电能交易流程 模型亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序复现文章《A cooperative Stackelberg game based energy management considering price discrimination and risk assessment》&#xff0c;建立基于主从博弈的考虑…

HTML5和CSS3笔记

一&#xff1a;网页结构(html)&#xff1a; 1.1&#xff1a;页面结构&#xff1a; 1.2&#xff1a;标签类型&#xff1a; 1.2.1&#xff1a;块标签&#xff1a; 1.2.2&#xff1a;行内标签&#xff1a; 1.2.3&#xff1a;行内块标签&#xff1a; 1.2.4&#xff1a;块标签与行…

Hive 数据迁移与备份

迁移类型 同时迁移表及其数据&#xff08;使用import和export&#xff09; 迁移步骤 将表和数据从 Hive 导出到 HDFS将表和数据从 HDFS 导出到本地服务器将表和数据从本地服务器复制到目标服务器将表和数据从目标服务器上传到目标 HDFS将表和数据从目标 HDFS 上传到目标 Hiv…

rider下ef core迁移

新建数据库 create database mockstu新建web项目 安装Microsoft.EntityFrameworkCore.SqlServer包 设置连接字符串 新建model using MockStuWeb.Models.EnumTypes; using System.ComponentModel.DataAnnotations;namespace MockStuWeb.Models {/// <summary>/// 学生…

SpringCloudAlibaba Nacos配置及应用

Nacos搭建及配置 nacos本机服务搭建 windows上搭建单机nacos&#xff1a; Releases alibaba/nacos GitHub 下载安装包 下载本地&#xff0c;解压&#xff0c;直接运行&#xff08;保证安装包的绝度路径只有英文字符&#xff0c;有中文会导致运行失败&#xff09;&#xff…

PHP 读取嵌入式数据 SQLite3

SQLite3 属于轻量级开源的嵌入式关系型数据库&#xff0c;但它支持 ACID(Atomicity,Consistency,Isolation,Durability) 事务。 SQLite Download Page: https://www.sqlite.org/download.html 第一步&#xff1a;在 php.ini 中开启 extensionsqlite3 第二步&#xff1a;连接数…

阿里云OSS存储的视频如何加水印

OSS是不能进行视频添加水印的&#xff0c;可以图片添加水印。 您可以在视频点播中进行配置&#xff1a; https://help.aliyun.com/zh/vod/user-guide/video-watermarks?spma2c4g.11186623.0.i2 原来的业务代码都是使用python 对oss的 视频进行上传 的,上传的视频路径已经保存到…

竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

局域网的学习

什么是局域网&#xff1f;_哔哩哔哩_bilibili 家里接入WIFI的设备&#xff0c;相互之间就组成了一个局域网。 设备接入路由器的方法有两种&#xff1a; 一种是通过路由器发射的无线信号进行无线接入。 另一种是借助路由器上的RJ45网口进行有线接入。 设备接入路由器后&…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning

开头说点题外话&#xff1a;这篇可谓是大咖云集啊&#xff0c;刘壮、谢赛宁、何凯明这些耳熟能详的名字&#xff0c;并且这篇论文一些人也觉得分析特别到位&#xff0c;不愧是大佬视角&#xff0c;配得上“解构”两个字&#xff1b;很巧的是&#xff0c;本科阶段的团队导师也是…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展&#xff0c;能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题&#xff0c;导致企业的经济效益降低。目前&#xff0c;提高企业的生产计划管理是改善能源企业现状最有利的途…

python与excel第一节

python与excel第一节 由于excel在日常办公中大量使用&#xff0c;我们工作中常常会面对高频次或者大量数据的情况。使用python语言可以更加便捷的处理excel。 python与vba的比较 python语法更加简洁&#xff0c;相较于vba冗长复杂的语法&#xff0c;python更加容易学习。 p…

transformer的学习:Attention is all you need

目录 整体概述&#xff1a;​编辑​编辑 encoder&#xff1a; embedding&#xff1a; ​编辑 self-attention&#xff1a; 向量的相似度计算&#xff1a; qkv怎么来的​编辑 softmax&#xff1a; code multi-head-attention 位置编码&#xff1a; 残差&&FFN&…

基于树莓派实现 --- 智能家居

最效果展示 演示视频链接&#xff1a;基于树莓派实现的智能家居_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from333.999.0.0 &#xff08;PS&#xff1a;房屋模型的搭建是靠纸板箱和淘宝买的家居模型&#xff0c;户型参考了留学时短租的公寓~&a…

Prometheus+Grafana 监控Tongweb嵌入式(by lqw)

文章目录 1.思路2.部署准备3.Grafana仪表盘json文件下载4.tw嵌入式jar包本地引入依赖并测试运行5.运行jmx_prometheus_javaagent-0.19.0.jar形式获取监控数据&#xff08;方法一&#xff09;6.使用Actuator 获取监听数据&#xff08;方法二&#xff09;7.Prometheus部署8.Prome…

初级爬虫实战——哥伦比亚大学新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

目录 一、前置说明 二、Gradle 启动&#xff01; 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢&#xff1f;&#xff08;万能解决办法&#xff09; 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件&#xff08;settings.gradle…

二.寄存器

1. 2. 例如&#xff1a;h即为high&#xff08;高位&#xff09;&#xff0c;l即为low&#xff08;低位&#xff09; 3.一个字是两个字节 4.在写一条汇编指令或一个寄存器的名称时不区分大小写。 5.al&#xff0c;ah&#xff0c;ax在接受汇编指令时&#xff0c;并不相等&…