[攻防世界]base64stego(misc)

题目:

给定一个stego.txt,打开发现里面是很多行base64加密后的密文

思路:

尝试base64解码,发现是隐写术的介绍,没有任何发现。于是看了别人的writeup,才知道base64隐写这个东西。

base64原理:

base64 是一种编码方式, 是一种可逆的编码方式.

编码后的数据是一个字符串, 包含的字符为: A-Za-z0-9+/

共 64 个字符:26 + 26 + 10 + 1 + 1 = 64   其实是 65 个字符, “=”是填充字符.

64个字符需要用6位来表示,表示成数值为0~63.

编码时如果字符串字节数不是3的倍数,则位数就不是6的倍数,就不能划分成6位一组,此时需要在原数据二进制值后添加0,然后在编码后的字符串后加上一个或两个“=”,表示添加的0的个数.

解码时先去掉等号,转为二进制数,多余位扔掉,转为对应的ASCII码,扔掉多余的0,恢复成原字符串.

隐写原理:

解码时丢弃的0可以隐藏信息。

代码:

import base64
bin_str=''
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('stego.txt','r') as f:
	for line in f.readlines():
		stegb64="".join(line.split())
		rowb64="".join(str(base64.b64encode(base64.b64decode(stegb64)),'utf-8').split())
		offset=abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=', '')[-1]))
		equalnum=line.count('=')
		if equalnum:
			bin_str += bin(offset)[2:].zfill(equalnum * 2)
	print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0,len(bin_str),8)]))

引用链接:https://blog.csdn.net/m0_37442062/article/details/90517209

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值