了解base64的一些隐写

今天刷题发现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()

posted @ 2024-09-11 18:35  无意识的小石头  阅读(245)  评论(0)    收藏  举报