您的位置:首页 > 其它

信息隐藏课程之索引图像的隐写

2016-11-26 19:29 323 查看
不得不提 图像的学习还是很好玩的 !

首先介绍下索引图像(百度百科)

索引图像是一种把像素值直接作为RGB调色板下标的图像。索引图像可把像素值“直接映射”为调色板数值。

调色板通常与索引图像存储在一起,装载图像时,调色板将和图像一同自动装载。

我们就是在索引图像的像素索引上进行隐写

不多说,步骤见代码(包括解密)

加密过程:

#找出欲嵌入信息的像素索引值在新调色板中的索引值
#取出1bit的秘密信息,将其嵌入到新索引值的LSB
#取出嵌入信息后索引值对应颜色的RGB值rgb
#找出rgb值在原始调色板中的索引值S
#将步骤3的索引值改成S

import Image
import matplotlib.pyplot as plt
#得到加密文字的二进制形式
def plus(str):
return str.zfill(8)
def get_key():
f = file("D:\\zip3.txt", "r")
str = ""
s = f.read()
print s
for i in range(0,len(s)):
str=str+ plus(bin(ord(s[i])).replace('0b', ''))
print str
f.closed
return str
#LSB 嵌入
def mod(x,y):
return x%y;
def lsb(a,b):
a = a - mod(a, 2) + int(b)
return a

if __name__ == '__main__':
im = Image.open("d:/liu.jpg").convert("P")
plt.subplot(1, 2, 1), plt.title('orgin') # 前后两个图片对比
plt.imshow(im), plt.axis('off')
palette={};new_palette={}
p
4000
ixel=[]
#得到调色板
for i in range(0,256):
pixel.append(im.getpalette()[i])
pixel.append(im.getpalette()[2*i])
pixel.append(im.getpalette()[3*i])
palette[i] = pixel
pixel=[]
#根据亮度排序得到新的调色板
for i in range(0,len(palette)):
new_palette[i] =sorted(palette.items(), key=lambda x:0.3 * x[1][0] + 0.6 * x[1][1] + 0.1 * x[1][2] , reverse=True)[i]
key = get_key()
#潜入信息
width = im.size[0]
height = im.size[1]
count = 0
#找到像素索引
for h in range(0, height):
for w in range(0, width):
if count ==len(key):
break
im_pixel = im.getpixel((w, h))
for i in range(len(new_palette)):
#欲嵌入信息的像素索引值在新调色板中的索引值
if new_palette[i][0]== im_pixel:
#取出1bit的秘密信息,将其嵌入到新索引值的LSB
a = lsb(i,key[count])
break
count+=1
#取出嵌入信息后索引值对应颜色的RGB值rgb
#找出rgb值在原始调色板中的索引值S
s = new_palette[a][0]
im.putpixel((w,h),s)
if count ==len(key):
break
plt.subplot(1, 2, 2), plt.title('now')#前后两个图片对比
plt.imshow(im), plt.axis('off')
plt.show()
im.save(r"d:/liu2.bmp")
print "success\n"
plt.show()

解密过程:

# -*- coding: utf-8 -*-
_author_ = 'xiao_lu'
#f复制调色板 按亮度排序
#取出一个像素 根据索引值在旧调色板中,取出其RGB
#找出其RGB值在新调色板的索引值
#取出此索引值的LSB
import Image
#得到最后一位
def getlsb(s):
return str(s%2)
#将得到的二进制串化成ASCII码
def toasc(str):
return int(str, 2)
if __name__ == '__main__':
im = Image.open("d:/liu2.bmp")
f1 = file("D:\\zip3.txt", "r")
s = f1.read()
lenth = len(s)
# 得到调色板
palette = {};new_palette = {}
pixel = []
for i in range(0, 256):
pixel.append(im.getpalette()[i])
pixel.append(im.getpalette()[2 * i])
pixel.append(im.getpalette()[3 * i])
palette[i] = pixel
pixel = []
# 根据亮度排序得到新的调色板
for i in range(0, len(palette)):
new_palette[i] = \
sorted(palette.items(), key=lambda x: 0.3 * x[1][0] + 0.6 * x[1][1] + 0.1 * x[1][2], reverse=True)[i]
width = im.size[0]
height = im.size[1]
count = 0
st = ""
for h in range(0, height):
for w in range(0, width):
if count == lenth*8:
break
im_pixel = im.getpixel((w, h))
#找到新调色板的索引值
for i in range(len(new_palette)):
if new_palette[i][0] == im_pixel:
s = i
break
st=st+getlsb(s)
count+=1
if count == lenth*8:
break
print st
print len(st)
#将得到的明文写到文本
with open("d:/zip4.txt","w") as f:
for i in range(0, len(st), 8):
s= toasc(st[i:i + 8]) # 化成ASCII码
print chr(s) # 输出明文
f.write(chr(s))
str = ""
f.closed
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: