今天刷题发现base64原来还能隐写,隐写主要是靠base64后面补的等号。
因为base64在加密的时候如果后面位数不足就会补=(00),而解码的时候如果后面有多余的就直接丢弃,这样也不会影响原文。
那我们如果补00的时候补的不是00呢,那我们岂不是可以在这上面做文章,这样就能做到隐写了。
解码的代码如下:
此方法用来将包含隐藏信息的字母转换为base64编码表对应的序列值(十进制数)并返回
def base64change(s):
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' # base64编码表,恰好索引值对应字母
for i in range(len(table)):
if table[i] == s:
return i
此方法用来获取隐藏信息二进制字符串
def base64solve():
f = open(r"D:\fulan\练习\stego.txt",'r')
lines = f.readlines()
flag_bin = ''
for line in lines:
# print(line)
l = line.strip() # 去掉两边的空格
if l[-1] == '=':
if l[-2] == '=': # 含有两个=则包含4bit信息
# 将返回的十进制转换为二进制数,由于返回的二进制数为0b开头,所以从第三位开始取,然后用0填充头部为4位,再取后四位隐藏的信息
flag_bin += bin(base64change(l[-3]))[2:].zfill(4)[-4:]
else:# 只含一个=则包含二bit信息
flag_bin += bin(base64change(l[-2]))[2:].zfill(2)[-2:]
#print(flag_bin)
flag = ''
for i in range(len(flag_bin)//8):
flag += chr(int(flag_bin[i * 8:(i + 1) * 8], 2))
print(flag)
if name == 'main':
base64solve()