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

為了清晰,我特意用藍(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ì)拋棄那最后多余的四位,所以這四位可以由我們來傳遞我們想要傳遞的信息。

???????相信大佬們已經(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ì)!比心。)