Base64 换表加密
2024/1/7大约 1 分钟
[Nepuctf_2021] Real_base
这题涉及的是 base64 更换了码表,这种考法也挺多的,比如凯撒加密等中也会涉及到,更换码表
题目
# py2
import string
import random
from secret import flag, b_char
def encode(s):
res = ''
binstr = [bin(ord(s[i])).replace('0b', '').zfill(8) for i in range(len(s))]
p1 = len(binstr) // 3
p2 = len(binstr) % 3
part1 = binstr[0:3 * p1]
for i in range(p1):
str_p1 = binstr[i * 3] + binstr[i * 3 + 1] + binstr[i * 3 + 2]
tmp_str = [str_p1[x: x + 6] for x in [0, 6, 12, 18]]
tmp_res = [b_char[int(x, 2)] for x in tmp_str]
res += ''.join(tmp_res)
if p2:
part2 = binstr[3 * p1:]
str_p2 = ''.join(part2) + (3 - p2) * '0' * 8
tmp_str = [str_p2[x: x + 6] for x in [0, 6, 12, 18]][:p2 + 1]
tmp_res = [b_char[int(x, 2)] for x in tmp_str]
res += ''.join(tmp_res)
res += '=' * (3 - p2)
return res
m1 = random.sample(list(b_char), 50)
print ''.join(m1)
print encode(m1)
print encode(flag)
# rTcb1BR8YVW2EOUjweXpIiLt5QCNg7ZAsD9muq3ylMhvofnx/P
# 2Br9y9fcu97zvB2OruZv0D3Bwhbj0uNQnvfdtC2TwAfPrdBJ3xeP4wNn0hzLzCVUlRa=
# tCvM4R3TzvZ7nhjBxSiNyxmP28e7qCjVxQn91SRM3gBKzxQ=
根据最后三行可知,题目给了明文 m1 和加密后对应的密文,进行了 base64加密,但更换了码表
通过与标准的 base64 加密的对比,判断出此加密的码表
先找出使用的码表
import string
import base64
m1 = b'rTcb1BR8YVW2EOUjweXpIiLt5QCNg7ZAsD9muq3ylMhvofnx/P'
# 标准base64加密
a = base64.b64encode(m1)
# print(a)
a = b'clRjYjFCUjhZVlcyRU9VandlWHBJaUx0NVFDTmc3WkFzRDltdXEzeWxNaHZvZm54L1A='
b = b'2Br9y9fcu97zvB2OruZv0D3Bwhbj0uNQnvfdtC2TwAfPrdBJ3xeP4wNn0hzLzCVUlRa='
nvs = zip(a, b)
# print(nvs)
b64_char = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'
new_char = ['*'] * 64
for i in nvs:
s = i[0]
ind = b64_char.find(chr(s))
new_char[ind] = chr(i[1])
print(''.join(new_char))
# abcdef*h*j*l*n***r*tuvwxyz0*234**7*9ABCD*****J*L*NOPQR*TUV***Z*=
得到使用的加密码表应该为:
abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/
更换base64码表进行解密
import base64
import string
#自定义的码表,包含 64 个字符
custom_table = b'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/'
# 标准表
standard_table = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
ENCODE = bytes.maketrans(standard_table,custom_table)
DECODE = bytes.maketrans(custom_table,standard_table)
def encode(input):
return base64.b64encode(input).translate(ENCODE)
def decode(input):
return base64.b64decode(input.translate(DECODE))
enc = "tCvM4R3TzvZ7nhjBxSiNyxmP28e7qCjVxQn91SRM3gBKzxQ="
print(decode(enc))