Akiba's blog Akiba's blog
首页
  • web

    • PHP
    • Python
    • JavaScript
  • misc

    • 隐写
  • 比赛
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
关于

Kagami

萌新 Web 手,菜鸡一个
首页
  • web

    • PHP
    • Python
    • JavaScript
  • misc

    • 隐写
  • 比赛
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
关于
  • Web

  • Misc

    • 隐写

      • ntfs流隐写
      • base64隐写
        • base64隐写
          • base64原理简介
          • 六个一组带来的问题
          • 隐写方法以及判断
          • base64隐写脚本
  • JavaScript文章

  • Vue文章

  • 代码审计

  • 知识库
  • Misc
  • 隐写
Kagami
2021-07-20
base64隐写
base64原理简介
六个一组带来的问题
隐写方法以及判断
base64隐写脚本

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隐写脚本

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))
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
#隐写
上次更新: 2021/07/22, 19:41:50
ntfs流隐写
new命令原理

← ntfs流隐写 new命令原理→

Theme by Vdoing | Copyright © 2020-2025 秋葉
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式