zoukankan      html  css  js  c++  java
  • 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
         原理
         实战

  • 相关阅读:
    Java attack
    Java attack
    Java attack
    Java attack
    Java attack
    Java attack -Java 中的集合
    Java attack
    迟到的《Cashflow》游戏感悟
    三读《富爸爸穷爸爸》
    安装vue开发环境→安装淘宝镜像的时候报错
  • 原文地址:https://www.cnblogs.com/ZhouJiaHao/p/14512711.html
Copyright © 2011-2022 走看看