`
yiyeqinghuasoon
  • 浏览: 643433 次
文章分类
社区版块
存档分类
最新评论

Base64编解码算法详解(附C/C++源码)

 
阅读更多

Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉。

对于黑客来说,Base64与MD5算法有着同样的位置,因为电子邮箱(e-mail)正文就是base64编码的。

那么,我们就一起来深入的探讨一下这个东东吧。

对于一种算法,与其问“它是什么?”,不如问“它实现了什么?”

Base64实现了:将任意字节转为可读字符的编码。

我们知道,除了页面上的文本,计算机中的数据还有很多是不可见的。那么我们再扯一扯编码的问题吧。

通俗的说,编码就是给某个文字符号边上一个数字序号,计算机在现实这个文字符号(字符)的时候,根据这个序号到字库中查找对应的点阵或矢量数据,

在显示器上“画”出来。(关于点阵和矢量我们就不扯了,不然就真的太远了。)

起初的字符编码,没有把汉字、日文、朝鲜文和其他文字包括在内,只有26个英文字母的大小写和10个阿拉伯数字。加上一些控制字符和空格,用一个字节

就能够完全的编码了。(不要告诉我你不知道2的7次方和2的8次方是多少,一个技术人员为这样的问题困扰简直是一种耻辱。)

然而,世界上除了文字还有数据,比如图片、压缩文件、程序等等都是二进制文件,这些文件一样以字节为单位存储数据,这些字节往往不仅仅是2的7次方以内

的可显示的文字字符编码,还有可能是大于127(有符号数小于0)的字节,这些字节没办法用字符显示出来,Base64就是通过某种算法将他们显示出来。

*那么,Base64加密是安全的吗?

没有绝对安全的加密,Base64不是为了安全,而是为了显示。而且Base64是可逆的,也就是说,通过简单的解密就能得到原文。其实即便是不可逆的MD5算法,

也可以通过明文数据库找出可能的原文(睡到知道e10adc3949ba59abbe56e057f20f883e的原文就是123456)。

*那么,Base64是怎么实现的呢?

其实很简单,不过为了URL等特殊用处,Base64选择了以下64个字符作为密文显示,着64个字符都是可显示的,他们是:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

如果密文有不属于他们的字符,那么不是Base64编码或者是山寨版的。

一眼看去就知道是26个字母大小写和数字,加上“+”“/”两个符号,“?*-”由于正则表达式的问题,没有选用,而空格和回车这些是不能显示的。

Base64处理的过程是,以3个字节为一组(3个字节就是24位嘛),每6位扩展成8位得到4个字节(就是32位):

11111111 11111111 11111111 -> 111111 111111 111111 111111 -> 00111111 00111111 00111111 00111111

那么,得到的每一个字节,最大也就是2的6次方。也许你说:哇,小于2的7次方,可以显示了。

其实不是,得到的这2的6次方式上面那一串字符的索引,也就是说每个字节的值只是代表它在密文表中的位置,比如

字符“a”的编码是97, 用16进制表示是0x61(VB表示为&H61),二进制:01100001,因为不足3位,补0得到 00011000 00010000 000……

前两个字节是十进制的24 和 16,那么对应那一串字符中的第24个字符和第16个字符为:YQ(索引从0开始算),那么单独“a”的Base64编码为

YQ==(不足3为的每个字符直接转为“=”),简单吧!

有了算法,解码的过程就各位聪明特达的程序员取思考思考吧,最后C/C++版的编码解码代码贴上!


编译为控制台应用程序,运行如图:

Base64编解码源码运行效果

分享到:
评论

相关推荐

    C/C++编写的base64编解码源码

    使用C语言编写的base64加解密,可以在VC上使用

    base64编解码(C++)

    自己用C++写的base64编解码程序,含测试程序

    base64编码和解码c++代码

    base64编码和解码c++代码,从live555源码中移植并修改过来的

    一个C++Base64编解码库(源码)

    Base64编解码库(源码)--C++,一个老外写的。

    C++ BASE64 编解码

    C++ STL编写的BASE64编解码源码 代码简洁易读 非常好用

    base64编解码--c++源码

    支持中英文解码,比较适合在邮件的pop3中使用

    基于MFC的Base64编码解码(C++)

    亲测有效. 可查看在线转换网站"http://web.chacuo.net/charsetbase64"进行比较.

    C/C++ base91算法实现

    base91是base家族中的编码一员,本程序提供使用c++编写实现base91的编码和解码的源码,源码里面包含base91的原理和部分注释 本程序仅供base91的学习,如有问题请留言

    base64解码编码优化算法及实现

    base编码解码实现算法及实现源码优化算法应用于网络

    易语言-BASE64编码解码_ASM(高性能汇编版)

    2) 修复 BASE64编码解码,个别情况下不会选择AVX2模式的问题(C/C++的bool类型是单字节,易的逻辑型是4字节,易的逻辑型为真时 转为字节集可能是{0,0,1,0},导致单字节判断 时灵时不灵)。 1.4更新(2019.6.5) 1) 添加 ...

    自用编解码工具...

    的工具,支持 rc4,base64,crc32,md5,sha1编解码. 源码已上传 codetool

    pop3 client --c++源码

    pop3 client源码,附demo,配合base64-utf-8解码,能够很好的支持中文

    基于C、C++和ffmpeg编写的trt_yolov8推理模块源码+使用说明(拉流解码输入、支持cuda硬件解码).zip

    基于C、C++和ffmpeg编写的trt_yolov8推理模块源码+使用说明(拉流解码输入、支持cuda硬件解码).zip 先创建一个trt_infer实例 ~~~c++ std::string model_path = "/root/trt_projects/infer-main/workspace/yolov8n....

    acl C++跨平台库.rar

    此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、disque、memcache、beanstalk、handler socket),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。 ### 2、acl 库...

    myCodeLib:代码库

    Base64编码解码(/Src/Tools/) 文本相似性算法Jaccard(/Src/textDiff) 58同城的页面分析(/Src/textDiff) 基于用户的推荐算法(/Src/Reco) 2000W开房数据分析(/Src/KF) 一般的每个代码库描述都在上可以找到。

    vc++ 开发实例源码包

    超级下载 不过不是c++源码 1:综合FTP下载和HTTP(网络蚂蚁)(多线程). 2:FTP下载支持多个站点同时下载一个文件(同时支持断点续传). 3:可以在不下载ZIP.RAR.ISO文件的情况下查看文件里面的目录文件. 4:支持多语言. 5:...

    vc++ 应用源码包_3

    超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发...

    C++跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架源码

    跨平台网络通信与服务器开发框架;...支持线程池、协程、进程池、非阻塞、触发器等多种服务器编程模型;支持 XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等常见格式编解码;还有其它更多有价值的功能

    vc++ 应用源码包_6

    超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发...

    vc++ 应用源码包_1

    超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发...

Global site tag (gtag.js) - Google Analytics