Python3对Base64隐写解密

import base64


def get_base64_diff_value(s1, s2):
    """get base64 diff value"""
    base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    for i in range(len(s2)):
        if s1[i] != s2[i]:
            return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
    return 0

def solve_stego(stego_str_list):
    '''stego_str_list str列表'''
    bin_str = ''
    for stego_str in stego_str_list:
        stego_str = stego_str.replace('\n', '')
        norm_str = base64.b64encode(base64.b64decode(stego_str)).decode()
        diff = get_base64_diff_value(stego_str, norm_str)
        pads_num = stego_str.count('=')
        bin_str += bin(diff)[2:].zfill(pads_num * 2)


    ret = b''
    for i in range(0, len(bin_str), 8):
        ret += int(bin_str[i:i + 8], 2).to_bytes(1, 'little')
    return ret

def to_stego(normal_data, stego_data, stego_bit_len=4):
    base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    bin_str = ''
    for each in stego_data:
        bin_str += bin(each)[2:].zfill(8)
    line_len = len(normal_data) // (len(bin_str) // stego_bit_len)
    if stego_bit_len == 4:
        line_len = line_len - ((line_len % 3 - 1) + 3) % 3 # 令 line_len % 3 = 1 右边建立了一个 0 1 2 -> 2 0 1 的映射
    else:
        line_len = line_len - ((line_len % 3 - 2) + 3) % 3 # 令 line_len % 3 = 2 右边建立了一个 0 1 2 -> 1 2 0 的映射
    if line_len <= 0:
        return []
    ret = []
    index = 0
    while True:
        if index >= len(normal_data):
            break
        encode_str = base64.b64encode(normal_data[index:index + line_len]).decode()
        # print('index=%d bin_str=%s' % (index, bin_str))
        index += line_len
        # print(encode_str)
        if bin_str != '':
            if stego_bit_len == 4:
                now_encode = bin_str[:4]
                bin_str = bin_str[4:]
            tmp_list = encode_str.rpartition(encode_str[-1 * (stego_bit_len // 2 + 1)])
            encode_str = tmp_list[0] + base64chars[base64chars.index(tmp_list[1]) + int(now_encode, 2)] + tmp_list[2]
        ret.append(encode_str)
    return ret


def main():
    with open('2.txt', 'rb') as fp:
        file_lines = fp.readlines()
    stego_str_list = []
    for each in file_lines:
        stego_str_list.append(each.decode().replace('\n', ''))
    print(solve_stego(stego_str_list))

    l = to_stego(b'123456789012345678901234567890123456', b'cnss', 4)
    print(l)
    print(solve_stego(l))

if __name__ == '__main__':
    main()

隐写原理参照:

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

你可以使用Python 3中的base64库来进行base64隐写。下面是一个示例脚本,可以将文本隐藏在图片中: ```python import base64 from PIL import Image def hide_text_in_image(image_path, text): # 打开图片 image = Image.open(image_path) # 将文本编码为base64 encoded_text = base64.b64encode(text.encode()) # 将base64编码的文本转换为字符串 encoded_text_str = encoded_text.decode() # 将文本隐藏在图片的像素值中 pixels = list(image.getdata()) pixels_with_text = [(r, g, int(encoded_text_str[i])) for i, (r, g, b) in enumerate(pixels)] # 生成新的图片 new_image = Image.new(image.mode, image.size) new_image.putdata(pixels_with_text) # 保存新图片 new_image.save('encoded_image.png') print("文本已成功隐藏在图片中!") def extract_text_from_image(image_path): # 打开图片 image = Image.open(image_path) # 获取所有像素值 pixels = list(image.getdata()) # 提取隐藏的文本 encoded_text_str = ''.join([str(b)[-1] for (r, g, b) in pixels]) # 将字符串解码为base64 encoded_text = bytes.fromhex(hex(int(encoded_text_str, 2))[2:]).decode() # 解码base64并输出文本 decoded_text = base64.b64decode(encoded_text).decode() print("提取的文本为:", decoded_text) # 隐藏文本 hide_text_in_image('image.png', '这是一个秘密!') # 提取文本 extract_text_from_image('encoded_image.png') ``` 请注意,这只是一个基本示例,实际应用中可能需要更复杂的技术来隐藏和提取文本。同时,请确保在运行脚本之前已经安装了`Pillow`库,可以通过`pip install Pillow`命令进行安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值