base64原理与实现

article/2025/9/13 6:17:58

1. base64

  bse64是一种以64个可见字符集对二进制数据进行编码的编码算法。


1.1 应用范围

  base64常用于网络数据传输过程的编解码环节。HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到 [引用百度百科]

  • 电子邮件加密;
  • 数据加密;
  • 采用base64来规避反垃圾邮件工具,因为那些工具通常都不会翻译base64的讯息;
  • 图片、文件网络传输;
  • Json存储二进制数据。

1.2 编码表

  bse64编码表是64个可见字符集。
在这里插入图片描述

1.3 编码过程

  base64编码,每3个8位明文数据为一组,取这3个字数据的ASCII码,然后以6位为一组组成4个新的数据。对于不足3字节的处理:
【1】不足三字节后面填充0;
【2】对于编码前的数据产生的6位,如果为0,则索引到的字符为‘A’;因不足3字节而填充的0,用’=’来替代,有点结束符的意思。


  例如对“ABCD”进行base64编码:
在这里插入图片描述
  对于不足6位的补零(图中浅红色的4位),索引为“A”;对于最后不足3字节,进行补零处理(图中红色部分),以“=”替代,因此,“ABCD”的base64编码为:“QUJDRA==”。


1.4 解码过程

  base64解码,即是base64编码的逆过程,如果理解了编过过程,解码过程也就容易理解。将base64编码数据根据编码表分别索引到编码值,然后每4个编码值一组组成一个24位的数据流,解码为3个字符。对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进行转换。

解码过程可以参考上图,逆向理解:“QUJDRA==” ——>“ABCD”


2. 实现

  base64应用范围很广,因此很多编程语言的标准库都提供base64编解码库,如PHP、Python等,一般不需重复造轮子,但能够重复造一遍轮子,会理解更透彻。


2.1 C语言版

#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>  
#include <string.h>  
#include <stdio.h>const char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /* base64编码表 */ static int num_strchr(const char *str, char c) 
{const char *p = strchr(str, c);if (NULL == p){return -1;}return p - str;
}uint32_t base64_get_dest_len(uint32_t src_len)
{return 4 * ((src_len+2)/3);  
}uint32_t src_get_dest_len(uint32_t base64_len)
{return base64_len/4*3 - 2;  
}int base64_encode(const char *src_str, uint32_t src_len, char *dest_str, uint32_t dest_len)  
{  uint32_t i = 0;uint32_t len = 0;   len = base64_get_dest_len(src_len);if (dest_len < len){/* 空间不足 */return -1;}for (i=0; i<src_len/3; i++)  {  *dest_str++ = base64_table[(src_str[0]>>2) & 0x3f]; /* 取第一字符前6bit */  *dest_str++ = base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)]; /* 第一字符的后2bit与第二字符的前4位进行合并 */  *dest_str++ = base64_table[((src_str[1]<<2) & 0x3c) | ((src_str[2]>>6) & 0x03)]; /* 将第二字符的后4bit与第三字符的前2bit组合并 */ *dest_str++ = base64_table[src_str[2] & 0x3f]; /* 取第三字符的后6bit */  src_str += 3;}  /* 非3的整数倍补“=” */if (1 == (src_len%3)){*dest_str++ = base64_table[(src_str[0]>>2) & 0x3f];  *dest_str++ = base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)]; *dest_str++ = '=';  *dest_str++ = '=';  }else if (2 == (src_len%3))   {      *dest_str++ = base64_table[(src_str[0]>>2) & 0x3f];  *dest_str++ = base64_table[((src_str[0]<<4) & 0x30) | ((src_str[1]>>4) & 0x0f)]; *dest_str++ = base64_table[(src_str[1]<<2) & 0x3c];*dest_str++ = '=';    }  *dest_str = '\0';  return 0;  
}int base64_decode(const char *src_str, uint32_t src_len, char *dest_str, uint32_t dest_len)
{uint32_t i = 0;char buf[4] = {0};if (dest_len < src_get_dest_len(src_len)){return -1;}for (; (src_str[i]!='\0') && (i<src_len); i+=4){/* 四个码译成三个字符 */buf[0] = num_strchr(base64_table, src_str[i]);buf[1] = num_strchr(base64_table, src_str[i+1]);*dest_str++ = ((buf[0] << 2) & 0xfc) | ((buf[1]>>4) & 0x03);if (src_str[i+2] == '='){break;}buf[2] = num_strchr(base64_table, src_str[i + 2]);*dest_str++ = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f);if (src_str[i + 3] == '='){break;}buf[3] = num_strchr(base64_table, src_str[i + 3]);*dest_str++ = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f);}*dest_str = '\0';return 0;
}int main(int argc,char **argv)  
{  char *buf = NULL;uint32_t dest_len = 0;uint32_t src_len = 0;if (argc < 3){return -1;}if (strcmp(argv[1],"decode") == 0) { src_len = strlen(argv[2]);dest_len = src_get_dest_len(src_len);buf = (char*)malloc(dest_len);if (NULL == buf){return -1;}base64_decode(argv[2], src_len, buf, dest_len);printf("base64 str:%s\n",argv[2]);   printf("base64_decode str:%s\n",buf);}else if(strcmp(argv[1],"encode") == 0) {src_len = strlen(argv[2]);dest_len = base64_get_dest_len(src_len);buf = (char*)malloc(dest_len);if (NULL == buf){return -1;}base64_encode(argv[2], src_len, buf, dest_len);printf("src str:%s\n",argv[2]);   printf("base64_encode str:%s\n",buf);   }free(buf);buf = NULL;return 0;  
}

  编译测试:
在这里插入图片描述

  可用base64编码工具验证:http://tool.oschina.net/encrypt?type=3
在这里插入图片描述


http://chatgpt.dhexx.cn/article/AB34bD5X.shtml

相关文章

Base64编码的原理及实现(源码)

Base64编码在邮件中最为常见&#xff0c;呵呵&#xff0c;因为我最近就是在做邮箱报警&#xff0c;SMTP验证就是Base64编码用户名和密码进行验证的&#xff0c;并且附件也是要转换成base64编码的数据&#xff0c;然后再发送的。该编码使用64个明文来编码任意的二进制文件&#…

详述图片base64加密的原理,告诉你什么是“/9j/“

欢迎大家搜索“小猴子的技术笔记”关注我的公众号&#xff0c;有问题可以及时和我交流。 在日常的生活中&#xff0c;我们肯定都经历过类似这样的场景&#xff1a;报名考试上传图片&#xff0c;网站要求的是上传的照片不能大于多少&#xff0c;而且要求是“.jpg”的格式。 于是…

base64编码原理之python应用

base64产生原因&#xff1f; 先看ascii码的图片 scii码的128&#xff5e;255之间的值是不可见字符。而在网络上交换数据时&#xff0c;比如说从A地传到B地&#xff0c;往往要经过多个路由设备&#xff0c;由于不同的设备对字符的处理方式有一些不同&#xff0c;这样那些不可见…

一文搞懂Base64编码原理

Base64是最常见的用于传输8Bit字节码的编码方式之一&#xff0c;它是一种基于64个可打印字符来表示二进制数据的方法。 Base64是什么 Base64编码&#xff0c;是由64个字符组成编码集&#xff1a;26个大写字母AZ&#xff0c;26个小写字母az&#xff0c;10个数字0~9&#xff0c…

Base64编码解码原理

本篇文章主要是从Base64的原理入手&#xff0c;并给出java的Base64实现。方便了解、学习Base64。 base64的简介----摘自于百度百科 一、Base64大致用途 很早之前&#xff0c;电子邮件刚刚问世&#xff0c;那时候消息的传递都是英文&#xff0c;后来中国开通了互联网之后&#…

Java—Base64编码原理

Base64作为java编程中常见的编码方式&#xff0c;经常在各种加密&#xff08;例如AES、RSA等等&#xff09;的过程中用来实现加解密中间产物可读性的重要工具&#xff0c;很值得我们去了解一下它的原理。Base64是网络上最常见的用于传输8Bit字节码的编码方式之一&#xff0c;Ba…

一文轻松明白 Base64 编码原理

把图片丢进浏览器&#xff0c;打开sources能看到一长串字符串&#xff0c;这是图片的Base64编码。这一长串编码到底是怎么生成的呢&#xff1f; 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编码要求把3个8位的字节&#xff08;3824&#xff09;转化为4个6…

base64编码原理及代码实现

在ctf里reverse经常会有base64相关的题型&#xff0c;每次写到这类题型只能凭经验猜测考点来解题&#xff0c;特此出一个base64相关的博客&#xff0c;加深对base64的理解&#xff0c;下次再看到伪代码也不会觉得慌了&#xff0c;毕竟纵使实现形式不同&#xff0c;代码的核心逻…

Base64编码的原理与常用实现

这篇主要是为了后面好介绍加密算法&#xff0c;做的铺垫。 这个是基础&#xff0c;什么是一个程序员的涵养&#xff0c;这些基础就是涵养。 平时可能用不到&#xff0c;但必须得会。 如果连这个原理都说不上来&#xff0c;就别玩王者荣耀绝地求生英雄联盟和平精英了&#xff0c…

Base64原理及魔改更换码表

一&#xff0c;Base64是什么&#xff08;原理比较难理解&#xff0c;可参考下面的实践 &#xff09; Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64&#xff0c;所以每6个比特为一个单元&#xff0c;对应某个可打印字符。三个字节有24个比特…

base64加密原理解析

开发者对Base64编码肯定很熟悉&#xff0c;是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了&#xff0c;如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容&#xff0c;花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编…

Base64加密原理

Base64加密方式是将三个八位的字节转化为四个六位的字节&#xff08;不足八位的高位补00&#xff09;&#xff0c;3*8 4*6&#xff1b;&#xff0c;所以base64加密过后的内容比原来的大三分之一&#xff1b; 举例&#xff1a;加密“ace”&#xff0c; ace转化为二进制为&…

Base64编码原理分析

文章目录 一、认识&#xff08;一&#xff09;认识&#xff08;二&#xff09;计算&#xff08;1&#xff09;规则&#xff08;2&#xff09;示例&#xff08;3&#xff09;Base64编码转换表 二、网页图片转base64编码分析&#xff08;一&#xff09;Data URI&#xff08;二&am…

base64编码,原理是什么,有什么作用?

base64到底是什么东西呢&#xff1f; Base64编码是网络上常见的用于传输8bit字节数据的一种编码方式之一 , 有些人和书本会将编码写成加密算法&#xff0c;这其实是欠妥的。因为任何人拿到编码后的数据都能转化成原始数据&#xff0c;算法是透明的&#xff0c;也不存在秘钥的概…

一篇文章彻底掌握Base64编码原理

一篇文章彻底掌握Base64编码原理 在互联网中的每一刻&#xff0c;你可能都在享受着Base64带来的便捷&#xff0c;但对于Base64的基础原理又了解多少&#xff1f;今天这篇博文带领大家了解一下Base64的底层实现。 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代…

Base64编码解码原理详解

Base64编码解码原理详解 1. Base64字符的组成部分 Base64所用字符&#xff1a; 0,1,2 ….9 A,B,C,D…Z a,b,c,d…z / 对应ASCII&#xff1a; 48,49…58,65,66…90,97,98…122, 43,47 2. 10个数字&#xff0c;26个大写字母&#xff0c;26个小写字母&#xff0c;1个&#xff0c…

彻底弄懂base64的编码与解码原理

作者介绍 背景 base64的编码原理网上讲解较多&#xff0c;但解码原理讲解较少&#xff0c;并且没有对其中的内部实现原理进行剖析。想要彻底了解base64的编码与解码原理&#xff0c;请耐心看完此文&#xff0c;你一定会有所收获。 涉及算法与逻辑运算概念 在探究base64编码原理…

深入理解 Base64 底层原理

Base64 是一种常见数据编码方式&#xff0c;常用于数据传输。对于移动开发者来讲&#xff0c;网络请求中会经常使用到。对 JSON 熟悉的同学都知道&#xff0c;JSON 的序列化工具都不支持将 byte 数组直接放入 JSON 数据中&#xff0c;针对这种二进制数据&#xff0c;在处理的时…

Base64基本原理

1.什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的编码方式&#xff0c;是从二进制数据到字符的过程。 原则上&#xff0c;计算机中所有内容都是二进制形式存储的&#xff0c;所以所有内容&#xff08;包括文本、影音、图片等&#xff09;都可以用base64来表示…

一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻&#xff0c;你可能都在享受着Base64带来的便捷&#xff0c;但对于Base64的基础原理又了解多少&#xff1f;今天这篇博文带领大家了解一下Base64的底层实现。 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时&…