IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Base64编码和解码(手写和调包) -> 正文阅读

[网络协议]Base64编码和解码(手写和调包)

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

0x01. 什么是base64?

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

0x02. base64如何玩转?

Base64编码要求把3个8位字节( 3 ? 8 = 24 3*8 =24 3?8=24)转化为4个6位的字节( 4 ? 6 = 24 4*6=24 4?6=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, digits


def 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 res
    elif 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, digits


def 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 base64


if __name__ == '__main__':
    string = 'Man'.encode()
    str_encode = base64.b64encode(string)
    # 编码得到TWFu
    print(str_encode)
    
    str_decode = base64.b64decode(str_encode)
    # 解码得到Man
    print(str_decode)

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

0x06. 总结

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

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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:35:21  更:2022-03-17 22:35:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:22:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码