概述
(见https://blog.csdn.net/local_752/article/details/121970823)
Base64是一种用64个字符表示所有二进制数据的编码方式,通过将二进制数据每6位一组的方式重新组织,刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从000000
到111111
的64种状态
它实际上是一种“二进制到文本”的编码方法
Base64是一种用64个字符(这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=)来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。它通过将二进制数据转变为64个“可打印字符”,完成了数据在HTTP协议上的传输。通过将二进制数据每6位一组的方式重新组织,刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从000000
到111111
的64种状态
注意:由于base64编码用了8位字符来表示信息中的6个位,所以base64编码字符串大约比原始值扩大了33%。
对于原文,取3个字符一组,共24bit,拆分成4块,每块6bit,然后各块最高位补2bit的0(共补8bit),扩展为4块8bit的组,每组由于高2位均为0,所以必然是合法的ASCII字符,并且共有2 6 = 64 2^6=64 2 6 = 6 4 种可能的字符.
根据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 import base64from 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 (): 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 (): str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0=' string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/' string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' flag = base64.b64decode(str1.translate(str .maketrans(string2, string1))) print (flag.decode()) decrypt2()