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

不得不提 图像的学习还是很好玩的 !

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

索引图像是一种把像素值直接作为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={}
  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]
  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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值