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))
 
  |