題目:
給定一個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