base64隐写

base64隐写

base64原理简介

image-20210720202234213

如图所示, 这是一个朴实无华的base64码表。

编码后的数据是一个字符串, 包含的字符为: A-Z,a-z,0-9,+/
共 64 个字符:26 + 26 + 10 + 1 + 1 = 64。再加上填充用的=,共65个
64 个字符需要 6 位(2^6)二进制来表示, 表示成数值为 0~63。于是,就产生了 “以六个为一组的问题”

六个一组带来的问题

这是三个字符。h、e、i。 每个字符需要用8比特表示,共有8*3=24比特,正好能被6整除(4*6=24)

于是,base64就需要有4个字符来表示他。

img

那,没法整除怎么办?

0

%3 == 2 的情况

img

%3 == 1 的情况

img

那么这些被补0的地方在解码的时候是不会被是用到的。这些被补0的位置就是我们可以进行隐写的部分。

隐写方法以及判断

隐写过程:
把我们想要隐写的文本转化为二进制数,然后找一段足够长的文本按行切分并进行Base64编码,如果出现了=符号则代表这行文本能被我们用于隐写,能隐写几位,我们就从刚才得到的二进制数开头起取几位填入。经过批量处理后,我们就能完美地将数据隐写在这一行行Base64编码文本之中了。

那么,我们如何判断Base64编码文本中是否被隐写了某些信息呢?

正常情况下,解Base64得到的文本再次Base64编码,得到的值应该是和原Base64编码一样的。如果不一样,则证明这段Base64编码文本被隐写了。

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
import base64

def Base64Stego_Decrypt(LineList):
Base64Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #Base64字符集 已按照规范排列
BinaryText = ""
for line in LineList:
if line.find("==") > 0: #如果文本中有2个=符号
temp = bin(Base64Char.find(line[-3]) & 15)[2:] #通过按位与&15运算取出二进制数后4位 [2:]的作用是将0b过滤掉
BinaryText = BinaryText+"0"*(4-len(temp))+temp #高位补0
elif line.find("=") > 0: #如果文本中有1个=符号
temp = bin(Base64Char.find(line[-2]) & 3)[2:] #通过按位与&3运算取出二进制数后2位
BinaryText = BinaryText+"0"*(2-len(temp))+temp #高位补0
Text = ""
if(len(BinaryText) % 8 != 0): #最终得到的隐写数据二进制位数不一定都是8的倍数,为了避免数组越界,加上一个判断
print("警告:二进制文本位数有误,将进行不完整解析。")
for i in range(0, len(BinaryText), 8):
if(i+8 > len(BinaryText)):
Text = Text+"-"+BinaryText[i:]
return Text
else:
Text = Text+chr(int(BinaryText[i:i+8], 2))
else:
for i in range(0, len(BinaryText), 8):
Text = Text+chr(int(BinaryText[i:i+8], 2)) #将得到的二进制数每8位一组对照ASCII码转化字符
return Text

def Base64_ForString_Decrypt(Text): #Base64解密
try:
DecryptedText = str(Text).encode("utf-8")
DecryptedText = base64.b64decode(DecryptedText)
DecryptedText = DecryptedText.decode("utf-8")
except:
return 0
return DecryptedText

if __name__ == "__main__":
Course = input("文件名:")
File = open(Course, "r")
LineList = File.read().splitlines()
print("显式内容为:")
for line in LineList:
print(Base64_ForString_Decrypt(line),end="")
print("隐写内容为:")
print(Base64Stego_Decrypt(LineList))

base64隐写
https://qiuye.ink/2021/07/20/CTF/misc/base64隐写/
作者
Kagami
发布于
2021年7月20日
许可协议