CTF-RE 从0到N: 理解base64算法

embedded/2024/10/25 17:58:49/

Base64是一种常用的编码方式,用于将二进制数据转换为文本格式。它常用于在需要通过文本传输二进制数据的场景中,例如在电子邮件和URL中传递二进制文件。Base64的核心原理如下:

原理

  1. 输入数据分组

    • 将输入的二进制数据按字节分成每组3字节(24位)。
  2. 转换为6位块

    • 将每3字节(24位)的数据块分成4个6位块。这样,每个6位块可以表示一个范围在0到63之间的整数。
  3. 映射到Base64字符集

    • 使用Base64字符表将每个6位块映射到一个Base64字符。Base64字符集包含64个字符,包括大写字母A-Z,小写字母a-z,数字0-9,以及两个特殊字符“+”和“/”。
  4. 处理不足3字节的数据

    • 如果最后一组数据不足3字节,则用0字节填充,以保证数据长度是3的倍数。编码后,用一个或两个等号(=)填充,以表明原始数据的长度。

Base64字符表

Base64字符表如下:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

示例

假设我们要编码字符串"Man"。

  1. 输入数据

    • 字符串"Man"的ASCII码是:
      M: 77 (01001101)
      a: 97 (01100001)
      n: 110 (01101110)
      
    • 合并成二进制数据:
      01001101 01100001 01101110
      
  2. 分成6位块

    • 划分后得到:
      010011 010110 000101 101110
      
  3. 转换为十进制

    • 每个6位块对应的整数是:
      19 22 5 46
      
  4. 映射到Base64字符集

    • 使用Base64字符表对应的字符是:
      T W F u
      

因此,字符串"Man"被Base64编码后就是"TWFu"。

处理不足3字节的数据

假设我们要编码字符串"Ma"。

  1. 输入数据

    • 字符串"Ma"的ASCII码是:
      M: 77 (01001101)
      a: 97 (01100001)
      
  2. 补齐到3字节

    • 补齐后变成:
      01001101 01100001 00000000
      
  3. 分成6位块

    • 划分后得到:
      010011 010110 000100 000000
      
  4. 转换为十进制

    • 每个6位块对应的整数是:
      19 22 16 0
      
  5. 映射到Base64字符集

    • 使用Base64字符表对应的字符是:
      T W Q A
      
  6. 添加填充字符

    • 因为原始数据不足3字节,我们在末尾添加一个等号(=),表示有1字节填充。
    • 最终结果是:
      TWFu==
      

解码过程

解码过程与编码过程相反,分以下几步:

  1. 移除填充字符

    • 移除结尾的等号(=)。
  2. 转换Base64字符为6位块

    • 将每个Base64字符转换回对应的6位二进制块。
  3. 重新组合为8位块

    • 将6位块重新组合成8位块。
  4. 转换为原始字节

    • 将8位块转回原始的字节数据。

通过这些步骤,Base64编码和解码可以在文本和二进制数据之间无损转换。

读懂这段代码!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// Base64编码表
static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789+/";// 判断字符是否为Base64编码字符
int is_base64(unsigned char c) {return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '+') || (c == '/');
}// Base64编码函数
char *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) {// 计算编码后的字符串长度*output_length = 4 * ((input_length + 2) / 3);// 为输出字符串分配内存char *encoded_data = (char *)malloc(*output_length + 1);if (encoded_data == NULL) return NULL;// 编码过程for (size_t i = 0, j = 0; i < input_length;) {uint32_t octet_a = i < input_length ? data[i++] : 0;uint32_t octet_b = i < input_length ? data[i++] : 0;uint32_t octet_c = i < input_length ? data[i++] : 0;uint32_t triple = (octet_a << 16) | (octet_b << 8) | octet_c;encoded_data[j++] = base64_chars[(triple >> 18) & 0x3F];encoded_data[j++] = base64_chars[(triple >> 12) & 0x3F];encoded_data[j++] = base64_chars[(triple >> 6) & 0x3F];encoded_data[j++] = base64_chars[triple & 0x3F];}// 添加填充字符for (size_t i = 0; i < (3 - input_length % 3) % 3; i++) {encoded_data[*output_length - 1 - i] = '=';}// 添加字符串终止符encoded_data[*output_length] = '\0';return encoded_data;
}// 测试函数
int main() {const char *text = "Hello, World!";size_t input_length = strlen(text);size_t output_length;// Base64编码char *encoded_text = base64_encode((const unsigned char *)text, input_length, &output_length);if (encoded_text == NULL) {fprintf(stderr, "内存分配失败\n");return 1;}// 输出编码后的字符串printf("Base64编码后的结果:%s\n", encoded_text);// 释放内存free(encoded_text);return 0;
}

http://www.ppmy.cn/embedded/132389.html

相关文章

社交媒体与客户服务:新时代的沟通桥梁

在数字化时代&#xff0c;社交媒体已成为人们日常生活中不可或缺的一部分&#xff0c;它不仅改变了人们的沟通方式&#xff0c;也深刻影响着企业的客户服务模式。从传统的电话、邮件到如今的社交媒体平台&#xff0c;客户服务的渠道正在经历一场前所未有的变革。社交媒体以其即…

深入探索卷积神经网络(CNN):图像分类的利器

深入探索卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像分类的利器 前言CNN的崛起&#xff1a;为何我们需要它&#xff1f;图像卷积&#xff1a;CNN的基石轮廓过滤器&#xff1a;捕捉边缘特征 图像池化&#xff1a;降低维度的利器CNN的组成&#xff1a;卷积层、池化…

草地杂草数据集野外草地数据集田间野草数据集YOLO格式VOC格式目标检测计算机视觉数据集

一、数据集概述 数据集名称&#xff1a;杂草图像数据集 数据集是一个包含野草种类的集合&#xff0c;其中每种野草都有详细的特征描述和标记。这些数据可以包括野草的图片、生长习性、叶片形状、颜色等特征。 1.1可能应用的领域 农业领域: 农业专家和农民可以利用这一数据集来…

AI 通俗解读统计学和机器学习的主要区别

统计学和机器学习虽然都涉及数据分析和建模&#xff0c;但它们的核心理念、方法和应用场景有所不同。以下是它们主要的区别&#xff1a; 生活化例子 统计学&#xff1a;想象你是一个侦探&#xff0c;通过找出过去的证据&#xff08;数据&#xff09;&#xff0c;分析事情发生…

记录一次线上环境svchost.exe antimalware service executable 进程占用CPU过高问题

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围&#xff1a; 目前专注java体系&#xff0c;有多…

怎么做系统性能优化

对于软件或系统的性能优化&#xff0c;可以采取多种措施来提高效率和响应速度。这里为您列举一些常见的方法&#xff1a; 1. 代码优化&#xff1a;检查并优化算法复杂度&#xff0c;减少不必要的计算。使用更高效的数据结构和算法。 2. 数据库优化&#xff1a; •索引优化&…

【含开题报告+文档+PPT+源码】基于springboot的旅游路线推荐系统的设计与实现

开题报告 随着互联网和移动互联网的普及&#xff0c;人们获取信息的渠道变得更加便利和多样化。旅游者不再满足于传统的旅游指南和旅行社推荐&#xff0c;他们更倾向于通过网络平台获取个性化、多样化的旅游推荐信息。因此&#xff0c;旅游推荐管理系统应运而生&#xff0c;为…

实现prometheus+grafana的监控部署

直接贴部署用的文件信息了 kubectl label node xxx monitoringtrue 创建命名空间 kubectl create ns monitoring 部署operator kubectl apply -f operator-rbac.yml kubectl apply -f operator-dp.yml kubectl apply -f operator-crd.yml # 定义node-export kubectl app…