专栏首页逆向技术base64原理与逆向中的表现形式.

base64原理与逆向中的表现形式.

Base64编码 变形Base64编码 实现与逆向分析

一丶BASE64介绍

1.1 BASE64简介

​ 所谓的BASE64 说白了就是有一个64个字符数组, 这64个字符分别是 小写a - z 大写A-Z 数字0-9 然后再加上"+" "/"符号来组成一个64字符的数组.但是其实我们有的时候还要加上"="作为字符,也就是说白了是65个字符,但是"="加密解密都会忽略所以就认为是64个字符.

从64个字符里面取出当前字符就形成了编码过程

下面说一下BASE64编码的过程

  • 第一步 将三个字节作为一组 也就是有24个进制位
  • 第二步 将三个字节转为四个字节 也就是24个进制位按照每6个字节一组的方式进行分割
  • 第三步 扩展为4个字节 主要就是分组之后是6个进制为一组,再把每个6进制前边加上00
  • 第四部 查表 根据base64编码表 然后进行查表动作.其索引就是按照6bit分组扩展为8bit的字节

下面就以C语言为表来表达

unsigned char base64_table[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 

下面就实战转换 Man 这三个字符 如何进行编码的

  • 三字符转为4字符

首先第一步就是将 M a n三个字符的Ascii提取出来. 第二步看一下其对应的8个bit位 第三步就是8bit 按照6bit分割

第四步就是前边补0 但是其实不补也可以,因为补了0一样还是代表原数.

那么在C/C++中的表现就可以用移位来进行编码.

简单伪代码如下

char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	char Man[] = "Man";
	char CodeTable[5] = { 0 };


	int nindex = 0;
	nindex = (Man[0] >> 0x2) & 0x3F;
	CodeTable[0] = base64_table[nindex];


	nindex = ((Man[0] & 0x03) << 4) | (Man[1] >> 4);
	CodeTable[1] = base64_table[nindex];


	nindex = ((Man[1] & 0x0F) << 2) | (Man[2] >> 6);
	CodeTable[2] = base64_table[nindex];


	nindex = ((Man[2] & 0x3F));
	CodeTable[3] = base64_table[nindex];

通过移位可以将三个转为4个 最终输出为TWFu 当然我们可以用循环做.这里是简单看如何转换的.

1.2 BASE64 c代码实现

1.2.1 自实现base64编码

使用C代码实现就很简单了,根据以上原理我们可以得出几个步骤

1.传入要编码的字节以及对应长度

2.以长度%3 %2 %1为分界线进行编码

​ 长度 = 3 则用3转化为4的方式

​ 长度 = 2 则用 2转化为3的方式 并且后面加一个=

​ 长度为1 则用 1转化为2的方式i并且后面加上两个=

代码如下

string b64_EnCode(char EnCodeByte[], int EnCodeLen)
{
	char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	string EnCode;

	char EnCode3Array[3] = {0};
	int i = 0;
	while (EnCodeLen--)
	{
		//每次获取一个字符 当获取到3个字符进行一次操作
		EnCode3Array[i++] = *(EnCodeByte++);
		if (i == 3)
		{
			EnCode += base64_table[(EnCode3Array[0] >>2)& 0x3F];
			EnCode += base64_table[((EnCode3Array[0] & 0x03) << 4) | (EnCode3Array[1] >> 4)];
			EnCode += base64_table[((EnCode3Array[1] & 0x0F) << 2) | (EnCode3Array[2] >> 6)];
			EnCode += base64_table[((EnCode3Array[2] & 0x3F))];

			//重置i
			i = 0;
		}
	}

	//然后判断是否是2个字节的情况与一个字节的情况
	if (i)
	{
		//置零
		for (int j = i; j < 3; j++)
		{
			EnCode3Array[j] = 0;
		}

		//判断i = 2 还是1
		if (i == 2)
		{

			EnCode += base64_table[(EnCode3Array[0] >> 2) & 0x3F];
			EnCode += base64_table[((EnCode3Array[0] & 0x03) << 4) | (EnCode3Array[1] >> 4)];
			EnCode += base64_table[((EnCode3Array[1] & 0x0F) << 2)];
			EnCode += '=';
		}
		if (i == 1)
		{
			EnCode += base64_table[(EnCode3Array[0] >> 2) & 0x3F];
			EnCode += base64_table[((EnCode3Array[0] & 0x03) << 4) | (EnCode3Array[1] >> 4)];
			EnCode += '=';
			EnCode += '=';
		}
	}

	return EnCode;
}
int main()
{
	
	char Man[] = "HelloWorld1";

	printf("%s\r\n", b64_EnCode(Man,strlen(Man)).c_str());
	
	system("pause");
    return 0;
}

输出值为: SGVsbG9Xb3JsZDE=

1.2.2 其它优秀实现

上面是自己实现的 base64还有更多种实现,比如下面的移位也不一样但是结果是一样的.

#include "base64.h"
#include <iostream>

// there are 64 characters
static const std::string base64_chars =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz"
        "0123456789+/";


static inline bool is_base64(unsigned char c) {
    return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(const char *bytes_to_encode, unsigned int in_len) {
    std::string ret;
    int i = 0;
    int j = 0;
    unsigned char char_array_3[3];  // store 3 byte of bytes_to_encode
    unsigned char char_array_4[4];  // store encoded character to 4 bytes

    while (in_len--) {
        char_array_3[i++] = *(bytes_to_encode++);  // get three bytes (24 bits)
        if (i == 3) {
            // eg. we have 3 bytes as ( 0100 1101, 0110 0001, 0110 1110) --> (010011, 010110, 000101, 101110)
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; // get first 6 bits of first byte,
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); // get last 2 bits of first byte and first 4 bit of second byte
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); // get last 4 bits of second byte and first 2 bits of third byte
            char_array_4[3] = char_array_3[2] & 0x3f; // get last 6 bits of third byte

            for (i = 0; (i < 4); i++)
                ret += base64_chars[char_array_4[i]];
            i = 0;
        }
    }

    if (i)
    {
        for (j = i; j < 3; j++)
            char_array_3[j] = '\0';

        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

        for (j = 0; (j < i + 1); j++)
            ret += base64_chars[char_array_4[j]];

        while ((i++ < 3))
            ret += '=';

    }

    return ret;

}

std::string base64_decode(const std::string& encoded_string) {
    size_t in_len = encoded_string.size();
    int i = 0;
    int j = 0;
    int in_ = 0;
    unsigned char char_array_4[4], char_array_3[3];
    std::string ret;

    while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
        char_array_4[i++] = encoded_string[in_]; in_++;
        if (i == 4) {
            for (i = 0; i < 4; i++)
                char_array_4[i] = base64_chars.find(char_array_4[i]) & 0xff;

            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

            for (i = 0; (i < 3); i++)
                ret += char_array_3[i];
            i = 0;
        }
    }

    if (i) {
        for (j = 0; j < i; j++)
            char_array_4[j] = base64_chars.find(char_array_4[j]) & 0xff;

        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);

        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
    }

    return ret;
}

​ 待完成,b64变形 汇编中表现形式等等.先写开发.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 逆向知识十三讲,汇编中数组的表现形式,以及还原数组

                逆向知识十三讲,汇编中数组的表现形式,以及还原数组 讲解数组之前,要了解数组的特性 1.数据具有连续性 2.数据类型相同 比如:   i...

    IBinary
  • 逆向知识第十讲,循环在汇编中的表现形式,以及代码还原

            逆向知识第十讲,循环在汇编中的表现形式,以及代码还原 一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx...

    IBinary
  • Base64编码原理与应用

    2015年,我们在青云平台上实现了“百度云观测”应用。青云应用本质上是一个iframe,在向iframe服务方发送的请求中会携带一些数据,青云平台会使用Bas...

    bear_fish
  • 常用的几个PHP加密函数

      像常用的MD5、hash、crypt、sha1这种就是单项散列加密,单项散列加密是不可逆的。

    那一叶随风
  • 编码、加密和 Hash

    散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量...

    SkyRiN
  • 数据安全及各种加密算法对比

    czjwarrior
  • [Java 安全]加密算法

    Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别。 Base64是一种很常见的编码规范...

    静默虚空
  • 浅谈Base64编码算法

    听着music睡
  • python爬虫以及后端开发--实用加密模板整理

    都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy

    小小咸鱼YwY
  • 程序员面试闪充--iOS密码学

    但凡一个有点追求的iOS开发,总得会点加密技术,要不然用户信息就有可能被其他人获取用来做一些对我们不利的事情。 视频地址: 密码学 一、base64 base6...

    谦谦君子修罗刀
  • 说一下你常用的加密算法

    加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。

    Java旅途
  • Java中4大基本加密算法解析

    我是攻城师
  • 常见加密算法之单向加密

    在接口测试过程中,常常会遇到加密算法,今天主要说说一下单向散列加密的4种算法。

    用户5521279
  • 如何通过 Tampermonkey 快速查找 JavaScript 加密入口

    在很多情况下,我们可能想要在网页中自动执行某些代码,帮助我们完成一些操作。如自动抢票、自动刷单、自动爬虫等等,这些操作绝大部分都是借助 JavaScript 来...

    崔庆才
  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现。部分常用的加密方法基本都有对应的Python库,基本不再需要我们用代码实现具体算...

    砸漏
  • 一文搞懂Web中暗藏的密码学

    密码学是各种安全应用程序所必需的,现代密码学旨在创建通过应用数学原理和计算机科学来保护信息的机制。但相比之下,密码分析旨在解密此类机制,以便获得对信息的非法访问...

    前端劝退师
  • 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

                  逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算)...

    IBinary
  • iOS逆向(2)-密码学(Hash&对称加密)

    原文地址:https://juejin.im/post/5c7e72cd6fb9a049fc044519”

    iOSSir
  • 从Java程序员的角度理解加密的那些事

    在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参...

    用户2890438

扫码关注云+社区

领取腾讯云代金券