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考研成功!

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容