base64隐写原理

     base16
     base32
     base36
     base58
     base64
     base85
     base91
     base92
     原理
     实战

 

base64原理
base64一共64个字符 A-Z a-z 0-9 + / 还有一个 = 作为补位符
这些字符用 二进制 的 0 - 63 来表示

 

 

最大的63 二进制为 111111 所以base64用 六位二进制来表示
而ascii中数字最小的是 A 二进制为 1000001 一般用 8 位二进制来表示
所以

 

 

 

 
 
多余的就会用 0 补位
注意红色的 0, 我们在解码的时候将其丢弃了, 所以这里的值不会影响解码. 所以我们可以在这进行隐写
 
等号的那部分 0 不能用于隐写
因为修改那里的二进制值会导致等号数量变化, 解码的第 1 步会受影响. 自然也就破坏了源字符串
 
而红色部分的 0 是作为最后一个字符二进制的组成部分, 还原时只用到了最后一个字符二进制的前部分, 后面的部分就不会影响还原.
 
 
base加解密模块
base16
import base64

base64.b16encode(b'a')   加密  python3 为bytes型 返回bytes        python2 bytes和str都行 返回str型

base16 = base64.b16decode('E68891E79C9FE5B885')  解密
print(base16.decode('utf-8'))     解密结果为 bytes 需要转为字符串

 

base32

import base64

base64.b32encode(b'123')  加密  python3 为bytes型 返回bytes        python2 bytes和str都行 返回str型
base32 = base64.b32decode('K5UHSIDBNUQESIDTN4QGQYLOMRZW63LF').decode('utf-8')  结果也是bytes   加个.decode('utf-8')让执行结果直接转字符串

 

base36
import base36
 
base36.loads(b'aaa') 加密 可以用bytes或str 返回结果均为int python3和2 都一样
base36.dumps(13330) 解密 只能用int型

 

 
base58
import base58
 
print(base58.b58encode('aaa')) python3 加解密都返回bytes python2 均返回 str python2和3 加密和解密 都可以用 bytes或str 类型的数据 不影响结果
print(base58.b58decode(b'Zi88'))

 

base64

import base64
base64.b64encode(b'a') base64 加密 用bytes 返回 bytes
base64.b64decode('5oiR5pyA5biF') 解密 结果为 bytes
#字符串 -> byte 'a'.encode('utf-8') #或 bytes('a',encoding="utf8") #byte -> 字符串 b'a'.decode('utf-8') #或 str(b'a',encoding="utf8")

 

 
base85
import base64
base64.b85encode(b'aaa') 加密 python3中 使用bytes
base85 = base64.b85decode('S7>=4VQnBuAaidZXkl(-b8l^B').decode('utf-8') 解密 结果为 bytes 需要转为字符串 加个.decode('utf-8')让执行结果直接转字符串
 
加密和解密 ascii85格式的
import base64
 
base64.a85encode(b'aaa') 加密 python3中 使用bytes
base64.a85decode(b'@:<R') 解密 结果为 bytes 需要转为字符串 将使用Ascii85字母的二进制字符串解码为正常形式
 
base91
import base91
 
base91.encode(b'a') python3中 只能加密 bytes格式 python2 中可以是字符串
base91.decode('GB') python3中会返回 bytearray(b'a') python2 返回 bytearray型 a
 
base92
目前 base92 模块 未更新 只支持python2
import base92
print base92.encode('aaaaa') 加密
print base92.decode('D81RPyB') 解密
 
一个大佬改造的base92模块 适配python3   未上传pypi
https://blog.csdn.net/Gu_fCSDN/article/details/103427721   原文

 

 

下载解压后 双击 install.bat 即可
import py3base92

py3base92.encode('aaa')   加密  可以用bytes 或 str   返回str
py3base92.decode('D81Q')  解密  只能用str不能用bytes 返回str
还有base62 等 懒得写

 

 

base64隐写
原理

 

 

 

base最后一个字符Q
二进制为 010000
后面4个0与 补码的0 一起被丢弃 (解密01时会自动补齐0)
所以红色地方的 0 可以替换
VHIweQ== 与 VHIweR== 直接解密得到的结果都是 Tr0y
Q: 010000
R: 010001
由于后四位被丢弃 所以解码时 自动补零就会让R变成Q
同理 二进制开头是 01 的都可以 比如 011111
 
一行 base64 顶多能有 2 个等号, 也就是有 2*2 位的可隐写位

 

 

base64隐写脚本
水平有限,写的一般

base64code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
basebin = []

for i in open('X:\2.txt','r'):  #base文件的地址
    i = i.replace('
','')
    if '==' in i:   #如果最后是两个‘=’,说明有四位隐写位,将倒数第三个字符转化为对应的二进制索引,然后取后四位
        a = i[-3:-2]
        basebin.append(str(bin(base64code.index(a))).replace('0b', '')[-4:])

    elif '=' in i: #如果最后是一个‘=’,说明有两位隐写位,将倒数第二个字符转化为对应的二进制索引,然后取后两位。
        a = i[-2:-1]
        basebin.append(str(bin(base64code.index(a))).replace('0b', '')[-2:])
    else:
        pass

basestr = ''
for i in basebin:   #将列表里的二进制 合并到一个字符串里
    basestr += i

for i in range(0, len(basestr) + 1, 8):
    print(chr(int(str(basestr[i : i+8]),2)),end='')  #输出

 

实战
题目来源:https://ctf.show/challenges misc 里的 base一条龙
打开题目给的txt 直接base64解码

 

 

很明显是rar压缩包
注意,如果你直接复制 创建出来的压缩包 解压时报错
可以自己用脚本来解码
 
解压后获得 steg.txt
使用上面的 base64隐写脚本
 
运行后获得 网盘链接和 提示: base16/32/58/64/85/91/92
 
网盘下载得到文件 里面文本 是各种base类型多次加密
本人太菜 脚本老是报错
直接用了大佬的脚本
https://blog.csdn.net/miuzzx/article/details/104790902
#author:羽
import base64
import base91
import base58
import py3base92
def hex_to_str(s):
        k=''
        for i in range(0,len(s),2):
                j = s[i]+s[i+1]
                k+=chr(int(j,16))
        print('16')
        return k

def ba32(s):
        s = base64.b32decode(s)
        s = bytes.decode(s)
        print('32')
        return s

def ba58(s):
        s = base58.b58decode(s)
        s = bytes.decode(s)
        print('58')
        return s

def ba64(s):
        s = base64.b64decode(s)
        s = bytes.decode(s)
        print('64')
        return s

def baa85(s):
        s = base64.a85decode(s)
        s = bytes.decode(s)
        print('a85')
        return s

def bab85(s):
        s = base64.b85decode(s)
        s = bytes.decode(s)
        print('b85')
        return s

def ba91(s):
        s = base91.decode(s)
        s = s.decode()
        print('91')
        return s

def ba92(s):
        s = py3base92.decode(s)
        print('91')
        return s

def start(s):
        for i in range(50):
                if len(s)<50:
                        print(s)
                try:
                        s=hex_to_str(s)
                except:
                        try:
                                s=ba32(s)
                        except:
                                try:
                                        s=ba58(s)
                                except:
                                        try:
                                                s=ba64(s)
                                        except:
                                                try:
                                                        s = baa85(s)
                                                except:
                                                        try:
                                                                s=bab85(s)
                                                        except:
                                                                print('nonono')

 

最终在TkVLTFdUQVpvUlNda1ZXRUpAZVldTltgJCQhLCAgGSknPjc=时base64解码出现乱码
需要异或...
大佬的脚本:
import base64

s='TkVLTFdUQVpvUlNda1ZXRUpAZVldTltgJCQhLCAgGSknPjc='
s=base64.b64decode(s)
for i in range(256):
    flag=""
    k=0
    for j in s:
        res=j^(k+i)
        flag+=chr(res)
        k+=1

 

 

 参考:

https://blog.csdn.net/miuzzx/article/details/104790902

https://www.tr0y.wang/2017/06/14/Base64steg/

 

 

 

     base16
     base32
     base36
     base58
     base64
     base85
     base91
     base92
     原理
     实战

原文地址:https://www.cnblogs.com/ZhouJiaHao/p/14512711.html