base64隐写 #
base64 #
Base64是一种二进制到文本的编码方式。
base64的每个字节用6位二进制数来表示,共64个编码字符,2^6=64。加上补位符号’=‘共65个字符。
A-Z a-z 0-9 + / =
base64编码 #
编码主要流程: 将原始数据每三个字节分为一组(共24bit),然后每6bit转为一个码表字符(新的四个字节)。如果字节数不是三的倍数,补0使二进制位数是6的倍数来编码
-
如果最后多了一个字节(8bit,差16bit),补上4个0(12bit—2*6,差12bit),编码成2个base64字符。最后补两个’=’(6*2bit)。
-
如果最后多了两个字节(16bit,差8bit),补上2个0(18bit—3*6,差6bit),编码成3个base64字符。最后补上一个’=’(6bit)。
Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数
base64解码 #
-
如果最后补了两个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将2个base64字符转为12bit,取8bit为新字节,丢弃掉最后4bit。
-
如果最后补了一个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将3个base64字符转为18bit,取16bit为两个新字节,丢弃掉最后2bit。
-
如果最后没有补位,在解码时,将每个base64字符转换为对应的6位二进制数(共24位)。然后将这24位二进制数按照每8位分割为一组,得到三个字节的原始数据。
实际上算法的实现是更加复杂的,需要涉及到二进制位操作。
base64隐写 #
因为在base64解码的时候会丢弃2bit或者4bit,所以在这些地方插入二进制数据不会影响解码的结果,但是会影响编码后base64的结果。所以就可以在这部分进行隐写。
自己写的提取base64可隐写的部分的所有二进制的值合并字符串。
#文本读取内容实现
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open("./f380d850e6ebdb19b7d0743.txt","r") as f:
for i in f.readlines():
#最后一个是换行符,去掉
base64len=(len(i)-1)
text=i[0:-1]
if base64len%4==0:
pass
elif base64len%4==3:
#能藏2bit
t=base64chars.index(text[-1])
t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位
print(t[-2:],end='')
elif base64len%4==2:
##能藏4bit
t=base64chars.index(text[-1])
t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位
print(t[-4:],end='')
else:
print("好像有些错误")
#补全完毕