Base64编码和解码(手写和调包)

2023-12-13 01:38

本文主要是介绍Base64编码和解码(手写和调包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做了很久的CTF,一直使用在线工具去解析base64,从没想过这些编码的原理,终于有心思研究一下。

0x01. 什么是base64?

Base64是一种用64个字符来表示任意二进制数据的方法。它是一种编码方式,并不是加密方式。它通过将二进制数据转变为64个“可打印字符”,完成了数据在HTTP协议上的传输。

0x02. base64如何玩转?

Base64编码要求把3个8位字节( 3 8 = 24 3*8 =24 38=24)转化为4个6位的字节( 4 6 = 24 4*6=24 46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用‘=’,因此编码后输出的文本末尾可能会出现1或2个‘=’。

0x02_1. base64编码表

为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为 2 6 = 64 2^6=64 26=64,这也是Base64名称的由来。编码表如下:

在这里插入图片描述
引用一个作图优秀的博客:https://www.cnblogs.com/xq1314/p/7909521.html

0x02_2. 图例分析

假设我们有三个字母Man,进行base64编码,过程如图:

3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式。

在这里插入图片描述
但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示:

在这里插入图片描述

0x03. base64编码脚本

import math
from string import ascii_uppercase, ascii_lowercase, digitsdef base64_encode(s):base = ascii_uppercase + ascii_lowercase + digits + '+/'bits = [bin(ord(x))[2:].rjust(8, '0') for x in s]bits_concat = ''.join(bits)rounds = math.ceil(len(bits_concat) / 6)bits_concat_cut = [bits_concat[6 * round: 6 * (round + 1)] for round in range(rounds)]result = [base[int(x.ljust(6, '0'), 2)] for x in bits_concat_cut]res = ''.join(result)if len(result) % 4 == 0:return reselif len(result) % 4 == 2:return res + '=='else:return res + '='if __name__ == '__main__':print(base64_encode('Man'))print(base64_encode('Ma'))print(base64_encode('M'))

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

0x04. base64解码脚本

import math
from string import ascii_uppercase, ascii_lowercase, digitsdef base64_decode(s):base = ascii_uppercase + ascii_lowercase + digits + '+/'if '==' in s: # 如果是填充两个==s = s[0: -2]elif '=' in s: # 如果是填充一个==s = s[0: -1]# 找到对应的密码表进制,填充为6位一组bin_data = [bin(base.find(x))[2:].rjust(6, '0') for x in s]bin_data_concat = ''.join(bin_data)# 将拼接字符以8位长度作为分隔还原cut = [bin_data_concat[idx: idx + 8] for idx in range(0, len(bin_data_concat), 8)]# 当字符长度为8位直接还原,不足长度说明是填充的无需操作rt = [chr(int(x, 2)) if len(x) == 8 else '' for x in cut]return ''.join(rt)if __name__ == '__main__':print(base64_decode('TWFu'))print(base64_decode('TWE='))print(base64_decode('TQ=='))

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

0x05. 使用python3.5自带的函数进行编码

import base64if __name__ == '__main__':string = 'Man'.encode()str_encode = base64.b64encode(string)# 编码得到TWFuprint(str_encode)str_decode = base64.b64decode(str_encode)# 解码得到Manprint(str_decode)

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

0x06. 总结

  • 在网络传输中,不是所的的内容都是可打印字符,其中绝大多数数据是不可见字符,base64可以基于64个可打印字符来表示这些带有不可打印字符的传输数据。
  • base64一般不作为安全加密算法的,因为过程可逆。

幸地识请桃花面,从此阡陌多暖春。 最后放个美图放松一下眼睛:
在这里插入图片描述

这篇关于Base64编码和解码(手写和调包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return