信息隐藏课程之简单的LSB最低位隐写

# -*- coding: utf-8 -*-
_author_ = 'xiao_lu'
#取出RGB 值得 lsb  替换
import Image
import matplotlib.pyplot as plt

#得到加密文字的二进制形式
def plus(str):
   return str.zfill(8)
def get_key():
   f = file("D:\\zip1.txt", "r")
   str = ""
   s = f.read()
   print s
   for i in range(len(s)):
      str=str+ plus(bin(ord(s[i])).replace('0b', ''))
   print str
   f.closed
   return str
def mod(x,y):
    return x%y;

if __name__ == '__main__':
  im = Image.open("d:/lena.jpg")
  plt.subplot(1, 2, 1), plt.title('origin')
  plt.imshow(im), plt.axis('off')
  width = im.size[0]
  height = im.size[1]
  count = 0
  key = get_key()  #得到 文本信息
  #如果嵌入的文字过多导致载体不够大
  if width*height*3<len(key):
      print "please change the image"
      exit()
  #基于最低位lsb嵌入
  for h in range(0, height):
     for w in range(0, width):
        pixel = im.getpixel((w, h))
        a = pixel[0]#R
        b = pixel[1]#G
        c = pixel[2]#B
        if count == len(key):
            break
        #LSB 嵌入过程  替换最后一位
        if count%3==0:
            a= a-mod(a,2)+int(key[count])
        elif count%3==1:
            b = b- mod(b, 2) + int(key[count])
        else:
            c= c-mod(c,2)+int(key[count])
        im.putpixel((w,h),(a,b,c))
        count=count+1
     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:/lena_rgb.bmp")
  print "success\n"


解密过程


# -*- coding: utf-8 -*-
_author_ = 'xiao_lu'

import Image
def mod(x,y):
    return x%y;
#将得到的二进制串化成ASCII码
def toasc(str):
    return int(str, 2)
if __name__ == '__main__':
  a=""
  im = Image.open("d:/lena_rgb.bmp")
  f1 = file("D:\\zip1.txt", "r")
  s = f1.read()
  lenth = len(s)
  width = im.size[0]
  height = im.size[1]
  count = 0
  #直接提取最后一位 基于rgb三个图像
  for h in range(0, height):
       for w in range(0, width):
           pixel = im.getpixel((w, h))
           if count ==lenth*8:
               break
           if count%3==0:
               a = a+str((mod(int(pixel[0]),2)))
           elif count%3==1:
               a=a+str((mod(int(pixel[1]), 2)))
           else:
               a=a+str((mod(int(pixel[2]), 2)))
           count+=1
       if count == lenth*8:
           break
  print a#输出二进制
  print len(a)
  #将得到的明文写到文本
  with open("d:/zip2.txt","w") as f:
       for i in range(0,len(a),8):
           str = toasc(a[i:i+8])#化成ASCII码
           print chr(str)#输出明文
           f.write(chr(str))
           str =""
  f.closed


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
没有积分的私聊我 看到消息百分百发给你 1、算法核心: 1、读取图片A,获得其RGB三个通道数据并转换成三个矩阵a1,a2,a3。 2、读取文件B,将其转换成比特流b。 3、遍历b,得到比特b1,b2,b3,b4,b5,b6等等,将b1代替a1第一个元素的最低位,将b2代替a2第一个元素的最低位,将b3代替a3第一个元素的最低位,将b4代替a1第二个元素的最低位,以此类推。 2、具体实现: 1、隐: 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用java NIO读取被嵌入的文件,将其转换为byte数组,需要特别指出的是原生方法得到是byte类型的数组,但是算法实现需要更加精细的操作,所以还需要对得到的byte数组进行进一步的转换封装,将其转换成形如10101的数组。例如,读取文件得到byte数组的第一个元素为63,需将63转换为00111111数组。并且保存好文件的长度。 3、按照算法,遍历形如10101的数组 1、如果遍历到的值为0,将矩阵对应的矩阵元素与0xfe进行与运算,将最低位置为0 2、如果遍历到的值为1,将矩阵对应的矩阵元素与0x01进行或运算,将最低位置为1 4、将步骤3得到的经过经过隐的矩阵为一张新的图片。 3、读取 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用隐步骤3得到的文件长度,遍历图片的像素矩阵,需要特别指出的是因为后续步骤还需要进行进一步的转化,所以这一步是将得到的“100100......”序列每八位封装为一个数组,最终得到一些数组集合,每个数组包含八位二进制序列。 3、将步骤2得到的数组进行转换,例如00111111应该转换为byte类型数值为63的数字,10111111转换为-63。这一步会得到一个byte类型的数组。 4、将步骤3得到的byte类型数组入文件,需要指出的是入的文件形式应该和隐模块步骤二中读入的文件形式一致。 3、程序使用方法 1、安装Java8 2、使用命令行进入jar文件所在目录下,使用命令 java -jar 2016115130.jar 3、安装提示输入嵌入和被嵌入的文件名字,注意路径问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值