base64隐写
base64原理简介
如图所示, 这是一个朴实无华的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个字符来表示他。
那,没法整除怎么办?
补0。
%3 == 2 的情况
%3 == 1 的情况
那么这些被补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+/" BinaryText = "" for line in LineList: if line.find("==") > 0: temp = bin(Base64Char.find(line[-3]) & 15)[2:] BinaryText = BinaryText+"0"*(4-len(temp))+temp elif line.find("=") > 0: temp = bin(Base64Char.find(line[-2]) & 3)[2:] BinaryText = BinaryText+"0"*(2-len(temp))+temp Text = "" if(len(BinaryText) % 8 != 0): 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)) return Text
def Base64_ForString_Decrypt(Text): 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))
|