base64隐写术

base64编码介绍

       Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。(摘自百度百科)
       比如一个字符串"PHP",要将"PHP"进行base64编码,首先,将"PHP"转换为其对应的ASCII编码(跳转至百度百科),其次将其ASCII码用8位二进制数字表示,接下来把这24个二进制数字6个为一组分为4组,再将每组的二进制数转换为十进制数,最后用64个字符(A-Z、a-z、0-9、+、/)来表示这四个十进制数字。下面的图片看得比较清楚。(鼠标作图不易,字丑望海涵-.-)

base64 (2).png

base64信息隐藏

       相信有了上面的介绍,大家对base64编码会有一定的了解了,那么怎么利用他来隐藏信息呢?

       为了方便,我们单拉一个字符出来讲解,就说这个"P"吧。ASCII码为80,转换为二进制为01010000,这时会发现分不够12个,那我们就用0来补够12个(这里补够12个是为了可以凑成两个六位的二进制数,后面的空用"="来表示,但是别问我为什么用0补充,为什么用"="表示空,问了我也不知道该怎么解释哈哈哈),然后6个一组,分为两组,转为十进制后再用字符表示。。。还是看图比较清楚:
base64 (3).png

为了清晰,我特意用蓝色标注了那四个补充的0,因为这里就是你可以写悄悄话的地方!

       上面讲了base64编码,那么解码过程就是编码的逆过程。"UA=="转化为其对应的十进制编号,转化为二进制,再八个一组转化为十进制,期间会抛弃那最后多余的四位,所以这四位可以由我们来传递我们想要传递的信息。


1.png

       相信大佬们已经发现,只有"="前的那个字符可以用来隐藏信息,而且能传递的信息量也有限。那我们不妨用两句话来传递一个信息。比如我想传达的是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考研成功!

              欢迎各位观众大佬在线指导,感谢观看。(点个心心再走呗,您的支持是对我最大的鼓励!比心。)

你可能感兴趣的:(base64隐写术)