base64编码介绍
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。(摘自百度百科)
比如一个字符串"PHP",要将"PHP"进行base64编码,首先,将"PHP"转换为其对应的ASCII编码(跳转至百度百科),其次将其ASCII码用8位二进制数字表示,接下来把这24个二进制数字6个为一组分为4组,再将每组的二进制数转换为十进制数,最后用64个字符(A-Z、a-z、0-9、+、/)来表示这四个十进制数字。下面的图片看得比较清楚。(鼠标作图不易,字丑望海涵-.-)
base64信息隐藏
相信有了上面的介绍,大家对base64编码会有一定的了解了,那么怎么利用他来隐藏信息呢?
为了清晰,我特意用蓝色标注了那四个补充的0,因为这里就是你可以写悄悄话的地方!
上面讲了base64编码,那么解码过程就是编码的逆过程。"UA=="转化为其对应的十进制编号,转化为二进制,再八个一组转化为十进制,期间会抛弃那最后多余的四位,所以这四位可以由我们来传递我们想要传递的信息。
相信大佬们已经发现,只有"="前的那个字符可以用来隐藏信息,而且能传递的信息量也有限。那我们不妨用两句话来传递一个信息。比如我想传达的是01000100,我就可以发两句话,在末尾都用"UE=="来表达,那不知道我隐藏信息的人解码以后得到的两句话最后都是"P",而知道规则的人得到的消息则是"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 '要隐藏的字符串的二进制:'+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--->每两个放一起
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 '用于隐藏的随机字符串:'+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)]#四个分为一组
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考研成功!
欢迎各位观众大佬在线指导,感谢观看。(点个心心再走呗,您的支持是对我最大的鼓励!比心。)