[攻防世界]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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章