base64隱寫術(shù)

base64編碼介紹

???????Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。(摘自百度百科)
???????比如一個(gè)字符串"PHP",要將"PHP"進(jìn)行base64編碼,首先,將"PHP"轉(zhuǎn)換為其對(duì)應(yīng)的ASCII編碼(跳轉(zhuǎn)至百度百科),其次將其ASCII碼用8位二進(jìn)制數(shù)字表示,接下來把這24個(gè)二進(jìn)制數(shù)字6個(gè)為一組分為4組,再將每組的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),最后用64個(gè)字符(A-Z、a-z、0-9、+、/)來表示這四個(gè)十進(jìn)制數(shù)字。下面的圖片看得比較清楚。(鼠標(biāo)作圖不易,字丑望海涵-.-)

base64 (2).png

base64信息隱藏

???????相信有了上面的介紹,大家對(duì)base64編碼會(huì)有一定的了解了,那么怎么利用他來隱藏信息呢?

???????為了方便,我們單拉一個(gè)字符出來講解,就說這個(gè)"P"吧。ASCII碼為80,轉(zhuǎn)換為二進(jìn)制為01010000,這時(shí)會(huì)發(fā)現(xiàn)分不夠12個(gè),那我們就用0來補(bǔ)夠12個(gè)(這里補(bǔ)夠12個(gè)是為了可以湊成兩個(gè)六位的二進(jìn)制數(shù),后面的空用"="來表示,但是別問我為什么用0補(bǔ)充,為什么用"="表示空,問了我也不知道該怎么解釋哈哈哈),然后6個(gè)一組,分為兩組,轉(zhuǎn)為十進(jìn)制后再用字符表示。。。還是看圖比較清楚:
base64 (3).png

為了清晰,我特意用藍(lán)色標(biāo)注了那四個(gè)補(bǔ)充的0,因?yàn)檫@里就是你可以寫悄悄話的地方!

???????上面講了base64編碼,那么解碼過程就是編碼的逆過程。"UA=="轉(zhuǎn)化為其對(duì)應(yīng)的十進(jìn)制編號(hào),轉(zhuǎn)化為二進(jìn)制,再八個(gè)一組轉(zhuǎn)化為十進(jìn)制,期間會(huì)拋棄那最后多余的四位,所以這四位可以由我們來傳遞我們想要傳遞的信息。


1.png

???????相信大佬們已經(jīng)發(fā)現(xiàn),只有"="前的那個(gè)字符可以用來隱藏信息,而且能傳遞的信息量也有限。那我們不妨用兩句話來傳遞一個(gè)信息。比如我想傳達(dá)的是01000100,我就可以發(fā)兩句話,在末尾都用"UE=="來表達(dá),那不知道我隱藏信息的人解碼以后得到的兩句話最后都是"P",而知道規(guī)則的人得到的消息則是"D"。。。嘻嘻

代碼分享

???????看到這里各位也辛苦了,最后為大家附上代碼

# -*- coding:utf-8 -*-
import string
import random
from base64 import * 
base64table=string.ascii_uppercase+string.ascii_lowercase+string.digits+'+/'

hide_data_str='I LOVE YOU'    #要隱藏的字符串
bin_hide_data_str=''        #要隱藏的字符串------>bin
len_hds=len(hide_data_str)
for i in range(0,len_hds):
    bin_hide_data_str+="{0:>08}".format(bin(ord(hide_data_str[i]))[2:])
#print '要隱藏的字符串的二進(jìn)制:'+bin_hide_data_str

per2_bin_hide_data_str=[x for x in range(0,len(bin_hide_data_str)/2)]
for i in  range(0,len(bin_hide_data_str)/2):
    per2_bin_hide_data_str[i]=bin_hide_data_str[i*2:2*(i+1)]
print per2_bin_hide_data_str##要隱藏的字符串------>bin--->每兩個(gè)放一起
l=len(per2_bin_hide_data_str)
#print l

len_pbhds=len(per2_bin_hide_data_str)
str_m=''
str_m_base=''
bs=''
for i in range(0,len_pbhds):
    x=int(random.uniform(1,3))
    if x==1:
        str_m+=str(base64table[int(random.uniform(0,64))])
        str_m_base+=b64encode(base64table[int(random.uniform(0,64))])
        i+=1
    elif x==2:
        bs=str(base64table[int(random.uniform(0,64))])
        bs+=str(base64table[int(random.uniform(0,64))])
        str_m+=bs
        str_m_base+=b64encode(bs)
print '用于隱藏的隨機(jī)字符串:'+str_m
print '生成字符串的base64:'+str_m_base

s=[x for x in range(len(str_m_base)/4)]
for i in range(len(str_m_base)/4):
    s[i]=str_m_base[4*i:4*(i+1)]
print s
len_s=len(s)

try:
    per2_i=0
    base_str=''
    for i in range(len_s):
        si_bin=''
        if '==' in s[i]:
            if per2_i==l:
                break
            s[i]=s[i][:2]
            for j in range(2):
                si_bin+='{0:>06}'.format(bin(base64table.find(s[i][j]))[2:])
            w=list(per2_bin_hide_data_str[per2_i])
            si_bin=list(si_bin)
            for j in range(2):
                si_bin[8+j]=w[j]
            si_bin="".join(si_bin)
            per2_i+=1
            w=list(per2_bin_hide_data_str[per2_i])
            si_bin=list(si_bin)
            for j in range(2):
                si_bin[10+j]=w[j]
            si_bin="".join(si_bin)
            for j in range(2):
                base_str+=base64table[int(si_bin[j*6:6*(j+1)],2)]
            base_str+='=='    
            per2_i+=1
        elif '=' in s[i]:
            if per2_i==l:
                break  
            s[i]=s[i][:3]
            for j in range(3):
                si_bin+='{0:>06}'.format(bin(base64table.find(s[i][j]))[2:])
            w=list(per2_bin_hide_data_str[per2_i])
            si_bin=list(si_bin)
            for j in range(2):
                si_bin[16+j]=w[j]
            si_bin="".join(si_bin)
            for j in range(3):
                base_str+=base64table[int(si_bin[j*6:6*(j+1)],2)]
            base_str+='='    
            per2_i+=1
              
    print base_str
    c=open("base_hide.txt",'w')
    c.write(base_str)
    c.close()
except :
    print 'Random generation of data is not suitable, try again'


# -*- coding:utf-8 -*-
import string
from base64 import * 
base64table=string.ascii_uppercase+string.ascii_lowercase+string.digits+'+/'

fp=open('base_hide.txt','r')
strbase=fp.read()
fp.close()

base64_w=''
base6_4=[ x for x in range(len(strbase)/4)]
for i in range(len(strbase)/4):
    base6_4[i]=str(strbase[i*4:4*(i+1)])
    base64_w+=b64decode(base6_4[i])
print 'base64_decode:'+base64_w

s_per_len=4
s=[x for x in range(len(strbase)/s_per_len)]#四個(gè)分為一組
len_s=len(s)
for i in range(len_s):
    s[i]=strbase[s_per_len*i:s_per_len*(i+1)]
#print len(s)
       
hide_data=''

for i in range(0,len_s):
    si_chr_num=''
    s_bin=''
    if '==' in s[i]:
        si=s[i][:2]
        for j in range(0,2):
            si_chr_num+='{0:>06}'.format(bin(base64table.find(si[j]))[2:])
        sbin=si_chr_num[8:]
        hide_data+=sbin
    elif '=' in s[i]:
        si=s[i][:3]
        for j in range(0,3):
            si_chr_num+='{0:>06}'.format(bin(base64table.find(si[j]))[2:])
        sbin=si_chr_num[16:]
        hide_data+=sbin
#print hide_data

l=''
#data=[x for x in range(len(hide_data)/8)
for i in range(0,len(hide_data)/8):
    l+=chr(int(hide_data[i*8:8*(i+1)],2))
print "隱藏的信息:"+l

(上面的是編碼,下面的是解碼)
???????最后,感謝波波提供代碼,祝2020考研成功!

??????????????歡迎各位觀眾大佬在線指導(dǎo),感謝觀看。(點(diǎn)個(gè)心心再走唄,您的支持是對(duì)我最大的鼓勵(lì)!比心。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容