概述

(见https://blog.csdn.net/local_752/article/details/121970823)

Base64是一种用64个字符表示所有二进制数据的编码方式,通过将二进制数据每6位一组的方式重新组织,刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从000000111111的64种状态

它实际上是一种“二进制到文本”的编码方法

Base64是一种用64个字符(这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=)来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。它通过将二进制数据转变为64个“可打印字符”,完成了数据在HTTP协议上的传输。通过将二进制数据每6位一组的方式重新组织,刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从000000111111的64种状态

注意:由于base64编码用了8位字符来表示信息中的6个位,所以base64编码字符串大约比原始值扩大了33%。

image-20230917180421686

对于原文,取3个字符一组,共24bit,拆分成4块,每块6bit,然后各块最高位补2bit的0(共补8bit),扩展为4块8bit的组,每组由于高2位均为0,所以必然是合法的ASCII字符,并且共有26=642^6=64种可能的字符.

根据Base64字母表,对扩展后的组用对应的4个字符进行替换,这样就实现了一组替换,同时3字节->4字节,长度有所增大.000000 000000 000000 000000

需要注意的是,如果最后剩余1字节,则需要在结果后面补2个=(因为单个的8bit只能分成2个块,后面的块要对低4位补0)进行补齐.

同理,如果最后剩余2字节,则需要在结果后面补1个=(因为2字节共16bit可以分成3个块,最后面的块要对低2位补0)进行补齐.

解码时,只需要按规则逆向拆分合并即可.

变表Base64

解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# Visit https://www.lddgo.net/string/pyc-compile-decompile for more information
# Version : Python 3.7

import base64
from string import *


def original_title():
# 原来的题目
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
print('good job!!!!')
else:
print('something wrong???')
exit(0)


def decrypt1():
# 方法1
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

convert_dict = {}
for i in range(len(string1)):
ch1 = string1[i]
ch2 = string2[i]
convert_dict[ch1] = ch2

str2 = ''
for i in str1:
if i not in convert_dict.keys():
str2 += i
continue
j = convert_dict[i]
str2 += j
flag = base64.b64decode(str2.encode()).decode()
print(flag)


def decrypt2():
# 方法2
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = base64.b64decode(str1.translate(str.maketrans(string2, string1)))
print(flag.decode())


# decrypt1()
decrypt2()